From b6723f5b2226fe65579160f2806ea450b12a0568 Mon Sep 17 00:00:00 2001 From: Ryan Wyllie Date: Fri, 19 Aug 2016 02:51:30 +0000 Subject: [PATCH] MDL-55595 message: fix message preferences for multiple processors --- lang/en/message.php | 1 - .../src/message_notification_preference.js | 66 +++++++++++++++++++ message/amd/src/message_preferences.js | 63 +++++++++++++----- .../templates/message_preferences.mustache | 32 ++++----- 4 files changed, 130 insertions(+), 32 deletions(-) create mode 100644 message/amd/src/message_notification_preference.js diff --git a/lang/en/message.php b/lang/en/message.php index 3909eaf696b..bcf6b875e3d 100644 --- a/lang/en/message.php +++ b/lang/en/message.php @@ -122,7 +122,6 @@ $string['notificationwindow'] = 'Notification window'; $string['notificationpreferences'] = 'Notification preferences'; $string['notificationimage'] = 'Notification image'; $string['notifications'] = 'Notifications'; -$string['notificationsnewmessages'] = 'Notifications of new messages'; $string['off'] = 'Off'; $string['offline'] = 'Offline'; $string['offlinecontacts'] = 'Offline contacts ({$a})'; diff --git a/message/amd/src/message_notification_preference.js b/message/amd/src/message_notification_preference.js new file mode 100644 index 00000000000..e817d9c920a --- /dev/null +++ b/message/amd/src/message_notification_preference.js @@ -0,0 +1,66 @@ +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see . + +/** + * Controls the preference for an individual notification type on the + * message preference page. + * + * @module core_message/message_notification_preference + * @class message_notification_preference + * @package message + * @copyright 2016 Ryan Wyllie + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * @since 3.2 + */ +define(['jquery', 'core/ajax', 'core/notification', 'core_message/notification_preference'], + function($, ajax, notification, NotificationPreference) { + + var SELECTORS = { + PREFERENCE_KEY: '[data-preference-key]', + }; + + /** + * Constructor for the Preference. + * + * @param element jQuery object root element of the preference + * @param int the current user id + * @return object Preference + */ + var MessageNotificationPreference = function(element, userId) { + NotificationPreference.call(this, element, userId); + }; + + /** + * Clone the parent prototype. + */ + MessageNotificationPreference.prototype = Object.create(NotificationPreference.prototype); + + /** + * Set constructor. + */ + MessageNotificationPreference.prototype.constructor = NotificationPreference; + + /** + * Get the unique prefix key that identifies this user preference. + * + * @method getPreferenceKey + * @return string + */ + MessageNotificationPreference.prototype.getPreferenceKey = function() { + return this.root.find(SELECTORS.PREFERENCE_KEY).attr('data-preference-key'); + }; + + return MessageNotificationPreference; +}); diff --git a/message/amd/src/message_preferences.js b/message/amd/src/message_preferences.js index bf8e43b36fa..1eee287add1 100644 --- a/message/amd/src/message_preferences.js +++ b/message/amd/src/message_preferences.js @@ -16,18 +16,19 @@ /** * Controls the message preference page. * - * @module core_message/notification_preference - * @class notification_preference + * @module core_message/message_preferences + * @class message_preferences * @package message * @copyright 2016 Ryan Wyllie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @since 3.2 */ define(['jquery', 'core/ajax', 'core/notification', - 'core_message/preferences_notifications_list_controller', 'core/custom_interaction_events'], - function($, Ajax, Notification, ListController, CustomEvents) { + 'core_message/message_notification_preference', 'core/custom_interaction_events'], + function($, Ajax, Notification, MessageNotificationPreference, CustomEvents) { var SELECTORS = { + PREFERENCE: '[data-state]', PREFERENCES_CONTAINER: '[data-region="preferences-container"]', BLOCK_NON_CONTACTS: '[data-region="block-non-contacts-container"] [data-block-non-contacts]', BLOCK_NON_CONTACTS_CONTAINER: '[data-region="block-non-contacts-container"]', @@ -36,19 +37,23 @@ define(['jquery', 'core/ajax', 'core/notification', /** * Constructor for the MessagePreferences. * + * @param {jQuery object} element The root element for the message preferences * @return object MessagePreferences */ - var MessagePreferences = function() { - new ListController($(SELECTORS.PREFERENCES_CONTAINER)); - var blockContactsElement = $(SELECTORS.BLOCK_NON_CONTACTS); + var MessagePreferences = function(element) { + this.root = $(element); - CustomEvents.define(blockContactsElement, [ - CustomEvents.events.activate - ]); + this.registerEventListeners(); + }; - blockContactsElement.on(CustomEvents.events.activate, function(e) { - this.saveBlockNonContactsStatus(); - }.bind(this)); + /** + * Check if the preferences have been disabled on this page. + * + * @method preferencesDisabled + * @return bool + */ + MessagePreferences.prototype.preferencesDisabled = function() { + return this.root.find(SELECTORS.PREFERENCES_CONTAINER).hasClass('disabled'); }; /** @@ -58,8 +63,8 @@ define(['jquery', 'core/ajax', 'core/notification', * @method saveBlockNonContactsStatus */ MessagePreferences.prototype.saveBlockNonContactsStatus = function() { - var checkbox = $(SELECTORS.BLOCK_NON_CONTACTS); - var container = $(SELECTORS.BLOCK_NON_CONTACTS_CONTAINER); + var checkbox = this.root.find(SELECTORS.BLOCK_NON_CONTACTS); + var container = this.root.find(SELECTORS.BLOCK_NON_CONTACTS_CONTAINER); var ischecked = checkbox.prop('checked'); if (container.hasClass('loading')) { @@ -89,5 +94,33 @@ define(['jquery', 'core/ajax', 'core/notification', }); }; + /** + * Create all of the event listeners for the message preferences page. + * + * @method registerEventListeners + */ + MessagePreferences.prototype.registerEventListeners = function() { + CustomEvents.define(this.root, [ + CustomEvents.events.activate + ]); + + this.root.on(CustomEvents.events.activate, SELECTORS.BLOCK_NON_CONTACTS, function(e) { + this.saveBlockNonContactsStatus(); + }.bind(this)); + + this.root.on('change', function(e) { + if (!this.preferencesDisabled()) { + var preferencesContainer = $(e.target).closest(SELECTORS.PREFERENCES_CONTAINER); + var preferenceElement = $(e.target).closest(SELECTORS.PREFERENCE); + var messagePreference = new MessageNotificationPreference(preferencesContainer); + + preferenceElement.addClass('loading'); + messagePreference.save().always(function() { + preferenceElement.removeClass('loading'); + }); + } + }.bind(this)); + }; + return MessagePreferences; }); diff --git a/message/templates/message_preferences.mustache b/message/templates/message_preferences.mustache index 89cf6933f0e..66b82a12a7a 100644 --- a/message/templates/message_preferences.mustache +++ b/message/templates/message_preferences.mustache @@ -15,9 +15,9 @@ along with Moodle. If not, see . }} {{! - @template core_message/preferences_notifications_list + @template core_message/message_preferences - The list of notifications for the message preferences page + The message preferences page Classes required for JS: * None @@ -75,7 +75,7 @@ ] } }} -
+

{{#str}} messagepreferences, message {{/str}}

- +
{{#components}} - - - - {{#notifications}} + + + + {{#processors}} @@ -177,6 +177,6 @@ require(['jquery', 'theme_bootstrapbase/bootstrap', 'core_message/message_prefer function($, Bootstrap, MessagePreferences) { $('[data-toggle="tooltip"]').tooltip(); - new MessagePreferences(); + new MessagePreferences($('[data-region="preferences-page-container"]')); }); {{/js}}
{{#str}} notificationsnewmessages, message {{/str}} -
-
-
{{#str}} online, message {{/str}}
-
{{#str}} offline, message {{/str}}
-
-
-
{{displayname}} +
+
+
{{#str}} online, message {{/str}}
+
{{#str}} offline, message {{/str}}
+
+
+
{{displayname}}