File "main.js"

Full Path: /home/romayxjt/public_html/wp-content/plugins/orderable/inc/modules/location/assets/admin/js/main.js
File size: 32.44 KB
MIME-type: text/plain
Charset: utf-8

(function ($) {
  'use strict';

  /* Localized JS vars: window.orderable_dz_js_vars */
  const orderable_dz = {
    /**
     * On document ready.
     */
    on_ready() {
      orderable_dz.cache();
      orderable_dz.add_listeners();
    },
    /**
     * Cache variables.
     */
    cache() {
      orderable_dz.post_id = $('#post_ID').val();
      if ($('#orderable_multi_location_store_services_meta_box').length) {
        orderable_dz.$metabox = $('#orderable_multi_location_store_services_meta_box');
      } else {
        orderable_dz.$metabox = $('#orderable_location_store_services_meta_box');
      }
      orderable_dz.$modal_wrapper = $('#orderable-delivery-zones-modal-wrapper');
      orderable_dz.$modal_add_update = $('#orderable-delivery-zones-modal-add-update');
      orderable_dz.$modal_add_existing = $('#orderable-delivery-zones-modal-add-existing');
      orderable_dz.msg_timeout = null;
      orderable_dz.modal_transition_time_slot_id = null;
      orderable_dz.add_existing_modal_opened = false;
    },
    /**
     * Add event listeners.
     */
    add_listeners() {
      orderable_dz.$modal_wrapper.on('click', '.js-delivery-zones-tab-nav-link', orderable_dz.handler_toggle_tabs);
      orderable_dz.$modal_wrapper.on('click', '#js-cancel-delivery-zone-modal', orderable_dz.handler_close_modal);
      orderable_dz.$modal_wrapper.on('click', '#js-add-new-delivery-zone', orderable_dz.handler_add_update_zone);
      orderable_dz.$modal_wrapper.on('click', '#js-add-existing-delivery-zone', orderable_dz.handler_add_existing_zone);
      orderable_dz.$modal_wrapper.on('click', '#js-transition-existing-to-new-modal', orderable_dz.handler_transition_modal);
      orderable_dz.$modal_wrapper.on('change', '.js-delivery-zones-list-item input', orderable_dz.handler_mark_zone_selected);
      orderable_dz.$modal_wrapper.on('keyup', '#js-delivery-zone-search', orderable_dz.handler_zone_search);
      orderable_dz.$modal_wrapper.on('change keyup', orderable_dz.handler_modal_form_change);
      orderable_dz.$metabox.on('click', '.js-open-add-delivery-zone-modal', orderable_dz.handler_open_add_update_modal);
      orderable_dz.$metabox.on('click', '.js-add-existing-delivery-zone', orderable_dz.handler_open_add_existing_modal);
      orderable_dz.$metabox.on('click', '.js-remove-delivery-zone', orderable_dz.handler_remove_zone);
      $(document.body).on('orderable-remove-row', orderable_dz.handler_remove_all_time_slot_zones);
      $(document).on('keyup', '#js-delivery-zone-modal-fee', orderable_dz.handler_sanitize_fee);
      $(document).on('keyup', orderable_dz.handler_escape_key_close_modal);
      $(document).on('orderable-delivery-zone-ajax-success', orderable_dz.handler_trigger_dom_update);
      $(document).on('orderable-delivery-zone-after-dom-update', orderable_dz.handler_after_dom_update);
    },
    /**
     * Handle AJAX success.
     *
     * @param {Event}  event                      jQuery Event object.
     * @param          request_data.request_data
     * @param {Object} request_data               The data sent and the response of the request.
     * @param          request_data.response_data
     * @return void
     */
    handler_trigger_dom_update(event, {
      request_data: sent_data,
      response_data: response
    }) {
      if (!sent_data.request_type) {
        return;
      }
      switch (sent_data.request_type) {
        case 'edit':
          orderable_dz.update_delivery_zone_in_time_slot(sent_data, response);
          break;
        case 'add_new':
        case 'add_existing':
          orderable_dz.insert_delivery_zone_in_time_slot(sent_data, response);
          break;
        case 'remove':
          orderable_dz.remove_delivery_zone_in_time_slot(sent_data, response);
          break;

        // @TODO - We need to handle deletion via WC shippings?
        case 'delete':
          orderable_dz.remove_delivery_zone_in_list_table(sent_data, response);
          break;
        default:
          break;
      }
    },
    /**
     * Handle AJAX success.
     *
     * @param {Event}  event        jQuery Event object.
     * @param {Object} request_data The data sent and the response of the request.
     * @param          data
     */
    handler_after_dom_update(event, data) {
      // Timeout gives the DOM enough time to update.
      setTimeout(function () {
        if ('add_new' === data.request.request_type) {
          const zone_list_template = wp.template('existing-zones-list-item'),
            zone_list_template_data = orderable_dz.generate_zone_row_data(data.request, data.response, data.time_slot_row);
          $('#js-delivery-zone-modal-zones-list').append(zone_list_template(zone_list_template_data));
        }
        orderable_dz.close_modal();
      }, 250);
    },
    /**
     * Handler: toggle modal tabs.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_toggle_tabs(event) {
      // NOTE: Not required into we implement the "drawing" tab.
      // $( '.orderable-delivery-zones-modal__tab, .orderable-delivery-zones-modal__tabs-nav-link' ).toggleClass( 'active' );
    },
    /**
     * Handler: close modal on Escape key press.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_escape_key_close_modal(event) {
      if (event.key == 'Escape') {
        orderable_dz.handler_close_modal();
      }
    },
    /**
     * Handler: open the add/update modal.
     *
     * @param {Event}  event             jQuery Event object.
     * @param {string} transition_action The type of transition action to take e.g. `add-new`.
     */
    handler_open_add_update_modal(event, transition_action) {
      let action;
      if (transition_action) {
        action = transition_action;
      } else {
        const $btn = $(event.target).hasClass('dashicons') ? $(event.target).parent() : $(event.target);
        action = $btn.data('action');
      }
      const text = 'add-new' === action ? window.orderable_dz_js_vars.text.modal_add : window.orderable_dz_js_vars.text.modal_update,
        time_slot_id = transition_action ? orderable_dz.modal_transition_time_slot_id : orderable_dz.get_time_slot_id(event),
        time_slot_index = orderable_dz.get_time_slot_index(event);
      orderable_dz.$modal_add_update.find('.orderable-delivery-zones-modal__title').text(text);
      orderable_dz.$modal_add_update.find('.orderable-delivery-zones-modal__button--add-update .text').text(text);
      orderable_dz.$modal_add_update.find('.js-delivery-zone-modal-time-slot').val(time_slot_id);
      orderable_dz.$modal_add_update.find('.js-delivery-zone-modal-time-slot-index').val(time_slot_index);
      if ('edit' === action) {
        orderable_dz.form_add_zone_data(event);
      }
      setTimeout(function () {
        $('body').css({
          'overflow-y': 'hidden'
        });
        orderable_dz.$modal_wrapper.show();
        orderable_dz.$modal_add_update.fadeIn();
      }, 250);
    },
    /**
     * Handler: open a modal.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_open_add_existing_modal(event) {
      const time_slot_id = orderable_dz.get_time_slot_id(event),
        time_slot_index = orderable_dz.get_time_slot_index(event);
      orderable_dz.$modal_add_existing.find('.js-delivery-zone-modal-time-slot').val(time_slot_id);
      orderable_dz.$modal_add_existing.find('.js-delivery-zone-modal-time-slot-index').val(time_slot_index);
      orderable_dz.hide_existing_time_slot_zones(event);
      setTimeout(function () {
        $('body').css({
          'overflow-y': 'hidden'
        });
        orderable_dz.$modal_wrapper.show();
        orderable_dz.$modal_add_existing.fadeIn();
        orderable_dz.maybe_show_no_zones_msg();
      }, 100);
    },
    /**
     * Handler: close a modal.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_close_modal(event) {
      orderable_dz.close_modal(event);
    },
    /**
     * Handler: add new zone links.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_add_update_zone(event) {
      orderable_dz.maybe_show_modal_spinner();
      const zone_id = $('#js-delivery-zone-modal-zone-id').val(),
        request_data = {
          request_type: zone_id ? 'edit' : 'add_new',
          post_id: orderable_dz.post_id,
          time_slot_index: parseInt(orderable_dz.$modal_add_update.find('.js-delivery-zone-modal-time-slot-index').val()),
          time_slot_id: parseInt(orderable_dz.$modal_add_update.find('.js-delivery-zone-modal-time-slot').val()),
          zone_name: $('#js-delivery-zone-modal-area-name').val(),
          zone_postcodes: $('#js-delivery-zone-modal-postcodes').val(),
          zone_fee: $('#js-delivery-zone-modal-fee').val()
        };

      // If we have a zone ID, this is an update request,
      // so modify the request_data accordingly.
      if (zone_id) {
        request_data.zone_id = zone_id;
      }
      if (!request_data.zone_name || !request_data.zone_postcodes) {
        if (!request_data.zone_name) {
          $('#js-delivery-zone-modal-valid-name').fadeIn();
        }
        if (!request_data.zone_postcodes) {
          $('#js-delivery-zone-modal-valid-postcodes').fadeIn();
        }
        orderable_dz.maybe_show_modal_spinner();
      } else {
        orderable_dz.handler_trigger_dom_update(event, {
          request_data,
          response_data: {
            data: {
              status: true,
              zone_id: zone_id ? zone_id : Date.now() // In the absence of a zone ID, we use a timestamp.
            }
          }
        });
      }
    },
    /**
     * Handler: add existing zone links.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_add_existing_zone(event) {
      orderable_dz.maybe_show_modal_spinner();
      const $selected_zones = $('.orderable-delivery-zones-modal__field-checkbox:checked');
      $selected_zones.each(function (index, element) {
        // In this context we only need the location, zone and time slot IDs,
        // however by sending this data, we can immediately send it back
        // for the front-end update.
        const request_data = {
          request_type: 'add_existing',
          post_id: orderable_dz.post_id,
          zone_id: $(element).val(),
          time_slot_index: orderable_dz.$modal_add_existing.find('.js-delivery-zone-modal-time-slot-index').val(),
          time_slot_id: orderable_dz.$modal_add_existing.find('.js-delivery-zone-modal-time-slot').val(),
          zone_name: $(element).data('zone-name'),
          zone_postcodes: $(element).data('zone-postcodes'),
          zone_fee: $(element).data('zone-fee')
        };
        orderable_dz.handler_trigger_dom_update(event, {
          request_data,
          response_data: {
            data: {
              status: true,
              zone_id: request_data.zone_id
            }
          }
        });
      });
      orderable_dz.close_modal();
    },
    /**
     * Handler: add existing zone links.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_transition_modal(event) {
      orderable_dz.modal_transition_time_slot_id = $(event.target).closest('.orderable-delivery-zones-modal__form').find('.js-delivery-zone-modal-time-slot').val();
      orderable_dz.close_modal(event, true);
    },
    /**
     * Handler: remove zone links.
     *
     * @param {Event} event jQuery Event object.
     */
    handler_remove_zone(event) {
      if (!window.confirm(window.orderable_dz_js_vars.text.zone_confirm_remove)) {
        return;
      }
      const time_slot_id = orderable_dz.get_time_slot_id(event),
        zone_id = orderable_dz.get_zone_id(event);
      orderable_dz.handler_trigger_dom_update(event, {
        request_data: {
          request_type: 'remove',
          zone_id,
          time_slot_id
        },
        response_data: {
          data: {
            status: true,
            zone_ids: [zone_id]
          }
        }
      });
    },
    /**
     * Handler: remove all zones from a time slot when
     * the slot is removed from the location.
     *
     * This prevents orphaned zones still associated
     * with a location, but without a valid time slot.
     *
     * @param {Event}  event The jQuery Event object.
     * @param {Object} data  jQuery Event data.
     */
    handler_remove_all_time_slot_zones(event, data) {
      const $row = $(data.trigger_element).closest('.orderable-table__row'),
        time_slot_id = $row.data('orderable-time-slot'),
        $zones = $row.find('.orderable-table-delivery-zones-row__item'),
        zone_ids = [];
      $zones.each(function (index, element) {
        zone_ids.push($(element).data('zone-id'));
      });
      orderable_dz.handler_trigger_dom_update(event, {
        request_data: {
          request_type: 'remove',
          zone_ids,
          time_slot_id
        },
        response_data: {
          data: {
            status: true,
            zone_ids,
            msg: 'All delivery zones successfully removed!'
          }
        }
      });
    },
    /**
     * Handler: sanitize the fee field.
     *
     * @param {Event} event The jQuery Event object.
     */
    handler_sanitize_fee(event) {
      $(event.target).val($(event.target).val().replace(/[^0-9.]/gm, ''));
    },
    /**
     * Handler: listen for zone search change and update the list.
     *
     * @param {Event} event The jQuery Event object.
     */
    handler_zone_search(event) {
      const $zone_items = $('.orderable-delivery-zones-modal-add-existing .orderable-delivery-zones-modal__zones-list-item:not(.hide-existing)'),
        search_query = $(event.target).val().toLowerCase();
      let debounce_search;
      if (!$zone_items.length) {
        orderable_dz.maybe_show_no_zones_msg();
        return;
      }
      clearTimeout(debounce_search);
      debounce_search = setTimeout(function () {
        if (!search_query || search_query.length < 2) {
          // Show all rows if the query is empty.
          $zone_items.show();
          orderable_dz.maybe_show_no_zones_msg();
        } else {
          // Filters based on the search query.
          $zone_items.each(function (index, element) {
            const $zone = $(element),
              zone_name = $zone.find('input[type=checkbox]').data('zone-name').toLowerCase();
            if ($zone.hasClass('hide-existing') || !zone_name.includes(search_query)) {
              $(element).hide();
            } else {
              $(element).show();
            }
          });
          orderable_dz.maybe_show_no_zones_msg();
        }
      }, 100);
    },
    /**
     * Handler: take action when a modal form changes.
     *
     * @param {Event} event The jQuery Event object.
     */
    handler_modal_form_change(event) {
      const $add_new_button = $('#js-add-new-delivery-zone'),
        $add_existing_button = $('#js-add-existing-delivery-zone');

      // Change state of the add new zone button
      // based on whether the postcode and area
      // name fields are populated.
      if ($('#js-delivery-zone-modal-postcodes').val() && $('#js-delivery-zone-modal-area-name').val()) {
        $add_new_button.prop('disabled', false);
      } else {
        $add_new_button.prop('disabled', true);
      }

      // Change state of the add existing zone button
      // based on the selections made in the list.
      if ($('.orderable-delivery-zones-modal__zones-list-item.selected').length) {
        $add_existing_button.prop('disabled', false);
      } else {
        $add_existing_button.prop('disabled', true);
      }
    },
    /**
     * Handler: mark a zone selected.
     *
     * @param {Event} event The jQuery Event object.
     */
    handler_mark_zone_selected(event) {
      const $zone_item = $(event.target).closest('.orderable-delivery-zones-modal__zones-list-item');
      if ($zone_item.hasClass('selected')) {
        $zone_item.removeClass('selected');
      } else {
        $zone_item.addClass('selected');
      }
    },
    /**
     * Maybe show the "no zones" msg.
     */
    maybe_show_no_zones_msg() {
      const $zone_items = $('.orderable-delivery-zones-modal-add-existing .orderable-delivery-zones-modal__zones-list-item:not(.hide-existing):visible'),
        $no_zones_msg = $('#js-no-delivery-zones-msg'),
        $add_zones_button = $('.orderable-delivery-zones-modal__button--add-existing');
      if (!$zone_items.length) {
        $add_zones_button.prop('disabled', true);
        $no_zones_msg.show();
      } else {
        if (orderable_dz.add_existing_modal_opened) {
          $add_zones_button.prop('disabled', false);
          orderable_dz.add_existing_modal_opened = true;
        }
        $no_zones_msg.hide();
      }
    },
    /**
     * Generate the data for a specific zone row.
     *
     * @param {Object} request        Request data.
     * @param {Object} response       Request data.
     * @param {Object} $time_slot_row jQuery Object.
     */
    generate_zone_row_data(request, response, $time_slot_row = false) {
      let delivery_zone_id = null;
      const zone_id = request.zone_id ? request.zone_id : response.data.zone_id;

      // Don't increment the row count if this is an edit action.
      if ($time_slot_row.length) {
        if (request.request_type === 'edit') {
          delivery_zone_id = $time_slot_row.find(`.orderable-table-delivery-zones-row__item[data-zone-id=${zone_id}]`).data('zone-count');
        } else {
          delivery_zone_id = $time_slot_row.find('.orderable-table-delivery-zones-row__item').length + 1;
        }
      }
      const zone_data = {
        time_slot_id: request.time_slot_id,
        zone_id,
        zone_name: request.zone_name,
        zone_postcodes: request.zone_postcodes,
        zone_fee: request.zone_fee
      };
      return {
        ...zone_data,
        input_value: JSON.stringify(zone_data),
        delivery_zone_id,
        time_slot_index: request.time_slot_index,
        text_zone_title: window.orderable_dz_js_vars.text.zone_title,
        text_edit_zone: window.orderable_dz_js_vars.text.zone_edit,
        text_remove_zone: window.orderable_dz_js_vars.text.zone_remove
      };
    },
    /**
     * Insert a new delivery zone in the time slot.
     *
     * @param {Object} request  Request data.
     * @param {Object} response Request data.
     */
    insert_delivery_zone_in_time_slot(request, response) {
      const $time_slot_row = $(`.orderable-toggle-wrapper--delivery [data-orderable-index=${request.time_slot_index}]`),
        row_template = wp.template('delivery-zones-row'),
        row_template_data = orderable_dz.generate_zone_row_data(request, response, $time_slot_row);
      $time_slot_row.find('.orderable-table-delivery-zones-row__no-items').hide();
      $time_slot_row.find('.orderable-table-delivery-zones-row__actions').before(row_template(row_template_data));
      const status = response.data.status ? 'success' : 'error';
      $(document).trigger('orderable-delivery-zone-after-dom-update', {
        status,
        request,
        response,
        time_slot_row: $time_slot_row
      });
    },
    /**
     * Insert a new delivery zone in the time slot.
     *
     * @param {Object} request  Request data.
     * @param {Object} response Response data.
     */
    update_delivery_zone_in_time_slot(request, response) {
      if (!request.time_slot_id) {
        return;
      }
      const $time_slot_row = $(`.orderable-toggle-wrapper--delivery [data-orderable-time-slot=${request.time_slot_id}]`),
        template = wp.template('delivery-zones-row'),
        template_data = orderable_dz.generate_zone_row_data(request, response, $time_slot_row),
        zone_id = request.zone_id ? request.zone_id : response.data.zone_id;
      $time_slot_row.find(`.orderable-table-delivery-zones-row__item[data-zone-id=${zone_id}]`).replaceWith(template(template_data));
      $(document).trigger('orderable-delivery-zone-after-dom-update', {
        status: 'success',
        request,
        response
      });
    },
    /**
     * Remove a delivery zone in the time slot.
     *
     * @param {Object} request  Request data.
     * @param {Object} response Response data.
     */
    remove_delivery_zone_in_time_slot(request, response) {
      for (const zone_id of response.data.zone_ids) {
        $(`.orderable-toggle-wrapper--delivery [data-orderable-time-slot=${request.time_slot_id}] .orderable-table-delivery-zones-row__item[data-zone-id=${zone_id}]`).remove();
      }
      const $time_slot_row = $(`.orderable-toggle-wrapper--delivery [data-orderable-time-slot=${request.time_slot_id}]`);
      if (!$time_slot_row.find('.orderable-table-delivery-zones-row__item').length) {
        $time_slot_row.find('.orderable-table-delivery-zones-row__no-items').fadeIn();
      }
      $(document).trigger('orderable-delivery-zone-after-dom-update', {
        status: response.success,
        request,
        response
      });
      orderable_dz.reset_modal_forms();
    },
    /**
     * Populate the modal form with data when editing an existing zone.
     *
     * @param {Event} event The jQuery Event object.
     */
    form_add_zone_data(event) {
      const $delivery_zone_row = $(event.target).closest('[data-zone-id]');
      $('#js-delivery-zone-modal-zone-id').val($delivery_zone_row.attr('data-zone-id'));
      $('#js-delivery-zone-modal-postcodes').val($delivery_zone_row.attr('data-zone-postcodes'));
      $('#js-delivery-zone-modal-area-name').val($delivery_zone_row.attr('data-zone-name'));
      $('#js-delivery-zone-modal-fee').val($delivery_zone_row.attr('data-zone-fee'));
      if ($('#js-delivery-zone-modal-postcodes').val() && $('#js-delivery-zone-modal-area-name').val()) {
        $('#js-add-new-delivery-zone').prop('disabled', false);
      }
    },
    /**
     * Close the modal and reset the forms.
     *
     * @param {Event}   event                 The jQuery Event object.
     * @param {boolean} open_add_update_modal True to open the add/update modal.
     */
    close_modal(event, open_add_update_modal = false) {
      // Add a small delay to mask any UI change in the background.
      setTimeout(function () {
        $('body').css({
          'overflow-y': 'visible'
        });
        if (!open_add_update_modal) {
          orderable_dz.$modal_wrapper.fadeOut();
        }
        orderable_dz.$modal_wrapper.find('.orderable-delivery-zones-modal').hide();
        $('.orderable-delivery-zones-modal__msg').fadeOut();
        orderable_dz.maybe_show_modal_spinner(true);
        orderable_dz.unhide_existing_time_slot_zones();
        orderable_dz.reset_modal_forms();
        orderable_dz.add_existing_modal_opened = false;
        $('.orderable-delivery-zones-modal__footer .orderable-delivery-zones-modal__button--add-update').prop('disabled', true);
        $('.orderable-delivery-zones-modal__footer .orderable-delivery-zones-modal__button--add-existing').prop('disabled', true);
        if (open_add_update_modal) {
          orderable_dz.handler_open_add_update_modal(event, 'add-new');
        }
      }, 250);
    },
    /**
     * Reset the modal forms.
     */
    reset_modal_forms() {
      orderable_dz.$modal_wrapper.find('input:not([type="checkbox"]), textarea').val('');
      orderable_dz.$modal_wrapper.find('input[type="checkbox"]').removeAttr('checked');
      orderable_dz.$modal_wrapper.find('.orderable-delivery-zones-modal__zones-list-item').removeClass('selected').fadeIn();
    },
    /**
     * Maybe show the modal spinner.
     *
     * @param {boolean} remove True to force remove the class.
     */
    maybe_show_modal_spinner(remove = false) {
      const $icon = $('.orderable-delivery-zones-modal__button .icon');
      if (remove || $icon.hasClass('active')) {
        $icon.removeClass('active');
      } else {
        $icon.addClass('active');
      }
    },
    /**
     * Hide zones already added to a time zone in the existing zones list.
     *
     * @param {Event} event The jQuery Event object.
     */
    hide_existing_time_slot_zones(event) {
      const time_slot_id = orderable_dz.get_time_slot_id(event),
        $time_slot_row = $(`.orderable-toggle-wrapper--delivery [data-orderable-time-slot=${time_slot_id}]`),
        $modal_existing_zones = $('.orderable-delivery-zones-modal__zones-list-item');
      if (!$time_slot_row.length) {
        return;
      }
      $modal_existing_zones.each(function (index, element) {
        const zone_id = $(element).find('input').val();
        if (zone_id && $time_slot_row.find(`.orderable-table-delivery-zones-row__item[data-zone-id="${zone_id}"]`).length) {
          $(element).addClass('hide-existing');
        }
      });
    },
    /**
     * Unhide zones already added to a time zone in the existing zones list.
     */
    unhide_existing_time_slot_zones() {
      $('.orderable-delivery-zones-modal__zones-list-item').removeClass('hide-existing');
    },
    /**
     * Get the time slot ID from the parent row
     * when clicking on an action link.
     *
     * @param {Event} event The jQuery Event object.
     */
    get_time_slot_id(event) {
      // Service hours UI.
      return parseInt($(event.target).closest('.orderable-table__row').data('orderable-time-slot'));
    },
    /**
     * Get the time slot index from the parent row
     * when clicking on an action link.
     *
     * @param {Event} event The jQuery Event object.
     */
    get_time_slot_index(event) {
      // Service hours UI.
      return parseInt($(event.target).closest('.orderable-table__row').data('orderable-index'));
    },
    /**
     * Get the time slot index from the parent row
     * when clicking on an action link.
     *
     * @param {Event} event The jQuery Event object.
     */
    get_zone_id(event) {
      return $(event.target).closest('.orderable-table-delivery-zones-row__item').data('zone-id');
    }
  };
  $(document).ready(orderable_dz.on_ready);
})(jQuery);
(function ($) {
  var orderable_multi_location = {
    on_ready() {
      $('.orderable-toggle-field').on('click', orderable_multi_location.handle_toggle_field_on_click);
      $('.orderable-override-open-hours-toggle-field').on('click', orderable_multi_location.handle_override_open_hours_on_click);
      $('.orderable-delivery-toggle-field').on('click', orderable_multi_location.handle_enable_service_delivery_on_click);
      $('.orderable-pickup-toggle-field').on('click', orderable_multi_location.handle_enable_service_pickup_on_click);
      $('.orderable-admin-button--pickup').on('click', function () {
        if ($('#orderable_location_service_hours_pickup_same_as_delivery').prop('checked')) {
          $('.orderable-element--pickup').addClass('orderable-element--disabled');
        } else {
          $('.orderable-element--pickup').removeClass('orderable-element--disabled');
        }
      });
      const datepicker_args = $('.datepicker').data('datepicker');
      $('.datepicker').datepicker(datepicker_args);
      $(document.body).on('orderable-new-row', orderable_multi_location.on_new_holiday_row);
    },
    handle_toggle_field_on_click() {
      $(this).toggleClass(['woocommerce-input-toggle--disabled', 'woocommerce-input-toggle--enabled']);
      const value = $(this).hasClass('woocommerce-input-toggle--enabled');
      $(this).siblings('.orderable-toggle-field__input').val(value ? 'yes' : 'no');
    },
    handle_override_open_hours_on_click() {
      $(this).siblings('.orderable-open-hours-settings').toggleClass('orderable-store-open-hours--hide');
      $('.orderable-store-open-hours__open-hours').toggleClass('orderable-store-open-hours--hide');
    },
    handle_enable_service_delivery_on_click() {
      const delivery_is_enabled = $(this).hasClass('woocommerce-input-toggle--enabled');
      pickup_is_enabled = $('[name=orderable_location_store_services_pickup]').val() === 'yes';
      if (delivery_is_enabled) {
        $('.orderable-admin-button--delivery').removeClass('orderable-ui-hide');
        $('.orderable-notice--select-service').addClass('orderable-ui-hide');
      } else {
        $('.orderable-admin-button--delivery').addClass('orderable-ui-hide').removeClass('orderable-trigger-element--active');
      }
      if (pickup_is_enabled && delivery_is_enabled) {
        $('#orderable_location_service_hours_pickup_same_as_delivery_label').removeClass('orderable-ui-hide');
        const has_pickup_days_selected = $('.orderable-toggle-wrapper--pickup').find('.orderable-select--days').first().val().length;
        if (!has_pickup_days_selected) {
          $('#orderable_location_service_hours_pickup_same_as_delivery').prop('checked', true).change();
        }
        return;
      }
      if (delivery_is_enabled && !pickup_is_enabled) {
        $('#orderable_location_service_hours_pickup_same_as_delivery_label').removeClass('orderable-ui-hide');
        $('.orderable-admin-button--delivery').addClass('orderable-trigger-element--active');
        $('.orderable-toggle-wrapper--delivery').addClass('orderable-toggle-wrapper--active');
        return;
      }
      if (!delivery_is_enabled && !pickup_is_enabled) {
        $('.orderable-notice--select-service').removeClass('orderable-ui-hide');
        $('.orderable-toggle-wrapper--delivery').removeClass('orderable-toggle-wrapper--active');
        return;
      }
      if (!delivery_is_enabled && pickup_is_enabled) {
        $('#orderable_location_service_hours_pickup_same_as_delivery').prop('checked', false).change();
        $('#orderable_location_service_hours_pickup_same_as_delivery_label').addClass('orderable-ui-hide');
        $('.orderable-table--service-hours-pickup').removeClass('orderable-element--disabled');
        $('.orderable-admin-button--pickup').addClass('orderable-trigger-element--active');
        $('.orderable-toggle-wrapper--pickup').addClass('orderable-toggle-wrapper--active').removeClass('orderable-element--disabled');
        $('.orderable-admin-button--delivery').removeClass('orderable-trigger-element--active');
        $('.orderable-toggle-wrapper--delivery').removeClass('orderable-toggle-wrapper--active');
      }
    },
    handle_enable_service_pickup_on_click() {
      const pickup_is_enabled = $(this).hasClass('woocommerce-input-toggle--enabled'),
        delivery_is_enabled = $('[name=orderable_location_store_services_delivery]').val() === 'yes';
      if (pickup_is_enabled) {
        $('.orderable-admin-button--pickup').removeClass('orderable-ui-hide');
        $('.orderable-table--service-hours-pickup').removeClass('orderable-element--disabled');
        $('.orderable-notice--select-service').addClass('orderable-ui-hide');
      } else {
        $('.orderable-admin-button--pickup').addClass('orderable-ui-hide').removeClass('orderable-trigger-element--active');
      }
      if (pickup_is_enabled && delivery_is_enabled) {
        $('#orderable_location_service_hours_pickup_same_as_delivery_label').removeClass('orderable-ui-hide');
        $('#orderable_location_service_hours_pickup_same_as_delivery').prop('checked', true).change();
        return;
      }
      if (pickup_is_enabled && !delivery_is_enabled) {
        $('#orderable_location_service_hours_pickup_same_as_delivery').prop('checked', false).change();
        $('#orderable_location_service_hours_pickup_same_as_delivery_label').addClass('orderable-ui-hide');
        $('.orderable-admin-button--pickup').addClass('orderable-trigger-element--active');
        $('.orderable-toggle-wrapper--pickup').addClass('orderable-toggle-wrapper--active').removeClass('orderable-element--disabled');
        $('.orderable-element--pickup').removeClass('orderable-element--disabled');
        return;
      }
      if (!pickup_is_enabled && delivery_is_enabled) {
        $('#orderable_location_service_hours_pickup_same_as_delivery').prop('checked', true).change();
        $('#orderable_location_service_hours_pickup_same_as_delivery_label').addClass('orderable-ui-hide');
        $('.orderable-table--service-hours-delivery').removeClass('orderable-element--disabled');
        $('.orderable-admin-button--delivery').addClass('orderable-trigger-element--active');
        $('.orderable-toggle-wrapper--delivery').addClass('orderable-toggle-wrapper--active').removeClass('orderable-element--disabled');
        $('.orderable-admin-button--pickup').removeClass('orderable-trigger-element--active');
        $('.orderable-toggle-wrapper--pickup').removeClass('orderable-toggle-wrapper--active');
        return;
      }
      if (!delivery_is_enabled && !pickup_is_enabled) {
        $('.orderable-notice--select-service').removeClass('orderable-ui-hide');
        $('.orderable-toggle-wrapper--pickup').removeClass('orderable-toggle-wrapper--active');
      }
    },
    on_new_holiday_row() {
      const $row = $('.orderable-table--holidays').find('.orderable-table__row--repeatable:last-child');
      $row.find('.datepicker').each(function () {
        const args = $(this).data('datepicker');
        $(this).datepicker(args);
      });
    }
  };
  $(document).ready(orderable_multi_location.on_ready);
})(jQuery);