diff -r 419c021334c0 -r cdad4eadfd43 src/pyams_skin/resources/js/myams.js --- 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 = $('').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('

Loading...

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