From 2fa431ef546e6da73f7082aafe4d39da241fb449 Mon Sep 17 00:00:00 2001 From: Reinier Balt Date: Sat, 27 Nov 2010 17:12:09 +0100 Subject: [PATCH] finish migration of the feeds page --- app/controllers/feedlist_controller.rb | 14 +- app/helpers/feedlist_helper.rb | 20 ++- app/views/feedlist/_feed_for_context.html.erb | 31 ++++- app/views/feedlist/_feed_for_project.html.erb | 28 +++- app/views/feedlist/_legend.rhtml | 14 ++ app/views/feedlist/get_feeds_for_context.erb | 1 + app/views/feedlist/get_feeds_for_project.erb | 1 + app/views/feedlist/index.html.erb | 122 +++--------------- config/locales/en.yml | 2 +- features/feedlist.feature | 48 +++++++ features/step_definitions/context_steps.rb | 7 +- features/step_definitions/feedlist_steps.rb | 31 +++++ features/step_definitions/project_steps.rb | 10 ++ public/javascripts/application.js | 4 +- 14 files changed, 205 insertions(+), 128 deletions(-) create mode 100644 app/views/feedlist/_legend.rhtml create mode 100644 app/views/feedlist/get_feeds_for_context.erb create mode 100644 app/views/feedlist/get_feeds_for_project.erb create mode 100644 features/feedlist.feature create mode 100644 features/step_definitions/feedlist_steps.rb diff --git a/app/controllers/feedlist_controller.rb b/app/controllers/feedlist_controller.rb index 4c2924e9..ffaa02ab 100644 --- a/app/controllers/feedlist_controller.rb +++ b/app/controllers/feedlist_controller.rb @@ -26,13 +26,19 @@ class FeedlistController < ApplicationController end def get_feeds_for_context - context = current_user.contexts.find params[:context_id] - render :partial => 'feed_for_context', :locals => { :context => context } + @context = current_user.contexts.find params[:context_id] + respond_to do |format| + format.html { render :text => "This page should not be called directly"} + format.js + end end def get_feeds_for_project - project = current_user.projects.find params[:project_id] - render :partial => 'feed_for_project', :locals => { :project => project } + @project = current_user.projects.find params[:project_id] + respond_to do |format| + format.html { render :text => "This page should not be called directly"} + format.js + end end end diff --git a/app/helpers/feedlist_helper.rb b/app/helpers/feedlist_helper.rb index bfcf7ea8..6b3a557b 100644 --- a/app/helpers/feedlist_helper.rb +++ b/app/helpers/feedlist_helper.rb @@ -15,7 +15,25 @@ module FeedlistHelper linkoptions = merge_hashes( {:format => 'ics'}, user_token_hash, options) link_to('iCal', linkoptions, :title => "iCal feed" ) end - + + def feed_links(feeds, link_options, title) + space = " " + html = "" + html << rss_formatted_link(link_options)+space if feeds.include?(:rss) + html << text_formatted_link(link_options)+space if feeds.include?(:txt) + html << ical_formatted_link(link_options)+space if feeds.include?(:ical) + html << title + return html + end + + def all_feed_links_for_project(project) + feed_links([:rss, :txt, :ical], { :controller=> 'todos', :action => 'index', :project_id => project.to_param }, content_tag(:strong, project.name)) + end + + def all_feed_links_for_context(context) + feed_links([:rss, :txt, :ical], { :controller=> 'todos', :action => 'index', :context_id => context.to_param }, content_tag(:strong, context.name)) + end + protected def merge_hashes(*hashes) diff --git a/app/views/feedlist/_feed_for_context.html.erb b/app/views/feedlist/_feed_for_context.html.erb index 1ef269c1..33e8b6d9 100644 --- a/app/views/feedlist/_feed_for_context.html.erb +++ b/app/views/feedlist/_feed_for_context.html.erb @@ -1,6 +1,25 @@ -
  • - <%= rss_formatted_link({ :controller=> 'todos', :action => 'index', :context_id => context.to_param }) %> - <%= text_formatted_link({ :controller=> 'todos', :action => 'index', :context_id => context.to_param }) %> - <%= ical_formatted_link({ :controller=> 'todos', :action => 'index', :context_id => context.to_param }) %> - <%=h context.name %> -
  • +<% context = @active_contexts.empty? ? @hidden_contexts.first : @active_contexts.first +-%> + +

    <%= t('feedlist.context_centric_actions') %>:

    +<% if @active_contexts.empty? && @hidden_contexts.empty? -%> + +<% else -%> + +<% end -%> + + diff --git a/app/views/feedlist/_feed_for_project.html.erb b/app/views/feedlist/_feed_for_project.html.erb index 54d5e2b3..53d80462 100644 --- a/app/views/feedlist/_feed_for_project.html.erb +++ b/app/views/feedlist/_feed_for_project.html.erb @@ -1,6 +1,22 @@ -
  • - <%= rss_formatted_link({ :controller=> 'todos', :action => 'index', :project_id => project.to_param }) %> - <%= text_formatted_link({ :controller=> 'todos', :action => 'index', :project_id => project.to_param }) %> - <%= ical_formatted_link({ :controller=> 'todos', :action => 'index', :project_id => project.to_param }) %> - <%=h project.name %> -
  • \ No newline at end of file +<% project = @active_projects.empty? ? @hidden_projects.first : @active_projects.first -%> +

    <%= t('feedlist.project_centric') %>:

    + \ No newline at end of file diff --git a/app/views/feedlist/_legend.rhtml b/app/views/feedlist/_legend.rhtml new file mode 100644 index 00000000..bc7e202f --- /dev/null +++ b/app/views/feedlist/_legend.rhtml @@ -0,0 +1,14 @@ +
    +

    <%= t('feedlist.legend') %>

    +
    +
    <%= image_tag("feed-icon.png", :size => "16X16", :border => 0)%>
    +
    <%= t('feedlist.rss_feed') %>
    + +
    TXT
    +
    <%= t('feedlist.plain_text_feed') %>
    + +
    iCal
    +
    <%= t('feedlist.ical_feed') %>
    +
    +

    <%= t('feedlist.notice_incomplete_only') %>

    +
    \ No newline at end of file diff --git a/app/views/feedlist/get_feeds_for_context.erb b/app/views/feedlist/get_feeds_for_context.erb new file mode 100644 index 00000000..f67ca8fd --- /dev/null +++ b/app/views/feedlist/get_feeds_for_context.erb @@ -0,0 +1 @@ +
  • <%= all_feed_links_for_context(@context) %>
  • \ No newline at end of file diff --git a/app/views/feedlist/get_feeds_for_project.erb b/app/views/feedlist/get_feeds_for_project.erb new file mode 100644 index 00000000..98834bdb --- /dev/null +++ b/app/views/feedlist/get_feeds_for_project.erb @@ -0,0 +1 @@ +
  • <%= all_feed_links_for_project(@project) %>
  • \ No newline at end of file diff --git a/app/views/feedlist/index.html.erb b/app/views/feedlist/index.html.erb index d1d761f8..2812f5d6 100644 --- a/app/views/feedlist/index.html.erb +++ b/app/views/feedlist/index.html.erb @@ -1,115 +1,23 @@
    -
    -

    <%= t('feedlist.legend') %>

    -
    -
    <%= image_tag("feed-icon.png", :size => "16X16", :border => 0)%>
    <%= t('feedlist.rss_feed') %>
    -
    TXT
    <%= t('feedlist.plain_text_feed') %>
    -
    iCal
    <%= t('feedlist.ical_feed') %>
    -
    -

    <%= t('feedlist.notice_incomplete_only') %>

    -
    + <%= render :partial => 'legend' %>
      -
    • - <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :limit => 15 }) %> - <%= text_formatted_link({ :controller => 'todos', :action => 'index', :limit => 15 }) %> - <%= ical_formatted_link({ :controller => 'todos', :action => 'index', :limit => 15 }) %> - <%= t('feedlist.last_fixed_number', :number=>15) %> -
    • -
    • - <%= rss_formatted_link( { :controller => 'todos', :action => 'index' } ) %> - <%= text_formatted_link( { :controller => 'todos', :action => 'index' } ) %> - <%= ical_formatted_link( { :controller => 'todos', :action => 'index' } ) %> - <%= t('feedlist.all_actions') %> -
    • -
    • - <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :due => 0 }) %> - <%= text_formatted_link({ :controller => 'todos', :action => 'index', :due => 0 }) %> - <%= ical_formatted_link({ :controller => 'todos', :action => 'index', :due => 0 }) %> - <%= t('feedlist.actions_due_today') %> -
    • -
    • - <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :due => 6 }) %> - <%= text_formatted_link({ :controller => 'todos', :action => 'index', :due => 6 }) %> - <%= ical_formatted_link({ :controller => 'todos', :action => 'index', :due => 6 }) %> - <%= t('feedlist.actions_due_next_week') %> -
    • -
    • - <%= rss_formatted_link({ :controller => 'todos', :action => 'index', :done => 7 }) %> - <%= text_formatted_link({ :controller => 'todos', :action => 'index', :done => 7 }) %> - <%= t('feedlist.actions_completed_last_week') %> -
    • -
    • - <%= rss_formatted_link({:controller => 'contexts', :action => 'index'}) %> - <%= text_formatted_link({:controller => 'contexts', :action => 'index'}) %> - <%= t('feedlist.all_contexts') %> -
    • -
    • - <%= rss_formatted_link({:controller => 'projects', :action => 'index'}) %> - <%= text_formatted_link({:controller => 'projects', :action => 'index'}) %> - <%= t('feedlist.all_projects') %> -
    • -
    • - <%= rss_formatted_link({:controller => 'projects', :action => 'index', :only_active_with_no_next_actions => true}) %> - <%= text_formatted_link({:controller => 'projects', :action => 'index', :only_active_with_no_next_actions => true}) %> - <%= t('feedlist.active_projects_wo_next') %> -
    • -
    • - <%= rss_formatted_link({:controller => 'todos', :action => 'index', :tag => 'starred'}) %> - <%= text_formatted_link({:controller => 'todos', :action => 'index', :tag => 'starred'}) %> - <%= t('feedlist.active_starred_actions') %> -
    • -
    • - <%= text_formatted_link({:controller => 'projects', :action => 'index', :projects_and_actions => true}) %> - <%= t('feedlist.projects_and_actions') %> -
    • -
    • <%= t('feedlist.context_centric_actions') %>:

      - <% if @active_contexts.empty? && @hidden_contexts.empty? -%> -
      • <%= t('feedlist.context_needed') %>
      - <% else -%> -
        -
      • <%= t('common.numbered_step', :number => 1) %> - <%= t('feedlist.choose_context') %>: - -
      • -
      • <%= t('common.numbered_step', :number => 2) %> - <%= t('feedlist.select_feed_for_context') %> -
        -
        - <%= render :partial => 'feed_for_context', :locals => { :context => @active_contexts.empty? ? @hidden_contexts.first : @active_contexts.first } %> -
        -
        -
      • -
      - <% end -%> -
    • -
    • <%= t('feedlist.project_centric') %>:

      - <% if @active_projects.empty? && @hidden_projects.empty? -%> -
      • <%= t('feedlist.project_needed') %>
      - <% else -%> -
        -
      • <%= t('common.numbered_step', :number => 1) %> - <%= t('feedlist.choose_project') %>: - -
      • -
      • <%= t('common.numbered_step', :number => 2) %> - <%= t('feedlist.select_feed_for_project') %> -
        -
        - <%= render :partial => 'feed_for_project', :locals => { :project => @active_projects.empty? ? @hidden_projects.first : @active_projects.first } %> -
        -
        -
      • -
      - <% end -%> -
    • +
    • <%= feed_links([:rss, :txt, :ical], { :controller => 'todos', :action => 'index', :limit => 15 }, t('feedlist.last_fixed_number', :number=>15)) %>
    • +
    • <%= feed_links([:rss, :txt, :ical], { :controller => 'todos', :action => 'index' }, t('feedlist.all_actions')) %>
    • +
    • <%= feed_links([:rss, :txt, :ical], { :controller => 'todos', :action => 'index', :due => 0 }, t('feedlist.actions_due_today')) %>
    • +
    • <%= feed_links([:rss, :txt, :ical], { :controller => 'todos', :action => 'index', :due => 6 }, t('feedlist.actions_due_next_week')) %>
    • +
    • <%= feed_links([:rss, :txt], { :controller => 'todos', :action => 'index', :done => 7 }, t('feedlist.actions_completed_last_week')) %>
    • +
    • <%= feed_links([:rss, :txt], { :controller => 'contexts', :action => 'index' }, t('feedlist.all_contexts')) %>
    • +
    • <%= feed_links([:rss, :txt], { :controller => 'projects', :action => 'index' }, t('feedlist.all_projects')) %>
    • +
    • <%= feed_links([:rss, :txt], { :controller => 'projects', :action => 'index', :only_active_with_no_next_actions => true }, t('feedlist.active_projects_wo_next')) %>
    • +
    • <%= feed_links([:rss, :txt], { :controller => 'todos', :action => 'index', :tag => 'starred' }, t('feedlist.active_starred_actions')) %>
    • +
    • <%= feed_links([:txt], {:controller => 'projects', :action => 'index', :projects_and_actions => true}, t('feedlist.projects_and_actions')) %>
    • +
    • <%= render :partial => 'feed_for_context' %>
    • +
    • <%= render :partial => 'feed_for_project' %>
    -
    +
    <%= render :file => "sidebar/sidebar.html.erb" %> -
    + diff --git a/config/locales/en.yml b/config/locales/en.yml index 2dabe1f4..fed656cd 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -90,7 +90,7 @@ en: rss_feed: "RSS Feed" plain_text_feed: "Plain Text Feed" ical_feed: "iCal feed" - notice_incomplete_only: "Note: All feeds show only actions that have not been marked as done." + notice_incomplete_only: "Note: All feeds show only actions that have not been marked as done, unless stated otherwise." last_fixed_number: "Last {{number}} actions" all_actions: "All actions" actions_due_today: "Actions due today or earlier" diff --git a/features/feedlist.feature b/features/feedlist.feature new file mode 100644 index 00000000..f1f1b810 --- /dev/null +++ b/features/feedlist.feature @@ -0,0 +1,48 @@ +Feature: Get all sorts of lists from Tracks + In order to get reports on todos managed by Tracks + As a Tracks user + I want to be be able to select a feed + + Background: + Given the following user record + | login | password | is_admin | + | testuser | secret | false | + And I have logged in as "testuser" with password "secret" + And I have the following contexts: + | context | + | @pc | + | @home | + | @shops | + | @boss | + And I have the following projects: + | project_name | + | Test feedlist | + | Get release out | + + Scenario: I cannot see context scripts when I do not have a context + Given I have no contexts + When I go to the feeds page + Then I should see a message that you need a context to get feeds for contexts + + Scenario: I cannot see proejct scripts when I do not have a project + Given I have no projects + When I go to the feeds page + Then I should see a message that you need a project to get feeds for projects + + Scenario: I can see scripts when I have one or more contexts + When I go to the feeds page + Then I should see feeds for projects + And I should see "Test feedlist" as the selected project + And I should see feeds for contexts + And I should see "@pc" as the selected context + + @selenium @wip + Scenario Outline: I can select the item for getting feeds for that item + When I go to the feeds page + And I select "" from "" + Then I should see feeds for "" in list of "" + + Examples: + | item | item-list | item-type | + | @boss | feed-contexts | context | + | Get release out | feed-projects | project | diff --git a/features/step_definitions/context_steps.rb b/features/step_definitions/context_steps.rb index 35f5a35b..c43f3bd3 100644 --- a/features/step_definitions/context_steps.rb +++ b/features/step_definitions/context_steps.rb @@ -10,7 +10,7 @@ Given /^there exists an active context called "([^"]*)" for user "([^"]*)"$/ do end Given /^there exists a context called "([^"]*)" for user "([^"]*)"$/ do |context_name, login| - Given "there exists an active context called \"#{context_name}\" for user \"#{login}\"" + Given "there exists an active context called \"#{context_name}\" for user \"#{login}\"" end Given /^there exists a hidden context called "([^"]*)" for user "([^"]*)"$/ do |context_name, login| @@ -75,3 +75,8 @@ end Then /^he should see that a context named "([^\"]*)" is not present$/ do |context_name| Then "I should not see \"#{context_name} (\"" end + +Then /^I should see feeds for "([^"]*)" in list of "([^"]*)"$/ do |name, list_type| + xpath= "//div[@id='feeds-for-#{list_type}']//strong" + name.should == response.selenium.get_text("xpath=#{xpath}") +end diff --git a/features/step_definitions/feedlist_steps.rb b/features/step_definitions/feedlist_steps.rb new file mode 100644 index 00000000..90de4122 --- /dev/null +++ b/features/step_definitions/feedlist_steps.rb @@ -0,0 +1,31 @@ +Then /^I should see a message that you need a context to get feeds for contexts$/ do + Then "I should see \"There need to be at least one context before you can request a feed\"" +end + +Then /^I should see a message that you need a project to get feeds for projects$/ do + Then "I should see \"There need to be at least one project before you can request a feed\"" +end + +Then /^I should see feeds for projects$/ do + within 'select[id="feed-projects"]' do |scope| + scope.should have_selector("option[value=\"#{@current_user.projects.first.id}\"]") + end +end + +Then /^I should see feeds for contexts$/ do + within 'select[id="feed-contexts"]' do |scope| + scope.should have_selector("option[value=\"#{@current_user.contexts.first.id}\"]") + end +end + +Then /^I should see "([^"]*)" as the selected project$/ do |project_name| + within 'select[id="feed-projects"]' do |scope| + scope.should have_selector("option[selected=\"selected\"]", :content => project_name) + end +end + +Then /^I should see "([^"]*)" as the selected context$/ do |context_name| + within 'select[id="feed-contexts"]' do |scope| + scope.should have_selector("option[selected=\"selected\"]", :content => context_name) + end +end diff --git a/features/step_definitions/project_steps.rb b/features/step_definitions/project_steps.rb index 5df89c2e..9882d5ba 100644 --- a/features/step_definitions/project_steps.rb +++ b/features/step_definitions/project_steps.rb @@ -24,6 +24,16 @@ Given /^I have a project called "([^"]*)"$/ do |project_name| Given "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\"" end +Given /^I have the following projects:$/ do |table| + table.hashes.each do |project| + Given 'I have a project called "'+project[:project_name]+'"' + end +end + +Given /^I have no projects$/ do + Project.delete_all +end + When /^I visit the "([^\"]*)" project$/ do |project_name| @project = Project.find_by_name(project_name) @project.should_not be_nil diff --git a/public/javascripts/application.js b/public/javascripts/application.js index c3f985ea..9bd497db 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -491,10 +491,10 @@ var FeedsPage = { FeedsPage.get_script_for_project("#feeds-for-project", "get_feeds_for_project", this.value ); }); }, - get_script_for_context: function(element, getter, param){ + get_script_for_context: function(element, getter, context){ generic_get_script_for_list(element, "feedlist/"+getter, "context_id="+context); }, - get_script_for_project: function(element, getter, param){ + get_script_for_project: function(element, getter, project){ generic_get_script_for_list(element, "feedlist/"+getter, "project_id="+project); } }