Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
/**
2
 * Provides a tool for enabling/disabling elements using AJAX/REST.
3
 *
4
 * @module moodle-message_airnotifier-toolboxes
5
 */
6
 
7
// The CSS selectors we use.
8
var CSS = {
9
    AIRNOTIFIERCONTENT: 'div[data-processor-name="airnotifier"]',
10
    HIDEDEVICE: 'a.hidedevice',
11
    DEVICELI: 'li.airnotifierdevice',
12
    DIMCLASS: 'dimmed',
13
    DIMMEDTEXT: 'dimmed_text',
14
    DEVICEIDPREFIX: 'deviceid-'
15
};
16
 
17
/**
18
 * The toolbox classes
19
 *
20
 * TOOLBOX is a generic class which should never be directly instantiated
21
 * DEVICETOOLBOX is a class extending TOOLBOX containing code specific to devices
22
 */
23
var TOOLBOX = function() {
24
    TOOLBOX.superclass.constructor.apply(this, arguments);
25
};
26
 
27
Y.extend(TOOLBOX, Y.Base, {
28
    /**
29
     * Replace the button click at the selector with the specified
30
     * callback
31
     *
32
     * @param toolboxtarget The selector of the working area
33
     * @param selector The 'button' to replace
34
     * @param callback The callback to apply
35
     * @param cursor An optional cursor style to apply
36
     */
37
    replace_button: function(toolboxtarget, selector, callback, cursor) {
38
        if (!cursor) {
39
            // Set the default cursor type to pointer to match the anchor.
40
            cursor = 'pointer';
41
        }
42
        var button = Y.one(toolboxtarget).all(selector)
43
        .setStyle('cursor', cursor);
44
 
45
        // On isn't chainable and will return an event.
46
        button.on('click', callback, this);
47
 
48
        return button;
49
    },
50
    /**
51
     * Toggle the visibility and availability for the specified
52
     * device show/hide button
53
     */
54
    toggle_hide_device_ui: function(button) {
55
 
56
        var element = button.ancestor(CSS.DEVICELI);
57
        var hideicon = button.one('img');
58
 
59
        var toggle_class = CSS.DIMMEDTEXT;
60
 
61
        var status = '';
62
        if (element.hasClass(toggle_class)) {
63
            status = 'hide';
64
        } else {
65
            status = 'show';
66
        }
67
 
68
        // Change the UI.
69
        element.toggleClass(toggle_class);
70
        // We need to toggle dimming on the description too element.all(CSS.CONTENTAFTERLINK).toggleClass(CSS.DIMMEDTEXT);.
71
        var newstring = M.util.get_string(status, 'moodle');
72
        hideicon.setAttrs({
73
            'alt': newstring,
74
            'title': newstring,
75
            'src': M.util.image_url('t/' + status)
76
        });
77
        button.set('title', newstring);
78
        button.set('className', 'editing_' + status);
79
    },
80
    /**
81
     * Send a request using the REST API
82
     *
83
     * @param data The data to submit
84
     * @param statusspinner (optional) A statusspinner which may contain a section loader
85
     * @param callbacksuccess Call back on success
86
     * @return response responseText field from responce
87
     */
88
    send_request: function(data, statusspinner, callbacksuccess) {
89
        // Default data structure
90
        if (!data) {
91
            data = {};
92
        }
93
        // Handle any variables which we must pass back through to.
94
        var pageparams = this.get('config').pageparams,
95
            varname;
96
        for (varname in pageparams) {
97
            data[varname] = pageparams[varname];
98
        }
99
 
100
        if (statusspinner) {
101
            statusspinner.show();
102
        }
103
 
104
        data.sesskey = M.cfg.sesskey;
105
 
106
        var uri = M.cfg.wwwroot + this.get('ajaxurl');
107
 
108
        // Define the configuration to send with the request.
109
        var responsetext = [];
110
        var config = {
111
            method: 'POST',
112
            data: data,
113
            on: {
114
                success: function(tid, response) {
115
                    try {
116
                        responsetext = Y.JSON.parse(response.responseText);
117
                        if (responsetext.error) {
118
                            Y.use('moodle-core-notification-ajaxexception', function() {
119
                                return new M.core.ajaxException(responsetext).show();
120
                            });
121
                        } else if (responsetext.success) {
122
                            callbacksuccess();
123
                        }
124
                    } catch (e) {
125
                        // Ignore.
126
                    }
127
                    if (statusspinner) {
128
                        statusspinner.hide();
129
                    }
130
                },
131
                failure: function(tid, response) {
132
                    if (statusspinner) {
133
                        statusspinner.hide();
134
                    }
135
                    Y.use('moodle-core-notification-ajaxexception', function() {
136
                        return new M.core.ajaxException(response).show();
137
                    });
138
                }
139
            },
140
            context: this,
141
            sync: false
142
        };
143
 
144
        // Send the request.
145
        Y.io(uri, config);
146
        return responsetext;
147
    },
148
    /**
149
     * Return the module ID for the specified element
150
     *
151
     * @param element The <li> element to determine a module-id number for
152
     * @return string The module ID
153
     */
154
    get_element_id: function(element) {
155
        return element.get('id').replace(CSS.DEVICEIDPREFIX, '');
156
    }
157
},
158
{
159
    NAME: 'device-toolbox',
160
    ATTRS: {
161
        ajaxurl: {
162
            'value': 0
163
        },
164
        config: {
165
            'value': 0
166
        }
167
    }
168
}
169
);
170
 
171
var DEVICETOOLBOX = function() {
172
    DEVICETOOLBOX.superclass.constructor.apply(this, arguments);
173
};
174
 
175
Y.extend(DEVICETOOLBOX, TOOLBOX, {
176
 
177
    /**
178
     * Initialize the device toolbox
179
     *
180
     * Updates all span.commands with relevant handlers and other required changes
181
     */
182
    initializer: function() {
183
        this.setup_for_device();
184
    },
185
    /**
186
     * Update any span.commands within the scope of the specified
187
     * selector with AJAX equivelants
188
     *
189
     * @param baseselector The selector to limit scope to
190
     * @return void
191
     */
192
    setup_for_device: function(baseselector) {
193
        if (!baseselector) {
194
            baseselector = CSS.AIRNOTIFIERCONTENT;
195
        }
196
 
197
        Y.all(baseselector).each(this._setup_for_device, this);
198
    },
199
    _setup_for_device: function(toolboxtarget) {
200
 
201
        // Show/Hide.
202
        this.replace_button(toolboxtarget, CSS.HIDEDEVICE, this.toggle_hide_device);
203
    },
204
    toggle_hide_device: function(e) {
205
        // Prevent the default button action.
206
        e.preventDefault();
207
 
208
        // Get the element we're working on.
209
        var element = e.target.ancestor(CSS.DEVICELI);
210
 
211
        var button = e.target.ancestor('a', true);
212
 
213
        var value;
214
        // Enable the device in case the CSS is dimmed.
215
        if (element.hasClass(CSS.DIMMEDTEXT)) {
216
            value = 1;
217
        } else {
218
            value = 0;
219
        }
220
 
221
        // Send the request.
222
        var data = {
223
            'field': 'enable',
224
            'enable': value,
225
            'id': this.get_element_id(element)
226
        };
227
        var spinner = M.util.add_spinner(Y, element);
228
 
229
        var context = this;
230
        var callback = function() {
231
            context.toggle_hide_device_ui(button);
232
        };
233
        this.send_request(data, spinner, callback);
234
    }
235
}, {
236
    NAME: 'message-device-toolbox',
237
    ATTRS: {
238
}
239
});
240
 
241
M.message = M.message || {};
242
 
243
M.message.init_device_toolbox = function(config) {
244
    return new DEVICETOOLBOX(config);
245
};
246