src/pyams_skin/resources/js/myams.js
changeset 136 cdad4eadfd43
parent 130 38dc70be3cfa
child 141 1fa3a734453e
--- a/src/pyams_skin/resources/js/myams.js	Thu May 12 10:39:15 2016 +0200
+++ b/src/pyams_skin/resources/js/myams.js	Thu May 12 10:40:50 2016 +0200
@@ -463,8 +463,6 @@
 
 	/**
 	 * Generate a random ID
-	 *
-	 * @param length
 	 */
 	MyAMS.generateId = function() {
 		function s4() {
@@ -475,6 +473,20 @@
 
 
 	/**
+	 * Generate a random UUID
+	 */
+	MyAMS.generateUUID = function () {
+		var d = new Date().getTime();
+		var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+			var r = (d + Math.random() * 16) % 16 | 0;
+			d = Math.floor(d / 16);
+			return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);
+		});
+		return uuid;
+	};
+
+
+	/**
 	 * Get and execute a function given by name
 	 * Small piece of code by Jason Bunting
 	 */
@@ -1359,12 +1371,56 @@
 
 								function _submitAjaxForm(form, options) {
 
-									var button;
+									var button,
+										button_data;
 									var data = form.data();
 									var form_options = data.amsFormOptions;
 									var form_data;
 									var form_data_callback;
 
+									var progress_handler;
+									var progress_interval;
+									var progress_callback;
+									var progress_end_callback;
+
+									// Inner progress status handler
+									function _getProgress(handler, progress_id) {
+
+										var interval;
+
+										function _clearProgressStatus() {
+											button.button('reset');
+											clearInterval(interval);
+											ams.executeFunctionByName(progress_end_callback, form, button);
+										}
+
+										function _getProgressStatus() {
+											ams.ajax.post(handler,
+														  {progress_id: progress_id},
+														  {error: _clearProgressStatus},
+														  ams.getFunctionByName(progress_callback) || function(result, status) {
+															if (status == 'success') {
+																if (result.status === 'running') {
+																	if (result.message) {
+																		button.text(result.message);
+																	} else {
+																		button.text(button.data('ams-progress-text') +
+																					' ' + result.current + ' / ' + result.length);
+																	}
+																} else if (result.status === 'finished') {
+																	_clearProgressStatus();
+																}
+															} else {
+																_clearProgressStatus();
+															}
+														  });
+										}
+
+										button.button('loading');
+										interval = setInterval(_getProgressStatus, progress_interval);
+									}
+
+									// Initialize form data
 									if (submit_options) {
 										form_data_callback = submit_options.formDataInitCallback;
 									}
@@ -1392,20 +1448,19 @@
 										form_data = data.amsFormData || {};
 									}
 
+									// Check submit button for custom action handler and target
 									button = $(form.data('ams-submit-button'));
-									var buttonHandler,
-										buttonTarget;
 									if (button) {
-										buttonHandler = button.data('ams-form-handler');
-										buttonTarget = button.data('ams-form-submit-target');
+										button_data = button.data();
 									}
 
+									// Check action URL
 									var url;
-									var form_handler = handler || buttonHandler || data.amsFormHandler || '';
+									var form_handler = handler || button_data.amsFormHandler || data.amsFormHandler || '';
 									if (form_handler.startsWith(window.location.protocol)) {
 										url = form_handler;
 									} else {
-										var action = form.attr('action').replace(/#/, '');
+										var action = button_data.amsFormAction || form.attr('action').replace(/#/, '');
 										if (action.startsWith(window.location.protocol)) {
 											url = action;
 										} else {
@@ -1413,10 +1468,15 @@
 										}
 										url += form_handler;
 									}
-
+									progress_handler = button_data.amsProgressHandler || data.amsProgressHandler || '';
+									progress_interval = button_data.amsProgressInterval || data.amsProgressInterval || 1000;
+									progress_callback = button_data.amsProgressCallback || data.amsProgressCallback;
+									progress_end_callback = button_data.amsProgressEndCallback || data.amsProgressEndCallback;
+
+									// Initialize submit target with AJAX indicator
 									var target = null;
 									if (submit_options && submit_options.initSubmitTarget) {
-										ams.executeFunctionByName(submit_options.initSubmitTarget);
+										ams.executeFunctionByName(submit_options.initSubmitTarget, form);
 									} else {
 										if (data.amsFormInitSubmitTarget) {
 											target = $(buttonTarget || data.amsFormSubmitTarget || '#content');
@@ -1426,17 +1486,26 @@
 										}
 									}
 
-									var hasUpload = typeof(options.uuid) !== 'undefined';
-									if (hasUpload) {
-										if (url.indexOf('X-Progress-ID') < 0) {
-											url += "?X-Progress-ID=" + options.uuid;
-										}
-										delete options.uuid;
-									}
-
+									// Complete form data
 									if (submit_options) {
 										form_data = $.extend({}, form_data, submit_options.form_data);
 									}
+
+									// Check progress handler
+									if (progress_handler) {
+										form_data.progress_id = ams.generateUUID();
+									} else {
+										// Check progress meter via Apache progress module
+										var hasUpload = typeof(options.uuid) !== 'undefined';
+										if (hasUpload) {
+											if (url.indexOf('X-Progress-ID') < 0) {
+												url += "?X-Progress-ID=" + options.uuid;
+											}
+											delete options.uuid;
+										}
+									}
+
+									// Initialize default AJAX settings
 									var defaults = {
 										url: url,
 										type: 'post',
@@ -1467,13 +1536,15 @@
 										},
 										iframe: hasUpload
 									};
+
+									// Initialize IFrame for custom download target
 									var download_target = (submit_options && submit_options.downloadTarget) || data.amsFormDownloadTarget;
 									if (download_target) {
 										var iframe = $('iframe[name="' + download_target + '"]');
 										if (!iframe.exists()) {
 											iframe = $('<iframe></iframe>').hide()
 																		   .attr('name', download_target)
-																		   .appendTo(form);
+																		   .appendTo($('body'));
 										}
 										defaults = $.extend({}, defaults, {
 											iframe: true,
@@ -1538,25 +1609,37 @@
 										});
 									}
 									var settings = $.extend({}, defaults, options, form_options, submit_options);
+
+									// Initialize progress handler
+									if (progress_handler) {
+										_getProgress(progress_handler, form_data.progress_id);
+									}
+
+									// Submit form
 									$(form).ajaxSubmit(settings);
 
+									// If external download target is specified, reset form submit button and footer
 									if (download_target) {
 										var modal = $(form).parents('.modal-dialog');
-										if (modal.exists()) {
+										var keep_modal = modal.exists() && button && button.data('ams-keep-modal');
+										if (keep_modal !== true) {
 											ams.dialog.close(form);
 										} else {
-											ams.form.finalizeSubmitFooter.call(form);
-											if (button) {
-												button.button('reset');
-											}
-											form.data('submitted', false);
-											form.removeData('ams-submit-button');
-											form.removeAttr('data-ams-form-changed');
+											setTimeout(function() {
+												ams.form.finalizeSubmitFooter.call(form);
+												if (button) {
+													button.button('reset');
+												}
+												form.data('submitted', false);
+												form.removeData('ams-submit-button');
+												form.removeAttr('data-ams-form-changed');
+											}, button.data('ams-form-reset-timeout') || 2000);
 										}
 									}
 								}
 
-								var hasUpload = $('INPUT[type="file"]', form).length > 0;
+								var hasUpload = (form.data('ams-form-ignore-uploads') !== true) &&
+												($('INPUT[type="file"]', form).length > 0);
 								if (hasUpload) {
 									// JQuery-progressbar plug-in must be loaded synchronously!!
 									// Otherwise, hidden input fields created by jquery-validate plug-in
@@ -3423,7 +3506,7 @@
 												}
 											}
 											settings = ams.executeFunctionByName(data.amsDatatableInitCallback, table, settings) || settings;
-											try {  // Some settings can easilly generate DataTables exceptions...
+											try {  // Some settings can easily generate DataTables exceptions...
 												var plugin = table.dataTable(settings);
 												ams.executeFunctionByName(data.amsDatatableAfterInitCallback, table, plugin, settings);
 												if (extensions.length > 0) {
@@ -4315,9 +4398,11 @@
 					updateActiveMenus(menu);
 				}
 				ams.skin.loadURL(url, container);
-				document.title = $('[data-ams-page-title]:first', container).data('ams-page-title') ||
-								 menu.attr('title') ||
-								 document.title;
+				var prefix = $('html head title').data('ams-title-prefix');
+				document.title = (prefix ? prefix + ' > ' : '') +
+								 ($('[data-ams-page-title]:first', container).data('ams-page-title') ||
+								  menu.attr('title') ||
+								  document.title);
 			} else {
 				var active_url = $('[data-ams-active-menu]').data('ams-active-menu');
 				if (active_url) {
@@ -4385,7 +4470,8 @@
 					container.html('<h1 class="loading"><i class="fa fa-cog fa-spin"></i> Loading... </h1>');
 					if (container[0] === $('#content')[0]) {
 						ams.skin._drawBreadCrumb();
-						document.title = $('.breadcrumb LI:last-child').text();
+						var prefix = $('html head title').data('ams-title-prefix');
+						document.title = (prefix ? prefix + ' > ' : '') + $('.breadcrumb LI:last-child').text();
 						$('html, body').animate({scrollTop: 0}, 'fast');
 					} else {
 						container.animate({scrollTop: 0}, 'fast');