src/pyams_skin/resources/js/myams.js
changeset 141 1fa3a734453e
parent 136 cdad4eadfd43
child 146 ce34989ca39f
--- a/src/pyams_skin/resources/js/myams.js	Thu Jun 02 16:33:03 2016 +0200
+++ b/src/pyams_skin/resources/js/myams.js	Thu Jun 02 16:34:29 2016 +0200
@@ -534,13 +534,20 @@
 	};
 
 	MyAMS.getScript = function(url, callback, options) {
+		if (typeof(callback) === 'object') {
+			options = callback;
+			callback = null;
+		}
+		if (options === undefined) {
+			options = {};
+		}
 		var defaults = {
 			dataType: 'script',
 			url: ams.getSource(url),
 			success: callback,
 			error: ams.error.show,
 			cache: !ams.devmode,
-			async: typeof(callback) === 'function'
+			async: options.async === undefined ? typeof(callback) === 'function' : options.async
 		};
 		var settings = $.extend({}, defaults, options);
 		return $.ajax(settings);
@@ -1591,6 +1598,9 @@
 											success: function(result, status, request, form) {
 												var callback;
 												var button = form.data('ams-submit-button');
+												form.data('submitted', false);
+												form.removeData('ams-submit-button');
+												form.removeAttr('data-ams-form-changed');
 												if (button) {
 													callback = button.data('ams-form-submit-callback');
 												}
@@ -1601,9 +1611,6 @@
 												if (form.is(':visible') && button) {
 													button.button('reset');
 												}
-												form.data('submitted', false);
-												form.removeData('ams-submit-button');
-												form.removeAttr('data-ams-form-changed');
 											},
 											iframe: hasUpload
 										});
@@ -2373,32 +2380,36 @@
 			var plugin;
 			var name;
 
+			// Inner plug-in register function
+			function _registerPlugin(name, new_plugin) {
+				if (plugins.hasOwnProperty(name)) {
+					var plugin = plugins[name];
+					plugin.css = plugin.css || new_plugin.css;
+					if (new_plugin.callback) {
+						plugin.callbacks.push(new_plugin.callback);
+					}
+					if (new_plugin.register) {
+						plugin.register = true;
+					}
+					if (new_plugin.async === false) {
+						plugin.async = false;
+					}
+				} else {
+					plugins[name] = {
+						src: new_plugin.src,
+						css: new_plugin.css,
+						callbacks: new_plugin.callback ? [new_plugin.callback] : [],
+						register: new_plugin.register,
+						async: new_plugin.async
+					};
+				}
+				if (new_plugin.css) {
+					ams.getCSS(new_plugin.css, name + '_css');
+				}
+			}
+
 			$('[data-ams-plugins]', element).each(function() {
 
-				function registerPlugin(name, new_plugin) {
-					if (plugins.hasOwnProperty(name)) {
-						var plugin = plugins[name];
-						plugin.css = plugin.css || new_plugin.css;
-						if (new_plugin.callback) {
-							plugin.callbacks.push(new_plugin.callback);
-						}
-						if (new_plugin.register) {
-							plugin.register = true;
-						}
-						if (new_plugin.async === false) {
-							plugin.async = false;
-						}
-					} else {
-						plugins[name] = {
-							src: new_plugin.src,
-							css: new_plugin.css,
-							callbacks: new_plugin.callback ? [new_plugin.callback] : [],
-							register: new_plugin.register,
-							async: new_plugin.async
-						};
-					}
-				}
-
 				var source = $(this);
 				var ams_plugins = source.data('ams-plugins');
 				if (typeof(ams_plugins) === 'string') {
@@ -2412,26 +2423,25 @@
 							register: source.data('ams-plugin-' + name + '-register'),
 							async: source.data('ams-plugin-' + name + '-async')
 						};
-						registerPlugin(name, new_plugin);
+						_registerPlugin(name, new_plugin);
 					}
 				} else {
 					for (name in ams_plugins) {
 						if (!ams_plugins.hasOwnProperty(name)) {
 							continue;
 						}
-						registerPlugin(name, ams_plugins[name]);
+						_registerPlugin(name, ams_plugins[name]);
 					}
 				}
 			});
 
-			// Load new plug-ins and execute async ones
 			for (name in plugins) {
 				if (ams.plugins.enabled[name] === undefined) {
 					plugin = plugins[name];
 					ams.getScript(plugin.src, function() {
 						var index;
 						var callbacks = plugin.callbacks;
-						if (callbacks) {
+						if (callbacks && callbacks.length) {
 							for (index=0; index < callbacks.length; index++) {
 								var called = ams.getFunctionByName(callbacks[index]);
 								if (plugin.register !== false) {
@@ -2448,13 +2458,9 @@
 								ams.plugins.enabled[name] = null;
 							}
 						}
-						var css = plugin.css;
-						if (css) {
-							ams.getCSS(css, name + '_css');
-						}
 						// If running in async mode, registered plug-ins are run
 						// before callback is called so we call plug-in manually
-						if (callbacks && (plugin.async !== false)) {
+						if (callbacks && callbacks.length && (plugin.async !== false)) {
 							for (index=0; index < callbacks.length; index++) {
 								ams.getFunctionByName(callbacks[index])(element);
 							}
@@ -2474,17 +2480,19 @@
 					continue;
 				}
 				var callbacks = ams.plugins.enabled[index];
-				switch (typeof(callbacks)) {
-					case 'function':
-						callbacks(element);
-						break;
-					default:
-						for (var cb_index = 0; cb_index < callbacks.length; cb_index++) {
-							var callback = callbacks[cb_index];
-							if (typeof(callback) === 'function') {
-								callback(element);
+				if (callbacks) {
+					switch (typeof(callbacks)) {
+						case 'function':
+							callbacks(element);
+							break;
+						default:
+							for (var cb_index = 0; cb_index < callbacks.length; cb_index++) {
+								var callback = callbacks[cb_index];
+								if (typeof(callback) === 'function') {
+									callback(element);
+								}
 							}
-						}
+					}
 				}
 			}
 		},
@@ -2497,12 +2505,12 @@
 		 */
 		initData: function(element) {
 			$('[data-ams-data]', element).each(function() {
-				var handler = $(this);
-				var data = handler.data('ams-data');
+				var data_element = $(this);
+				var data = data_element.data('ams-data');
 				if (data) {
 					for (var name in data) {
 						if (data.hasOwnProperty(name)) {
-							handler.attr('data-' + name, data[name]);
+							data_element.attr('data-' + name, data[name]);
 						}
 					}
 				}
@@ -4182,7 +4190,7 @@
 		 * Check notification badge
 		 */
 		checkNotification: function() {
-			var badge = $('#activity > .badge');
+			var badge = $('.badge', '#user-activity >span');
 			if (parseInt(badge.text()) > 0) {
 				badge.removeClass("hidden")
 					 .addClass("bg-color-red bounceIn animated");
@@ -4192,6 +4200,15 @@
 			}
 		},
 
+		refreshNotificationsPanel: function(e) {
+			var button = $(this);
+			button.addClass('disabled');
+			$('i', button).addClass('fa-spin');
+			$('input[name="activity"]:checked', '#user-activity').change();
+			$('i', button).removeClass('fa-spin');
+			button.removeClass('disabled');
+		},
+
 		/**
 		 * Initialize desktop and mobile widgets
 		 */
@@ -4439,6 +4456,17 @@
 		},
 
 		/**
+		 * Remove given callback from registry
+		 */
+		unregisterCleanCallback: function(callback) {
+			var callbacks = ams.skin._clean_callbacks;
+			var index = callbacks.indexOf(callback);
+			if (index >= 0) {
+				callbacks.splice(index, 1);
+			}
+		},
+
+		/**
 		 * Call registered cleaning callbacks on given container
 		 */
 		cleanContainer: function(container) {
@@ -4669,11 +4697,11 @@
 		});
 
 		// Activity badge
-		$('#activity').click(function(e) {
-			var activity = $(this);
-			var dropdown = activity.next('.ajax-dropdown');
+		$('.activity-button', '#user-activity').click(function(e) {
+			var activity = $('#user-activity');
+			var dropdown = $('.ajax-dropdown', activity);
 			if (!dropdown.is(':visible')) {
-				dropdown.css('left', activity.position().left - dropdown.innerWidth() / 2 + activity.innerWidth() / 2)
+				dropdown.css('left', - dropdown.innerWidth() + activity.innerWidth())
 						.fadeIn(150);
 				activity.addClass('active');
 			} else {
@@ -4693,10 +4721,23 @@
 			}
 		});
 
-		$('input[name="activity"]').change(function() {
-			var url = $(this).data('ams-url');
-			var container = $('.ajax-notifications');
-			ams.skin.loadURL(url, container);
+		$('input[name="activity"]').change(function(e) {
+			var href = $(this).data('ams-url');
+			if (href) {
+				e.preventDefault();
+				e.stopPropagation();
+				var href_getter = ams.getFunctionByName(href);
+				if (typeof(href_getter) === 'function') {
+					href = href_getter.call(this);
+				}
+				if (typeof(href) === 'function') {
+					// Javascript function call
+					href.call(this);
+				} else {
+					var container = $('.ajax-notifications');
+					ams.skin.loadURL(href, container);
+				}
+			}
 		});
 
 		// Logout button