@feedmepos/mf-menu-portal 1.0.4-dev.2 → 1.0.4-dev.4

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 (82) hide show
  1. package/dist/{App-DtX4DyDA.js → App-CrpoLCjA.js} +3 -3
  2. package/dist/{ApplyProduct.vue_vue_type_script_setup_true_lang-C9OSr8ft.js → ApplyProduct.vue_vue_type_script_setup_true_lang-Hdsnu29V.js} +1 -1
  3. package/dist/{BindingTable.vue_vue_type_script_setup_true_lang-BJN8ajuD.js → BindingTable.vue_vue_type_script_setup_true_lang-D3CmOOPY.js} +1 -1
  4. package/dist/{Catalog-Dly_r1yA.js → Catalog-VU3HhNro.js} +4 -4
  5. package/dist/{CatalogBinding-CNG4YcVq.js → CatalogBinding-BNATtZEY.js} +3 -3
  6. package/dist/{CatalogEditTabs.vue_vue_type_script_setup_true_lang-Cy2culdR.js → CatalogEditTabs.vue_vue_type_script_setup_true_lang-BmG-xpW4.js} +3 -3
  7. package/dist/CatalogEditor.vue_vue_type_script_setup_true_lang-BFsRDFpj.js +784 -0
  8. package/dist/{CatalogLinkProductAction.vue_vue_type_script_setup_true_lang-4EZ4yM_N.js → CatalogLinkProductAction.vue_vue_type_script_setup_true_lang-Bk4FqVmx.js} +14 -14
  9. package/dist/{Category-Dz1yFYyY.js → Category-DMoXTsfG.js} +5 -5
  10. package/dist/{Category-BS-vFDYy.js → Category-DxjdQ-NN.js} +2 -2
  11. package/dist/CategoryList.vue_vue_type_script_setup_true_lang-B3Ts1O-9.js +847 -0
  12. package/dist/{CookingGuide-CmbvWFgp.js → CookingGuide-DiZZDYD-.js} +5 -5
  13. package/dist/{Group-B7s-vPXb.js → Group-DFR8q-tt.js} +5 -5
  14. package/dist/{Group-BRmWZnHh.js → Group-rzfh_o6r.js} +2 -2
  15. package/dist/GroupList.vue_vue_type_script_setup_true_lang-DiN-wQXX.js +1807 -0
  16. package/dist/Ingredient-DpjGIuH9.js +505 -0
  17. package/dist/LinkProductSideSheet.vue_vue_type_script_setup_true_lang-CnI80Ojd.js +782 -0
  18. package/dist/{MenuSetting-Ci7V_Jxn.js → MenuSetting-DR-pDSF_.js} +4 -4
  19. package/dist/OrderPacing-JcTuweqF.js +769 -0
  20. package/dist/{OrderPacingFields.vue_vue_type_script_setup_true_lang-NCH-SrZU.js → OrderPacingFields.vue_vue_type_script_setup_true_lang-HwwJ2mGv.js} +2 -2
  21. package/dist/{Preview-BBGNaj1F.js → Preview-BZyun5lZ.js} +1 -1
  22. package/dist/{PriceTierNotice.vue_vue_type_script_setup_true_lang-BXJDpDCm.js → PriceTierNotice.vue_vue_type_script_setup_true_lang-DquqNbE1.js} +1 -1
  23. package/dist/PrintRoute-CzEx2dCt.js +518 -0
  24. package/dist/{Product-DqN0NFUU.js → Product-CQb0n06E.js} +4 -4
  25. package/dist/ProductAttributeFilter.vue_vue_type_script_setup_true_lang-B2KdolJS.js +7931 -0
  26. package/dist/{ProductEditorHost.vue_vue_type_script_setup_true_lang-Fkiw4lZp.js → ProductEditorHost.vue_vue_type_script_setup_true_lang-CBlDEjqF.js} +9 -9
  27. package/dist/ProductGroupCreateSheet.vue_vue_type_script_setup_true_lang-D8NQTCLx.js +2011 -0
  28. package/dist/{ProductImageEditorDialog.vue_vue_type_script_setup_true_lang-CNWCT1OB.js → ProductImageEditorDialog.vue_vue_type_script_setup_true_lang-cG47Pu-6.js} +1 -1
  29. package/dist/{ProductInlineCreateHost.vue_vue_type_script_setup_true_lang-BoQ9mVPY.js → ProductInlineCreateHost.vue_vue_type_script_setup_true_lang-0UwUcA2L.js} +800 -749
  30. package/dist/{ProductInternalTools-CC3SWSlT.js → ProductInternalTools-QrBR1nFp.js} +2 -2
  31. package/dist/{ProductInventoryDialog-SAhsVekx.js → ProductInventoryDialog-fV38GO1a.js} +1 -1
  32. package/dist/{ProductInventoryDialog.vue_vue_type_script_setup_true_lang-BB8UIIsW.js → ProductInventoryDialog.vue_vue_type_script_setup_true_lang-Bzb3RrMg.js} +1 -1
  33. package/dist/ProductList.vue_vue_type_script_setup_true_lang-BwKQESr3.js +2765 -0
  34. package/dist/{ProductVariantTranslationSheet.vue_vue_type_script_setup_true_lang-BMDSkfcn.js → ProductVariantTranslationSheet.vue_vue_type_script_setup_true_lang-CDYcHXo1.js} +1 -1
  35. package/dist/{Products-Cn6j1DOQ.js → Products-B8tysOAL.js} +3 -3
  36. package/dist/Publish-DTvOvFNa.js +1337 -0
  37. package/dist/Recipe-Ddx31csF.js +388 -0
  38. package/dist/{Scheduler-DlaSVACJ.js → Scheduler-CST5L_cw.js} +314 -254
  39. package/dist/ServingSequence-DYyEZI2S.js +374 -0
  40. package/dist/{Setting-CyCp2uw4.js → Setting-Ip0pGjks.js} +6 -6
  41. package/dist/Subcategory-BIgjzVta.js +459 -0
  42. package/dist/{Takeaway-sVVykWDg.js → Takeaway-CekhGM-m.js} +2 -2
  43. package/dist/{Takeaway-tYHCAXYU.js → Takeaway-aXsPg4JT.js} +5 -5
  44. package/dist/{TakeawayList.vue_vue_type_script_setup_true_lang-CV24v8Zg.js → TakeawayList.vue_vue_type_script_setup_true_lang-CaRR4_j3.js} +4 -4
  45. package/dist/TreeEditorOpenner.vue_vue_type_script_setup_true_lang-CshqYpc9.js +1291 -0
  46. package/dist/Unit-BMW8u0Us.js +424 -0
  47. package/dist/{Variant-BNnR5rLv.js → Variant-CZsrYRMU.js} +5 -5
  48. package/dist/{_id_-a9ZtdjtT.js → _id_-D4swrvNa.js} +3 -3
  49. package/dist/{app-CmElp8cO.js → app-BWwwHsWi.js} +337 -337
  50. package/dist/app.js +1 -1
  51. package/dist/apps/mf-menu/src/app.d.ts +80 -0
  52. package/dist/apps/mf-menu/src/components/PriceTier/LinkPriceTierSection.vue.d.ts +9 -0
  53. package/dist/apps/mf-menu/src/components/Product/BulkCategorySelect.vue.d.ts +37 -0
  54. package/dist/apps/mf-menu/src/components/Product/ProductAttributeFilter.vue.d.ts +11 -1
  55. package/dist/apps/mf-menu/src/components/ProductList.vue.d.ts +2 -2
  56. package/dist/apps/mf-menu/src/components/feature/NestedGroupManager/NestedGroupOverrideSheets.vue.d.ts +27 -0
  57. package/dist/apps/mf-menu/src/components/feature/RestaurantAttributesFilter.vue.d.ts +20 -0
  58. package/dist/apps/mf-menu/tsconfig.app.tsbuildinfo +1 -1
  59. package/dist/assets/{menu-compute-B_wpWLAj.js → menu-compute-D7TdiHt4.js} +4 -4
  60. package/dist/assets/{validate-menu-DjxNxUxH.js → validate-menu-DXppWUVq.js} +2 -2
  61. package/dist/mf-menu-portal.css +1 -1
  62. package/dist/{provide-BJRbSauL.js → provide-CDmXzkhz.js} +67539 -65978
  63. package/dist/{useActionFeedback-89GwO41T.js → useActionFeedback-Dm2HDa_2.js} +1 -1
  64. package/dist/{FormSection.vue_vue_type_script_setup_true_lang-pY-_msnM.js → vuedraggable-CBtQLb_S.js} +140 -139
  65. package/package.json +2 -2
  66. package/dist/CatalogEditor.vue_vue_type_script_setup_true_lang-Byp1db9_.js +0 -484
  67. package/dist/CategoryList.vue_vue_type_script_setup_true_lang-CrHYjrTn.js +0 -797
  68. package/dist/GroupList.vue_vue_type_script_setup_true_lang-CWr52_a-.js +0 -2183
  69. package/dist/Ingredient-BMAlctE4.js +0 -463
  70. package/dist/LinkProductSideSheet.vue_vue_type_script_setup_true_lang-CR99740r.js +0 -709
  71. package/dist/OrderPacing-Bz5kn6DY.js +0 -698
  72. package/dist/PrintRoute-BnARWdR2.js +0 -473
  73. package/dist/ProductChipSummary.vue_vue_type_script_setup_true_lang-D8DygCBl.js +0 -110
  74. package/dist/ProductGroupCreateSheet.vue_vue_type_script_setup_true_lang-DryxrG-x.js +0 -1257
  75. package/dist/ProductList.vue_vue_type_script_setup_true_lang-BDnTs366.js +0 -10353
  76. package/dist/Publish-BPJhG39B.js +0 -1261
  77. package/dist/Recipe-mt1vec5-.js +0 -350
  78. package/dist/ServingSequence-Cr1REWZP.js +0 -336
  79. package/dist/Subcategory-kuB7gYvc.js +0 -412
  80. package/dist/TreeEditorOpenner.vue_vue_type_script_setup_true_lang-Dz-Chgek.js +0 -1213
  81. package/dist/Unit-BSOvZxRy.js +0 -385
  82. package/dist/apps/mf-menu/src/views/MenuManagementEditor/RestaurantAttributesFilter.vue.d.ts +0 -2
@@ -1,350 +0,0 @@
1
- import { defineComponent as W, computed as d, ref as U, shallowRef as G, h as ge, withModifiers as be, onUnmounted as fe, resolveComponent as g, openBlock as m, createBlock as F, unref as a, withCtx as f, createElementBlock as B, toDisplayString as $, Fragment as ye, createElementVNode as y, withDirectives as ke, createVNode as r, createCommentVNode as I, mergeProps as _e } from "vue";
2
- import { useI18n as we } from "@feedmepos/mf-common";
3
- import { useDialog as he, components as H, FmButtonVariant as Fe } from "@feedmepos/ui-library";
4
- import { _ as xe } from "./index.vue_vue_type_script_setup_true_lang-CGPDazqs.js";
5
- import { _ as Ce } from "./BindingLinkDialog.vue_vue_type_script_setup_true_lang-BZVQRyRI.js";
6
- import { _ as J } from "./BindingTable.vue_vue_type_script_setup_true_lang-BJN8ajuD.js";
7
- import { _ as Be } from "./PageLayout.vue_vue_type_script_setup_true_lang-B3szUH39.js";
8
- import { _ as Se } from "./ListCountTag.vue_vue_type_script_setup_true_lang-0bjk8Aly.js";
9
- import { u as Ve } from "./useActionFeedback-89GwO41T.js";
10
- import { u as Ae } from "./useEditorValidation-Ctef5Bxt.js";
11
- import { b as Ue, u as $e, a as Ie } from "./provide-BJRbSauL.js";
12
- const Me = {
13
- key: 0,
14
- class: "flex-1 flex justify-between gap-8 pl-8"
15
- }, De = {
16
- key: 0,
17
- role: "alert",
18
- class: "text-fm-color-typo-secondary"
19
- }, Ee = {
20
- key: 1,
21
- class: "text-fm-color-typo-secondary"
22
- }, Te = { class: "flex justify-end items-center" }, qe = { class: "w-[320px]" }, Ne = { class: "fm-typo-en-title-md-600" }, Re = { class: "pt-8 space-y-40" }, ze = { class: "flex flex-row gap-16" }, Le = { class: "flex gap-8 items-center justify-start" }, je = /* @__PURE__ */ W({
23
- __name: "RecipeList",
24
- props: {
25
- sdk: {}
26
- },
27
- setup(M) {
28
- const v = M, D = {
29
- mounted: (e, t) => {
30
- var o;
31
- return (o = e.querySelector("input")) == null ? void 0 : o.setAttribute("aria-label", t.value);
32
- },
33
- updated: (e, t) => {
34
- var o;
35
- return (o = e.querySelector("input")) == null ? void 0 : o.setAttribute("aria-label", t.value);
36
- }
37
- }, { t: n } = we(), x = Ue(), X = he(), { run: E } = Ve(), c = $e(v.sdk.recipe.list), u = d(
38
- () => c.value.status === "ready" ? c.value.value : null
39
- ), Y = d(() => {
40
- var e;
41
- return ((e = u.value) == null ? void 0 : e.query) ?? "";
42
- }), Z = d(() => {
43
- var e;
44
- return [...((e = u.value) == null ? void 0 : e.rows) ?? []];
45
- }), b = U(!1), S = U(!1), C = U("recipe"), l = G(
46
- v.sdk.recipe.editor()
47
- ), k = G(
48
- l.value.get()
49
- );
50
- let V = l.value.subscribe(
51
- (e) => {
52
- k.value = e;
53
- }
54
- );
55
- const i = d(
56
- () => k.value.status === "ready" ? k.value.value : null
57
- ), p = Ae(() => l.value), T = d(
58
- () => i.value ? p.issue(i.value.fieldIssues, "name") ?? i.value.nameIssue : null
59
- ), q = d(
60
- () => i.value ? p.issue(i.value.fieldIssues, "contains") ?? i.value.containsIssue : null
61
- );
62
- function N(e) {
63
- var o;
64
- const t = ((o = i.value) == null ? void 0 : o.fieldIssues) ?? {};
65
- return (e ?? []).map((_) => ({
66
- ..._,
67
- amountIssue: p.issue(t, `amount:${_.id}`) ?? _.amountIssue
68
- }));
69
- }
70
- function R(e, t) {
71
- p.field(
72
- `amount:${e}`,
73
- (o) => l.value.setBindingAmount(e, o)
74
- )["onUpdate:modelValue"](t);
75
- }
76
- function z(e) {
77
- V(), l.value.dispose(), l.value = v.sdk.recipe.editor(e), k.value = l.value.get(), V = l.value.subscribe(
78
- (t) => {
79
- k.value = t;
80
- }
81
- );
82
- }
83
- function L() {
84
- var e;
85
- ((e = u.value) == null ? void 0 : e.create.state) === "allowed" && (z(), b.value = !0);
86
- }
87
- function ee(e) {
88
- z(e.id), b.value = !0;
89
- }
90
- async function te() {
91
- (await E(
92
- () => p.submit(() => l.value.submit()),
93
- {
94
- showLoading: () => {
95
- var t;
96
- return ((t = i.value) == null ? void 0 : t.status) === "submitting";
97
- },
98
- successMessage: (t) => n("menu.recipe.form.saved", { name: t.name })
99
- }
100
- )).kind === "success" && (b.value = !1);
101
- }
102
- function ne() {
103
- }
104
- function ae(e) {
105
- e.remove.state === "allowed" && X.open({
106
- title: n("menu.common.dialog.remove.recipe.title"),
107
- message: n("menu.common.dialog.remove.recipe.message", {
108
- name: e.name
109
- }),
110
- primaryActions: {
111
- text: n("menu.common.actions.remove"),
112
- close: !0,
113
- variant: Fe.Destructive
114
- },
115
- secondaryActions: {
116
- text: n("menu.common.actions.cancel"),
117
- close: !0
118
- }
119
- }).onPrimary(async () => {
120
- await E(() => v.sdk.recipe.remove(e.id), {
121
- successMessage: n("menu.recipe.form.removed", { name: e.name })
122
- });
123
- });
124
- }
125
- function ie(e) {
126
- const t = e.targetName ?? n("menu.recipe.table.ingredient.missing");
127
- return e.kind === "recipe" ? n("menu.recipe.table.ingredient.recipe", {
128
- name: t,
129
- amount: e.amount
130
- }) : n("menu.recipe.table.ingredient.sku", {
131
- name: t,
132
- amount: e.amount,
133
- unit: e.unitSymbol ?? n("menu.recipe.table.ingredient.missing")
134
- });
135
- }
136
- function se(e) {
137
- return e.map(ie).join(n("menu.recipe.table.ingredient.separator"));
138
- }
139
- const le = d(() => [
140
- {
141
- accessorKey: "name",
142
- header: () => n("menu.recipe.table.columns.name"),
143
- enableSorting: !1
144
- },
145
- {
146
- accessorKey: "ingredients",
147
- header: () => n("menu.recipe.table.columns.ingredients"),
148
- enableSorting: !1,
149
- cell: (e) => se(e.row.original.ingredients)
150
- },
151
- {
152
- id: "actions",
153
- size: 52,
154
- meta: { cellClass: "pl-16", headerContentClass: "-mx-16" },
155
- header: "",
156
- cell: (e) => ge(H.FmButton, {
157
- icon: "delete",
158
- variant: "tertiary",
159
- textColor: "neutral-gray-400",
160
- disabled: e.row.original.remove.state !== "allowed",
161
- "aria-label": n("menu.recipe.table.delete.accessibility_label", {
162
- name: e.row.original.name
163
- }),
164
- onClick: be(
165
- () => ae(e.row.original),
166
- ["stop", "prevent"]
167
- )
168
- })
169
- }
170
- ]), j = d(
171
- () => {
172
- var e;
173
- return ((e = i.value) == null ? void 0 : e.submit.state) !== "allowed";
174
- }
175
- ), oe = d(
176
- () => {
177
- var e, t;
178
- return C.value === "recipe" ? ((e = i.value) == null ? void 0 : e.recipeCandidates) ?? [] : ((t = i.value) == null ? void 0 : t.ingredientCandidates) ?? [];
179
- }
180
- ), ue = d(
181
- () => n("menu.inventory.binding.link.title", {
182
- type: C.value === "recipe" ? n("menu.inventory.binding.link.recipe") : n("menu.inventory.binding.link.ingredient")
183
- })
184
- );
185
- function P(e) {
186
- C.value = e, l.value.setBindingCandidateQuery(""), S.value = !0;
187
- }
188
- return fe(() => {
189
- V(), l.value.dispose();
190
- }), (e, t) => {
191
- const o = g("FmButton"), _ = g("FmCircularProgress"), re = g("FmSearch"), de = g("FmTable"), me = g("FmTextField"), ce = g("FmFormGroup"), pe = g("FmSideSheet");
192
- return m(), F(Be, {
193
- "data-visual-root": "recipe",
194
- heading: a(n)("menu.recipe.title")
195
- }, {
196
- "append-heading": f(() => [
197
- a(c).status === "ready" && u.value ? (m(), B("div", Me, [
198
- r(Se, {
199
- value: u.value.totalCount
200
- }, null, 8, ["value"]),
201
- u.value.totalCount > 0 ? (m(), F(o, {
202
- key: 0,
203
- disabled: u.value.create.state !== "allowed",
204
- label: a(n)("menu.recipe.actions.add"),
205
- "prepend-icon": "add",
206
- onClick: L
207
- }, null, 8, ["disabled", "label"])) : I("", !0)
208
- ])) : I("", !0)
209
- ]),
210
- default: f(() => {
211
- var Q;
212
- return [
213
- a(c).status === "error" ? (m(), B("p", De, $(a(x)(a(c).error.message)), 1)) : a(c).status === "unavailable" ? (m(), B("p", Ee, $(a(x)(a(c).reason)), 1)) : a(c).status === "loading" ? (m(), F(_, { key: 2 })) : u.value && u.value.totalCount === 0 ? (m(), F(a(xe), {
214
- key: 3,
215
- action: { text: a(n)("menu.recipe.empty.action"), callback: L },
216
- title: a(n)("menu.recipe.empty.title"),
217
- subtitle: a(n)("menu.recipe.empty.subtitle")
218
- }, null, 8, ["action", "title", "subtitle"])) : u.value ? (m(), B(ye, { key: 4 }, [
219
- y("div", Te, [
220
- y("div", qe, [
221
- ke(r(re, {
222
- autofocus: "",
223
- "aria-label": a(n)("menu.recipe.table.search.accessibility_label"),
224
- class: "mb-8",
225
- "model-value": Y.value,
226
- placeholder: a(n)("menu.recipe.table.search.placeholder"),
227
- "onUpdate:modelValue": v.sdk.recipe.search
228
- }, null, 8, ["aria-label", "model-value", "placeholder", "onUpdate:modelValue"]), [
229
- [D, a(n)("menu.recipe.table.search.accessibility_label")]
230
- ])
231
- ])
232
- ]),
233
- r(de, {
234
- "column-defs": le.value,
235
- "hide-footer": "",
236
- "page-size": Math.max(u.value.rows.length, 1),
237
- "pin-header-row": "",
238
- "row-data": Z.value,
239
- "shrink-at": !1,
240
- onRowClick: t[0] || (t[0] = (s) => ee(s.original))
241
- }, null, 8, ["column-defs", "page-size", "row-data"])
242
- ], 64)) : I("", !0),
243
- r(pe, {
244
- modelValue: b.value,
245
- "onUpdate:modelValue": t[6] || (t[6] = (s) => b.value = s),
246
- "is-container": a(H).FmForm,
247
- "is-container-props": { onValidationSuccess: te },
248
- "max-width": 560,
249
- "onOn:clickedAway": ne
250
- }, {
251
- "side-sheet-header": f(() => {
252
- var s;
253
- return [
254
- y("p", Ne, $(((s = i.value) == null ? void 0 : s.mode) === "update" ? a(n)("menu.recipe.update") : a(n)("menu.recipe.add")), 1)
255
- ];
256
- }),
257
- "side-sheet-footer": f(() => {
258
- var s, w;
259
- return [
260
- y("div", Le, [
261
- r(o, {
262
- disabled: ((s = i.value) == null ? void 0 : s.submit.state) !== "allowed",
263
- label: ((w = i.value) == null ? void 0 : w.mode) === "update" ? a(n)("menu.common.actions.update") : a(n)("menu.common.actions.add"),
264
- size: "lg",
265
- type: "submit",
266
- variant: "primary"
267
- }, null, 8, ["disabled", "label"]),
268
- r(o, {
269
- label: a(n)("menu.common.actions.cancel"),
270
- size: "lg",
271
- variant: "tertiary",
272
- onClick: t[5] || (t[5] = (A) => b.value = !1)
273
- }, null, 8, ["label"])
274
- ])
275
- ];
276
- }),
277
- default: f(() => {
278
- var s, w, A;
279
- return [
280
- y("div", Re, [
281
- y("div", ze, [
282
- r(me, _e({
283
- autofocus: "",
284
- class: "flex-2",
285
- "error-messages": T.value ? [a(x)(T.value)] : [],
286
- label: a(n)("menu.recipe.columns.name"),
287
- "model-value": ((s = i.value) == null ? void 0 : s.name) ?? ""
288
- }, a(p).field("name", l.value.setName)), null, 16, ["error-messages", "label", "model-value"])
289
- ]),
290
- r(ce, {
291
- "model-value": [
292
- ...((w = i.value) == null ? void 0 : w.recipeBindings) ?? [],
293
- ...((A = i.value) == null ? void 0 : A.ingredientBindings) ?? []
294
- ],
295
- "error-messages": q.value ? [a(x)(q.value)] : []
296
- }, {
297
- default: f(() => {
298
- var K, O;
299
- return [
300
- r(J, {
301
- kind: "recipe",
302
- disabled: j.value,
303
- rows: N((K = i.value) == null ? void 0 : K.recipeBindings),
304
- onLink: t[1] || (t[1] = (h) => P("recipe")),
305
- onUpdateAmount: R
306
- }, null, 8, ["disabled", "rows"]),
307
- r(J, {
308
- kind: "ingredient",
309
- disabled: j.value,
310
- rows: N((O = i.value) == null ? void 0 : O.ingredientBindings),
311
- "show-inert-deduct": "",
312
- onLink: t[2] || (t[2] = (h) => P("ingredient")),
313
- onRemove: t[3] || (t[3] = (h) => (a(p).touch("contains"), l.value.removeIngredientBinding(h))),
314
- onUpdateAmount: R,
315
- onUpdateMeasurement: t[4] || (t[4] = (h, ve) => l.value.setBindingMeasurement(h, ve))
316
- }, null, 8, ["disabled", "rows"])
317
- ];
318
- }),
319
- _: 1
320
- }, 8, ["model-value", "error-messages"])
321
- ])
322
- ];
323
- }),
324
- _: 1
325
- }, 8, ["modelValue", "is-container", "is-container-props"]),
326
- r(Ce, {
327
- modelValue: S.value,
328
- "onUpdate:modelValue": t[7] || (t[7] = (s) => S.value = s),
329
- candidates: oe.value,
330
- query: ((Q = i.value) == null ? void 0 : Q.bindingCandidateQuery) ?? "",
331
- title: ue.value,
332
- "onUpdate:query": t[8] || (t[8] = (s) => l.value.setBindingCandidateQuery(s)),
333
- onSubmit: t[9] || (t[9] = (s) => (a(p).touch("contains"), l.value.linkBindings(C.value, s)))
334
- }, null, 8, ["modelValue", "candidates", "query", "title"])
335
- ];
336
- }),
337
- _: 1
338
- }, 8, ["heading"]);
339
- };
340
- }
341
- }), et = /* @__PURE__ */ W({
342
- __name: "Recipe",
343
- setup(M) {
344
- const v = Ie();
345
- return (D, n) => (m(), F(je, { sdk: a(v) }, null, 8, ["sdk"]));
346
- }
347
- });
348
- export {
349
- et as default
350
- };
@@ -1,336 +0,0 @@
1
- import { defineComponent as A, computed as i, ref as ne, shallowRef as N, h as B, withModifiers as oe, onUnmounted as le, resolveComponent as _, openBlock as m, createBlock as k, unref as t, withCtx as b, createElementBlock as F, toDisplayString as K, Fragment as ue, createElementVNode as h, createVNode as v, createCommentVNode as x, mergeProps as ie } from "vue";
2
- import { useI18n as re, ItemSelector as ce } from "@feedmepos/mf-common";
3
- import { useDialog as de, components as U, FmButtonVariant as me } from "@feedmepos/ui-library";
4
- import { _ as ve } from "./index.vue_vue_type_script_setup_true_lang-CGPDazqs.js";
5
- import { _ as pe } from "./PageLayout.vue_vue_type_script_setup_true_lang-B3szUH39.js";
6
- import { u as ge } from "./useActionFeedback-89GwO41T.js";
7
- import { u as _e } from "./useEditorValidation-Ctef5Bxt.js";
8
- import { b as fe, u as j, a as be } from "./provide-BJRbSauL.js";
9
- const he = {
10
- key: 0,
11
- class: "flex-1 flex justify-end gap-8 pl-8"
12
- }, ke = {
13
- key: 0,
14
- role: "alert",
15
- class: "text-fm-color-typo-secondary"
16
- }, ye = { class: "flex justify-end items-center" }, qe = { class: "w-[320px]" }, Se = { class: "fm-typo-en-title-md-600" }, we = { class: "space-y-32 flex flex-col h-full" }, Fe = { class: "flex gap-8 items-center justify-start" }, xe = /* @__PURE__ */ A({
17
- __name: "ServingSequenceList",
18
- props: {
19
- sdk: {}
20
- },
21
- setup(C) {
22
- const r = C, { t: a } = re(), y = fe(), P = de(), { run: q } = ge(), p = j(
23
- r.sdk.servingSequence.list
24
- ), o = i(
25
- () => p.value.status === "ready" ? p.value.value : null
26
- ), I = i(() => {
27
- var e;
28
- return ((e = o.value) == null ? void 0 : e.query) ?? "";
29
- }), T = i(() => {
30
- var e;
31
- return [...((e = o.value) == null ? void 0 : e.rows) ?? []];
32
- }), g = ne(!1), V = j(
33
- r.sdk.linkProduct.catalogue
34
- ), L = i(
35
- () => V.value.status === "ready" ? V.value.value : null
36
- ), R = i(
37
- () => {
38
- var e;
39
- return (((e = L.value) == null ? void 0 : e.groups) ?? []).map((s) => ({
40
- id: s.id,
41
- name: s.name,
42
- items: s.products.map((n) => ({
43
- _id: n.id,
44
- name: n.name,
45
- code: n.code,
46
- codeName: n.label,
47
- // The selector builds its attribute filter from these and filters the
48
- // product list by them; omitting them renders the filter with empty
49
- // value sets. Legacy reaches them by spreading the whole item
50
- // (portal apps/mf-menu/src/helper/menu.ts:257-261).
51
- customAttributes: n.customAttributes ?? void 0,
52
- variant: {
53
- variantGroupIds: [...n.variantGroupIds],
54
- variantCombinations: n.variants.map((d) => ({
55
- _id: n.id,
56
- combinationKey: d.combinationKey,
57
- codeName: d.label
58
- }))
59
- }
60
- }))
61
- }));
62
- }
63
- ), $ = [], O = i(
64
- () => {
65
- var e;
66
- return ((e = c.value) == null ? void 0 : e.linkedItems) ?? $;
67
- }
68
- ), G = i(
69
- () => {
70
- const e = {};
71
- for (const s of O.value)
72
- e[s._id] = [...e[s._id] ?? [], s];
73
- return e;
74
- }
75
- );
76
- function Q(e) {
77
- u.value.setLinkedItems(
78
- Object.values(e).flat().map((s) => ({
79
- _id: s._id,
80
- combinationKey: s.combinationKey ?? null,
81
- orderFrom: s.orderFrom ?? null
82
- }))
83
- );
84
- }
85
- const u = N(
86
- r.sdk.servingSequence.editor()
87
- ), f = N(
88
- u.value.get()
89
- );
90
- let S = u.value.subscribe((e) => {
91
- f.value = e;
92
- });
93
- const c = i(
94
- () => f.value.status === "ready" ? f.value.value : null
95
- ), w = _e(() => u.value), z = i(
96
- () => c.value ? w.issue(c.value.fieldIssues, "name") ?? c.value.nameIssue : null
97
- );
98
- function D(e) {
99
- S(), u.value.dispose(), u.value = r.sdk.servingSequence.editor(e), f.value = u.value.get(), S = u.value.subscribe((s) => {
100
- f.value = s;
101
- });
102
- }
103
- function E() {
104
- var e;
105
- ((e = o.value) == null ? void 0 : e.create.state) === "allowed" && (D(), g.value = !0);
106
- }
107
- function H(e) {
108
- D(e.id), g.value = !0;
109
- }
110
- async function J() {
111
- var n;
112
- const e = ((n = c.value) == null ? void 0 : n.name.trim()) ?? "";
113
- (await q(
114
- () => w.submit(() => u.value.submit()),
115
- {
116
- showLoading: () => {
117
- var d;
118
- return ((d = c.value) == null ? void 0 : d.status) === "submitting";
119
- },
120
- successMessage: a("menu.serving_sequence.form.saved", {
121
- name: e || a("menu.serving_sequence.title")
122
- })
123
- }
124
- )).kind === "success" && (g.value = !1);
125
- }
126
- function W(e) {
127
- e.remove.state === "allowed" && P.open({
128
- title: a("menu.serving_sequence.delete.title"),
129
- message: a("menu.serving_sequence.delete.message", {
130
- name: e.name
131
- }),
132
- primaryActions: {
133
- text: a("menu.serving_sequence.delete.confirm"),
134
- close: !0,
135
- variant: me.Destructive
136
- },
137
- secondaryActions: {
138
- text: a("menu.common.actions.cancel"),
139
- close: !0
140
- }
141
- }).onPrimary(async () => {
142
- await q(() => r.sdk.servingSequence.remove(e.id), {
143
- successMessage: a("menu.serving_sequence.delete.success", {
144
- name: e.name
145
- })
146
- });
147
- });
148
- }
149
- const X = i(() => {
150
- var e;
151
- return ((e = o.value) == null ? void 0 : e.reorder.state) === "allowed";
152
- });
153
- function Y(e) {
154
- var n;
155
- if (((n = o.value) == null ? void 0 : n.reorder.state) !== "allowed") return;
156
- const s = e.map((d) => d.id);
157
- s.length && q(() => r.sdk.servingSequence.reorder(s), {
158
- // The only one of this module's success messages that takes no entity
159
- // `{name}`: legacy fed the shared `{name} saved` template the module's own
160
- // plural noun for a rearrange, so the toast reads "sequences saved" rather
161
- // than naming a row — the frozen baseline records exactly that text
162
- // (serveSequence/rearrange/submit/success). Feeding it
163
- // `menu.serving_sequence.title` produced "Serving sequence saved" instead,
164
- // which parity caught on 2026-08-28 with a delta that was already equal.
165
- // Each locale carries the whole sentence, as category does for the same
166
- // reason: the word order of "{name} saved" does not survive translation.
167
- successMessage: a("menu.serving_sequence.reorder.success")
168
- });
169
- }
170
- const Z = i(() => [
171
- {
172
- accessorKey: "name",
173
- header: () => a("menu.serving_sequence.columns.name"),
174
- enableSorting: !1,
175
- // Legacy fixes the name column at 360px (`ServingSequence.vue:151-156`),
176
- // which sets where the Product-linked column starts. Omitting it let
177
- // FmTable distribute the width instead, and the two tables then differ by
178
- // the position of every cell in the second column — invisible until the
179
- // populated-table golden is compared.
180
- size: 360
181
- },
182
- {
183
- accessorKey: "linkedItemCount",
184
- header: () => a("menu.serving_sequence.columns.products"),
185
- enableSorting: !1,
186
- cell: (e) => a("menu.common.labels.items_linked", {
187
- count: e.row.original.linkedItemCount
188
- })
189
- },
190
- {
191
- id: "actions",
192
- size: 52,
193
- meta: { cellClass: "pl-16", headerContentClass: "-mx-16" },
194
- header: "",
195
- // Legacy wraps the button in a right-aligning flex row and renders the
196
- // glyph as `prependIcon` rather than `icon` — two different FmButton
197
- // renderings, and the wrapper is what pushes the control to the cell's
198
- // right edge (`ServingSequence.vue:176-192`). Both are reproduced; the
199
- // accessible name is the one deliberate addition, owned by the new app
200
- // (legacy's control is icon-only and unnamed).
201
- cell: (e) => B("div", { class: "w-full flex justify-end items-center" }, [
202
- B(U.FmButton, {
203
- prependIcon: "delete",
204
- variant: "tertiary",
205
- textColor: "neutral-gray-400",
206
- disabled: e.row.original.remove.state !== "allowed",
207
- "aria-label": a("menu.common.actions.delete"),
208
- onClick: oe(
209
- () => W(e.row.original),
210
- ["stop", "prevent"]
211
- )
212
- })
213
- ])
214
- }
215
- ]);
216
- return le(() => {
217
- S(), u.value.dispose(), r.sdk.servingSequence.search("");
218
- }), (e, s) => {
219
- const n = _("FmButton"), d = _("FmCircularProgress"), ee = _("FmSearch"), ae = _("FmTable"), se = _("FmTextField"), te = _("FmSideSheet");
220
- return m(), k(pe, {
221
- "data-visual-root": "serveSequence",
222
- heading: t(a)("menu.serving_sequence.title")
223
- }, {
224
- "append-heading": b(() => [
225
- t(p).status === "ready" && o.value ? (m(), F("div", he, [
226
- o.value.totalCount > 0 ? (m(), k(n, {
227
- key: 0,
228
- disabled: o.value.create.state !== "allowed",
229
- label: t(a)("menu.serving_sequence.add"),
230
- "prepend-icon": "add",
231
- onClick: E
232
- }, null, 8, ["disabled", "label"])) : x("", !0)
233
- ])) : x("", !0)
234
- ]),
235
- default: b(() => [
236
- t(p).status === "error" ? (m(), F("p", ke, K(t(y)(t(p).error.message)), 1)) : t(p).status === "loading" ? (m(), k(d, { key: 1 })) : o.value && o.value.rows.length === 0 && !I.value ? (m(), k(t(ve), {
237
- key: 2,
238
- action: { text: t(a)("menu.serving_sequence.add"), callback: E },
239
- title: t(a)("menu.serving_sequence.empty.title"),
240
- subtitle: t(a)("menu.serving_sequence.empty.subtitle")
241
- }, null, 8, ["action", "title", "subtitle"])) : o.value ? (m(), F(ue, { key: 3 }, [
242
- h("div", ye, [
243
- h("div", qe, [
244
- v(ee, {
245
- autofocus: "",
246
- class: "mb-8",
247
- "model-value": I.value,
248
- placeholder: t(a)("menu.serving_sequence.search.placeholder"),
249
- "onUpdate:modelValue": r.sdk.servingSequence.search
250
- }, null, 8, ["model-value", "placeholder", "onUpdate:modelValue"])
251
- ])
252
- ]),
253
- v(ae, {
254
- "column-defs": Z.value,
255
- "hide-footer": "",
256
- "page-size": o.value.rows.length,
257
- "pin-header-row": "",
258
- "row-data": T.value,
259
- "shrink-at": !1,
260
- draggable: X.value,
261
- onRowClick: s[0] || (s[0] = (l) => H(l.original)),
262
- onDndChanged: Y
263
- }, null, 8, ["column-defs", "page-size", "row-data", "draggable"])
264
- ], 64)) : x("", !0),
265
- v(te, {
266
- modelValue: g.value,
267
- "onUpdate:modelValue": s[2] || (s[2] = (l) => g.value = l),
268
- "is-container": t(U).FmForm,
269
- "is-container-props": { onValidationSuccess: J },
270
- "max-width": 560
271
- }, {
272
- "side-sheet-header": b(() => {
273
- var l;
274
- return [
275
- h("p", Se, K(((l = c.value) == null ? void 0 : l.mode) === "update" ? t(a)("menu.serving_sequence.update") : t(a)("menu.serving_sequence.add")), 1)
276
- ];
277
- }),
278
- "side-sheet-footer": b(() => {
279
- var l, M;
280
- return [
281
- h("div", Fe, [
282
- v(n, {
283
- disabled: ((l = c.value) == null ? void 0 : l.submit.state) !== "allowed",
284
- label: ((M = c.value) == null ? void 0 : M.mode) === "update" ? t(a)("menu.serving_sequence.update") : t(a)("menu.serving_sequence.add"),
285
- size: "lg",
286
- type: "submit",
287
- variant: "primary"
288
- }, null, 8, ["disabled", "label"]),
289
- v(n, {
290
- label: t(a)("menu.common.actions.cancel"),
291
- size: "lg",
292
- variant: "tertiary",
293
- onClick: s[1] || (s[1] = (Ce) => g.value = !1)
294
- }, null, 8, ["label"])
295
- ])
296
- ];
297
- }),
298
- default: b(() => {
299
- var l;
300
- return [
301
- h("div", we, [
302
- v(se, ie({
303
- autofocus: "",
304
- "error-messages": z.value ? [t(y)(z.value)] : [],
305
- label: t(a)("menu.serving_sequence.columns.name"),
306
- "model-value": ((l = c.value) == null ? void 0 : l.name) ?? "",
307
- placeholder: t(a)("menu.common.labels.enter_name")
308
- }, t(w).field("name", u.value.setName)), null, 16, ["error-messages", "label", "model-value", "placeholder"]),
309
- v(t(ce), {
310
- "categorized-items": R.value,
311
- data: G.value,
312
- class: "flex-1",
313
- "select-variant": "",
314
- "show-variant": "",
315
- "onUpdate:data": Q
316
- }, null, 8, ["categorized-items", "data"])
317
- ])
318
- ];
319
- }),
320
- _: 1
321
- }, 8, ["modelValue", "is-container", "is-container-props"])
322
- ]),
323
- _: 1
324
- }, 8, ["heading"]);
325
- };
326
- }
327
- }), Ke = /* @__PURE__ */ A({
328
- __name: "ServingSequence",
329
- setup(C) {
330
- const r = be();
331
- return (a, y) => (m(), k(xe, { sdk: t(r) }, null, 8, ["sdk"]));
332
- }
333
- });
334
- export {
335
- Ke as default
336
- };