Commit ac6da245d710953fe1f015f29600b9afc8182194
1 parent
6ec69965
Exists in
master
and in
23 other branches
Organize type selection at context content block
Show main types first and render a link to display more types at context content block edition
Showing
3 changed files
with
63 additions
and
7 deletions
Show diff stats
plugins/context_content/lib/context_content_block.rb
| ... | ... | @@ -18,7 +18,21 @@ class ContextContentBlock < Block |
| 18 | 18 | end |
| 19 | 19 | |
| 20 | 20 | def available_content_types |
| 21 | - @available_content_types ||= [TinyMceArticle, TextileArticle, RawHTMLArticle, Event, Folder, Blog, UploadedFile, Forum, Gallery, RssFeed] + plugins.dispatch(:content_types) | |
| 21 | + @available_content_types ||= [UploadedFile, Event, TinyMceArticle, TextileArticle, RawHTMLArticle, Folder, Blog, Forum, Gallery, RssFeed] + plugins.dispatch(:content_types) | |
| 22 | + checked_types = types.map {|t| t.constantize} | |
| 23 | + checked_types + (@available_content_types - checked_types) | |
| 24 | + end | |
| 25 | + | |
| 26 | + def first_content_types | |
| 27 | + available_content_types.first(first_types_count) | |
| 28 | + end | |
| 29 | + | |
| 30 | + def more_content_types | |
| 31 | + available_content_types.drop(first_types_count) | |
| 32 | + end | |
| 33 | + | |
| 34 | + def first_types_count | |
| 35 | + [2, types.length].max | |
| 22 | 36 | end |
| 23 | 37 | |
| 24 | 38 | def types=(new_types) | ... | ... |
plugins/context_content/test/unit/context_content_block_test.rb
| ... | ... | @@ -84,8 +84,37 @@ class ContextContentBlockTest < ActiveSupport::TestCase |
| 84 | 84 | assert_equal nil, @block.contents(folder) |
| 85 | 85 | end |
| 86 | 86 | |
| 87 | + should 'return available content types with checked types first' do | |
| 88 | + @block.types = ['TinyMceArticle', 'Folder'] | |
| 89 | + assert_equal [TinyMceArticle, Folder, UploadedFile, Event, TextileArticle, RawHTMLArticle, Blog, Forum, Gallery, RssFeed], @block.available_content_types | |
| 90 | + end | |
| 91 | + | |
| 87 | 92 | should 'return available content types' do |
| 88 | - assert_equal [TinyMceArticle, TextileArticle, RawHTMLArticle, Event, Folder, Blog, UploadedFile, Forum, Gallery, RssFeed], @block.available_content_types | |
| 93 | + @block.types = [] | |
| 94 | + assert_equal [UploadedFile, Event, TinyMceArticle, TextileArticle, RawHTMLArticle, Folder, Blog, Forum, Gallery, RssFeed], @block.available_content_types | |
| 95 | + end | |
| 96 | + | |
| 97 | + should 'return first 2 content types' do | |
| 98 | + assert_equal 2, @block.first_content_types.length | |
| 99 | + end | |
| 100 | + | |
| 101 | + should 'return all but first 2 content types' do | |
| 102 | + assert_equal @block.available_content_types.length - 2, @block.more_content_types.length | |
| 103 | + end | |
| 104 | + | |
| 105 | + should 'return 2 as default value for first_types_count' do | |
| 106 | + assert_equal 2, @block.first_types_count | |
| 107 | + end | |
| 108 | + | |
| 109 | + should 'return types length if it has more than 2 selected types' do | |
| 110 | + @block.types = ['UploadedFile', 'Event', 'Folder'] | |
| 111 | + assert_equal 3, @block.first_types_count | |
| 112 | + end | |
| 113 | + | |
| 114 | + should 'return selected types at first_content_types' do | |
| 115 | + @block.types = ['UploadedFile', 'Event', 'Folder'] | |
| 116 | + assert_equal [UploadedFile, Event, Folder], @block.first_content_types | |
| 117 | + assert_equal @block.available_content_types - [UploadedFile, Event, Folder], @block.more_content_types | |
| 89 | 118 | end |
| 90 | 119 | |
| 91 | 120 | should 'include plugin content at available content types' do |
| ... | ... | @@ -93,7 +122,8 @@ class ContextContentBlockTest < ActiveSupport::TestCase |
| 93 | 122 | class SomePlugin; def content_types; SomePluginContent end end |
| 94 | 123 | Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([SomePlugin.new]) |
| 95 | 124 | |
| 96 | - assert_equal [TinyMceArticle, TextileArticle, RawHTMLArticle, Event, Folder, Blog, UploadedFile, Forum, Gallery, RssFeed, SomePluginContent], @block.available_content_types | |
| 125 | + @block.types = [] | |
| 126 | + assert_equal [UploadedFile, Event, TinyMceArticle, TextileArticle, RawHTMLArticle, Folder, Blog, Forum, Gallery, RssFeed, SomePluginContent], @block.available_content_types | |
| 97 | 127 | end |
| 98 | 128 | |
| 99 | 129 | should 'display thumbnail for image content' do | ... | ... |
plugins/context_content/views/box_organizer/_context_content_block.rhtml
| ... | ... | @@ -4,8 +4,20 @@ |
| 4 | 4 | <%= labelled_form_field check_box(:block, :show_image) + _('Show content image'), '' %> |
| 5 | 5 | <%= labelled_form_field check_box(:block, :show_parent_content) + _('Show parent content when children is empty'), '' %> |
| 6 | 6 | |
| 7 | - <p>Display content types:</p> | |
| 8 | - <% @block.available_content_types.each do |type| %> | |
| 9 | - <%= labelled_form_field check_box(:block, 'types', {:multiple => true}, type.name, nil) + _(type.short_description), '' %> | |
| 10 | - <% end %> | |
| 7 | + <br/> | |
| 8 | + <%= label :block, :types, _('Display content types:'), :class => 'formlabel' %> | |
| 9 | + <div class="content_types"> | |
| 10 | + <% @block.first_content_types.each do |type| %> | |
| 11 | + <%= labelled_form_field check_box(:block, 'types', {:multiple => true}, type.name, nil) + _(type.short_description), '' %> | |
| 12 | + <% end %> | |
| 13 | + <% if !@block.more_content_types.empty? %> | |
| 14 | + <a href="#" onclick="jQuery('.content_types .more').toggle(); return false;"><%= _('more') %></a> | |
| 15 | + <% end %> | |
| 16 | + <div class="more" style="display: none"> | |
| 17 | + <% @block.more_content_types.each do |type| %> | |
| 18 | + <%= labelled_form_field check_box(:block, 'types', {:multiple => true}, type.name, nil) + _(type.short_description), '' %> | |
| 19 | + <% end %> | |
| 20 | + </div> | |
| 21 | + </div> | |
| 22 | + <br/> | |
| 11 | 23 | </div> | ... | ... |