MDL-6074 blocks: Hide user in online users block
[moodle.git] / blocks / online_users / amd / src / change_user_visibility.js
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * A javascript module that handles the change of the user's visibility in the
18  * online users block.
19  *
20  * @module     block_online_users/change_user_visibility
21  * @package    block_online_users
22  * @copyright  2018 Mihail Geshoski <mihail@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
25 define(['jquery', 'core/ajax', 'core/str', 'core/notification'],
26         function($, Ajax, Str, Notification) {
28     /**
29      * Selectors.
30      *
31      * @access private
32      * @type {Object}
33      */
34     var SELECTORS = {
35         CHANGE_VISIBILITY_LINK: '#change-user-visibility',
36         CHANGE_VISIBILITY_ICON: '#change-user-visibility .icon'
37     };
39     /**
40      * Change user visibility in the online users block.
41      *
42      * @method changeVisibility
43      * @param {String} action
44      * @param {String} userid
45      * @private
46      */
47     var changeVisibility = function(action, userid) {
49         var value = action == "show" ? 1 : 0;
50         var preferences = [{
51             'name': 'block_online_users_uservisibility',
52             'value': value,
53             'userid': userid
54         }];
56         var request = {
57             methodname: 'core_user_set_user_preferences',
58             args: {
59                 preferences: preferences
60             }
61         };
62         Ajax.call([request])[0].then(function(data) {
63             if (data.saved) {
64                 var newAction = oppositeAction(action);
65                 changeVisibilityLinkAttr(newAction);
66                 changeVisibilityIconAttr(newAction);
67             }
68             return;
69         }).catch(Notification.exception);
70     };
72     /**
73      * Get the opposite action.
74      *
75      * @method oppositeAction
76      * @param {String} action
77      * @return {String}
78      * @private
79      */
80     var oppositeAction = function(action) {
81         return action == 'show' ? 'hide' : 'show';
82     };
84     /**
85      * Change the attribute values of the user visibility link in the online users block.
86      *
87      * @method changeVisibilityLinkAttr
88      * @param {String} action
89      * @private
90      */
91     var changeVisibilityLinkAttr = function(action) {
92         getTitle(action).then(function(title) {
93             $(SELECTORS.CHANGE_VISIBILITY_LINK).attr({
94                 'data-action': action,
95                 'title': title
96             });
97             return;
98         }).catch(Notification.exception);
99     };
101     /**
102      * Change the attribute values of the user visibility icon in the online users block.
103      *
104      * @method changeVisibilityIconAttr
105      * @param {String} action
106      * @private
107      */
108     var changeVisibilityIconAttr = function(action) {
109         var icon = $(SELECTORS.CHANGE_VISIBILITY_ICON);
110         getTitle(action).then(function(title) {
111             // Add the proper title to the icon.
112             $(icon).attr({
113                 'title': title,
114                 'aria-label': title
115             });
116             // If the icon is an image.
117             if (icon.is("img")) {
118                 $(icon).attr({
119                     'src': M.util.image_url('t/' + action),
120                     'alt': title
121                 });
122             } else {
123                 // Add the new icon class and remove the old one.
124                 $(icon).addClass(getIconClass(action));
125                 $(icon).removeClass(getIconClass(oppositeAction(action)));
126             }
127             return;
128         }).catch(Notification.exception);
129     };
131     /**
132      * Get the proper class for the user visibility icon in the online users block.
133      *
134      * @method getIconClass
135      * @param {String} action
136      * @return {String}
137      * @private
138      */
139     var getIconClass = function(action) {
140         return action == 'show' ? 'fa-eye-slash' : 'fa-eye';
141     };
143     /**
144      * Get the title description of the user visibility link in the online users block.
145      *
146      * @method getTitle
147      * @param {String} action
148      * @return {object} jQuery promise
149      * @private
150      */
151     var getTitle = function(action) {
152         return Str.get_string('online_status:' + action, 'block_online_users');
153     };
155     return {
156         // Public variables and functions.
157         /**
158          * Initialise change user visibility function.
159          *
160          * @method init
161          */
162         init: function() {
163             $(SELECTORS.CHANGE_VISIBILITY_LINK).on('click', function(e) {
164                 e.preventDefault();
165                 var action = ($(this).attr('data-action'));
166                 var userid = ($(this).attr('data-userid'));
167                 changeVisibility(action, userid);
168             });
169         }
170     };
171 });