Commit a47c9449ff652631af9dc996b6db33a4711fc5cb

Authored by Victor Costa
2 parents 377edbac 0056aa48

Merge branch 'site_tour' into stable

Conflicts:
	plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block.html.erb
	plugins/site_tour/views/tour_actions.html.erb
plugins/site_tour/public/edit_tour_block.css
  1 +#edit-tour-block .list-items {
  2 + margin-bottom: 25px;
  3 +}
1 4
2 -#edit-tour-block #droppable-tour-actions {  
3 - padding-left: 23px; 5 +#edit-tour-block .droppable-items {
  6 + padding-left: 0;
4 margin-top: -12px; 7 margin-top: -12px;
5 } 8 }
6 9
7 -#edit-tour-block #droppable-tour-actions li { 10 +#edit-tour-block .droppable-items li {
8 list-style-type: none; 11 list-style-type: none;
9 } 12 }
10 13
11 -#edit-tour-block .action-row { 14 +#edit-tour-block .item-row {
12 line-height: 25px; 15 line-height: 25px;
13 margin-bottom: 5px; 16 margin-bottom: 5px;
14 - padding: 10px 1px 10px 10px; 17 + padding: 0;
15 cursor: pointer; 18 cursor: pointer;
16 width: 97%; 19 width: 97%;
17 } 20 }
18 21
19 -#edit-tour-block .action-row:hover {  
20 - background: #ddd url(../images/drag-and-drop.png) no-repeat; 22 +#edit-tour-block .item-row:hover {
  23 + background: #ddd url(/images/drag-and-drop.png) no-repeat;
21 background-position: 98% 15px; 24 background-position: 98% 15px;
22 } 25 }
23 26
24 -#edit-tour-block .action-row li { 27 +#edit-tour-block .item-row li {
25 list-style-type: none; 28 list-style-type: none;
26 display: inline; 29 display: inline;
27 margin-left: 5px; 30 margin-left: 5px;
@@ -30,7 +33,6 @@ @@ -30,7 +33,6 @@
30 #edit-tour-block { 33 #edit-tour-block {
31 width: 620px; 34 width: 620px;
32 position: relative; 35 position: relative;
33 - left: -24px;  
34 } 36 }
35 37
36 #edit-tour-block #new-template { 38 #edit-tour-block #new-template {
@@ -39,8 +41,7 @@ @@ -39,8 +41,7 @@
39 41
40 #edit-tour-block .list-header { 42 #edit-tour-block .list-header {
41 width: 98%; 43 width: 98%;
42 - height: 25px;  
43 - padding: 10px 1px 10px 10px; 44 + padding: 0 1px 10px 10px;
44 margin-bottom: 5px; 45 margin-bottom: 5px;
45 cursor: pointer; 46 cursor: pointer;
46 } 47 }
@@ -49,16 +50,16 @@ @@ -49,16 +50,16 @@
49 list-style-type: none; 50 list-style-type: none;
50 display: inline; 51 display: inline;
51 font-weight: bold; 52 font-weight: bold;
52 - font-size: 14px; 53 + font-size: 12px;
53 text-align: center; 54 text-align: center;
54 } 55 }
55 56
56 #edit-tour-block .list-header .list-name { 57 #edit-tour-block .list-header .list-name {
57 - margin-left: 50px; 58 + margin-left: 20px;
58 } 59 }
59 #edit-tour-block .list-header .list-selector { 60 #edit-tour-block .list-header .list-selector {
60 margin-left: 63px; 61 margin-left: 63px;
61 } 62 }
62 -#edit-tour-block .list-header .list-description { 63 +#edit-tour-block .list-header .list-description, #edit-tour-block .list-header .list-event {
63 margin-left: 68px; 64 margin-left: 68px;
64 } 65 }
plugins/site_tour/public/edit_tour_block.js
1 -function add_new_action() {  
2 - var new_action = jQuery('#edit-tour-block #new-template>li').clone();  
3 - new_action.show();  
4 - jQuery('#droppable-tour-actions').append(new_action);  
5 -}  
6 -  
7 jQuery(document).ready(function(){ 1 jQuery(document).ready(function(){
8 - jQuery('#edit-tour-block').on('click', '.delete-tour-action-row', function() { 2 + jQuery('#edit-tour-block').on('click', '.add-item', function() {
  3 + var container = jQuery(this).closest('.list-items');
  4 + var new_action = container.find('#new-template>li').clone();
  5 + new_action.show();
  6 + container.find('.droppable-items').append(new_action);
  7 + });
  8 +
  9 + jQuery('#edit-tour-block').on('click', '.delete-tour-block-item', function() {
9 jQuery(this).parent().parent().remove(); 10 jQuery(this).parent().parent().remove();
10 return false; 11 return false;
11 }); 12 });
12 13
13 - jQuery("#droppable-tour-actions").sortable({ 14 + jQuery("#edit-tour-block .droppable-items").sortable({
14 revert: true, 15 revert: true,
15 axis: "y" 16 axis: "y"
16 }); 17 });
plugins/site_tour/test/functional/site_tour_plugin_admin_controller_test.rb
@@ -31,13 +31,29 @@ class SiteTourPluginAdminControllerTest < ActionController::TestCase @@ -31,13 +31,29 @@ class SiteTourPluginAdminControllerTest < ActionController::TestCase
31 assert_equal nil, @settings.settings[:actions_csv] 31 assert_equal nil, @settings.settings[:actions_csv]
32 end 32 end
33 33
  34 + should 'do not store group_triggers_csv' do
  35 + group_triggers_csv = "tour_plugin,.tour-button,click"
  36 + post :index, :settings => {"group_triggers_csv" => group_triggers_csv}
  37 + @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin)
  38 + assert_equal nil, @settings.settings[:group_triggers_csv]
  39 + end
  40 +
34 should 'convert actions array to csv to enable user edition' do 41 should 'convert actions array to csv to enable user edition' do
35 @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin) 42 @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin)
36 @settings.actions = [{:language => 'en', :group_name => 'tour_plugin', :selector => '.tour-button', :description => 'Click'}] 43 @settings.actions = [{:language => 'en', :group_name => 'tour_plugin', :selector => '.tour-button', :description => 'Click'}]
37 @settings.save! 44 @settings.save!
38 45
39 get :index 46 get :index
40 - assert_tag :tag => 'textarea', :content => "\nen,tour_plugin,.tour-button,Click\n" 47 + assert_tag :tag => 'textarea', :attributes => {:class => 'actions-csv'}, :content => "\nen,tour_plugin,.tour-button,Click\n"
  48 + end
  49 +
  50 + should 'convert group_triggers array to csv to enable user edition' do
  51 + @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin)
  52 + @settings.group_triggers = [{:group_name => 'tour_plugin', :selector => '.tour-button', :event => 'click'}]
  53 + @settings.save!
  54 +
  55 + get :index
  56 + assert_tag :tag => 'textarea', :attributes => {:class => 'groups-csv'}, :content => "\ntour_plugin,.tour-button,click\n"
41 end 57 end
42 58
43 end 59 end
plugins/site_tour/test/unit/site_tour_plugin_test.rb
@@ -38,4 +38,36 @@ class SiteTourPluginTest < ActionView::TestCase @@ -38,4 +38,36 @@ class SiteTourPluginTest < ActionView::TestCase
38 assert_no_tag_in_string instance_exec(&plugin.body_ending), :tag => "script" 38 assert_no_tag_in_string instance_exec(&plugin.body_ending), :tag => "script"
39 end 39 end
40 40
  41 + should 'render javascript tag with tooltip actions and group triggers' do
  42 + expects(:language).returns('en').at_least_once
  43 +
  44 + settings = Noosfero::Plugin::Settings.new(Environment.default, SiteTourPlugin)
  45 + settings.actions = [{:language => 'en', :group_name => 'test', :selector => 'body', :description => 'Test'}]
  46 + settings.group_triggers = [{:group_name => 'test', :selector => 'body', :event => 'click'}]
  47 + settings.save!
  48 +
  49 + expects(:environment).returns(Environment.default)
  50 + body_ending = instance_exec(&plugin.body_ending)
  51 + assert_match /siteTourPlugin\.add\('test', 'body', 'Test', 1\);/, body_ending
  52 + assert_match /siteTourPlugin\.addGroupTrigger\('test', 'body', 'click'\);/, body_ending
  53 + end
  54 +
  55 + should 'start each tooltip group with the correct step order' do
  56 + expects(:language).returns('en').at_least_once
  57 +
  58 + settings = Noosfero::Plugin::Settings.new(Environment.default, SiteTourPlugin)
  59 + settings.actions = [
  60 + {:language => 'en', :group_name => 'test_a', :selector => 'body', :description => 'Test A1'},
  61 + {:language => 'en', :group_name => 'test_a', :selector => 'body', :description => 'Test A2'},
  62 + {:language => 'en', :group_name => 'test_b', :selector => 'body', :description => 'Test B1'},
  63 + ]
  64 + settings.save!
  65 +
  66 + expects(:environment).returns(Environment.default)
  67 + body_ending = instance_exec(&plugin.body_ending)
  68 + assert_match /siteTourPlugin\.add\('test_a', 'body', 'Test A1', 1\);/, body_ending
  69 + assert_match /siteTourPlugin\.add\('test_a', 'body', 'Test A2', 2\);/, body_ending
  70 + assert_match /siteTourPlugin\.add\('test_b', 'body', 'Test B1', 1\);/, body_ending
  71 + end
  72 +
41 end 73 end
plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block.html.erb
@@ -3,23 +3,41 @@ @@ -3,23 +3,41 @@
3 3
4 <%= labelled_form_field check_box(:block, :display_button) + _('Display help button'), '' %> 4 <%= labelled_form_field check_box(:block, :display_button) + _('Display help button'), '' %>
5 5
6 -<strong><%= _('Tooltip Actions') %></strong>  
7 <div id='edit-tour-block'> 6 <div id='edit-tour-block'>
8 - <ul class='list-header'>  
9 - <li class='list-name'><%= _('Group Name') %></li>  
10 - <li class='list-selector'><%= _('Selector') %></li>  
11 - <li class='list-description'><%= _('Description') %></li>  
12 - </ul>  
13 - <ul id="droppable-tour-actions">  
14 - <% for action in @block.actions do %>  
15 - <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => action} %>  
16 - <% end %>  
17 - </ul> 7 + <div id="tooltip-actions" class="list-items">
  8 + <h3><%= _('Tooltip Actions') %></h3>
  9 + <ul class='list-header'>
  10 + <li class='list-name'><%= _('Group Name') %></li>
  11 + <li class='list-selector'><%= _('Selector') %></li>
  12 + <li class='list-description'><%= _('Description') %></li>
  13 + </ul>
  14 + <ul id="droppable-tour-actions" class="droppable-items">
  15 + <% for action in @block.actions do %>
  16 + <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => action} %>
  17 + <% end %>
  18 + </ul>
  19 + <div id="new-template">
  20 + <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => {} } %>
  21 + </div>
  22 + <%= link_to_function(_('New Tooltip'), :class => 'add-item button icon-add with-text') %>
  23 + </div>
18 24
19 - <div id="new-template">  
20 - <% template_action = {} %>  
21 - <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => template_action} %> 25 + <div id="group-triggers" class="list-items">
  26 + <h3><%= _('Group Triggers') %></h3>
  27 + <ul class='list-header'>
  28 + <li class='list-name'><%= _('Group Name') %></li>
  29 + <li class='list-selector'><%= _('Selector') %></li>
  30 + <li class='list-event'><%= _('Event') %></li>
  31 + </ul>
  32 + <ul id="droppable-tour-group-triggers" class="droppable-items">
  33 + <% for group in @block.group_triggers do %>
  34 + <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_group_item', :locals => {:group => group} %>
  35 + <% end %>
  36 + </ul>
  37 + <div id="new-template">
  38 + <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_group_item', :locals => {:group => {} } %>
  39 + </div>
  40 + <%= link_to_function(_('New Group Trigger'), :class => 'add-item button icon-add with-text') %>
22 </div> 41 </div>
23 -</div>  
24 42
25 -<%= link_to_function(_('New'), 'add_new_action();', :class => 'button icon-add with-text') %> 43 +</div>
plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_group_item.html.erb 0 → 100644
@@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
  1 +<li>
  2 + <ul class="item-row">
  3 + <li>
  4 + <%= text_field_tag 'block[group_triggers][][group_name]', group[:group_name], :class => 'group-name', :maxlength => 20 %>
  5 + </li>
  6 + <li>
  7 + <%= text_field_tag 'block[group_triggers][][selector]', group[:selector], :class => 'selector' %>
  8 + </li>
  9 + <li>
  10 + <%= text_field_tag 'block[group_triggers][][event]', group[:event], :class => 'description' %>
  11 + </li>
  12 + <li>
  13 + <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-tour-block-item") %>
  14 + </li>
  15 + </ul>
  16 +</li>
  17 +
plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_item.html.erb
1 <li> 1 <li>
2 - <ul class="action-row"> 2 + <ul class="item-row">
3 <li> 3 <li>
4 <%= text_field_tag 'block[actions][][group_name]', action[:group_name], :class => 'group-name', :maxlength => 20 %> 4 <%= text_field_tag 'block[actions][][group_name]', action[:group_name], :class => 'group-name', :maxlength => 20 %>
5 </li> 5 </li>
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 <%= text_field_tag 'block[actions][][description]', action[:description], :class => 'description' %> 10 <%= text_field_tag 'block[actions][][description]', action[:description], :class => 'description' %>
11 </li> 11 </li>
12 <li> 12 <li>
13 - <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-tour-action-row") %> 13 + <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-tour-block-item") %>
14 </li> 14 </li>
15 </ul> 15 </ul>
16 </li> 16 </li>
plugins/site_tour/views/tour_actions.html.erb
@@ -4,14 +4,15 @@ @@ -4,14 +4,15 @@
4 <% if actions.present? %> 4 <% if actions.present? %>
5 <script> 5 <script>
6 jQuery( document ).ready(function( $ ) { 6 jQuery( document ).ready(function( $ ) {
7 - <% actions.each_with_index do |action, index| %>  
8 - <%= "siteTourPlugin.add('#{j action[:group_name]}', '#{j action[:selector]}', '#{j action[:description]}', #{index + 1});" %>  
9 - <% end %>  
10 -  
11 - <% (group_triggers||[]).each_with_index do |group, index| %>  
12 - <%= "siteTourPlugin.addGroupTrigger('#{j group[:group_name]}', '#{j group[:selector]}', '#{j group[:event]}');" %>  
13 - <% end %> 7 + <% actions.group_by {|h| h[:group_name]}.each do |group, group_actions| %>
  8 + <% group_actions.each_with_index do |action, index| %>
  9 + <%= "siteTourPlugin.add('#{j action[:group_name]}', '#{j action[:selector]}', '#{j action[:description]}', #{index + 1});" %>
  10 + <% end %>
  11 + <% end %>
14 12
  13 + <% (group_triggers||[]).each_with_index do |group, index| %>
  14 + <%= "siteTourPlugin.addGroupTrigger('#{j group[:group_name]}', '#{j group[:selector]}', '#{j group[:event]}');" %>
  15 + <% end %>
15 }); 16 });
16 </script> 17 </script>
17 <% end %> 18 <% end %>