--- a/src/pyams_skin/resources/js/myams.js Sat Feb 28 16:11:49 2015 +0100
+++ b/src/pyams_skin/resources/js/myams.js Sat Feb 28 16:12:45 2015 +0100
@@ -1404,6 +1404,7 @@
var header = errors.length == 1 ? ams.i18n.ERROR_OCCURED : ams.i18n.ERRORS_OCCURED;
ams.skin.alert(form, 'error', header, errors);
} else {
+ $('.state-error', form).removeClass('state-error');
header = errors.widgets && (errors.widgets.length > 1) ? ams.i18n.ERRORS_OCCURED : ams.i18n.ERROR_OCCURED;
var message = new Array();
var index;
@@ -1415,13 +1416,24 @@
for (index in errors.widgets) {
if (!$.isNumeric(index))
continue;
- var widget = errors.widgets[index];
- $('[name="' + widget.name + '"]', form).parent('label')
- .removeClassPrefix('state-')
- .addClass('state-error')
- .after('<span for="name" class="state-error">' + widget.message + '</span>');
- if (widget.label) {
- message.push(widget.label + ' : ' + widget.message);
+ // set widget status message
+ var widget_data = errors.widgets[index];
+ var widget = $('[name="' + widget_data.name + '"]', form);
+ widget.parent('label')
+ .removeClassPrefix('state-')
+ .addClass('state-error')
+ .after('<span for="name" class="state-error">' + widget_data.message + '</span>');
+ // complete form alert message
+ if (widget_data.label) {
+ message.push(widget_data.label + ' : ' + widget_data.message);
+ }
+ // mark parent tab (if any) with error status
+ var tab_index = widget.parents('.tab-pane').index() + 1;
+ if (tab_index > 0) {
+ var nav_tabs = $('.nav-tabs', $(widget).parents('.tabforms'));
+ $('li:nth-child(' + tab_index + ')', nav_tabs).removeClassPrefix('state-')
+ .addClass('state-error');
+ $('li.state-error:first a', form).click();
}
}
ams.skin.alert(form, 'error', header, message, errors.error_message);
@@ -2146,6 +2158,17 @@
settings = ams.executeFunctionByName(data.amsSelect2InitCallback, select, settings) || settings;
var plugin = select.select2(settings);
ams.executeFunctionByName(data.amsSelect2AfterInitCallback, select, plugin, settings);
+ if (select.hasClass('ordered')) {
+ $(plugin.context).parents('.select2-parent').find('ul.select2-choices').sortable({
+ containment: 'parent',
+ start: function() {
+ select.select2('onSortStart');
+ },
+ update: function() {
+ select.select2('onSortEnd');
+ }
+ })
+ }
select.on('change', function() {
var validator = $(select.get(0).form).data('validator');
@@ -2276,12 +2299,31 @@
// Otherwise, hidden input fields created by jquery-validate plug-in
// and matching named buttons will be deleted (on first form submit)
// before JQuery-form plug-in can get them when submitting the form...
+ $('.state-error', form).removeClass('state-error');
ams.ajax.check($.fn.ajaxSubmit,
ams.baseURL + 'ext/jquery-form-3.49' + (ams.devmode ? '.js' : '.min.js'));
return ams.form.submit(form);
}
: ams.getFunctionByName(data.amsFormSubmitHandler)
- : undefined
+ : undefined,
+ invalidHandler: form.attr('data-async') !== undefined
+ ? data.amsFormInvalidHandler === undefined
+ ? function(event, validator) {
+ $('.state-error', form).removeClass('state-error');
+ for (var index in validator.errorList) {
+ var error = validator.errorList[index];
+ var tab_index = $(error.element).parents('.tab-pane').index() + 1;
+ if (tab_index > 0) {
+ var nav_tabs = $('.nav-tabs', $(error.element).parents('.tabforms'));
+ $('li:nth-child(' + tab_index + ')', nav_tabs)
+ .removeClassPrefix('state-')
+ .addClass('state-error');
+ $('li.state-error:first a', nav_tabs).click();
+ }
+ }
+ }
+ : ams.getFunctionByName(data.amsFormInvalidHandler)
+ : undefined
};
var settings = $.extend({}, data_options, data.amsValidateOptions);
settings = ams.executeFunctionByName(data.amsValidateInitCallback, form, settings) || settings;