src/pyams_skin/resources/js/myams-callbacks.js
changeset 433 f8b091800256
child 486 48b7cea0d903
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_skin/resources/js/myams-callbacks.js	Wed Oct 17 11:14:10 2018 +0200
@@ -0,0 +1,165 @@
+/**
+ * MyAMS callbacks management
+ */
+(function($, globals) {
+
+	var MyAMS = globals.MyAMS,
+		ams = MyAMS;
+
+	MyAMS.callbacks = {
+
+		/**
+		 * Initialize list of callbacks
+		 *
+		 * Callbacks are initialized each time a page content is loaded and integrated into page's DOM.
+		 * Unlike plug-ins, callbacks are called once in current's content context but are not kept into
+		 * browser's memory for future use.
+		 * Callbacks are defined via several data attributes:
+		 * - data-ams-callback: name of function callback
+		 * - data-ams-callback-source: source URL of file containing callback's function; can contain variables names
+		 *   if enclosed between braces
+		 * - data-ams-callback-options: JSON object containing callback options
+		 */
+		init: function(element) {
+			$('[data-ams-callback]', element).each(function() {
+				var self = this;
+				var data = $(self).data();
+				try {
+					var callbacks = JSON.parse(data.amsCallback);
+					if (!Array.isArray(callbacks)) {
+						callbacks = [callbacks];
+					}
+				} catch (e) {
+					callbacks = data.amsCallback.split(/\s+/);
+				}
+				for (var index=0; index < callbacks.length; index++) {
+					var callback = callbacks[index];
+					if (typeof(callback) === 'string') {
+						var callback_func = ams.getFunctionByName(callback);
+						var callback_options = data.amsCallbackOptions;
+						if (typeof(callback_options) === 'string') {
+							callback_options = callback_options.unserialize();
+						}
+						if (callback_func === undefined) {
+							if (data.amsCallbackSource) {
+								ams.getScript(data.amsCallbackSource,
+									(function (cb) {
+										ams.executeFunctionByName(cb, self, callback_options);
+									})(callback), {
+										async: data.amsCallbackAsync === undefined ? true : data.amsCallbackAsync
+									});
+							} else if (console) {
+								console.warn && console.warn("Undefined callback: " + data.amsCallback);
+							}
+						} else {
+							callback_func.call(self, callback_options);
+						}
+					} else {  // JSON object
+						callback_func = ams.getFunctionByName(callback.callback);
+						callback_options = callback.options;
+						if (typeof(callback_options) === 'string') {
+							callback_options = callback_options.unserialize();
+						}
+						if (callback_func === undefined) {
+							if (callback.source) {
+								ams.getScript(callback.source,
+									(function (cb) {
+										ams.executeFunctionByName(cb.callback, self, cb.options);
+									})(callback), {
+										async: callback.async === undefined ? true : callback.async
+									});
+							} else if (console) {
+								console.warn && console.warn("Undefined callback: " + callback.callback);
+							}
+						} else {
+							callback_func.call(self, callback.options);
+						}
+					}
+				}
+			});
+		},
+
+		/**
+		 * Standard alert message callback
+		 *
+		 * An alert is an HTML div included on top of a "parent's" body
+		 * Alert options include:
+		 * - a status: 'info', 'warning', 'error' or 'success'
+		 * - a parent: jQuery selector of parent's element
+		 * - a header: alert's title
+		 * - a subtitle
+		 * - a message body
+		 * - a boolean margin marker; if true, a 10 pixels margin will be added to alert's body
+		 */
+		alert: function(options) {
+			var data = $(this).data();
+			var settings = $.extend({}, options, data.amsAlertOptions);
+			var parent = $(data.amsAlertParent || settings.parent || this);
+			var status = data.amsAlertStatus || settings.status || 'info';
+			var header = data.amsAlertHeader || settings.header;
+			var message = data.amsAlertMessage || settings.message;
+			var subtitle = data.amsAlertSubtitle || settings.subtitle;
+			var margin = data.amsAlertMargin === undefined ? (settings.margin === undefined ? false : settings.margin) : data.amsAlertMargin;
+			ams.skin.alert(parent, status, header, message, subtitle, margin);
+		},
+
+		/**
+		 * Standard message box callback
+		 *
+		 * Message boxes are small informations messages displayed on bottom right page's corner
+		 * Message box options include:
+		 * - data-ams-messagebox-status: determines message box color; given as 'info', 'warning', 'error' or 'success'
+		 * - data-ams-messagebox-title: message's title
+		 * - data-ams-messagebox-content: message's HTML content
+		 * - data-ams-messagebox-icon: if given, CSS class of message's icon
+		 * - data-ams-messagebox-number: if given, a small error/message number displayed below message
+		 * - data-ams-messagebox-timeout: if given, the message box will be automatically hidden passed this number
+		 *   of milliseconds
+		 * - data-ams-messagebox-callback: a callback's name, which will be called when message box is closed
+		 */
+		messageBox: function(options) {
+			var data = $(this).data();
+			var dataOptions = $.extend({}, options, data.amsMessageboxOptions);
+			var settings = $.extend({}, dataOptions, {
+				title: data.amsMessageboxTitle || dataOptions.title || '',
+				content: data.amsMessageboxContent || dataOptions.content || '',
+				icon: data.amsMessageboxIcon || dataOptions.icon,
+				number: data.amsMessageboxNumber || dataOptions.number,
+				timeout: data.amsMessageboxTimeout || dataOptions.timeout
+			});
+			var status = data.amsMessageboxStatus || dataOptions.status || 'info';
+			var callback = ams.getFunctionByName(data.amsMessageboxCallback || dataOptions.callback);
+			ams.skin.messageBox(status, settings, callback);
+		},
+
+		/**
+		 * Standard small box callback
+		 *
+		 * Small boxes are notification messages displayed on top right page's corner.
+		 * Small box options include:
+		 * - data-ams-smallbox-status: determines message box color; given as 'info', 'warning', 'error' or 'success'
+		 * - data-ams-smallbox-title: message's title
+		 * - data-ams-smallbox-content: message's HTML content
+		 * - data-ams-smallbox-icon: if given, CSS class of message's icon
+		 * - data-ams-smallbox-icon-small: if given, CSS class of small message's icon
+		 * - data-ams-smallbox-timeout: if given, the message box will be automatically hidden passed this number
+		 *   of milliseconds
+		 * - data-ams-smallbox-callback: a callback's name, which will be called when message box is closed
+		 */
+		smallBox: function(options) {
+			var data = $(this).data();
+			var dataOptions = $.extend({}, options, data.amsSmallboxOptions);
+			var settings = $.extend({}, dataOptions, {
+				title: data.amsSmallboxTitle || dataOptions.title || '',
+				content: data.amsSmallboxContent || dataOptions.content || '',
+				icon: data.amsSmallboxIcon || dataOptions.icon,
+				iconSmall: data.amsSmallboxIconSmall || dataOptions.iconSmall,
+				timeout: data.amsSmallboxTimeout || dataOptions.timeout
+			});
+			var status = data.amsSmallboxStatus || dataOptions.status || 'info';
+			var callback = ams.getFunctionByName(data.amsSmallboxCallback || dataOptions.callback);
+			ams.skin.smallBox(status, settings, callback);
+		}
+	};
+
+})(jQuery, this);