From 26ef9da02b7ef7550712317ad050e5a2f31744c6 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Tue, 28 Sep 2010 21:09:06 +0000 Subject: [PATCH] Changed the notifications to use a hierarchy UI git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4222 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/helpers/settings_helper.rb | 10 +++++++ app/views/settings/_notifications.rhtml | 12 +++++---- lib/redmine/notifiable.rb | 33 +++++++++++++----------- public/javascripts/application.js | 8 +++++- public/stylesheets/application.css | 1 + test/unit/lib/redmine/notifiable_test.rb | 13 +++------- 6 files changed, 46 insertions(+), 31 deletions(-) diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb index e57b75fcc8..6dc33a8e13 100644 --- a/app/helpers/settings_helper.rb +++ b/app/helpers/settings_helper.rb @@ -71,4 +71,14 @@ module SettingsHelper label = options.delete(:label) label != false ? content_tag("label", l(label || "setting_#{setting}")) : '' end + + # Renders a notification field for a Redmine::Notifiable option + def notification_field(notifiable) + return content_tag(:label, + check_box_tag('settings[notified_events][]', + notifiable.name, + Setting.notified_events.include?(notifiable.name)) + + l_or_humanize(notifiable.name, :prefix => 'label_'), + :class => notifiable.parent.present? ? "parent" : '') + end end diff --git a/app/views/settings/_notifications.rhtml b/app/views/settings/_notifications.rhtml index 2c62cdf9f4..bf2b9d8715 100644 --- a/app/views/settings/_notifications.rhtml +++ b/app/views/settings/_notifications.rhtml @@ -12,11 +12,13 @@ -
<%=l(:text_select_mail_notifications)%> - <%= setting_multiselect(:notified_events, - @notifiables.collect {|notifiable| [l_or_humanize(notifiable, :prefix => 'label_'), notifiable]}, :label => false) %> - -

<%= check_all_links('notified_events') %>

+
<%=l(:text_select_mail_notifications)%> +<%= hidden_field_tag 'settings[notified_events][]', '' %> +<% @notifiables.each do |notifiable| %> +<%= notification_field notifiable %> +
+<% end %> +

<%= check_all_links('notified_events') %>

<%= l(:setting_emails_footer) %> diff --git a/lib/redmine/notifiable.rb b/lib/redmine/notifiable.rb index 84f3ccd6c6..71d1ba5017 100644 --- a/lib/redmine/notifiable.rb +++ b/lib/redmine/notifiable.rb @@ -1,22 +1,25 @@ module Redmine - class Notifiable - CoreNotifications = [ - 'issue_added', - 'issue_updated', - 'issue_note_added', - 'issue_status_updated', - 'issue_priority_updated', - 'news_added', - 'document_added', - 'file_added', - 'message_posted', - 'wiki_content_added', - 'wiki_content_updated' - ] + class Notifiable < Struct.new(:name, :parent) + def to_s + name + end + # TODO: Plugin API for adding a new notification? def self.all - CoreNotifications + notifications = [] + notifications << Notifiable.new('issue_added') + notifications << Notifiable.new('issue_updated') + notifications << Notifiable.new('issue_note_added', 'issue_updated') + notifications << Notifiable.new('issue_status_updated', 'issue_updated') + notifications << Notifiable.new('issue_priority_updated', 'issue_updated') + notifications << Notifiable.new('news_added') + notifications << Notifiable.new('document_added') + notifications << Notifiable.new('file_added') + notifications << Notifiable.new('message_posted') + notifications << Notifiable.new('wiki_content_added') + notifications << Notifiable.new('wiki_content_updated') + notifications end end end diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 989065b3af..8f6c518281 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -17,6 +17,13 @@ function toggleCheckboxesBySelector(selector) { for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; } } +function setCheckboxesBySelector(checked, selector) { + var boxes = $$(selector); + boxes.each(function(ele) { + ele.checked = checked; + }); +} + function showAndScrollTo(id, focus) { Element.show(id); if (focus!=null) { Form.Element.focus(focus); } @@ -56,7 +63,6 @@ function addFileField() { dLabel.addClassName('inline'); // Pulls the languge value used for Optional Description dLabel.update($('attachment_description_label_content').innerHTML) - p = document.getElementById("attachments_fields"); p.appendChild(document.createElement("br")); p.appendChild(f); diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 233d94e454..b286ee23c3 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -419,6 +419,7 @@ input#time_entry_comments { width: 90%;} .tabular.settings textarea { width: 99%; } fieldset.settings label { display: block; } +.parent { padding-left: 20px; } .required {color: #bb0000;} .summary {font-style: italic;} diff --git a/test/unit/lib/redmine/notifiable_test.rb b/test/unit/lib/redmine/notifiable_test.rb index acfe6be5fd..494d16b952 100644 --- a/test/unit/lib/redmine/notifiable_test.rb +++ b/test/unit/lib/redmine/notifiable_test.rb @@ -21,18 +21,11 @@ class Redmine::NotifiableTest < ActiveSupport::TestCase def setup end - def test_included_core_notifications - assert_equal 11, Redmine::Notifiable::CoreNotifications.length - Redmine::Notifiable::CoreNotifications.length + def test_all + assert_equal 11, Redmine::Notifiable.all.length %w(issue_added issue_updated issue_note_added issue_status_updated issue_priority_updated news_added document_added file_added message_posted wiki_content_added wiki_content_updated).each do |notifiable| - assert Redmine::Notifiable::CoreNotifications.include?(notifiable), "missing #{notifiable}" - end - end - - def test_all_should_include_all_of_the_core_notifications - Redmine::Notifiable::CoreNotifications.each do |notifiable| - assert Redmine::Notifiable.all.include?(notifiable), "missing #{notifiable} in #all" + assert Redmine::Notifiable.all.collect(&:name).include?(notifiable), "missing #{notifiable}" end end end