src/pyams_skin/resources/js/myams-core.js
changeset 536 d1742b03d5a7
parent 486 48b7cea0d903
child 555 7d7ccf92d6af
--- a/src/pyams_skin/resources/js/myams-core.js	Fri Jul 26 12:42:05 2019 +0200
+++ b/src/pyams_skin/resources/js/myams-core.js	Fri Jul 26 12:42:35 2019 +0200
@@ -463,4 +463,119 @@
 		}
 	};
 
+	/**
+	 * Initialize main events handlers
+	 */
+	MyAMS.initHandlers = function(element) {
+
+		// Initialize custom click handlers
+		$(element).on('click', '[data-ams-click-handler]', function(event) {
+			var source = $(this);
+			var handlers = source.data('ams-disabled-handlers');
+			if ((handlers === true) || (handlers === 'click') || (handlers === 'all')) {
+				return;
+			}
+			var data = source.data();
+			if (data.amsClickHandler) {
+				if ((data.amsStopPropagation === true) || (data.amsClickStopPropagation === true)) {
+					event.stopPropagation();
+				}
+				if (data.amsClickKeepDefault !== true) {
+					event.preventDefault();
+				}
+				var clickHandlers = data.amsClickHandler.split(/\s+/);
+				for (var index=0; index < clickHandlers.length; index++) {
+					var callback = ams.getFunctionByName(clickHandlers[index]);
+					if (callback !== undefined) {
+						callback.call(source, event, data.amsClickHandlerOptions);
+					}
+				}
+			}
+		});
+
+		// Initialize custom change handlers
+		$(element).on('change', '[data-ams-change-handler]', function(event) {
+			var source = $(this);
+			// Disable change handlers for readonly inputs
+			// These change handlers are activated by IE!!!
+			if (source.prop('readonly')) {
+				return;
+			}
+			var handlers = source.data('ams-disabled-handlers');
+			if ((handlers === true) || (handlers === 'change') || (handlers === 'all')) {
+				return;
+			}
+			var data = source.data();
+			if (data.amsChangeHandler) {
+				if ((data.amsStopPropagation === true) || (data.amsChangeStopPropagation === true)) {
+					event.stopPropagation();
+				}
+				if (data.amsChangeKeepDefault !== true) {
+					event.preventDefault();
+				}
+				var changeHandlers = data.amsChangeHandler.split(/\s+/);
+				for (var index=0; index < changeHandlers.length; index++) {
+					var callback = ams.getFunctionByName(changeHandlers[index]);
+					if (callback !== undefined) {
+						callback.call(source, event, data.amsChangeHandlerOptions);
+					}
+				}
+			}
+		});
+
+		// Notify reset to update Select2 widgets
+		$(element).on('reset', 'form', function(e) {
+			var form = $(this);
+			setTimeout(function() {
+				$('.alert-danger, SPAN.state-error', form).not('.persistent').remove();
+				$('LABEL.state-error', form).removeClass('state-error');
+				$('INPUT.select2[type="hidden"]', form).each(function() {
+					var input = $(this);
+					var select = input.data('select2');
+					var value = input.data('ams-select2-input-value');
+					if (value) {
+						input.select2('val', value.split(select.opts.separator));
+					}
+				});
+				form.find('.select2').trigger('change');
+				$('[data-ams-reset-callback]', form).each(function() {
+					var element = $(this);
+					var data = element.data();
+					var callback = ams.getFunctionByName(data.amsResetCallback);
+					if (callback !== undefined) {
+						callback.call(form, element, data.amsResetCallbackOptions);
+					}
+				});
+			}, 10);
+			ams.form && ams.form.setFocus(form);
+		});
+
+		// Initialize custom reset handlers
+		$(element).on('reset', '[data-ams-reset-handler]', function(e) {
+			var form = $(this);
+			var data = form.data();
+			if (data.amsResetHandler) {
+				if (data.amsResetKeepDefault !== true) {
+					e.preventDefault();
+				}
+				var callback = ams.getFunctionByName(data.amsResetHandler);
+				if (callback !== undefined) {
+					callback.call(form, data.amsResetHandlerOptions);
+				}
+			}
+		});
+
+		// Initialize custom event on click
+		$(element).on('click', '[data-ams-click-event]', function(e) {
+			var source = $(this);
+			$(e.target).trigger(source.data('ams-click-event'),
+								source.data('ams-click-event-options'));
+		});
+
+		// Cancel clicks on readonly checkbox
+		$(element).on('click', 'input[type="checkbox"][readonly]', function() {
+			return false;
+		});
+	};
+
 })(jQuery, this);