src/pyams_skin/resources/js/myams.js
changeset 11 87c7662cc814
parent 6 9bd456627248
child 19 7d4bd86b3f30
--- 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;