From e951d8458413f02ba613163df862d1a352ed3692 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Wed, 5 Mar 2008 15:41:54 +0000 Subject: [PATCH] Add a user preference to choose how comments/replies are displayed: in chronological or reverse chronological order (#589, #776). git-svn-id: http://redmine.rubyforge.org/svn/trunk@1197 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/issues_controller.rb | 2 ++ app/controllers/messages_controller.rb | 2 ++ app/controllers/news_controller.rb | 2 ++ app/models/journal.rb | 1 + app/models/user.rb | 4 ++++ app/models/user_preference.rb | 3 +++ app/views/issues/_history.rhtml | 6 ++---- app/views/messages/edit.rhtml | 2 +- app/views/messages/show.rhtml | 6 +++--- app/views/my/account.rhtml | 14 +++++++++----- app/views/news/show.rhtml | 9 +++++---- lang/bg.yml | 4 ++++ lang/cs.yml | 4 ++++ lang/de.yml | 4 ++++ lang/en.yml | 4 ++++ lang/es.yml | 4 ++++ lang/fi.yml | 4 ++++ lang/fr.yml | 4 ++++ lang/he.yml | 4 ++++ lang/it.yml | 4 ++++ lang/ja.yml | 4 ++++ lang/ko.yml | 4 ++++ lang/lt.yml | 4 ++++ lang/nl.yml | 4 ++++ lang/pl.yml | 4 ++++ lang/pt-br.yml | 4 ++++ lang/pt.yml | 4 ++++ lang/ro.yml | 4 ++++ lang/ru.yml | 4 ++++ lang/sr.yml | 4 ++++ lang/sv.yml | 4 ++++ lang/uk.yml | 4 ++++ lang/zh-tw.yml | 4 ++++ lang/zh.yml | 4 ++++ test/unit/user_test.rb | 8 ++++++++ 35 files changed, 134 insertions(+), 17 deletions(-) diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb index 4a44d09bc..263675040 100644 --- a/app/controllers/issues_controller.rb +++ b/app/controllers/issues_controller.rb @@ -92,6 +92,8 @@ class IssuesController < ApplicationController def show @custom_values = @project.custom_fields_for_issues(@issue.tracker).collect { |x| @issue.custom_values.find_by_custom_field_id(x.id) || CustomValue.new(:custom_field => x, :customized => @issue) } @journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_on ASC") + @journals.each_with_index {|j,i| j.indice = i+1} + @journals.reverse! if User.current.wants_comments_in_reverse_order? @allowed_statuses = @issue.new_statuses_allowed_to(User.current) @edit_allowed = User.current.allowed_to?(:edit_issues, @project) @activities = Enumeration::get_values('ACTI') diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 49f4ba77c..64a7fa1c9 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -29,6 +29,8 @@ class MessagesController < ApplicationController # Show a topic and its replies def show + @replies = @topic.children + @replies.reverse! if User.current.wants_comments_in_reverse_order? @reply = Message.new(:subject => "RE: #{@message.subject}") render :action => "show", :layout => false if request.xhr? end diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index 66ed61cf4..c9ba6b991 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -36,6 +36,8 @@ class NewsController < ApplicationController end def show + @comments = @news.comments + @comments.reverse! if User.current.wants_comments_in_reverse_order? end def new diff --git a/app/models/journal.rb b/app/models/journal.rb index d757ef90d..7c5e3d3bf 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -23,6 +23,7 @@ class Journal < ActiveRecord::Base belongs_to :user has_many :details, :class_name => "JournalDetail", :dependent => :delete_all + attr_accessor :indice acts_as_searchable :columns => 'notes', :include => :issue, diff --git a/app/models/user.rb b/app/models/user.rb index 22d66539d..2dd698f28 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -144,6 +144,10 @@ class User < ActiveRecord::Base self.pref.time_zone.nil? ? nil : TimeZone[self.pref.time_zone] end + def wants_comments_in_reverse_order? + self.pref[:comments_sorting] == 'desc' + end + # Return user's RSS key (a 40 chars long string), used to access feeds def rss_key token = self.rss_token || Token.create(:user => self, :action => 'feeds') diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb index 1ed9e0fd9..73e4a50c6 100644 --- a/app/models/user_preference.rb +++ b/app/models/user_preference.rb @@ -46,4 +46,7 @@ class UserPreference < ActiveRecord::Base self.others.store attr_name, value end end + + def comments_sorting; self[:comments_sorting] end + def comments_sorting=(order); self[:comments_sorting]=order end end diff --git a/app/views/issues/_history.rhtml b/app/views/issues/_history.rhtml index 7c1ee2113..373758874 100644 --- a/app/views/issues/_history.rhtml +++ b/app/views/issues/_history.rhtml @@ -1,8 +1,7 @@ -<% note_id = 1 %> <% for journal in journals %>
-

<%= link_to "##{note_id}", :anchor => "note-#{note_id}" %>
- <%= content_tag('a', '', :name => "note-#{note_id}")%> +

<%= link_to "##{journal.indice}", :anchor => "note-#{journal.indice}" %>
+ <%= content_tag('a', '', :name => "note-#{journal.indice}")%> <%= format_time(journal.created_on) %> - <%= journal.user.name %>

<%= render_notes(journal) unless journal.notes.blank? %>
- <% note_id += 1 %> <% end %> diff --git a/app/views/messages/edit.rhtml b/app/views/messages/edit.rhtml index 808b6ea27..dcc59a396 100644 --- a/app/views/messages/edit.rhtml +++ b/app/views/messages/edit.rhtml @@ -1,6 +1,6 @@

<%= link_to h(@board.name), :controller => 'boards', :action => 'show', :project_id => @project, :id => @board %> » <%=h @message.subject %>

<% form_for :message, @message, :url => {:action => 'edit'}, :html => {:multipart => true} do |f| %> - <%= render :partial => 'form', :locals => {:f => f} %> + <%= render :partial => 'form', :locals => {:f => f, :replying => !@message.parent.nil?} %> <%= submit_tag l(:button_save) %> <% end %> diff --git a/app/views/messages/show.rhtml b/app/views/messages/show.rhtml index 7d4c9989e..b9897cb40 100644 --- a/app/views/messages/show.rhtml +++ b/app/views/messages/show.rhtml @@ -15,11 +15,11 @@

<%= l(:label_reply_plural) %>

-<% @topic.children.each do |message| %> +<% @replies.each do |message| %> ">
- <%= link_to_if_authorized l(:button_edit), {:action => 'edit', :id => message}, :class => 'icon icon-edit' %> - <%= link_to_if_authorized l(:button_delete), {:action => 'destroy', :id => message}, :method => :post, :confirm => l(:text_are_you_sure), :class => 'icon icon-del' %> + <%= link_to_if_authorized image_tag('edit.png'), {:action => 'edit', :id => message}, :title => l(:button_edit) %> + <%= link_to_if_authorized image_tag('delete.png'), {:action => 'destroy', :id => message}, :method => :post, :confirm => l(:text_are_you_sure), :title => l(:button_delete) %>

<%=h message.subject %> - <%= authoring message.created_on, message.author %>

diff --git a/app/views/my/account.rhtml b/app/views/my/account.rhtml index 77568836d..20210c99a 100644 --- a/app/views/my/account.rhtml +++ b/app/views/my/account.rhtml @@ -15,11 +15,6 @@

<%= f.text_field :lastname, :required => true %>

<%= f.text_field :mail, :required => true %>

<%= f.select :language, lang_options_for_select %>

- -<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %> -

<%= pref_fields.select :time_zone, TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %>

-

<%= pref_fields.check_box :hide_mail %>

-<% end %>
<%= submit_tag l(:button_save) %> @@ -38,6 +33,15 @@ <% end %>

+ +

<%=l(:label_preferences)%>

+
+<% fields_for :pref, @user.pref, :builder => TabularFormBuilder, :lang => current_language do |pref_fields| %> +

<%= pref_fields.check_box :hide_mail %>

+

<%= pref_fields.select :time_zone, TimeZone.all.collect {|z| [ z.to_s, z.name ]}, :include_blank => true %>

+

<%= pref_fields.select :comments_sorting, [[l(:label_chronological_order), 'asc'], [l(:label_reverse_chronological_order), 'desc']] %>

+<% end %> +
<% end %> diff --git a/app/views/news/show.rhtml b/app/views/news/show.rhtml index cc9eed043..6de8aa86e 100644 --- a/app/views/news/show.rhtml +++ b/app/views/news/show.rhtml @@ -34,14 +34,15 @@

<%= l(:label_comment_plural) %>

-<% @news.comments.each do |comment| %> +<% @comments.each do |comment| %> <% next if comment.new_record? %> -

<%= authoring comment.created_on, comment.author %>

- <%= link_to_if_authorized l(:button_delete), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, :confirm => l(:text_are_you_sure), :method => :post, :class => 'icon icon-del' %> + <%= link_to_if_authorized image_tag('delete.png'), {:controller => 'news', :action => 'destroy_comment', :id => @news, :comment_id => comment}, + :confirm => l(:text_are_you_sure), :method => :post, :title => l(:button_delete) %>
+

<%= authoring comment.created_on, comment.author %>

<%= textilizable(comment.comments) %> -<% end if @news.comments_count > 0 %> +<% end if @comments.any? %>
<% if authorize_for 'news', 'add_comment' %> diff --git a/lang/bg.yml b/lang/bg.yml index a99a8888a..11e18b849 100644 --- a/lang/bg.yml +++ b/lang/bg.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/cs.yml b/lang/cs.yml index 5036b6b45..ccf93fb9c 100644 --- a/lang/cs.yml +++ b/lang/cs.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/de.yml b/lang/de.yml index 3d0db927c..bdbe549c2 100644 --- a/lang/de.yml +++ b/lang/de.yml @@ -609,3 +609,7 @@ enumeration_issue_priorities: Ticket-Prioritäten enumeration_doc_categories: Dokumentenkategorien enumeration_activities: Aktivitäten (Zeiterfassung) setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/en.yml b/lang/en.yml index a23d1b025..0445834fe 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -177,6 +177,7 @@ field_column_names: Columns field_time_zone: Time zone field_searchable: Searchable field_default_value: Default value +field_comments_sorting: Afficher les commentaires setting_app_title: Application title setting_app_subtitle: Application subtitle @@ -501,6 +502,9 @@ label_ldap_authentication: LDAP authentication label_downloads_abbr: D/L label_optional_description: Optional description label_add_another_file: Add another file +label_preferences: Preferences +label_chronological_order: In chronological order +label_reverse_chronological_order: In reverse chronological order button_login: Login button_submit: Submit diff --git a/lang/es.yml b/lang/es.yml index 66238934d..d137054d9 100644 --- a/lang/es.yml +++ b/lang/es.yml @@ -611,3 +611,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/fi.yml b/lang/fi.yml index d85629e1f..b2ad672f4 100644 --- a/lang/fi.yml +++ b/lang/fi.yml @@ -612,3 +612,7 @@ text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' label_on: 'on' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/fr.yml b/lang/fr.yml index 85e699c3c..b992ceff2 100644 --- a/lang/fr.yml +++ b/lang/fr.yml @@ -177,6 +177,7 @@ field_column_names: Colonnes field_time_zone: Fuseau horaire field_searchable: Utilisé pour les recherches field_default_value: Valeur par défaut +field_comments_sorting: Afficher les commentaires setting_app_title: Titre de l'application setting_app_subtitle: Sous-titre de l'application @@ -501,6 +502,9 @@ label_ldap_authentication: Authentification LDAP label_downloads_abbr: D/L label_optional_description: Description facultative label_add_another_file: Ajouter un autre fichier +label_preferences: Préférences +label_chronological_order: Dans l'ordre chronologique +label_reverse_chronological_order: Dans l'ordre chronologique inverse button_login: Connexion button_submit: Soumettre diff --git a/lang/he.yml b/lang/he.yml index fe31e860b..66a493bbb 100644 --- a/lang/he.yml +++ b/lang/he.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/it.yml b/lang/it.yml index f207c2e19..c47729c50 100644 --- a/lang/it.yml +++ b/lang/it.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/ja.yml b/lang/ja.yml index f00fc4d81..37392dd7e 100644 --- a/lang/ja.yml +++ b/lang/ja.yml @@ -609,3 +609,7 @@ label_optional_description: Optional description text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/ko.yml b/lang/ko.yml index cf25e23ef..5685d063a 100644 --- a/lang/ko.yml +++ b/lang/ko.yml @@ -608,3 +608,7 @@ label_last_month: last month text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/lt.yml b/lang/lt.yml index b50120764..c783f5768 100644 --- a/lang/lt.yml +++ b/lang/lt.yml @@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/nl.yml b/lang/nl.yml index 2d8a6aa00..6d650456d 100644 --- a/lang/nl.yml +++ b/lang/nl.yml @@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/pl.yml b/lang/pl.yml index 57559aedb..bf8f3f1ba 100644 --- a/lang/pl.yml +++ b/lang/pl.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/pt-br.yml b/lang/pt-br.yml index 35f490b83..9ddd6f94b 100644 --- a/lang/pt-br.yml +++ b/lang/pt-br.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/pt.yml b/lang/pt.yml index c07364f72..63972d042 100644 --- a/lang/pt.yml +++ b/lang/pt.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/ro.yml b/lang/ro.yml index 68de767a9..9d374af53 100644 --- a/lang/ro.yml +++ b/lang/ro.yml @@ -608,3 +608,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/ru.yml b/lang/ru.yml index 39a30fd3b..d5b67f964 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -612,3 +612,7 @@ text_assign_time_entries_to_project: Прикрепить зарегистрир text_destroy_time_entries: Удалить зарегистрированное время text_reassign_time_entries: 'Перенести зарегистрированное время на следующую задачу:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/sr.yml b/lang/sr.yml index 5e693c09e..edef5f7f5 100644 --- a/lang/sr.yml +++ b/lang/sr.yml @@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/sv.yml b/lang/sv.yml index 1b4698f35..f3940759b 100644 --- a/lang/sv.yml +++ b/lang/sv.yml @@ -609,3 +609,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/uk.yml b/lang/uk.yml index c26454189..d8e4a7a66 100644 --- a/lang/uk.yml +++ b/lang/uk.yml @@ -610,3 +610,7 @@ text_assign_time_entries_to_project: Assign reported hours to the project text_destroy_time_entries: Delete reported hours text_reassign_time_entries: 'Reassign reported hours to this issue:' setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/zh-tw.yml b/lang/zh-tw.yml index 5d5040811..eb1a5e305 100644 --- a/lang/zh-tw.yml +++ b/lang/zh-tw.yml @@ -609,3 +609,7 @@ enumeration_issue_priorities: 項目優先權 enumeration_doc_categories: 文件分類 enumeration_activities: 活動 (time tracking) setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/lang/zh.yml b/lang/zh.yml index 8646d47cd..e7d790938 100644 --- a/lang/zh.yml +++ b/lang/zh.yml @@ -609,3 +609,7 @@ enumeration_issue_priorities: 问题优先级 enumeration_doc_categories: 文档类别 enumeration_activities: 活动(时间跟踪) setting_activity_days_default: Days displayed on project activity +label_chronological_order: In chronological order +field_comments_sorting: Afficher les commentaires +label_reverse_chronological_order: In reverse chronological order +label_preferences: Preferences diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index 845a34afd..3209f261a 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -144,4 +144,12 @@ class UserTest < Test::Unit::TestCase @jsmith.reload assert !@jsmith.projects.first.recipients.include?(@jsmith.mail) end + + def test_comments_sorting_preference + assert !@jsmith.wants_comments_in_reverse_order? + @jsmith.pref.comments_sorting = 'asc' + assert !@jsmith.wants_comments_in_reverse_order? + @jsmith.pref.comments_sorting = 'desc' + assert @jsmith.wants_comments_in_reverse_order? + end end -- 2.39.5