phcthemes_admin_panel_pack 1.2.3 → 1.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5bacb4342f57efd7a05e80600f82706e606d40561be5db8e69d0030f35fa8201
4
- data.tar.gz: 64021c578670468d2cbaf2e5baf84fe40f7771916440ed4ca0f5e33ad94033ce
3
+ metadata.gz: afd4b11895fab866151949bca3ecbcb178ec7d4bf181e93cefa3e7f71034aaf9
4
+ data.tar.gz: 51c1669b43126cd7486d151899bbb0a14315bfd2c7adabef585a3c9733460407
5
5
  SHA512:
6
- metadata.gz: 8b54f69e2361100a8b871d8c357e3ff07f65dc3f50e03cea3b977bb8c7588804711fad143bd1d0a8b7b71f8ccefbfd83d2cf30fd3d0483405af2ef595873a139
7
- data.tar.gz: 1ea3100d160b134de2ee3ee57ef21de1f7301ec577a93502a8d6502841a2cb0dc7f8646782cf7f3be78720243e454f591f0c56f94e6bbaf82b36bcd46d022466
6
+ metadata.gz: 31a5be6549d09ac7ee17f46da2b09f8fc1631bea0a8bde330f430b0d8f908e74932718e2636de4a4a8a790186e1a7777fe15295959a6b7d47766bbf284b02282
7
+ data.tar.gz: c41598e749c859949735ddf57afb932f6fe6c5462f3506f5d7855467b62856f2e3471b935746c60a7d9c632bcd468f3e21f891671af504e4e2cf232f38356060
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @file autogrow plugin for jquery-jeditable
3
+ * @author Mika Tuupola, Nicolas CARPi
4
+ * @copyright © 2008 Mika Tuupola, Nicolas CARPi
5
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
6
+ * @licence MIT (see LICENCE file)
7
+ * @name PluginAutogrow
8
+ * @example <caption>Autogrow example:</caption>
9
+ * $(".autogrow").editable("save.php", {
10
+ * type : "autogrow",
11
+ * submit : 'OK',
12
+ * cancel : 'cancel'
13
+ * });
14
+ */
15
+ 'use strict';
16
+ (function ($) {
17
+ $.editable.addInputType("autogrow", {
18
+ element : function(settings, original) {
19
+ var textarea = $("<textarea />");
20
+ if (settings.rows) {
21
+ textarea.attr("rows", settings.rows);
22
+ } else {
23
+ textarea.height(settings.height);
24
+ }
25
+ if (settings.cols) {
26
+ textarea.attr("cols", settings.cols);
27
+ } else {
28
+ textarea.width(settings.width);
29
+ }
30
+ $(this).append(textarea);
31
+ return(textarea);
32
+ },
33
+ plugin : function(settings, original) {
34
+ $("textarea", this).autoGrow();
35
+ }
36
+ });
37
+ })(jQuery);
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Depends on Charcounter jQuery plugin by Tom Deater
3
+ * http://www.tomdeater.com/jquery/character_counter/
4
+ *
5
+ * @file charcounter textarea plugin for jquery-jeditable
6
+ * @author Mika Tuupola, Nicolas CARPi
7
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
8
+ * @licence MIT (see LICENCE file)
9
+ * @copyright © 2006 Mika Tuupola, Nicolas CARPi
10
+ * @name PluginCharcounter
11
+ * @example <caption>Charcounter example:</caption>
12
+ * $(".charcounter").editable("save.php", {
13
+ * type : "charcounter",
14
+ * submit : 'OK',
15
+ * charcounter : {
16
+ * characters : 60
17
+ * }
18
+ * });
19
+ */
20
+ 'use strict';
21
+ (function ($) {
22
+ $.editable.addInputType("charcounter", {
23
+ element : function(settings, original) {
24
+ var textarea = $("<textarea />");
25
+ if (settings.rows) {
26
+ textarea.attr("rows", settings.rows);
27
+ } else {
28
+ textarea.height(settings.height);
29
+ }
30
+ if (settings.cols) {
31
+ textarea.attr("cols", settings.cols);
32
+ } else {
33
+ textarea.width(settings.width);
34
+ }
35
+
36
+ // stop bubbling and propagation to parent element
37
+ textarea.click(function(event) {
38
+ if (event.cancelBubble) {
39
+ event.cancelBubble();
40
+ }
41
+ if (event.stopPropagation) {
42
+ event.stopPropagation();
43
+ }
44
+ });
45
+
46
+ $(this).append(textarea);
47
+ return(textarea);
48
+ },
49
+ plugin : function(settings, original) {
50
+ $("textarea", this).charCounter(settings.charcounter.characters, settings.charcounter);
51
+ }
52
+ });
53
+ })(jQuery);
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @file checkbox plugin for jquery-jeditable
3
+ * @author Mika Tuupola, Nicolas CARPi
4
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
5
+ * @licence MIT (see LICENCE file)
6
+ * @name PluginCheckbox
7
+ */
8
+ 'use strict';
9
+ (function ($) {
10
+ $.editable.addInputType('checkbox', {
11
+ element : function(settings, original) {
12
+ var input = $('<input type="checkbox">');
13
+ $(this).append(input);
14
+
15
+ $(input).bind('click', function() {
16
+ if ($(input).val() === 'on') {
17
+ $(input).val('off');
18
+ $(input).removeAttr('checked');
19
+ } else {
20
+ $(input).val('on');
21
+ $(input).attr('checked', 'checked');
22
+ }
23
+ });
24
+
25
+ return(input);
26
+ },
27
+
28
+ content : function(string, settings, original) {
29
+
30
+ var checked = (string === 'yes') ? 'on' : 'off';
31
+ var input = $(':input:first', this);
32
+
33
+ if (checked === 'on') {
34
+ $(input).attr('checked', checked);
35
+ } else {
36
+ $(input).removeAttr('checked');
37
+ }
38
+
39
+ var value = $(input).is(':checked') ? 'on' : 'off';
40
+ $(input).val(value);
41
+ },
42
+
43
+ submit: function (settings, original) {
44
+ var value;
45
+ var input = $(':input:first', this);
46
+ if (input.is(':checked')) {
47
+ value = '1';
48
+ } else {
49
+ value = '0';
50
+ }
51
+ $('input', this).val(value);
52
+ }
53
+ });
54
+ })(jQuery);
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Depends on datepicker widget from jQuery-ui
3
+ * https://jqueryui.com/datepicker/
4
+ *
5
+ * @file datepicker plugin for jquery-jeditable
6
+ * @author Nicolas CARPi
7
+ * @copyright © 2008 Mika Tuupola, Nicolas CARPi
8
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
9
+ * @licence MIT (see LICENCE file)
10
+ * @name PluginDatepicker
11
+ * @example <caption>Datepicker example:</caption>
12
+ * $(".date").editable("save.php", {
13
+ * type : "datepicker",
14
+ * submit : 'OK',
15
+ * datepicker : {
16
+ * format: "dd-mm-yy"
17
+ * },
18
+ * cancel : 'cancel',
19
+ * });
20
+ */
21
+ 'use strict';
22
+ (function ($) {
23
+ $.editable.addInputType('datepicker', {
24
+
25
+ element : function(settings, original) {
26
+ var input = $('<input />');
27
+ if (settings.datepicker) {
28
+ input.datepicker(settings.datepicker);
29
+ } else {
30
+ input.datepicker();
31
+ }
32
+
33
+ // get the date in the correct format
34
+ if (settings.datepicker.format) {
35
+ input.datepicker('option', 'dateFormat', settings.datepicker.format);
36
+ }
37
+
38
+ $(this).append(input);
39
+ return(input);
40
+ },
41
+
42
+ submit: function (settings, original) {
43
+ var dateRaw = $('input', this).datepicker('getDate');
44
+ var dateFormatted;
45
+
46
+ if (settings.datepicker.format) {
47
+ dateFormatted = $.datepicker.formatDate(settings.datepicker.format, new Date(dateRaw));
48
+ } else {
49
+ dateFormatted = dateRaw;
50
+ }
51
+ $('input', this).val(dateFormatted);
52
+ },
53
+
54
+ plugin : function(settings, original) {
55
+ // prevent disappearing of calendar
56
+ settings.onblur = null;
57
+ }
58
+ });
59
+ })(jQuery);
@@ -0,0 +1,823 @@
1
+ /**
2
+ * @file Jeditable - jQuery in place edit plugin
3
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
4
+ * @author Mika Tuupola, Dylan Verheul, Nicolas CARPi
5
+ * @copyright © 2006 Mika Tuupola, Dylan Verheul, Nicolas CARPi
6
+ * @licence MIT (see LICENCE file)
7
+ * @name Jquery-jeditable
8
+ * @type jQuery
9
+ *
10
+ * @param {String|Function} target - URL or Function to send edited content to. Can also be 'disable', 'enable', or 'destroy'
11
+ * @param {Object} [options] - Additional options
12
+ * @param {Object} [options.ajaxoptions] - jQuery Ajax options. See https://api.jquery.com/jQuery.ajax/
13
+ * @param {Function} [options.before] - Function to be executed before going into edit mode
14
+ * @param {Function} [options.callback] - function(result, settings, submitdata) Function to run after submitting edited content
15
+ * @param {String} [options.cancel] - Cancel button value, empty means no button
16
+ * @param {String} [options.cancelcssclass] - CSS class to apply to cancel button
17
+ * @param {Number} [options.cols] - Number of columns if using textarea
18
+ * @param {String} [options.cssclass] - CSS class to apply to input form; use 'inherit' to copy from parent
19
+ * @param {String} [options.inputcssclass] - CSS class to apply to input. 'inherit' to copy from parent
20
+ * @param {String|Function} [options.data] - Content loaded in the form
21
+ * @param {String} [options.event='click'] - jQuery event such as 'click' of 'dblclick'. See https://api.jquery.com/category/events/
22
+ * @param {String} [options.formid] - Give an id to the form that is produced
23
+ * @param {String|Number} [options.height='auto'] - Height of the element in pixels or 'auto' or 'none'
24
+ * @param {String} [options.id='id'] - POST parameter name of edited div id
25
+ * @param {String} [options.indicator] - Indicator html to show when saving
26
+ * @param {String} [options.label] - Label for the form
27
+ * @param {String} [options.list] - HTML5 attribute for text input. Will suggest from a datalist with id of the list option
28
+ * @param {String|Function} [options.loaddata] - Extra parameters to pass when fetching content before editing
29
+ * @param {String} [options.loadtext='Loading…'] - Text to display while loading external content
30
+ * @param {String} [options.loadtype='GET'] - Request type for loadurl (GET or POST)
31
+ * @param {String} [options.loadurl] - URL to fetch input content before editing
32
+ * @param {Number} [options.max] - Maximum value for number type
33
+ * @param {String} [options.maxlength] - The maximum number of character in the text field
34
+ * @param {String} [options.method] - Method to use to send edited content (POST or PUT)
35
+ * @param {Number} [options.min] - Mininum value for number type
36
+ * @param {Boolean} [options.multiple] - Allow multiple selections in a select input
37
+ * @param {String} [options.name='value'] - POST parameter name of edited content
38
+ * @param {String|Function} [options.onblur='cancel'] - Use 'cancel', 'submit', 'ignore' or function. If function returns false, the form is cancelled.
39
+ * @param {Function} [options.onedit] - function triggered upon edition; will cancel edition if it returns false
40
+ * @param {Function} [options.onerror] - function(settings, original, xhr) { ... } called on error
41
+ * @param {Function} [options.onreset] - function(settings, original) { ... } called before reset
42
+ * @param {Function} [options.onsubmit] - function(settings, original) { ... } called before submit
43
+ * @param {String} [options.pattern] - HTML5 attribute for text or URL input
44
+ * @param {String} [options.placeholder='Click to edit'] - Placeholder text or html to insert when element is empty
45
+ * @param {Number} [options.rows] - number of rows if using textarea
46
+ * @param {Boolean} [options.select] - When true text is selected
47
+ * @param {Function} [options.showfn]- Function that can animate the element when switching to edit mode
48
+ * @param {String} [options.size] - The size of the text field
49
+ * @param {String} [options.sortselectoptions] - Sort the options of a select form
50
+ * @param {Number} [options.step] - Step size for number type
51
+ * @param {String} [options.style] - Style to apply to input form; 'inherit' to copy from parent
52
+ * @param {String} [options.submit] - submit button value, empty means no button
53
+ * @param {String} [options.submitcssclass] - CSS class to apply to submit button
54
+ * @param {Object|Function} [options.submitdata] - Extra parameters to send when submitting edited content. function(revert, settings, submitdata)
55
+ * @param {String} [options.tooltip] - Tooltip text that appears on hover (via title attribute)
56
+ * @param {String} [options.type='text'] - text, textarea, select, email, number, url (or any 3rd party input type)
57
+ * @param {String|Number} [options.width='auto'] - The width of the element in pixels or 'auto' or 'none'
58
+ *
59
+ * @example <caption>Simple usage example:</caption>
60
+ * $(".editable").editable("save.php", {
61
+ * cancel : 'Cancel',
62
+ * submit : 'Save',
63
+ * tooltip : "Click to edit...",
64
+ * });
65
+ */
66
+ (function($) {
67
+
68
+ 'use strict';
69
+
70
+ // Keyboard accessibility/WAI-ARIA - allow users to navigate to an editable element using TAB/Shift+TAB
71
+ $.fn.editableAriaShim = function () {
72
+ this.attr({
73
+ role: 'button',
74
+ tabindex: 0
75
+ });
76
+ return this; // <-- object chaining.
77
+ };
78
+
79
+ // EDITABLE function
80
+ $.fn.editable = function(target, options) {
81
+
82
+ if ('disable' === target) {
83
+ $(this).data('disabled.editable', true);
84
+ return;
85
+ }
86
+ if ('enable' === target) {
87
+ $(this).data('disabled.editable', false);
88
+ return;
89
+ }
90
+ if ('destroy' === target) {
91
+ $(this)
92
+ .unbind($(this).data('event.editable'))
93
+ .removeData('disabled.editable')
94
+ .removeData('event.editable');
95
+ return;
96
+ }
97
+ var settings = $.extend({}, $.fn.editable.defaults, {target:target}, options);
98
+
99
+ /* setup some functions */
100
+ var plugin = $.editable.types[settings.type].plugin || function() { };
101
+ var submit = $.editable.types[settings.type].submit || function() { };
102
+ var buttons = $.editable.types[settings.type].buttons || $.editable.types.defaults.buttons;
103
+ var content = $.editable.types[settings.type].content || $.editable.types.defaults.content;
104
+ var element = $.editable.types[settings.type].element || $.editable.types.defaults.element;
105
+ var reset = $.editable.types[settings.type].reset || $.editable.types.defaults.reset;
106
+ var destroy = $.editable.types[settings.type].destroy || $.editable.types.defaults.destroy;
107
+ var callback = settings.callback || function() { };
108
+ var intercept = settings.intercept || function(s) { return s; };
109
+ var onedit = settings.onedit || function() { };
110
+ var onsubmit = settings.onsubmit || function() { };
111
+ var onreset = settings.onreset || function() { };
112
+ var onerror = settings.onerror || reset;
113
+ var before = settings.before || false;
114
+
115
+ // TOOLTIP
116
+ if (settings.tooltip) {
117
+ $(this).attr('title', settings.tooltip);
118
+ }
119
+
120
+ return this.each(function() {
121
+
122
+ /* Save this to self because this changes when scope changes. */
123
+ var self = this;
124
+
125
+ /* Save so it can be later used by $.editable('destroy') */
126
+ $(this).data('event.editable', settings.event);
127
+
128
+ /* If element is empty add something clickable (if requested) */
129
+ if (!$.trim($(this).html())) {
130
+ $(this).html(settings.placeholder);
131
+ }
132
+
133
+ if ('destroy' === target) {
134
+ destroy.apply($(this).find('form'), [settings, self]);
135
+ return;
136
+ }
137
+
138
+ // EVENT IS FIRED
139
+ $(this).bind(settings.event, function(e) {
140
+
141
+ /* Abort if element is disabled. */
142
+ if (true === $(this).data('disabled.editable')) {
143
+ return;
144
+ }
145
+
146
+ // do nothing if user press Tab again, just go to next element, not into edit mode
147
+ if (e.which === 9) {
148
+ return;
149
+ }
150
+
151
+ /* Prevent throwing an exeption if edit field is clicked again. */
152
+ if (self.editing) {
153
+ return;
154
+ }
155
+
156
+ /* Abort if onedit hook returns false. */
157
+ if (false === onedit.apply(this, [settings, self, e])) {
158
+ return;
159
+ }
160
+
161
+ /* execute the before function if any was specified */
162
+ if (settings.before && jQuery.isFunction(settings.before)) {
163
+ settings.before(e);
164
+ } else if (settings.before && !jQuery.isFunction(settings.before)) {
165
+ throw "The 'before' option needs to be provided as a function!";
166
+ }
167
+
168
+ /* Prevent default action and bubbling. */
169
+ e.preventDefault();
170
+ e.stopPropagation();
171
+
172
+ /* Remove tooltip. */
173
+ if (settings.tooltip) {
174
+ $(self).removeAttr('title');
175
+ }
176
+
177
+ /* Remove placeholder text, replace is here because of IE. */
178
+ if ($(this).html().toLowerCase().replace(/(;|"|\/)/g, '') ===
179
+ settings.placeholder.toLowerCase().replace(/(;|"|\/)/g, '')) {
180
+ $(this).html('');
181
+ }
182
+
183
+ self.editing = true;
184
+ self.revert = $(self).text();
185
+ $(self).html('');
186
+
187
+ /* Create the form object. */
188
+ var form = $('<form />');
189
+
190
+ /* Apply css or style or both. */
191
+ if (settings.cssclass) {
192
+ if ('inherit' === settings.cssclass) {
193
+ form.attr('class', $(self).attr('class'));
194
+ } else {
195
+ form.attr('class', settings.cssclass);
196
+ }
197
+ }
198
+
199
+ if (settings.style) {
200
+ if ('inherit' === settings.style) {
201
+ form.attr('style', $(self).attr('style'));
202
+ /* IE needs the second line or display wont be inherited. */
203
+ form.css('display', $(self).css('display'));
204
+ } else {
205
+ form.attr('style', settings.style);
206
+ }
207
+ }
208
+
209
+ // add a label if it exists
210
+ if (settings.label) {
211
+ form.append('<label>' + settings.label + '</label>');
212
+ }
213
+
214
+ // add an ID to the form
215
+ if (settings.formid) {
216
+ form.attr('id', settings.formid);
217
+ }
218
+
219
+ /* Add main input element to form and store it in input. */
220
+ var input = element.apply(form, [settings, self]);
221
+
222
+ if (settings.inputcssclass) {
223
+ if ('inherit' === settings.inputcssclass) {
224
+ input.attr('class', $(self).attr('class'));
225
+ } else {
226
+ input.attr('class', settings.inputcssclass);
227
+ }
228
+ }
229
+
230
+ /* Set input content via POST, GET, given data or existing value. */
231
+ var input_content;
232
+
233
+ // timeout function
234
+ var t;
235
+ var isSubmitting = false;
236
+
237
+ if (settings.loadurl) {
238
+ t = self.setTimeout(function() {
239
+ input.disabled = true;
240
+ }, 100);
241
+ $(self).html(settings.loadtext);
242
+
243
+ var loaddata = {};
244
+ loaddata[settings.id] = self.id;
245
+ if ($.isFunction(settings.loaddata)) {
246
+ $.extend(loaddata, settings.loaddata.apply(self, [self.revert, settings]));
247
+ } else {
248
+ $.extend(loaddata, settings.loaddata);
249
+ }
250
+ $.ajax({
251
+ type : settings.loadtype,
252
+ url : settings.loadurl,
253
+ data : loaddata,
254
+ async: false,
255
+ cache : false,
256
+ success: function(result) {
257
+ self.clearTimeout(t);
258
+ input_content = result;
259
+ input.disabled = false;
260
+ }
261
+ });
262
+ } else if (settings.data) {
263
+ input_content = settings.data;
264
+ if ($.isFunction(settings.data)) {
265
+ input_content = settings.data.apply(self, [self.revert, settings]);
266
+ }
267
+ } else {
268
+ input_content = self.revert;
269
+ }
270
+ content.apply(form, [input_content, settings, self]);
271
+
272
+ input.attr('name', settings.name);
273
+
274
+ /* adjust the width of the element to account for the margin/padding/border */
275
+ if (settings.width !== 'none') {
276
+ var adj_width = settings.width - (input.outerWidth(true) - settings.width);
277
+ input.width(adj_width);
278
+ }
279
+
280
+ /* Add buttons to the form. */
281
+ buttons.apply(form, [settings, self]);
282
+
283
+ /* Add created form to self. */
284
+ if (settings.showfn && $.isFunction(settings.showfn)) {
285
+ form.hide();
286
+ }
287
+
288
+ // clear the loadtext that we put here before
289
+ $(self).html('');
290
+
291
+ $(self).append(form);
292
+
293
+ // execute the showfn
294
+ if (settings.showfn && $.isFunction(settings.showfn)) {
295
+ settings.showfn(form);
296
+ }
297
+
298
+ /* Attach 3rd party plugin if requested. */
299
+ plugin.apply(form, [settings, self]);
300
+
301
+ /* Focus to first visible form element. */
302
+ form.find(':input:visible:enabled:first').focus();
303
+
304
+ /* Highlight input contents when requested. */
305
+ if (settings.select) {
306
+ input.select();
307
+ }
308
+
309
+ /* discard changes if pressing esc */
310
+ $(this).keydown(function(e) {
311
+ if (e.which === 27) {
312
+ e.preventDefault();
313
+ reset.apply(form, [settings, self]);
314
+ }
315
+ });
316
+
317
+ /* Discard, submit or nothing with changes when clicking outside. */
318
+ /* Do nothing is usable when navigating with tab. */
319
+ if ('cancel' === settings.onblur) {
320
+ input.blur(function(e) {
321
+ /* Prevent canceling if submit was clicked. */
322
+ t = self.setTimeout(function() {
323
+ reset.apply(form, [settings, self]);
324
+ }, 500);
325
+ });
326
+ } else if ('submit' === settings.onblur) {
327
+ input.blur(function(e) {
328
+ /* Prevent double submit if submit was clicked. */
329
+ t = self.setTimeout(function() {
330
+ form.submit();
331
+ }, 200);
332
+ });
333
+ } else if ($.isFunction(settings.onblur)) {
334
+ input.blur(function(e) {
335
+ // reset the form if the onblur function returns false
336
+ if (false === settings.onblur.apply(self, [input.val(), settings, form])) {
337
+ reset.apply(form, [settings, self]);
338
+ }
339
+ });
340
+ }
341
+
342
+ form.submit(function(e) {
343
+
344
+ /* Do no submit. */
345
+ e.preventDefault();
346
+ e.stopPropagation();
347
+
348
+ if (isSubmitting) {
349
+ // we are already submitting! Stop right here.
350
+ return false;
351
+ } else {
352
+ isSubmitting = true;
353
+ }
354
+
355
+ if (t) {
356
+ self.clearTimeout(t);
357
+ }
358
+
359
+ /* Call before submit hook. */
360
+ /* If it returns false abort submitting. */
361
+ isSubmitting = false !== onsubmit.apply(form, [settings, self]);
362
+ if (isSubmitting) {
363
+ /* Custom inputs call before submit hook. */
364
+ /* If it returns false abort submitting. */
365
+ isSubmitting = false !== submit.apply(form, [settings, self]);
366
+ if (isSubmitting) {
367
+
368
+ /* Check if given target is function */
369
+ if ($.isFunction(settings.target)) {
370
+ /* Callback function to handle the target reponse */
371
+ var responseHandler = function(value, complete) {
372
+ isSubmitting = false;
373
+ if (false !== complete) {
374
+ $(self).html(value);
375
+ self.editing = false;
376
+ callback.apply(self, [self.innerHTML, settings]);
377
+ if (!$.trim($(self).html())) {
378
+ $(self).html(settings.placeholder);
379
+ }
380
+ }
381
+ };
382
+ /* Call the user target function */
383
+ var userTarget = settings.target.apply(self, [input.val(), settings, responseHandler]);
384
+ /* Handle the target function return for compatibility */
385
+ if (false !== userTarget && undefined !== userTarget) {
386
+ responseHandler(userTarget, userTarget);
387
+ }
388
+
389
+ } else {
390
+ /* Add edited content and id of edited element to POST. */
391
+ var submitdata = {};
392
+ submitdata[settings.name] = input.val();
393
+ submitdata[settings.id] = self.id;
394
+ /* Add extra data to be POST:ed. */
395
+ if ($.isFunction(settings.submitdata)) {
396
+ $.extend(submitdata, settings.submitdata.apply(self, [self.revert, settings, submitdata]));
397
+ } else {
398
+ $.extend(submitdata, settings.submitdata);
399
+ }
400
+
401
+ /* Quick and dirty PUT support. */
402
+ if ('PUT' === settings.method) {
403
+ submitdata._method = 'put';
404
+ }
405
+
406
+ // SHOW INDICATOR
407
+ $(self).html(settings.indicator);
408
+
409
+ /* Defaults for ajaxoptions. */
410
+ var ajaxoptions = {
411
+ type : 'POST',
412
+ complete: function (xhr, status) {
413
+ isSubmitting = false;
414
+ },
415
+ data : submitdata,
416
+ dataType: 'html',
417
+ url : settings.target,
418
+ success : function(result, status) {
419
+
420
+ // INTERCEPT
421
+ result = intercept.apply(self, [result, status]);
422
+
423
+ if (ajaxoptions.dataType === 'html') {
424
+ $(self).html(result);
425
+ }
426
+ self.editing = false;
427
+ callback.apply(self, [result, settings, submitdata]);
428
+ if (!$.trim($(self).html())) {
429
+ $(self).html(settings.placeholder);
430
+ }
431
+ },
432
+ error : function(xhr, status, error) {
433
+ onerror.apply(form, [settings, self, xhr]);
434
+ }
435
+ };
436
+
437
+ /* Override with what is given in settings.ajaxoptions. */
438
+ $.extend(ajaxoptions, settings.ajaxoptions);
439
+ $.ajax(ajaxoptions);
440
+ }
441
+ }
442
+ }
443
+
444
+ /* Show tooltip again. */
445
+ $(self).attr('title', settings.tooltip);
446
+ return false;
447
+ });
448
+ });
449
+
450
+ // PRIVILEGED METHODS
451
+
452
+ // RESET
453
+ self.reset = function(form) {
454
+ /* Prevent calling reset twice when blurring. */
455
+ if (self.editing) {
456
+ /* Before reset hook, if it returns false abort reseting. */
457
+ if (false !== onreset.apply(form, [settings, self])) {
458
+ $(self).text(self.revert);
459
+ self.editing = false;
460
+ if (!$.trim($(self).html())) {
461
+ $(self).html(settings.placeholder);
462
+ }
463
+ /* Show tooltip again. */
464
+ if (settings.tooltip) {
465
+ $(self).attr('title', settings.tooltip);
466
+ }
467
+ }
468
+ }
469
+ };
470
+
471
+ // DESTROY
472
+ self.destroy = function(form) {
473
+ $(self)
474
+ .unbind($(self).data('event.editable'))
475
+ .removeData('disabled.editable')
476
+ .removeData('event.editable');
477
+
478
+ self.clearTimeouts();
479
+
480
+ if (self.editing) {
481
+ reset.apply(form, [settings, self]);
482
+ }
483
+ };
484
+
485
+ // CLEARTIMEOUT
486
+ self.clearTimeout = function(t) {
487
+ var timeouts = $(self).data('timeouts');
488
+ clearTimeout(t);
489
+ if(timeouts) {
490
+ var i = timeouts.indexOf(t);
491
+ if(i > -1) {
492
+ timeouts.splice(i, 1);
493
+ if(timeouts.length <= 0) {
494
+ $(self).removeData('timeouts');
495
+ }
496
+ } else {
497
+ console.warn('jeditable clearTimeout could not find timeout '+t);
498
+ }
499
+ }
500
+ };
501
+
502
+ // CLEAR ALL TIMEOUTS
503
+ self.clearTimeouts = function () {
504
+ var timeouts = $(self).data('timeouts');
505
+ if(timeouts) {
506
+ for(var i = 0, n = timeouts.length; i < n; ++i) {
507
+ clearTimeout(timeouts[i]);
508
+ }
509
+ timeouts.length = 0;
510
+ $(self).removeData('timeouts');
511
+ }
512
+ };
513
+
514
+ // SETTIMEOUT
515
+ self.setTimeout = function(callback, time) {
516
+ var timeouts = $(self).data('timeouts');
517
+ var t = setTimeout(function() {
518
+ callback();
519
+ self.clearTimeout(t);
520
+ }, time);
521
+ if(!timeouts) {
522
+ timeouts = [];
523
+ $(self).data('timeouts', timeouts);
524
+ }
525
+ timeouts.push(t);
526
+ return t;
527
+ };
528
+ });
529
+ };
530
+
531
+ var _supportInType = function (type) {
532
+ var i = document.createElement('input');
533
+ i.setAttribute('type', type);
534
+ return i.type !== 'text' ? type : 'text';
535
+ };
536
+
537
+
538
+ $.editable = {
539
+ types: {
540
+ defaults: {
541
+ element : function(settings, original) {
542
+ var input = $('<input type="hidden"></input>');
543
+ $(this).append(input);
544
+ return(input);
545
+ },
546
+ content : function(string, settings, original) {
547
+ $(this).find(':input:first').val(string);
548
+ },
549
+ reset : function(settings, original) {
550
+ original.reset(this);
551
+ },
552
+ destroy: function(settings, original) {
553
+ original.destroy(this);
554
+ },
555
+ buttons : function(settings, original) {
556
+ var form = this;
557
+ var submit;
558
+ if (settings.submit) {
559
+ /* If given html string use that. */
560
+ if (settings.submit.match(/>$/)) {
561
+ submit = $(settings.submit).click(function() {
562
+ if (submit.attr('type') !== 'submit') {
563
+ form.submit();
564
+ }
565
+ });
566
+ /* Otherwise use button with given string as text. */
567
+ } else {
568
+ submit = $('<button type="submit" />');
569
+ submit.html(settings.submit);
570
+ if (settings.submitcssclass) {
571
+ submit.addClass(settings.submitcssclass);
572
+ }
573
+ }
574
+ $(this).append(submit);
575
+ }
576
+ if (settings.cancel) {
577
+ var cancel;
578
+ /* If given html string use that. */
579
+ if (settings.cancel.match(/>$/)) {
580
+ cancel = $(settings.cancel);
581
+ /* otherwise use button with given string as text */
582
+ } else {
583
+ cancel = $('<button type="cancel" />');
584
+ cancel.html(settings.cancel);
585
+ if (settings.cancelcssclass) {
586
+ cancel.addClass(settings.cancelcssclass);
587
+ }
588
+ }
589
+ $(this).append(cancel);
590
+
591
+ $(cancel).click(function(event) {
592
+ var reset;
593
+ if ($.isFunction($.editable.types[settings.type].reset)) {
594
+ reset = $.editable.types[settings.type].reset;
595
+ } else {
596
+ reset = $.editable.types.defaults.reset;
597
+ }
598
+ reset.apply(form, [settings, original]);
599
+ return false;
600
+ });
601
+ }
602
+ }
603
+ },
604
+ text: {
605
+ element : function(settings, original) {
606
+ var input = $('<input />').attr({
607
+ autocomplete: 'off',
608
+ list: settings.list,
609
+ maxlength: settings.maxlength,
610
+ pattern: settings.pattern,
611
+ placeholder: settings.placeholder,
612
+ tooltip: settings.tooltip,
613
+ type: 'text'
614
+ });
615
+
616
+ if (settings.width !== 'none') {
617
+ input.css('width', settings.width);
618
+ }
619
+
620
+ if (settings.height !== 'none') {
621
+ input.css('height', settings.height);
622
+ }
623
+
624
+ if (settings.size) {
625
+ input.attr('size', settings.size);
626
+ }
627
+
628
+ if (settings.maxlength) {
629
+ input.attr('maxlength', settings.maxlength);
630
+ }
631
+
632
+ $(this).append(input);
633
+ return(input);
634
+ }
635
+ },
636
+
637
+ // TEXTAREA
638
+ textarea: {
639
+ element : function(settings, original) {
640
+ var textarea = $('<textarea></textarea>');
641
+ if (settings.rows) {
642
+ textarea.attr('rows', settings.rows);
643
+ } else if (settings.height !== 'none') {
644
+ textarea.height(settings.height);
645
+ }
646
+ if (settings.cols) {
647
+ textarea.attr('cols', settings.cols);
648
+ } else if (settings.width !== 'none') {
649
+ textarea.width(settings.width);
650
+ }
651
+
652
+ if (settings.maxlength) {
653
+ textarea.attr('maxlength', settings.maxlength);
654
+ }
655
+
656
+ $(this).append(textarea);
657
+ return(textarea);
658
+ }
659
+ },
660
+
661
+ // SELECT
662
+ select: {
663
+ element : function(settings, original) {
664
+ var select = $('<select />');
665
+
666
+ if (settings.multiple) {
667
+ select.attr('multiple', 'multiple');
668
+ }
669
+
670
+ $(this).append(select);
671
+ return(select);
672
+ },
673
+ content : function(data, settings, original) {
674
+ var json;
675
+ // If it is string assume it is json
676
+ if (String === data.constructor) {
677
+ json = JSON.parse(data);
678
+ } else {
679
+ // Otherwise assume it is a hash already
680
+ json = data;
681
+ }
682
+
683
+ // Create tuples for sorting
684
+ var tuples = [];
685
+ var key;
686
+
687
+ if (Array.isArray(json) && json.every(Array.isArray)) {
688
+ // Process list of tuples
689
+ tuples = json // JSON already contains list of [key, value]
690
+ json = {};
691
+ tuples.forEach(function(e) {
692
+ json[e[0]] = e[1]; // Recreate json object to comply with following code
693
+ });
694
+ } else {
695
+ // Process object
696
+ for (key in json) {
697
+ tuples.push([key, json[key]]); // Store: [key, value]
698
+ }
699
+ }
700
+
701
+ if (settings.sortselectoptions) {
702
+ // sort it
703
+ tuples.sort(function (a, b) {
704
+ a = a[1];
705
+ b = b[1];
706
+ return a < b ? -1 : (a > b ? 1 : 0);
707
+ });
708
+ }
709
+ // now add the options to our select
710
+ var option;
711
+ for (var i = 0; i < tuples.length; i++) {
712
+ key = tuples[i][0];
713
+ var value = tuples[i][1];
714
+
715
+ if (!json.hasOwnProperty(key)) {
716
+ continue;
717
+ }
718
+
719
+ if (key !== 'selected') {
720
+ option = $('<option />').val(key).append(value);
721
+
722
+ // add the selected prop if it's the same as original or if the key is 'selected'
723
+ if (json.selected === key || key === $.trim(original.revert)) {
724
+ $(option).prop('selected', 'selected');
725
+ }
726
+
727
+ $(this).find('select').append(option);
728
+ }
729
+ }
730
+
731
+ // submit on change if no submit button defined
732
+ if (!settings.submit) {
733
+ var form = this;
734
+ $(this).find('select').change(function() {
735
+ form.submit();
736
+ });
737
+ }
738
+ }
739
+ },
740
+
741
+ // NUMBER
742
+ number: {
743
+ element: function (settings, original) {
744
+ var input = $('<input />').attr({
745
+ maxlength: settings.maxlength,
746
+ placeholder: settings.placeholder,
747
+ min : settings.min,
748
+ max : settings.max,
749
+ step: settings.step,
750
+ tooltip: settings.tooltip,
751
+ type: _supportInType('number')
752
+ });
753
+ if (settings.width !== 'none') {
754
+ input.css('width', settings.width);
755
+ }
756
+ $(this).append(input);
757
+ return input;
758
+ }
759
+ },
760
+
761
+ // EMAIL
762
+ email: {
763
+ element: function (settings, original) {
764
+ var input = $('<input />').attr({
765
+ maxlength: settings.maxlength,
766
+ placeholder: settings.placeholder,
767
+ tooltip: settings.tooltip,
768
+ type: _supportInType('email')
769
+ });
770
+ if (settings.width !== 'none') {
771
+ input.css('width', settings.width);
772
+ }
773
+ $(this).append(input);
774
+ return input;
775
+ }
776
+ },
777
+
778
+ // URL
779
+ url: {
780
+ element: function (settings, original) {
781
+ var input = $('<input />').attr({
782
+ maxlength: settings.maxlength,
783
+ pattern: settings.pattern,
784
+ placeholder: settings.placeholder,
785
+ tooltip: settings.tooltip,
786
+ type: _supportInType('url')
787
+ });
788
+ if (settings.width !== 'none') {
789
+ input.css('width', settings.width);
790
+ }
791
+ $(this).append(input);
792
+ return input;
793
+ }
794
+ }
795
+ },
796
+
797
+ // add new input type
798
+ addInputType: function(name, input) {
799
+ $.editable.types[name] = input;
800
+ }
801
+ };
802
+
803
+ /* Publicly accessible defaults. */
804
+ $.fn.editable.defaults = {
805
+ name : 'value',
806
+ id : 'id',
807
+ type : 'text',
808
+ width : 'auto',
809
+ height : 'auto',
810
+ // Keyboard accessibility - use mouse click OR press any key to enable editing
811
+ event : 'click.editable keydown.editable',
812
+ onblur : 'cancel',
813
+ tooltip : 'Click to edit',
814
+ loadtype : 'GET',
815
+ loadtext : 'Loading...',
816
+ placeholder: 'Click to edit',
817
+ sortselectoptions: false,
818
+ loaddata : {},
819
+ submitdata : {},
820
+ ajaxoptions: {}
821
+ };
822
+
823
+ })(jQuery);
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Depends on Masked Input jQuery plugin by Josh Bush:
3
+ * http://digitalbush.com/projects/masked-input-plugin
4
+ *
5
+ * @file masked input plugin for jquery-jeditable
6
+ * @author Mika Tuupola, Nicolas CARPi
7
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
8
+ * @licence MIT (see LICENCE file)
9
+ * @copyright © 2007 Mika Tuupola, Nicolas CARPi
10
+ * @name PluginMaskedInput
11
+ */
12
+ 'use strict';
13
+ (function ($) {
14
+ $.editable.addInputType('masked', {
15
+ element : function(settings, original) {
16
+ var input = $('<input />').attr({
17
+ autocomplete: 'off',
18
+ list: settings.list,
19
+ maxlength: settings.maxlength,
20
+ pattern: settings.pattern,
21
+ placeholder: settings.placeholder,
22
+ tooltip: settings.tooltip,
23
+ type: 'text'
24
+ }).mask(settings.mask);
25
+
26
+ if (settings.width !== 'none') {
27
+ input.css('width', settings.width);
28
+ }
29
+
30
+ if (settings.height !== 'none') {
31
+ input.css('height', settings.height);
32
+ }
33
+
34
+ if (settings.size) {
35
+ input.attr('size', settings.size);
36
+ }
37
+
38
+ if (settings.maxlength) {
39
+ input.attr('maxlength', settings.maxlength);
40
+ }
41
+
42
+ $(this).append(input);
43
+ return(input);
44
+ }
45
+ });
46
+ })(jQuery);
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @file timepicker plugin for jquery-jeditable
3
+ * @author Mika Tuupola, Nicolas CARPi
4
+ * @home https://github.com/NicolasCARPi/jquery_jeditable
5
+ * @licence MIT (see LICENCE file)
6
+ * @copyright © 2007 Mika Tuupola, Nicolas CARPi
7
+ * @name PluginTimepicker
8
+ */
9
+ 'use strict';
10
+ (function ($) {
11
+ $.editable.addInputType('time', {
12
+ /* Create input element. */
13
+ element : function(settings, original) {
14
+ /* Create and pulldowns for hours and minutes. Append them to */
15
+ /* form which is accessible as variable this. */
16
+ var hourselect = $('<select id="hour_" />');
17
+ var minselect = $('<select id="min_" />');
18
+
19
+ var option;
20
+
21
+ for (var hour=0; hour <= 23; hour++) {
22
+ if (hour < 10) {
23
+ hour = '0' + hour;
24
+ }
25
+ option = $('<option />').val(hour).append(hour);
26
+ hourselect.append(option);
27
+ }
28
+ $(this).append(hourselect);
29
+
30
+ for (var min=0; min <= 45; min = parseInt(min, 10) + 15) {
31
+ if (min < 10) {
32
+ min = '0' + min;
33
+ }
34
+ option = $('<option />').val(min).append(min);
35
+ minselect.append(option);
36
+ }
37
+ $(this).append(minselect);
38
+
39
+ /* Last create an hidden input. This is returned to plugin. It will */
40
+ /* later hold the actual value which will be submitted to server. */
41
+ var hidden = $('<input type="hidden" />');
42
+ $(this).append(hidden);
43
+ return(hidden);
44
+ },
45
+ /* Set content / value of previously created input element. */
46
+ content : function(string, settings, original) {
47
+ /* Select correct hour and minute in pulldowns. */
48
+ var hour = parseInt(string.substr(0,2), 10);
49
+ var min = parseInt(string.substr(3,2), 10);
50
+
51
+ $('#hour_', this).children().each(function() {
52
+ if (hour === $(this).val()) {
53
+ $(this).attr('selected', 'selected');
54
+ }
55
+ });
56
+ $('#min_', this).children().each(function() {
57
+ if (min === $(this).val()) {
58
+ $(this).attr('selected', 'selected');
59
+ }
60
+ });
61
+
62
+ },
63
+ /* Call before submit hook. */
64
+ submit: function (settings, original) {
65
+ /* Take values from hour and minute pulldowns. Create string such as */
66
+ /* 13:45 from them. Set value of the hidden input field to this string. */
67
+ var value = $('#hour_').val() + ':' + $('#min_').val();
68
+ $('input', this).val(value);
69
+ }
70
+ });
71
+ })(jQuery);
@@ -3,4 +3,9 @@
3
3
  //= require themes/metronic/theme/vendors.bundle.js
4
4
  //= require jquery-ui
5
5
  //= require common/datatables/datatables.js
6
+ //= require common/jquery-jeditable/jquery.jeditable.js
7
+ //= require common/jquery-jeditable/jquery.datepicker.js
8
+ //= require common/jquery-jeditable/jquery.checkbox.js
9
+ //= require common/jquery-jeditable/jquery.masked.js
10
+ //= require common/jquery-jeditable/jquery.time.js
6
11
  //= require rails_sortable
@@ -1,3 +1,3 @@
1
1
  module PhcthemesAdminPanelPack
2
- VERSION = '1.2.3'
2
+ VERSION = '1.2.4'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phcthemes_admin_panel_pack
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - PHCDevworks
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-29 00:00:00.000000000 Z
11
+ date: 2019-09-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -351,6 +351,13 @@ files:
351
351
  - app/assets/javascripts/common/isotope/isotope.pkgd.js
352
352
  - app/assets/javascripts/common/jquery-countdown/jquery.countdown.js
353
353
  - app/assets/javascripts/common/jquery-filterizer/jquery.filterizr.min.js
354
+ - app/assets/javascripts/common/jquery-jeditable/jquery.jeditable.autogrow.js
355
+ - app/assets/javascripts/common/jquery-jeditable/jquery.jeditable.charcounter.js
356
+ - app/assets/javascripts/common/jquery-jeditable/jquery.jeditable.checkbox.js
357
+ - app/assets/javascripts/common/jquery-jeditable/jquery.jeditable.datepicker.js
358
+ - app/assets/javascripts/common/jquery-jeditable/jquery.jeditable.js
359
+ - app/assets/javascripts/common/jquery-jeditable/jquery.jeditable.masked.js
360
+ - app/assets/javascripts/common/jquery-jeditable/jquery.jeditable.time.js
354
361
  - app/assets/javascripts/common/jquery-jvectormap/jquery-jvectormap.js
355
362
  - app/assets/javascripts/common/jquery-placeholder/jquery.placeholder.js
356
363
  - app/assets/javascripts/common/jquery-slimscroll/jquery.slimscroll.js