@webx-ui/module-delivery 0.1.0 → 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-pjTbDDWA.js → BindingsPage-BssjF4sQ.js} +2 -2
- package/dist/{BindingsPage-pjTbDDWA.js.map → BindingsPage-BssjF4sQ.js.map} +1 -1
- package/dist/{CarriersPage-Dpre8dbl.js → CarriersPage-CV9uFlXk.js} +2 -2
- package/dist/{CarriersPage-Dpre8dbl.js.map → CarriersPage-CV9uFlXk.js.map} +1 -1
- package/dist/{GeographyPage-IBg0JnNH.js → GeographyPage-BvhBUFBv.js} +2 -2
- package/dist/{GeographyPage-IBg0JnNH.js.map → GeographyPage-BvhBUFBv.js.map} +1 -1
- package/dist/{MethodsPage-Bpzsa_6v.js → MethodsPage-tSsXLSUX.js} +4 -3
- package/dist/MethodsPage-tSsXLSUX.js.map +1 -0
- package/dist/{PointsPage-CzYIM86R.js → PointsPage-DzcGDwjQ.js} +2 -2
- package/dist/{PointsPage-CzYIM86R.js.map → PointsPage-DzcGDwjQ.js.map} +1 -1
- package/dist/{PopularPage-CSrvVg4o.js → PopularPage-CaN3vwKt.js} +2 -2
- package/dist/{PopularPage-CSrvVg4o.js.map → PopularPage-CaN3vwKt.js.map} +1 -1
- package/dist/{index-5nt0M0In.js → index-CAiJkqKq.js} +215 -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/MethodsPage-Bpzsa_6v.js.map +0 -1
- package/dist/index-5nt0M0In.js.map +0 -1
|
@@ -2,7 +2,7 @@ import { defineComponent as R, ref as r, computed as m, watch as G, openBlock as
|
|
|
2
2
|
import { useRoute as F } from "vue-router";
|
|
3
3
|
import { WxCheckbox as K, WxSpace as T, WxButton as w, WxTable as Q, WxBadge as X, WxFormItem as A, WxSelect as L, WxEmpty as Y, WxDialog as Z, WxAlert as ee, WxText as le, toast as y } from "@webx-ui/core";
|
|
4
4
|
import { useAdmin as ae, useErrorText as ne, WxListScreen as te } from "@webx-ui/module-admin";
|
|
5
|
-
import { c as ie, u as se, a as de, _ as oe } from "./index-
|
|
5
|
+
import { c as ie, u as se, a as de, _ as oe } from "./index-CAiJkqKq.js";
|
|
6
6
|
const re = {
|
|
7
7
|
key: 0,
|
|
8
8
|
class: "wx-delivery-bindings__bar"
|
|
@@ -277,4 +277,4 @@ const re = {
|
|
|
277
277
|
export {
|
|
278
278
|
we as default
|
|
279
279
|
};
|
|
280
|
-
//# sourceMappingURL=BindingsPage-
|
|
280
|
+
//# sourceMappingURL=BindingsPage-BssjF4sQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BindingsPage-pjTbDDWA.js","sources":["../src/BindingsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxCheckbox,\n WxDialog,\n WxEmpty,\n WxFormItem,\n WxSelect,\n WxSpace,\n WxTable,\n WxText,\n type RowKey,\n type TableColumn,\n type TableState,\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 { BindingRow, BindingsPage, LocalityBrief } from './types'\n\n/**\n * The binding queue (§4.4, §14.2): the records of the carriers no rule placed — as the carrier\n * sent them, why they wait, and the localities that came close, with their distance. A decision is\n * made for the rows ticked, or for every row of the filter at once: «Bind» to a locality found by\n * search, «Make a shared locality», «Do not bind».\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst page = ref<BindingsPage | null>(null)\nconst loading = ref(false)\n// The carriers screen links here narrowed to one carrier.\nconst carrier = ref(\n typeof useRoute().query.carrier === 'string' ? String(useRoute().query.carrier) : '',\n)\nconst reason = ref('')\nconst selected = ref<RowKey[]>([])\nconst working = ref(false)\nconst binding = ref(false)\nconst target = ref<LocalityBrief | null>(null)\nconst wholeFilter = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-bindings')?.title ??\n t('sections.bindings'),\n)\n\nconst columns = computed<TableColumn<BindingRow>[]>(() => [\n { key: 'record', label: t('binding.record'), minWidth: 200 },\n { key: 'carrier', label: t('binding.carrier'), width: 140, hideBelow: 640 },\n { key: 'reason', label: t('binding.reason'), width: 160 },\n { key: 'candidates', label: t('binding.candidates'), minWidth: 220, hideBelow: 760 },\n])\n\nconst carrierOptions = computed(() => [\n { value: '', label: t('binding.any-carrier') },\n ...(page.value?.filters.carriers ?? []).map((one) => ({\n value: one.value,\n label: `${one.label} (${one.count})`,\n })),\n])\n\nconst reasonOptions = computed(() => [\n { value: '', label: t('binding.any-reason') },\n ...(page.value?.filters.reasons ?? []).map((one) => ({\n value: one.value,\n label: `${t(`binding.reasons.${one.value}`)} (${one.count})`,\n })),\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.bindings({\n page: next.page,\n per_page: next.perPage,\n carrier: carrier.value,\n reason: reason.value,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([carrier, reason], () => {\n selected.value = []\n void load({ ...last, page: 1 })\n})\n\nconst count = computed(() => (wholeFilter.value ? (page.value?.total ?? 0) : selected.value.length))\n\nasync function apply(\n action: 'bind' | 'create' | 'ignore',\n locality?: LocalityBrief,\n): Promise<void> {\n if (count.value === 0) {\n toast.info(t('errors.nothing_chosen'))\n\n return\n }\n\n working.value = true\n\n try {\n const result = await api.batch({\n action,\n ...(wholeFilter.value\n ? { all: true, carrier: carrier.value, reason: reason.value }\n : { ids: selected.value.map(Number) }),\n ...(locality ? { locality_id: locality.id } : {}),\n })\n\n toast.success(t('binding.done', { count: result.done }))\n if (result.failed.length > 0) toast.danger(t('binding.failed', { count: result.failed.length }))\n if (result.left > 0) toast.info(t('binding.left', { count: result.left }))\n\n selected.value = []\n binding.value = false\n target.value = null\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n working.value = false\n }\n}\n\nfunction distance(km: number | null): string {\n return km === null ? '' : t('binding.km', { distance: km.toFixed(1) })\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\">\n <!-- What the queue is and what its three buttons do, before anyone presses one: 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('binding.intro') }}</wx-text>\n </template>\n\n <div v-if=\"canManage\" class=\"wx-delivery-bindings__bar\">\n <span class=\"wx-delivery-bindings__count\">\n {{ t('binding.selected', { count: selected.length }) }}\n </span>\n <wx-checkbox v-model=\"wholeFilter\" data-test=\"whole-filter\">\n {{ t('binding.whole-filter', { count: page?.total ?? 0 }) }}\n </wx-checkbox>\n <wx-space size=\"sm\" wrap>\n <wx-button size=\"sm\" :disabled=\"count === 0 || working\" @click=\"binding = true\">\n {{ t('binding.bind') }}\n </wx-button>\n <wx-button\n size=\"sm\"\n :disabled=\"count === 0\"\n :loading=\"working\"\n data-test=\"batch-create\"\n @click=\"apply('create')\"\n >\n {{ t('binding.create') }}\n </wx-button>\n <wx-button\n size=\"sm\"\n variant=\"outline\"\n :disabled=\"count === 0\"\n :loading=\"working\"\n data-test=\"batch-ignore\"\n @click=\"apply('ignore')\"\n >\n {{ t('binding.ignore') }}\n </wx-button>\n </wx-space>\n </div>\n\n <wx-table\n v-model:selected=\"selected\"\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n :selectable=\"canManage && !wholeFilter\"\n flush\n :loading=\"loading\"\n :empty-text=\"t('binding.empty')\"\n :filters-count=\"(carrier ? 1 : 0) + (reason ? 1 : 0)\"\n @state-change=\"load\"\n >\n <!-- Empty is the good state, and it says when the queue fills at all. -->\n <template #empty>\n <wx-empty :title=\"t('binding.empty')\" :description=\"t('binding.empty-help')\" />\n </template>\n\n <template #filters>\n <wx-form-item :label=\"t('binding.carrier')\">\n <wx-select v-model=\"carrier\" :options=\"carrierOptions\" size=\"sm\" />\n </wx-form-item>\n <wx-form-item :label=\"t('binding.reason')\">\n <wx-select v-model=\"reason\" :options=\"reasonOptions\" size=\"sm\" />\n </wx-form-item>\n </template>\n\n <template #cell-record=\"{ row }\">\n <span class=\"wx-delivery-bindings__name\">{{ row.record.name }}</span>\n <span class=\"wx-delivery-bindings__muted\">\n {{\n [row.record.district, row.record.region, row.record.kind, row.external_id]\n .filter(Boolean)\n .join(' · ')\n }}\n </span>\n </template>\n <template #cell-carrier=\"{ row }\">{{ row.carrier_title }}</template>\n <template #cell-reason=\"{ row }\">\n <wx-badge v-if=\"row.reason\" type=\"warning\" size=\"sm\">{{\n t(`binding.reasons.${row.reason}`)\n }}</wx-badge>\n </template>\n <template #cell-candidates=\"{ row }\">\n <span v-for=\"one in row.candidates\" :key=\"one.id\" class=\"wx-delivery-bindings__candidate\">\n {{ one.label }}\n <span class=\"wx-delivery-bindings__muted\">{{ distance(one.distance_km) }}</span>\n </span>\n </template>\n </wx-table>\n\n <wx-dialog v-model:open=\"binding\" :title=\"t('binding.bind-to')\" :width=\"520\">\n <wx-alert type=\"info\" :description=\"t('binding.selected', { count })\" />\n <locality-search class=\"wx-delivery-bindings__search\" @pick=\"target = $event\" />\n <p v-if=\"target\" class=\"wx-delivery-bindings__target\">{{ target.label }}</p>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"binding = false\">{{ t('common.cancel') }}</wx-button>\n <wx-button\n type=\"primary\"\n :disabled=\"!target\"\n :loading=\"working\"\n @click=\"target && apply('bind', target)\"\n >\n {{ t('binding.bind') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\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\n.wx-delivery-bindings__bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-16);\n margin-bottom: var(--wx-space-12);\n}\n\n.wx-delivery-bindings__count {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-bindings__name {\n display: block;\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-bindings__muted {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-delivery-bindings__candidate {\n display: block;\n}\n\n.wx-delivery-bindings__search {\n margin-top: var(--wx-space-12);\n}\n\n.wx-delivery-bindings__target {\n margin: var(--wx-space-8) 0 0;\n font-weight: var(--wx-font-weight-medium);\n}\n</style>\n"],"names":["context","useAdmin","api","createDeliveryApi","t","useDeliveryWords","message","useErrorText","page","ref","loading","carrier","useRoute","reason","selected","working","binding","target","wholeFilter","canManage","computed","title","module","columns","carrierOptions","one","reasonOptions","last","load","next","error","toast","watch","count","apply","action","locality","result","distance","km","_createBlock","_unref","WxListScreen","_createVNode","WxText","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","WxCheckbox","$event","WxSpace","WxButton","WxTable","WxEmpty","WxFormItem","WxSelect","_withCtx","row","_hoisted_3","_hoisted_4","_createTextVNode","WxBadge","_Fragment","_renderList","_hoisted_5","WxDialog","_cache","WxAlert","LocalitySearch","_hoisted_6"],"mappings":";;;;;;;;;;;;;;AAgCA,UAAMA,IAAUC,GAAA,GACVC,IAAMC,GAAkBH,CAAO,GAC/BI,IAAIC,GAAA,GACJC,IAAUC,GAAA,GAEVC,IAAOC,EAAyB,IAAI,GACpCC,IAAUD,EAAI,EAAK,GAEnBE,IAAUF;AAAA,MACd,OAAOG,EAAA,EAAW,MAAM,WAAY,WAAW,OAAOA,EAAA,EAAW,MAAM,OAAO,IAAI;AAAA,IAAA,GAE9EC,IAASJ,EAAI,EAAE,GACfK,IAAWL,EAAc,EAAE,GAC3BM,IAAUN,EAAI,EAAK,GACnBO,IAAUP,EAAI,EAAK,GACnBQ,IAASR,EAA0B,IAAI,GACvCS,IAAcT,EAAI,EAAK,GAEvBU,IAAYC,EAAS,MAAMpB,EAAQ,IAAI,iBAAiB,CAAC,GACzDqB,IAAQD;AAAA,MACZ,MACEpB,EAAQ,MAAM,UAAU,QAAQ,KAAK,CAACsB,MAAWA,EAAO,OAAO,mBAAmB,GAAG,SACrFlB,EAAE,mBAAmB;AAAA,IAAA,GAGnBmB,IAAUH,EAAoC,MAAM;AAAA,MACxD,EAAE,KAAK,UAAU,OAAOhB,EAAE,gBAAgB,GAAG,UAAU,IAAA;AAAA,MACvD,EAAE,KAAK,WAAW,OAAOA,EAAE,iBAAiB,GAAG,OAAO,KAAK,WAAW,IAAA;AAAA,MACtE,EAAE,KAAK,UAAU,OAAOA,EAAE,gBAAgB,GAAG,OAAO,IAAA;AAAA,MACpD,EAAE,KAAK,cAAc,OAAOA,EAAE,oBAAoB,GAAG,UAAU,KAAK,WAAW,IAAA;AAAA,IAAI,CACpF,GAEKoB,IAAiBJ,EAAS,MAAM;AAAA,MACpC,EAAE,OAAO,IAAI,OAAOhB,EAAE,qBAAqB,EAAA;AAAA,MAC3C,IAAII,EAAK,OAAO,QAAQ,YAAY,IAAI,IAAI,CAACiB,OAAS;AAAA,QACpD,OAAOA,EAAI;AAAA,QACX,OAAO,GAAGA,EAAI,KAAK,KAAKA,EAAI,KAAK;AAAA,MAAA,EACjC;AAAA,IAAA,CACH,GAEKC,IAAgBN,EAAS,MAAM;AAAA,MACnC,EAAE,OAAO,IAAI,OAAOhB,EAAE,oBAAoB,EAAA;AAAA,MAC1C,IAAII,EAAK,OAAO,QAAQ,WAAW,IAAI,IAAI,CAACiB,OAAS;AAAA,QACnD,OAAOA,EAAI;AAAA,QACX,OAAO,GAAGrB,EAAE,mBAAmBqB,EAAI,KAAK,EAAE,CAAC,KAAKA,EAAI,KAAK;AAAA,MAAA,EACzD;AAAA,IAAA,CACH;AAED,QAAIE,IAAmB,EAAE,MAAM,GAAG,SAAS,IAAI,MAAM,MAAM,QAAQ,GAAA;AAEnE,mBAAeC,EAAKC,IAAmBF,GAAqB;AAC1D,MAAAA,IAAOE,GACPnB,EAAQ,QAAQ;AAEhB,UAAI;AACF,QAAAF,EAAK,QAAQ,MAAMN,EAAI,SAAS;AAAA,UAC9B,MAAM2B,EAAK;AAAA,UACX,UAAUA,EAAK;AAAA,UACf,SAASlB,EAAQ;AAAA,UACjB,QAAQE,EAAO;AAAA,QAAA,CAChB;AAAA,MACH,SAASiB,GAAO;AACd,QAAAC,EAAM,OAAOzB,EAAQwB,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAApB,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,IAAAsB,EAAM,CAACrB,GAASE,CAAM,GAAG,MAAM;AAC7B,MAAAC,EAAS,QAAQ,CAAA,GACZc,EAAK,EAAE,GAAGD,GAAM,MAAM,GAAG;AAAA,IAChC,CAAC;AAED,UAAMM,IAAQb,EAAS,MAAOF,EAAY,QAASV,EAAK,OAAO,SAAS,IAAKM,EAAS,MAAM,MAAO;AAEnG,mBAAeoB,EACbC,GACAC,GACe;AACf,UAAIH,EAAM,UAAU,GAAG;AACrB,QAAAF,EAAM,KAAK3B,EAAE,uBAAuB,CAAC;AAErC;AAAA,MACF;AAEA,MAAAW,EAAQ,QAAQ;AAEhB,UAAI;AACF,cAAMsB,IAAS,MAAMnC,EAAI,MAAM;AAAA,UAC7B,QAAAiC;AAAA,UACA,GAAIjB,EAAY,QACZ,EAAE,KAAK,IAAM,SAASP,EAAQ,OAAO,QAAQE,EAAO,MAAA,IACpD,EAAE,KAAKC,EAAS,MAAM,IAAI,MAAM,EAAA;AAAA,UACpC,GAAIsB,IAAW,EAAE,aAAaA,EAAS,GAAA,IAAO,CAAA;AAAA,QAAC,CAChD;AAED,QAAAL,EAAM,QAAQ3B,EAAE,gBAAgB,EAAE,OAAOiC,EAAO,KAAA,CAAM,CAAC,GACnDA,EAAO,OAAO,SAAS,OAAS,OAAOjC,EAAE,kBAAkB,EAAE,OAAOiC,EAAO,OAAO,OAAA,CAAQ,CAAC,GAC3FA,EAAO,OAAO,KAAGN,EAAM,KAAK3B,EAAE,gBAAgB,EAAE,OAAOiC,EAAO,KAAA,CAAM,CAAC,GAEzEvB,EAAS,QAAQ,CAAA,GACjBE,EAAQ,QAAQ,IAChBC,EAAO,QAAQ,MACf,MAAMW,EAAA;AAAA,MACR,SAASE,GAAO;AACd,QAAAC,EAAM,OAAOzB,EAAQwB,CAAK,CAAC;AAAA,MAC7B,UAAA;AACE,QAAAf,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAEA,aAASuB,EAASC,GAA2B;AAC3C,aAAOA,MAAO,OAAO,KAAKnC,EAAE,cAAc,EAAE,UAAUmC,EAAG,QAAQ,CAAC,EAAA,CAAG;AAAA,IACvE;2BAIEC,EA4GiBC,EAAAC,EAAA,GAAA,EA5GA,OAAOrB,EAAA,SAAK;AAAA,MAEhB,UACT,MAA4F;AAAA,QAA5FsB,EAA4FF,EAAAG,EAAA,GAAA;AAAA,UAAnF,OAAM;AAAA,UAAoB,MAAK;AAAA,UAAQ,MAAK;AAAA,QAAA;qBAAK,MAAwB;AAAA,gBAArBH,EAAArC,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,UAAA;;;;iBAGhE,MA+BM;AAAA,QA/BKe,EAAA,SAAX0B,EAAA,GAAAC,EA+BM,OA/BNC,IA+BM;AAAA,UA9BJC,EAEO,QAFPC,IAEOC,EADFT,KAAC,oBAAA,EAAA,OAA8B3B,EAAA,MAAS,OAAA,CAAM,CAAA,GAAA,CAAA;AAAA,UAEnD6B,EAEcF,EAAAU,CAAA,GAAA;AAAA,wBAFQjC,EAAA;AAAA,0DAAAA,EAAW,QAAAkC;AAAA,YAAE,aAAU;AAAA,UAAA;uBAC3C,MAA4D;AAAA,kBAAzDX,EAAArC,CAAA,EAAC,wBAAA,EAAA,OAAkCI,EAAA,OAAM,SAAK,EAAA,CAAA,CAAA,GAAA,CAAA;AAAA,YAAA;;;UAEnDmC,EAuBWF,EAAAY,CAAA,GAAA;AAAA,YAvBD,MAAK;AAAA,YAAK,MAAA;AAAA,UAAA;uBAClB,MAEY;AAAA,cAFZV,EAEYF,EAAAa,CAAA,GAAA;AAAA,gBAFD,MAAK;AAAA,gBAAM,UAAUrB,EAAA,UAAK,KAAUlB,EAAA;AAAA,gBAAU,gCAAOC,EAAA,QAAO;AAAA,cAAA;2BACrE,MAAuB;AAAA,sBAApByB,EAAArC,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;cAENuC,EAQYF,EAAAa,CAAA,GAAA;AAAA,gBAPV,MAAK;AAAA,gBACJ,UAAUrB,EAAA,UAAK;AAAA,gBACf,SAASlB,EAAA;AAAA,gBACV,aAAU;AAAA,gBACT,gCAAOmB,EAAK,QAAA;AAAA,cAAA;2BAEb,MAAyB;AAAA,sBAAtBO,EAAArC,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;cAENuC,EASYF,EAAAa,CAAA,GAAA;AAAA,gBARV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACP,UAAUrB,EAAA,UAAK;AAAA,gBACf,SAASlB,EAAA;AAAA,gBACV,aAAU;AAAA,gBACT,gCAAOmB,EAAK,QAAA;AAAA,cAAA;2BAEb,MAAyB;AAAA,sBAAtBO,EAAArC,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;QAKVuC,EAgDWF,EAAAc,CAAA,GAAA;AAAA,UA/CD,UAAUzC,EAAA;AAAA,sDAAAA,EAAQ,QAAAsC;AAAA,UACzB,MAAM5C,EAAA;AAAA,UACN,SAASe,EAAA;AAAA,UACV,WAAQ;AAAA,UACP,YAAYJ,EAAA,SAAS,CAAKD,EAAA;AAAA,UAC3B,OAAA;AAAA,UACC,SAASR,EAAA;AAAA,UACT,cAAY+B,EAAArC,CAAA,EAAC,eAAA;AAAA,UACb,kBAAgBO,EAAA,QAAO,IAAA,MAAaE,EAAA,QAAM,IAAA;AAAA,UAC1C,eAAce;AAAA,QAAA;UAGJ,SACT,MAA+E;AAAA,YAA/Ee,EAA+EF,EAAAe,CAAA,GAAA;AAAA,cAApE,OAAOf,EAAArC,CAAA,EAAC,eAAA;AAAA,cAAoB,aAAaqC,EAAArC,CAAA,EAAC,oBAAA;AAAA,YAAA;;UAG5C,WACT,MAEe;AAAA,YAFfuC,EAEeF,EAAAgB,CAAA,GAAA;AAAA,cAFA,OAAOhB,EAAArC,CAAA,EAAC,iBAAA;AAAA,YAAA;yBACrB,MAAmE;AAAA,gBAAnEuC,EAAmEF,EAAAiB,CAAA,GAAA;AAAA,8BAA/C/C,EAAA;AAAA,gEAAAA,EAAO,QAAAyC;AAAA,kBAAG,SAAS5B,EAAA;AAAA,kBAAgB,MAAK;AAAA,gBAAA;;;;YAE9DmB,EAEeF,EAAAgB,CAAA,GAAA;AAAA,cAFA,OAAOhB,EAAArC,CAAA,EAAC,gBAAA;AAAA,YAAA;yBACrB,MAAiE;AAAA,gBAAjEuC,EAAiEF,EAAAiB,CAAA,GAAA;AAAA,8BAA7C7C,EAAA;AAAA,gEAAAA,EAAM,QAAAuC;AAAA,kBAAG,SAAS1B,EAAA;AAAA,kBAAe,MAAK;AAAA,gBAAA;;;;;UAInD,eAAWiC,EACpB,CAAqE,EAD7C,KAAAC,QAAG;AAAA,YAC3BZ,EAAqE,QAArEa,IAAqEX,EAAzBU,EAAI,OAAO,IAAI,GAAA,CAAA;AAAA,YAC3DZ,EAMO,QANPc,IAMOZ,EAAA,CAJFU,EAAI,OAAO,UAAUA,EAAI,OAAO,QAAQA,EAAI,OAAO,MAAMA,EAAI,WAAW,EAAiB,OAAO,OAAO,EAAiB,KAAI,KAAA,CAAA,GAAA,CAAA;AAAA,UAAA;UAMxH,gBAAYD,EAAW,CAAuB,EAA9B,KAAAC,QAAG;AAAA,YAAOG,EAAAb,EAAAU,EAAI,aAAa,GAAA,CAAA;AAAA,UAAA;UAC3C,eAAWD,EACpB,CAEa,EAHW,KAAAC,QAAG;AAAA,YACXA,EAAI,eAApBpB,EAEaC,EAAAuB,CAAA,GAAA;AAAA;cAFe,MAAK;AAAA,cAAU,MAAK;AAAA,YAAA;yBAAK,MAEnD;AAAA,oBADAvB,EAAArC,CAAA,EAAC,mBAAoBwD,EAAI,MAAM,EAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;;UAGxB,mBAAeD,EAClB,CAA6B,EADP,KAAAC,QAAG;AAAA,aAC/Bf,EAAA,EAAA,GAAAC,EAGOmB,GAAA,MAAAC,EAHaN,EAAI,aAAXnC,YAAbqB,EAGO,QAAA;AAAA,cAH8B,KAAKrB,EAAI;AAAA,cAAI,OAAM;AAAA,YAAA;kBACnDA,EAAI,KAAK,IAAG,KACf,CAAA;AAAA,cAAAuB,EAAgF,QAAhFmB,IAAgFjB,EAAnCZ,EAASb,EAAI,WAAW,CAAA,GAAA,CAAA;AAAA,YAAA;;;;QAK3EkB,EAkBYF,EAAA2B,CAAA,GAAA;AAAA,UAlBO,MAAMpD,EAAA;AAAA,oDAAAA,EAAO,QAAAoC;AAAA,UAAG,OAAOX,EAAArC,CAAA,EAAC,iBAAA;AAAA,UAAsB,OAAO;AAAA,QAAA;UAK3D,UACT,MAUW;AAAA,YAVXuC,EAUWF,EAAAY,CAAA,GAAA,EAVD,MAAK,QAAI;AAAA,yBACjB,MAA0F;AAAA,gBAA1FV,EAA0FF,EAAAa,CAAA,GAAA;AAAA,kBAA/E,SAAQ;AAAA,kBAAW,gCAAOtC,EAAA,QAAO;AAAA,gBAAA;6BAAU,MAAwB;AAAA,wBAArByB,EAAArC,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBAC1DuC,EAOYF,EAAAa,CAAA,GAAA;AAAA,kBANV,MAAK;AAAA,kBACJ,WAAWrC,EAAA;AAAA,kBACX,SAASF,EAAA;AAAA,kBACT,SAAKsD,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAjB,MAAEnC,EAAA,SAAUiB,UAAcjB,EAAA,KAAM;AAAA,gBAAA;6BAEtC,MAAuB;AAAA,wBAApBwB,EAAArC,CAAA,EAAC,cAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;;qBAbV,MAAwE;AAAA,YAAxEuC,EAAwEF,EAAA6B,EAAA,GAAA;AAAA,cAA9D,MAAK;AAAA,cAAQ,aAAa7B,EAAArC,CAAA,EAAC,oBAAA,EAAA,OAAuB6B,EAAA,MAAA,CAAK;AAAA,YAAA;YACjEU,EAAgF4B,IAAA;AAAA,cAA/D,OAAM;AAAA,cAAgC,QAAIF,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAjB,MAAEnC,EAAA,QAASmC;AAAA,YAAA;YAC7DnC,EAAA,SAAT4B,EAAA,GAAAC,EAA4E,KAA5E0B,IAA4EtB,EAAnBjC,EAAA,MAAO,KAAK,GAAA,CAAA;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"BindingsPage-BssjF4sQ.js","sources":["../src/BindingsPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport { useRoute } from 'vue-router'\nimport {\n toast,\n WxAlert,\n WxBadge,\n WxButton,\n WxCheckbox,\n WxDialog,\n WxEmpty,\n WxFormItem,\n WxSelect,\n WxSpace,\n WxTable,\n WxText,\n type RowKey,\n type TableColumn,\n type TableState,\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 { BindingRow, BindingsPage, LocalityBrief } from './types'\n\n/**\n * The binding queue (§4.4, §14.2): the records of the carriers no rule placed — as the carrier\n * sent them, why they wait, and the localities that came close, with their distance. A decision is\n * made for the rows ticked, or for every row of the filter at once: «Bind» to a locality found by\n * search, «Make a shared locality», «Do not bind».\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst page = ref<BindingsPage | null>(null)\nconst loading = ref(false)\n// The carriers screen links here narrowed to one carrier.\nconst carrier = ref(\n typeof useRoute().query.carrier === 'string' ? String(useRoute().query.carrier) : '',\n)\nconst reason = ref('')\nconst selected = ref<RowKey[]>([])\nconst working = ref(false)\nconst binding = ref(false)\nconst target = ref<LocalityBrief | null>(null)\nconst wholeFilter = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-bindings')?.title ??\n t('sections.bindings'),\n)\n\nconst columns = computed<TableColumn<BindingRow>[]>(() => [\n { key: 'record', label: t('binding.record'), minWidth: 200 },\n { key: 'carrier', label: t('binding.carrier'), width: 140, hideBelow: 640 },\n { key: 'reason', label: t('binding.reason'), width: 160 },\n { key: 'candidates', label: t('binding.candidates'), minWidth: 220, hideBelow: 760 },\n])\n\nconst carrierOptions = computed(() => [\n { value: '', label: t('binding.any-carrier') },\n ...(page.value?.filters.carriers ?? []).map((one) => ({\n value: one.value,\n label: `${one.label} (${one.count})`,\n })),\n])\n\nconst reasonOptions = computed(() => [\n { value: '', label: t('binding.any-reason') },\n ...(page.value?.filters.reasons ?? []).map((one) => ({\n value: one.value,\n label: `${t(`binding.reasons.${one.value}`)} (${one.count})`,\n })),\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.bindings({\n page: next.page,\n per_page: next.perPage,\n carrier: carrier.value,\n reason: reason.value,\n })\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nwatch([carrier, reason], () => {\n selected.value = []\n void load({ ...last, page: 1 })\n})\n\nconst count = computed(() => (wholeFilter.value ? (page.value?.total ?? 0) : selected.value.length))\n\nasync function apply(\n action: 'bind' | 'create' | 'ignore',\n locality?: LocalityBrief,\n): Promise<void> {\n if (count.value === 0) {\n toast.info(t('errors.nothing_chosen'))\n\n return\n }\n\n working.value = true\n\n try {\n const result = await api.batch({\n action,\n ...(wholeFilter.value\n ? { all: true, carrier: carrier.value, reason: reason.value }\n : { ids: selected.value.map(Number) }),\n ...(locality ? { locality_id: locality.id } : {}),\n })\n\n toast.success(t('binding.done', { count: result.done }))\n if (result.failed.length > 0) toast.danger(t('binding.failed', { count: result.failed.length }))\n if (result.left > 0) toast.info(t('binding.left', { count: result.left }))\n\n selected.value = []\n binding.value = false\n target.value = null\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n working.value = false\n }\n}\n\nfunction distance(km: number | null): string {\n return km === null ? '' : t('binding.km', { distance: km.toFixed(1) })\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\">\n <!-- What the queue is and what its three buttons do, before anyone presses one: 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('binding.intro') }}</wx-text>\n </template>\n\n <div v-if=\"canManage\" class=\"wx-delivery-bindings__bar\">\n <span class=\"wx-delivery-bindings__count\">\n {{ t('binding.selected', { count: selected.length }) }}\n </span>\n <wx-checkbox v-model=\"wholeFilter\" data-test=\"whole-filter\">\n {{ t('binding.whole-filter', { count: page?.total ?? 0 }) }}\n </wx-checkbox>\n <wx-space size=\"sm\" wrap>\n <wx-button size=\"sm\" :disabled=\"count === 0 || working\" @click=\"binding = true\">\n {{ t('binding.bind') }}\n </wx-button>\n <wx-button\n size=\"sm\"\n :disabled=\"count === 0\"\n :loading=\"working\"\n data-test=\"batch-create\"\n @click=\"apply('create')\"\n >\n {{ t('binding.create') }}\n </wx-button>\n <wx-button\n size=\"sm\"\n variant=\"outline\"\n :disabled=\"count === 0\"\n :loading=\"working\"\n data-test=\"batch-ignore\"\n @click=\"apply('ignore')\"\n >\n {{ t('binding.ignore') }}\n </wx-button>\n </wx-space>\n </div>\n\n <wx-table\n v-model:selected=\"selected\"\n :data=\"page\"\n :columns=\"columns\"\n row-key=\"id\"\n :selectable=\"canManage && !wholeFilter\"\n flush\n :loading=\"loading\"\n :empty-text=\"t('binding.empty')\"\n :filters-count=\"(carrier ? 1 : 0) + (reason ? 1 : 0)\"\n @state-change=\"load\"\n >\n <!-- Empty is the good state, and it says when the queue fills at all. -->\n <template #empty>\n <wx-empty :title=\"t('binding.empty')\" :description=\"t('binding.empty-help')\" />\n </template>\n\n <template #filters>\n <wx-form-item :label=\"t('binding.carrier')\">\n <wx-select v-model=\"carrier\" :options=\"carrierOptions\" size=\"sm\" />\n </wx-form-item>\n <wx-form-item :label=\"t('binding.reason')\">\n <wx-select v-model=\"reason\" :options=\"reasonOptions\" size=\"sm\" />\n </wx-form-item>\n </template>\n\n <template #cell-record=\"{ row }\">\n <span class=\"wx-delivery-bindings__name\">{{ row.record.name }}</span>\n <span class=\"wx-delivery-bindings__muted\">\n {{\n [row.record.district, row.record.region, row.record.kind, row.external_id]\n .filter(Boolean)\n .join(' · ')\n }}\n </span>\n </template>\n <template #cell-carrier=\"{ row }\">{{ row.carrier_title }}</template>\n <template #cell-reason=\"{ row }\">\n <wx-badge v-if=\"row.reason\" type=\"warning\" size=\"sm\">{{\n t(`binding.reasons.${row.reason}`)\n }}</wx-badge>\n </template>\n <template #cell-candidates=\"{ row }\">\n <span v-for=\"one in row.candidates\" :key=\"one.id\" class=\"wx-delivery-bindings__candidate\">\n {{ one.label }}\n <span class=\"wx-delivery-bindings__muted\">{{ distance(one.distance_km) }}</span>\n </span>\n </template>\n </wx-table>\n\n <wx-dialog v-model:open=\"binding\" :title=\"t('binding.bind-to')\" :width=\"520\">\n <wx-alert type=\"info\" :description=\"t('binding.selected', { count })\" />\n <locality-search class=\"wx-delivery-bindings__search\" @pick=\"target = $event\" />\n <p v-if=\"target\" class=\"wx-delivery-bindings__target\">{{ target.label }}</p>\n\n <template #footer>\n <wx-space size=\"sm\">\n <wx-button variant=\"outline\" @click=\"binding = false\">{{ t('common.cancel') }}</wx-button>\n <wx-button\n type=\"primary\"\n :disabled=\"!target\"\n :loading=\"working\"\n @click=\"target && apply('bind', target)\"\n >\n {{ t('binding.bind') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\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\n.wx-delivery-bindings__bar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-16);\n margin-bottom: var(--wx-space-12);\n}\n\n.wx-delivery-bindings__count {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-bindings__name {\n display: block;\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-bindings__muted {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-delivery-bindings__candidate {\n display: block;\n}\n\n.wx-delivery-bindings__search {\n margin-top: var(--wx-space-12);\n}\n\n.wx-delivery-bindings__target {\n margin: var(--wx-space-8) 0 0;\n font-weight: var(--wx-font-weight-medium);\n}\n</style>\n"],"names":["context","useAdmin","api","createDeliveryApi","t","useDeliveryWords","message","useErrorText","page","ref","loading","carrier","useRoute","reason","selected","working","binding","target","wholeFilter","canManage","computed","title","module","columns","carrierOptions","one","reasonOptions","last","load","next","error","toast","watch","count","apply","action","locality","result","distance","km","_createBlock","_unref","WxListScreen","_createVNode","WxText","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_toDisplayString","WxCheckbox","$event","WxSpace","WxButton","WxTable","WxEmpty","WxFormItem","WxSelect","_withCtx","row","_hoisted_3","_hoisted_4","_createTextVNode","WxBadge","_Fragment","_renderList","_hoisted_5","WxDialog","_cache","WxAlert","LocalitySearch","_hoisted_6"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { defineComponent as ve, useModel as Ee, ref as k, computed as N, watch a
|
|
|
2
2
|
import { RouterLink as Be } from "vue-router";
|
|
3
3
|
import { WxDialog as De, WxSkeleton as me, WxButton as j, WxForm as oe, WxFormItem as ie, WxSelect as ce, WxSwitch as ye, WxInputNumber as Le, WxInput as ue, WxBadge as q, WxSpace as Ne, toast as V, WxCard as de, WxEmpty as qe } from "@webx-ui/core";
|
|
4
4
|
import { useAdmin as pe, useErrorText as _e, WxDate as fe, WxListScreen as Fe } from "@webx-ui/module-admin";
|
|
5
|
-
import { c as ge, u as he, _ as ke } from "./index-
|
|
5
|
+
import { c as ge, u as he, _ as ke } from "./index-CAiJkqKq.js";
|
|
6
6
|
const Ie = {
|
|
7
7
|
key: 1,
|
|
8
8
|
class: "wx-delivery-carrier-form"
|
|
@@ -647,4 +647,4 @@ const Ie = {
|
|
|
647
647
|
export {
|
|
648
648
|
ka as default
|
|
649
649
|
};
|
|
650
|
-
//# sourceMappingURL=CarriersPage-
|
|
650
|
+
//# sourceMappingURL=CarriersPage-CV9uFlXk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CarriersPage-Dpre8dbl.js","sources":["../src/CarrierDialog.vue","../src/CarriersPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxDialog,\n WxForm,\n WxFormItem,\n WxInput,\n WxInputNumber,\n WxSelect,\n WxSkeleton,\n WxSpace,\n WxSwitch,\n type SelectOption,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxDate } from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport type { CarrierDetail, CarrierField, SettingOption } from './types'\n\n/**\n * One carrier's settings and keys (§13.2), and its runs.\n *\n * A key is never sent to the panel: the dialog says whether each one is set, and an empty field\n * means «leave it» — typing a new value replaces it, «Clear» removes it. «Check the connection»\n * tries the stored keys with whatever is typed over them, without saving.\n *\n * A field with `options: 'carrier'` is a select whose options come from the carrier's account\n * (`ProvidesSettingOptions`): it waits for the key and for the fields it `depends` on, a change\n * empties the fields that depend on it, a `search` field asks as the admin types. The label of the\n * chosen value is kept beside it (`_labels`), so the field shows it even when the carrier is down.\n */\nconst props = defineProps<{ carrier: string | null }>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst emit = defineEmits<{ saved: [] }>()\n\nconst LABELS = '_labels'\n\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst detail = ref<CarrierDetail | null>(null)\nconst settings = ref<Record<string, unknown>>({})\nconst typed = ref<Record<string, string>>({})\nconst loading = ref(false)\nconst saving = ref(false)\nconst testing = ref(false)\nconst errors = ref<Record<string, string>>({})\n\n/** Options from the carrier's account by field, what is being asked, and why a list did not come. */\nconst choices = ref<Record<string, SettingOption[]>>({})\nconst asking = ref<Record<string, boolean>>({})\nconst failures = ref<Record<string, string>>({})\nconst refreshing = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\n\nconst fields = computed(() => detail.value?.settings.fields ?? [])\nconst fromAccount = computed(() => fields.value.filter(isFromAccount))\n\n/** Options from the account are asked with the stored key: none set — nothing to ask with. */\nconst keyed = computed(\n () =>\n !detail.value ||\n detail.value.credentials.length === 0 ||\n detail.value.credentials.some((one) => one.set),\n)\n\nfunction isFromAccount(field: CarrierField): boolean {\n return field.options === 'carrier'\n}\n\nfunction label(field: CarrierField): string {\n if (typeof field.label === 'string') return field.label\n if (field.label && typeof field.label === 'object') {\n const locale = context.i18n.state.locale\n\n return field.label[locale] ?? Object.values(field.label)[0] ?? field.name\n }\n\n return field.name\n}\n\n/** A key the carrier gave no label: words, never its code name. */\nfunction keyLabel(field: CarrierField, index: number, count: number): string {\n if (field.label) return label(field)\n\n return count > 1 ? `${t('carrier.key')} ${index + 1}` : t('carrier.key')\n}\n\n/*\n * A field left empty takes the carrier's default when it is used (the waybill's weight, the\n * description of the cargo): the placeholder says which, without storing it as a choice.\n */\nfunction defaultOf(field: CarrierField): string | undefined {\n return typeof field.default === 'number' || typeof field.default === 'string'\n ? String(field.default)\n : undefined\n}\n\nfunction byName(name: string): CarrierField | undefined {\n return fields.value.find((one) => one.name === name)\n}\n\nconst blank = (value: unknown) => value === null || value === undefined || value === ''\n\nfunction labels(): Record<string, string> {\n const stored = settings.value[LABELS]\n\n return stored && typeof stored === 'object' ? (stored as Record<string, string>) : {}\n}\n\n/** The first field this one waits for, or null — it may be asked. */\nfunction waitingFor(field: CarrierField): CarrierField | null {\n for (const parent of field.depends ?? []) {\n if (blank(settings.value[parent])) return byName(parent) ?? { name: parent }\n }\n\n return null\n}\n\nfunction dependsValues(field: CarrierField): Record<string, unknown> {\n return Object.fromEntries((field.depends ?? []).map((name) => [name, settings.value[name]]))\n}\n\n/** Why the field cannot be chosen now, in words; null — it can. */\nfunction blocked(field: CarrierField): string | null {\n if (!keyed.value) return t('options.no-key')\n\n const parent = waitingFor(field)\n\n if (parent) return t('options.choose-first', { field: label(parent) })\n\n return failures.value[field.name] ?? null\n}\n\n/** The options to draw: what the account gave, and the chosen value by its stored label. */\nfunction optionsOf(field: CarrierField): SelectOption[] {\n const list: SelectOption[] = (choices.value[field.name] ?? []).map((one) => ({\n value: one.value,\n label: one.hint ? `${one.label} · ${one.hint}` : one.label,\n }))\n const value = settings.value[field.name]\n\n if (!blank(value) && !list.some((one) => one.value === String(value))) {\n list.unshift({ value: String(value), label: labels()[field.name] ?? String(value) })\n }\n\n return list\n}\n\nasync function ask(field: CarrierField, q?: string, fresh = false): Promise<void> {\n if (!props.carrier || !keyed.value || waitingFor(field)) return\n\n // A search field shows its chosen value by its label until the admin types.\n if (field.search && !q) return\n\n asking.value = { ...asking.value, [field.name]: true }\n\n try {\n const list = await api.carrierOptions(props.carrier, field.name, {\n values: dependsValues(field),\n q,\n fresh,\n })\n\n choices.value = { ...choices.value, [field.name]: list }\n failures.value = Object.fromEntries(\n Object.entries(failures.value).filter(([name]) => name !== field.name),\n )\n } catch (error) {\n failures.value = { ...failures.value, [field.name]: message(error) }\n } finally {\n asking.value = { ...asking.value, [field.name]: false }\n }\n}\n\n/** Every field that waits for nothing, as the dialog opens or «Refresh lists» is pressed. */\nasync function askAll(fresh = false): Promise<void> {\n await Promise.all(fromAccount.value.map((field) => ask(field, undefined, fresh)))\n}\n\nasync function refresh(): Promise<void> {\n refreshing.value = true\n failures.value = {}\n\n try {\n await askAll(true)\n } finally {\n refreshing.value = false\n }\n}\n\n/** The fields that depend on this one, and those that depend on them, in their order. */\nfunction children(name: string): CarrierField[] {\n const found: CarrierField[] = []\n const walk = (parent: string) => {\n for (const field of fields.value) {\n if ((field.depends ?? []).includes(parent) && !found.includes(field)) {\n found.push(field)\n walk(field.name)\n }\n }\n }\n\n walk(name)\n\n return found\n}\n\nfunction choose(field: CarrierField, value: unknown): void {\n const picked = (choices.value[field.name] ?? []).find((one) => one.value === value)\n const nextLabels = { ...labels() }\n\n settings.value[field.name] = value\n\n if (picked) nextLabels[field.name] = picked.label\n else if (blank(value)) delete nextLabels[field.name]\n\n // A new sender has other contacts: whatever stood on the old one is emptied down the chain.\n for (const child of children(field.name)) {\n settings.value[child.name] = null\n delete nextLabels[child.name]\n choices.value = { ...choices.value, [child.name]: [] }\n }\n\n settings.value[LABELS] = nextLabels\n\n for (const child of children(field.name)) void ask(child)\n}\n\nconst timers: Record<string, ReturnType<typeof setTimeout>> = {}\n\nfunction search(field: CarrierField, q: string): void {\n clearTimeout(timers[field.name])\n\n if (q.trim().length < 2) return\n\n timers[field.name] = setTimeout(() => void ask(field, q.trim()), 250)\n}\n\n/**\n * Under the field: why it is off, a value gone from the account, or nothing. «Type to search» is\n * the placeholder of a search field already — said twice under it, it only adds a line.\n */\nfunction helpOf(field: CarrierField): string | undefined {\n if (!isFromAccount(field)) return undefined\n\n const missing = detail.value?.settings.missing?.[field.name]\n\n return blocked(field) ?? (missing ? t('options.missing', { label: missing }) : undefined)\n}\n\nasync function load(): Promise<void> {\n if (!props.carrier) return\n\n loading.value = true\n typed.value = {}\n errors.value = {}\n choices.value = {}\n failures.value = {}\n\n try {\n detail.value = await api.carrier(props.carrier)\n settings.value = { ...detail.value.settings.values }\n } catch (error) {\n toast.danger(message(error))\n open.value = false\n\n return\n } finally {\n loading.value = false\n }\n\n void askAll()\n}\n\nwatch(open, (now) => {\n if (now) void load()\n})\n\nfunction credentials(): Record<string, string> {\n return Object.fromEntries(Object.entries(typed.value).filter(([, value]) => value.trim() !== ''))\n}\n\nasync function save(clear: string[] = []): Promise<void> {\n if (!props.carrier) return\n\n saving.value = true\n errors.value = {}\n\n try {\n // The labels are the server's to write: it takes them from the carrier's list.\n const values = Object.fromEntries(\n Object.entries(settings.value).filter(([name]) => name !== LABELS),\n )\n\n detail.value = await api.saveCarrier(props.carrier, {\n settings: values,\n credentials: credentials(),\n clear,\n })\n settings.value = { ...detail.value.settings.values }\n typed.value = {}\n toast.success(t('carrier.saved'))\n emit('saved')\n void askAll()\n } catch (error) {\n const found = (error as { errors?: Record<string, string[]> }).errors ?? {}\n\n errors.value = Object.fromEntries(\n Object.entries(found).map(([key, list]) => [key.replace(/^settings\\./, ''), list[0] ?? '']),\n )\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n\nasync function test(): Promise<void> {\n if (!props.carrier) return\n\n testing.value = true\n\n try {\n const result = await api.testCarrier(props.carrier, credentials())\n\n if (result.ok) toast.success(result.message ?? t('carrier.test-ok'))\n else toast.danger(t('carrier.test-failed', { message: result.message ?? '' }))\n } catch (error) {\n toast.danger(message(error))\n } finally {\n testing.value = false\n }\n}\n\nconst statusType = {\n running: 'primary',\n succeeded: 'success',\n failed: 'danger',\n held: 'warning',\n} as const\n</script>\n\n<template>\n <wx-dialog\n v-model:open=\"open\"\n :title=\"detail?.title ?? t('carrier.choose')\"\n :width=\"640\"\n scroll=\"body\"\n >\n <wx-skeleton v-if=\"loading || !detail\" :rows=\"5\" />\n\n <div v-else class=\"wx-delivery-carrier-form\">\n <section v-if=\"detail.settings.fields.length > 0\">\n <div class=\"wx-delivery-carrier-form__head\">\n <h4 class=\"wx-delivery-carrier-form__title\">{{ t('carrier.settings') }}</h4>\n <wx-button\n v-if=\"fromAccount.length > 0 && keyed\"\n size=\"sm\"\n variant=\"text\"\n icon=\"refresh\"\n :loading=\"refreshing\"\n data-test=\"options-refresh\"\n @click=\"refresh\"\n >\n {{ t('options.refresh') }}\n </wx-button>\n </div>\n <!-- The form keeps the panel's rhythm between fields; a bare list of items has none. -->\n <wx-form>\n <wx-form-item\n v-for=\"field in detail.settings.fields\"\n :key=\"field.name\"\n :label=\"label(field)\"\n :help=\"helpOf(field)\"\n :error=\"errors[field.name]\"\n :data-test=\"`setting-${field.name}`\"\n >\n <div v-if=\"isFromAccount(field)\" class=\"wx-delivery-carrier-form__choice\">\n <!-- A wrapper takes the row: the select's own root carries no scoped attribute. -->\n <div class=\"wx-delivery-carrier-form__select\">\n <wx-select\n :model-value=\"(settings[field.name] as string | null) ?? null\"\n :options=\"optionsOf(field)\"\n :filterable=\"field.search === true\"\n :disabled=\"!canManage || blocked(field) !== null || asking[field.name] === true\"\n :status=\"detail.settings.missing?.[field.name] ? 'warning' : undefined\"\n :placeholder=\"field.search ? t('options.search') : undefined\"\n clearable\n @update:model-value=\"choose(field, $event)\"\n @search=\"search(field, $event)\"\n />\n </div>\n <wx-button\n v-if=\"failures[field.name] && canManage\"\n size=\"sm\"\n variant=\"outline\"\n @click=\"ask(field, undefined, true)\"\n >\n {{ t('options.retry') }}\n </wx-button>\n </div>\n <wx-switch\n v-else-if=\"field.type === 'boolean'\"\n v-model=\"settings[field.name] as boolean\"\n :disabled=\"!canManage\"\n />\n <wx-input-number\n v-else-if=\"field.type === 'number'\"\n v-model=\"settings[field.name] as number\"\n :step=\"field.step\"\n :precision=\"field.precision\"\n :min=\"field.min\"\n :max=\"field.max\"\n :placeholder=\"defaultOf(field)\"\n :disabled=\"!canManage\"\n />\n <wx-select\n v-else-if=\"field.type === 'select'\"\n v-model=\"settings[field.name] as string\"\n :options=\"Array.isArray(field.options) ? field.options : []\"\n :disabled=\"!canManage\"\n />\n <wx-input\n v-else\n v-model=\"settings[field.name] as string\"\n :placeholder=\"defaultOf(field)\"\n :disabled=\"!canManage\"\n />\n </wx-form-item>\n </wx-form>\n </section>\n\n <section v-if=\"detail.credentials.length > 0\" data-test=\"credentials\">\n <h4 class=\"wx-delivery-carrier-form__title\">{{ t('carrier.credentials') }}</h4>\n <wx-form>\n <wx-form-item\n v-for=\"(field, index) in detail.credentials\"\n :key=\"field.name\"\n :label=\"keyLabel(field, index, detail.credentials.length)\"\n >\n <div class=\"wx-delivery-carrier-form__secret\">\n <wx-badge :type=\"field.set ? 'success' : 'default'\" dot>\n {{ field.set ? t('carrier.set') : t('carrier.not-set') }}\n </wx-badge>\n <wx-input\n v-model=\"typed[field.name]\"\n type=\"password\"\n autocomplete=\"new-password\"\n :placeholder=\"t('carrier.replace')\"\n :disabled=\"!canManage\"\n class=\"wx-delivery-carrier-form__key\"\n />\n <wx-button\n v-if=\"field.set && canManage\"\n size=\"sm\"\n variant=\"text\"\n @click=\"save([field.name])\"\n >\n {{ t('carrier.clear') }}\n </wx-button>\n </div>\n </wx-form-item>\n </wx-form>\n </section>\n\n <section>\n <h4 class=\"wx-delivery-carrier-form__title\">{{ t('carrier.runs') }}</h4>\n <p v-if=\"detail.runs.length === 0\" class=\"wx-delivery-carrier-form__muted\">\n {{ t('carrier.never') }}\n </p>\n <ul v-else class=\"wx-delivery-carrier-form__runs\">\n <li v-for=\"run in detail.runs\" :key=\"run.id\">\n <wx-badge :type=\"statusType[run.status]\" size=\"sm\">\n {{ t(`carrier.statuses.${run.status}`) }}\n </wx-badge>\n <span>{{ t(`carrier.directories.${run.directory}`) }}</span>\n <wx-date v-if=\"run.started_at\" :value=\"run.started_at\" />\n <span class=\"wx-delivery-carrier-form__muted\">\n {{ t('carrier.seen') }}: {{ run.seen }} · +{{ run.created }} · −{{ run.removed }}\n </span>\n <span v-if=\"run.error\" class=\"wx-delivery-carrier-form__error\">{{ run.error }}</span>\n </li>\n </ul>\n </section>\n </div>\n\n <template v-if=\"canManage && detail\" #footer>\n <wx-space size=\"sm\">\n <wx-button\n v-if=\"detail.credentials.length > 0\"\n variant=\"outline\"\n :loading=\"testing\"\n @click=\"test\"\n >\n {{ t('carrier.test') }}\n </wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" data-test=\"carrier-save\" @click=\"save()\">\n {{ t('common.save') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-delivery-carrier-form {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n}\n\n.wx-delivery-carrier-form__head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n margin-bottom: var(--wx-space-8);\n}\n\n.wx-delivery-carrier-form__head .wx-delivery-carrier-form__title {\n margin: 0;\n}\n\n.wx-delivery-carrier-form__title {\n margin: 0 0 var(--wx-space-8);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-carrier-form__choice {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n width: 100%;\n}\n\n.wx-delivery-carrier-form__select {\n flex: 1 1 200px;\n min-width: 0;\n}\n\n.wx-delivery-carrier-form__secret {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n width: 100%;\n}\n\n.wx-delivery-carrier-form__key {\n flex: 1 1 200px;\n min-width: 0;\n}\n\n.wx-delivery-carrier-form__runs {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-delivery-carrier-form__runs li {\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-carrier-form__muted {\n color: var(--wx-text-muted);\n}\n\n.wx-delivery-carrier-form__error {\n flex-basis: 100%;\n color: var(--wx-color-danger);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { RouterLink } from 'vue-router'\nimport { toast, WxBadge, WxButton, WxCard, WxEmpty, WxSkeleton, WxSwitch } from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxDate, WxListScreen } from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport CarrierDialog from './CarrierDialog.vue'\nimport { useDeliveryWords } from './i18n'\nimport type { CarrierDirectory, CarrierRow } from './types'\n\n/**\n * The carriers (§14.2): each on or off, and each of its directories — localities, points,\n * streets — with its last success, a run going on, a pass held at the threshold, whether it is\n * stale, how many records it has, and the remarks of its last pass. «Run» sends a directory to\n * the queue; «Confirm removal» lets a held pass remove what the carrier no longer has. The\n * settings and keys of a carrier, and its runs, open in a dialog.\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst rows = ref<CarrierRow[]>([])\nconst loading = ref(true)\nconst busy = ref<string | null>(null)\nconst editing = ref<string | null>(null)\nconst editorOpen = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-carriers')?.title ??\n t('sections.carriers'),\n)\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n rows.value = await api.carriers()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\nasync function toggle(row: CarrierRow, on: boolean): Promise<void> {\n try {\n await api.saveCarrier(row.key, { enabled: on })\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function run(row: CarrierRow, directory: CarrierDirectory): Promise<void> {\n busy.value = `${row.key}:${directory.directory}`\n\n try {\n const { queued } = await api.runSync(row.key, directory.directory)\n\n toast.success(\n t('carrier.queued', {\n list: queued.map((one) => t(`carrier.directories.${one}`)).join(', '),\n }),\n )\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n busy.value = null\n }\n}\n\nasync function confirmRemoval(row: CarrierRow, directory: CarrierDirectory): Promise<void> {\n busy.value = `${row.key}:${directory.directory}`\n\n try {\n await api.confirmRemoval(row.key, directory.directory)\n toast.success(t('carrier.confirmed'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n busy.value = null\n }\n}\n\n/* The server's words first; a reason nobody named is still said in words, never as its key. */\nfunction remark(item: { key: string; count: number; label?: string }): string {\n if (item.label) return item.label\n\n const key = `carrier.remarks.${item.key.replace('.', '-')}`\n const line = t(key, { count: item.count })\n\n return line.endsWith(key) ? t('carrier.remarks.skipped-other', { count: item.count }) : line\n}\n\nfunction open(key: string): void {\n editing.value = key\n editorOpen.value = true\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :card=\"false\">\n <wx-skeleton v-if=\"loading && rows.length === 0\" :rows=\"4\" />\n\n <wx-card v-else-if=\"rows.length === 0\">\n <wx-empty :title=\"t('carrier.empty')\" :description=\"t('carrier.empty-help')\" />\n </wx-card>\n\n <div v-else class=\"wx-delivery-carriers\">\n <wx-card v-for=\"row in rows\" :key=\"row.key\" :title=\"row.title\" class=\"wx-delivery-carrier\">\n <template #extra>\n <span class=\"wx-delivery-carrier__head\">\n <wx-switch\n :model-value=\"row.enabled\"\n :disabled=\"!canManage\"\n :aria-label=\"t('carrier.enabled')\"\n @update:model-value=\"toggle(row, Boolean($event))\"\n />\n <wx-button size=\"sm\" variant=\"outline\" @click=\"open(row.key)\">\n {{ t('carrier.settings') }}\n </wx-button>\n </span>\n </template>\n\n <p\n v-if=\"row.missing && row.missing.length > 0\"\n class=\"wx-delivery-carrier__missing\"\n data-test=\"carrier-missing\"\n >\n {{ t('options.missing-list', { list: row.missing.join(', ') }) }}\n </p>\n\n <p v-if=\"row.queue > 0\" class=\"wx-delivery-carrier__queue\">\n {{ t('carrier.queue') }}: <strong>{{ row.queue }}</strong>\n <router-link :to=\"{ name: 'webx.delivery.bindings', query: { carrier: row.key } }\"\n >→</router-link\n >\n </p>\n\n <div v-for=\"dir in row.directories\" :key=\"dir.directory\" class=\"wx-delivery-dir\">\n <div class=\"wx-delivery-dir__main\">\n <span class=\"wx-delivery-dir__name\">{{\n t(`carrier.directories.${dir.directory}`)\n }}</span>\n <span class=\"wx-delivery-dir__facts\">\n {{ t('carrier.records') }}: {{ dir.records }} · {{ t('carrier.schedule') }}:\n <!-- A cron line is code; «By hand only» is words. -->\n <code v-if=\"dir.cron\">{{ dir.cron }}</code>\n <template v-else>{{ t('carrier.manual') }}</template>\n </span>\n <span class=\"wx-delivery-dir__facts\">\n {{ t('carrier.last-success') }}:\n <wx-date v-if=\"dir.last_success\" :value=\"dir.last_success\" />\n <template v-else>{{ t('carrier.never') }}</template>\n </span>\n <span class=\"wx-delivery-dir__badges\">\n <wx-badge v-if=\"dir.running\" type=\"primary\" dot>{{ t('carrier.running') }}</wx-badge>\n <wx-badge v-if=\"dir.held !== null\" type=\"warning\" dot>\n {{ t('carrier.held', { count: dir.held }) }}\n </wx-badge>\n <wx-badge v-if=\"dir.stale\" type=\"danger\" dot>{{ t('carrier.stale') }}</wx-badge>\n <wx-badge v-if=\"dir.latest?.status === 'failed'\" type=\"danger\" size=\"sm\">\n {{ t('carrier.statuses.failed') }}\n </wx-badge>\n </span>\n <span v-for=\"item in dir.remarks\" :key=\"item.key\" class=\"wx-delivery-dir__remark\">\n {{ remark(item) }}\n </span>\n </div>\n\n <span v-if=\"canManage\" class=\"wx-delivery-dir__actions\">\n <wx-button\n v-if=\"dir.held !== null\"\n size=\"sm\"\n type=\"warning\"\n :loading=\"busy === `${row.key}:${dir.directory}`\"\n @click=\"confirmRemoval(row, dir)\"\n >\n {{ t('carrier.confirm') }}\n </wx-button>\n <wx-button\n size=\"sm\"\n icon=\"refresh\"\n :disabled=\"dir.running || !row.enabled\"\n :loading=\"busy === `${row.key}:${dir.directory}`\"\n :data-test=\"`run-${row.key}-${dir.directory}`\"\n @click=\"run(row, dir)\"\n >\n {{ t('carrier.run') }}\n </wx-button>\n </span>\n </div>\n </wx-card>\n </div>\n\n <carrier-dialog v-model:open=\"editorOpen\" :carrier=\"editing\" @saved=\"load\" />\n </wx-list-screen>\n</template>\n\n<style scoped>\n.wx-delivery-carriers {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n}\n\n.wx-delivery-carrier__head {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-12);\n}\n\n.wx-delivery-carrier__queue {\n margin: 0 0 var(--wx-space-12);\n}\n\n.wx-delivery-carrier__missing {\n margin: 0 0 var(--wx-space-12);\n color: var(--wx-color-warning);\n}\n\n.wx-delivery-dir {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-16);\n padding: var(--wx-space-12) 0;\n border-top: 1px solid var(--wx-border-default);\n}\n\n.wx-delivery-dir__main {\n display: flex;\n flex: 1 1 280px;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-delivery-dir__name {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-dir__facts,\n.wx-delivery-dir__remark {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-delivery-dir__remark {\n color: var(--wx-color-warning);\n}\n\n.wx-delivery-dir__badges {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-6);\n}\n\n.wx-delivery-dir__badges:empty {\n display: none;\n}\n\n.wx-delivery-dir__actions {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8);\n}\n</style>\n"],"names":["LABELS","props","__props","open","_useModel","emit","__emit","context","useAdmin","api","createDeliveryApi","t","useDeliveryWords","message","useErrorText","detail","ref","settings","typed","loading","saving","testing","errors","choices","asking","failures","refreshing","canManage","computed","fields","fromAccount","isFromAccount","keyed","one","field","label","locale","keyLabel","index","count","defaultOf","byName","name","blank","value","labels","stored","waitingFor","parent","dependsValues","blocked","optionsOf","list","ask","q","fresh","error","askAll","refresh","children","found","walk","choose","picked","nextLabels","child","timers","search","helpOf","missing","load","toast","watch","now","credentials","save","clear","values","key","test","result","statusType","_createBlock","_unref","WxDialog","$event","WxSkeleton","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","WxButton","_createVNode","WxForm","_Fragment","WxFormItem","_hoisted_5","_hoisted_6","WxSelect","WxSwitch","WxInputNumber","WxInput","_hoisted_7","_hoisted_8","_hoisted_9","WxBadge","_createTextVNode","_hoisted_10","_hoisted_11","_hoisted_12","_renderList","run","WxDate","_hoisted_13","_hoisted_14","WxSpace","rows","busy","editing","editorOpen","title","module","toggle","row","on","directory","queued","confirmRemoval","remark","item","line","WxListScreen","WxCard","WxEmpty","RouterLink","_cache","dir","CarrierDialog"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CarriersPage-CV9uFlXk.js","sources":["../src/CarrierDialog.vue","../src/CarriersPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue'\nimport {\n toast,\n WxBadge,\n WxButton,\n WxDialog,\n WxForm,\n WxFormItem,\n WxInput,\n WxInputNumber,\n WxSelect,\n WxSkeleton,\n WxSpace,\n WxSwitch,\n type SelectOption,\n} from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxDate } from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport { useDeliveryWords } from './i18n'\nimport type { CarrierDetail, CarrierField, SettingOption } from './types'\n\n/**\n * One carrier's settings and keys (§13.2), and its runs.\n *\n * A key is never sent to the panel: the dialog says whether each one is set, and an empty field\n * means «leave it» — typing a new value replaces it, «Clear» removes it. «Check the connection»\n * tries the stored keys with whatever is typed over them, without saving.\n *\n * A field with `options: 'carrier'` is a select whose options come from the carrier's account\n * (`ProvidesSettingOptions`): it waits for the key and for the fields it `depends` on, a change\n * empties the fields that depend on it, a `search` field asks as the admin types. The label of the\n * chosen value is kept beside it (`_labels`), so the field shows it even when the carrier is down.\n */\nconst props = defineProps<{ carrier: string | null }>()\n\nconst open = defineModel<boolean>('open', { default: false })\n\nconst emit = defineEmits<{ saved: [] }>()\n\nconst LABELS = '_labels'\n\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst detail = ref<CarrierDetail | null>(null)\nconst settings = ref<Record<string, unknown>>({})\nconst typed = ref<Record<string, string>>({})\nconst loading = ref(false)\nconst saving = ref(false)\nconst testing = ref(false)\nconst errors = ref<Record<string, string>>({})\n\n/** Options from the carrier's account by field, what is being asked, and why a list did not come. */\nconst choices = ref<Record<string, SettingOption[]>>({})\nconst asking = ref<Record<string, boolean>>({})\nconst failures = ref<Record<string, string>>({})\nconst refreshing = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\n\nconst fields = computed(() => detail.value?.settings.fields ?? [])\nconst fromAccount = computed(() => fields.value.filter(isFromAccount))\n\n/** Options from the account are asked with the stored key: none set — nothing to ask with. */\nconst keyed = computed(\n () =>\n !detail.value ||\n detail.value.credentials.length === 0 ||\n detail.value.credentials.some((one) => one.set),\n)\n\nfunction isFromAccount(field: CarrierField): boolean {\n return field.options === 'carrier'\n}\n\nfunction label(field: CarrierField): string {\n if (typeof field.label === 'string') return field.label\n if (field.label && typeof field.label === 'object') {\n const locale = context.i18n.state.locale\n\n return field.label[locale] ?? Object.values(field.label)[0] ?? field.name\n }\n\n return field.name\n}\n\n/** A key the carrier gave no label: words, never its code name. */\nfunction keyLabel(field: CarrierField, index: number, count: number): string {\n if (field.label) return label(field)\n\n return count > 1 ? `${t('carrier.key')} ${index + 1}` : t('carrier.key')\n}\n\n/*\n * A field left empty takes the carrier's default when it is used (the waybill's weight, the\n * description of the cargo): the placeholder says which, without storing it as a choice.\n */\nfunction defaultOf(field: CarrierField): string | undefined {\n return typeof field.default === 'number' || typeof field.default === 'string'\n ? String(field.default)\n : undefined\n}\n\nfunction byName(name: string): CarrierField | undefined {\n return fields.value.find((one) => one.name === name)\n}\n\nconst blank = (value: unknown) => value === null || value === undefined || value === ''\n\nfunction labels(): Record<string, string> {\n const stored = settings.value[LABELS]\n\n return stored && typeof stored === 'object' ? (stored as Record<string, string>) : {}\n}\n\n/** The first field this one waits for, or null — it may be asked. */\nfunction waitingFor(field: CarrierField): CarrierField | null {\n for (const parent of field.depends ?? []) {\n if (blank(settings.value[parent])) return byName(parent) ?? { name: parent }\n }\n\n return null\n}\n\nfunction dependsValues(field: CarrierField): Record<string, unknown> {\n return Object.fromEntries((field.depends ?? []).map((name) => [name, settings.value[name]]))\n}\n\n/** Why the field cannot be chosen now, in words; null — it can. */\nfunction blocked(field: CarrierField): string | null {\n if (!keyed.value) return t('options.no-key')\n\n const parent = waitingFor(field)\n\n if (parent) return t('options.choose-first', { field: label(parent) })\n\n return failures.value[field.name] ?? null\n}\n\n/** The options to draw: what the account gave, and the chosen value by its stored label. */\nfunction optionsOf(field: CarrierField): SelectOption[] {\n const list: SelectOption[] = (choices.value[field.name] ?? []).map((one) => ({\n value: one.value,\n label: one.hint ? `${one.label} · ${one.hint}` : one.label,\n }))\n const value = settings.value[field.name]\n\n if (!blank(value) && !list.some((one) => one.value === String(value))) {\n list.unshift({ value: String(value), label: labels()[field.name] ?? String(value) })\n }\n\n return list\n}\n\nasync function ask(field: CarrierField, q?: string, fresh = false): Promise<void> {\n if (!props.carrier || !keyed.value || waitingFor(field)) return\n\n // A search field shows its chosen value by its label until the admin types.\n if (field.search && !q) return\n\n asking.value = { ...asking.value, [field.name]: true }\n\n try {\n const list = await api.carrierOptions(props.carrier, field.name, {\n values: dependsValues(field),\n q,\n fresh,\n })\n\n choices.value = { ...choices.value, [field.name]: list }\n failures.value = Object.fromEntries(\n Object.entries(failures.value).filter(([name]) => name !== field.name),\n )\n } catch (error) {\n failures.value = { ...failures.value, [field.name]: message(error) }\n } finally {\n asking.value = { ...asking.value, [field.name]: false }\n }\n}\n\n/** Every field that waits for nothing, as the dialog opens or «Refresh lists» is pressed. */\nasync function askAll(fresh = false): Promise<void> {\n await Promise.all(fromAccount.value.map((field) => ask(field, undefined, fresh)))\n}\n\nasync function refresh(): Promise<void> {\n refreshing.value = true\n failures.value = {}\n\n try {\n await askAll(true)\n } finally {\n refreshing.value = false\n }\n}\n\n/** The fields that depend on this one, and those that depend on them, in their order. */\nfunction children(name: string): CarrierField[] {\n const found: CarrierField[] = []\n const walk = (parent: string) => {\n for (const field of fields.value) {\n if ((field.depends ?? []).includes(parent) && !found.includes(field)) {\n found.push(field)\n walk(field.name)\n }\n }\n }\n\n walk(name)\n\n return found\n}\n\nfunction choose(field: CarrierField, value: unknown): void {\n const picked = (choices.value[field.name] ?? []).find((one) => one.value === value)\n const nextLabels = { ...labels() }\n\n settings.value[field.name] = value\n\n if (picked) nextLabels[field.name] = picked.label\n else if (blank(value)) delete nextLabels[field.name]\n\n // A new sender has other contacts: whatever stood on the old one is emptied down the chain.\n for (const child of children(field.name)) {\n settings.value[child.name] = null\n delete nextLabels[child.name]\n choices.value = { ...choices.value, [child.name]: [] }\n }\n\n settings.value[LABELS] = nextLabels\n\n for (const child of children(field.name)) void ask(child)\n}\n\nconst timers: Record<string, ReturnType<typeof setTimeout>> = {}\n\nfunction search(field: CarrierField, q: string): void {\n clearTimeout(timers[field.name])\n\n if (q.trim().length < 2) return\n\n timers[field.name] = setTimeout(() => void ask(field, q.trim()), 250)\n}\n\n/**\n * Under the field: why it is off, a value gone from the account, or nothing. «Type to search» is\n * the placeholder of a search field already — said twice under it, it only adds a line.\n */\nfunction helpOf(field: CarrierField): string | undefined {\n if (!isFromAccount(field)) return undefined\n\n const missing = detail.value?.settings.missing?.[field.name]\n\n return blocked(field) ?? (missing ? t('options.missing', { label: missing }) : undefined)\n}\n\nasync function load(): Promise<void> {\n if (!props.carrier) return\n\n loading.value = true\n typed.value = {}\n errors.value = {}\n choices.value = {}\n failures.value = {}\n\n try {\n detail.value = await api.carrier(props.carrier)\n settings.value = { ...detail.value.settings.values }\n } catch (error) {\n toast.danger(message(error))\n open.value = false\n\n return\n } finally {\n loading.value = false\n }\n\n void askAll()\n}\n\nwatch(open, (now) => {\n if (now) void load()\n})\n\nfunction credentials(): Record<string, string> {\n return Object.fromEntries(Object.entries(typed.value).filter(([, value]) => value.trim() !== ''))\n}\n\nasync function save(clear: string[] = []): Promise<void> {\n if (!props.carrier) return\n\n saving.value = true\n errors.value = {}\n\n try {\n // The labels are the server's to write: it takes them from the carrier's list.\n const values = Object.fromEntries(\n Object.entries(settings.value).filter(([name]) => name !== LABELS),\n )\n\n detail.value = await api.saveCarrier(props.carrier, {\n settings: values,\n credentials: credentials(),\n clear,\n })\n settings.value = { ...detail.value.settings.values }\n typed.value = {}\n toast.success(t('carrier.saved'))\n emit('saved')\n void askAll()\n } catch (error) {\n const found = (error as { errors?: Record<string, string[]> }).errors ?? {}\n\n errors.value = Object.fromEntries(\n Object.entries(found).map(([key, list]) => [key.replace(/^settings\\./, ''), list[0] ?? '']),\n )\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n\nasync function test(): Promise<void> {\n if (!props.carrier) return\n\n testing.value = true\n\n try {\n const result = await api.testCarrier(props.carrier, credentials())\n\n if (result.ok) toast.success(result.message ?? t('carrier.test-ok'))\n else toast.danger(t('carrier.test-failed', { message: result.message ?? '' }))\n } catch (error) {\n toast.danger(message(error))\n } finally {\n testing.value = false\n }\n}\n\nconst statusType = {\n running: 'primary',\n succeeded: 'success',\n failed: 'danger',\n held: 'warning',\n} as const\n</script>\n\n<template>\n <wx-dialog\n v-model:open=\"open\"\n :title=\"detail?.title ?? t('carrier.choose')\"\n :width=\"640\"\n scroll=\"body\"\n >\n <wx-skeleton v-if=\"loading || !detail\" :rows=\"5\" />\n\n <div v-else class=\"wx-delivery-carrier-form\">\n <section v-if=\"detail.settings.fields.length > 0\">\n <div class=\"wx-delivery-carrier-form__head\">\n <h4 class=\"wx-delivery-carrier-form__title\">{{ t('carrier.settings') }}</h4>\n <wx-button\n v-if=\"fromAccount.length > 0 && keyed\"\n size=\"sm\"\n variant=\"text\"\n icon=\"refresh\"\n :loading=\"refreshing\"\n data-test=\"options-refresh\"\n @click=\"refresh\"\n >\n {{ t('options.refresh') }}\n </wx-button>\n </div>\n <!-- The form keeps the panel's rhythm between fields; a bare list of items has none. -->\n <wx-form>\n <wx-form-item\n v-for=\"field in detail.settings.fields\"\n :key=\"field.name\"\n :label=\"label(field)\"\n :help=\"helpOf(field)\"\n :error=\"errors[field.name]\"\n :data-test=\"`setting-${field.name}`\"\n >\n <div v-if=\"isFromAccount(field)\" class=\"wx-delivery-carrier-form__choice\">\n <!-- A wrapper takes the row: the select's own root carries no scoped attribute. -->\n <div class=\"wx-delivery-carrier-form__select\">\n <wx-select\n :model-value=\"(settings[field.name] as string | null) ?? null\"\n :options=\"optionsOf(field)\"\n :filterable=\"field.search === true\"\n :disabled=\"!canManage || blocked(field) !== null || asking[field.name] === true\"\n :status=\"detail.settings.missing?.[field.name] ? 'warning' : undefined\"\n :placeholder=\"field.search ? t('options.search') : undefined\"\n clearable\n @update:model-value=\"choose(field, $event)\"\n @search=\"search(field, $event)\"\n />\n </div>\n <wx-button\n v-if=\"failures[field.name] && canManage\"\n size=\"sm\"\n variant=\"outline\"\n @click=\"ask(field, undefined, true)\"\n >\n {{ t('options.retry') }}\n </wx-button>\n </div>\n <wx-switch\n v-else-if=\"field.type === 'boolean'\"\n v-model=\"settings[field.name] as boolean\"\n :disabled=\"!canManage\"\n />\n <wx-input-number\n v-else-if=\"field.type === 'number'\"\n v-model=\"settings[field.name] as number\"\n :step=\"field.step\"\n :precision=\"field.precision\"\n :min=\"field.min\"\n :max=\"field.max\"\n :placeholder=\"defaultOf(field)\"\n :disabled=\"!canManage\"\n />\n <wx-select\n v-else-if=\"field.type === 'select'\"\n v-model=\"settings[field.name] as string\"\n :options=\"Array.isArray(field.options) ? field.options : []\"\n :disabled=\"!canManage\"\n />\n <wx-input\n v-else\n v-model=\"settings[field.name] as string\"\n :placeholder=\"defaultOf(field)\"\n :disabled=\"!canManage\"\n />\n </wx-form-item>\n </wx-form>\n </section>\n\n <section v-if=\"detail.credentials.length > 0\" data-test=\"credentials\">\n <h4 class=\"wx-delivery-carrier-form__title\">{{ t('carrier.credentials') }}</h4>\n <wx-form>\n <wx-form-item\n v-for=\"(field, index) in detail.credentials\"\n :key=\"field.name\"\n :label=\"keyLabel(field, index, detail.credentials.length)\"\n >\n <div class=\"wx-delivery-carrier-form__secret\">\n <wx-badge :type=\"field.set ? 'success' : 'default'\" dot>\n {{ field.set ? t('carrier.set') : t('carrier.not-set') }}\n </wx-badge>\n <wx-input\n v-model=\"typed[field.name]\"\n type=\"password\"\n autocomplete=\"new-password\"\n :placeholder=\"t('carrier.replace')\"\n :disabled=\"!canManage\"\n class=\"wx-delivery-carrier-form__key\"\n />\n <wx-button\n v-if=\"field.set && canManage\"\n size=\"sm\"\n variant=\"text\"\n @click=\"save([field.name])\"\n >\n {{ t('carrier.clear') }}\n </wx-button>\n </div>\n </wx-form-item>\n </wx-form>\n </section>\n\n <section>\n <h4 class=\"wx-delivery-carrier-form__title\">{{ t('carrier.runs') }}</h4>\n <p v-if=\"detail.runs.length === 0\" class=\"wx-delivery-carrier-form__muted\">\n {{ t('carrier.never') }}\n </p>\n <ul v-else class=\"wx-delivery-carrier-form__runs\">\n <li v-for=\"run in detail.runs\" :key=\"run.id\">\n <wx-badge :type=\"statusType[run.status]\" size=\"sm\">\n {{ t(`carrier.statuses.${run.status}`) }}\n </wx-badge>\n <span>{{ t(`carrier.directories.${run.directory}`) }}</span>\n <wx-date v-if=\"run.started_at\" :value=\"run.started_at\" />\n <span class=\"wx-delivery-carrier-form__muted\">\n {{ t('carrier.seen') }}: {{ run.seen }} · +{{ run.created }} · −{{ run.removed }}\n </span>\n <span v-if=\"run.error\" class=\"wx-delivery-carrier-form__error\">{{ run.error }}</span>\n </li>\n </ul>\n </section>\n </div>\n\n <template v-if=\"canManage && detail\" #footer>\n <wx-space size=\"sm\">\n <wx-button\n v-if=\"detail.credentials.length > 0\"\n variant=\"outline\"\n :loading=\"testing\"\n @click=\"test\"\n >\n {{ t('carrier.test') }}\n </wx-button>\n <wx-button type=\"primary\" :loading=\"saving\" data-test=\"carrier-save\" @click=\"save()\">\n {{ t('common.save') }}\n </wx-button>\n </wx-space>\n </template>\n </wx-dialog>\n</template>\n\n<style scoped>\n.wx-delivery-carrier-form {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n}\n\n.wx-delivery-carrier-form__head {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-8);\n margin-bottom: var(--wx-space-8);\n}\n\n.wx-delivery-carrier-form__head .wx-delivery-carrier-form__title {\n margin: 0;\n}\n\n.wx-delivery-carrier-form__title {\n margin: 0 0 var(--wx-space-8);\n font-size: var(--wx-font-size-sm);\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-carrier-form__choice {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n width: 100%;\n}\n\n.wx-delivery-carrier-form__select {\n flex: 1 1 200px;\n min-width: 0;\n}\n\n.wx-delivery-carrier-form__secret {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8);\n width: 100%;\n}\n\n.wx-delivery-carrier-form__key {\n flex: 1 1 200px;\n min-width: 0;\n}\n\n.wx-delivery-carrier-form__runs {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-6);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.wx-delivery-carrier-form__runs li {\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-carrier-form__muted {\n color: var(--wx-text-muted);\n}\n\n.wx-delivery-carrier-form__error {\n flex-basis: 100%;\n color: var(--wx-color-danger);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { RouterLink } from 'vue-router'\nimport { toast, WxBadge, WxButton, WxCard, WxEmpty, WxSkeleton, WxSwitch } from '@webx-ui/core'\nimport { useAdmin, useErrorText, WxDate, WxListScreen } from '@webx-ui/module-admin'\nimport { createDeliveryApi } from './api'\nimport CarrierDialog from './CarrierDialog.vue'\nimport { useDeliveryWords } from './i18n'\nimport type { CarrierDirectory, CarrierRow } from './types'\n\n/**\n * The carriers (§14.2): each on or off, and each of its directories — localities, points,\n * streets — with its last success, a run going on, a pass held at the threshold, whether it is\n * stale, how many records it has, and the remarks of its last pass. «Run» sends a directory to\n * the queue; «Confirm removal» lets a held pass remove what the carrier no longer has. The\n * settings and keys of a carrier, and its runs, open in a dialog.\n */\nconst context = useAdmin()\nconst api = createDeliveryApi(context)\nconst t = useDeliveryWords()\nconst message = useErrorText()\n\nconst rows = ref<CarrierRow[]>([])\nconst loading = ref(true)\nconst busy = ref<string | null>(null)\nconst editing = ref<string | null>(null)\nconst editorOpen = ref(false)\n\nconst canManage = computed(() => context.can('delivery.manage'))\nconst title = computed(\n () =>\n context.state.manifest?.modules.find((module) => module.id === 'delivery-carriers')?.title ??\n t('sections.carriers'),\n)\n\nasync function load(): Promise<void> {\n loading.value = true\n\n try {\n rows.value = await api.carriers()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n}\n\nvoid load()\n\nasync function toggle(row: CarrierRow, on: boolean): Promise<void> {\n try {\n await api.saveCarrier(row.key, { enabled: on })\n await load()\n } catch (error) {\n toast.danger(message(error))\n }\n}\n\nasync function run(row: CarrierRow, directory: CarrierDirectory): Promise<void> {\n busy.value = `${row.key}:${directory.directory}`\n\n try {\n const { queued } = await api.runSync(row.key, directory.directory)\n\n toast.success(\n t('carrier.queued', {\n list: queued.map((one) => t(`carrier.directories.${one}`)).join(', '),\n }),\n )\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n busy.value = null\n }\n}\n\nasync function confirmRemoval(row: CarrierRow, directory: CarrierDirectory): Promise<void> {\n busy.value = `${row.key}:${directory.directory}`\n\n try {\n await api.confirmRemoval(row.key, directory.directory)\n toast.success(t('carrier.confirmed'))\n await load()\n } catch (error) {\n toast.danger(message(error))\n } finally {\n busy.value = null\n }\n}\n\n/* The server's words first; a reason nobody named is still said in words, never as its key. */\nfunction remark(item: { key: string; count: number; label?: string }): string {\n if (item.label) return item.label\n\n const key = `carrier.remarks.${item.key.replace('.', '-')}`\n const line = t(key, { count: item.count })\n\n return line.endsWith(key) ? t('carrier.remarks.skipped-other', { count: item.count }) : line\n}\n\nfunction open(key: string): void {\n editing.value = key\n editorOpen.value = true\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"title\" :card=\"false\">\n <wx-skeleton v-if=\"loading && rows.length === 0\" :rows=\"4\" />\n\n <wx-card v-else-if=\"rows.length === 0\">\n <wx-empty :title=\"t('carrier.empty')\" :description=\"t('carrier.empty-help')\" />\n </wx-card>\n\n <div v-else class=\"wx-delivery-carriers\">\n <wx-card v-for=\"row in rows\" :key=\"row.key\" :title=\"row.title\" class=\"wx-delivery-carrier\">\n <template #extra>\n <span class=\"wx-delivery-carrier__head\">\n <wx-switch\n :model-value=\"row.enabled\"\n :disabled=\"!canManage\"\n :aria-label=\"t('carrier.enabled')\"\n @update:model-value=\"toggle(row, Boolean($event))\"\n />\n <wx-button size=\"sm\" variant=\"outline\" @click=\"open(row.key)\">\n {{ t('carrier.settings') }}\n </wx-button>\n </span>\n </template>\n\n <p\n v-if=\"row.missing && row.missing.length > 0\"\n class=\"wx-delivery-carrier__missing\"\n data-test=\"carrier-missing\"\n >\n {{ t('options.missing-list', { list: row.missing.join(', ') }) }}\n </p>\n\n <p v-if=\"row.queue > 0\" class=\"wx-delivery-carrier__queue\">\n {{ t('carrier.queue') }}: <strong>{{ row.queue }}</strong>\n <router-link :to=\"{ name: 'webx.delivery.bindings', query: { carrier: row.key } }\"\n >→</router-link\n >\n </p>\n\n <div v-for=\"dir in row.directories\" :key=\"dir.directory\" class=\"wx-delivery-dir\">\n <div class=\"wx-delivery-dir__main\">\n <span class=\"wx-delivery-dir__name\">{{\n t(`carrier.directories.${dir.directory}`)\n }}</span>\n <span class=\"wx-delivery-dir__facts\">\n {{ t('carrier.records') }}: {{ dir.records }} · {{ t('carrier.schedule') }}:\n <!-- A cron line is code; «By hand only» is words. -->\n <code v-if=\"dir.cron\">{{ dir.cron }}</code>\n <template v-else>{{ t('carrier.manual') }}</template>\n </span>\n <span class=\"wx-delivery-dir__facts\">\n {{ t('carrier.last-success') }}:\n <wx-date v-if=\"dir.last_success\" :value=\"dir.last_success\" />\n <template v-else>{{ t('carrier.never') }}</template>\n </span>\n <span class=\"wx-delivery-dir__badges\">\n <wx-badge v-if=\"dir.running\" type=\"primary\" dot>{{ t('carrier.running') }}</wx-badge>\n <wx-badge v-if=\"dir.held !== null\" type=\"warning\" dot>\n {{ t('carrier.held', { count: dir.held }) }}\n </wx-badge>\n <wx-badge v-if=\"dir.stale\" type=\"danger\" dot>{{ t('carrier.stale') }}</wx-badge>\n <wx-badge v-if=\"dir.latest?.status === 'failed'\" type=\"danger\" size=\"sm\">\n {{ t('carrier.statuses.failed') }}\n </wx-badge>\n </span>\n <span v-for=\"item in dir.remarks\" :key=\"item.key\" class=\"wx-delivery-dir__remark\">\n {{ remark(item) }}\n </span>\n </div>\n\n <span v-if=\"canManage\" class=\"wx-delivery-dir__actions\">\n <wx-button\n v-if=\"dir.held !== null\"\n size=\"sm\"\n type=\"warning\"\n :loading=\"busy === `${row.key}:${dir.directory}`\"\n @click=\"confirmRemoval(row, dir)\"\n >\n {{ t('carrier.confirm') }}\n </wx-button>\n <wx-button\n size=\"sm\"\n icon=\"refresh\"\n :disabled=\"dir.running || !row.enabled\"\n :loading=\"busy === `${row.key}:${dir.directory}`\"\n :data-test=\"`run-${row.key}-${dir.directory}`\"\n @click=\"run(row, dir)\"\n >\n {{ t('carrier.run') }}\n </wx-button>\n </span>\n </div>\n </wx-card>\n </div>\n\n <carrier-dialog v-model:open=\"editorOpen\" :carrier=\"editing\" @saved=\"load\" />\n </wx-list-screen>\n</template>\n\n<style scoped>\n.wx-delivery-carriers {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-16);\n}\n\n.wx-delivery-carrier__head {\n display: inline-flex;\n align-items: center;\n gap: var(--wx-space-12);\n}\n\n.wx-delivery-carrier__queue {\n margin: 0 0 var(--wx-space-12);\n}\n\n.wx-delivery-carrier__missing {\n margin: 0 0 var(--wx-space-12);\n color: var(--wx-color-warning);\n}\n\n.wx-delivery-dir {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-8) var(--wx-space-16);\n padding: var(--wx-space-12) 0;\n border-top: 1px solid var(--wx-border-default);\n}\n\n.wx-delivery-dir__main {\n display: flex;\n flex: 1 1 280px;\n flex-direction: column;\n gap: var(--wx-space-4);\n min-width: 0;\n}\n\n.wx-delivery-dir__name {\n font-weight: var(--wx-font-weight-medium);\n}\n\n.wx-delivery-dir__facts,\n.wx-delivery-dir__remark {\n color: var(--wx-text-muted);\n font-size: var(--wx-font-size-sm);\n}\n\n.wx-delivery-dir__remark {\n color: var(--wx-color-warning);\n}\n\n.wx-delivery-dir__badges {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-6);\n}\n\n.wx-delivery-dir__badges:empty {\n display: none;\n}\n\n.wx-delivery-dir__actions {\n display: inline-flex;\n flex-wrap: wrap;\n gap: var(--wx-space-8);\n}\n</style>\n"],"names":["LABELS","props","__props","open","_useModel","emit","__emit","context","useAdmin","api","createDeliveryApi","t","useDeliveryWords","message","useErrorText","detail","ref","settings","typed","loading","saving","testing","errors","choices","asking","failures","refreshing","canManage","computed","fields","fromAccount","isFromAccount","keyed","one","field","label","locale","keyLabel","index","count","defaultOf","byName","name","blank","value","labels","stored","waitingFor","parent","dependsValues","blocked","optionsOf","list","ask","q","fresh","error","askAll","refresh","children","found","walk","choose","picked","nextLabels","child","timers","search","helpOf","missing","load","toast","watch","now","credentials","save","clear","values","key","test","result","statusType","_createBlock","_unref","WxDialog","$event","WxSkeleton","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_toDisplayString","WxButton","_createVNode","WxForm","_Fragment","WxFormItem","_hoisted_5","_hoisted_6","WxSelect","WxSwitch","WxInputNumber","WxInput","_hoisted_7","_hoisted_8","_hoisted_9","WxBadge","_createTextVNode","_hoisted_10","_hoisted_11","_hoisted_12","_renderList","run","WxDate","_hoisted_13","_hoisted_14","WxSpace","rows","busy","editing","editorOpen","title","module","toggle","row","on","directory","queued","confirmRemoval","remark","item","line","WxListScreen","WxCard","WxEmpty","RouterLink","_cache","dir","CarrierDialog"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { defineComponent as de, ref as p, useTemplateRef as Me, onMounted as Ae,
|
|
|
2
2
|
import { useRoute as Ke, useRouter as Fe } from "vue-router";
|
|
3
3
|
import { useModal as Ge, WxDialog as He, WxFormItem as A, WxInput as se, WxSpace as Je, WxButton as F, createModal as Qe, WxTable as Xe, WxBadge as ee, WxSelect as z, WxText as Ye, WxSkeleton as ue, WxEmpty as le, WxSortableList as ce, WxSwitch as Ze, WxAlert as el, toast as d, confirm as ae } from "@webx-ui/core";
|
|
4
4
|
import { useAdmin as ve, useErrorText as ye, rowMenuWidth as ll, WxListScreen as al, WxRowMenu as te } from "@webx-ui/module-admin";
|
|
5
|
-
import { c as me, u as ge, L as tl, _ as ol } from "./index-
|
|
5
|
+
import { c as me, u as ge, L as tl, _ as ol } from "./index-CAiJkqKq.js";
|
|
6
6
|
const nl = /* @__PURE__ */ de({
|
|
7
7
|
name: "WxDeliveryRegionDialog",
|
|
8
8
|
__name: "RegionDialog",
|
|
@@ -747,4 +747,4 @@ const nl = /* @__PURE__ */ de({
|
|
|
747
747
|
export {
|
|
748
748
|
$l as default
|
|
749
749
|
};
|
|
750
|
-
//# sourceMappingURL=GeographyPage-
|
|
750
|
+
//# sourceMappingURL=GeographyPage-BvhBUFBv.js.map
|