@webx-ui/module-delivery 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +58 -2
  3. package/dist/BindingsPage-DiVZys4B.js +280 -0
  4. package/dist/BindingsPage-DiVZys4B.js.map +1 -0
  5. package/dist/BindingsPage.d.ts +2 -0
  6. package/dist/CarrierDialog.d.ts +26 -0
  7. package/dist/CarriersPage-DlaIE-2K.js +650 -0
  8. package/dist/CarriersPage-DlaIE-2K.js.map +1 -0
  9. package/dist/CarriersPage.d.ts +2 -0
  10. package/dist/GeographyPage-T3vwSyud.js +750 -0
  11. package/dist/GeographyPage-T3vwSyud.js.map +1 -0
  12. package/dist/GeographyPage.d.ts +2 -0
  13. package/dist/LocalityDialog.d.ts +39 -0
  14. package/dist/LocalitySearch.d.ts +33 -0
  15. package/dist/MethodPane.d.ts +29 -0
  16. package/dist/MethodsPage-DrrRpjVY.js +415 -0
  17. package/dist/MethodsPage-DrrRpjVY.js.map +1 -0
  18. package/dist/MethodsPage.d.ts +2 -0
  19. package/dist/OrderChangeDialog.d.ts +7 -0
  20. package/dist/OrderDeliveryNode.d.ts +2 -0
  21. package/dist/PointDialog.d.ts +22 -0
  22. package/dist/PointsPage-C16GT-YH.js +336 -0
  23. package/dist/PointsPage-C16GT-YH.js.map +1 -0
  24. package/dist/PointsPage.d.ts +2 -0
  25. package/dist/PopularPage-BdE59dwB.js +141 -0
  26. package/dist/PopularPage-BdE59dwB.js.map +1 -0
  27. package/dist/PopularPage.d.ts +2 -0
  28. package/dist/RegionDialog.d.ts +11 -0
  29. package/dist/WaybillDialog.d.ts +8 -0
  30. package/dist/api.d.ts +151 -0
  31. package/dist/fields/CountryField.d.ts +14 -0
  32. package/dist/fields/LocalitiesField.d.ts +14 -0
  33. package/dist/fields/LocalityField.d.ts +16 -0
  34. package/dist/fields/PointKindField.d.ts +20 -0
  35. package/dist/fields/RegionField.d.ts +19 -0
  36. package/dist/fields/ScheduleField.d.ts +24 -0
  37. package/dist/i18n.d.ts +5 -0
  38. package/dist/index-CuhwaAcG.js +2540 -0
  39. package/dist/index-CuhwaAcG.js.map +1 -0
  40. package/dist/index.d.ts +6 -0
  41. package/dist/index.js +9 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/messages.d.ts +7 -0
  44. package/dist/module.d.ts +19 -0
  45. package/dist/style.css +1 -0
  46. package/dist/types.d.ts +467 -0
  47. package/package.json +64 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 webx-ui
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,59 @@
1
- # Temporary Holding Version
1
+ # @webx-ui/module-delivery
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The front end of the delivery section of the [WebX UI](https://github.com/webx-ui/webx-ui) admin
4
+ panel: the methods a shop offers in the checkout and their order, the shop's own pick-up points,
5
+ the carriers with their directories and keys, the shared geography kept by hand, the popular towns
6
+ of the checkout's dialog and the queue of a carrier's localities waiting to be bound.
7
+
8
+ The other half is the Composer package `webx-ui/module-delivery`, which owns the tables, the
9
+ registries of carriers and method types, the sync, the checkout's step and the API. A section
10
+ appears in the panel when both halves are installed.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm install @webx-ui/module-delivery
16
+ ```
17
+
18
+ ```ts
19
+ import { createAdmin } from '@webx-ui/module-admin'
20
+ import { delivery } from '@webx-ui/module-delivery'
21
+ import '@webx-ui/module-delivery/style.css'
22
+
23
+ createAdmin({
24
+ basePath: '/cms',
25
+ modules: [...delivery()],
26
+ }).mount()
27
+ ```
28
+
29
+ `delivery()` is **six** sections — **Methods**, **Own points**, **Carriers**, **Geography**,
30
+ **Popular towns** and **Binding queue** — in the menu group «Delivery», so it is spread into the
31
+ list. `delivery({ path: '/shipping' })` puts them somewhere else inside the panel.
32
+
33
+ ## Screens
34
+
35
+ The forms of a method, a point and a locality are described screens — `delivery.method-form`,
36
+ `delivery.point-form`, `delivery.locality-form` — so a project adds a field with a patch. The
37
+ fields only this section has come with the package and are registered in every screen of the
38
+ panel:
39
+
40
+ | Type | Value |
41
+ | ------------------------ | ---------------------------------------------- |
42
+ | `wx-delivery-locality` | a locality id; «Add a locality» when not found |
43
+ | `wx-delivery-localities` | locality ids, in the order chosen |
44
+ | `wx-delivery-region` | a region id of the country field beside it |
45
+ | `wx-delivery-country` | a country code of the site |
46
+ | `wx-delivery-schedule` | opening hours: the week and the exceptions |
47
+ | `wx-delivery-point-kind` | a method's kind of points; «New kind» under it |
48
+
49
+ `WxDeliveryLocalitySearch` and `WxDeliveryLocalityDialog` are exported for a screen of your own
50
+ that picks or makes a locality the same way.
51
+
52
+ ## Permissions
53
+
54
+ `delivery.view` reads every screen; `delivery.manage` writes them. The keys of a carrier are never
55
+ sent to the panel — only whether each one is set.
56
+
57
+ ## License
58
+
59
+ MIT
@@ -0,0 +1,280 @@
1
+ import { defineComponent as R, ref as r, computed as m, watch as G, openBlock as f, createBlock as E, unref as l, withCtx as t, createElementBlock as h, createElementVNode as W, toDisplayString as d, createVNode as s, createTextVNode as o, createCommentVNode as N, Fragment as H, renderList as J } from "vue";
2
+ import { useRoute as F } from "vue-router";
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
+ 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-CuhwaAcG.js";
6
+ const re = {
7
+ key: 0,
8
+ class: "wx-delivery-bindings__bar"
9
+ }, ue = { class: "wx-delivery-bindings__count" }, ce = { class: "wx-delivery-bindings__name" }, ve = { class: "wx-delivery-bindings__muted" }, ge = { class: "wx-delivery-bindings__muted" }, be = {
10
+ key: 0,
11
+ class: "wx-delivery-bindings__target"
12
+ }, pe = /* @__PURE__ */ R({
13
+ __name: "BindingsPage",
14
+ setup(me) {
15
+ const V = ae(), P = ie(V), a = se(), U = ne(), v = r(null), $ = r(!1), g = r(
16
+ typeof F().query.carrier == "string" ? String(F().query.carrier) : ""
17
+ ), b = r(""), u = r([]), p = r(!1), _ = r(!1), c = r(null), x = r(!1), D = m(() => V.can("delivery.manage")), q = m(
18
+ () => V.state.manifest?.modules.find((i) => i.id === "delivery-bindings")?.title ?? a("sections.bindings")
19
+ ), I = m(() => [
20
+ { key: "record", label: a("binding.record"), minWidth: 200 },
21
+ { key: "carrier", label: a("binding.carrier"), width: 140, hideBelow: 640 },
22
+ { key: "reason", label: a("binding.reason"), width: 160 },
23
+ { key: "candidates", label: a("binding.candidates"), minWidth: 220, hideBelow: 760 }
24
+ ]), O = m(() => [
25
+ { value: "", label: a("binding.any-carrier") },
26
+ ...(v.value?.filters.carriers ?? []).map((i) => ({
27
+ value: i.value,
28
+ label: `${i.label} (${i.count})`
29
+ }))
30
+ ]), j = m(() => [
31
+ { value: "", label: a("binding.any-reason") },
32
+ ...(v.value?.filters.reasons ?? []).map((i) => ({
33
+ value: i.value,
34
+ label: `${a(`binding.reasons.${i.value}`)} (${i.count})`
35
+ }))
36
+ ]);
37
+ let B = { page: 1, perPage: 25, sort: null, search: "" };
38
+ async function C(i = B) {
39
+ B = i, $.value = !0;
40
+ try {
41
+ v.value = await P.bindings({
42
+ page: i.page,
43
+ per_page: i.perPage,
44
+ carrier: g.value,
45
+ reason: b.value
46
+ });
47
+ } catch (n) {
48
+ y.danger(U(n));
49
+ } finally {
50
+ $.value = !1;
51
+ }
52
+ }
53
+ G([g, b], () => {
54
+ u.value = [], C({ ...B, page: 1 });
55
+ });
56
+ const k = m(() => x.value ? v.value?.total ?? 0 : u.value.length);
57
+ async function z(i, n) {
58
+ if (k.value === 0) {
59
+ y.info(a("errors.nothing_chosen"));
60
+ return;
61
+ }
62
+ p.value = !0;
63
+ try {
64
+ const e = await P.batch({
65
+ action: i,
66
+ ...x.value ? { all: !0, carrier: g.value, reason: b.value } : { ids: u.value.map(Number) },
67
+ ...n ? { locality_id: n.id } : {}
68
+ });
69
+ y.success(a("binding.done", { count: e.done })), e.failed.length > 0 && y.danger(a("binding.failed", { count: e.failed.length })), e.left > 0 && y.info(a("binding.left", { count: e.left })), u.value = [], _.value = !1, c.value = null, await C();
70
+ } catch (e) {
71
+ y.danger(U(e));
72
+ } finally {
73
+ p.value = !1;
74
+ }
75
+ }
76
+ function M(i) {
77
+ return i === null ? "" : a("binding.km", { distance: i.toFixed(1) });
78
+ }
79
+ return (i, n) => (f(), E(l(te), { title: q.value }, {
80
+ before: t(() => [
81
+ s(l(le), {
82
+ class: "wx-delivery-intro",
83
+ tone: "muted",
84
+ size: "sm"
85
+ }, {
86
+ default: t(() => [
87
+ o(d(l(a)("binding.intro")), 1)
88
+ ]),
89
+ _: 1
90
+ })
91
+ ]),
92
+ default: t(() => [
93
+ D.value ? (f(), h("div", re, [
94
+ W("span", ue, d(l(a)("binding.selected", { count: u.value.length })), 1),
95
+ s(l(K), {
96
+ modelValue: x.value,
97
+ "onUpdate:modelValue": n[0] || (n[0] = (e) => x.value = e),
98
+ "data-test": "whole-filter"
99
+ }, {
100
+ default: t(() => [
101
+ o(d(l(a)("binding.whole-filter", { count: v.value?.total ?? 0 })), 1)
102
+ ]),
103
+ _: 1
104
+ }, 8, ["modelValue"]),
105
+ s(l(T), {
106
+ size: "sm",
107
+ wrap: ""
108
+ }, {
109
+ default: t(() => [
110
+ s(l(w), {
111
+ size: "sm",
112
+ disabled: k.value === 0 || p.value,
113
+ onClick: n[1] || (n[1] = (e) => _.value = !0)
114
+ }, {
115
+ default: t(() => [
116
+ o(d(l(a)("binding.bind")), 1)
117
+ ]),
118
+ _: 1
119
+ }, 8, ["disabled"]),
120
+ s(l(w), {
121
+ size: "sm",
122
+ disabled: k.value === 0,
123
+ loading: p.value,
124
+ "data-test": "batch-create",
125
+ onClick: n[2] || (n[2] = (e) => z("create"))
126
+ }, {
127
+ default: t(() => [
128
+ o(d(l(a)("binding.create")), 1)
129
+ ]),
130
+ _: 1
131
+ }, 8, ["disabled", "loading"]),
132
+ s(l(w), {
133
+ size: "sm",
134
+ variant: "outline",
135
+ disabled: k.value === 0,
136
+ loading: p.value,
137
+ "data-test": "batch-ignore",
138
+ onClick: n[3] || (n[3] = (e) => z("ignore"))
139
+ }, {
140
+ default: t(() => [
141
+ o(d(l(a)("binding.ignore")), 1)
142
+ ]),
143
+ _: 1
144
+ }, 8, ["disabled", "loading"])
145
+ ]),
146
+ _: 1
147
+ })
148
+ ])) : N("", !0),
149
+ s(l(Q), {
150
+ selected: u.value,
151
+ "onUpdate:selected": n[6] || (n[6] = (e) => u.value = e),
152
+ data: v.value,
153
+ columns: I.value,
154
+ "row-key": "id",
155
+ selectable: D.value && !x.value,
156
+ flush: "",
157
+ loading: $.value,
158
+ "empty-text": l(a)("binding.empty"),
159
+ "filters-count": (g.value ? 1 : 0) + (b.value ? 1 : 0),
160
+ onStateChange: C
161
+ }, {
162
+ empty: t(() => [
163
+ s(l(Y), {
164
+ title: l(a)("binding.empty"),
165
+ description: l(a)("binding.empty-help")
166
+ }, null, 8, ["title", "description"])
167
+ ]),
168
+ filters: t(() => [
169
+ s(l(A), {
170
+ label: l(a)("binding.carrier")
171
+ }, {
172
+ default: t(() => [
173
+ s(l(L), {
174
+ modelValue: g.value,
175
+ "onUpdate:modelValue": n[4] || (n[4] = (e) => g.value = e),
176
+ options: O.value,
177
+ size: "sm"
178
+ }, null, 8, ["modelValue", "options"])
179
+ ]),
180
+ _: 1
181
+ }, 8, ["label"]),
182
+ s(l(A), {
183
+ label: l(a)("binding.reason")
184
+ }, {
185
+ default: t(() => [
186
+ s(l(L), {
187
+ modelValue: b.value,
188
+ "onUpdate:modelValue": n[5] || (n[5] = (e) => b.value = e),
189
+ options: j.value,
190
+ size: "sm"
191
+ }, null, 8, ["modelValue", "options"])
192
+ ]),
193
+ _: 1
194
+ }, 8, ["label"])
195
+ ]),
196
+ "cell-record": t(({ row: e }) => [
197
+ W("span", ce, d(e.record.name), 1),
198
+ W("span", ve, d([e.record.district, e.record.region, e.record.kind, e.external_id].filter(Boolean).join(" · ")), 1)
199
+ ]),
200
+ "cell-carrier": t(({ row: e }) => [
201
+ o(d(e.carrier_title), 1)
202
+ ]),
203
+ "cell-reason": t(({ row: e }) => [
204
+ e.reason ? (f(), E(l(X), {
205
+ key: 0,
206
+ type: "warning",
207
+ size: "sm"
208
+ }, {
209
+ default: t(() => [
210
+ o(d(l(a)(`binding.reasons.${e.reason}`)), 1)
211
+ ]),
212
+ _: 2
213
+ }, 1024)) : N("", !0)
214
+ ]),
215
+ "cell-candidates": t(({ row: e }) => [
216
+ (f(!0), h(H, null, J(e.candidates, (S) => (f(), h("span", {
217
+ key: S.id,
218
+ class: "wx-delivery-bindings__candidate"
219
+ }, [
220
+ o(d(S.label) + " ", 1),
221
+ W("span", ge, d(M(S.distance_km)), 1)
222
+ ]))), 128))
223
+ ]),
224
+ _: 1
225
+ }, 8, ["selected", "data", "columns", "selectable", "loading", "empty-text", "filters-count"]),
226
+ s(l(Z), {
227
+ open: _.value,
228
+ "onUpdate:open": n[10] || (n[10] = (e) => _.value = e),
229
+ title: l(a)("binding.bind-to"),
230
+ width: 520
231
+ }, {
232
+ footer: t(() => [
233
+ s(l(T), { size: "sm" }, {
234
+ default: t(() => [
235
+ s(l(w), {
236
+ variant: "outline",
237
+ onClick: n[8] || (n[8] = (e) => _.value = !1)
238
+ }, {
239
+ default: t(() => [
240
+ o(d(l(a)("common.cancel")), 1)
241
+ ]),
242
+ _: 1
243
+ }),
244
+ s(l(w), {
245
+ type: "primary",
246
+ disabled: !c.value,
247
+ loading: p.value,
248
+ onClick: n[9] || (n[9] = (e) => c.value && z("bind", c.value))
249
+ }, {
250
+ default: t(() => [
251
+ o(d(l(a)("binding.bind")), 1)
252
+ ]),
253
+ _: 1
254
+ }, 8, ["disabled", "loading"])
255
+ ]),
256
+ _: 1
257
+ })
258
+ ]),
259
+ default: t(() => [
260
+ s(l(ee), {
261
+ type: "info",
262
+ description: l(a)("binding.selected", { count: k.value })
263
+ }, null, 8, ["description"]),
264
+ s(de, {
265
+ class: "wx-delivery-bindings__search",
266
+ onPick: n[7] || (n[7] = (e) => c.value = e)
267
+ }),
268
+ c.value ? (f(), h("p", be, d(c.value.label), 1)) : N("", !0)
269
+ ]),
270
+ _: 1
271
+ }, 8, ["open", "title"])
272
+ ]),
273
+ _: 1
274
+ }, 8, ["title"]));
275
+ }
276
+ }), we = /* @__PURE__ */ oe(pe, [["__scopeId", "data-v-79abce24"]]);
277
+ export {
278
+ we as default
279
+ };
280
+ //# sourceMappingURL=BindingsPage-DiVZys4B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BindingsPage-DiVZys4B.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;;;;;;;;;"}
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * One carrier's settings and keys (§13.2), and its runs.
3
+ *
4
+ * A key is never sent to the panel: the dialog says whether each one is set, and an empty field
5
+ * means «leave it» — typing a new value replaces it, «Clear» removes it. «Check the connection»
6
+ * tries the stored keys with whatever is typed over them, without saving.
7
+ *
8
+ * A field with `options: 'carrier'` is a select whose options come from the carrier's account
9
+ * (`ProvidesSettingOptions`): it waits for the key and for the fields it `depends` on, a change
10
+ * empties the fields that depend on it, a `search` field asks as the admin types. The label of the
11
+ * chosen value is kept beside it (`_labels`), so the field shows it even when the carrier is down.
12
+ */
13
+ type __VLS_Props = {
14
+ carrier: string | null;
15
+ };
16
+ type __VLS_PublicProps = {
17
+ 'open'?: boolean;
18
+ } & __VLS_Props;
19
+ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
20
+ saved: () => any;
21
+ "update:open": (value: boolean) => any;
22
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
23
+ onSaved?: (() => any) | undefined;
24
+ "onUpdate:open"?: ((value: boolean) => any) | undefined;
25
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
26
+ export default _default;