Current Path : C:/xampp/htdocs/moodle/message/output/airnotifier/yui/src/toolboxes/js/ |
Current File : C:/xampp/htdocs/moodle/message/output/airnotifier/yui/src/toolboxes/js/toolboxes.js |
/** * Provides a tool for enabling/disabling elements using AJAX/REST. * * @module moodle-message_airnotifier-toolboxes */ // The CSS selectors we use. var CSS = { AIRNOTIFIERCONTENT: 'div[data-processor-name="airnotifier"]', HIDEDEVICE: 'a.hidedevice', DEVICELI: 'li.airnotifierdevice', DIMCLASS: 'dimmed', DIMMEDTEXT: 'dimmed_text', DEVICEIDPREFIX: 'deviceid-' }; /** * The toolbox classes * * TOOLBOX is a generic class which should never be directly instantiated * DEVICETOOLBOX is a class extending TOOLBOX containing code specific to devices */ var TOOLBOX = function() { TOOLBOX.superclass.constructor.apply(this, arguments); }; Y.extend(TOOLBOX, Y.Base, { /** * Replace the button click at the selector with the specified * callback * * @param toolboxtarget The selector of the working area * @param selector The 'button' to replace * @param callback The callback to apply * @param cursor An optional cursor style to apply */ replace_button: function(toolboxtarget, selector, callback, cursor) { if (!cursor) { // Set the default cursor type to pointer to match the anchor. cursor = 'pointer'; } var button = Y.one(toolboxtarget).all(selector) .setStyle('cursor', cursor); // On isn't chainable and will return an event. button.on('click', callback, this); return button; }, /** * Toggle the visibility and availability for the specified * device show/hide button */ toggle_hide_device_ui: function(button) { var element = button.ancestor(CSS.DEVICELI); var hideicon = button.one('img'); var toggle_class = CSS.DIMMEDTEXT; var status = ''; if (element.hasClass(toggle_class)) { status = 'hide'; } else { status = 'show'; } // Change the UI. element.toggleClass(toggle_class); // We need to toggle dimming on the description too element.all(CSS.CONTENTAFTERLINK).toggleClass(CSS.DIMMEDTEXT);. var newstring = M.util.get_string(status, 'moodle'); hideicon.setAttrs({ 'alt': newstring, 'title': newstring, 'src': M.util.image_url('t/' + status) }); button.set('title', newstring); button.set('className', 'editing_' + status); }, /** * Send a request using the REST API * * @param data The data to submit * @param statusspinner (optional) A statusspinner which may contain a section loader * @param callbacksuccess Call back on success * @return response responseText field from responce */ send_request: function(data, statusspinner, callbacksuccess) { // Default data structure if (!data) { data = {}; } // Handle any variables which we must pass back through to. var pageparams = this.get('config').pageparams, varname; for (varname in pageparams) { data[varname] = pageparams[varname]; } if (statusspinner) { statusspinner.show(); } data.sesskey = M.cfg.sesskey; var uri = M.cfg.wwwroot + this.get('ajaxurl'); // Define the configuration to send with the request. var responsetext = []; var config = { method: 'POST', data: data, on: { success: function(tid, response) { try { responsetext = Y.JSON.parse(response.responseText); if (responsetext.error) { Y.use('moodle-core-notification-ajaxexception', function() { return new M.core.ajaxException(responsetext).show(); }); } else if (responsetext.success) { callbacksuccess(); } } catch (e) { // Ignore. } if (statusspinner) { statusspinner.hide(); } }, failure: function(tid, response) { if (statusspinner) { statusspinner.hide(); } Y.use('moodle-core-notification-ajaxexception', function() { return new M.core.ajaxException(response).show(); }); } }, context: this, sync: false }; // Send the request. Y.io(uri, config); return responsetext; }, /** * Return the module ID for the specified element * * @param element The <li> element to determine a module-id number for * @return string The module ID */ get_element_id: function(element) { return element.get('id').replace(CSS.DEVICEIDPREFIX, ''); } }, { NAME: 'device-toolbox', ATTRS: { ajaxurl: { 'value': 0 }, config: { 'value': 0 } } } ); var DEVICETOOLBOX = function() { DEVICETOOLBOX.superclass.constructor.apply(this, arguments); }; Y.extend(DEVICETOOLBOX, TOOLBOX, { /** * Initialize the device toolbox * * Updates all span.commands with relevant handlers and other required changes */ initializer: function() { this.setup_for_device(); }, /** * Update any span.commands within the scope of the specified * selector with AJAX equivelants * * @param baseselector The selector to limit scope to * @return void */ setup_for_device: function(baseselector) { if (!baseselector) { baseselector = CSS.AIRNOTIFIERCONTENT; } Y.all(baseselector).each(this._setup_for_device, this); }, _setup_for_device: function(toolboxtarget) { // Show/Hide. this.replace_button(toolboxtarget, CSS.HIDEDEVICE, this.toggle_hide_device); }, toggle_hide_device: function(e) { // Prevent the default button action. e.preventDefault(); // Get the element we're working on. var element = e.target.ancestor(CSS.DEVICELI); var button = e.target.ancestor('a', true); var value; // Enable the device in case the CSS is dimmed. if (element.hasClass(CSS.DIMMEDTEXT)) { value = 1; } else { value = 0; } // Send the request. var data = { 'field': 'enable', 'enable': value, 'id': this.get_element_id(element) }; var spinner = M.util.add_spinner(Y, element); var context = this; var callback = function() { context.toggle_hide_device_ui(button); }; this.send_request(data, spinner, callback); } }, { NAME: 'message-device-toolbox', ATTRS: { } }); M.message = M.message || {}; M.message.init_device_toolbox = function(config) { return new DEVICETOOLBOX(config); };