|
|
@@ -0,0 +1,940 @@
|
|
|
+<x-admin::layouts>
|
|
|
+ <x-slot:title>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.title')
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ {!! view_render_event('bagisto.admin.settings.shipping_zone_rates.create.before') !!}
|
|
|
+
|
|
|
+ <v-shipping-zone-rates>
|
|
|
+ <div class="flex items-center justify-between">
|
|
|
+ <p class="text-xl font-bold text-gray-800 dark:text-white">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.title')
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <div class="flex items-center gap-x-2.5">
|
|
|
+ <!-- Import CSV Button -->
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.create'))
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ class="secondary-button"
|
|
|
+ @click="$refs.importModal.toggle()"
|
|
|
+ >
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import-btn')
|
|
|
+ </button>
|
|
|
+ @endif
|
|
|
+
|
|
|
+ <!-- Create Button -->
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.create'))
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ class="primary-button"
|
|
|
+ @click="selectedRate=0; resetForm(); $refs.rateUpdateOrCreateModal.toggle()"
|
|
|
+ >
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create-btn')
|
|
|
+ </button>
|
|
|
+ @endif
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- DataGrid Shimmer -->
|
|
|
+ <x-admin::shimmer.datagrid />
|
|
|
+
|
|
|
+ <x-admin::datagrid
|
|
|
+ :src="route('admin.settings.shipping_zone_rates.index')"
|
|
|
+ ref="datagrid"
|
|
|
+ >
|
|
|
+ <template #body="{
|
|
|
+ isLoading,
|
|
|
+ available,
|
|
|
+ applied,
|
|
|
+ selectAll,
|
|
|
+ sort,
|
|
|
+ performAction
|
|
|
+ }">
|
|
|
+ <template v-if="isLoading">
|
|
|
+ <x-admin::shimmer.datagrid.table.body />
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else>
|
|
|
+ <div
|
|
|
+ v-for="record in available.records"
|
|
|
+ class="row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950"
|
|
|
+ :style="`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`"
|
|
|
+ >
|
|
|
+ <!-- ID -->
|
|
|
+ <p>@{{ record.shipping_zone_rate_id }}</p>
|
|
|
+
|
|
|
+ <!-- Carrier Title -->
|
|
|
+ <p>@{{ record.carrier_title }}</p>
|
|
|
+
|
|
|
+ <!-- Carrier Code -->
|
|
|
+ <p>@{{ record.carrier_code }}</p>
|
|
|
+
|
|
|
+ <!-- Country Code -->
|
|
|
+ <p>@{{ record.country_code }}</p>
|
|
|
+
|
|
|
+ <!-- State Code -->
|
|
|
+ <p>@{{ record.state_code }}</p>
|
|
|
+
|
|
|
+ <!-- Delivery Description -->
|
|
|
+ <p>@{{ record.delivery_description }}</p>
|
|
|
+
|
|
|
+ <!-- Subtotal From -->
|
|
|
+ <p>@{{ record.order_subtotal_from }}</p>
|
|
|
+
|
|
|
+ <!-- Subtotal To -->
|
|
|
+ <p>@{{ record.order_subtotal_to }}</p>
|
|
|
+
|
|
|
+ <!-- Price -->
|
|
|
+ <p>@{{ record.price }}</p>
|
|
|
+
|
|
|
+ <!-- Sort Order -->
|
|
|
+ <p>@{{ record.sort_order }}</p>
|
|
|
+
|
|
|
+ <!-- Actions -->
|
|
|
+ <div class="flex justify-end">
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.edit'))
|
|
|
+ <a @click="selectedRate=1; editModal(record.actions.find(action => action.index === 'edit')?.url)">
|
|
|
+ <span
|
|
|
+ :class="record.actions.find(action => action.index === 'edit')?.icon"
|
|
|
+ class="cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center"
|
|
|
+ >
|
|
|
+ </span>
|
|
|
+ </a>
|
|
|
+ @endif
|
|
|
+
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.delete'))
|
|
|
+ <a @click="performAction(record.actions.find(action => action.index === 'delete'))">
|
|
|
+ <span
|
|
|
+ :class="record.actions.find(action => action.index === 'delete')?.icon"
|
|
|
+ class="cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center"
|
|
|
+ >
|
|
|
+ </span>
|
|
|
+ </a>
|
|
|
+ @endif
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </x-admin::datagrid>
|
|
|
+
|
|
|
+ <!-- Create / Edit Modal -->
|
|
|
+ <x-admin::form
|
|
|
+ v-slot="{ meta, errors, handleSubmit }"
|
|
|
+ as="div"
|
|
|
+ ref="modalForm"
|
|
|
+ >
|
|
|
+ <form
|
|
|
+ @submit="handleSubmit($event, updateOrCreate)"
|
|
|
+ ref="rateCreateForm"
|
|
|
+ >
|
|
|
+ <x-admin::modal ref="rateUpdateOrCreateModal">
|
|
|
+ <!-- Modal Header -->
|
|
|
+ <x-slot:header>
|
|
|
+ <p class="text-lg font-bold text-gray-800 dark:text-white">
|
|
|
+ <span v-if="selectedRate">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.edit.title')
|
|
|
+ </span>
|
|
|
+
|
|
|
+ <span v-else>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.title')
|
|
|
+ </span>
|
|
|
+ </p>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <!-- Modal Content -->
|
|
|
+ <x-slot:content>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="hidden"
|
|
|
+ name="id"
|
|
|
+ v-model="selectedRateData.id"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- Carrier Code -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.carrier-code')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="carrier_code"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.carrier_code"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.carrier-code')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="carrier_code" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Carrier Title -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.carrier-title')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="carrier_title"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.carrier_title"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.carrier-title')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="carrier_title" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Country Code -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.country-code')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="country_code"
|
|
|
+ v-model="selectedRateData.country_code"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.country-code')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="country_code" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- State Code -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.state-code')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="state_code"
|
|
|
+ v-model="selectedRateData.state_code"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.state-code')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="state_code" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Order Subtotal From -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.subtotal-from')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="order_subtotal_from"
|
|
|
+ v-model="selectedRateData.order_subtotal_from"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.subtotal-from')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="order_subtotal_from" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Order Subtotal To -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.subtotal-to')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="order_subtotal_to"
|
|
|
+ v-model="selectedRateData.order_subtotal_to"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.subtotal-to')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="order_subtotal_to" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Price -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.price')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="price"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.price"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.price')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="price" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Delivery Type -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.delivery-type')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="delivery_type"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.delivery_type"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.delivery-type')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="delivery_type" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Delivery Description -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.delivery-description')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="delivery_description"
|
|
|
+ v-model="selectedRateData.delivery_description"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.delivery-description')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="delivery_description" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Is Active -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.is-active')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="select"
|
|
|
+ name="is_active"
|
|
|
+ v-model="selectedRateData.is_active"
|
|
|
+ >
|
|
|
+ <option value="1">@lang('admin::app.settings.shipping_zone_rates.index.yes')</option>
|
|
|
+ <option value="0">@lang('admin::app.settings.shipping_zone_rates.index.no')</option>
|
|
|
+ </x-admin::form.control-group.control>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="is_active" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Sort Order -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.sort-order')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="sort_order"
|
|
|
+ v-model="selectedRateData.sort_order"
|
|
|
+ :label="trans('admin::app.settings.shipping_zone_rates.index.create.sort-order')"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="sort_order" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <!-- Modal Footer -->
|
|
|
+ <x-slot:footer>
|
|
|
+ <x-admin::button
|
|
|
+ button-type="button"
|
|
|
+ class="secondary-button mr-2"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.cancel')"
|
|
|
+ @click="$refs.rateUpdateOrCreateModal.close()"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::button
|
|
|
+ button-type="submit"
|
|
|
+ class="primary-button"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.create.save-btn')"
|
|
|
+ ::loading="isLoading"
|
|
|
+ ::disabled="isLoading"
|
|
|
+ />
|
|
|
+ </x-slot>
|
|
|
+ </x-admin::modal>
|
|
|
+ </form>
|
|
|
+ </x-admin::form>
|
|
|
+
|
|
|
+ <!-- Import CSV Modal -->
|
|
|
+ <x-admin::form
|
|
|
+ v-slot="{ meta, errors, handleSubmit }"
|
|
|
+ as="div"
|
|
|
+ ref="importModalForm"
|
|
|
+ >
|
|
|
+ <form
|
|
|
+ @submit="handleSubmit($event, importCsv)"
|
|
|
+ ref="importForm"
|
|
|
+ >
|
|
|
+ <x-admin::modal ref="importModal">
|
|
|
+ <!-- Modal Header -->
|
|
|
+ <x-slot:header>
|
|
|
+ <p class="text-lg font-bold text-gray-800 dark:text-white">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.title')
|
|
|
+ </p>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <!-- Modal Content -->
|
|
|
+ <x-slot:content>
|
|
|
+ <div class="mb-4 text-sm text-gray-600 dark:text-gray-300">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.description')
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- CSV File -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.file')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="file"
|
|
|
+ name="csv_file"
|
|
|
+ rules="required"
|
|
|
+ accept=".csv"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::form.control-group.error control-name="csv_file" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Truncate Checkbox -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.truncate-label')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+
|
|
|
+ <label class="inline-flex items-center gap-2 cursor-pointer">
|
|
|
+ <input
|
|
|
+ type="checkbox"
|
|
|
+ name="truncate"
|
|
|
+ value="1"
|
|
|
+ class="peer hidden"
|
|
|
+ >
|
|
|
+ <span class="flex h-5 w-5 items-center justify-center rounded-md border-2 border-gray-300 transition-all peer-checked:border-blue-600 peer-checked:bg-blue-600 dark:border-gray-700">
|
|
|
+ <span class="icon-tick text-sm text-white opacity-0 peer-checked:opacity-100"></span>
|
|
|
+ </span>
|
|
|
+ <span class="text-sm text-gray-600 dark:text-gray-300">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.truncate')
|
|
|
+ </span>
|
|
|
+ </label>
|
|
|
+ </x-admin::form.control-group>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <!-- Modal Footer -->
|
|
|
+ <x-slot:footer>
|
|
|
+ <x-admin::button
|
|
|
+ button-type="button"
|
|
|
+ class="secondary-button mr-2"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.cancel')"
|
|
|
+ @click="$refs.importModal.close()"
|
|
|
+ />
|
|
|
+
|
|
|
+ <x-admin::button
|
|
|
+ button-type="submit"
|
|
|
+ class="primary-button"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.import.upload-btn')"
|
|
|
+ ::loading="importLoading"
|
|
|
+ ::disabled="importLoading"
|
|
|
+ />
|
|
|
+ </x-slot>
|
|
|
+ </x-admin::modal>
|
|
|
+ </form>
|
|
|
+ </x-admin::form>
|
|
|
+ </v-shipping-zone-rates>
|
|
|
+
|
|
|
+ {!! view_render_event('bagisto.admin.settings.shipping_zone_rates.create.after') !!}
|
|
|
+
|
|
|
+ @pushOnce('scripts')
|
|
|
+ <script
|
|
|
+ type="text/x-template"
|
|
|
+ id="v-shipping-zone-rates-template"
|
|
|
+ >
|
|
|
+ <div>
|
|
|
+ <div class="flex items-center justify-between">
|
|
|
+ <p class="text-xl font-bold text-gray-800 dark:text-white">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.title')
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <div class="flex items-center gap-x-2.5">
|
|
|
+ <!-- Import CSV Button -->
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.create'))
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ class="secondary-button"
|
|
|
+ @click="$refs.importModal.toggle()"
|
|
|
+ >
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import-btn')
|
|
|
+ </button>
|
|
|
+ @endif
|
|
|
+
|
|
|
+ <!-- Create Button -->
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.create'))
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ class="primary-button"
|
|
|
+ @click="selectedRate=0; resetForm(); $refs.rateUpdateOrCreateModal.toggle()"
|
|
|
+ >
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create-btn')
|
|
|
+ </button>
|
|
|
+ @endif
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <x-admin::datagrid
|
|
|
+ :src="route('admin.settings.shipping_zone_rates.index')"
|
|
|
+ ref="datagrid"
|
|
|
+ >
|
|
|
+ <template #body="{
|
|
|
+ isLoading,
|
|
|
+ available,
|
|
|
+ applied,
|
|
|
+ selectAll,
|
|
|
+ sort,
|
|
|
+ performAction
|
|
|
+ }">
|
|
|
+ <template v-if="isLoading">
|
|
|
+ <x-admin::shimmer.datagrid.table.body />
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else>
|
|
|
+ <div
|
|
|
+ v-for="record in available.records"
|
|
|
+ class="row grid items-center gap-2.5 border-b px-4 py-4 text-gray-600 transition-all hover:bg-gray-50 dark:border-gray-800 dark:text-gray-300 dark:hover:bg-gray-950"
|
|
|
+ :style="`grid-template-columns: repeat(${gridsCount}, minmax(0, 1fr))`"
|
|
|
+ >
|
|
|
+ <!-- ID -->
|
|
|
+ <p>@{{ record.shipping_zone_rate_id }}</p>
|
|
|
+
|
|
|
+ <!-- Carrier Title -->
|
|
|
+ <p>@{{ record.carrier_title }}</p>
|
|
|
+
|
|
|
+ <!-- Carrier Code -->
|
|
|
+ <p>@{{ record.carrier_code }}</p>
|
|
|
+
|
|
|
+ <!-- Country Code -->
|
|
|
+ <p>@{{ record.country_code }}</p>
|
|
|
+
|
|
|
+ <!-- State Code -->
|
|
|
+ <p>@{{ record.state_code }}</p>
|
|
|
+
|
|
|
+ <!-- Delivery Description -->
|
|
|
+ <p>@{{ record.delivery_description }}</p>
|
|
|
+
|
|
|
+ <!-- Subtotal From -->
|
|
|
+ <p>@{{ record.order_subtotal_from }}</p>
|
|
|
+
|
|
|
+ <!-- Subtotal To -->
|
|
|
+ <p>@{{ record.order_subtotal_to }}</p>
|
|
|
+
|
|
|
+ <!-- Price -->
|
|
|
+ <p>@{{ record.price }}</p>
|
|
|
+
|
|
|
+ <!-- Sort Order -->
|
|
|
+ <p>@{{ record.sort_order }}</p>
|
|
|
+
|
|
|
+ <!-- Actions -->
|
|
|
+ <div class="flex justify-end">
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.edit'))
|
|
|
+ <a @click="selectedRate=1; editModal(record.actions.find(action => action.index === 'edit')?.url)">
|
|
|
+ <span
|
|
|
+ :class="record.actions.find(action => action.index === 'edit')?.icon"
|
|
|
+ class="cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center"
|
|
|
+ >
|
|
|
+ </span>
|
|
|
+ </a>
|
|
|
+ @endif
|
|
|
+
|
|
|
+ @if (bouncer()->hasPermission('settings.shipping_zone_rates.delete'))
|
|
|
+ <a @click="performAction(record.actions.find(action => action.index === 'delete'))">
|
|
|
+ <span
|
|
|
+ :class="record.actions.find(action => action.index === 'delete')?.icon"
|
|
|
+ class="cursor-pointer rounded-md p-1.5 text-2xl transition-all hover:bg-gray-200 dark:hover:bg-gray-800 max-sm:place-self-center"
|
|
|
+ >
|
|
|
+ </span>
|
|
|
+ </a>
|
|
|
+ @endif
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </x-admin::datagrid>
|
|
|
+
|
|
|
+ <!-- Create / Edit Modal -->
|
|
|
+ <x-admin::form
|
|
|
+ v-slot="{ meta, errors, handleSubmit }"
|
|
|
+ as="div"
|
|
|
+ ref="modalForm"
|
|
|
+ >
|
|
|
+ <form
|
|
|
+ @submit="handleSubmit($event, updateOrCreate)"
|
|
|
+ ref="rateCreateForm"
|
|
|
+ >
|
|
|
+ <x-admin::modal ref="rateUpdateOrCreateModal">
|
|
|
+ <x-slot:header>
|
|
|
+ <p class="text-lg font-bold text-gray-800 dark:text-white">
|
|
|
+ <span v-if="selectedRate">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.edit.title')
|
|
|
+ </span>
|
|
|
+ <span v-else>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.title')
|
|
|
+ </span>
|
|
|
+ </p>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <x-slot:content>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="hidden"
|
|
|
+ name="id"
|
|
|
+ v-model="selectedRateData.id"
|
|
|
+ />
|
|
|
+
|
|
|
+ <div class="grid grid-cols-2 gap-4">
|
|
|
+ <!-- Carrier Code -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.carrier-code')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="carrier_code"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.carrier_code"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="carrier_code" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Carrier Title -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.carrier-title')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="carrier_title"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.carrier_title"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="carrier_title" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Country Code -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.country-code')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="country_code"
|
|
|
+ v-model="selectedRateData.country_code"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="country_code" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- State Code -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.state-code')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="state_code"
|
|
|
+ v-model="selectedRateData.state_code"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="state_code" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Order Subtotal From -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.subtotal-from')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="order_subtotal_from"
|
|
|
+ v-model="selectedRateData.order_subtotal_from"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="order_subtotal_from" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Order Subtotal To -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.subtotal-to')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="order_subtotal_to"
|
|
|
+ v-model="selectedRateData.order_subtotal_to"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="order_subtotal_to" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Price -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.price')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="price"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.price"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="price" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Delivery Type -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.delivery-type')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="delivery_type"
|
|
|
+ rules="required"
|
|
|
+ v-model="selectedRateData.delivery_type"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="delivery_type" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- Delivery Description -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.delivery-description')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="delivery_description"
|
|
|
+ v-model="selectedRateData.delivery_description"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="delivery_description" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <div class="grid grid-cols-2 gap-4">
|
|
|
+ <!-- Is Active -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.is-active')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="select"
|
|
|
+ name="is_active"
|
|
|
+ v-model="selectedRateData.is_active"
|
|
|
+ >
|
|
|
+ <option value="1">@lang('admin::app.settings.shipping_zone_rates.index.yes')</option>
|
|
|
+ <option value="0">@lang('admin::app.settings.shipping_zone_rates.index.no')</option>
|
|
|
+ </x-admin::form.control-group.control>
|
|
|
+ <x-admin::form.control-group.error control-name="is_active" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <!-- Sort Order -->
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label>
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.create.sort-order')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="text"
|
|
|
+ name="sort_order"
|
|
|
+ v-model="selectedRateData.sort_order"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="sort_order" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+ </div>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <x-slot:footer>
|
|
|
+ <x-admin::button
|
|
|
+ button-type="button"
|
|
|
+ class="secondary-button mr-2"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.cancel')"
|
|
|
+ @click="$refs.rateUpdateOrCreateModal.close()"
|
|
|
+ />
|
|
|
+ <x-admin::button
|
|
|
+ button-type="submit"
|
|
|
+ class="primary-button"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.create.save-btn')"
|
|
|
+ ::loading="isLoading"
|
|
|
+ ::disabled="isLoading"
|
|
|
+ />
|
|
|
+ </x-slot>
|
|
|
+ </x-admin::modal>
|
|
|
+ </form>
|
|
|
+ </x-admin::form>
|
|
|
+
|
|
|
+ <!-- Import CSV Modal -->
|
|
|
+ <x-admin::form
|
|
|
+ v-slot="{ meta, errors, handleSubmit }"
|
|
|
+ as="div"
|
|
|
+ ref="importModalForm"
|
|
|
+ >
|
|
|
+ <form
|
|
|
+ @submit="handleSubmit($event, importCsv)"
|
|
|
+ ref="importForm"
|
|
|
+ >
|
|
|
+ <x-admin::modal ref="importModal">
|
|
|
+ <x-slot:header>
|
|
|
+ <p class="text-lg font-bold text-gray-800 dark:text-white">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.title')
|
|
|
+ </p>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <x-slot:content>
|
|
|
+ <div class="mb-4 text-sm text-gray-600 dark:text-gray-300">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.description')
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <x-admin::form.control-group.label class="required">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.file')
|
|
|
+ </x-admin::form.control-group.label>
|
|
|
+ <x-admin::form.control-group.control
|
|
|
+ type="file"
|
|
|
+ name="csv_file"
|
|
|
+ rules="required"
|
|
|
+ accept=".csv"
|
|
|
+ />
|
|
|
+ <x-admin::form.control-group.error control-name="csv_file" />
|
|
|
+ </x-admin::form.control-group>
|
|
|
+
|
|
|
+ <x-admin::form.control-group>
|
|
|
+ <label class="inline-flex items-center gap-2 cursor-pointer">
|
|
|
+ <input
|
|
|
+ type="checkbox"
|
|
|
+ name="truncate"
|
|
|
+ value="1"
|
|
|
+ class="peer hidden"
|
|
|
+ >
|
|
|
+ <span class="flex h-5 w-5 items-center justify-center rounded-md border-2 border-gray-300 transition-all peer-checked:border-blue-600 peer-checked:bg-blue-600 dark:border-gray-700">
|
|
|
+ <span class="icon-tick text-sm text-white opacity-0 peer-checked:opacity-100"></span>
|
|
|
+ </span>
|
|
|
+ <span class="text-sm text-gray-600 dark:text-gray-300">
|
|
|
+ @lang('admin::app.settings.shipping_zone_rates.index.import.truncate')
|
|
|
+ </span>
|
|
|
+ </label>
|
|
|
+ </x-admin::form.control-group>
|
|
|
+ </x-slot>
|
|
|
+
|
|
|
+ <x-slot:footer>
|
|
|
+ <x-admin::button
|
|
|
+ button-type="button"
|
|
|
+ class="secondary-button mr-2"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.cancel')"
|
|
|
+ @click="$refs.importModal.close()"
|
|
|
+ />
|
|
|
+ <x-admin::button
|
|
|
+ button-type="submit"
|
|
|
+ class="primary-button"
|
|
|
+ :title="trans('admin::app.settings.shipping_zone_rates.index.import.upload-btn')"
|
|
|
+ ::loading="importLoading"
|
|
|
+ ::disabled="importLoading"
|
|
|
+ />
|
|
|
+ </x-slot>
|
|
|
+ </x-admin::modal>
|
|
|
+ </form>
|
|
|
+ </x-admin::form>
|
|
|
+ </div>
|
|
|
+ </script>
|
|
|
+
|
|
|
+ <script type="module">
|
|
|
+ app.component('v-shipping-zone-rates', {
|
|
|
+ template: '#v-shipping-zone-rates-template',
|
|
|
+
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ selectedRate: 0,
|
|
|
+ selectedRateData: {},
|
|
|
+ isLoading: false,
|
|
|
+ importLoading: false,
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ computed: {
|
|
|
+ gridsCount() {
|
|
|
+ let count = this.$refs.datagrid.available.columns.length;
|
|
|
+ if (this.$refs.datagrid.available.actions.length) {
|
|
|
+ ++count;
|
|
|
+ }
|
|
|
+ if (this.$refs.datagrid.available.massActions.length) {
|
|
|
+ ++count;
|
|
|
+ }
|
|
|
+ return count;
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ methods: {
|
|
|
+ updateOrCreate(params, { resetForm, setErrors }) {
|
|
|
+ this.isLoading = true;
|
|
|
+
|
|
|
+ let formData = new FormData(this.$refs.rateCreateForm);
|
|
|
+
|
|
|
+ if (params.id) {
|
|
|
+ formData.append('_method', 'put');
|
|
|
+ }
|
|
|
+
|
|
|
+ this.$axios.post(
|
|
|
+ params.id
|
|
|
+ ? "{{ route('admin.settings.shipping_zone_rates.update') }}"
|
|
|
+ : "{{ route('admin.settings.shipping_zone_rates.store') }}",
|
|
|
+ formData
|
|
|
+ )
|
|
|
+ .then((response) => {
|
|
|
+ this.isLoading = false;
|
|
|
+ this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });
|
|
|
+ this.$refs.rateUpdateOrCreateModal.close();
|
|
|
+ this.$refs.datagrid.get();
|
|
|
+ resetForm();
|
|
|
+ })
|
|
|
+ .catch(error => {
|
|
|
+ this.isLoading = false;
|
|
|
+ if (error.response.status == 422) {
|
|
|
+ setErrors(error.response.data.errors);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ editModal(url) {
|
|
|
+ this.$axios.get(url)
|
|
|
+ .then((response) => {
|
|
|
+ this.selectedRateData = response.data.data;
|
|
|
+ this.$refs.rateUpdateOrCreateModal.toggle();
|
|
|
+ })
|
|
|
+ .catch(error => this.$emitter.emit('add-flash', {
|
|
|
+ type: 'error', message: error.response.data.message
|
|
|
+ }));
|
|
|
+ },
|
|
|
+
|
|
|
+ importCsv(params, { resetForm, setErrors }) {
|
|
|
+ this.importLoading = true;
|
|
|
+
|
|
|
+ let formData = new FormData(this.$refs.importForm);
|
|
|
+
|
|
|
+ this.$axios.post(
|
|
|
+ "{{ route('admin.settings.shipping_zone_rates.import') }}",
|
|
|
+ formData
|
|
|
+ )
|
|
|
+ .then((response) => {
|
|
|
+ this.importLoading = false;
|
|
|
+ this.$emitter.emit('add-flash', { type: 'success', message: response.data.message });
|
|
|
+ this.$refs.importModal.close();
|
|
|
+ this.$refs.datagrid.get();
|
|
|
+ resetForm();
|
|
|
+ })
|
|
|
+ .catch(error => {
|
|
|
+ this.importLoading = false;
|
|
|
+ if (error.response.status == 422) {
|
|
|
+ setErrors(error.response.data.errors);
|
|
|
+ } else {
|
|
|
+ this.$emitter.emit('add-flash', {
|
|
|
+ type: 'error',
|
|
|
+ message: error.response.data.message || 'Import failed'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
+ resetForm() {
|
|
|
+ this.selectedRateData = {};
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ </script>
|
|
|
+ @endPushOnce
|
|
|
+</x-admin::layouts>
|