@webx-ui/module-delivery 0.1.0 → 0.1.1

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.
@@ -1 +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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"}
1
+ {"version":3,"file":"GeographyPage-T3vwSyud.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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"}
@@ -2,7 +2,7 @@ import { defineComponent as X, ref as c, computed as v, openBlock as i, createEl
2
2
  import { useRoute as se, useRouter as ie } from "vue-router";
3
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
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";
5
+ import { c as te, u as le, _ as ae } from "./index-CuhwaAcG.js";
6
6
  const Ce = { class: "wx-delivery-pane" }, Ve = /* @__PURE__ */ X({
7
7
  __name: "MethodPane",
8
8
  props: {
@@ -112,6 +112,7 @@ const Ce = { class: "wx-delivery-pane" }, Ve = /* @__PURE__ */ X({
112
112
  })) : (i(), B(E, { key: 1 }, [
113
113
  p(a(be), {
114
114
  level: 3,
115
+ help: "delivery.method-form",
115
116
  back: !I.inline,
116
117
  title: O.value,
117
118
  subtitle: x.value,
@@ -149,7 +150,7 @@ const Ce = { class: "wx-delivery-pane" }, Ve = /* @__PURE__ */ X({
149
150
  ], 64))
150
151
  ]));
151
152
  }
152
- }), Me = /* @__PURE__ */ ae(Ve, [["__scopeId", "data-v-087a46c0"]]), Be = ["onClick"], Ne = { class: "wx-delivery-method__title" }, Le = {
153
+ }), Me = /* @__PURE__ */ ae(Ve, [["__scopeId", "data-v-526c2741"]]), Be = ["onClick"], Ne = { class: "wx-delivery-method__title" }, Le = {
153
154
  key: 0,
154
155
  class: "wx-delivery-method__line"
155
156
  }, 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 = {
@@ -411,4 +412,4 @@ const Ce = { class: "wx-delivery-pane" }, Ve = /* @__PURE__ */ X({
411
412
  export {
412
413
  je as default
413
414
  };
414
- //# sourceMappingURL=MethodsPage-Bpzsa_6v.js.map
415
+ //# sourceMappingURL=MethodsPage-DrrRpjVY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MethodsPage-DrrRpjVY.js","sources":["../src/MethodPane.vue","../src/MethodsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport {\n confirm,\n localizedValue,\n toast,\n useLocales,\n WxActionBar,\n WxButton,\n WxSkeleton,\n type LocalizedValue,\n} from '@webx-ui/core'\nimport {\n useAdmin,\n useDefaultLocale,\n useErrorText,\n WxSaveState,\n WxScreen,\n WxScreenHead,\n type ScreenAction,\n} from '@webx-ui/module-admin'\nimport type { Patch, ScreenModel } from '@webx-ui/schema'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport type { MethodDetail, MethodRow, Option } from './types'\n\n/**\n * One method: the pane beside the list, and the whole screen on a phone. The described screen\n * `delivery.method-form`, short of the fields its type has no use for — the kind of points of a\n * method that asks for no point, the localities of anything but the shop's courier.\n *\n * A new method is a form first and a record on the first save, with its type fixed from then on.\n */\nconst props = withDefaults(\n defineProps<{\n id: number | null\n /** The type of a new method. */\n type?: string | null\n inline?: boolean\n }>(),\n { type: null, inline: true },\n)\n\nconst emit = defineEmits<{\n back: []\n saved: [method: MethodRow]\n created: [method: MethodRow]\n removed: [id: number]\n}>()\n\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst locales = useLocales()\nconst main = useDefaultLocale()\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst method = ref<MethodRow | null>(null)\nconst values = ref<ScreenModel>({})\nconst hidden = ref<string[]>([])\nconst kinds = ref<Option[]>([])\nconst typeTitle = ref('')\nconst snapshot = ref('')\nconst loading = ref(true)\nconst saving = ref(false)\nconst errors = ref<Record<string, string[]>>({})\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst dirty = computed(() => snapshot.value !== JSON.stringify(values.value))\nconst state = computed<'saving' | 'unsaved' | 'saved'>(() =>\n saving.value ? 'saving' : dirty.value || props.id === null ? 'unsaved' : 'saved',\n)\n\nconst title = computed(\n () =>\n localizedValue(\n values.value.titles as LocalizedValue | null | undefined,\n locales.active.value,\n props.id === null ? t('method.new') : (method.value?.title ?? ''),\n ) || t('common.untitled'),\n)\n\n/* The type of the method open: fixed once it is saved. */\nconst type = computed(() => method.value?.type ?? props.type)\n\n/*\n * The fields of another type are not drawn, and the kinds offered are this type's. Only the\n * shop's pick-up names kinds of its own: a carrier's type says what its points are.\n */\nconst patch = computed<Patch>(() => [\n ...hidden.value.map((target) => ({ op: 'remove' as const, target })),\n ...(hidden.value.includes('point_kind')\n ? []\n : [\n {\n op: 'set' as const,\n target: 'point_kind',\n props: { options: kinds.value, creatable: type.value === 'store.pickup' },\n // A carrier's kinds are its branches and lockers, not the shop's points.\n ...(type.value === 'store.pickup' ? {} : { help: t('method.point-kind-carrier-help') }),\n },\n ]),\n])\n\nfunction take(detail: MethodDetail): void {\n method.value = detail.method\n values.value = detail.values\n hidden.value = detail.hidden\n kinds.value = detail.point_kinds\n typeTitle.value = detail.method.type_title\n snapshot.value = JSON.stringify(detail.values)\n}\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n if (props.id !== null) {\n take(await api.method(props.id))\n } else if (props.type) {\n const blank = await api.blank(props.type)\n\n hidden.value = blank.hidden\n kinds.value = blank.point_kinds\n typeTitle.value = blank.type_title\n values.value = {\n titles: { [main.value]: blank.type_title },\n descriptions: {},\n price: null,\n point_kind: blank.point_kinds[0]?.value ?? null,\n countries: [],\n honours_paid_by_store: true,\n enabled: true,\n localities: [],\n }\n snapshot.value = ''\n }\n } catch (error) {\n toast.danger(message(error))\n emit('back')\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\nasync function save(): Promise<void> {\n if (saving.value || !canManage.value) return\n\n saving.value = true\n errors.value = {}\n\n try {\n const made = props.id === null\n const detail = made\n ? await api.createMethod(props.type as string, values.value)\n : await api.saveMethod(props.id as number, values.value)\n\n take(detail)\n toast.success(t('common.saved'))\n if (made) emit('created', detail.method)\n else emit('saved', detail.method)\n } catch (error) {\n const fields = (error as { errors?: Record<string, string[]> }).errors\n\n if (fields && Object.keys(fields).length > 0) {\n errors.value = fields\n toast.danger(t('common.save-failed'))\n } else {\n toast.danger(message(error))\n }\n } finally {\n saving.value = false\n }\n}\n\nasync function remove(): Promise<void> {\n const record = method.value\n\n if (!record) return\n\n const agreed = await confirm({\n title: t('method.delete-title', { name: record.title }),\n message: t('method.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.removeMethod(record.id)\n toast.success(t('method.deleted'))\n snapshot.value = JSON.stringify(values.value)\n emit('removed', record.id)\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\n/* What leads away from the method; on a narrow pane the head folds it into the ···. */\nconst actions = computed<ScreenAction[]>(() =>\n canManage.value && method.value !== null\n ? [\n {\n key: 'delete',\n label: t('common.delete'),\n icon: 'trash',\n danger: true,\n menu: true,\n run: () => void remove(),\n },\n ]\n : [],\n)\n</script>\n\n<template>\n <div class=\"wx-delivery-pane\">\n <wx-skeleton v-if=\"loading\" title :rows=\"6\" class=\"wx-delivery-pane__ghost\" />\n\n <template v-else>\n <wx-screen-head\n :level=\"3\"\n help=\"delivery.method-form\"\n :back=\"!inline\"\n :title=\"title\"\n :subtitle=\"typeTitle\"\n :actions=\"actions\"\n :collapse-below=\"480\"\n @back=\"emit('back')\"\n />\n\n <wx-screen\n v-model=\"values\"\n name=\"delivery.method-form\"\n :patch=\"patch\"\n :errors=\"errors\"\n :disabled=\"!canManage || saving\"\n />\n\n <wx-action-bar v-if=\"canManage\">\n <template #state>\n <wx-save-state :state=\"state\" />\n </template>\n\n <wx-button\n type=\"primary\"\n :loading=\"saving\"\n :disabled=\"!dirty && props.id !== null\"\n @click=\"save\"\n >\n {{ t('common.save') }}\n </wx-button>\n </wx-action-bar>\n </template>\n </div>\n</template>\n\n<style scoped>\n.wx-delivery-pane {\n display: flex;\n flex-direction: column;\n gap: var(--wx-gap, var(--wx-space-16));\n min-width: 0;\n padding: var(--wx-gap, var(--wx-space-16));\n container-type: inline-size;\n}\n\n.wx-delivery-pane__ghost {\n max-width: 480px;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxCard,\n WxDialog,\n WxEmpty,\n WxFormItem,\n WxListDetail,\n WxRadio,\n WxRadioGroup,\n WxSkeleton,\n WxSortableList,\n WxSpace,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxListScreen, type ScreenAction } from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport MethodPane from './MethodPane.vue'\nimport type { MethodRow, MethodType } from './types'\n\n/**\n * The methods (§14.2): every one in the order the checkout lists them — dragged by the grip —\n * on the left, the one being written on the right. A new method starts from its type: the shop's\n * pick-up, its courier, or a carrier's method.\n *\n * The open method is in the address (`?method=` — an id, or `new:<type>`), so a link to one is a\n * link to it in its list.\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst route = useRoute()\nconst router = useRouter()\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst rows = ref<MethodRow[]>([])\nconst types = ref<MethodType[]>([])\nconst loading = ref(true)\nconst choosing = ref(false)\nconst picked = ref<string | null>(null)\n\nconst canManage = computed(() => context.can('delivery.manage'))\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery')?.title ??\n t('sections.methods'),\n)\n\n/** The open method: an id, or a new one of a type, or nothing. */\nconst selected = computed<{ id: number | null; type: string | null } | null>(() => {\n const raw = route.query.method\n\n if (typeof raw !== 'string' || raw === '') return null\n if (raw.startsWith('new:')) return canManage.value ? { id: null, type: raw.slice(4) } : null\n\n const id = Number(raw)\n\n return Number.isInteger(id) && id > 0 ? { id, type: null } : null\n})\n\nconst open = computed({\n get: () => selected.value !== null,\n set: (value) => {\n if (!value) close()\n },\n})\n\n/* The types by carrier: the shop's own first, as they are the ones a new shop starts with. */\nconst grouped = computed(() => {\n const groups = new Map<string, { title: string; types: MethodType[] }>()\n\n for (const type of types.value) {\n const group = groups.get(type.carrier) ?? { title: type.carrier_title, types: [] }\n\n group.types.push(type)\n groups.set(type.carrier, group)\n }\n\n return [...groups.entries()]\n .sort(([a], [b]) => (a === 'store' ? -1 : b === 'store' ? 1 : a.localeCompare(b)))\n .map(([key, group]) => ({ key, ...group }))\n})\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n const answer = await api.methods()\n\n rows.value = answer.methods\n types.value = answer.types\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\nfunction choose(value: string): void {\n void router.replace({ query: { ...route.query, method: value } })\n}\n\nfunction close(): void {\n const query = { ...route.query }\n\n delete query.method\n void router.replace({ query })\n}\n\n/* «Add a method» asks the type first: the form after it depends on it. */\nfunction startChoosing(): void {\n picked.value = types.value[0]?.key ?? null\n choosing.value = true\n}\n\nfunction start(): void {\n if (picked.value === null) return\n\n choosing.value = false\n choose(`new:${picked.value}`)\n}\n\n/* The section's one action, in the head like every list's — a word, no icon (§18.3). */\nconst actions = computed<ScreenAction[]>(() =>\n canManage.value\n ? [{ key: 'new', label: t('method.new'), primary: true, run: () => startChoosing() }]\n : [],\n)\n\n/*\n * The carrier under the method's name, unless the type's name already says it: a type named by\n * the panel reads «Carrier A branch», and «Carrier A branch · Carrier A» says it twice. Nor the\n * type when the method is named after it: «Carrier A branch» under «Carrier A branch» is an echo.\n */\nfunction line(row: MethodRow): string {\n const carrier = row.carrier !== 'store' ? (row.carrier_title ?? '') : ''\n const echo = row.type_title.trim().toLowerCase() === row.title.trim().toLowerCase()\n const said = row.type_title.includes(carrier) || row.title.includes(carrier)\n\n return [echo ? '' : row.type_title, carrier === '' || said ? '' : carrier]\n .filter((part) => part !== '')\n .join(' · ')\n}\n\nfunction created(method: MethodRow): void {\n choose(String(method.id))\n void load()\n}\n\nfunction removed(): void {\n close()\n void load()\n}\n\n/* The list is in its new order already; a refusal puts the database's back on screen. */\nasync function reorder(): Promise<void> {\n try {\n await api.orderMethods(rows.value.map((row) => row.id))\n } catch (error) {\n toast.danger(message(error, t('common.order-failed')))\n await load()\n }\n}\n\nfunction countries(row: MethodRow): string {\n return row.countries.length === 0 ? t('method.all-countries') : row.countries.join(', ')\n}\n\nconst paneKey = computed(() => String(route.query.method ?? ''))\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :actions=\"actions\" :card=\"false\">\n <wx-card class=\"wx-delivery-methods\" padding=\"none\">\n <wx-list-detail v-model:open=\"open\" :list-width=\"380\" :detail-min=\"460\" :detail-label=\"title\">\n <template #list>\n <wx-skeleton\n v-if=\"loading && rows.length === 0\"\n class=\"wx-delivery-methods__ghost\"\n :rows=\"4\"\n />\n\n <wx-empty\n v-else-if=\"rows.length === 0\"\n :title=\"t('method.empty')\"\n :description=\"t('method.empty-help')\"\n />\n\n <template v-else>\n <wx-sortable-list\n v-model=\"rows\"\n class=\"wx-delivery-methods__list\"\n hoverable\n plain\n item-key=\"id\"\n :handle=\"canManage ? 'grip' : 'row'\"\n :item-label=\"(item: MethodRow) => item.title\"\n :disabled=\"!canManage\"\n @move=\"reorder\"\n >\n <template #default=\"{ item }\">\n <button\n type=\"button\"\n class=\"wx-delivery-method\"\n :class=\"{ 'is-current': selected?.id === item.id }\"\n @click=\"choose(String(item.id))\"\n >\n <span class=\"wx-delivery-method__title\">{{ item.title }}</span>\n <span v-if=\"line(item)\" class=\"wx-delivery-method__line\">{{ line(item) }}</span>\n <span class=\"wx-delivery-method__facts\">\n <span class=\"wx-delivery-method__price\">{{\n item.price_text ?? t('method.free')\n }}</span>\n <span class=\"wx-delivery-method__countries\">{{ countries(item) }}</span>\n <wx-badge v-if=\"!item.enabled\" dot size=\"sm\">{{ t('method.off') }}</wx-badge>\n <wx-badge v-if=\"item.missing\" type=\"danger\" size=\"sm\">{{\n t('method.missing-type')\n }}</wx-badge>\n </span>\n </button>\n </template>\n </wx-sortable-list>\n\n <wx-alert\n v-if=\"canManage && rows.length > 1\"\n class=\"wx-delivery-methods__note\"\n type=\"info\"\n :description=\"t('common.drag')\"\n />\n </template>\n </template>\n\n <template #detail=\"{ inline, back }\">\n <method-pane\n v-if=\"selected !== null\"\n :id=\"selected.id\"\n :key=\"paneKey\"\n :type=\"selected.type\"\n :inline=\"inline\"\n @back=\"back\"\n @saved=\"load\"\n @created=\"created\"\n @removed=\"removed\"\n />\n </template>\n\n <template #empty>\n <wx-empty\n :title=\"t('method.choose')\"\n :description=\"canManage ? t('method.choose-help') : undefined\"\n />\n </template>\n </wx-list-detail>\n </wx-card>\n\n <!--\n A list of choices and not a wall of buttons: one name and one line of what it is per type,\n under the carrier it belongs to — the shape «New block» asks its kind in (module-blocks).\n -->\n <wx-dialog v-model:open=\"choosing\" :title=\"t('method.choose-type')\" :width=\"520\">\n <div class=\"wx-delivery-types\">\n <wx-form-item v-for=\"group in grouped\" :key=\"group.key\" :label=\"group.title\">\n <wx-radio-group v-model=\"picked\" class=\"wx-delivery-types__list\">\n <wx-radio\n v-for=\"type in group.types\"\n :key=\"type.key\"\n :value=\"type.key\"\n :data-test=\"`type-${type.key}`\"\n @dblclick=\"start\"\n >\n <span class=\"wx-delivery-types__title\">{{ type.title }}</span>\n <span v-if=\"type.description\" class=\"wx-delivery-types__help\">{{\n type.description\n }}</span>\n </wx-radio>\n </wx-radio-group>\n </wx-form-item>\n </div>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"choosing = false\">{{\n t('common.cancel')\n }}</wx-button>\n <wx-button\n type=\"primary\"\n :disabled=\"picked === null\"\n data-test=\"type-start\"\n @click=\"start\"\n >\n {{ t('common.add') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n </wx-list-screen>\n</template>\n\n<style>\n.wx-delivery-methods > .wx-card__body {\n display: flex;\n flex-direction: column;\n overflow: clip;\n border-radius: inherit;\n}\n</style>\n\n<style scoped>\n.wx-delivery-methods__ghost {\n padding: var(--wx-space-12);\n}\n\n/* Nothing stands above the list in its card, so it keeps off the top edge too (as Menu's lists do). */\n.wx-delivery-methods__list {\n padding: var(--wx-space-8);\n}\n\n.wx-delivery-methods__list :deep(.wx-sortable-list__row) {\n gap: var(--wx-space-4);\n padding-inline: var(--wx-space-4);\n}\n\n.wx-delivery-methods__note {\n margin: var(--wx-space-8);\n}\n\n.wx-delivery-method {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--wx-space-2);\n width: 100%;\n min-width: 0;\n padding-block: var(--wx-space-8);\n padding-inline: 0;\n border: 0;\n background: none;\n font: inherit;\n color: inherit;\n text-align: start;\n cursor: pointer;\n}\n\n.wx-delivery-method__title {\n overflow: hidden;\n font-weight: var(--wx-font-weight-medium);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-delivery-method.is-current .wx-delivery-method__title {\n color: var(--wx-color-primary);\n}\n\n.wx-delivery-method__line {\n overflow: hidden;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.wx-delivery-method__facts {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-delivery-method__price {\n font-variant-numeric: tabular-nums;\n}\n\n.wx-delivery-method__countries {\n color: var(--wx-text-muted);\n}\n\n.wx-delivery-types {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n}\n\n.wx-delivery-types__list {\n gap: var(--wx-space-10);\n}\n\n/* The circle beside the name, not beside the middle of name and line. */\n.wx-delivery-types__list :deep(.wx-radio) {\n align-items: flex-start;\n}\n\n.wx-delivery-types__title {\n display: block;\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-types__help {\n display: block;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n</style>\n"],"names":["props","__props","emit","__emit","context","useAdmin","api","createDeliveryApi","locales","useLocales","main","useDefaultLocale","t","useDeliveryWords","message","useErrorText","method","ref","values","hidden","kinds","typeTitle","snapshot","loading","saving","errors","canManage","computed","dirty","state","title","localizedValue","type","patch","target","take","detail","load","blank","error","toast","save","made","fields","remove","record","confirm","actions","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_unref","WxSkeleton","_Fragment","_createVNode","WxScreenHead","WxScreen","$event","WxActionBar","WxSaveState","WxButton","route","useRoute","router","useRouter","rows","types","choosing","picked","module","selected","raw","id","open","value","close","grouped","groups","group","a","b","key","answer","choose","query","startChoosing","start","line","row","carrier","echo","said","part","created","removed","reorder","countries","paneKey","WxListScreen","WxCard","WxListDetail","WxEmpty","WxSortableList","item","_withCtx","_createElementVNode","_normalizeClass","_hoisted_2","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","WxBadge","WxAlert","inline","back","MethodPane","WxDialog","WxSpace","_hoisted_7","_renderList","WxFormItem","WxRadioGroup","WxRadio","_hoisted_8","_hoisted_9"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as A, useModel as K, ref as u, computed as h, watch as F, openBlock as W, createBlock as B, unref as t, createSlots as Q, withCtx as a, createVNode as d, createTextVNode as m, toDisplayString as p, createCommentVNode as I, createElementVNode as X, mergeModels as N, createElementBlock as Y } from "vue";
2
2
  import { WxDialog as Z, WxText as O, WxSkeleton as ee, WxSpace as te, WxButton as U, toast as g, confirm as j, WxTable as le, WxBadge as ae, WxIcon as ne, WxFormItem as E, WxSelect as R } from "@webx-ui/core";
3
3
  import { useAdmin as q, useErrorText as L, WxScreen as oe, rowMenuWidth as ie, WxListScreen as se, WxRowMenu as de } from "@webx-ui/module-admin";
4
- import { c as G, u as H, _ as J } from "./index-5nt0M0In.js";
4
+ import { c as G, u as H, _ as J } from "./index-CuhwaAcG.js";
5
5
  const re = /* @__PURE__ */ A({
6
6
  __name: "PointDialog",
7
7
  props: /* @__PURE__ */ N({
@@ -333,4 +333,4 @@ const re = /* @__PURE__ */ A({
333
333
  export {
334
334
  ge as default
335
335
  };
336
- //# sourceMappingURL=PointsPage-CzYIM86R.js.map
336
+ //# sourceMappingURL=PointsPage-C16GT-YH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PointsPage-CzYIM86R.js","sources":["../src/PointDialog.vue","../src/PointsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { confirm, toast, WxButton, WxDialog, WxSkeleton, WxSpace, WxText } from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxScreen } from '@webx-ui/module-admin'\nimport type { ScreenModel } from '@webx-ui/schema'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport type { PointDetail } from './types'\n\n/**\n * One of the shop's own points (§14.2): the screen `delivery.point-form` in a dialog. Its\n * locality field searches the shared geography and adds a town it does not find (decision 42).\n */\nconst props = withDefaults(defineProps<{ id?: number | null }>(), { id: null })\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst emit = defineEmits<{ saved: []; removed: [] }>()\n\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst detail = ref<PointDetail | null>(null)\nconst values = ref<ScreenModel>({})\nconst errors = ref<Record<string, string[]>>({})\nconst loading = ref(false)\nconst saving = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(() =>\n props.id === null ? t('point.new') : detail.value?.point.title || t('point.title'),\n)\n\nasync function reset(): Promise<void> {\n errors.value = {}\n detail.value = null\n\n if (props.id === null) {\n values.value = {\n kind: 'store',\n titles: {},\n address: {},\n locality_id: null,\n lat: null,\n lng: null,\n phone: null,\n active: true,\n schedule: null,\n }\n\n return\n }\n\n loading.value = true\n\n try {\n detail.value = await api.point(props.id)\n values.value = detail.value.values\n } catch (error) {\n toast.danger(message(error))\n open.value = false\n } finally {\n loading.value = false\n }\n}\n\nwatch(open, (now) => {\n if (now) void reset()\n})\n\nasync function save(): Promise<void> {\n saving.value = true\n errors.value = {}\n\n try {\n if (props.id === null) await api.createPoint(values.value)\n else await api.savePoint(props.id, values.value)\n\n toast.success(t('common.saved'))\n emit('saved')\n open.value = false\n } catch (error) {\n const fields = (error as { errors?: Record<string, string[]> }).errors\n\n if (fields && Object.keys(fields).length > 0) {\n errors.value = fields\n toast.danger(t('common.save-failed'))\n } else {\n toast.danger(message(error))\n }\n } finally {\n saving.value = false\n }\n}\n\nasync function remove(): Promise<void> {\n if (props.id === null) return\n\n const agreed = await confirm({\n title: t('point.delete-title', { name: title.value }),\n message: t('point.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.removePoint(props.id)\n toast.success(t('point.deleted'))\n emit('removed')\n open.value = false\n } catch (error) {\n toast.danger(message(error))\n }\n}\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"title\" :width=\"640\" scroll=\"body\">\n <!-- What a point is, before the fields: the shop's own, never a carrier's branch. -->\n <wx-text class=\"wx-delivery-point__intro\" tone=\"muted\" size=\"sm\">{{\n t('point.intro')\n }}</wx-text>\n <wx-skeleton v-if=\"loading\" :rows=\"6\" />\n <wx-screen\n v-else\n v-model=\"values\"\n name=\"delivery.point-form\"\n :errors=\"errors\"\n :disabled=\"!canManage || saving\"\n />\n\n <template v-if=\"canManage\" #footer>\n <wx-space size=\"sm\" class=\"wx-delivery-point__footer\">\n <wx-button v-if=\"id !== null\" variant=\"text\" type=\"danger\" icon=\"trash\" @click=\"remove\">\n {{ t('common.delete') }}\n </wx-button>\n <span class=\"wx-delivery-point__gap\" />\n <wx-button variant=\"outline\" @click=\"open = false\">{{ t('common.cancel') }}</wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" :disabled=\"loading\" @click=\"save\">\n {{ id === null ? t('common.create') : t('common.save') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-delivery-point__intro {\n display: block;\n margin-bottom: var(--wx-space-16);\n}\n\n.wx-delivery-point__footer {\n width: 100%;\n}\n\n.wx-delivery-point__gap {\n flex: 1 1 auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n confirm,\n toast,\n WxBadge,\n WxFormItem,\n WxIcon,\n WxSelect,\n WxTable,\n WxText,\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 PointDialog from './PointDialog.vue'\nimport type { Option, PointRow, PointsPage } from './types'\n\n/**\n * The shop's own points (§14.2): stores and pick-up points a page at a time, by kind and state,\n * searched by name and address, sorted by any column but the address. A row opens its form, its\n * `···` offers the same and the deletion — the table every list of the panel is (Blog → Tags).\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst page = ref<PointsPage | null>(null)\nconst kinds = ref<Option[]>([])\nconst loading = ref(false)\nconst kind = ref('')\nconst state = ref('')\nconst editing = ref<number | null>(null)\nconst opened = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-points')?.title ??\n t('sections.points'),\n)\n\nconst actions = computed<ScreenAction[]>(() =>\n canManage.value\n ? [{ key: 'new', label: t('point.new'), primary: true, run: () => edit(null) }]\n : [],\n)\n\nconst columns = computed<TableColumn<PointRow>[]>(() => [\n { key: 'title', label: t('point.titles'), minWidth: 180, sortable: true },\n { key: 'kind', label: t('point.kind'), width: 150, hideBelow: 560, sortable: true },\n { key: 'locality', label: t('point.locality'), minWidth: 160, sortable: true },\n { key: 'address', label: t('point.address'), minWidth: 180, hideBelow: 760 },\n { key: 'today', label: t('point.today'), width: 140, hideBelow: 900 },\n { key: 'active', label: t('point.active'), width: 110, sortable: true },\n { key: 'actions', label: '', width: rowMenuWidth, align: 'right' },\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\nlet last: TableState = { page: 1, perPage: 25, sort: null, search: '' }\n\nasync function load(next: TableState = last): Promise<void> {\n last = next\n loading.value = true\n\n try {\n page.value = await api.points({\n page: next.page,\n per_page: next.perPage,\n q: next.search,\n kind: kind.value,\n state: state.value,\n sort: next.sort ? `${next.sort.order === 'desc' ? '-' : ''}${next.sort.key}` : undefined,\n })\n kinds.value = page.value.filters.kinds\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([kind, state], () => void load({ ...last, page: 1 }))\n\nfunction edit(id: number | null): void {\n editing.value = id\n opened.value = true\n}\n\nasync function remove(row: PointRow): Promise<void> {\n const agreed = await confirm({\n title: t('point.delete-title', { name: row.title || t('point.title') }),\n message: t('point.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.removePoint(row.id)\n toast.success(t('point.deleted'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction actionsFor(row: PointRow): RowAction[] {\n if (!canManage.value) return []\n\n return [\n { key: 'edit', icon: 'edit', label: t('common.edit'), run: () => edit(row.id) },\n {\n key: 'delete',\n icon: 'trash',\n label: t('common.delete'),\n danger: true,\n run: () => void remove(row),\n },\n ]\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :actions=\"actions\">\n <!-- What the screen is, in full: a heading's subtitle is one line and cuts this short. -->\n <template #before>\n <wx-text class=\"wx-delivery-intro\" tone=\"muted\" size=\"sm\">{{ t('point.intro') }}</wx-text>\n </template>\n\n <wx-table\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loading\"\n :search-placeholder=\"t('common.search')\"\n :empty-text=\"t('point.empty')\"\n :filters-count=\"(kind ? 1 : 0) + (state ? 1 : 0)\"\n @row-click=\"(row: PointRow) => edit(row.id)\"\n @state-change=\"load\"\n >\n <template #filters>\n <wx-form-item :label=\"t('point.kind')\">\n <wx-select\n v-model=\"kind\"\n :options=\"[{ value: '', label: t('point.any-kind') }, ...kinds]\"\n size=\"sm\"\n />\n </wx-form-item>\n <wx-form-item :label=\"t('point.active')\">\n <wx-select v-model=\"state\" :options=\"stateOptions\" size=\"sm\" />\n </wx-form-item>\n </template>\n\n <template #cell-title=\"{ row }\">{{ row.title || '—' }}</template>\n <template #cell-kind=\"{ row }\">{{ row.kind_label }}</template>\n <template #cell-locality=\"{ row }\">\n <span v-if=\"row.locality\">\n {{ row.locality.label }}\n <wx-icon v-if=\"!row.locality.active\" name=\"warning\" size=\"sm\" />\n </span>\n </template>\n <template #cell-today=\"{ row }\">{{ row.today ?? '' }}</template>\n <template #cell-active=\"{ row }\">\n <wx-badge :type=\"row.active ? 'success' : 'default'\" dot>\n {{ row.active ? t('common.active') : t('common.inactive') }}\n </wx-badge>\n </template>\n <template #cell-actions=\"{ row }\">\n <wx-row-menu :actions=\"actionsFor(row)\" :label=\"row.title\" />\n </template>\n </wx-table>\n\n <point-dialog :id=\"editing\" v-model:open=\"opened\" @saved=\"load()\" @removed=\"load()\" />\n </wx-list-screen>\n</template>\n\n<style scoped>\n/* A paragraph and not a line: read once, it has to fit without running the whole width. */\n.wx-delivery-intro {\n display: block;\n max-width: 760px;\n}\n</style>\n"],"names":["props","__props","open","_useModel","emit","__emit","context","useAdmin","api","createDeliveryApi","t","useDeliveryWords","message","useErrorText","detail","ref","values","errors","loading","saving","canManage","computed","title","reset","error","toast","watch","now","save","fields","remove","confirm","_createBlock","_unref","WxDialog","$event","_createVNode","WxText","WxSkeleton","WxScreen","WxSpace","WxButton","_createElementVNode","page","kinds","kind","state","editing","opened","module","actions","edit","columns","rowMenuWidth","stateOptions","last","load","next","id","row","actionsFor","WxListScreen","WxTable","WxFormItem","WxSelect","_withCtx","_createTextVNode","_toDisplayString","_createElementBlock","_hoisted_1","WxIcon","WxBadge","WxRowMenu","PointDialog"],"mappings":"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"}
1
+ {"version":3,"file":"PointsPage-C16GT-YH.js","sources":["../src/PointDialog.vue","../src/PointsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { confirm, toast, WxButton, WxDialog, WxSkeleton, WxSpace, WxText } from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxScreen } from '@webx-ui/module-admin'\nimport type { ScreenModel } from '@webx-ui/schema'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport type { PointDetail } from './types'\n\n/**\n * One of the shop's own points (§14.2): the screen `delivery.point-form` in a dialog. Its\n * locality field searches the shared geography and adds a town it does not find (decision 42).\n */\nconst props = withDefaults(defineProps<{ id?: number | null }>(), { id: null })\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst emit = defineEmits<{ saved: []; removed: [] }>()\n\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst detail = ref<PointDetail | null>(null)\nconst values = ref<ScreenModel>({})\nconst errors = ref<Record<string, string[]>>({})\nconst loading = ref(false)\nconst saving = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(() =>\n props.id === null ? t('point.new') : detail.value?.point.title || t('point.title'),\n)\n\nasync function reset(): Promise<void> {\n errors.value = {}\n detail.value = null\n\n if (props.id === null) {\n values.value = {\n kind: 'store',\n titles: {},\n address: {},\n locality_id: null,\n lat: null,\n lng: null,\n phone: null,\n active: true,\n schedule: null,\n }\n\n return\n }\n\n loading.value = true\n\n try {\n detail.value = await api.point(props.id)\n values.value = detail.value.values\n } catch (error) {\n toast.danger(message(error))\n open.value = false\n } finally {\n loading.value = false\n }\n}\n\nwatch(open, (now) => {\n if (now) void reset()\n})\n\nasync function save(): Promise<void> {\n saving.value = true\n errors.value = {}\n\n try {\n if (props.id === null) await api.createPoint(values.value)\n else await api.savePoint(props.id, values.value)\n\n toast.success(t('common.saved'))\n emit('saved')\n open.value = false\n } catch (error) {\n const fields = (error as { errors?: Record<string, string[]> }).errors\n\n if (fields && Object.keys(fields).length > 0) {\n errors.value = fields\n toast.danger(t('common.save-failed'))\n } else {\n toast.danger(message(error))\n }\n } finally {\n saving.value = false\n }\n}\n\nasync function remove(): Promise<void> {\n if (props.id === null) return\n\n const agreed = await confirm({\n title: t('point.delete-title', { name: title.value }),\n message: t('point.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.removePoint(props.id)\n toast.success(t('point.deleted'))\n emit('removed')\n open.value = false\n } catch (error) {\n toast.danger(message(error))\n }\n}\n</script>\n\n<template>\n <wx-dialog v-model:open=\"open\" :title=\"title\" :width=\"640\" scroll=\"body\">\n <!-- What a point is, before the fields: the shop's own, never a carrier's branch. -->\n <wx-text class=\"wx-delivery-point__intro\" tone=\"muted\" size=\"sm\">{{\n t('point.intro')\n }}</wx-text>\n <wx-skeleton v-if=\"loading\" :rows=\"6\" />\n <wx-screen\n v-else\n v-model=\"values\"\n name=\"delivery.point-form\"\n :errors=\"errors\"\n :disabled=\"!canManage || saving\"\n />\n\n <template v-if=\"canManage\" #footer>\n <wx-space size=\"sm\" class=\"wx-delivery-point__footer\">\n <wx-button v-if=\"id !== null\" variant=\"text\" type=\"danger\" icon=\"trash\" @click=\"remove\">\n {{ t('common.delete') }}\n </wx-button>\n <span class=\"wx-delivery-point__gap\" />\n <wx-button variant=\"outline\" @click=\"open = false\">{{ t('common.cancel') }}</wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" :disabled=\"loading\" @click=\"save\">\n {{ id === null ? t('common.create') : t('common.save') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-delivery-point__intro {\n display: block;\n margin-bottom: var(--wx-space-16);\n}\n\n.wx-delivery-point__footer {\n width: 100%;\n}\n\n.wx-delivery-point__gap {\n flex: 1 1 auto;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n confirm,\n toast,\n WxBadge,\n WxFormItem,\n WxIcon,\n WxSelect,\n WxTable,\n WxText,\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 PointDialog from './PointDialog.vue'\nimport type { Option, PointRow, PointsPage } from './types'\n\n/**\n * The shop's own points (§14.2): stores and pick-up points a page at a time, by kind and state,\n * searched by name and address, sorted by any column but the address. A row opens its form, its\n * `···` offers the same and the deletion — the table every list of the panel is (Blog → Tags).\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst page = ref<PointsPage | null>(null)\nconst kinds = ref<Option[]>([])\nconst loading = ref(false)\nconst kind = ref('')\nconst state = ref('')\nconst editing = ref<number | null>(null)\nconst opened = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-points')?.title ??\n t('sections.points'),\n)\n\nconst actions = computed<ScreenAction[]>(() =>\n canManage.value\n ? [{ key: 'new', label: t('point.new'), primary: true, run: () => edit(null) }]\n : [],\n)\n\nconst columns = computed<TableColumn<PointRow>[]>(() => [\n { key: 'title', label: t('point.titles'), minWidth: 180, sortable: true },\n { key: 'kind', label: t('point.kind'), width: 150, hideBelow: 560, sortable: true },\n { key: 'locality', label: t('point.locality'), minWidth: 160, sortable: true },\n { key: 'address', label: t('point.address'), minWidth: 180, hideBelow: 760 },\n { key: 'today', label: t('point.today'), width: 140, hideBelow: 900 },\n { key: 'active', label: t('point.active'), width: 110, sortable: true },\n { key: 'actions', label: '', width: rowMenuWidth, align: 'right' },\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\nlet last: TableState = { page: 1, perPage: 25, sort: null, search: '' }\n\nasync function load(next: TableState = last): Promise<void> {\n last = next\n loading.value = true\n\n try {\n page.value = await api.points({\n page: next.page,\n per_page: next.perPage,\n q: next.search,\n kind: kind.value,\n state: state.value,\n sort: next.sort ? `${next.sort.order === 'desc' ? '-' : ''}${next.sort.key}` : undefined,\n })\n kinds.value = page.value.filters.kinds\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([kind, state], () => void load({ ...last, page: 1 }))\n\nfunction edit(id: number | null): void {\n editing.value = id\n opened.value = true\n}\n\nasync function remove(row: PointRow): Promise<void> {\n const agreed = await confirm({\n title: t('point.delete-title', { name: row.title || t('point.title') }),\n message: t('point.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.removePoint(row.id)\n toast.success(t('point.deleted'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nfunction actionsFor(row: PointRow): RowAction[] {\n if (!canManage.value) return []\n\n return [\n { key: 'edit', icon: 'edit', label: t('common.edit'), run: () => edit(row.id) },\n {\n key: 'delete',\n icon: 'trash',\n label: t('common.delete'),\n danger: true,\n run: () => void remove(row),\n },\n ]\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :actions=\"actions\">\n <!-- What the screen is, in full: a heading's subtitle is one line and cuts this short. -->\n <template #before>\n <wx-text class=\"wx-delivery-intro\" tone=\"muted\" size=\"sm\">{{ t('point.intro') }}</wx-text>\n </template>\n\n <wx-table\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n searchable\n clickable\n hover\n flush\n :loading=\"loading\"\n :search-placeholder=\"t('common.search')\"\n :empty-text=\"t('point.empty')\"\n :filters-count=\"(kind ? 1 : 0) + (state ? 1 : 0)\"\n @row-click=\"(row: PointRow) => edit(row.id)\"\n @state-change=\"load\"\n >\n <template #filters>\n <wx-form-item :label=\"t('point.kind')\">\n <wx-select\n v-model=\"kind\"\n :options=\"[{ value: '', label: t('point.any-kind') }, ...kinds]\"\n size=\"sm\"\n />\n </wx-form-item>\n <wx-form-item :label=\"t('point.active')\">\n <wx-select v-model=\"state\" :options=\"stateOptions\" size=\"sm\" />\n </wx-form-item>\n </template>\n\n <template #cell-title=\"{ row }\">{{ row.title || '—' }}</template>\n <template #cell-kind=\"{ row }\">{{ row.kind_label }}</template>\n <template #cell-locality=\"{ row }\">\n <span v-if=\"row.locality\">\n {{ row.locality.label }}\n <wx-icon v-if=\"!row.locality.active\" name=\"warning\" size=\"sm\" />\n </span>\n </template>\n <template #cell-today=\"{ row }\">{{ row.today ?? '' }}</template>\n <template #cell-active=\"{ row }\">\n <wx-badge :type=\"row.active ? 'success' : 'default'\" dot>\n {{ row.active ? t('common.active') : t('common.inactive') }}\n </wx-badge>\n </template>\n <template #cell-actions=\"{ row }\">\n <wx-row-menu :actions=\"actionsFor(row)\" :label=\"row.title\" />\n </template>\n </wx-table>\n\n <point-dialog :id=\"editing\" v-model:open=\"opened\" @saved=\"load()\" @removed=\"load()\" />\n </wx-list-screen>\n</template>\n\n<style scoped>\n/* A paragraph and not a line: read once, it has to fit without running the whole width. */\n.wx-delivery-intro {\n display: block;\n max-width: 760px;\n}\n</style>\n"],"names":["props","__props","open","_useModel","emit","__emit","context","useAdmin","api","createDeliveryApi","t","useDeliveryWords","message","useErrorText","detail","ref","values","errors","loading","saving","canManage","computed","title","reset","error","toast","watch","now","save","fields","remove","confirm","_createBlock","_unref","WxDialog","$event","_createVNode","WxText","WxSkeleton","WxScreen","WxSpace","WxButton","_createElementVNode","page","kinds","kind","state","editing","opened","module","actions","edit","columns","rowMenuWidth","stateOptions","last","load","next","id","row","actionsFor","WxListScreen","WxTable","WxFormItem","WxSelect","_withCtx","_createTextVNode","_toDisplayString","_createElementBlock","_hoisted_1","WxIcon","WxBadge","WxRowMenu","PointDialog"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as C, ref as g, computed as w, openBlock as n, createBlock as d, unref as e, withCtx as c, createVNode as m, createElementBlock as k, createElementVNode as v, toDisplayString as _, createCommentVNode as x, Fragment as S, createSlots as A, createTextVNode as B } from "vue";
2
2
  import { WxCard as E, WxSkeleton as N, WxEmpty as D, WxSortableList as L, WxBadge as z, WxAction as M, WxAlert as T, toast as i } from "@webx-ui/core";
3
3
  import { useAdmin as F, useErrorText as I, WxListScreen as U } from "@webx-ui/module-admin";
4
- import { c as $, u as j, a as q, _ as G } from "./index-5nt0M0In.js";
4
+ import { c as $, u as j, a as q, _ as G } from "./index-CuhwaAcG.js";
5
5
  const H = {
6
6
  key: 0,
7
7
  class: "wx-delivery-popular__add"
@@ -138,4 +138,4 @@ const H = {
138
138
  export {
139
139
  te as default
140
140
  };
141
- //# sourceMappingURL=PopularPage-CSrvVg4o.js.map
141
+ //# sourceMappingURL=PopularPage-BdE59dwB.js.map