src/pyams_skin/resources/js/myams-ajax.js
changeset 566 a1707c607eec
parent 565 318533413200
child 567 bca1726b1d85
--- a/src/pyams_skin/resources/js/myams-ajax.js	Sun Jul 19 02:02:20 2020 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,472 +0,0 @@
-/**
- * MyAMS AJAX features
- */
-(function($, globals) {
-
-	var ams = globals.MyAMS;
-
-	ams.ajax = {
-
-		/**
-		 * Check for given feature and download script if necessary
-		 *
-		 * @param checker: pointer to a javascript object which will be downloaded in undefined
-		 * @param source: URL of a javascript file containing requested feature
-		 * @param callback: pointer to a function which will be called after the script is downloaded. The first
-		 *   argument of this callback is a boolean value indicating if the script was just downloaded (true)
-		 *   or if the requested object was already loaded (false)
-		 * @param options: callback options
-		 */
-		check: function(checker, source, callback, options) {
-
-			function callCallbacks(firstLoad, options) {
-				if (callback === undefined) {
-					return;
-				}
-				if (!(callback instanceof Array)) {
-					callback = [callback];
-				}
-				for (var index=0; index < callback.length; index++) {
-					var cb = ams.getFunctionByName(callback[index]);
-					if (typeof(cb) === 'function') {
-						cb(firstLoad, options);
-					}
-				}
-			}
-
-			if (!(callback instanceof Array)) {
-				if (typeof(callback) === 'object') {
-					options = callback;
-					callback = undefined;
-				}
-			}
-			var defaults = {
-				async: typeof(callback) === 'function'
-			};
-			var settings = $.extend({}, defaults, options),
-				deferred = [],
-				index;
-			if (checker instanceof Array) {
-				for (index = 0; index < checker.length; index++) {
-					if (checker[index] === undefined) {
-						deferred.push(ams.getScript(source[index], {async: true}));
-					}
-				}
-				if (deferred.length > 0) {
-					$.when.apply($, deferred).then(function () {
-						callCallbacks(true, options);
-					});
-				} else {
-					callCallbacks(false, options);
-				}
-			} else if (checker === undefined) {
-				if (source instanceof Array) {
-					for (index = 0; index < source.length; index++) {
-						deferred.push(ams.getScript(source[index], {async: true}));
-					}
-					if (deferred.length > 0) {
-						$.when.apply($, deferred).then(function () {
-							callCallbacks(true, options);
-						});
-					} else {
-						callCallbacks(false, options);
-					}
-				} else if (typeof(source) === 'string') {
-					ams.getScript(source, function () {
-						callCallbacks(true, options);
-					}, settings);
-				}
-			} else {
-				callCallbacks(false, options);
-			}
-		},
-
-		/**
-		 * Get address relative to current page
-		 */
-		getAddr: function(addr) {
-			var href = addr || $('HTML HEAD BASE').attr('href') || window.location.href;
-			return href.substr(0, href.lastIndexOf("/") + 1);
-		},
-
-		/**
-		 * AJAX start callback
-		 */
-		start: function() {
-			$('#ajax-gear').show();
-		},
-
-		/**
-		 * AJAX stop callback
-		 */
-		stop: function() {
-			$('#ajax-gear').hide();
-		},
-
-		/**
-		 * Handle AJAX upload and download progress
-		 *
-		 * @param event: the source event
-		 */
-		progress: function(event) {
-			if (!event.lengthComputable) {
-				return;
-			}
-			if (event.loaded >= event.total) {
-				return;
-			}
-			if (console) {
-				console.log && console.log(parseInt((event.loaded / event.total * 100), 10) + "%");
-			}
-		},
-
-		/**
-		 * Post data to given URL and handle result as JSON
-		 */
-		getJSON: function() {
-			return function(options) {
-				var url = options.url;
-				delete options.url;
-				ams.ajax.post(url, options, function(result, status, request) {
-					ams.ajax.handleJSON(result);
-				});
-			}
-		},
-
-		/**
-		 * Post data to given URL
-		 */
-		post: function(url, data, options, callback) {
-			var addr;
-			if (url.startsWith(window.location.protocol)) {
-				addr = url;
-			} else {
-				addr = this.getAddr() + url;
-			}
-			if (typeof(options) === 'function') {
-				callback = options;
-				options = {};
-			} else if (!options) {
-				options = {};
-			}
-			if (typeof(callback) === 'undefined') {
-				callback = options.callback;
-			}
-			if (typeof(callback) === 'string') {
-				callback = ams.getFunctionByName(callback);
-			}
-			delete options.callback;
-
-			var result;
-			var defaults = {
-				url: addr,
-				type: 'post',
-				cache: false,
-				async: typeof(callback) === 'function',
-				data: $.param(data),
-				dataType: 'json',
-				beforeSend: function(request, options) {
-					if (globals.Cookies !== undefined) {
-						var token = Cookies.get(ams.csrfCookieName);
-						if (token) {
-							request.setRequestHeader(ams.csrfHeaderName, token);
-						}
-					}
-				},
-				success: callback || function(data /*, status*/) {
-					result = data.result;
-				}
-			};
-			var settings = $.extend({}, defaults, options);
-			$.ajax(settings);
-			return result;
-		},
-
-		/**
-		 * Extract data type and result from response
-		 */
-		getResponse: function(request) {
-			var contentType = request.getResponseHeader('content-type'),
-				dataType,
-				result;
-			if (contentType) {
-				// Got server response
-				if (contentType.startsWith('application/javascript')) {
-					dataType = 'script';
-					result = request.responseText;
-				} else if (contentType.startsWith('text/html')) {
-					dataType = 'html';
-					result = request.responseText;
-				} else if (contentType.startsWith('text/xml')) {
-					dataType = 'xml';
-					result = request.responseText;
-				} else {
-					result = request.responseJSON;
-					if (result) {
-						dataType = 'json';
-					} else {
-						try {
-							result = JSON.parse(request.responseText);
-							dataType = 'json';
-						} catch (e) {
-							result = request.responseText;
-							dataType = 'text';
-						}
-					}
-				}
-			} else {
-				// Probably no response from server...
-				dataType = 'json';
-				result = {
-					status: 'alert',
-					alert: {
-						title: ams.i18n.ERROR_OCCURED,
-						content: ams.i18n.NO_SERVER_RESPONSE
-					}
-				};
-			}
-			return {contentType: dataType,
-					data: result};
-		},
-
-		/**
-		 * Handle server response in JSON format
-		 *
-		 * Result is made of several JSON attributes:
-		 *  - status: error, success, callback, callbacks, reload or redirect
-		 *  - close_form: boolean indicating if current modal should be closed
-		 *  - location: target URL for reload or redirect status
-		 *  - target: target container's selector for loaded content ('#content' by default)
-		 *  - content: available for any status producing output content:
-		 *        {target: target container's selector (source form by default)
-		 *         html: HTML result}
-		 *  - message: available for any status producing output message:
-		 *        {target: target message container's selector
-		 *         status: message status
-		 *         header: message header
-		 *         subtitle: message subtitle,
-		 *         body: message body}
-		 *
-		 * For errors data structure, please see MyAMS.form.showErrors function
-		 */
-		handleJSON: function(result, form, target) {
-			var status = result.status;
-			var url;
-			switch (status) {
-				case 'alert':
-					if (globals.alert) {
-						globals.alert(result.alert.title + '\n\n' + result.alert.content);
-					}
-					break;
-				case 'error':
-					ams.form && ams.form.showErrors(form, result);
-					break;
-				case 'info':
-				case 'success':
-					if (form !== undefined) {
-						ams.form && ams.form.resetChanged(form);
-						if (result.close_form !== false) {
-							ams.dialog && ams.dialog.close(form);
-						}
-					}
-					break;
-				case 'message':
-				case 'messagebox':
-					break;
-				case 'notify':
-				case 'callback':
-				case 'callbacks':
-					if (form !== undefined) {
-						ams.form && ams.form.resetChanged(form);
-						if (result.close_form !== false) {
-							ams.dialog && ams.dialog.close(form);
-						}
-					}
-					break;
-				case 'modal':
-					ams.dialog && ams.dialog.open(result.location);
-					break;
-				case 'reload':
-					if (form !== undefined) {
-						ams.form && ams.form.resetChanged(form);
-						if (result.close_form !== false) {
-							ams.dialog && ams.dialog.close(form);
-						}
-					}
-					url = result.location || window.location.hash;
-					if (url.startsWith('#')) {
-						url = url.substr(1);
-					}
-					var loadTarget = $(result.target || target || '#content');
-					ams.skin && ams.skin.loadURL(url, loadTarget, {
-						preLoadCallback: ams.getFunctionByName(result.pre_reload) || function() {
-							$('[data-ams-pre-reload]', loadTarget).each(function() {
-								ams.executeFunctionByName($(this).data('ams-pre-reload'));
-							});
-						},
-						preLoadCallbackOptions: result.pre_reload_options,
-						afterLoadCallback: ams.getFunctionByName(result.post_reload) || function () {
-							$('[data-ams-post-reload]', loadTarget).each(function () {
-								ams.executeFunctionByName($(this).data('ams-post-reload'));
-							});
-						},
-						afterLoadCallbackOptions: result.post_reload_options
-					});
-					break;
-				case 'redirect':
-					if (form !== undefined) {
-						ams.form && ams.form.resetChanged(form);
-						if (result.close_form === true) {
-							ams.dialog && ams.dialog.close(form);
-						}
-					}
-					url = result.location || window.location.href;
-					if (url.endsWith('##')) {
-						url = url.replace(/##/, window.location.hash);
-					}
-					if (result.window) {
-						window.open(url, result.window, result.options);
-					} else {
-						if (window.location.href === url) {
-							window.location.reload(true);
-						} else {
-							window.location.href = url;
-						}
-					}
-					break;
-				default:
-					if (console) {
-						console.log && console.log("Unhandled status: " + status);
-					}
-			}
-
-			var index;
-			var content;
-			var container;
-			if (result.content) {
-				content = result.content;
-				container = $(content.target || target || form || '#content');
-				if (content.raw === true) {
-					container.text(content.text);
-				} else {
-					container.html(content.html);
-					ams.initContent && ams.initContent(container);
-				}
-				if (!content.keep_hidden) {
-					container.removeClass('hidden');
-				}
-			}
-			if (result.contents) {
-				var contents = result.contents;
-				for (index=0; index < contents.length; index++) {
-					content = contents[index];
-					container = $(content.target);
-					if (content.raw === true) {
-						container.text(content.text);
-					} else {
-						container.html(content.html);
-						ams.initContent && ams.initContent(container);
-					}
-					if (!content.keep_hidden) {
-						container.removeClass('hidden');
-					}
-				}
-			}
-
-			var message;
-			if (result.message) {
-				message = result.message;
-				if (typeof(message) === 'string') {
-					if ((status === 'info') || (status === 'success')) {
-						ams.skin && ams.skin.smallBox(status, {
-							title: message,
-							icon: 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
-							timeout: 3000
-						});
-					} else {
-						ams.skin && ams.skin.alert($(form || '#content'), status, message);
-					}
-				} else {
-					ams.skin && ams.skin.alert($(message.target || target || form || '#content'),
-											   message.status || 'success',
-											   message.header,
-											   message.body,
-											   message.subtitle);
-				}
-			}
-			if (result.smallbox) {
-				message = result.smallbox;
-				if (typeof(message) === 'string') {
-					ams.skin && ams.skin.smallBox(result.smallbox_status || status, {
-						title: result.smallbox,
-						icon: result.smallbox_icon || 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
-						timeout: result.smallbox_timeout || 3000
-					});
-				} else {
-					ams.skin && ams.skin.smallBox(message.status || status, {
-						title: message.message,
-						icon: message.icon || 'fa fa-fw fa-info-circle font-xs align-top margin-top-10',
-						timeout: message.timeout || 3000
-					});
-				}
-			}
-			if (result.messagebox) {
-				message = result.messagebox;
-				if (typeof(message) === 'string') {
-					ams.skin && ams.skin.messageBox('info', {
-						title: ams.i18n.ERROR_OCCURED,
-						content: message,
-						timeout: 10000
-					});
-				} else {
-					var messageStatus = message.status || 'info';
-					if (messageStatus === 'error' && form && target) {
-						ams.executeFunctionByName(form.data('ams-form-submit-error') || 'MyAMS.form.finalizeSubmitOnError', form, target);
-					}
-					ams.skin && ams.skin.messageBox(messageStatus, {
-						title: message.title || ams.i18n.ERROR_OCCURED,
-						content: message.content,
-						icon: message.icon,
-						number: message.number,
-						timeout: message.timeout === null ? undefined : (message.timeout || 10000)
-					});
-				}
-			}
-			if (result.event) {
-				form.trigger(result.event, result.event_options);
-			}
-			if (result.events) {
-				var event;
-				if (form === undefined) {
-					form = $(document);
-				}
-				for (index  =0; index < result.events.length; index++) {
-					event = result.events[index];
-					if (event === null) {
-						continue;
-					}
-					if (typeof(event) === 'string') {
-						form.trigger(event, result.events_options);
-					} else {
-						form.trigger(event.event, event.options);
-					}
-				}
-			}
-			if (result.callback) {
-				ams.executeFunctionByName(result.callback, form, result.options);
-			}
-			if (result.callbacks) {
-				var callback;
-				for (index=0; index < result.callbacks.length; index++) {
-					callback = result.callbacks[index];
-					if (typeof(callback) === 'function') {
-						ams.executeFunctionByName(callback, form, callback.options);
-					} else {
-						ams.executeFunctionByName(callback.callback, form, callback.options);
-					}
-				}
-			}
-		}
-	};
-
-})(jQuery, this);