MDL-66035 message: Restore missing message preferences files
authorJwalit Shah <jwalitshah@catalyst-au.net>
Fri, 27 Mar 2020 01:27:17 +0000 (12:27 +1100)
committerJwalit Shah <jwalitshah@catalyst-au.net>
Sun, 26 Apr 2020 23:48:41 +0000 (09:48 +1000)
message/amd/build/message_preferences.min.js [new file with mode: 0644]
message/amd/build/message_preferences.min.js.map [new file with mode: 0644]
message/amd/src/message_preferences.js [new file with mode: 0644]
message/templates/message_preferences.mustache [new file with mode: 0644]
message/templates/message_preferences_component.mustache [new file with mode: 0644]
message/templates/message_preferences_notification_processor.mustache [new file with mode: 0644]
message/tests/behat/message_preferences.feature [new file with mode: 0644]

diff --git a/message/amd/build/message_preferences.min.js b/message/amd/build/message_preferences.min.js
new file mode 100644 (file)
index 0000000..3378a0d
Binary files /dev/null and b/message/amd/build/message_preferences.min.js differ
diff --git a/message/amd/build/message_preferences.min.js.map b/message/amd/build/message_preferences.min.js.map
new file mode 100644 (file)
index 0000000..a83818b
Binary files /dev/null and b/message/amd/build/message_preferences.min.js.map differ
diff --git a/message/amd/src/message_preferences.js b/message/amd/src/message_preferences.js
new file mode 100644 (file)
index 0000000..c5944b6
--- /dev/null
@@ -0,0 +1,125 @@
+// 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 <http://www.gnu.org/licenses/>.
+
+/**
+ * Controls the message preference page.
+ *
+ * @module     core_message/message_preferences
+ * @class      message_preferences
+ * @package    message
+ * @copyright  2016 Ryan Wyllie <ryan@moodle.com>
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+define(['jquery', 'core/ajax', 'core/notification',
+        '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"]',
+        CONTACTABLE_PRIVACY_CONTAINER: '[data-region="privacy-setting-container"]',
+    };
+
+    /**
+     * Constructor for the MessagePreferences.
+     *
+     * @param {object} element The root element for the message preferences
+     */
+    var MessagePreferences = function(element) {
+        this.root = $(element);
+        this.userId = this.root.find(SELECTORS.PREFERENCES_CONTAINER).attr('data-user-id');
+
+        this.registerEventListeners();
+    };
+
+    /**
+     * 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');
+    };
+
+    /**
+     * Update the contactable privacy user preference in the DOM and
+     * send a request to update on the server.
+     *
+     * @return {Promise}
+     * @method saveContactablePrivacySetting
+     */
+    MessagePreferences.prototype.saveContactablePrivacySetting = function() {
+        var container = this.root.find(SELECTORS.CONTACTABLE_PRIVACY_CONTAINER);
+        var value = $("input[type='radio']:checked").val();
+
+        if (container.hasClass('loading')) {
+            return $.Deferred().resolve();
+        }
+
+        container.addClass('loading');
+
+        var request = {
+            methodname: 'core_user_update_user_preferences',
+            args: {
+                userid: this.userId,
+                preferences: [
+                    {
+                        type: container.attr('data-preference-key'),
+                        value: value,
+                    }
+                ]
+            }
+        };
+
+        return Ajax.call([request])[0]
+            .fail(Notification.exception)
+            .always(function() {
+                container.removeClass('loading');
+            });
+    };
+
+    /**
+     * 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('change', function(e) {
+            // Add listener for privacy setting radio buttons change.
+            if (e.target.name == 'message_blocknoncontacts') {
+                this.saveContactablePrivacySetting();
+            } else {
+                // Add listener for processor preferences.
+                if (!this.preferencesDisabled()) {
+                    var preferencesContainer = $(e.target).closest(SELECTORS.PREFERENCES_CONTAINER);
+                    var preferenceElement = $(e.target).closest(SELECTORS.PREFERENCE);
+                    var messagePreference = new MessageNotificationPreference(preferencesContainer, this.userId);
+
+                    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
new file mode 100644 (file)
index 0000000..ebe1c40
--- /dev/null
@@ -0,0 +1,119 @@
+{{!
+    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 <http://www.gnu.org/licenses/>.
+}}
+{{!
+    @template core_message/message_preferences
+
+    The message preferences page
+
+    Classes required for JS:
+    * None
+
+    Data attibutes required for JS:
+    * All data attributes are required
+
+    Context variables required for this template:
+    * userid The logged in user id
+    * disableall If the user has disabled notifications
+    * components The list of notification components
+    * privacychoices The choice options for the contactable privacy setting
+
+    Example context (json):
+    {
+        "userid": 1,
+        "disableall": 0,
+        "components": [
+            {
+                "notifications": [
+                    {
+                        "displayname": "Notices about minor problems",
+                        "preferencekey": "message_provider_moodle_notices",
+                        "onlinehelphtml": "<p>some help HTML</p>",
+                        "offlinehelphtml": "<p>some help HTML</p>",
+                        "processors": [
+                            {
+                                "displayname": "Popup notification",
+                                "name": "popup",
+                                "locked": 0,
+                                "userconfigured": 1,
+                                "loggedin": {
+                                    "name": "loggedin",
+                                    "displayname": "When I'm logged in",
+                                    "checked": 0,
+                                    "disableall": 0
+                                },
+                                "loggedoff": {
+                                    "name": "loggedoff",
+                                    "displayname": "When I'm offline",
+                                    "checked": 0,
+                                    "disableall": 0
+                                }
+                            }
+                        ]
+                    }
+                ]
+            }
+        ],
+        "privacychoices": [
+            {
+                "value": 1,
+                "text": "My contacts only",
+                "checked": 0
+            },
+            {
+                "value": 2,
+                "text": "Anyone within courses I am a member of",
+                "checked": 1
+            }
+        ]
+    }
+}}
+<div class="preferences-page-container" data-region="preferences-page-container">
+    <h2>{{#str}} messagepreferences, message {{/str}}</h2>
+    <div class="privacy-setting-container"
+         data-user-id="{{userid}}"
+         data-region="privacy-setting-container"
+         data-preference-key="message_blocknoncontacts">
+        <p>{{#str}} contactableprivacy, message {{/str}}</p>
+       {{#privacychoices}}
+        <input id="action-selection-option-{{value}}"
+               type="radio"
+               name="message_blocknoncontacts"
+               value="{{value}}"
+               {{#checked}}checked="checked"{{/checked}}/>
+        <label for="action-selection-option-{{value}}">{{text}}</label>
+        <br>
+       {{/privacychoices}}
+    </div><br>
+    <div class="preferences-container {{#disableall}}disabled{{/disableall}}"
+        data-user-id="{{userid}}"
+        data-region="preferences-container">
+        <table class="table table-hover preference-table" data-region="preference-table">
+            <tbody>
+                {{#components}}
+                    {{> message/message_preferences_component }}
+                {{/components}}
+            </tbody>
+        </table>
+    </div>
+</div>
+{{#js}}
+require(['jquery', 'core_message/message_preferences'],
+    function($, MessagePreferences) {
+
+    new MessagePreferences($('[data-region="preferences-page-container"]'));
+});
+{{/js}}
diff --git a/message/templates/message_preferences_component.mustache b/message/templates/message_preferences_component.mustache
new file mode 100644 (file)
index 0000000..52a63bd
--- /dev/null
@@ -0,0 +1,84 @@
+{{!
+    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 <http://www.gnu.org/licenses/>.
+}}
+{{!
+    @template core_message/message_preferences_component
+
+    The message preferences page
+
+    Classes required for JS:
+    * None
+
+    Data attibutes required for JS:
+    * All data attributes are required
+
+    Context variables required for this template:
+    * notifications The list of notifications
+
+    Example context (json):
+    {
+        "notifications": [
+            {
+                "displayname": "Notices about minor problems",
+                "preferencekey": "message_provider_moodle_notices",
+                "onlinehelphtml": "<p>some help HTML</p>",
+                "offlinehelphtml": "<p>some help HTML</p>",
+                "processors": [
+                    {
+                        "displayname": "Popup notification",
+                        "name": "popup",
+                        "locked": 0,
+                        "userconfigured": 1,
+                        "loggedin": {
+                            "name": "loggedin",
+                            "displayname": "When I'm logged in",
+                            "checked": 0,
+                            "disableall": 0
+                        },
+                        "loggedoff": {
+                            "name": "loggedoff",
+                            "displayname": "When I'm offline",
+                            "checked": 0,
+                            "disableall": 0
+                        }
+                    }
+                ]
+            }
+        ]
+    }
+}}
+{{#notifications}}
+    <tr data-preference-key="{{preferencekey}}">
+        <th>{{displayname}}</th>
+        <td class="align-bottom">
+            <div class="container-fluid">
+                <div class="row-fluid">
+                    <div class="span6 col-6">
+                        {{#str}} loggedin, message {{/str}}
+                        {{#onlinehelphtml}}{{{.}}}{{/onlinehelphtml}}
+                    </div>
+                    <div class="span6 col-6">
+                        {{#str}} loggedoff, message {{/str}}
+                        {{#offlinehelphtml}}{{{.}}}{{/offlinehelphtml}}
+                    </div>
+                </div>
+            </div>
+        </td>
+    </tr>
+    {{#processors}}
+        {{> message/message_preferences_notification_processor }}
+    {{/processors}}
+{{/notifications}}
diff --git a/message/templates/message_preferences_notification_processor.mustache b/message/templates/message_preferences_notification_processor.mustache
new file mode 100644 (file)
index 0000000..2b5f08b
--- /dev/null
@@ -0,0 +1,127 @@
+{{!
+    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 <http://www.gnu.org/licenses/>.
+}}
+{{!
+    @template core_message/message_preferences_notification_processor
+
+    The message preferences page
+
+    Classes required for JS:
+    * None
+
+    Data attibutes required for JS:
+    * All data attributes are required
+
+    Context variables required for this template:
+    * displayname   The display name of the processor
+    * name          The name of the processor
+    * locked        Whether the processor is locked
+    * loggedin      The logged in settings
+    * loggedoff     The logged off settings
+
+    Example context (json):
+    {
+        "displayname": "Notices about minor problems",
+        "preferencekey": "message_provider_moodle_notices",
+        "processors": [
+            {
+                "displayname": "Popup notification",
+                "name": "popup",
+                "locked": 0,
+                "userconfigured": 1,
+                "loggedin": {
+                    "name": "loggedin",
+                    "displayname": "When I'm logged in",
+                    "checked": 0,
+                    "disableall": 0
+                },
+                "loggedoff": {
+                    "name": "loggedoff",
+                    "displayname": "When I'm offline",
+                    "checked": 0,
+                    "disableall": 0
+                }
+            }
+        ]
+    }
+}}
+<tr class="preference-row" data-region="preference-row" data-preference-key="{{preferencekey}}">
+    <td class="preference-name">{{displayname}}</td>
+    <td {{^userconfigured}}class="disabled"{{/userconfigured}} data-processor-name="{{name}}">
+        {{#locked}}
+            <div class="dimmed_text">{{lockedmessage}}</div>
+        {{/locked}}
+        {{^locked}}
+            <div class="disabled-message">{{#str}} disabled, question {{/str}}</div>
+            <form>
+                <div class="container-fluid">
+                    <div class="row-fluid">
+                        <div class="span6 col-6">
+                            {{#loggedin}}
+                                {{< core/hover_tooltip }}
+                                    {{$anchor}}
+                                        <label class="preference-state"
+                                            title="{{displayname}}"
+                                            data-state="{{name}}">
+
+                                            <span class="accesshide">{{displayname}}</span>
+                                            <input type="checkbox"
+                                                tabindex="-1"
+                                                class="accesshide"
+                                                {{#checked}}checked{{/checked}}
+                                                {{#disableall}}disabled{{/disableall}} />
+                                            <div class="preference-state-status-container" tabindex="0">
+                                                <span class="on-text">{{#str}} on, message {{/str}}</span>
+                                                <span class="off-text">{{#str}} off, message {{/str}}</span>
+                                                {{> core/loading }}
+                                            </div>
+                                        </label>
+                                    {{/anchor}}
+                                    {{$tooltip}}{{displayname}}{{/tooltip}}
+                                {{/ core/hover_tooltip }}
+                            {{/loggedin}}
+                        </div>
+                        <div class="span6 col-6">
+                            {{#loggedoff}}
+                                {{< core/hover_tooltip }}
+                                    {{$anchor}}
+                                        <label class="preference-state"
+                                            title="{{displayname}}"
+                                            data-state="{{name}}">
+
+                                            <span class="accesshide">{{displayname}}</span>
+                                            <input type="checkbox"
+                                                tabindex="-1"
+                                                class="accesshide"
+                                                {{#checked}}checked{{/checked}}
+                                                {{#disableall}}disabled{{/disableall}} />
+                                            <div class="preference-state-status-container" tabindex="0">
+                                                <span class="on-text">{{#str}} on, message {{/str}}</span>
+                                                <span class="off-text">{{#str}} off, message {{/str}}</span>
+                                                {{> core/loading }}
+                                            </div>
+                                        </label>
+                                    {{/anchor}}
+                                    {{$tooltip}}{{displayname}}{{/tooltip}}
+                                {{/ core/hover_tooltip }}
+                            {{/loggedoff}}
+                        </div>
+                    </div>
+                </div>
+            </form>
+        {{/locked}}
+    </td>
+</tr>
diff --git a/message/tests/behat/message_preferences.feature b/message/tests/behat/message_preferences.feature
new file mode 100644 (file)
index 0000000..4aeac16
--- /dev/null
@@ -0,0 +1,30 @@
+@core @core_message
+Feature: To be able to see and save user message preferences as admin
+  As an admin
+  I need to be able to view and edit message preferences for other users
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email                |
+      | student1 | Student   | 1        | student1@emample.com |
+    And the following "user preferences" exist:
+      | user      | preference                                        | value |
+      | student1  | message_provider_moodle_instantmessage_loggedin   | none  |
+      | student1  | message_provider_moodle_instantmessage_loggedoff  | email |
+
+  @javascript
+  Scenario: As an admin I can view and edit message preferences for a user
+    Given I log in as "admin"
+    And I navigate to "Messaging > Notification settings" in site administration
+    And I set the field "email" to "1"
+    And I press "Save changes"
+    And I navigate to "Users > Accounts > Browse list of users" in site administration
+    And I click on "Student 1" "link" in the "Student 1" "table_row"
+    And I click on "Preferences" "link" in the "#region-main-box" "css_element"
+    And I click on "Message preferences" "link" in the "#region-main-box" "css_element"
+    And I click on "//label[@data-state='loggedoff']" "xpath_element"
+    And I log out
+    And I log in as "student1"
+    And I follow "Preferences" in the user menu
+    And I click on "Message preferences" "link"
+    And the field "Email" matches value "0"
\ No newline at end of file