@webx-ui/module-delivery 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BindingsPage-DiVZys4B.js → BindingsPage-BssjF4sQ.js} +2 -2
- package/dist/{BindingsPage-DiVZys4B.js.map → BindingsPage-BssjF4sQ.js.map} +1 -1
- package/dist/{CarriersPage-DlaIE-2K.js → CarriersPage-CV9uFlXk.js} +2 -2
- package/dist/{CarriersPage-DlaIE-2K.js.map → CarriersPage-CV9uFlXk.js.map} +1 -1
- package/dist/{GeographyPage-T3vwSyud.js → GeographyPage-BvhBUFBv.js} +2 -2
- package/dist/{GeographyPage-T3vwSyud.js.map → GeographyPage-BvhBUFBv.js.map} +1 -1
- package/dist/{MethodsPage-DrrRpjVY.js → MethodsPage-tSsXLSUX.js} +2 -2
- package/dist/{MethodsPage-DrrRpjVY.js.map → MethodsPage-tSsXLSUX.js.map} +1 -1
- package/dist/{PointsPage-C16GT-YH.js → PointsPage-DzcGDwjQ.js} +2 -2
- package/dist/{PointsPage-C16GT-YH.js.map → PointsPage-DzcGDwjQ.js.map} +1 -1
- package/dist/{PopularPage-BdE59dwB.js → PopularPage-CaN3vwKt.js} +2 -2
- package/dist/{PopularPage-BdE59dwB.js.map → PopularPage-CaN3vwKt.js.map} +1 -1
- package/dist/{index-CuhwaAcG.js → index-CAiJkqKq.js} +214 -213
- package/dist/index-CAiJkqKq.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/style.css +1 -1
- package/package.json +4 -4
- package/dist/index-CuhwaAcG.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
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
|
+
{"version":3,"file":"PointsPage-DzcGDwjQ.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-
|
|
4
|
+
import { c as $, u as j, a as q, _ as G } from "./index-CAiJkqKq.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-
|
|
141
|
+
//# sourceMappingURL=PopularPage-CaN3vwKt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PopularPage-
|
|
1
|
+
{"version":3,"file":"PopularPage-CaN3vwKt.js","sources":["../src/PopularPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport {\n toast,\n WxAction,\n WxAlert,\n WxBadge,\n WxCard,\n WxEmpty,\n WxSkeleton,\n WxSortableList,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxListScreen } from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport LocalitySearch from './LocalitySearch.vue'\nimport type { LocalityBrief } from './types'\n\n/**\n * The popular towns of the checkout's dialog (decision 40): one list for the site, the buttons\n * under the search in the order dragged here. «Add» searches the shared geography; a locality\n * switched off stays in the list, marked — the dialog skips it until it is on again.\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst rows = ref<LocalityBrief[]>([])\nconst loading = ref(true)\nconst canManage = computed(() => context.can('delivery.manage'))\n\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-popular')?.title ??\n t('sections.popular'),\n)\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n rows.value = await api.popular()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\nasync function add(locality: LocalityBrief): Promise<void> {\n if (rows.value.some((row) => row.id === locality.id)) {\n toast.info(t('popular.already'))\n\n return\n }\n\n try {\n rows.value = await api.addPopular(locality.id)\n toast.success(t('popular.added'))\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function remove(row: LocalityBrief): Promise<void> {\n try {\n rows.value = await api.removePopular(row.id)\n toast.success(t('popular.removed'))\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function reorder(): Promise<void> {\n try {\n rows.value = await api.setPopular(rows.value.map((row) => row.id))\n } catch (error) {\n toast.danger(message(error, t('common.order-failed')))\n await load()\n }\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :card=\"false\">\n <wx-card class=\"wx-delivery-popular\">\n <div v-if=\"canManage\" class=\"wx-delivery-popular__add\">\n <locality-search\n creatable\n :exclude=\"rows.map((row) => row.id)\"\n :placeholder=\"t('popular.add')\"\n @pick=\"add\"\n />\n <span class=\"wx-delivery-popular__help\">{{ t('popular.add-help') }}</span>\n </div>\n\n <wx-skeleton v-if=\"loading && rows.length === 0\" :rows=\"4\" />\n\n <wx-empty\n v-else-if=\"rows.length === 0\"\n :title=\"t('popular.empty')\"\n :description=\"t('popular.empty-help')\"\n />\n\n <template v-else>\n <wx-sortable-list\n v-model=\"rows\"\n class=\"wx-delivery-popular__list\"\n hoverable\n plain\n item-key=\"id\"\n :handle=\"canManage ? 'grip' : 'row'\"\n :item-label=\"(item: LocalityBrief) => item.name\"\n :disabled=\"!canManage\"\n data-test=\"popular-list\"\n @move=\"reorder\"\n >\n <template #default=\"{ item }\">\n <span class=\"wx-delivery-popular__row\">\n <span class=\"wx-delivery-popular__name\">{{ item.name }}</span>\n <span class=\"wx-delivery-popular__label\">{{ item.label }}</span>\n <wx-badge v-if=\"!item.active\" size=\"sm\" type=\"warning\" dot>\n {{ t('popular.hidden') }}\n </wx-badge>\n </span>\n </template>\n\n <!-- Asked first, with the red bin the panel removes a row of a list by (blog → rubrics). -->\n <template v-if=\"canManage\" #actions=\"{ item }\">\n <wx-action\n type=\"remove\"\n size=\"sm\"\n :title=\"t('popular.remove')\"\n :confirm=\"t('popular.remove-title', { name: item.name })\"\n :confirm-text=\"t('popular.remove')\"\n :cancel-text=\"t('common.cancel')\"\n data-test=\"popular-remove\"\n @click=\"remove(item)\"\n />\n </template>\n </wx-sortable-list>\n\n <wx-alert\n v-if=\"canManage && rows.length > 1\"\n class=\"wx-delivery-popular__note\"\n type=\"info\"\n :description=\"t('common.drag')\"\n />\n </template>\n </wx-card>\n </wx-list-screen>\n</template>\n\n<style scoped>\n.wx-delivery-popular__add {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-4);\n max-width: 480px;\n margin-bottom: var(--wx-space-16);\n}\n\n.wx-delivery-popular__help {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n/* Off the card's edge on both sides: the bin at the end gets room, as the grip at the start has. */\n.wx-delivery-popular__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.wx-delivery-popular__row {\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-8);\n min-width: 0;\n padding-block: var(--wx-space-8);\n}\n\n.wx-delivery-popular__name {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-popular__label {\n min-width: 0;\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-delivery-popular__note {\n margin-top: var(--wx-space-12);\n}\n</style>\n"],"names":["context","useAdmin","api","createDeliveryApi","t","useDeliveryWords","message","useErrorText","rows","ref","loading","canManage","computed","title","module","load","error","toast","add","locality","row","remove","reorder","_createBlock","_unref","WxListScreen","_createVNode","WxCard","_openBlock","_createElementBlock","_hoisted_1","LocalitySearch","_createElementVNode","_hoisted_2","_toDisplayString","WxSkeleton","WxEmpty","_Fragment","WxSortableList","$event","item","_withCtx","_hoisted_3","_hoisted_4","_hoisted_5","WxBadge","WxAction","WxAlert"],"mappings":"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"}
|