Commit cad471df18e566f733fe317dc3f2bb43ca9b2782
1 parent
e9d95cb7
Exists in
master
and in
28 other branches
Enhancements on text editor sidebar - first take
ActionItem2371
Showing
5 changed files
with
91 additions
and
22 deletions
Show diff stats
app/views/cms/_text_editor_sidebar.rhtml
| 1 | <div class='text-editor-sidebar'> | 1 | <div class='text-editor-sidebar'> |
| 2 | + <meta name='button.add' value='<%= _('Add to the text') %>'/> | ||
| 3 | + <meta name='button.zoom' value='<%= _('Zoom in') %>'/> | ||
| 2 | <%= render(:partial => 'textile_quick_reference') if @article.is_a?(TextileArticle) %> | 4 | <%= render(:partial => 'textile_quick_reference') if @article.is_a?(TextileArticle) %> |
| 3 | <div class='text-editor-sidebar-box' id='media-upload-box'> | 5 | <div class='text-editor-sidebar-box' id='media-upload-box'> |
| 4 | - <p><strong><%= _('Media upload') %></strong></p> | 6 | + <div class='header'<strong><%= _('Media upload') %></strong></div> |
| 5 | <div id='media-upload-form'> | 7 | <div id='media-upload-form'> |
| 6 | <% form_tag({ :action => 'media_upload' }, :multipart => true) do %> | 8 | <% form_tag({ :action => 'media_upload' }, :multipart => true) do %> |
| 7 | <div class='formfield'> | 9 | <div class='formfield'> |
| @@ -24,7 +26,7 @@ | @@ -24,7 +26,7 @@ | ||
| 24 | </div> | 26 | </div> |
| 25 | </div> | 27 | </div> |
| 26 | <div id='media-search-box' class='text-editor-sidebar-box'> | 28 | <div id='media-search-box' class='text-editor-sidebar-box'> |
| 27 | - <p><strong><%= _('Media search') %></strong></p> | 29 | + <div class='header'><strong><%= _('Media search') %></strong></div> |
| 28 | <p> | 30 | <p> |
| 29 | <% form_tag({ :action => 'search' }) do %> | 31 | <% form_tag({ :action => 'search' }) do %> |
| 30 | <span class='formfield'> | 32 | <span class='formfield'> |
app/views/cms/_textile_quick_reference.rhtml
| 1 | <div class='text-editor-sidebar-box'> | 1 | <div class='text-editor-sidebar-box'> |
| 2 | - <p> | 2 | + <div class='header'> |
| 3 | <strong><%= _('Textile markup quick reference') %></strong> | 3 | <strong><%= _('Textile markup quick reference') %></strong> |
| 4 | <%= link_to(_('(show)'), '#', :id => 'textile-quickref-show') %> | 4 | <%= link_to(_('(show)'), '#', :id => 'textile-quickref-show') %> |
| 5 | <%= link_to(_('(hide)'), '#', :id => 'textile-quickref-hide', :style => 'display: none') %> | 5 | <%= link_to(_('(hide)'), '#', :id => 'textile-quickref-hide', :style => 'display: none') %> |
| 6 | - </p> | 6 | + </div> |
| 7 | <div id='textile-quickref' style='display: none;'> | 7 | <div id='textile-quickref' style='display: none;'> |
| 8 | <p><%= _('Simple formatting:') %> <code>_<%= _('italics') %>_</code> <code>*<%= _('bold') %>*</code>, <code>-<%= _('striked')%>-</code>.</p> | 8 | <p><%= _('Simple formatting:') %> <code>_<%= _('italics') %>_</code> <code>*<%= _('bold') %>*</code>, <code>-<%= _('striked')%>-</code>.</p> |
| 9 | <p><%= _('Links:') %> <code>"Noosfero":http://noosfero.org/</code></p> | 9 | <p><%= _('Links:') %> <code>"Noosfero":http://noosfero.org/</code></p> |
177 Bytes
public/javascripts/article.js
| @@ -23,31 +23,69 @@ jQuery(function($) { | @@ -23,31 +23,69 @@ jQuery(function($) { | ||
| 23 | $('#textile-quickref').slideToggle(); | 23 | $('#textile-quickref').slideToggle(); |
| 24 | return false; | 24 | return false; |
| 25 | }) | 25 | }) |
| 26 | - function insert_items(items, selector) { | 26 | + function list_items(items, selector) { |
| 27 | var html_for_items = ''; | 27 | var html_for_items = ''; |
| 28 | + var button_add = $('.text-editor-sidebar meta[name=button.add]').attr('value'); | ||
| 29 | + var button_zoom = $('.text-editor-sidebar meta[name=button.zoom]').attr('value'); | ||
| 28 | $.each(items, function(i, item) { | 30 | $.each(items, function(i, item) { |
| 29 | if (item.error) { | 31 | if (item.error) { |
| 30 | html_for_items += '<div class="media-upload-error">' + item.error + '</div>'; | 32 | html_for_items += '<div class="media-upload-error">' + item.error + '</div>'; |
| 31 | return; | 33 | return; |
| 32 | } | 34 | } |
| 33 | if (item.content_type && item.content_type.match(/^image/)) { | 35 | if (item.content_type && item.content_type.match(/^image/)) { |
| 34 | - html_for_items += '<div class="icon-photos"><img src="' + item.url + '"/><br/><a href="' + item.url + '">' + item.title + '</a></div>'; | 36 | + html_for_items += '<div class="item" data-item="span"><span><img src="' + item.url + '"/></span><div class="controls image-controls"><a class="button with-text icon-add" data-item-url="' + item.url + '" href="#">' + button_add + '</a> <a class="button icon-zoom" href="#" title="' + button_zoom + '"><span>' + button_zoom + '/span></a></div></div>'; |
| 35 | } else { | 37 | } else { |
| 36 | - html_for_items += '<div class="' + item.icon + '"><a href="' + item.url + '">' + item.title + '</a></div>'; | 38 | + html_for_items += '<div class="item ' + item.icon + '" data-item="div"><div><a href="' + item.url + '">' + item.title + '</a></div> <div class="controls file-controls"> <a class="button with-text icon-add" data-item-url="' + item.url + '" href="#">' + button_add + '</a></div></div>'; |
| 37 | } | 39 | } |
| 38 | }); | 40 | }); |
| 39 | $(selector).html(html_for_items); | 41 | $(selector).html(html_for_items); |
| 42 | + $(selector).find('.controls a.icon-add').click(function() { | ||
| 43 | + var $item = $(this).closest('.item'); | ||
| 44 | + var html_selector = $item.attr('data-item'); | ||
| 45 | + insert_item_in_text($item.find(html_selector)); | ||
| 46 | + return false; | ||
| 47 | + }); | ||
| 48 | + $(selector).find('.controls a.icon-zoom').click(function() { | ||
| 49 | + alert('zoom!'); | ||
| 50 | + // FIXME zoom in in the image | ||
| 51 | + return false; | ||
| 52 | + }); | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + // FIXME the user may also want to add the item to the abstract textarea! | ||
| 56 | + var text_field = 'article_body'; | ||
| 57 | + | ||
| 58 | + function insert_item_in_text($wrapper) { | ||
| 59 | + if (window.tinymce) { | ||
| 60 | + | ||
| 61 | + var html = $wrapper.html(); | ||
| 62 | + | ||
| 63 | + var editor = tinymce.get(text_field); | ||
| 64 | + | ||
| 65 | + editor.setContent(editor.getContent() + html); | ||
| 66 | + | ||
| 67 | + } else { | ||
| 68 | + // simple text editor | ||
| 69 | + var text = $('#' + text_field).val(); | ||
| 70 | + var $item = $wrapper.children().first(); | ||
| 71 | + if ($item.attr('src')) { | ||
| 72 | + $('#article_body').val(text + '!' + $item.attr('src') + '!'); | ||
| 73 | + } | ||
| 74 | + if ($item.attr('href')) { | ||
| 75 | + $('#article_body').val(text + $item.attr('href')); | ||
| 76 | + } | ||
| 77 | + } | ||
| 40 | } | 78 | } |
| 41 | $('#media-search-button').click(function() { | 79 | $('#media-search-button').click(function() { |
| 42 | var query = '*' + $('#media-search-query').val() + '*'; | 80 | var query = '*' + $('#media-search-query').val() + '*'; |
| 43 | var $button = $(this); | 81 | var $button = $(this); |
| 44 | - $('#media-search-box').toggleClass('icon-loading'); | 82 | + $('#media-search-box .header').toggleClass('icon-loading'); |
| 45 | $.get($(this).parent().attr('action'), { 'q': query }, function(data) { | 83 | $.get($(this).parent().attr('action'), { 'q': query }, function(data) { |
| 46 | - insert_items(data, '#media-search-results .items'); | 84 | + list_items(data, '#media-search-results .items'); |
| 47 | if (data.length && data.length > 0) { | 85 | if (data.length && data.length > 0) { |
| 48 | $('#media-search-results').slideDown(); | 86 | $('#media-search-results').slideDown(); |
| 49 | } | 87 | } |
| 50 | - $('#media-search-box').toggleClass('icon-loading'); | 88 | + $('#media-search-box .header').toggleClass('icon-loading'); |
| 51 | }); | 89 | }); |
| 52 | return false; | 90 | return false; |
| 53 | }); | 91 | }); |
| @@ -57,15 +95,15 @@ jQuery(function($) { | @@ -57,15 +95,15 @@ jQuery(function($) { | ||
| 57 | beforeSubmit: | 95 | beforeSubmit: |
| 58 | function() { | 96 | function() { |
| 59 | $('#media-upload-form').slideUp(); | 97 | $('#media-upload-form').slideUp(); |
| 60 | - $('#media-upload-box').toggleClass('icon-loading'); | 98 | + $('#media-upload-box .header').toggleClass('icon-loading'); |
| 61 | }, | 99 | }, |
| 62 | success: | 100 | success: |
| 63 | function(data) { | 101 | function(data) { |
| 64 | - insert_items(data, '#media-upload-results .items'); | 102 | + list_items(data, '#media-upload-results .items'); |
| 65 | if (data.length && data.length > 0) { | 103 | if (data.length && data.length > 0) { |
| 66 | $('#media-upload-results').slideDown(); | 104 | $('#media-upload-results').slideDown(); |
| 67 | } | 105 | } |
| 68 | - $('#media-upload-box').toggleClass('icon-loading'); | 106 | + $('#media-upload-box .header').toggleClass('icon-loading'); |
| 69 | } | 107 | } |
| 70 | }); | 108 | }); |
| 71 | $('#media-upload-more-files').click(function() { | 109 | $('#media-upload-more-files').click(function() { |
public/stylesheets/application.css
| @@ -3619,19 +3619,26 @@ div.with_media_panel .formfield input { | @@ -3619,19 +3619,26 @@ div.with_media_panel .formfield input { | ||
| 3619 | } | 3619 | } |
| 3620 | 3620 | ||
| 3621 | .text-editor-sidebar-box { | 3621 | .text-editor-sidebar-box { |
| 3622 | - background: #eeeeec; | 3622 | + background: #fcfcf9; |
| 3623 | border: 1px solid #d3d7cf; | 3623 | border: 1px solid #d3d7cf; |
| 3624 | padding: 10px 10px 0px 10px; | 3624 | padding: 10px 10px 0px 10px; |
| 3625 | margin-bottom: 10px; | 3625 | margin-bottom: 10px; |
| 3626 | } | 3626 | } |
| 3627 | -.text-editor-sidebar-box p { | ||
| 3628 | - margin-top: 0px; | 3627 | + |
| 3628 | +.text-editor-sidebar-box .header { | ||
| 3629 | + margin: -10px -10px 0px -10px; | ||
| 3630 | + padding: 10px; | ||
| 3631 | + font-weight: bold; | ||
| 3632 | + border-bottom: 1px solid #d3d7cf; | ||
| 3633 | + background-color: #eeeeec; | ||
| 3629 | } | 3634 | } |
| 3635 | + | ||
| 3630 | .text-editor-sidebar code, | 3636 | .text-editor-sidebar code, |
| 3631 | .text-editor-sidebar pre { | 3637 | .text-editor-sidebar pre { |
| 3632 | border: 1px solid #d3d7cf; | 3638 | border: 1px solid #d3d7cf; |
| 3633 | color: black; | 3639 | color: black; |
| 3634 | - padding: 2px; | 3640 | + padding: 4px; |
| 3641 | + background: white; | ||
| 3635 | } | 3642 | } |
| 3636 | .text-editor-sidebar .icon-loading { | 3643 | .text-editor-sidebar .icon-loading { |
| 3637 | background-image: url(../images/loading-small.gif); | 3644 | background-image: url(../images/loading-small.gif); |
| @@ -3639,21 +3646,43 @@ div.with_media_panel .formfield input { | @@ -3639,21 +3646,43 @@ div.with_media_panel .formfield input { | ||
| 3639 | .text-editor-sidebar .items { | 3646 | .text-editor-sidebar .items { |
| 3640 | margin-bottom: 10px; | 3647 | margin-bottom: 10px; |
| 3641 | } | 3648 | } |
| 3642 | -.text-editor-sidebar .items div { | 3649 | +.text-editor-sidebar .items .item { |
| 3643 | background-repeat: no-repeat; | 3650 | background-repeat: no-repeat; |
| 3644 | background-position: 0px 0px; | 3651 | background-position: 0px 0px; |
| 3645 | padding-left: 20px; | 3652 | padding-left: 20px; |
| 3646 | padding-top: 2px; | 3653 | padding-top: 2px; |
| 3647 | padding-bottom: 2px; | 3654 | padding-bottom: 2px; |
| 3648 | border: none; | 3655 | border: none; |
| 3649 | - margin-bottom: 2px; | 3656 | + margin-bottom: 12px; |
| 3650 | } | 3657 | } |
| 3658 | + | ||
| 3651 | .text-editor-sidebar .items :hover { | 3659 | .text-editor-sidebar .items :hover { |
| 3652 | background-color: transparent; | 3660 | background-color: transparent; |
| 3653 | - border: none; | ||
| 3654 | } | 3661 | } |
| 3655 | -.text-editor-sidebar #media-upload-box, | ||
| 3656 | -.text-editor-sidebar #media-search-box { | 3662 | + |
| 3663 | +.text-editor-sidebar .items .image-controls { | ||
| 3664 | + display: none; | ||
| 3665 | + margin-left: 4px; | ||
| 3666 | + vertical-align: top; | ||
| 3667 | +} | ||
| 3668 | + | ||
| 3669 | +.text-editor-sidebar .items .item:hover .image-controls { | ||
| 3670 | + display: inline-block; | ||
| 3671 | +} | ||
| 3672 | + | ||
| 3673 | +.text-editor-sidebar .items .image-controls .icon-zoom { | ||
| 3674 | + background-image: url(../images/zoom-dark.png); | ||
| 3675 | + display: block; | ||
| 3676 | + width: 0px; | ||
| 3677 | + margin-top: 4px; | ||
| 3678 | +} | ||
| 3679 | + | ||
| 3680 | +.text-editor-sidebar .items .file-controls { | ||
| 3681 | + margin-top: 4px; | ||
| 3682 | + margin-bottom: 4px; | ||
| 3683 | +} | ||
| 3684 | + | ||
| 3685 | +.text-editor-sidebar .header { | ||
| 3657 | background-repeat: no-repeat; | 3686 | background-repeat: no-repeat; |
| 3658 | background-position: 98% 10px; | 3687 | background-position: 98% 10px; |
| 3659 | } | 3688 | } |