From d75dc8aeea45cb8603cde9b08456d32d782354ce Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Tue, 20 Jan 2015 11:38:24 -0300 Subject: [PATCH] site_tour: set triggers for groups --- plugins/site_tour/controllers/site_tour_plugin_admin_controller.rb | 18 +++++++++++++++--- plugins/site_tour/lib/site_tour_plugin.rb | 2 +- plugins/site_tour/lib/site_tour_plugin/tour_block.rb | 4 +++- plugins/site_tour/public/edit_tour_block.css | 29 +++++++++++++++-------------- plugins/site_tour/public/edit_tour_block.js | 17 +++++++++-------- plugins/site_tour/public/main.js | 35 ++++++++++++++++++++++++++++++----- plugins/site_tour/test/functional/site_tour_plugin_admin_controller_test.rb | 25 ++++++++++++++++++++++++- plugins/site_tour/views/blocks/tour.html.erb | 2 +- plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block.html.erb | 50 ++++++++++++++++++++++++++++++++++---------------- plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_group_item.html.erb | 17 +++++++++++++++++ plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_item.html.erb | 4 ++-- plugins/site_tour/views/site_tour_plugin_admin/index.html.erb | 1 + plugins/site_tour/views/tour_actions.html.erb | 7 ++++++- 13 files changed, 158 insertions(+), 53 deletions(-) create mode 100644 plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_group_item.html.erb diff --git a/plugins/site_tour/controllers/site_tour_plugin_admin_controller.rb b/plugins/site_tour/controllers/site_tour_plugin_admin_controller.rb index 912878e..7b72014 100644 --- a/plugins/site_tour/controllers/site_tour_plugin_admin_controller.rb +++ b/plugins/site_tour/controllers/site_tour_plugin_admin_controller.rb @@ -10,11 +10,15 @@ class SiteTourPluginAdminController < AdminController @settings = Noosfero::Plugin::Settings.new(environment, SiteTourPlugin, settings) @settings.actions_csv = convert_to_csv(@settings.actions) + @settings.group_triggers_csv = convert_to_csv(@settings.group_triggers) if request.post? - @settings.actions = convert_from_csv(settings[:actions_csv]) + @settings.actions = convert_actions_from_csv(settings[:actions_csv]) @settings.settings.delete(:actions_csv) + @settings.group_triggers = convert_group_triggers_from_csv(settings[:group_triggers_csv]) + @settings.settings.delete(:group_triggers_csv) + @settings.save! session[:notice] = 'Settings succefully saved.' redirect_to :action => 'index' @@ -25,14 +29,22 @@ class SiteTourPluginAdminController < AdminController def convert_to_csv(actions) CSV.generate do |csv| - (@settings.actions||[]).each { |action| csv << action.values } + (actions||[]).each { |action| csv << action.values } end end - def convert_from_csv(actions_csv) + def convert_actions_from_csv(actions_csv) + return [] if actions_csv.blank? CSV.parse(actions_csv).map do |action| {:language => action[0], :group_name => action[1], :selector => action[2], :description => action[3]} end end + def convert_group_triggers_from_csv(group_triggers_csv) + return [] if group_triggers_csv.blank? + CSV.parse(group_triggers_csv).map do |group| + {:group_name => group[0], :selector => group[1], :event => group[2]} + end + end + end diff --git a/plugins/site_tour/lib/site_tour_plugin.rb b/plugins/site_tour/lib/site_tour_plugin.rb index cc9f1ad..4003d3d 100644 --- a/plugins/site_tour/lib/site_tour_plugin.rb +++ b/plugins/site_tour/lib/site_tour_plugin.rb @@ -29,7 +29,7 @@ class SiteTourPlugin < Noosfero::Plugin settings = Noosfero::Plugin::Settings.new(environment, SiteTourPlugin) actions = (settings.actions||[]).select {|action| action[:language] == language} - render(:file => 'tour_actions', :locals => { :actions => actions, :js_file => js_file}) + render(:file => 'tour_actions', :locals => { :actions => actions, :group_triggers => settings.group_triggers, :js_file => js_file}) end end diff --git a/plugins/site_tour/lib/site_tour_plugin/tour_block.rb b/plugins/site_tour/lib/site_tour_plugin/tour_block.rb index b2af771..a4a6207 100644 --- a/plugins/site_tour/lib/site_tour_plugin/tour_block.rb +++ b/plugins/site_tour/lib/site_tour_plugin/tour_block.rb @@ -1,12 +1,14 @@ class SiteTourPlugin::TourBlock < Block settings_items :actions, :type => Array, :default => [{:group_name => 'tour_plugin', :selector => '.site-tour-plugin_tour-block .tour-button', :description => _('Click to start tour!')}] + settings_items :group_triggers, :type => Array, :default => [] settings_items :display_button, :type => :boolean, :default => true - attr_accessible :actions, :display_button + attr_accessible :actions, :display_button, :group_triggers before_save do |block| block.actions.reject! {|i| i[:group_name].blank? && i[:selector].blank? && i[:description].blank?} + block.group_triggers.reject! {|i| i[:group_name].blank? && i[:selector].blank? && i[:event].blank?} end def self.description diff --git a/plugins/site_tour/public/edit_tour_block.css b/plugins/site_tour/public/edit_tour_block.css index 579c854..42bd538 100644 --- a/plugins/site_tour/public/edit_tour_block.css +++ b/plugins/site_tour/public/edit_tour_block.css @@ -1,27 +1,30 @@ +#edit-tour-block .list-items { + margin-bottom: 25px; +} -#edit-tour-block #droppable-tour-actions { - padding-left: 23px; +#edit-tour-block .droppable-items { + padding-left: 0; margin-top: -12px; } -#edit-tour-block #droppable-tour-actions li { +#edit-tour-block .droppable-items li { list-style-type: none; } -#edit-tour-block .action-row { +#edit-tour-block .item-row { line-height: 25px; margin-bottom: 5px; - padding: 10px 1px 10px 10px; + padding: 0; cursor: pointer; width: 97%; } -#edit-tour-block .action-row:hover { - background: #ddd url(../images/drag-and-drop.png) no-repeat; +#edit-tour-block .item-row:hover { + background: #ddd url(/images/drag-and-drop.png) no-repeat; background-position: 98% 15px; } -#edit-tour-block .action-row li { +#edit-tour-block .item-row li { list-style-type: none; display: inline; margin-left: 5px; @@ -30,7 +33,6 @@ #edit-tour-block { width: 620px; position: relative; - left: -24px; } #edit-tour-block #new-template { @@ -39,8 +41,7 @@ #edit-tour-block .list-header { width: 98%; - height: 25px; - padding: 10px 1px 10px 10px; + padding: 0 1px 10px 10px; margin-bottom: 5px; cursor: pointer; } @@ -49,16 +50,16 @@ list-style-type: none; display: inline; font-weight: bold; - font-size: 14px; + font-size: 12px; text-align: center; } #edit-tour-block .list-header .list-name { - margin-left: 50px; + margin-left: 20px; } #edit-tour-block .list-header .list-selector { margin-left: 63px; } -#edit-tour-block .list-header .list-description { +#edit-tour-block .list-header .list-description, #edit-tour-block .list-header .list-event { margin-left: 68px; } diff --git a/plugins/site_tour/public/edit_tour_block.js b/plugins/site_tour/public/edit_tour_block.js index 70e38dd..333e447 100644 --- a/plugins/site_tour/public/edit_tour_block.js +++ b/plugins/site_tour/public/edit_tour_block.js @@ -1,16 +1,17 @@ -function add_new_action() { - var new_action = jQuery('#edit-tour-block #new-template>li').clone(); - new_action.show(); - jQuery('#droppable-tour-actions').append(new_action); -} - jQuery(document).ready(function(){ - jQuery('#edit-tour-block').on('click', '.delete-tour-action-row', function() { + jQuery('#edit-tour-block').on('click', '.add-item', function() { + var container = jQuery(this).closest('.list-items'); + var new_action = container.find('#new-template>li').clone(); + new_action.show(); + container.find('.droppable-items').append(new_action); + }); + + jQuery('#edit-tour-block').on('click', '.delete-tour-block-item', function() { jQuery(this).parent().parent().remove(); return false; }); - jQuery("#droppable-tour-actions").sortable({ + jQuery("#edit-tour-block .droppable-items").sortable({ revert: true, axis: "y" }); diff --git a/plugins/site_tour/public/main.js b/plugins/site_tour/public/main.js index 576ce0e..1f33a55 100644 --- a/plugins/site_tour/public/main.js +++ b/plugins/site_tour/public/main.js @@ -1,7 +1,9 @@ var siteTourPlugin = (function() { var actions = []; + var groupTriggers = []; var userData = {}; + var intro; function hasMark(name) { return jQuery.cookie("_noosfero_.sitetour." + name) || @@ -19,7 +21,7 @@ var siteTourPlugin = (function() { jQuery('.site-tour-plugin').removeAttr('data-intro data-intro-name data-step'); } - function configureIntro(force) { + function configureIntro(force, actions) { clearAll(); for(var i=0; i 'en', :group_name => 'tour_plugin', :selector => '.tour-button', :description => 'Click'}], @settings.actions end + should 'parse csv and save group triggers array in plugin settings' do + group_triggers_csv = "tour_plugin,.tour-button,mouseenter" + post :index, :settings => {"group_triggers_csv" => group_triggers_csv} + @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin) + assert_equal [{:group_name => 'tour_plugin', :selector => '.tour-button', :event => 'mouseenter'}], @settings.group_triggers + end + should 'do not store actions_csv' do actions_csv = "en,tour_plugin,.tour-button,Click" post :index, :settings => {"actions_csv" => actions_csv} @@ -24,13 +31,29 @@ class SiteTourPluginAdminControllerTest < ActionController::TestCase assert_equal nil, @settings.settings[:actions_csv] end + should 'do not store group_triggers_csv' do + group_triggers_csv = "tour_plugin,.tour-button,click" + post :index, :settings => {"group_triggers_csv" => group_triggers_csv} + @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin) + assert_equal nil, @settings.settings[:group_triggers_csv] + end + should 'convert actions array to csv to enable user edition' do @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin) @settings.actions = [{:language => 'en', :group_name => 'tour_plugin', :selector => '.tour-button', :description => 'Click'}] @settings.save! get :index - assert_tag :tag => 'textarea', :content => "\nen,tour_plugin,.tour-button,Click\n" + assert_tag :tag => 'textarea', :attributes => {:class => 'actions-csv'}, :content => "\nen,tour_plugin,.tour-button,Click\n" + end + + should 'convert group_triggers array to csv to enable user edition' do + @settings = Noosfero::Plugin::Settings.new(environment.reload, SiteTourPlugin) + @settings.group_triggers = [{:group_name => 'tour_plugin', :selector => '.tour-button', :event => 'click'}] + @settings.save! + + get :index + assert_tag :tag => 'textarea', :attributes => {:class => 'groups-csv'}, :content => "\ntour_plugin,.tour-button,click\n" end end diff --git a/plugins/site_tour/views/blocks/tour.html.erb b/plugins/site_tour/views/blocks/tour.html.erb index 346ddf3..1b7088b 100644 --- a/plugins/site_tour/views/blocks/tour.html.erb +++ b/plugins/site_tour/views/blocks/tour.html.erb @@ -7,5 +7,5 @@ <% edit_mode = controller.send(:boxes_editor?) && controller.send(:uses_design_blocks?) %> <% unless edit_mode %> - <%= render :file => 'tour_actions', :locals => {:actions => block.actions} %> + <%= render :file => 'tour_actions', :locals => {:actions => block.actions, :group_triggers => block.group_triggers} %> <% end %> diff --git a/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block.html.erb b/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block.html.erb index 99207c6..752def8 100644 --- a/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block.html.erb +++ b/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block.html.erb @@ -3,23 +3,41 @@ <%= labelled_form_field check_box(:block, :display_button) + _('Display help button'), '' %> -<%= _('Actions') %>
-
    -
  • <%= _('Group Name') %>
  • -
  • <%= _('Selector') %>
  • -
  • <%= _('Description') %>
  • -
-
    - <% for action in @block.actions do %> - <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => action} %> - <% end %> -
+
+

<%= _('Tooltip Actions') %>

+
    +
  • <%= _('Group Name') %>
  • +
  • <%= _('Selector') %>
  • +
  • <%= _('Description') %>
  • +
+
    + <% for action in @block.actions do %> + <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => action} %> + <% end %> +
+
+ <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => {} } %> +
+ <%= link_to_function(_('New Tooltip'), :class => 'add-item button icon-add with-text') %> +
-
- <% template_action = {} %> - <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_item', :locals => {:action => template_action} %> +
+

<%= _('Group Triggers') %>

+
    +
  • <%= _('Group Name') %>
  • +
  • <%= _('Selector') %>
  • +
  • <%= _('Event') %>
  • +
+
    + <% for group in @block.group_triggers do %> + <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_group_item', :locals => {:group => group} %> + <% end %> +
+
+ <%= render :partial => 'box_organizer/site_tour_plugin/tour_block_group_item', :locals => {:group => {} } %> +
+ <%= link_to_function(_('New Group Trigger'), :class => 'add-item button icon-add with-text') %>
-
-<%= link_to_function(_('New'), 'add_new_action();', :class => 'button icon-add with-text') %> +
diff --git a/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_group_item.html.erb b/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_group_item.html.erb new file mode 100644 index 0000000..a8481f5 --- /dev/null +++ b/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_group_item.html.erb @@ -0,0 +1,17 @@ +
  • +
      +
    • + <%= text_field_tag 'block[group_triggers][][group_name]', group[:group_name], :class => 'group-name', :maxlength => 20 %> +
    • +
    • + <%= text_field_tag 'block[group_triggers][][selector]', group[:selector], :class => 'selector' %> +
    • +
    • + <%= text_field_tag 'block[group_triggers][][event]', group[:event], :class => 'description' %> +
    • +
    • + <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-tour-block-item") %> +
    • +
    +
  • + diff --git a/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_item.html.erb b/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_item.html.erb index beaf59e..41cac8d 100644 --- a/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_item.html.erb +++ b/plugins/site_tour/views/box_organizer/site_tour_plugin/_tour_block_item.html.erb @@ -1,5 +1,5 @@
  • -
      +
      • <%= text_field_tag 'block[actions][][group_name]', action[:group_name], :class => 'group-name', :maxlength => 20 %>
      • @@ -10,7 +10,7 @@ <%= text_field_tag 'block[actions][][description]', action[:description], :class => 'description' %>
      • - <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-tour-action-row") %> + <%= button_without_text(:delete, _('Delete'), "#" , :class=>"delete-tour-block-item") %>
      diff --git a/plugins/site_tour/views/site_tour_plugin_admin/index.html.erb b/plugins/site_tour/views/site_tour_plugin_admin/index.html.erb index 30dd022..bba26a5 100644 --- a/plugins/site_tour/views/site_tour_plugin_admin/index.html.erb +++ b/plugins/site_tour/views/site_tour_plugin_admin/index.html.erb @@ -3,6 +3,7 @@ <%= form_for(:settings) do |f| %> <%= labelled_form_field _('Tooltips (CSV format: language, group name, selector, description)'), f.text_area(:actions_csv, :style => 'width: 100%', :class => 'actions-csv') %> + <%= labelled_form_field _('Group Triggers (CSV format: group name, selector, event (e.g. mouseenter, click))'), f.text_area(:group_triggers_csv, :style => 'width: 100%', :class => 'groups-csv', :rows => 7) %> <% button_bar do %> <%= submit_button(:save, _('Save'), :cancel => {:controller => 'plugins', :action => 'index'}) %> diff --git a/plugins/site_tour/views/tour_actions.html.erb b/plugins/site_tour/views/tour_actions.html.erb index 61768d1..5ffeaa1 100644 --- a/plugins/site_tour/views/tour_actions.html.erb +++ b/plugins/site_tour/views/tour_actions.html.erb @@ -5,8 +5,13 @@ <% end %> -- libgit2 0.21.2