Commit f476a761f710c3c201c94dff939fdd9ec351d30c
Committed by
Antonio Terceiro
1 parent
8bac0258
Exists in
master
and in
23 other branches
More user-friendly icon selector for block of links
(ActionItem1428)
Showing
12 changed files
with
133 additions
and
23 deletions
Show diff stats
app/models/link_list_block.rb
| ... | ... | @@ -73,10 +73,9 @@ class LinkListBlock < Block |
| 73 | 73 | true |
| 74 | 74 | end |
| 75 | 75 | |
| 76 | - def icons_options(selected = nil) | |
| 76 | + def icons_options | |
| 77 | 77 | ICONS.map do |i| |
| 78 | - select = "selected='1'" if i[0] == selected | |
| 79 | - "<option class='icon-#{i[0]}' value='#{i[0]}' #{select}>#{gettext(i[1])}</option>" | |
| 78 | + "<span class=\"icon-#{i[0]}\" onclick=\"changeIcon(this, '#{i[0]}')\"></span>" | |
| 80 | 79 | end |
| 81 | 80 | end |
| 82 | 81 | ... | ... |
| ... | ... | @@ -0,0 +1,7 @@ |
| 1 | +<div class='icon' style='width:16px; height:16px;' onclick="hideOthersIconSelector(this); showIconSelector(this)"> | |
| 2 | + <%= hidden_field_tag 'block[links][][icon]', icon %> | |
| 3 | + <span class='icon-<%= icon %>' style='display:block; width:16px; height:16px;'></span> | |
| 4 | + <div class="icon-selector" style='display:none;'> | |
| 5 | + <%= @block.icons_options %> | |
| 6 | + </div> | |
| 7 | +</div> | ... | ... |
app/views/box_organizer/_link_list_block.rhtml
| 1 | 1 | <strong><%= _('Links') %></strong> |
| 2 | 2 | <div id='edit-link-list-block'> |
| 3 | 3 | <table id='links' class='noborder'> |
| 4 | - <tr><th><%= _('Icon') %></th><th><%= _('Name') %></th><th><%= _('Address') %></th></tr> | |
| 4 | + <tr><th></th><th><%= _('Name') %></th><th><%= _('Address') %></th></tr> | |
| 5 | 5 | <% for link in @block.links do %> |
| 6 | 6 | <tr> |
| 7 | - <td><%= select_tag 'block[links][][icon]', @block.icons_options(link['icon']) %></td> | |
| 8 | - <td><%= text_field_tag 'block[links][][name]', link[:name], :maxlength => 20 %></td> | |
| 9 | - <td class='cel-address'><%= text_field_tag 'block[links][][address]', link[:address] %></td> | |
| 7 | + <td> | |
| 8 | + <%= icon_selector(link['icon']) %> | |
| 9 | + </td> | |
| 10 | + <td><%= text_field_tag 'block[links][][name]', link[:name], :class => 'link-name', :maxlength => 20 %></td> | |
| 11 | + <td class='cel-address'><%= text_field_tag 'block[links][][address]', link[:address], :class => 'link-address' %></td> | |
| 10 | 12 | </tr> |
| 11 | 13 | <% end %> |
| 12 | 14 | </table> |
| 13 | 15 | </div> |
| 14 | 16 | |
| 15 | 17 | <%= link_to_function(_('New link'), nil, :class => 'button icon-add with-text') do |page| |
| 16 | - page.insert_html :bottom, 'links', content_tag('tr', content_tag('td', select_tag('block[links][][icon]', @block.icons_options)) + content_tag('td',text_field_tag('block[links][][name]', '', :maxlength => 20)) + content_tag('td',text_field_tag('block[links][][address]', nil, :class => 'cel-address'))) + | |
| 18 | + page.insert_html :bottom, 'links', content_tag('tr', | |
| 19 | + content_tag('td', icon_selector('ok')) + | |
| 20 | + content_tag('td', text_field_tag('block[links][][name]', '', :maxlength => 20)) + | |
| 21 | + content_tag('td', text_field_tag('block[links][][address]', nil, :class => 'cel-address')) | |
| 22 | + ) + | |
| 17 | 23 | javascript_tag("$('edit-link-list-block').scrollTop = $('edit-link-list-block').scrollHeight") |
| 18 | 24 | end %> | ... | ... |
config/cucumber.yml
| ... | ... | @@ -0,0 +1,22 @@ |
| 1 | +Feature: edit_block_of_links | |
| 2 | + As a profile owner | |
| 3 | + I want to edit a block of links | |
| 4 | + | |
| 5 | + Background: | |
| 6 | + Given I am on the homepage | |
| 7 | + And the following users | |
| 8 | + | login | name | | |
| 9 | + | eddievedder | Eddie Vedder | | |
| 10 | + And the following blocks | |
| 11 | + | owner | type | | |
| 12 | + | eddievedder | LinkListBlock | | |
| 13 | + And I am logged in as "eddievedder" | |
| 14 | + | |
| 15 | + @selenium | |
| 16 | + Scenario: show the icon selector | |
| 17 | + And I follow "Edit sideboxes" | |
| 18 | + Given I follow "Edit" within ".link-list-block" | |
| 19 | + And I follow "New link" | |
| 20 | + And the ".icon-selector" should not be visible | |
| 21 | + When I click ".icon" | |
| 22 | + Then the ".icon-selector" should be visible | ... | ... |
| ... | ... | @@ -0,0 +1,21 @@ |
| 1 | +require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths")) | |
| 2 | + | |
| 3 | +def string_to_element_locator(selector) | |
| 4 | + if selector.gsub!(/^\./, '') | |
| 5 | + "css=[class='#{selector}']" | |
| 6 | + else | |
| 7 | + raise "I can't find '#{selector}'!" | |
| 8 | + end | |
| 9 | +end | |
| 10 | + | |
| 11 | +Then /^the "([^\"]*)" should be visible$/ do |selector| | |
| 12 | + selenium.is_visible(string_to_element_locator(selector)).should be_true | |
| 13 | +end | |
| 14 | + | |
| 15 | +Then /^the "([^\"]*)" should not be visible$/ do |selector| | |
| 16 | + selenium.is_visible(string_to_element_locator(selector)).should be_false | |
| 17 | +end | |
| 18 | + | |
| 19 | +When /^I click "([^\"]*)"$/ do |selector| | |
| 20 | + selenium.click(string_to_element_locator(selector)) | |
| 21 | +end | ... | ... |
features/support/paths.rb
| ... | ... | @@ -18,10 +18,11 @@ module NavigationHelpers |
| 18 | 18 | article_id = Person[$2].articles.find_by_slug($1.to_slug).id |
| 19 | 19 | "/myprofile/#{$2}/cms/edit/#{article_id}" |
| 20 | 20 | |
| 21 | - when /edit BlogArchivesBlock of (.+)/ | |
| 22 | - owner = Profile[$1] | |
| 23 | - block = BlogArchivesBlock.find(:all).select{|i| i.owner == owner}.first | |
| 24 | - "/myprofile/#{$1}/profile_design/edit/#{block.id}" | |
| 21 | + when /edit (.*Block) of (.+)/ | |
| 22 | + owner = Profile[$2] | |
| 23 | + klass = $1.constantize | |
| 24 | + block = klass.find(:all).select{|i| i.owner == owner}.first | |
| 25 | + "/myprofile/#{$2}/profile_design/edit/#{block.id}" | |
| 25 | 26 | |
| 26 | 27 | when /^(.*)'s homepage$/ |
| 27 | 28 | '/%s' % Profile.find_by_name($1).identifier | ... | ... |
lib/tasks/cucumber.rake
| ... | ... | @@ -23,6 +23,12 @@ begin |
| 23 | 23 | t.cucumber_opts = "--color --tags @wip:2 --wip --format #{ENV['CUCUMBER_FORMAT'] || 'progress'}" |
| 24 | 24 | end |
| 25 | 25 | |
| 26 | + Cucumber::Rake::Task.new({:selenium => 'db:test:prepare'}, 'Run features with selenium') do |t| | |
| 27 | + t.binary = vendored_cucumber_binary | |
| 28 | + t.fork = true # You may get faster startup if you set this to false | |
| 29 | + t.cucumber_opts = "--color -p selenium --format #{ENV['CUCUMBER_FORMAT'] || 'pretty'}" | |
| 30 | + end | |
| 31 | + | |
| 26 | 32 | desc 'Run all features' |
| 27 | 33 | task :all => [:ok, :wip] |
| 28 | 34 | end | ... | ... |
public/javascripts/application.js
| ... | ... | @@ -78,3 +78,24 @@ function disable_button(button) { |
| 78 | 78 | button.disable(); |
| 79 | 79 | button.addClassName("disabled"); |
| 80 | 80 | } |
| 81 | + | |
| 82 | +/* ICON SELECTOR - LinkListBlock */ | |
| 83 | + | |
| 84 | +function showIconSelector(main_div) { | |
| 85 | + iconSelector = jQuery(main_div).children('.icon-selector')[0]; | |
| 86 | + jQuery(iconSelector).toggle(); | |
| 87 | +} | |
| 88 | + | |
| 89 | +function changeIcon(iconSelected, iconName) { | |
| 90 | + iconSelector = iconSelected.parentNode; | |
| 91 | + setTimeout('iconSelector.style.display = "none"', 100); | |
| 92 | + main_div = iconSelector.parentNode; | |
| 93 | + span = main_div.getElementsByTagName('span')[0]; | |
| 94 | + span.className = iconSelected.className; | |
| 95 | + iconInput = main_div.getElementsByTagName('input')[0]; | |
| 96 | + iconInput.value = iconName; | |
| 97 | +} | |
| 98 | + | |
| 99 | +function hideOthersIconSelector(current_div) { | |
| 100 | + jQuery('.icon-selector').not(jQuery(current_div).children('.icon-selector')).hide(); | |
| 101 | +} | ... | ... |
public/stylesheets/application.css
| ... | ... | @@ -1513,7 +1513,6 @@ input.disabled { |
| 1513 | 1513 | text-decoration: none; |
| 1514 | 1514 | } |
| 1515 | 1515 | |
| 1516 | - | |
| 1517 | 1516 | /* ==> blocks/link-list-block.css <<= */ |
| 1518 | 1517 | |
| 1519 | 1518 | #edit-link-list-block { |
| ... | ... | @@ -1527,7 +1526,7 @@ input.disabled { |
| 1527 | 1526 | } |
| 1528 | 1527 | |
| 1529 | 1528 | #edit-link-list-block table .cel-address { |
| 1530 | - width: 180px; | |
| 1529 | + width: 220px; | |
| 1531 | 1530 | } |
| 1532 | 1531 | |
| 1533 | 1532 | #edit-link-list-block table .cel-address input { |
| ... | ... | @@ -1557,15 +1556,36 @@ input.disabled { |
| 1557 | 1556 | padding-left: 23px; |
| 1558 | 1557 | } |
| 1559 | 1558 | |
| 1560 | -#edit-link-list-block select { | |
| 1561 | - width: 80px; | |
| 1559 | +.icon-selector { | |
| 1560 | + background: #EEE; | |
| 1561 | + border: 1px solid #555; | |
| 1562 | + padding: 10px; | |
| 1563 | + width: 110px; | |
| 1564 | + height: 110px; | |
| 1565 | + position: absolute; | |
| 1566 | + z-index: 100; | |
| 1567 | +} | |
| 1568 | +.icon { | |
| 1569 | + border:1px solid #EEE; | |
| 1570 | +} | |
| 1571 | +.icon:hover { | |
| 1572 | + border: 1px solid black; | |
| 1573 | + cursor: pointer; | |
| 1574 | + background-color: #555; | |
| 1562 | 1575 | } |
| 1563 | 1576 | |
| 1564 | -#edit-link-list-block option { | |
| 1565 | - background-repeat: no-repeat; | |
| 1566 | - padding-left: 23px; | |
| 1567 | - margin: 2px; | |
| 1568 | - height: 16px; | |
| 1577 | +.icon-selector span { | |
| 1578 | + height:16px; | |
| 1579 | + width:16px; | |
| 1580 | + border:1px solid #555; | |
| 1581 | + margin:2px; | |
| 1582 | + display: block; | |
| 1583 | + float: left; | |
| 1584 | +} | |
| 1585 | + | |
| 1586 | +.icon-selector span:hover { | |
| 1587 | + border: 1px solid black; | |
| 1588 | + background-color: #555; | |
| 1569 | 1589 | } |
| 1570 | 1590 | |
| 1571 | 1591 | /* ==> blocks/profile-list-block.css <<= */ | ... | ... |
test/unit/link_list_block_test.rb
| ... | ... | @@ -43,7 +43,7 @@ class LinkListBlockTest < ActiveSupport::TestCase |
| 43 | 43 | should 'display options for icons' do |
| 44 | 44 | l = LinkListBlock.new |
| 45 | 45 | l.icons_options.each do |option| |
| 46 | - assert_match(/<option class='icon-.+' value='.+' (selected='1')?>[^<>]+<\/option>/, option) | |
| 46 | + assert_match(/<span class=\"icon-.+\" onclick=\"changeIcon\(this, '.+'\)\"><\/span>/, option) | |
| 47 | 47 | end |
| 48 | 48 | end |
| 49 | 49 | ... | ... |