PluginProbe
Orderable – Restaurant & Food Ordering System / 1.19.0
Orderable – Restaurant & Food Ordering System v1.19.0
0.1.4 0.1.5 0.2.0 1.0.0 1.1.0 1.1.1 1.10.0 1.10.1 1.11.0 1.12.0 1.12.1 1.12.2 1.13.0 1.14.0 1.15.0 1.16.0 1.17.0 1.17.1 1.18.0 1.19.0 1.19.1 1.19.2 1.2.0 1.20.0 1.20.1 All 44 releases
orderable / assets / admin / js / main.js

main.js in Orderable – Restaurant & Food Ordering System 1.19.0, at assets/admin/js/main.js

579 lines 20.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1
2 (function ($, document) {
3 'use strict';
4
5 const orderable_layouts = {
6 /**
7 * On doc ready.
8 */
9 on_ready() {
10 /**
11 * On change layout setting.
12 */
13 $(document.body).on('change', '.orderable-table--product-lists input, .orderable-table--product-lists select', function (e) {
14 const $field = $(this),
15 $parent = $field.closest('.orderable-table__row--repeatable'),
16 $shortcode = $parent.find('.orderable-field--product-list-shortcode');
17 const default_shortcode_parameters = {
18 categories: '',
19 layout: 'grid',
20 images: 'true'
21 };
22 const shortcode_parameters = {
23 categories: $parent.find('.orderable-select--categories').val().toString(),
24 layout: $parent.find('.orderable-select--layout').val().toString(),
25 images: $parent.find('.orderable-checkbox--images').is(':checked').toString()
26 };
27 let shortcode = '[orderable';
28 $.each(shortcode_parameters, function (key, value) {
29 if (value === default_shortcode_parameters[key]) {
30 return;
31 }
32 shortcode += ' ' + key + '="' + value + '"';
33 });
34 shortcode += ']';
35 $shortcode.val(shortcode);
36 });
37 }
38 };
39 $(document).ready(orderable_layouts.on_ready);
40 })(jQuery, document);
41 (function ($, document) {
42 'use strict';
43
44 var orderable_multiselects = {
45 /**
46 * On doc ready.
47 */
48 on_ready() {
49 orderable_multiselects.init($('.orderable-select--multi-select'));
50
51 /**
52 * Init multiselects trigger.
53 */
54 $(document).on('orderable-init-multiselects', function (e, data) {
55 if (typeof data.selects === 'undefined') {
56 return;
57 }
58 orderable_multiselects.init(data.selects);
59 });
60
61 /**
62 * Destroy mutliselects trigger.
63 */
64 $(document).on('orderable-destroy-multiselects', function (e, data) {
65 if (typeof data.selects === 'undefined') {
66 return;
67 }
68 orderable_multiselects.destroy(data.selects);
69 });
70 },
71 /**
72 * Init multiselects.
73 *
74 * @param $selects
75 */
76 init($selects) {
77 $selects.multiSelect();
78 $selects.each(function (index, select) {
79 const $select = $(select),
80 $multi_select = $select.siblings('.multi-select-container'),
81 $none_option = $multi_select.find('.multi-select-menuitem--none'),
82 none_label = $select.data('orderable-select-none-option');
83 $none_option.remove();
84 const $labels = $multi_select.find('.multi-select-menuitem'),
85 $disabled_labels = $multi_select.find('.multi-select-menuitems input:disabled').parent();
86 $labels.show();
87 $disabled_labels.hide();
88 if ($labels.length === $disabled_labels.length && none_label) {
89 $multi_select.find('.multi-select-menuitems').append('<span class="multi-select-menuitem multi-select-menuitem--none">' + none_label + '</span>');
90 }
91 });
92 },
93 /**
94 * Destroy multiselects.
95 *
96 * @param $selects
97 */
98 destroy($selects) {
99 const $multi_selects = $selects.siblings('.multi-select-container');
100 $multi_selects.remove();
101 $selects.data('plugin_multiSelect', false);
102 }
103 };
104 $(document).ready(orderable_multiselects.on_ready);
105 })(jQuery, document);
106 (function ($, document) {
107 'use strict';
108
109 var orderable_onboard = {
110 /**
111 * On doc ready.
112 */
113 on_ready() {
114 $(document.body).on('iconic_onboard_wait_complete', orderable_onboard.init.woo_installed);
115 },
116 /**
117 * Onboard methods.
118 */
119 init: {
120 /**
121 * After woo installed.
122 * @param event
123 * @param data
124 */
125 woo_installed(event, data) {
126 if (typeof data === 'undefined') {
127 return;
128 }
129 if ('install_plugin' !== data.wait_event) {
130 return;
131 }
132 if ('woocommerce' !== data.json.plugin_data['repo-slug']) {
133 return;
134 }
135 orderable_onboard.populate_woo_fields();
136 }
137 },
138 /**
139 * Populate woo fields.
140 */
141 populate_woo_fields() {
142 const fields = {
143 default_country: {
144 type: 'select',
145 selector: 'select#iconic_onboard_default_country'
146 },
147 business_name: {
148 type: 'text',
149 selector: 'input#iconic_onboard_business_name'
150 },
151 business_address: {
152 type: 'text',
153 selector: 'input#iconic_onboard_business_address'
154 },
155 business_address_2: {
156 type: 'text',
157 selector: 'input#iconic_onboard_business_address_2'
158 },
159 business_city: {
160 type: 'text',
161 selector: 'input#iconic_onboard_business_city'
162 },
163 business_postcode: {
164 type: 'text',
165 selector: 'input#iconic_onboard_business_postcode'
166 }
167 };
168 const data = {
169 action: 'orderable_get_onboard_woo_fields',
170 fields
171 };
172 $.post(ajaxurl, data).done(function (response) {
173 try {
174 if (response.success) {
175 $.each(fields, function (index, field) {
176 const $field = $(field.selector);
177 if ($field.length <= 0 || typeof response.data[index] === 'undefined') {
178 return;
179 }
180 if ('select' === field.type) {
181 $field.html(response.data[index]);
182 } else {
183 $field.val(response.data[index]);
184 }
185 });
186 }
187 } catch (ex) {
188 console.log(response);
189 console.log(ex);
190 alert("Couldn't save.");
191 }
192 }).fail(function () {
193 alert("Couldn't save. Are you connected to the internet? ");
194 }).always(function () {});
195 }
196 };
197 $(document).ready(orderable_onboard.on_ready);
198 })(jQuery, document);
199 jQuery(document).ready(function () {
200 function show_orderable_pointer(id) {
201 const pointer = orderable_pointers.pointers[id];
202 if (pointer === undefined) {
203 return;
204 }
205 const options = jQuery.extend(pointer.options, {
206 pointerClass: 'wp-pointer wc-pointer orderable-pointer',
207 close() {
208 jQuery.post(orderable_pointers.ajax_url, {
209 pointer: id,
210 action: 'dismiss-wp-pointer'
211 });
212 if (pointer && pointer.next && orderable_pointers.pointers[pointer.next]) {
213 setTimeout(function () {
214 show_orderable_pointer(pointer.next);
215 }, 250);
216 }
217 },
218 skip() {
219 const active_pointers = document.querySelectorAll('.wp-pointer.orderable-pointer');
220 Array.from(active_pointers).forEach(function (active_pointer) {
221 active_pointer.remove();
222 });
223 jQuery.post(orderable_pointers.ajax_url, {
224 pointer: 'orderable-tour-dismissed',
225 action: 'dismiss-wp-pointer'
226 });
227 },
228 buttons(event, t) {
229 const next = pointer && pointer.next && orderable_pointers.pointers[pointer.next] ? orderable_pointers.i18n.next : orderable_pointers.i18n.close,
230 button = jQuery('<a class="button button-primary" href="#">' + next + '</a>'),
231 wrapper = jQuery('<div class="wc-pointer-buttons" />');
232 const skip = orderable_pointers.i18n.skip,
233 skipButton = jQuery('<a class="button button-secondary" href="#">' + skip + '</a>');
234 button.bind('click.pointer', function (e) {
235 e.preventDefault();
236 t.element.pointer('close');
237 });
238 skipButton.bind('click.pointer', function (e) {
239 e.preventDefault();
240 pointer.options.skip();
241 });
242 wrapper.append(button);
243 wrapper.append(skipButton);
244 return wrapper;
245 }
246 });
247 const this_pointer = jQuery(pointer.target).pointer(options);
248 this_pointer.pointer('open');
249 if (pointer.next_trigger) {
250 jQuery(pointer.next_trigger.target).on(pointer.next_trigger.event, function () {
251 setTimeout(function () {
252 this_pointer.pointer('close');
253 }, 400);
254 });
255 }
256 }
257 function init_orderable_pointers() {
258 if (typeof orderable_pointers === 'undefined') {
259 return;
260 }
261 jQuery.each(orderable_pointers.pointers, function (i) {
262 show_orderable_pointer(i);
263 return false;
264 });
265 }
266 setTimeout(init_orderable_pointers, 800);
267 });
268 (function ($, document) {
269 'use strict';
270
271 var orderable_pro = {
272 /**
273 * On ready.
274 */
275 on_ready() {
276 $(document.body).on('orderable-pro-modal', orderable_pro.trigger_pro_modal);
277 },
278 /**
279 * Trigger pro modal.
280 */
281 trigger_pro_modal() {
282 console.log('Pro only.');
283 tb_show('Pro Feature', '#TB_inline?inlineId=orderable-pro-modal');
284 }
285 };
286 $(document).ready(orderable_pro.on_ready);
287 })(jQuery, document);
288 (function ($, document) {
289 'use strict';
290
291 const orderable_timings = {
292 /**
293 * On doc ready.
294 */
295 on_ready() {
296 /**
297 * On enable day.
298 */
299 $(document.body).on('change', '.orderable-enable-day', function (e) {
300 const $checkbox = $(this),
301 day = $checkbox.data('orderable-day'),
302 checked = $checkbox.is(':checked'),
303 $day_selects = $('.orderable-select--days');
304 $day_selects.find('option[value="' + day + '"]').attr('disabled', !checked).attr('selected', false);
305 $(document).trigger('orderable-destroy-multiselects', {
306 selects: $day_selects
307 });
308 $(document).trigger('orderable-init-multiselects', {
309 selects: $day_selects
310 });
311 });
312
313 /**
314 * Toggle delivery/pickup service hours.
315 */
316 $(document.body).on('change', '[name*="\\[store_general_services\\]"]', function (e) {
317 const $checkbox = $(this),
318 service = $checkbox.val(),
319 checked = $checkbox.is(':checked'),
320 $elements = $('.orderable-toggle-wrapper--' + service + ', button[data-orderable-wrapper="' + service + '"]'),
321 visibility_class = 'orderable-ui-hide',
322 $select_services_notice = $('.orderable-notice--select-service');
323
324 // Toggle visibility of service hours.
325 if (checked) {
326 $elements.removeClass(visibility_class);
327 } else {
328 $elements.addClass(visibility_class);
329 }
330 const $selected_services = $('[name*="\\[store_general_services\\]"]:checked');
331
332 // If no services selected, show message.
333 if ($selected_services.length <= 0) {
334 $select_services_notice.removeClass(visibility_class);
335 } else {
336 $select_services_notice.addClass(visibility_class);
337
338 // Toggle first enabled service.
339 const active_service = $selected_services.eq(0).val(),
340 $active_service_button = $('button[data-orderable-wrapper="' + active_service + '"]');
341 $active_service_button.click();
342 }
343
344 // If only pickup selected, toggle "same as delivery" checkbox.
345 let $same_as_delivery_checkbox = $('#orderable_settings_store_general_service_hours_pickup_same'),
346 default_state = $same_as_delivery_checkbox.data('default-state');
347 if (typeof default_state === 'undefined') {
348 default_state = $same_as_delivery_checkbox.is(':checked');
349 $same_as_delivery_checkbox.data('default-state', default_state);
350 }
351 if (1 === $selected_services.length && 'pickup' === $selected_services.val()) {
352 $same_as_delivery_checkbox.prop('checked', false).parent().addClass(visibility_class);
353 $(document.body).trigger('orderable-toggle-element', {
354 trigger_element: $same_as_delivery_checkbox[0],
355 add_class: false
356 });
357 } else {
358 $same_as_delivery_checkbox.prop('checked', default_state).parent().removeClass(visibility_class);
359 $(document.body).trigger('orderable-toggle-element', {
360 trigger_element: $same_as_delivery_checkbox[0],
361 add_class: default_state
362 });
363 }
364 $(document).trigger('orderable-add-last-row-class');
365 });
366
367 /**
368 * Set default state of "Same as delivery service hours" checkbox.
369 */
370 $(document.body).on('change', '#orderable_settings_store_general_service_hours_pickup_same', function (e) {
371 $(this).data('default-state', $(this).is(':checked'));
372 });
373
374 /**
375 * Toggle open hours day.
376 */
377 $('.orderable-enable-day').on('change', function () {
378 const $row = jQuery(this).closest('tr'),
379 hidden_class = 'orderable-table__row--hidden';
380 $row.toggleClass(hidden_class, !this.checked);
381 });
382 }
383 };
384 $(document).ready(orderable_timings.on_ready);
385 })(jQuery, document);
386 (function ($, document) {
387 'use strict';
388
389 var orderable_triggers = {
390 /**
391 * On doc ready.
392 */
393 on_ready() {
394 /**
395 * On trigger click or change.
396 */
397 $(document.body).on('click change', '[data-orderable-trigger]', function (e) {
398 const $trigger_element = $(this),
399 trigger = $trigger_element.data('orderable-trigger');
400 if ('click' === e.type && ($trigger_element.is('select') || $trigger_element.is('input') || $trigger_element.is('label'))) {
401 return;
402 }
403 if ($trigger_element.is('button') || $trigger_element.is('a')) {
404 e.preventDefault();
405 }
406 $(document.body).trigger('orderable-' + trigger, {
407 trigger_element: $trigger_element
408 });
409 });
410
411 /**
412 * On new row.
413 */
414 $(document.body).on('orderable-new-row', function (e, data) {
415 const $button = $(data.trigger_element),
416 $target = $($button.data('orderable-target')),
417 $body = $target.find('.orderable-table__body'),
418 $row = $body.find('.orderable-table__row--repeatable:last-child'),
419 index = parseInt($row.data('orderable-index')),
420 time_slot = parseInt($row.data('orderable-time-slot')),
421 new_index = index + 1,
422 row_html = $row[0]?.outerHTML.replace(/\[\d+\]/gm, '[' + new_index + ']').replace(/data-orderable-index="\d+"/gm, 'data-orderable-index="' + new_index + '"').replace(/data-orderable-time-slot="\d+"/gm, 'data-orderable-time-slot=""');
423 $body.append(row_html);
424 const $new_row = $body.find('.orderable-table__row--repeatable:last-child');
425
426 // Remove delivery zone rows.
427 $new_row.find('.orderable-table-delivery-zones-row__item').remove();
428 $new_row.find('.orderable-table-delivery-zones-row__message').remove();
429 $new_row.find('.orderable-table-delivery-zones-row__no-items').show();
430
431 // Reset inputs.
432 $new_row.find('input').not('input[type="checkbox"]').val('');
433 $new_row.find('input[type="hidden"][name^="service_hours"]').val('');
434
435 // Reset datepickers.
436 const $datepickers = $new_row.find('.hasDatepicker');
437 $datepickers.each(function (index, datepicker) {
438 const $datepicker = $(datepicker);
439
440 // Remove datepicker class and datepicker generated ID.
441 $datepicker.removeClass('hasDatepicker').attr('id', '');
442 });
443
444 // Reset selects.
445 const $selects = $new_row.find('select');
446 $selects.each(function (index, select) {
447 const $select = $(select),
448 $blank_option = $select.find('option[value=""]'),
449 is_multi_select = $select.hasClass('orderable-select--multi-select'),
450 value = $blank_option.length || is_multi_select ? '' : $select.find('option:first-child').val();
451 $select.val(value);
452 if (is_multi_select) {
453 $select.change();
454 }
455 });
456
457 // Checkboxes.
458 $new_row.find('input[type="checkbox"]').prop('checked', false);
459
460 // Remove multi select container and reinit.
461 $new_row.find('.multi-select-container').remove();
462 $(document).trigger('orderable-init-multiselects', {
463 selects: $body.find('.orderable-select--multi-select')
464 });
465
466 // Trigger select toggles.
467 $body.find('[data-orderable-trigger="toggle-element-select"]').change();
468 $(document).trigger('orderable-add-last-row-class');
469 });
470
471 /**
472 * On remove row.
473 */
474 $(document.body).on('orderable-remove-row', function (e, data) {
475 if (!window.confirm(window.orderable_vars.i18n.confirm_remove_service_hours)) {
476 e.stopImmediatePropagation();
477 return;
478 }
479 const $button = $(data.trigger_element),
480 $row = $button.closest('tr'),
481 $tbody = $button.closest('tbody'),
482 row_count = $tbody.find('>tr').length;
483 if (row_count === 1) {
484 $row.find('input').val('');
485 $row.find('input[type="checkbox"], input[type="radio"]').prop('checked', false);
486 $row.find('select').each(function () {
487 if ($(this).hasClass('orderable-select--multi-select')) {
488 return;
489 }
490 this.selectedIndex = 0;
491 $(this).trigger('change');
492 });
493 $row.find('.multi-select-container input[type="checkbox"]').trigger('change');
494 } else {
495 $row.remove();
496 }
497 $(document).trigger('orderable-add-last-row-class');
498 });
499
500 /**
501 * On toggle element.
502 */
503 $(document.body).on('orderable-toggle-element', function (e, data) {
504 data.add_class = typeof data.add_class !== 'undefined' ? data.add_class : null;
505 const $trigger_element = $(data.trigger_element),
506 $target = $($trigger_element.data('orderable-target')),
507 toggle_class = $trigger_element.data('orderable-toggle-class');
508 if (null === data.add_class) {
509 $target.toggleClass(toggle_class);
510 } else if (true === data.add_class) {
511 $target.addClass(toggle_class);
512 } else if (false === data.add_class) {
513 $target.removeClass(toggle_class);
514 }
515 $(document).trigger('orderable-add-last-row-class');
516 });
517
518 /**
519 * On toggle element select.
520 */
521 $(document.body).on('orderable-toggle-element-select', function (e, data) {
522 const $trigger_element = $(data.trigger_element),
523 $parent = $trigger_element.closest($trigger_element.data('orderable-parent')),
524 targets = $trigger_element.data('orderable-target'),
525 selected = $trigger_element.val();
526 if ($parent.length <= 0 || typeof targets === 'undefined' || typeof targets[selected] === 'undefined') {
527 return;
528 }
529 $.each(targets[selected], function (index, target) {
530 const $target = $parent.find(target);
531 if ('show' === index) {
532 $target.show();
533 } else if ('hide' === index) {
534 $target.hide();
535 }
536 });
537 $(document).trigger('orderable-add-last-row-class');
538 });
539
540 /**
541 * On toggle wrapper.
542 */
543 $(document.body).on('orderable-toggle-wrapper', function (e, data) {
544 const $trigger_element = $(data.trigger_element),
545 wrapper = $trigger_element.data('orderable-wrapper'),
546 group = $trigger_element.data('orderable-wrapper-group'),
547 $target = $('.orderable-toggle-wrapper--' + wrapper + '[data-orderable-wrapper-group="' + group + '"]');
548 $('.orderable-toggle-wrapper[data-orderable-wrapper-group="' + group + '"]').removeClass('orderable-toggle-wrapper--active');
549 $target.addClass('orderable-toggle-wrapper--active');
550 $('[data-orderable-wrapper-group="' + group + '"]').removeClass('orderable-trigger-element--active');
551 $('[data-orderable-wrapper="' + wrapper + '"]').addClass('orderable-trigger-element--active');
552 $(document).trigger('orderable-add-last-row-class');
553 });
554
555 /**
556 * Add last row class trigger.
557 */
558 $(document).on('orderable-add-last-row-class', orderable_triggers.add_last_row_class);
559
560 /**
561 * On ready triggers.
562 */
563 $(document).trigger('orderable-add-last-row-class');
564 },
565 /**
566 * Add last row class.
567 */
568 add_last_row_class() {
569 const $tables = $('.orderable-table'),
570 last_row_class = 'orderable-table__row--last',
571 $last_rows = $tables.find('.' + last_row_class),
572 $last_row = $tables.find('tbody > tr:visible:last');
573 $last_rows.removeClass(last_row_class);
574 $last_row.addClass(last_row_class);
575 }
576 };
577 window.orderable_triggers_admin = orderable_triggers;
578 $(document).ready(orderable_triggers.on_ready);
579 })(jQuery, document);