|
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); |