You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

251 lines
7.2 KiB

YUI.add('moodle-message_airnotifier-toolboxes', function (Y, NAME) {
/**
* 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);
};
}, '@VERSION@', {"requires": ["base", "node", "io"]});