src/pyams_skin/resources/js/myams-helpers.js
changeset 557 bca7a7e058a3
equal deleted inserted replaced
-1:000000000000 557:bca7a7e058a3
       
     1 /**
       
     2  * MyAMS helpers
       
     3  *
       
     4  * These helpers functions are used by several JQuery plug-in extensions.
       
     5  * They have been extracted from these extensions management code to reuse them more easily into
       
     6  * application specific callbacks.
       
     7  */
       
     8 (function($, globals) {
       
     9 
       
    10 	var ams = globals.MyAMS;
       
    11 
       
    12 	ams.helpers = {
       
    13 
       
    14 		/** Sort DOM elements into selected container */
       
    15 		sort: function(container, attribute) {
       
    16 			if (!attribute) {
       
    17 				attribute = 'weight';
       
    18 			}
       
    19 			var childs = container.children();
       
    20 			childs.sort(function(a, b) {
       
    21 				return +$(a).data(attribute) - +$(b).data(attribute);
       
    22 			}).each(function() {
       
    23 				container.append(this);
       
    24 			});
       
    25 		},
       
    26 
       
    27 		/** Clear Select2 slection */
       
    28 		select2ClearSelection: function() {
       
    29 			var source = $(this);
       
    30 			var label = source.parents('label').first();
       
    31 			var target = source.data('ams-select2-target');
       
    32 			$('[name="' + target + '"]', label).data('select2').val('');
       
    33 		},
       
    34 
       
    35 		/** Select2 selection formatter */
       
    36 		select2FormatSelection: function(object, container) {
       
    37 			if (!(object instanceof Array)) {
       
    38 				object = [object];
       
    39 			}
       
    40 			$(object).each(function() {
       
    41 				if (typeof(this) === 'object') {
       
    42 					container.append(this.text);
       
    43 				} else {
       
    44 					container.append(this);
       
    45 				}
       
    46 			});
       
    47 		},
       
    48 
       
    49 		/** Select2 'select-all' helper */
       
    50 		select2SelectAllHelper: function() {
       
    51 			var source = $(this);
       
    52 			var label = source.parents('label').first();
       
    53 			var target = source.data('ams-select2-target');
       
    54 			var input = $('[name="' + target + '"]', label);
       
    55 			if (input.get(0).tagName === 'SELECT') {
       
    56 				input.select2('val', $('option', input).listattr('value'));
       
    57 			} else {
       
    58 				input.select2('data', input.data('ams-select2-data'));
       
    59 			}
       
    60 		},
       
    61 
       
    62 		/** Select2 query results callback */
       
    63 		select2QueryUrlResultsCallback: function(data, page, context) {
       
    64 			switch (data.status) {
       
    65 				case 'error':
       
    66 					ams.skin && ams.skin.messageBox('error', {
       
    67 						title: ams.i18n.ERROR_OCCURED,
       
    68 						content: '<h4>' + data.error_message + '</h4>',
       
    69 						icon: "fa fa-warning animated shake",
       
    70 						timeout: 10000
       
    71 					});
       
    72 					break;
       
    73 				case 'modal':
       
    74 					$(this).data('select2').dropdown.hide();
       
    75 					ams.dialog && ams.dialog.open(data.location);
       
    76 					break;
       
    77 				default:
       
    78 					return {
       
    79 						results: data.results || data,
       
    80 						more: data.has_more || false,
       
    81 						context: data.context
       
    82 					};
       
    83 			}
       
    84 		},
       
    85 
       
    86 		/** Select2 JSON-RPC success callback */
       
    87 		select2QueryMethodSuccessCallback: function(data, status, options) {
       
    88 			var result = data.result;
       
    89 			if (typeof(result) === 'string') {
       
    90 				try {
       
    91 					result = JSON.parse(result);
       
    92 				} catch (e) {}
       
    93 			}
       
    94 			switch (result.status) {
       
    95 				case 'error':
       
    96 					ams.skin && ams.skin.messageBox('error', {
       
    97 						title: ams.i18n.ERROR_OCCURED,
       
    98 						content: '<h4>' + result.error_message + '</h4>',
       
    99 						icon: "fa fa-warning animated shake",
       
   100 						timeout: 10000
       
   101 					});
       
   102 					break;
       
   103 				case 'modal':
       
   104 					$(this).data('select2').dropdown.hide();
       
   105 					ams.dialog && ams.dialog.open(result.location);
       
   106 					break;
       
   107 				default:
       
   108 					options.callback({
       
   109 						results: result.results || result,
       
   110 						more: result.has_more || false,
       
   111 						context: result.context
       
   112 					});
       
   113 			}
       
   114 		},
       
   115 
       
   116 		/** Select2 helper to automate selection change */
       
   117 		select2ChangeHelper: function() {
       
   118 			var source = $(this);
       
   119 			var data = source.data();
       
   120 			var target = $(data.amsSelect2HelperTarget);
       
   121 			switch (data.amsSelect2HelperType) {
       
   122 				case 'html':
       
   123 					target.html('<div class="text-center"><i class="fa fa-2x fa-gear fa-spin"></i></div>');
       
   124 					var params = {};
       
   125 					params[data.amsSelect2HelperArgument || 'value'] = source.val();
       
   126 					$.get(data.amsSelect2HelperUrl, params,
       
   127 						ams.getFunctionByName(data.amsSelect2HelperCallback) || function(result) {
       
   128 							if (result) {
       
   129 								target.html(result);
       
   130 								ams.initContent && ams.initContent(target);
       
   131 							} else {
       
   132 								target.empty();
       
   133 							}
       
   134 						})
       
   135 					.fail(function() {
       
   136 						target.empty();
       
   137 					});
       
   138 					break;
       
   139 				case 'json-rpc':
       
   140 					target.html('<div class="text-center"><i class="fa fa-2x fa-gear fa-spin"></i></div>');
       
   141 					ams.jsonrpc && ams.jsonrpc.post(data.amsSelect2HelperMethod,
       
   142 													{value: source.val()},
       
   143 													{url: data.amsSelect2HelperUrl},
       
   144 													ams.getFunctionByName(data.amsSelect2HelperCallback) || function(result) {
       
   145 															if (result.result) {
       
   146 																target.html(result.result);
       
   147 																ams.initContent && ams.initContent(target);
       
   148 															} else {
       
   149 																target.empty();
       
   150 															}
       
   151 														});
       
   152 					break;
       
   153 				default:
       
   154 					var callback = data.amsSelect2HelperCallback;
       
   155 					if (callback) {
       
   156 						ams.executeFunctionByName(callback, source, data);
       
   157 					}
       
   158 			}
       
   159 		},
       
   160 
       
   161 		/** Context menu handler */
       
   162 		contextMenuHandler: function(target, menu) {
       
   163 			if (menu.get(0).tagName !== 'A') {  // Icon click?
       
   164 				menu = menu.parents('a').first();
       
   165 			}
       
   166 			var menuData = menu.data();
       
   167 			if (menuData.toggle === 'modal') {
       
   168 				ams.dialog && ams.dialog.open(menu);
       
   169 			} else {
       
   170 				var href = menu.attr('href') || menuData.amsUrl;
       
   171 				if (!href || href.startsWith('javascript') || menu.attr('target')) {
       
   172 					return;
       
   173 				}
       
   174 				ams.event && ams.event.stop();
       
   175 				var hrefGetter = ams.getFunctionByName(href);
       
   176 				if (typeof(hrefGetter) === 'function') {
       
   177 					href = hrefGetter.call(menu, target);
       
   178 				}
       
   179 				if (typeof(href) === 'function') {
       
   180 					// Javascript function call
       
   181 					href.call(menu, target);
       
   182 				} else {
       
   183 					// Standard AJAX or browser URL call
       
   184 					// Convert %23 chars to #
       
   185 					href = href.replace(/\%23/, '#');
       
   186 					target = menu.data('ams-target');
       
   187 					if (target) {
       
   188 						ams.form && ams.form.confirmChangedForm(target, function () {
       
   189 							ams.skin && ams.skin.loadURL(href, target, menu.data('ams-link-options'), menu.data('ams-link-callback'));
       
   190 						});
       
   191 					} else {
       
   192 						ams.form && ams.form.confirmChangedForm(function () {
       
   193 							if (href.startsWith('#')) {
       
   194 								if (href !== location.hash) {
       
   195 									if (ams.root.hasClass('mobile-view-activated')) {
       
   196 										ams.root.removeClass('hidden-menu');
       
   197 										window.setTimeout(function () {
       
   198 											window.location.hash = href;
       
   199 										}, 150);
       
   200 									} else {
       
   201 										window.location.hash = href;
       
   202 									}
       
   203 								}
       
   204 							} else {
       
   205 								window.location = href;
       
   206 							}
       
   207 						});
       
   208 					}
       
   209 				}
       
   210 			}
       
   211 		},
       
   212 
       
   213 		/** Datetimepicker dialog cleaner callback */
       
   214 		datetimepickerDialogHiddenCallback: function() {
       
   215 			$('.datepicker, .timepicker, .datetimepicker', this).datetimepicker('destroy');
       
   216 		},
       
   217 
       
   218 		/** Clear search form target when query is empty */
       
   219 		clearSearchTarget: function() {
       
   220 			var input = $(this);
       
   221 			if (!input.val()) {
       
   222 				var form = $(input).parents('form').first();
       
   223 				$(form.data('ams-form-submit-target')).empty();
       
   224 			}
       
   225 		},
       
   226 
       
   227 		/** Set SEO status */
       
   228 		setSEOStatus: function() {
       
   229 			var input = $(this);
       
   230 			var progress = input.siblings('.progress').children('.progress-bar');
       
   231 			var length = Math.min(input.val().length, 100);
       
   232 			var status = 'success';
       
   233 			if (length < 20 || length > 80) {
       
   234 				status = 'danger';
       
   235 			} else if (length < 40 || length > 66) {
       
   236 				status = 'warning';
       
   237 			}
       
   238 			progress.removeClassPrefix('progress-bar')
       
   239 					.addClass('progress-bar')
       
   240 					.addClass('progress-bar-' + status)
       
   241 					.css('width', length + '%');
       
   242 		}
       
   243 	};
       
   244 
       
   245 })(jQuery, this);