--- 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');