]> source.dussan.org Git - redmine.git/commitdiff
Display links to Atom feeds (closes #496, #750).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 5 Mar 2008 08:25:22 +0000 (08:25 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 5 Mar 2008 08:25:22 +0000 (08:25 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1185 e93f8b46-1217-0410-a6f0-8f06a7374b81

17 files changed:
app/controllers/issues_controller.rb
app/views/issues/_list.rhtml
app/views/issues/changes.rxml
app/views/issues/index.rhtml
app/views/issues/show.rhtml
app/views/news/index.rhtml
app/views/projects/activity.rhtml
app/views/projects/gantt.rhtml
app/views/timelog/details.rhtml
app/views/wiki/show.rhtml
app/views/wiki/special_date_index.rhtml
app/views/wiki/special_page_index.rhtml
lang/en.yml
lang/fr.yml
public/images/feed.png
public/stylesheets/application.css
test/functional/issues_controller_test.rb

index 53627db928b08c7784faf4ea757606332858e5d6..4a44d09bca28169b84955c344a6dea1643724be5 100644 (file)
@@ -49,7 +49,13 @@ class IssuesController < ApplicationController
     sort_update
     retrieve_query
     if @query.valid?
-      limit = %w(pdf csv).include?(params[:format]) ? Setting.issues_export_limit.to_i : per_page_option
+      limit = per_page_option
+      respond_to do |format|
+        format.html { }
+        format.atom { }
+        format.csv  { limit = Setting.issues_export_limit.to_i }
+        format.pdf  { limit = Setting.issues_export_limit.to_i }
+      end
       @issue_count = Issue.count(:include => [:status, :project], :conditions => @query.statement)
       @issue_pages = Paginator.new self, @issue_count, limit, params['page']
       @issues = Issue.find :all, :order => sort_clause,
@@ -74,7 +80,7 @@ class IssuesController < ApplicationController
     sort_update
     retrieve_query
     if @query.valid?
-      @changes = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
+      @journals = Journal.find :all, :include => [ :details, :user, {:issue => [:project, :author, :tracker, :status]} ],
                                      :conditions => @query.statement,
                                      :limit => 25,
                                      :order => "#{Journal.table_name}.created_on DESC"
@@ -92,6 +98,7 @@ class IssuesController < ApplicationController
     @priorities = Enumeration::get_values('IPRI')
     respond_to do |format|
       format.html { render :template => 'issues/show.rhtml' }
+      format.atom { render :action => 'changes', :layout => false, :content_type => 'application/atom+xml' }
       format.pdf  { send_data(render(:template => 'issues/show.rfpdf', :layout => false), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
     end
   end
index 343f7173d932168059d48b7bf53963131ae33103..91390ac67b2031130d08aa64d2046cec35c6ce38 100644 (file)
@@ -11,7 +11,7 @@
        <tbody>
        <% issues.each do |issue| -%>
        <tr id="issue-<%= issue.id %>" class="issue hascontextmenu <%= cycle('odd', 'even') %> <%= "status-#{issue.status.position} priority-#{issue.priority.position}" %>">
-           <td class="checkbox"><%= check_box_tag("ids[]", issue.id, false) %></td>
+           <td class="checkbox"><%= check_box_tag("ids[]", issue.id, false, :id => nil) %></td>
                <td><%= link_to issue.id, :controller => 'issues', :action => 'show', :id => issue %></td>
         <% query.columns.each do |column| %><%= content_tag 'td', column_content(column, issue), :class => column.name %><% end %>
        </tr>
index f1aa5d2066659abdc9ccc175d5a0f422bf9e7f68..239d2d6a31cbdacf605bedfe452f255166f48233 100644 (file)
@@ -1,12 +1,12 @@
 xml.instruct!
 xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
   xml.title   @title
-  xml.link    "rel" => "self", "href" => url_for(:controller => 'feeds', :action => 'history', :format => 'atom', :only_path => false)
-  xml.link    "rel" => "alternate", "href" => url_for(:controller => 'welcome', :only_path => false)
+  xml.link    "rel" => "self", "href" => url_for(:format => 'atom', :key => User.current.rss_key, :only_path => false)
+  xml.link    "rel" => "alternate", "href" => home_url(:only_path => false)
   xml.id      url_for(:controller => 'welcome', :only_path => false)
-  xml.updated((@changes.first ? @changes.first.event_datetime : Time.now).xmlschema)
+  xml.updated((@journals.first ? @journals.first.event_datetime : Time.now).xmlschema)
   xml.author  { xml.name "#{Setting.app_title}" }
-  @changes.each do |change|
+  @journals.each do |change|
     issue = change.issue
     xml.entry do
       xml.title   "#{issue.project.name} - #{issue.tracker.name} ##{issue.id}: #{issue.subject}"
index 4d1f4f176165b89db33584d9ce66488dea7ef725..d3408fa99287f47d6521e2883510ade270e3d226 100644 (file)
 <p class="nodata"><%= l(:label_no_data) %></p>
 <% else %>
 <%= render :partial => 'issues/list', :locals => {:issues => @issues, :query => @query} %>
-<div class="contextual">
-<%= l(:label_export_to) %>
-<%= link_to 'CSV', {:format => 'csv'}, :class => 'icon icon-csv' %>,
-<%= link_to 'PDF', {:format => 'pdf'}, :class => 'icon icon-pdf' %>
-</div>
 <p class="pagination"><%= pagination_links_full @issue_pages, @issue_count %></p>
+
+<p class="other-formats">
+<%= l(:label_export_to) %>
+<span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
+<span><%= link_to 'CSV', {:format => 'csv'}, :class => 'csv' %></span>
+<span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
+</p>
 <% end %>
 <% end %>
 
index e3999bd8efd5ee382aceed2188b4f90a16066b07..c5efe4f25b81adac311a1bfb7a88031a3d225ea0 100644 (file)
@@ -95,13 +95,18 @@ end %>
   </div>
 <% end %>
 
-<div class="contextual">
-<%= l(:label_export_to) %><%= link_to 'PDF', {:format => 'pdf'}, :class => 'icon icon-pdf' %>
-</div>
-&nbsp;
+<p class="other-formats">
+<%= l(:label_export_to) %>
+<span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
+<span><%= link_to 'PDF', {:format => 'pdf'}, :class => 'pdf' %></span>
+</p>
 
 <% html_title "#{@issue.tracker.name} ##{@issue.id}: #{@issue.subject}" %>
 
 <% content_for :sidebar do %>
     <%= render :partial => 'issues/sidebar' %>
 <% end %>
+
+<% content_for :header_tags do %>
+    <%= auto_discovery_link_tag(:atom, {:format => 'atom', :key => User.current.rss_key}, :title => "#{@issue.project} - #{@issue.tracker} ##{@issue.id}: #{@issue.subject}") %>
+<% end %>
index 369eaf1b13d48a7f55b247b3b7686811c46cff4c..87db8a5f7eebfe6f05c9b3853776220aab5f9011 100644 (file)
 <% end %>
 <p class="pagination"><%= pagination_links_full @news_pages %></p>
 
+<p class="other-formats">
+<%= l(:label_export_to) %>
+<span><%= link_to 'Atom', {:format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
+</p>
+
 <% content_for :header_tags do %>
   <%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :page => nil, :key => User.current.rss_key})) %>
 <% end %>
index dce333f6120fc8937648da87c3352b656fcca604..aca08fd6f5583d51dcb70027abb4534afeab63a2 100644 (file)
 <% next_params = params.clone.update :year => (@month==12 ? @year+1 : @year), :month =>(@month==12 ? 1 : @month+1) %>
 <%= link_to_remote ((@month==12 ? "#{month_name(1)} #{@year+1}" : "#{month_name(@month+1)}") + ' &#187;'), 
                     {:update => "content", :url => next_params}, {:href => url_for(next_params)} %>
-&nbsp;
 </div>
-<br />
+&nbsp;
+<p class="other-formats">
+    <%= l(:label_export_to) %>
+    <%= link_to 'Atom', params.merge(:format => :atom, :key => User.current.rss_key).delete_if{|k,v|k=="commit"}, :class => 'feed' %>
+</p>
 
 <% content_for :header_tags do %>
-<%= auto_discovery_link_tag(:atom, params.merge({:format => 'atom', :year => nil, :month => nil, :key => User.current.rss_key})) %>
+<%= auto_discovery_link_tag(:atom, params.merge(:format => 'atom', :year => nil, :month => nil, :key => User.current.rss_key).delete_if{|k,v|k=="commit"}) %>
 <% end %>
 
 <% content_for :sidebar do %>
index 2979bce2b951e4ad2f999890038afe1d3eb0cb3f..05bd4b9bce97e0febd2ae4913b97067e1433b099 100644 (file)
@@ -223,10 +223,11 @@ if Date.today >= @date_from and Date.today <= @date_to %>
 </tr>
 </table>
 
-<div class="contextual"><%= l(:label_export_to) %>
-<%= link_to 'PDF', {:zoom => @zoom, :year => @year_from, :month => @month_from, :months => @months, :tracker_ids => @selected_tracker_ids, :with_subprojects => params[:with_subprojects], :format => 'pdf'}, :class => 'icon icon-pdf' %>
-<%= link_to 'PNG', {:zoom => @zoom, :year => @year_from, :month => @month_from, :months => @months, :tracker_ids => @selected_tracker_ids, :with_subprojects => params[:with_subprojects], :format => 'png'}, :class => 'icon icon-image' if respond_to?('gantt_image') %>
-</div>
+<p class="other-formats">
+<%= l(:label_export_to) %>
+<span><%= link_to 'PDF', {:zoom => @zoom, :year => @year_from, :month => @month_from, :months => @months, :tracker_ids => @selected_tracker_ids, :with_subprojects => params[:with_subprojects], :format => 'pdf'}, :class => 'pdf' %></span>
+<%= content_tag('span', link_to('PNG', {:zoom => @zoom, :year => @year_from, :month => @month_from, :months => @months, :tracker_ids => @selected_tracker_ids, :with_subprojects => params[:with_subprojects], :format => 'png'}, :class => 'image')) if respond_to?('gantt_image') %>
+</p>
 
 <% content_for :sidebar do %>
     <h3><%= l(:label_gantt) %></h3>
index 802090b7aa12c531aad40a96317312d2b09e7db5..cba1597d1b13907f1491a56a6a866d5b9c9afa34 100644 (file)
 \r
 <% unless @entries.empty? %>\r
 <%= render :partial => 'list', :locals => { :entries => @entries }%>\r
-<div class="contextual">\r
-    <%= l(:label_export_to) %>\r
-    <%= link_to 'CSV', params.merge(:format => 'csv'), :class => 'icon icon-csv' %>\r
-</div>\r
 <p class="pagination"><%= pagination_links_full @entry_pages, @entry_count %></p>\r
+\r
+<p class="other-formats">\r
+<%= l(:label_export_to) %>\r
+<span><%= link_to 'CSV', params.merge(:format => 'csv'), :class => 'csv' %></span>\r
+</p>\r
 <% end %>\r
 \r
 <% content_for :header_tags do %>\r
index 77d82884f1d7260acae64999a3a0469169bdb584..e4413d09069d0cf63f48a29de3c1cee15e95e71d 100644 (file)
 <% end %>
 <% end %>
 
-<div class="contextual">
+<p class="other-formats">
 <%= l(:label_export_to) %>
-<%= link_to 'HTML', {:page => @page.title, :export => 'html', :version => @content.version}, :class => 'icon icon-html' %>,
-<%= link_to 'TXT', {:page => @page.title, :export => 'txt', :version => @content.version}, :class => 'icon icon-txt' %>
-</div>
-&nbsp;
+<span><%= link_to 'HTML', {:page => @page.title, :export => 'html', :version => @content.version}, :class => 'html' %></span>
+<span><%= link_to 'TXT', {:page => @page.title, :export => 'txt', :version => @content.version}, :class => 'text' %></span>
+</p>
 
 <% content_for :header_tags do %>
   <%= stylesheet_link_tag 'scm' %>
index ac68f809e77b8e577bbb942e3a8077a1da57f792..6717ebc8598b80321c928e1d8d08334fd60125a6 100644 (file)
   <%= render :partial => 'sidebar' %>
 <% end %>
 
-<div class="contextual">
 <% unless @pages.empty? %>
-<%= l(:label_export_to) %> <%= link_to 'HTML', {:action => 'special', :page => 'export'}, :class => 'icon icon-html' %>
+<p class="other-formats">
+<%= l(:label_export_to) %>
+<span><%= link_to 'Atom', {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
+<span><%= link_to 'HTML', {:action => 'special', :page => 'export'}, :class => 'html' %></span>
+</p>
+<% end %>
+
+<% content_for :header_tags do %>
+<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key) %>
 <% end %>
-</div>
-&nbsp;
index db6629de8fca94be02e7361233a9e031c7c2d2d0..f21cc34236fa8d97a127ac1062a03e94eb6b70d3 100644 (file)
   <%= render :partial => 'sidebar' %>
 <% end %>
 
-<div class="contextual">
 <% unless @pages.empty? %>
-<%= l(:label_export_to) %> <%= link_to 'HTML', {:action => 'special', :page => 'export'}, :class => 'icon icon-html' %>
+<p class="other-formats">
+<%= l(:label_export_to) %>
+<span><%= link_to 'Atom', {:controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key}, :class => 'feed' %></span>
+<span><%= link_to 'HTML', {:action => 'special', :page => 'export'} %></span>
+</p>
+<% end %>
+
+<% content_for :header_tags do %>
+<%= auto_discovery_link_tag(:atom, :controller => 'projects', :action => 'activity', :id => @project, :show_wiki_pages => 1, :format => 'atom', :key => User.current.rss_key) %>
 <% end %>
-</div>
-&nbsp;
index 7ed2c87754a7d18a02876b7fecb1444a70daa9b7..a5da5a855386552aa7534d1a7597c297ae21752e 100644 (file)
@@ -320,7 +320,7 @@ label_version: Version
 label_version_new: New version
 label_version_plural: Versions
 label_confirmation: Confirmation
-label_export_to: Export to
+label_export_to: 'Also available in:'
 label_read: Read...
 label_public_projects: Public projects
 label_open_issues: open
index accd5c1bfc2dd4b4315fabe3d31ead154bf5eb70..30c9f6ccac74849a53d498ad3a41fc5bc863175f 100644 (file)
@@ -320,7 +320,7 @@ label_version: Version
 label_version_new: Nouvelle version
 label_version_plural: Versions
 label_confirmation: Confirmation
-label_export_to: Exporter en
+label_export_to: 'Formats disponibles:'
 label_read: Lire...
 label_public_projects: Projets publics
 label_open_issues: ouvert
index 51dc9778e79854fbccaddc52c62d2d2fadf15677..900188ae068198fb18263442abbeb106dbbec341 100644 (file)
Binary files a/public/images/feed.png and b/public/images/feed.png differ
index 83393748221b29b917542a26bcb8a18d8dd946da..cd875c7f7013b1ac0545cb7721ddb2ab2cf152c3 100644 (file)
@@ -80,7 +80,7 @@ a img{ border: 0; }
 /***** Tables *****/
 table.list { border: 1px solid #e4e4e4;  border-collapse: collapse; width: 100%; margin-bottom: 4px; }
 table.list th {  background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
-table.list td { overflow: hidden; text-overflow: ellipsis; vertical-align: top;}
+table.list td { overflow: hidden; vertical-align: top;}
 table.list td.id { width: 2%; text-align: center;}
 table.list td.checkbox { width: 15px; padding: 0px;}
 
@@ -228,6 +228,11 @@ div.attachments p { margin:4px 0 2px 0; }
 div.attachments img { vertical-align: middle; }
 div.attachments span.author { font-size: 0.9em; color: #888; }
 
+p.other-formats { text-align: right; font-size:0.9em; color: #666; }
+.other-formats span + span:before { content: "| "; }
+
+a.feed { background: url(../images/feed.png) no-repeat 1px 50%; padding: 2px 0px 3px 16px; }
+
 /***** Flash & error messages ****/
 #errorExplanation, div.flash, .nodata {
     padding: 4px 4px 4px 30px;
@@ -275,7 +280,6 @@ padding:0.6em;
 z-index:100;
 filter:alpha(opacity=50);
 opacity: 0.5;
--khtml-opacity: 0.5;
 }
 
 html>body #ajax-indicator { position: fixed; }
@@ -518,11 +522,6 @@ vertical-align: middle;
 .icon-move { background-image: url(../images/move.png); }
 .icon-save { background-image: url(../images/save.png); }
 .icon-cancel { background-image: url(../images/cancel.png); }
-.icon-pdf { background-image: url(../images/pdf.png); }
-.icon-csv { background-image: url(../images/csv.png); }
-.icon-html { background-image: url(../images/html.png); }
-.icon-image { background-image: url(../images/image.png); }
-.icon-txt { background-image: url(../images/txt.png); }
 .icon-file { background-image: url(../images/file.png); }
 .icon-folder { background-image: url(../images/folder.png); }
 .open .icon-folder { background-image: url(../images/folder_open.png); }
@@ -537,7 +536,6 @@ vertical-align: middle;
 .icon-attachment  { background-image: url(../images/attachment.png); }
 .icon-index  { background-image: url(../images/index.png); }
 .icon-history  { background-image: url(../images/history.png); }
-.icon-feed  { background-image: url(../images/feed.png); }
 .icon-time  { background-image: url(../images/time.png); }
 .icon-stats  { background-image: url(../images/stats.png); }
 .icon-warning  { background-image: url(../images/warning.png); }
index da8118668330505197b7c99ee08b9a11faff8ec5..4f644d522d5fb3ba55f0dc469ec2c97a649ad8c7 100644 (file)
@@ -96,7 +96,7 @@ class IssuesControllerTest < Test::Unit::TestCase
   def test_changes
     get :changes, :project_id => 1
     assert_response :success
-    assert_not_nil assigns(:changes)
+    assert_not_nil assigns(:journals)
     assert_equal 'application/atom+xml', @response.content_type
   end