@webx-ui/module-delivery 0.0.0-stage → 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +58 -2
- package/dist/BindingsPage-pjTbDDWA.js +280 -0
- package/dist/BindingsPage-pjTbDDWA.js.map +1 -0
- package/dist/BindingsPage.d.ts +2 -0
- package/dist/CarrierDialog.d.ts +26 -0
- package/dist/CarriersPage-Dpre8dbl.js +650 -0
- package/dist/CarriersPage-Dpre8dbl.js.map +1 -0
- package/dist/CarriersPage.d.ts +2 -0
- package/dist/GeographyPage-IBg0JnNH.js +750 -0
- package/dist/GeographyPage-IBg0JnNH.js.map +1 -0
- package/dist/GeographyPage.d.ts +2 -0
- package/dist/LocalityDialog.d.ts +39 -0
- package/dist/LocalitySearch.d.ts +33 -0
- package/dist/MethodPane.d.ts +29 -0
- package/dist/MethodsPage-Bpzsa_6v.js +414 -0
- package/dist/MethodsPage-Bpzsa_6v.js.map +1 -0
- package/dist/MethodsPage.d.ts +2 -0
- package/dist/OrderChangeDialog.d.ts +7 -0
- package/dist/OrderDeliveryNode.d.ts +2 -0
- package/dist/PointDialog.d.ts +22 -0
- package/dist/PointsPage-CzYIM86R.js +336 -0
- package/dist/PointsPage-CzYIM86R.js.map +1 -0
- package/dist/PointsPage.d.ts +2 -0
- package/dist/PopularPage-CSrvVg4o.js +141 -0
- package/dist/PopularPage-CSrvVg4o.js.map +1 -0
- package/dist/PopularPage.d.ts +2 -0
- package/dist/RegionDialog.d.ts +11 -0
- package/dist/WaybillDialog.d.ts +8 -0
- package/dist/api.d.ts +151 -0
- package/dist/fields/CountryField.d.ts +14 -0
- package/dist/fields/LocalitiesField.d.ts +14 -0
- package/dist/fields/LocalityField.d.ts +16 -0
- package/dist/fields/PointKindField.d.ts +20 -0
- package/dist/fields/RegionField.d.ts +19 -0
- package/dist/fields/ScheduleField.d.ts +24 -0
- package/dist/i18n.d.ts +5 -0
- package/dist/index-5nt0M0In.js +2539 -0
- package/dist/index-5nt0M0In.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/messages.d.ts +7 -0
- package/dist/module.d.ts +19 -0
- package/dist/style.css +1 -0
- package/dist/types.d.ts +467 -0
- package/package.json +64 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeographyPage-IBg0JnNH.js","sources":["../src/RegionDialog.vue","../src/GeographyPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { nextTick, onMounted, ref, useTemplateRef } from 'vue'\nimport {\n useModal,\n WxButton,\n WxDialog,\n WxFormItem,\n WxInput,\n WxSpace,\n type LocalizedValue,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText } from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport type { RegionRow } from './types'\n\n/**\n * One region of a country, made or changed by hand (decision 42): its name in the languages of\n * the site and its code. «Add a region» and «Edit» are this one dialog — the shape every\n * dictionary of the panel is edited in (Catalog → property values) — and not a form over the list\n * plus a field that turns into an input in the row.\n *\n * Resolves with `true` once saved.\n */\ndefineOptions({ name: 'WxDeliveryRegionDialog' })\n\nconst props = withDefaults(defineProps<{ country: string; region?: RegionRow | null }>(), {\n region: null,\n})\n\nconst { open, resolve } = useModal<boolean>()\n\nconst api = createDeliveryApi(useAdmin())\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst names = ref<LocalizedValue>({ ...(props.region?.names ?? {}) })\nconst code = ref(props.region?.code ?? '')\nconst errors = ref<Record<string, string[]>>({})\nconst saving = ref(false)\nconst field = useTemplateRef<HTMLElement>('field')\n\nonMounted(async () => {\n await nextTick()\n field.value?.querySelector('input')?.focus()\n})\n\nconst written = () => Object.values(names.value).some((line) => line.trim() !== '')\n\nfunction errorOf(key: string): string | undefined {\n const found = Object.keys(errors.value).find((one) => one === key || one.startsWith(`${key}.`))\n\n return found === undefined ? undefined : errors.value[found]?.[0]\n}\n\nasync function submit(): Promise<void> {\n if (!written() || saving.value) return\n\n saving.value = true\n errors.value = {}\n\n const clean = Object.fromEntries(\n Object.entries(names.value)\n .map(([locale, line]) => [locale, line.trim()])\n .filter(([, line]) => line !== ''),\n )\n\n try {\n if (props.region) {\n await api.saveRegion(props.region.id, { names: clean, code: code.value.trim() || null })\n } else {\n await api.createRegion(props.country, clean, code.value.trim() || null)\n }\n\n resolve(true)\n } catch (error) {\n errors.value = (error as { errors?: Record<string, string[]> }).errors ?? {}\n if (Object.keys(errors.value).length === 0) errors.value = { names: [message(error)] }\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <wx-dialog\n v-model:open=\"open\"\n :title=\"props.region ? t('region.edit-title') : t('region.new-title')\"\n :width=\"480\"\n >\n <wx-form-item\n :label=\"t('region.name')\"\n :help=\"t('locality.names-help')\"\n :error=\"errorOf('names')\"\n required\n >\n <div ref=\"field\">\n <wx-input\n v-model=\"names\"\n localized\n :maxlength=\"120\"\n :aria-label=\"t('region.name')\"\n data-test=\"region-name\"\n @keyup.enter=\"submit\"\n />\n </div>\n </wx-form-item>\n\n <wx-form-item :label=\"t('region.code')\" :help=\"t('region.code-help')\" :error=\"errorOf('code')\">\n <wx-input v-model=\"code\" :maxlength=\"8\" @keyup.enter=\"submit\" />\n </wx-form-item>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"open = false\">{{ t('common.cancel') }}</wx-button>\n <wx-button\n type=\"primary\"\n :loading=\"saving\"\n :disabled=\"!written()\"\n data-test=\"region-save\"\n @click=\"submit\"\n >\n {{ props.region ? t('common.save') : t('common.add') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n confirm,\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxEmpty,\n WxFormItem,\n WxSelect,\n WxSkeleton,\n WxSortableList,\n WxSwitch,\n WxTable,\n WxText,\n createModal,\n type TabItem,\n type TabValue,\n type TableColumn,\n type TableState,\n} from '@webx-ui/core'\nimport {\n rowMenuWidth,\n useAdmin,\n useErrorText,\n WxListScreen,\n WxRowMenu,\n type RowAction,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport LocalityDialog from './LocalityDialog.vue'\nimport RegionDialog from './RegionDialog.vue'\nimport type { Countries, CountryRow, LocalityPage, LocalityRow, RegionRow } from './types'\n\n/**\n * The shared geography by hand (decision 42, §14.2), three views of one screen:\n *\n * - **countries** — those the shop delivers to, in the order of the checkout's choice, each on or\n * off, with the carrier that leads it (§4.4), each removed by its `···`; a new one is switched\n * on from the ISO list;\n * - **regions** of a country — a table sorted by name or by localities, made and edited in one\n * dialog, deleted while empty;\n * - **localities** — a page at a time, by country, region, source and state, searched by any\n * of their names; made by hand, edited, switched off or deleted.\n *\n * The view, the country and the filters are in the address.\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst route = useRoute()\nconst router = useRouter()\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-geography')?.title ??\n t('sections.geography'),\n)\n\nconst views = computed<TabItem[]>(() => [\n { value: 'localities', label: t('country.localities-tab') },\n { value: 'countries', label: t('country.title') },\n { value: 'regions', label: t('region.title') },\n])\n\nconst view = computed<TabValue>({\n get: () =>\n route.query.view === 'countries' || route.query.view === 'regions'\n ? route.query.view\n : 'localities',\n set: (value) =>\n void router.replace({\n query: { ...route.query, view: value === 'localities' ? undefined : String(value) },\n }),\n})\n\nconst country = computed<string>({\n get: () => (typeof route.query.country === 'string' ? route.query.country : ''),\n set: (value) =>\n void router.replace({\n query: { ...route.query, country: value || undefined, region: undefined },\n }),\n})\n\n/* -------------------------------------------------------------------------- countries ----- */\n\nconst data = ref<Countries | null>(null)\nconst loadingCountries = ref(false)\nconst adding = ref<string | null>(null)\n\nasync function loadCountries(): Promise<void> {\n loadingCountries.value = true\n\n try {\n data.value = await api.countries()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loadingCountries.value = false\n }\n}\n\nvoid loadCountries()\n\n/*\n * The regions are of one country: they start at the first one on. The localities do not — there\n * no country is every country that is on, and a country picked for them once and kept in the\n * address would hide the towns of one switched on later.\n */\nwatch(\n [view, data],\n () => {\n const list = data.value?.countries ?? []\n\n if (view.value === 'regions' && country.value === '' && list.length > 0) {\n country.value = (list.find((one) => one.active) ?? list[0])!.code\n }\n },\n { immediate: true },\n)\n\nconst countries = ref<Countries['countries']>([])\nwatch(data, (now) => (countries.value = now?.countries ?? []))\n\nconst countryOptions = computed(() =>\n countries.value.map((one) => ({\n value: one.code,\n label: `${one.name} (${one.code})${one.active ? '' : ` · ${t('country.off')}`}`,\n })),\n)\n\nconst choices = computed(() => {\n const known = new Set(countries.value.filter((one) => one.active).map((one) => one.code))\n\n return (data.value?.choices ?? [])\n .filter((one) => !known.has(one.code))\n .map((one) => ({ value: one.code, label: `${one.name} (${one.code})` }))\n})\n\nconst leaderOptions = computed(() => [\n { value: '', label: t('country.leader-none') },\n ...(data.value?.carriers ?? []),\n])\n\nasync function enable(code: string | null): Promise<void> {\n if (!code) return\n\n try {\n await api.enableCountry(code)\n adding.value = null\n country.value = code\n await loadCountries()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function toggle(code: string, on: boolean): Promise<void> {\n try {\n if (on) await api.enableCountry(code)\n else {\n await api.disableCountry(code)\n toast.info(t('country.disabled'))\n }\n await loadCountries()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function lead(code: string, carrier: string): Promise<void> {\n try {\n await api.lead(code, carrier === '' ? null : carrier)\n toast.success(t('common.saved'))\n } catch (error) {\n toast.danger(message(error))\n } finally {\n await loadCountries()\n }\n}\n\nasync function orderCountries(): Promise<void> {\n try {\n await api.orderCountries(countries.value.map((one) => one.code))\n } catch (error) {\n toast.danger(message(error, t('common.order-failed')))\n await loadCountries()\n }\n}\n\n/*\n * Out of the site (decision 42). The dialog says beforehand which of the two it will be: a\n * country with regions or localities is only switched off, as points and orders may name them.\n */\nasync function removeCountry(row: CountryRow): Promise<void> {\n const held = row.regions > 0 || row.localities > 0\n const agreed = await confirm({\n title: t('country.remove-title', { name: row.name }),\n message: held ? t('country.remove-held') : t('country.remove-text'),\n confirmText: held ? t('country.disable') : t('country.remove'),\n cancelText: t('common.cancel'),\n tone: 'danger',\n })\n\n if (!agreed) return\n\n try {\n const removal = await api.removeCountry(row.code)\n\n toast.success(t(removal === 'deleted' ? 'country.removed' : 'country.deactivated'))\n if (removal === 'deleted' && country.value === row.code) country.value = ''\n await loadCountries()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction countryActions(row: CountryRow): RowAction[] {\n if (!canManage.value) return []\n\n return [\n {\n key: 'remove',\n icon: 'trash',\n label: t('country.remove'),\n danger: true,\n run: () => void removeCountry(row),\n },\n ]\n}\n\n/* ---------------------------------------------------------------------------- regions ----- */\n\nconst regions = ref<RegionRow[]>([])\nconst loadingRegions = ref(false)\nconst regionDialog = createModal<boolean, { country: string; region?: RegionRow | null }>(\n RegionDialog,\n)\n\n/*\n * A country's regions in its own order, dragged like the countries are: the selects of a\n * locality and the filter read them in it. The list is in its new order already; a refusal puts\n * the database's back on screen.\n */\nasync function orderRegions(): Promise<void> {\n try {\n await api.orderRegions(\n country.value,\n regions.value.map((one) => one.id),\n )\n } catch (error) {\n toast.danger(message(error, t('common.order-failed')))\n await loadRegions()\n }\n}\n\nasync function loadRegions(): Promise<void> {\n if (country.value === '') {\n regions.value = []\n\n return\n }\n\n loadingRegions.value = true\n\n try {\n regions.value = await api.regions(country.value)\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loadingRegions.value = false\n }\n}\n\nwatch(\n [country, view],\n () => {\n if (view.value === 'regions' || view.value === 'localities') void loadRegions()\n },\n { immediate: true },\n)\n\nasync function editRegion(region: RegionRow | null): Promise<void> {\n if (country.value === '') return\n\n if (await regionDialog({ country: country.value, region })) {\n toast.success(t('region.saved'))\n await loadRegions()\n }\n}\n\nasync function removeRegion(region: RegionRow): Promise<void> {\n const agreed = await confirm({\n title: t('region.delete-title', { name: region.name }),\n message: t('region.delete-text'),\n confirmText: t('common.delete'),\n cancelText: t('common.cancel'),\n tone: 'danger',\n })\n\n if (!agreed) return\n\n try {\n await api.removeRegion(region.id)\n toast.success(t('region.deleted'))\n await loadRegions()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\n/* A region with localities cannot go; the item stays, greyed, and says why (§20). */\nfunction regionActions(region: RegionRow): RowAction[] {\n if (!canManage.value) return []\n\n return [\n { key: 'edit', icon: 'edit', label: t('region.edit'), run: () => void editRegion(region) },\n {\n key: 'delete',\n icon: 'trash',\n label: t('common.delete'),\n danger: true,\n disabled: region.localities > 0,\n hint: region.localities > 0 ? t('region.delete-held') : undefined,\n run: () => void removeRegion(region),\n },\n ]\n}\n\n/* ------------------------------------------------------------------------- localities ----- */\n\nconst page = ref<LocalityPage | null>(null)\nconst loadingLocalities = ref(false)\nconst region = ref<number | null>(null)\nconst source = ref('')\nconst state = ref('')\nconst editing = ref<number | null>(null)\nconst editorOpen = ref(false)\n\nconst columns = computed<TableColumn<LocalityRow>[]>(() => [\n { key: 'name', label: t('locality.names'), minWidth: 160 },\n { key: 'kind', label: t('locality.kind'), width: 120, hideBelow: 560 },\n { key: 'region', label: t('locality.region'), minWidth: 140, hideBelow: 640 },\n { key: 'source', label: t('locality.source'), width: 120, hideBelow: 760 },\n { key: 'bindings', label: t('locality.bindings'), minWidth: 120, hideBelow: 900 },\n { key: 'weight', label: t('locality.weight'), width: 90, align: 'right', hideBelow: 900 },\n { key: 'active', label: t('locality.active'), width: 110 },\n { key: 'actions', label: '', width: rowMenuWidth, align: 'right' },\n])\n\nconst sourceOptions = computed(() => [\n { value: '', label: t('locality.any-source') },\n { value: 'manual', label: t('locality.sources.manual') },\n { value: 'import', label: t('locality.sources.import') },\n { value: 'carrier', label: t('locality.sources.carrier') },\n])\n\nconst stateOptions = computed(() => [\n { value: '', label: t('common.any-state') },\n { value: 'active', label: t('common.active') },\n { value: 'inactive', label: t('common.inactive') },\n])\n\nconst regionOptions = computed(() =>\n regions.value.map((one) => ({ value: one.id, label: one.name })),\n)\n\nlet last: TableState = { page: 1, perPage: 25, sort: null, search: '' }\n\nasync function loadLocalities(next: TableState = last): Promise<void> {\n last = next\n loadingLocalities.value = true\n\n try {\n page.value = await api.localities({\n page: next.page,\n per_page: next.perPage,\n q: next.search,\n country: country.value,\n region: region.value,\n source: source.value,\n state: state.value,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loadingLocalities.value = false\n }\n}\n\nwatch([country, region, source, state], () => {\n if (view.value === 'localities') void loadLocalities({ ...last, page: 1 })\n})\nwatch(country, () => (region.value = null))\n\n/*\n * «No localities yet» only when there are none: a search or a filter finds «nothing», and says\n * where the same search does find towns — another country, or one switched off.\n */\nconst emptyText = computed(() => {\n const elsewhere = page.value?.elsewhere ?? []\n const names = (list: typeof elsewhere) => list.map((one) => one.name).join(', ')\n const on = elsewhere.filter((one) => one.active)\n const off = elsewhere.filter((one) => !one.active)\n const filtered =\n last.search !== '' || !!country.value || !!region.value || !!source.value || !!state.value\n const lines = [\n filtered ? t('locality.nothing-found') : t('locality.empty'),\n on.length > 0 ? t('locality.found-in', { countries: names(on) }) : '',\n off.length > 0 ? t('locality.found-off', { countries: names(off) }) : '',\n ]\n\n return lines.filter((line) => line !== '').join(' ')\n})\n\nfunction edit(id: number | null): void {\n editing.value = id\n editorOpen.value = true\n}\n\nasync function activate(row: LocalityRow): Promise<void> {\n try {\n await api.activateLocality(row.id)\n toast.success(t('locality.activated'))\n await loadLocalities()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function deactivate(row: LocalityRow): Promise<void> {\n try {\n await api.deactivateLocality(row.id)\n toast.success(t('locality.switched-off'))\n await loadLocalities()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\n/*\n * «Delete» of a row by decision 42: the dialog says beforehand which of the two it will be, so\n * it asks the locality who holds it first — the list does not carry that for every row.\n */\nasync function removeLocality(row: LocalityRow): Promise<void> {\n let held: string[] = []\n\n try {\n held = (await api.locality(row.id)).locality.held_by\n } catch (error) {\n toast.danger(message(error))\n\n return\n }\n\n const agreed = await confirm({\n title: t('locality.delete-title', { name: row.name }),\n message:\n held.length > 0\n ? t('locality.held-text', { what: held.join(', ') })\n : t('locality.delete-text'),\n confirmText: held.length > 0 ? t('locality.deactivate') : t('common.delete'),\n cancelText: t('common.cancel'),\n tone: 'danger',\n })\n\n if (!agreed) return\n\n try {\n const { removal } = await api.removeLocality(row.id)\n\n toast.success(t(removal === 'deleted' ? 'locality.deleted' : 'locality.deactivated'))\n await loadLocalities()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\n/* The row's own actions, as every table of the panel has them; the click on the row edits. */\nfunction localityActions(row: LocalityRow): RowAction[] {\n if (!canManage.value) return []\n\n return [\n { key: 'edit', icon: 'edit', label: t('common.edit'), run: () => edit(row.id) },\n row.active\n ? {\n key: 'off',\n icon: 'eye-off',\n label: t('locality.deactivate'),\n run: () => void deactivate(row),\n }\n : { key: 'on', icon: 'eye', label: t('locality.activate'), run: () => void activate(row) },\n {\n key: 'delete',\n icon: 'trash',\n label: t('common.delete'),\n danger: true,\n run: () => void removeLocality(row),\n },\n ]\n}\n\nfunction saved(): void {\n void loadLocalities()\n}\n\n/* The action of the open view, a word without an icon like every head of the panel. */\nconst actions = computed<ScreenAction[]>(() => {\n if (!canManage.value) return []\n if (view.value === 'localities') {\n return [{ key: 'new', label: t('locality.new'), primary: true, run: () => edit(null) }]\n }\n if (view.value === 'regions' && country.value !== '') {\n return [{ key: 'new', label: t('region.add'), primary: true, run: () => void editRegion(null) }]\n }\n\n return []\n})\n</script>\n\n<template>\n <wx-list-screen v-model:view=\"view\" :title=\"title\" :views=\"views\" :actions=\"actions\">\n <!-- Localities -->\n <template v-if=\"view === 'localities'\">\n <wx-table\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loadingLocalities\"\n :search-placeholder=\"t('locality.search')\"\n :empty-text=\"emptyText\"\n :filters-count=\"(country ? 1 : 0) + (region ? 1 : 0) + (source ? 1 : 0) + (state ? 1 : 0)\"\n @row-click=\"(row: LocalityRow) => edit(row.id)\"\n @state-change=\"loadLocalities\"\n >\n <template #filters>\n <wx-form-item :label=\"t('locality.country')\">\n <wx-select\n v-model=\"country\"\n :options=\"[{ value: '', label: t('locality.any-country') }, ...countryOptions]\"\n size=\"sm\"\n filterable\n data-test=\"locality-country\"\n />\n </wx-form-item>\n <wx-form-item :label=\"t('locality.region')\">\n <wx-select\n v-model=\"region\"\n :options=\"regionOptions\"\n :placeholder=\"t('locality.any-region')\"\n size=\"sm\"\n filterable\n clearable\n />\n </wx-form-item>\n <wx-form-item :label=\"t('locality.source')\">\n <wx-select v-model=\"source\" :options=\"sourceOptions\" size=\"sm\" />\n </wx-form-item>\n <wx-form-item :label=\"t('locality.active')\">\n <wx-select v-model=\"state\" :options=\"stateOptions\" size=\"sm\" />\n </wx-form-item>\n </template>\n\n <template #cell-name=\"{ row }\">\n <span class=\"wx-delivery-geo__name\">{{ row.name }}</span>\n <span v-if=\"row.district\" class=\"wx-delivery-geo__muted\"> · {{ row.district }}</span>\n </template>\n <template #cell-kind=\"{ row }\">{{ row.kind_label }}</template>\n <template #cell-region=\"{ row }\">\n {{ row.region?.name ?? '' }}\n <!-- Every country that is on: the code tells two of one name apart. -->\n <span v-if=\"!country\" class=\"wx-delivery-geo__muted\"> · {{ row.country }}</span>\n </template>\n <template #cell-source=\"{ row }\">\n <wx-badge size=\"sm\">{{ t(`locality.sources.${row.source}`) }}</wx-badge>\n </template>\n <template #cell-bindings=\"{ row }\">\n <span class=\"wx-delivery-geo__muted\">{{\n row.bindings.map((one) => one.carrier_title).join(', ')\n }}</span>\n </template>\n <template #cell-active=\"{ row }\">\n <wx-badge v-if=\"row.active\" type=\"success\" dot>{{ t('common.active') }}</wx-badge>\n <wx-button v-else-if=\"canManage\" size=\"sm\" variant=\"outline\" @click.stop=\"activate(row)\">\n {{ t('locality.activate') }}\n </wx-button>\n <wx-badge v-else dot>{{ t('common.inactive') }}</wx-badge>\n </template>\n <template #cell-actions=\"{ row }\">\n <wx-row-menu :actions=\"localityActions(row)\" :label=\"row.name\" />\n </template>\n </wx-table>\n\n <locality-dialog\n :id=\"editing\"\n v-model:open=\"editorOpen\"\n :country=\"country || null\"\n @saved=\"saved\"\n @removed=\"loadLocalities()\"\n />\n </template>\n\n <!-- Countries -->\n <template v-else-if=\"view === 'countries'\">\n <div v-if=\"canManage\" class=\"wx-delivery-geo__bar\">\n <wx-select\n v-model=\"adding\"\n :options=\"choices\"\n filterable\n :placeholder=\"t('country.choose')\"\n :aria-label=\"t('country.add')\"\n class=\"wx-delivery-geo__choose\"\n data-test=\"country-choice\"\n />\n <wx-button\n type=\"primary\"\n :disabled=\"!adding\"\n data-test=\"country-enable\"\n @click=\"enable(adding)\"\n >\n {{ t('country.enable') }}\n </wx-button>\n </div>\n\n <!-- What «leading» means, once over the list rather than a tooltip on every row. -->\n <wx-text\n v-if=\"countries.length > 0 && leaderOptions.length > 1\"\n class=\"wx-delivery-geo__note\"\n tone=\"muted\"\n size=\"sm\"\n data-test=\"leader-help\"\n >\n {{ t('country.leader-help') }}\n </wx-text>\n\n <wx-skeleton v-if=\"loadingCountries && countries.length === 0\" :rows=\"3\" />\n <wx-empty\n v-else-if=\"countries.length === 0\"\n :title=\"t('country.empty')\"\n :description=\"t('country.empty-help')\"\n />\n <wx-sortable-list\n v-else\n v-model=\"countries\"\n class=\"wx-delivery-geo__list\"\n plain\n hoverable\n item-key=\"code\"\n :handle=\"canManage ? 'grip' : 'row'\"\n :item-label=\"(item: CountryRow) => item.name\"\n :disabled=\"!canManage\"\n @move=\"orderCountries\"\n >\n <template #default=\"{ item }\">\n <div class=\"wx-delivery-geo__country\">\n <span class=\"wx-delivery-geo__name\">{{ item.name }}</span>\n <span class=\"wx-delivery-geo__muted\">{{ item.code }}</span>\n <span class=\"wx-delivery-geo__muted\">\n {{ t('country.regions') }}: {{ item.regions }} · {{ t('country.localities') }}:\n {{ item.localities }}\n </span>\n <span v-if=\"leaderOptions.length > 1\" class=\"wx-delivery-geo__leader\">\n <span class=\"wx-delivery-geo__muted\">{{ t('country.leader') }}</span>\n <wx-select\n size=\"sm\"\n :model-value=\"item.leader ?? ''\"\n :options=\"leaderOptions\"\n :disabled=\"!canManage || item.leader_fixed\"\n :aria-label=\"t('country.leader')\"\n @update:model-value=\"lead(item.code, String($event ?? ''))\"\n />\n </span>\n </div>\n </template>\n <template #actions=\"{ item }\">\n <span class=\"wx-delivery-geo__country-actions\">\n <wx-switch\n :model-value=\"item.active\"\n :disabled=\"!canManage\"\n :aria-label=\"item.active ? t('country.disable') : t('country.enable')\"\n @update:model-value=\"toggle(item.code, Boolean($event))\"\n />\n <wx-row-menu :actions=\"countryActions(item)\" :label=\"item.name\" />\n </span>\n </template>\n </wx-sortable-list>\n </template>\n\n <!-- Regions -->\n <template v-else>\n <div class=\"wx-delivery-geo__bar\">\n <wx-select\n v-model=\"country\"\n :options=\"countryOptions\"\n filterable\n :placeholder=\"t('country.choose')\"\n :aria-label=\"t('locality.country')\"\n class=\"wx-delivery-geo__choose\"\n />\n </div>\n\n <wx-empty v-if=\"country === ''\" :title=\"t('region.country-first')\" />\n <wx-skeleton v-else-if=\"loadingRegions && regions.length === 0\" :rows=\"3\" />\n <wx-empty v-else-if=\"regions.length === 0\" :title=\"t('region.empty')\" />\n <template v-else>\n <wx-sortable-list\n v-model=\"regions\"\n class=\"wx-delivery-geo__list\"\n plain\n hoverable\n item-key=\"id\"\n :handle=\"canManage ? 'grip' : 'row'\"\n :item-label=\"(item: RegionRow) => item.name\"\n :disabled=\"!canManage\"\n :aria-label=\"t('region.title')\"\n data-test=\"regions\"\n @move=\"orderRegions\"\n >\n <template #default=\"{ item }\">\n <component\n :is=\"canManage ? 'button' : 'div'\"\n :type=\"canManage ? 'button' : undefined\"\n class=\"wx-delivery-geo__region\"\n @click=\"canManage && editRegion(item)\"\n >\n <span class=\"wx-delivery-geo__name\">{{ item.name }}</span>\n <span v-if=\"item.code\" class=\"wx-delivery-geo__muted\">{{ item.code }}</span>\n <span class=\"wx-delivery-geo__muted wx-delivery-geo__count\">\n {{ t('country.localities') }}: {{ item.localities }}\n </span>\n </component>\n </template>\n <template #actions=\"{ item }\">\n <wx-row-menu :actions=\"regionActions(item)\" :label=\"item.name\" />\n </template>\n </wx-sortable-list>\n\n <wx-alert\n v-if=\"canManage && regions.length > 1\"\n class=\"wx-delivery-geo__hint\"\n type=\"info\"\n :description=\"t('common.drag')\"\n />\n </template>\n </template>\n </wx-list-screen>\n</template>\n\n<style scoped>\n.wx-delivery-geo__bar {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n gap: var(--wx-space-8) var(--wx-space-12);\n margin-bottom: var(--wx-space-16);\n}\n\n.wx-delivery-geo__bar > :deep(.wx-select),\n.wx-delivery-geo__choose {\n flex: 0 1 320px;\n min-width: 0;\n}\n\n.wx-delivery-geo__bar :deep(.wx-form-item) {\n margin-bottom: 0;\n}\n\n.wx-delivery-geo__name {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-geo__muted {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-delivery-geo__country {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-4) var(--wx-space-12);\n min-width: 0;\n padding-block: var(--wx-space-8);\n}\n\n.wx-delivery-geo__leader {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-8);\n margin-inline-start: auto;\n}\n\n.wx-delivery-geo__leader > :deep(.wx-select) {\n width: 180px;\n}\n\n.wx-delivery-geo__note {\n display: block;\n max-width: 720px;\n margin-bottom: var(--wx-space-12);\n}\n\n/*\n * The rows stand off the card's edge and their own grip, like the panel's other dragged lists\n * (FAQ, team): the `···` at the end then has room around it instead of touching the border.\n */\n.wx-delivery-geo__list :deep(.wx-sortable-list__row) {\n gap: var(--wx-space-8);\n padding-inline: var(--wx-space-4) var(--wx-space-8);\n}\n\n/* The switch and the `···` are two controls, not one: a step between them like a toolbar's. */\n.wx-delivery-geo__country-actions {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-12);\n}\n\n.wx-delivery-geo__region {\n display: flex;\n flex: 1 1 auto;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--wx-space-4) var(--wx-space-12);\n width: 100%;\n min-width: 0;\n padding-block: var(--wx-space-10);\n padding-inline: 0;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n text-align: start;\n}\n\nbutton.wx-delivery-geo__region {\n cursor: pointer;\n}\n\n.wx-delivery-geo__count {\n margin-inline-start: auto;\n}\n\n.wx-delivery-geo__hint {\n margin-top: var(--wx-space-12);\n}\n</style>\n"],"names":["props","__props","open","resolve","useModal","api","createDeliveryApi","useAdmin","t","useDeliveryWords","message","useErrorText","names","ref","code","errors","saving","field","useTemplateRef","onMounted","nextTick","written","line","errorOf","key","found","one","submit","clean","locale","error","_createBlock","_unref","WxDialog","$event","_createVNode","WxSpace","WxButton","_createTextVNode","_toDisplayString","WxFormItem","_createElementVNode","WxInput","context","route","useRoute","router","useRouter","canManage","computed","title","module","views","view","value","country","data","loadingCountries","adding","loadCountries","toast","watch","list","countries","now","countryOptions","choices","known","leaderOptions","enable","toggle","on","lead","carrier","orderCountries","removeCountry","row","held","confirm","removal","countryActions","regions","loadingRegions","regionDialog","createModal","RegionDialog","orderRegions","loadRegions","editRegion","region","removeRegion","regionActions","page","loadingLocalities","source","state","editing","editorOpen","columns","rowMenuWidth","sourceOptions","stateOptions","regionOptions","last","loadLocalities","next","emptyText","elsewhere","off","filtered","edit","id","activate","deactivate","removeLocality","localityActions","saved","actions","WxListScreen","_createElementBlock","_Fragment","WxTable","WxSelect","_withCtx","_hoisted_1","_openBlock","_hoisted_2","_hoisted_3","WxBadge","_hoisted_4","_withModifiers","WxRowMenu","LocalityDialog","_hoisted_5","_cache","WxText","WxSkeleton","WxEmpty","WxSortableList","item","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","WxSwitch","_hoisted_13","_resolveDynamicComponent","_hoisted_14","_hoisted_15","_hoisted_16","WxAlert"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
|
|
2
|
+
export default _default;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { LocalityBrief } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* One locality of the shared geography, made or changed by hand (decision 42, §4.6): the screen
|
|
4
|
+
* `delivery.locality-form` in a dialog.
|
|
5
|
+
*
|
|
6
|
+
* The same dialog is the «Add a locality» of a point's form and of the courier's list — `short`
|
|
7
|
+
* then leaves only what a town needs to be found (name, type, region; the country is the one
|
|
8
|
+
* given) and the town made is handed back to the field it was asked from.
|
|
9
|
+
*
|
|
10
|
+
* A locality like one that exists is not refused but asked about (409): the dialog lists the
|
|
11
|
+
* similar ones to pick instead, and «Create anyway» makes the new one regardless.
|
|
12
|
+
*/
|
|
13
|
+
type __VLS_Props = {
|
|
14
|
+
/** `null` — a new locality. */
|
|
15
|
+
id?: number | null;
|
|
16
|
+
/** The country a new locality is in; the short form does not ask. */
|
|
17
|
+
country?: string | null;
|
|
18
|
+
/** What was typed in the search that found nothing: the name it starts with. */
|
|
19
|
+
name?: string;
|
|
20
|
+
short?: boolean;
|
|
21
|
+
};
|
|
22
|
+
type __VLS_PublicProps = {
|
|
23
|
+
'open'?: boolean;
|
|
24
|
+
} & __VLS_Props;
|
|
25
|
+
declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
26
|
+
saved: (locality: LocalityBrief) => any;
|
|
27
|
+
removed: (id: number) => any;
|
|
28
|
+
"update:open": (value: boolean) => any;
|
|
29
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
30
|
+
onSaved?: ((locality: LocalityBrief) => any) | undefined;
|
|
31
|
+
onRemoved?: ((id: number) => any) | undefined;
|
|
32
|
+
"onUpdate:open"?: ((value: boolean) => any) | undefined;
|
|
33
|
+
}>, {
|
|
34
|
+
name: string;
|
|
35
|
+
country: string | null;
|
|
36
|
+
id: number | null;
|
|
37
|
+
short: boolean;
|
|
38
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
39
|
+
export default _default;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { LocalityBrief } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* The search of a locality (§4.5) the section's pickers share: the field of a point, the
|
|
4
|
+
* courier's list, the popular towns, «Bind to…» of the queue. Prefix of any name, the heaviest
|
|
5
|
+
* first, active localities only.
|
|
6
|
+
*
|
|
7
|
+
* Nothing found — and `creatable` — the list itself says what to do (decision 42): its one line
|
|
8
|
+
* is «+ Add «<typed>»», which opens the short form with that name, and the town made is picked
|
|
9
|
+
* as if it had been found. In the list and not under the field: an open list covered whatever
|
|
10
|
+
* stood under it, and a button that only showed once the list was closed was never seen.
|
|
11
|
+
*/
|
|
12
|
+
type __VLS_Props = {
|
|
13
|
+
/** Only this country; none — every country of the site. */
|
|
14
|
+
country?: string | null;
|
|
15
|
+
/** Offer «Add a locality» when nothing is found. */
|
|
16
|
+
creatable?: boolean;
|
|
17
|
+
/** Ids not to offer — the ones already chosen. */
|
|
18
|
+
exclude?: number[];
|
|
19
|
+
placeholder?: string;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
};
|
|
22
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
23
|
+
pick: (locality: LocalityBrief) => any;
|
|
24
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
25
|
+
onPick?: ((locality: LocalityBrief) => any) | undefined;
|
|
26
|
+
}>, {
|
|
27
|
+
country: string | null;
|
|
28
|
+
disabled: boolean;
|
|
29
|
+
placeholder: string;
|
|
30
|
+
creatable: boolean;
|
|
31
|
+
exclude: number[];
|
|
32
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
33
|
+
export default _default;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { MethodRow } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* One method: the pane beside the list, and the whole screen on a phone. The described screen
|
|
4
|
+
* `delivery.method-form`, short of the fields its type has no use for — the kind of points of a
|
|
5
|
+
* method that asks for no point, the localities of anything but the shop's courier.
|
|
6
|
+
*
|
|
7
|
+
* A new method is a form first and a record on the first save, with its type fixed from then on.
|
|
8
|
+
*/
|
|
9
|
+
type __VLS_Props = {
|
|
10
|
+
id: number | null;
|
|
11
|
+
/** The type of a new method. */
|
|
12
|
+
type?: string | null;
|
|
13
|
+
inline?: boolean;
|
|
14
|
+
};
|
|
15
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
16
|
+
created: (method: MethodRow) => any;
|
|
17
|
+
saved: (method: MethodRow) => any;
|
|
18
|
+
removed: (id: number) => any;
|
|
19
|
+
back: () => any;
|
|
20
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
21
|
+
onCreated?: ((method: MethodRow) => any) | undefined;
|
|
22
|
+
onSaved?: ((method: MethodRow) => any) | undefined;
|
|
23
|
+
onRemoved?: ((id: number) => any) | undefined;
|
|
24
|
+
onBack?: (() => any) | undefined;
|
|
25
|
+
}>, {
|
|
26
|
+
type: string | null;
|
|
27
|
+
inline: boolean;
|
|
28
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
import { defineComponent as X, ref as c, computed as v, openBlock as i, createElementBlock as B, createBlock as _, unref as a, Fragment as E, createVNode as p, withCtx as n, createTextVNode as z, toDisplayString as h, createCommentVNode as M, createElementVNode as V, normalizeClass as ne, renderList as H } from "vue";
|
|
2
|
+
import { useRoute as se, useRouter as ie } from "vue-router";
|
|
3
|
+
import { useLocales as re, localizedValue as de, WxSkeleton as Y, WxActionBar as ue, WxButton as G, toast as b, confirm as ce, WxCard as ve, WxListDetail as pe, WxEmpty as K, WxSortableList as me, WxBadge as Q, WxAlert as ye, WxDialog as fe, WxFormItem as he, WxRadioGroup as _e, WxRadio as ge, WxSpace as ke } from "@webx-ui/core";
|
|
4
|
+
import { useAdmin as Z, useDefaultLocale as xe, useErrorText as ee, WxScreenHead as be, WxScreen as we, WxSaveState as We, WxListScreen as Se } from "@webx-ui/module-admin";
|
|
5
|
+
import { c as te, u as le, _ as ae } from "./index-5nt0M0In.js";
|
|
6
|
+
const Ce = { class: "wx-delivery-pane" }, Ve = /* @__PURE__ */ X({
|
|
7
|
+
__name: "MethodPane",
|
|
8
|
+
props: {
|
|
9
|
+
id: {},
|
|
10
|
+
type: { default: null },
|
|
11
|
+
inline: { type: Boolean, default: !0 }
|
|
12
|
+
},
|
|
13
|
+
emits: ["back", "saved", "created", "removed"],
|
|
14
|
+
setup(I, { emit: L }) {
|
|
15
|
+
const u = I, g = L, D = Z(), o = te(D), R = re(), k = xe(), r = le(), w = ee(), y = c(null), d = c({}), f = c([]), N = c([]), x = c(""), W = c(""), $ = c(!0), m = c(!1), S = c({}), C = v(() => D.can("delivery.manage")), T = v(() => W.value !== JSON.stringify(d.value)), U = v(
|
|
16
|
+
() => m.value ? "saving" : T.value || u.id === null ? "unsaved" : "saved"
|
|
17
|
+
), O = v(
|
|
18
|
+
() => de(
|
|
19
|
+
d.value.titles,
|
|
20
|
+
R.active.value,
|
|
21
|
+
u.id === null ? r("method.new") : y.value?.title ?? ""
|
|
22
|
+
) || r("common.untitled")
|
|
23
|
+
), q = v(() => y.value?.type ?? u.type), P = v(() => [
|
|
24
|
+
...f.value.map((e) => ({ op: "remove", target: e })),
|
|
25
|
+
...f.value.includes("point_kind") ? [] : [
|
|
26
|
+
{
|
|
27
|
+
op: "set",
|
|
28
|
+
target: "point_kind",
|
|
29
|
+
props: { options: N.value, creatable: q.value === "store.pickup" },
|
|
30
|
+
// A carrier's kinds are its branches and lockers, not the shop's points.
|
|
31
|
+
...q.value === "store.pickup" ? {} : { help: r("method.point-kind-carrier-help") }
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
]);
|
|
35
|
+
function A(e) {
|
|
36
|
+
y.value = e.method, d.value = e.values, f.value = e.hidden, N.value = e.point_kinds, x.value = e.method.type_title, W.value = JSON.stringify(e.values);
|
|
37
|
+
}
|
|
38
|
+
async function j() {
|
|
39
|
+
$.value = !0;
|
|
40
|
+
try {
|
|
41
|
+
if (u.id !== null)
|
|
42
|
+
A(await o.method(u.id));
|
|
43
|
+
else if (u.type) {
|
|
44
|
+
const e = await o.blank(u.type);
|
|
45
|
+
f.value = e.hidden, N.value = e.point_kinds, x.value = e.type_title, d.value = {
|
|
46
|
+
titles: { [k.value]: e.type_title },
|
|
47
|
+
descriptions: {},
|
|
48
|
+
price: null,
|
|
49
|
+
point_kind: e.point_kinds[0]?.value ?? null,
|
|
50
|
+
countries: [],
|
|
51
|
+
honours_paid_by_store: !0,
|
|
52
|
+
enabled: !0,
|
|
53
|
+
localities: []
|
|
54
|
+
}, W.value = "";
|
|
55
|
+
}
|
|
56
|
+
} catch (e) {
|
|
57
|
+
b.danger(w(e)), g("back");
|
|
58
|
+
} finally {
|
|
59
|
+
$.value = !1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
j();
|
|
63
|
+
async function J() {
|
|
64
|
+
if (!(m.value || !C.value)) {
|
|
65
|
+
m.value = !0, S.value = {};
|
|
66
|
+
try {
|
|
67
|
+
const e = u.id === null, t = e ? await o.createMethod(u.type, d.value) : await o.saveMethod(u.id, d.value);
|
|
68
|
+
A(t), b.success(r("common.saved")), g(e ? "created" : "saved", t.method);
|
|
69
|
+
} catch (e) {
|
|
70
|
+
const t = e.errors;
|
|
71
|
+
t && Object.keys(t).length > 0 ? (S.value = t, b.danger(r("common.save-failed"))) : b.danger(w(e));
|
|
72
|
+
} finally {
|
|
73
|
+
m.value = !1;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function F() {
|
|
78
|
+
const e = y.value;
|
|
79
|
+
if (!(!e || !await ce({
|
|
80
|
+
title: r("method.delete-title", { name: e.title }),
|
|
81
|
+
message: r("method.delete-text"),
|
|
82
|
+
confirmText: r("common.delete"),
|
|
83
|
+
cancelText: r("common.cancel"),
|
|
84
|
+
tone: "danger"
|
|
85
|
+
})))
|
|
86
|
+
try {
|
|
87
|
+
await o.removeMethod(e.id), b.success(r("method.deleted")), W.value = JSON.stringify(d.value), g("removed", e.id);
|
|
88
|
+
} catch (s) {
|
|
89
|
+
b.danger(w(s));
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const l = v(
|
|
93
|
+
() => C.value && y.value !== null ? [
|
|
94
|
+
{
|
|
95
|
+
key: "delete",
|
|
96
|
+
label: r("common.delete"),
|
|
97
|
+
icon: "trash",
|
|
98
|
+
danger: !0,
|
|
99
|
+
menu: !0,
|
|
100
|
+
run: () => {
|
|
101
|
+
F();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
] : []
|
|
105
|
+
);
|
|
106
|
+
return (e, t) => (i(), B("div", Ce, [
|
|
107
|
+
$.value ? (i(), _(a(Y), {
|
|
108
|
+
key: 0,
|
|
109
|
+
title: "",
|
|
110
|
+
rows: 6,
|
|
111
|
+
class: "wx-delivery-pane__ghost"
|
|
112
|
+
})) : (i(), B(E, { key: 1 }, [
|
|
113
|
+
p(a(be), {
|
|
114
|
+
level: 3,
|
|
115
|
+
back: !I.inline,
|
|
116
|
+
title: O.value,
|
|
117
|
+
subtitle: x.value,
|
|
118
|
+
actions: l.value,
|
|
119
|
+
"collapse-below": 480,
|
|
120
|
+
onBack: t[0] || (t[0] = (s) => g("back"))
|
|
121
|
+
}, null, 8, ["back", "title", "subtitle", "actions"]),
|
|
122
|
+
p(a(we), {
|
|
123
|
+
modelValue: d.value,
|
|
124
|
+
"onUpdate:modelValue": t[1] || (t[1] = (s) => d.value = s),
|
|
125
|
+
name: "delivery.method-form",
|
|
126
|
+
patch: P.value,
|
|
127
|
+
errors: S.value,
|
|
128
|
+
disabled: !C.value || m.value
|
|
129
|
+
}, null, 8, ["modelValue", "patch", "errors", "disabled"]),
|
|
130
|
+
C.value ? (i(), _(a(ue), { key: 0 }, {
|
|
131
|
+
state: n(() => [
|
|
132
|
+
p(a(We), { state: U.value }, null, 8, ["state"])
|
|
133
|
+
]),
|
|
134
|
+
default: n(() => [
|
|
135
|
+
p(a(G), {
|
|
136
|
+
type: "primary",
|
|
137
|
+
loading: m.value,
|
|
138
|
+
disabled: !T.value && u.id !== null,
|
|
139
|
+
onClick: J
|
|
140
|
+
}, {
|
|
141
|
+
default: n(() => [
|
|
142
|
+
z(h(a(r)("common.save")), 1)
|
|
143
|
+
]),
|
|
144
|
+
_: 1
|
|
145
|
+
}, 8, ["loading", "disabled"])
|
|
146
|
+
]),
|
|
147
|
+
_: 1
|
|
148
|
+
})) : M("", !0)
|
|
149
|
+
], 64))
|
|
150
|
+
]));
|
|
151
|
+
}
|
|
152
|
+
}), Me = /* @__PURE__ */ ae(Ve, [["__scopeId", "data-v-087a46c0"]]), Be = ["onClick"], Ne = { class: "wx-delivery-method__title" }, Le = {
|
|
153
|
+
key: 0,
|
|
154
|
+
class: "wx-delivery-method__line"
|
|
155
|
+
}, De = { class: "wx-delivery-method__facts" }, $e = { class: "wx-delivery-method__price" }, qe = { class: "wx-delivery-method__countries" }, ze = { class: "wx-delivery-types" }, Re = { class: "wx-delivery-types__title" }, Te = {
|
|
156
|
+
key: 0,
|
|
157
|
+
class: "wx-delivery-types__help"
|
|
158
|
+
}, Ue = /* @__PURE__ */ X({
|
|
159
|
+
__name: "MethodsPage",
|
|
160
|
+
setup(I) {
|
|
161
|
+
const L = Z(), u = te(L), g = se(), D = ie(), o = le(), R = ee(), k = c([]), r = c([]), w = c(!0), y = c(!1), d = c(null), f = v(() => L.can("delivery.manage")), N = v(
|
|
162
|
+
() => L.state.manifest?.modules.find((l) => l.id === "delivery")?.title ?? o("sections.methods")
|
|
163
|
+
), x = v(() => {
|
|
164
|
+
const l = g.query.method;
|
|
165
|
+
if (typeof l != "string" || l === "") return null;
|
|
166
|
+
if (l.startsWith("new:")) return f.value ? { id: null, type: l.slice(4) } : null;
|
|
167
|
+
const e = Number(l);
|
|
168
|
+
return Number.isInteger(e) && e > 0 ? { id: e, type: null } : null;
|
|
169
|
+
}), W = v({
|
|
170
|
+
get: () => x.value !== null,
|
|
171
|
+
set: (l) => {
|
|
172
|
+
l || C();
|
|
173
|
+
}
|
|
174
|
+
}), $ = v(() => {
|
|
175
|
+
const l = /* @__PURE__ */ new Map();
|
|
176
|
+
for (const e of r.value) {
|
|
177
|
+
const t = l.get(e.carrier) ?? { title: e.carrier_title, types: [] };
|
|
178
|
+
t.types.push(e), l.set(e.carrier, t);
|
|
179
|
+
}
|
|
180
|
+
return [...l.entries()].sort(([e], [t]) => e === "store" ? -1 : t === "store" ? 1 : e.localeCompare(t)).map(([e, t]) => ({ key: e, ...t }));
|
|
181
|
+
});
|
|
182
|
+
async function m() {
|
|
183
|
+
w.value = !0;
|
|
184
|
+
try {
|
|
185
|
+
const l = await u.methods();
|
|
186
|
+
k.value = l.methods, r.value = l.types;
|
|
187
|
+
} catch (l) {
|
|
188
|
+
b.danger(R(l));
|
|
189
|
+
} finally {
|
|
190
|
+
w.value = !1;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
m();
|
|
194
|
+
function S(l) {
|
|
195
|
+
D.replace({ query: { ...g.query, method: l } });
|
|
196
|
+
}
|
|
197
|
+
function C() {
|
|
198
|
+
const l = { ...g.query };
|
|
199
|
+
delete l.method, D.replace({ query: l });
|
|
200
|
+
}
|
|
201
|
+
function T() {
|
|
202
|
+
d.value = r.value[0]?.key ?? null, y.value = !0;
|
|
203
|
+
}
|
|
204
|
+
function U() {
|
|
205
|
+
d.value !== null && (y.value = !1, S(`new:${d.value}`));
|
|
206
|
+
}
|
|
207
|
+
const O = v(
|
|
208
|
+
() => f.value ? [{ key: "new", label: o("method.new"), primary: !0, run: () => T() }] : []
|
|
209
|
+
);
|
|
210
|
+
function q(l) {
|
|
211
|
+
const e = l.carrier !== "store" ? l.carrier_title ?? "" : "", t = l.type_title.trim().toLowerCase() === l.title.trim().toLowerCase(), s = l.type_title.includes(e) || l.title.includes(e);
|
|
212
|
+
return [t ? "" : l.type_title, e === "" || s ? "" : e].filter((oe) => oe !== "").join(" · ");
|
|
213
|
+
}
|
|
214
|
+
function P(l) {
|
|
215
|
+
S(String(l.id)), m();
|
|
216
|
+
}
|
|
217
|
+
function A() {
|
|
218
|
+
C(), m();
|
|
219
|
+
}
|
|
220
|
+
async function j() {
|
|
221
|
+
try {
|
|
222
|
+
await u.orderMethods(k.value.map((l) => l.id));
|
|
223
|
+
} catch (l) {
|
|
224
|
+
b.danger(R(l, o("common.order-failed"))), await m();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function J(l) {
|
|
228
|
+
return l.countries.length === 0 ? o("method.all-countries") : l.countries.join(", ");
|
|
229
|
+
}
|
|
230
|
+
const F = v(() => String(g.query.method ?? ""));
|
|
231
|
+
return (l, e) => (i(), _(a(Se), {
|
|
232
|
+
title: N.value,
|
|
233
|
+
actions: O.value,
|
|
234
|
+
card: !1
|
|
235
|
+
}, {
|
|
236
|
+
default: n(() => [
|
|
237
|
+
p(a(ve), {
|
|
238
|
+
class: "wx-delivery-methods",
|
|
239
|
+
padding: "none"
|
|
240
|
+
}, {
|
|
241
|
+
default: n(() => [
|
|
242
|
+
p(a(pe), {
|
|
243
|
+
open: W.value,
|
|
244
|
+
"onUpdate:open": e[1] || (e[1] = (t) => W.value = t),
|
|
245
|
+
"list-width": 380,
|
|
246
|
+
"detail-min": 460,
|
|
247
|
+
"detail-label": N.value
|
|
248
|
+
}, {
|
|
249
|
+
list: n(() => [
|
|
250
|
+
w.value && k.value.length === 0 ? (i(), _(a(Y), {
|
|
251
|
+
key: 0,
|
|
252
|
+
class: "wx-delivery-methods__ghost",
|
|
253
|
+
rows: 4
|
|
254
|
+
})) : k.value.length === 0 ? (i(), _(a(K), {
|
|
255
|
+
key: 1,
|
|
256
|
+
title: a(o)("method.empty"),
|
|
257
|
+
description: a(o)("method.empty-help")
|
|
258
|
+
}, null, 8, ["title", "description"])) : (i(), B(E, { key: 2 }, [
|
|
259
|
+
p(a(me), {
|
|
260
|
+
modelValue: k.value,
|
|
261
|
+
"onUpdate:modelValue": e[0] || (e[0] = (t) => k.value = t),
|
|
262
|
+
class: "wx-delivery-methods__list",
|
|
263
|
+
hoverable: "",
|
|
264
|
+
plain: "",
|
|
265
|
+
"item-key": "id",
|
|
266
|
+
handle: f.value ? "grip" : "row",
|
|
267
|
+
"item-label": (t) => t.title,
|
|
268
|
+
disabled: !f.value,
|
|
269
|
+
onMove: j
|
|
270
|
+
}, {
|
|
271
|
+
default: n(({ item: t }) => [
|
|
272
|
+
V("button", {
|
|
273
|
+
type: "button",
|
|
274
|
+
class: ne(["wx-delivery-method", { "is-current": x.value?.id === t.id }]),
|
|
275
|
+
onClick: (s) => S(String(t.id))
|
|
276
|
+
}, [
|
|
277
|
+
V("span", Ne, h(t.title), 1),
|
|
278
|
+
q(t) ? (i(), B("span", Le, h(q(t)), 1)) : M("", !0),
|
|
279
|
+
V("span", De, [
|
|
280
|
+
V("span", $e, h(t.price_text ?? a(o)("method.free")), 1),
|
|
281
|
+
V("span", qe, h(J(t)), 1),
|
|
282
|
+
t.enabled ? M("", !0) : (i(), _(a(Q), {
|
|
283
|
+
key: 0,
|
|
284
|
+
dot: "",
|
|
285
|
+
size: "sm"
|
|
286
|
+
}, {
|
|
287
|
+
default: n(() => [
|
|
288
|
+
z(h(a(o)("method.off")), 1)
|
|
289
|
+
]),
|
|
290
|
+
_: 1
|
|
291
|
+
})),
|
|
292
|
+
t.missing ? (i(), _(a(Q), {
|
|
293
|
+
key: 1,
|
|
294
|
+
type: "danger",
|
|
295
|
+
size: "sm"
|
|
296
|
+
}, {
|
|
297
|
+
default: n(() => [
|
|
298
|
+
z(h(a(o)("method.missing-type")), 1)
|
|
299
|
+
]),
|
|
300
|
+
_: 1
|
|
301
|
+
})) : M("", !0)
|
|
302
|
+
])
|
|
303
|
+
], 10, Be)
|
|
304
|
+
]),
|
|
305
|
+
_: 1
|
|
306
|
+
}, 8, ["modelValue", "handle", "item-label", "disabled"]),
|
|
307
|
+
f.value && k.value.length > 1 ? (i(), _(a(ye), {
|
|
308
|
+
key: 0,
|
|
309
|
+
class: "wx-delivery-methods__note",
|
|
310
|
+
type: "info",
|
|
311
|
+
description: a(o)("common.drag")
|
|
312
|
+
}, null, 8, ["description"])) : M("", !0)
|
|
313
|
+
], 64))
|
|
314
|
+
]),
|
|
315
|
+
detail: n(({ inline: t, back: s }) => [
|
|
316
|
+
x.value !== null ? (i(), _(Me, {
|
|
317
|
+
id: x.value.id,
|
|
318
|
+
key: F.value,
|
|
319
|
+
type: x.value.type,
|
|
320
|
+
inline: t,
|
|
321
|
+
onBack: s,
|
|
322
|
+
onSaved: m,
|
|
323
|
+
onCreated: P,
|
|
324
|
+
onRemoved: A
|
|
325
|
+
}, null, 8, ["id", "type", "inline", "onBack"])) : M("", !0)
|
|
326
|
+
]),
|
|
327
|
+
empty: n(() => [
|
|
328
|
+
p(a(K), {
|
|
329
|
+
title: a(o)("method.choose"),
|
|
330
|
+
description: f.value ? a(o)("method.choose-help") : void 0
|
|
331
|
+
}, null, 8, ["title", "description"])
|
|
332
|
+
]),
|
|
333
|
+
_: 1
|
|
334
|
+
}, 8, ["open", "detail-label"])
|
|
335
|
+
]),
|
|
336
|
+
_: 1
|
|
337
|
+
}),
|
|
338
|
+
p(a(fe), {
|
|
339
|
+
open: y.value,
|
|
340
|
+
"onUpdate:open": e[4] || (e[4] = (t) => y.value = t),
|
|
341
|
+
title: a(o)("method.choose-type"),
|
|
342
|
+
width: 520
|
|
343
|
+
}, {
|
|
344
|
+
footer: n(() => [
|
|
345
|
+
p(a(ke), { size: "sm" }, {
|
|
346
|
+
default: n(() => [
|
|
347
|
+
p(a(G), {
|
|
348
|
+
variant: "outline",
|
|
349
|
+
onClick: e[3] || (e[3] = (t) => y.value = !1)
|
|
350
|
+
}, {
|
|
351
|
+
default: n(() => [
|
|
352
|
+
z(h(a(o)("common.cancel")), 1)
|
|
353
|
+
]),
|
|
354
|
+
_: 1
|
|
355
|
+
}),
|
|
356
|
+
p(a(G), {
|
|
357
|
+
type: "primary",
|
|
358
|
+
disabled: d.value === null,
|
|
359
|
+
"data-test": "type-start",
|
|
360
|
+
onClick: U
|
|
361
|
+
}, {
|
|
362
|
+
default: n(() => [
|
|
363
|
+
z(h(a(o)("common.add")), 1)
|
|
364
|
+
]),
|
|
365
|
+
_: 1
|
|
366
|
+
}, 8, ["disabled"])
|
|
367
|
+
]),
|
|
368
|
+
_: 1
|
|
369
|
+
})
|
|
370
|
+
]),
|
|
371
|
+
default: n(() => [
|
|
372
|
+
V("div", ze, [
|
|
373
|
+
(i(!0), B(E, null, H($.value, (t) => (i(), _(a(he), {
|
|
374
|
+
key: t.key,
|
|
375
|
+
label: t.title
|
|
376
|
+
}, {
|
|
377
|
+
default: n(() => [
|
|
378
|
+
p(a(_e), {
|
|
379
|
+
modelValue: d.value,
|
|
380
|
+
"onUpdate:modelValue": e[2] || (e[2] = (s) => d.value = s),
|
|
381
|
+
class: "wx-delivery-types__list"
|
|
382
|
+
}, {
|
|
383
|
+
default: n(() => [
|
|
384
|
+
(i(!0), B(E, null, H(t.types, (s) => (i(), _(a(ge), {
|
|
385
|
+
key: s.key,
|
|
386
|
+
value: s.key,
|
|
387
|
+
"data-test": `type-${s.key}`,
|
|
388
|
+
onDblclick: U
|
|
389
|
+
}, {
|
|
390
|
+
default: n(() => [
|
|
391
|
+
V("span", Re, h(s.title), 1),
|
|
392
|
+
s.description ? (i(), B("span", Te, h(s.description), 1)) : M("", !0)
|
|
393
|
+
]),
|
|
394
|
+
_: 2
|
|
395
|
+
}, 1032, ["value", "data-test"]))), 128))
|
|
396
|
+
]),
|
|
397
|
+
_: 2
|
|
398
|
+
}, 1032, ["modelValue"])
|
|
399
|
+
]),
|
|
400
|
+
_: 2
|
|
401
|
+
}, 1032, ["label"]))), 128))
|
|
402
|
+
])
|
|
403
|
+
]),
|
|
404
|
+
_: 1
|
|
405
|
+
}, 8, ["open", "title"])
|
|
406
|
+
]),
|
|
407
|
+
_: 1
|
|
408
|
+
}, 8, ["title", "actions"]));
|
|
409
|
+
}
|
|
410
|
+
}), je = /* @__PURE__ */ ae(Ue, [["__scopeId", "data-v-fcdaa585"]]);
|
|
411
|
+
export {
|
|
412
|
+
je as default
|
|
413
|
+
};
|
|
414
|
+
//# sourceMappingURL=MethodsPage-Bpzsa_6v.js.map
|