@feedmepos/mf-menu 0.31.72-prod → 0.31.72-remy.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 (69) hide show
  1. package/dist/{App-CL10Jg9U.js → App-BRKBFTkF.js} +436 -493
  2. package/dist/{ApplyProduct.vue_vue_type_script_setup_true_lang-Cjx5fbP-.js → ApplyProduct.vue_vue_type_script_setup_true_lang-DBReRk26.js} +3 -3
  3. package/dist/{Catalog-DH2BdP9z.js → Catalog-PtF27Q8c.js} +6 -6
  4. package/dist/{Category-qYUvpLdh.js → Category-D-Bbf6gv.js} +4 -4
  5. package/dist/{Category-DqGNz35T.js → Category-Dby8xy11.js} +6 -6
  6. package/dist/{CookingGuide-BDdhXyem.js → CookingGuide-DuCXP5of.js} +4 -4
  7. package/dist/{CustomAttributeChip.vue_vue_type_script_setup_true_lang-Cdpdj5IE.js → CustomAttributeChip.vue_vue_type_script_setup_true_lang-B2N8W9M2.js} +1 -1
  8. package/dist/{Group-CC_L3UT-.js → Group-Ca4q6q6v.js} +1 -1
  9. package/dist/{Group-BdezABwF.js → Group-n0sbEx-H.js} +3 -3
  10. package/dist/{Group.vue_vue_type_script_setup_true_lang-QW6LNvGs.js → Group.vue_vue_type_script_setup_true_lang-Pf0jPWDV.js} +48 -48
  11. package/dist/{GroupMarkupPriceDialog.vue_vue_type_script_setup_true_lang-BRIuJaJC.js → GroupMarkupPriceDialog.vue_vue_type_script_setup_true_lang-Bp1iR64p.js} +5 -5
  12. package/dist/{ImportProductDialog.vue_vue_type_script_setup_true_lang-Dsz3Xn9Z.js → ImportProductDialog.vue_vue_type_script_setup_true_lang-Casi1-TT.js} +7 -7
  13. package/dist/{Ingredient-BBI1k8pJ.js → Ingredient-TkzHZCqG.js} +3 -3
  14. package/dist/{InventoryBinding.vue_vue_type_script_setup_true_lang-DAEBkjvK.js → InventoryBinding.vue_vue_type_script_setup_true_lang-DVFNJqMP.js} +2 -2
  15. package/dist/{LinkProductSideSheet-CjpsPqEi.js → LinkProductSideSheet-CDYqw-R6.js} +3 -3
  16. package/dist/{MenuSetting-C-P1Scc1.js → MenuSetting-BnAKXbNU.js} +5 -5
  17. package/dist/{PrintRoute-6PwNkgPq.js → PrintRoute-DeRjndo1.js} +4 -4
  18. package/dist/{Product-C9bWKMnR.js → Product-DqxoDtZv.js} +1 -1
  19. package/dist/{Product.vue_vue_type_script_setup_true_lang-B-_k2sxs.js → Product.vue_vue_type_script_setup_true_lang-CiLyEQQ8.js} +13 -13
  20. package/dist/{ProductInternalTools-CPOtlBbf.js → ProductInternalTools-CglhTu6T.js} +6 -6
  21. package/dist/{Products-bBYxKoQD.js → Products-DJ72cbig.js} +11 -11
  22. package/dist/{Publish-D8kDEEHH.js → Publish-BGkTK5bz.js} +3 -3
  23. package/dist/{Recipe-COSl8UGA.js → Recipe-0DDI5WgS.js} +4 -4
  24. package/dist/{Scheduler-CbpeTQSj.js → Scheduler-DUJzZP0Z.js} +3 -3
  25. package/dist/{ServingSequence-cj2B74HR.js → ServingSequence-C8x6fhqI.js} +3 -3
  26. package/dist/{Setting-D23VkUB7.js → Setting-BVAyjOEK.js} +5 -5
  27. package/dist/{Subcategory-DX8QrFgC.js → Subcategory-SQmUn-Cd.js} +4 -4
  28. package/dist/{Takeaway-DrhBsRCs.js → Takeaway-4AsBd7Aa.js} +1 -1
  29. package/dist/{Takeaway-DH2SFWfP.js → Takeaway-cuTLgdPS.js} +4 -4
  30. package/dist/{Takeaway.vue_vue_type_script_setup_true_lang-BToJ-0PD.js → Takeaway.vue_vue_type_script_setup_true_lang-DlGDDIXL.js} +5 -5
  31. package/dist/{Thumbnail.vue_vue_type_script_setup_true_lang-C2iX4mHA.js → Thumbnail.vue_vue_type_script_setup_true_lang-CO-_6vi5.js} +4 -4
  32. package/dist/{TreeEditorOpenner.vue_vue_type_script_setup_true_lang-CBfuxySf.js → TreeEditorOpenner.vue_vue_type_script_setup_true_lang-DyoU0ybU.js} +1506 -1522
  33. package/dist/{Unit-DMxFyFY2.js → Unit-DjEiYCzl.js} +2 -2
  34. package/dist/{Variant-rNyjWODP.js → Variant-q9h__TW2.js} +3 -3
  35. package/dist/{_id_-BwarikMA.js → _id_-DfqFqvhn.js} +10 -10
  36. package/dist/{app-DSzFVevx.js → app-BMchi_Q-.js} +1 -1
  37. package/dist/app-Ccg-hpT6.js +363 -0
  38. package/dist/app.js +1 -1
  39. package/dist/apps/mf-menu/src/app.d.ts +1626 -1
  40. package/dist/apps/mf-menu/tsconfig.app.tsbuildinfo +1 -1
  41. package/dist/assets/{linked-status-B5NYysaV.js → linked-status-M0PpN_kR.js} +5 -5
  42. package/dist/assets/{override-menu-CZz5sTM4.js → override-menu-rtrfOZKv.js} +5 -5
  43. package/dist/assets/{validate-menu-Bfr1r4Pn.js → validate-menu-ByC-0tJQ.js} +2 -2
  44. package/dist/{catalog-GksNTiZI.js → catalog-DwkO7yop.js} +1 -1
  45. package/dist/{catalogSetting-Df3DEjQ6.js → catalogSetting-CumgGXIo.js} +1 -1
  46. package/dist/{category-BFAv5nJl.js → category-D2Xx3hY5.js} +1 -1
  47. package/dist/{currency-B-hSVUof.js → currency-Bkp0tqsQ.js} +1 -1
  48. package/dist/{customAttributes-B5fqV_rg.js → customAttributes-DwymRGmn.js} +1 -1
  49. package/dist/{index-CC3psw9Q.js → index-5T1nu_-Y.js} +1 -1
  50. package/dist/{index-Bk9co2B9.js → index-BN2jDHsh.js} +4 -4
  51. package/dist/{index-CFaF-9Hf.js → index-DRFoaNlI.js} +3 -3
  52. package/dist/{index-Cg8D4Rgf.js → index-TY5PFXUy.js} +1 -1
  53. package/dist/{item-ML0US37V.js → item-DsF-BTFX.js} +2729 -2812
  54. package/dist/{iteration-CN2IzQNz.js → iteration-CxgMiOX0.js} +3 -3
  55. package/dist/{jszip.min-B19btBFO.js → jszip.min-DXquVden.js} +2 -2
  56. package/dist/{menu-IEr5lLH7.js → menu-CcYs02jE.js} +1 -1
  57. package/dist/{menu-D2OVCn5f.js → menu-DTkKQStQ.js} +21 -21
  58. package/dist/{menuV2-CxFvJ_no.js → menuV2-B4QXyVAZ.js} +136 -136
  59. package/dist/mf-menu.css +1 -1
  60. package/dist/{priceTier-BRe15JfR.js → priceTier-DnyeeA8O.js} +1 -1
  61. package/dist/{scheduler-CBZXdcgd.js → scheduler-BPODu-M5.js} +4 -4
  62. package/dist/{subcategory-Doq8heDm.js → subcategory-DpDJm0bj.js} +2 -2
  63. package/dist/{toExcel-Bkaa9f0N.js → toExcel-Dxat0an7.js} +2 -2
  64. package/dist/{unit-xdbq52iv.js → unit-84wJ74EQ.js} +2 -2
  65. package/package.json +5 -5
  66. package/dist/app-QPsQPdlC.js +0 -2098
  67. package/dist/apps/mf-menu/src/components/feature/RemyButton.vue.d.ts +0 -15
  68. package/dist/apps/mf-menu/src/components/feature/RemyDialog.vue.d.ts +0 -15
  69. package/dist/apps/mf-menu/src/helper/remy.d.ts +0 -5
@@ -1,2098 +0,0 @@
1
- import { ref as I, computed as ie, defineComponent as ce, createElementBlock as R, openBlock as x, Fragment as be, renderList as ye, normalizeClass as ot, createElementVNode as q, createCommentVNode as he, toDisplayString as Q, pushScopeId as rt, popScopeId as nt, watch as fe, nextTick as ve, onMounted as lt, onBeforeUnmount as st, normalizeStyle as ct, renderSlot as ut, resolveComponent as dt, createBlock as pt, withCtx as mt, createVNode as gt, defineAsyncComponent as _t } from "vue";
2
- import { useBreakpoints as bt } from "@feedmepos/ui-library";
3
- import { Permission as ke, withPermission as y } from "@feedmepos/mf-common";
4
- let F;
5
- const yt = new Uint8Array(16);
6
- function ht() {
7
- if (!F && (F = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !F))
8
- throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
9
- return F(yt);
10
- }
11
- const w = [];
12
- for (let e = 0; e < 256; ++e)
13
- w.push((e + 256).toString(16).slice(1));
14
- function ft(e, t = 0) {
15
- return w[e[t + 0]] + w[e[t + 1]] + w[e[t + 2]] + w[e[t + 3]] + "-" + w[e[t + 4]] + w[e[t + 5]] + "-" + w[e[t + 6]] + w[e[t + 7]] + "-" + w[e[t + 8]] + w[e[t + 9]] + "-" + w[e[t + 10]] + w[e[t + 11]] + w[e[t + 12]] + w[e[t + 13]] + w[e[t + 14]] + w[e[t + 15]];
16
- }
17
- const vt = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), we = {
18
- randomUUID: vt
19
- };
20
- function kt(e, t, a) {
21
- if (we.randomUUID && !e)
22
- return we.randomUUID();
23
- e = e || {};
24
- const i = e.random || (e.rng || ht)();
25
- return i[6] = i[6] & 15 | 64, i[8] = i[8] & 63 | 128, ft(i);
26
- }
27
- function Ue(e, t) {
28
- return function() {
29
- return e.apply(t, arguments);
30
- };
31
- }
32
- const { toString: wt } = Object.prototype, { getPrototypeOf: ue } = Object, V = /* @__PURE__ */ ((e) => (t) => {
33
- const a = wt.call(t);
34
- return e[a] || (e[a] = a.slice(8, -1).toLowerCase());
35
- })(/* @__PURE__ */ Object.create(null)), C = (e) => (e = e.toLowerCase(), (t) => V(t) === e), H = (e) => (t) => typeof t === e, { isArray: U } = Array, L = H("undefined");
36
- function At(e) {
37
- return e !== null && !L(e) && e.constructor !== null && !L(e.constructor) && S(e.constructor.isBuffer) && e.constructor.isBuffer(e);
38
- }
39
- const De = C("ArrayBuffer");
40
- function St(e) {
41
- let t;
42
- return typeof ArrayBuffer < "u" && ArrayBuffer.isView ? t = ArrayBuffer.isView(e) : t = e && e.buffer && De(e.buffer), t;
43
- }
44
- const xt = H("string"), S = H("function"), Le = H("number"), J = (e) => e !== null && typeof e == "object", Ot = (e) => e === !0 || e === !1, M = (e) => {
45
- if (V(e) !== "object")
46
- return !1;
47
- const t = ue(e);
48
- return (t === null || t === Object.prototype || Object.getPrototypeOf(t) === null) && !(Symbol.toStringTag in e) && !(Symbol.iterator in e);
49
- }, Ct = C("Date"), Rt = C("File"), Et = C("Blob"), Pt = C("FileList"), qt = (e) => J(e) && S(e.pipe), Tt = (e) => {
50
- let t;
51
- return e && (typeof FormData == "function" && e instanceof FormData || S(e.append) && ((t = V(e)) === "formdata" || // detect form-data instance
52
- t === "object" && S(e.toString) && e.toString() === "[object FormData]"));
53
- }, Nt = C("URLSearchParams"), It = (e) => e.trim ? e.trim() : e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "");
54
- function j(e, t, { allOwnKeys: a = !1 } = {}) {
55
- if (e === null || typeof e > "u")
56
- return;
57
- let i, o;
58
- if (typeof e != "object" && (e = [e]), U(e))
59
- for (i = 0, o = e.length; i < o; i++)
60
- t.call(null, e[i], i, e);
61
- else {
62
- const r = a ? Object.getOwnPropertyNames(e) : Object.keys(e), n = r.length;
63
- let c;
64
- for (i = 0; i < n; i++)
65
- c = r[i], t.call(null, e[c], c, e);
66
- }
67
- }
68
- function je(e, t) {
69
- t = t.toLowerCase();
70
- const a = Object.keys(e);
71
- let i = a.length, o;
72
- for (; i-- > 0; )
73
- if (o = a[i], t === o.toLowerCase())
74
- return o;
75
- return null;
76
- }
77
- const Be = typeof globalThis < "u" ? globalThis : typeof self < "u" ? self : typeof window < "u" ? window : global, Fe = (e) => !L(e) && e !== Be;
78
- function oe() {
79
- const { caseless: e } = Fe(this) && this || {}, t = {}, a = (i, o) => {
80
- const r = e && je(t, o) || o;
81
- M(t[r]) && M(i) ? t[r] = oe(t[r], i) : M(i) ? t[r] = oe({}, i) : U(i) ? t[r] = i.slice() : t[r] = i;
82
- };
83
- for (let i = 0, o = arguments.length; i < o; i++)
84
- arguments[i] && j(arguments[i], a);
85
- return t;
86
- }
87
- const Ut = (e, t, a, { allOwnKeys: i } = {}) => (j(t, (o, r) => {
88
- a && S(o) ? e[r] = Ue(o, a) : e[r] = o;
89
- }, { allOwnKeys: i }), e), Dt = (e) => (e.charCodeAt(0) === 65279 && (e = e.slice(1)), e), Lt = (e, t, a, i) => {
90
- e.prototype = Object.create(t.prototype, i), e.prototype.constructor = e, Object.defineProperty(e, "super", {
91
- value: t.prototype
92
- }), a && Object.assign(e.prototype, a);
93
- }, jt = (e, t, a, i) => {
94
- let o, r, n;
95
- const c = {};
96
- if (t = t || {}, e == null)
97
- return t;
98
- do {
99
- for (o = Object.getOwnPropertyNames(e), r = o.length; r-- > 0; )
100
- n = o[r], (!i || i(n, e, t)) && !c[n] && (t[n] = e[n], c[n] = !0);
101
- e = a !== !1 && ue(e);
102
- } while (e && (!a || a(e, t)) && e !== Object.prototype);
103
- return t;
104
- }, Bt = (e, t, a) => {
105
- e = String(e), (a === void 0 || a > e.length) && (a = e.length), a -= t.length;
106
- const i = e.indexOf(t, a);
107
- return i !== -1 && i === a;
108
- }, Ft = (e) => {
109
- if (!e)
110
- return null;
111
- if (U(e))
112
- return e;
113
- let t = e.length;
114
- if (!Le(t))
115
- return null;
116
- const a = new Array(t);
117
- for (; t-- > 0; )
118
- a[t] = e[t];
119
- return a;
120
- }, Mt = /* @__PURE__ */ ((e) => (t) => e && t instanceof e)(typeof Uint8Array < "u" && ue(Uint8Array)), $t = (e, t) => {
121
- const a = (e && e[Symbol.iterator]).call(e);
122
- let i;
123
- for (; (i = a.next()) && !i.done; ) {
124
- const o = i.value;
125
- t.call(e, o[0], o[1]);
126
- }
127
- }, zt = (e, t) => {
128
- let a;
129
- const i = [];
130
- for (; (a = e.exec(t)) !== null; )
131
- i.push(a);
132
- return i;
133
- }, Gt = C("HTMLFormElement"), Vt = (e) => e.toLowerCase().replace(
134
- /[-_\s]([a-z\d])(\w*)/g,
135
- function(t, a, i) {
136
- return a.toUpperCase() + i;
137
- }
138
- ), Ae = (({ hasOwnProperty: e }) => (t, a) => e.call(t, a))(Object.prototype), Ht = C("RegExp"), Me = (e, t) => {
139
- const a = Object.getOwnPropertyDescriptors(e), i = {};
140
- j(a, (o, r) => {
141
- let n;
142
- (n = t(o, r, e)) !== !1 && (i[r] = n || o);
143
- }), Object.defineProperties(e, i);
144
- }, Jt = (e) => {
145
- Me(e, (t, a) => {
146
- if (S(e) && ["arguments", "caller", "callee"].indexOf(a) !== -1)
147
- return !1;
148
- const i = e[a];
149
- if (S(i)) {
150
- if (t.enumerable = !1, "writable" in t) {
151
- t.writable = !1;
152
- return;
153
- }
154
- t.set || (t.set = () => {
155
- throw Error("Can not rewrite read-only method '" + a + "'");
156
- });
157
- }
158
- });
159
- }, Wt = (e, t) => {
160
- const a = {}, i = (o) => {
161
- o.forEach((r) => {
162
- a[r] = !0;
163
- });
164
- };
165
- return U(e) ? i(e) : i(String(e).split(t)), a;
166
- }, Kt = () => {
167
- }, Yt = (e, t) => (e = +e, Number.isFinite(e) ? e : t), X = "abcdefghijklmnopqrstuvwxyz", Se = "0123456789", $e = {
168
- DIGIT: Se,
169
- ALPHA: X,
170
- ALPHA_DIGIT: X + X.toUpperCase() + Se
171
- }, Qt = (e = 16, t = $e.ALPHA_DIGIT) => {
172
- let a = "";
173
- const { length: i } = t;
174
- for (; e--; )
175
- a += t[Math.random() * i | 0];
176
- return a;
177
- };
178
- function Xt(e) {
179
- return !!(e && S(e.append) && e[Symbol.toStringTag] === "FormData" && e[Symbol.iterator]);
180
- }
181
- const Zt = (e) => {
182
- const t = new Array(10), a = (i, o) => {
183
- if (J(i)) {
184
- if (t.indexOf(i) >= 0)
185
- return;
186
- if (!("toJSON" in i)) {
187
- t[o] = i;
188
- const r = U(i) ? [] : {};
189
- return j(i, (n, c) => {
190
- const p = a(n, o + 1);
191
- !L(p) && (r[c] = p);
192
- }), t[o] = void 0, r;
193
- }
194
- }
195
- return i;
196
- };
197
- return a(e, 0);
198
- }, ea = C("AsyncFunction"), ta = (e) => e && (J(e) || S(e)) && S(e.then) && S(e.catch), l = {
199
- isArray: U,
200
- isArrayBuffer: De,
201
- isBuffer: At,
202
- isFormData: Tt,
203
- isArrayBufferView: St,
204
- isString: xt,
205
- isNumber: Le,
206
- isBoolean: Ot,
207
- isObject: J,
208
- isPlainObject: M,
209
- isUndefined: L,
210
- isDate: Ct,
211
- isFile: Rt,
212
- isBlob: Et,
213
- isRegExp: Ht,
214
- isFunction: S,
215
- isStream: qt,
216
- isURLSearchParams: Nt,
217
- isTypedArray: Mt,
218
- isFileList: Pt,
219
- forEach: j,
220
- merge: oe,
221
- extend: Ut,
222
- trim: It,
223
- stripBOM: Dt,
224
- inherits: Lt,
225
- toFlatObject: jt,
226
- kindOf: V,
227
- kindOfTest: C,
228
- endsWith: Bt,
229
- toArray: Ft,
230
- forEachEntry: $t,
231
- matchAll: zt,
232
- isHTMLForm: Gt,
233
- hasOwnProperty: Ae,
234
- hasOwnProp: Ae,
235
- // an alias to avoid ESLint no-prototype-builtins detection
236
- reduceDescriptors: Me,
237
- freezeMethods: Jt,
238
- toObjectSet: Wt,
239
- toCamelCase: Vt,
240
- noop: Kt,
241
- toFiniteNumber: Yt,
242
- findKey: je,
243
- global: Be,
244
- isContextDefined: Fe,
245
- ALPHABET: $e,
246
- generateString: Qt,
247
- isSpecCompliantForm: Xt,
248
- toJSONObject: Zt,
249
- isAsyncFn: ea,
250
- isThenable: ta
251
- };
252
- function _(e, t, a, i, o) {
253
- Error.call(this), Error.captureStackTrace ? Error.captureStackTrace(this, this.constructor) : this.stack = new Error().stack, this.message = e, this.name = "AxiosError", t && (this.code = t), a && (this.config = a), i && (this.request = i), o && (this.response = o);
254
- }
255
- l.inherits(_, Error, {
256
- toJSON: function() {
257
- return {
258
- // Standard
259
- message: this.message,
260
- name: this.name,
261
- // Microsoft
262
- description: this.description,
263
- number: this.number,
264
- // Mozilla
265
- fileName: this.fileName,
266
- lineNumber: this.lineNumber,
267
- columnNumber: this.columnNumber,
268
- stack: this.stack,
269
- // Axios
270
- config: l.toJSONObject(this.config),
271
- code: this.code,
272
- status: this.response && this.response.status ? this.response.status : null
273
- };
274
- }
275
- });
276
- const ze = _.prototype, Ge = {};
277
- [
278
- "ERR_BAD_OPTION_VALUE",
279
- "ERR_BAD_OPTION",
280
- "ECONNABORTED",
281
- "ETIMEDOUT",
282
- "ERR_NETWORK",
283
- "ERR_FR_TOO_MANY_REDIRECTS",
284
- "ERR_DEPRECATED",
285
- "ERR_BAD_RESPONSE",
286
- "ERR_BAD_REQUEST",
287
- "ERR_CANCELED",
288
- "ERR_NOT_SUPPORT",
289
- "ERR_INVALID_URL"
290
- // eslint-disable-next-line func-names
291
- ].forEach((e) => {
292
- Ge[e] = { value: e };
293
- });
294
- Object.defineProperties(_, Ge);
295
- Object.defineProperty(ze, "isAxiosError", { value: !0 });
296
- _.from = (e, t, a, i, o, r) => {
297
- const n = Object.create(ze);
298
- return l.toFlatObject(e, n, function(c) {
299
- return c !== Error.prototype;
300
- }, (c) => c !== "isAxiosError"), _.call(n, e.message, t, a, i, o), n.cause = e, n.name = e.name, r && Object.assign(n, r), n;
301
- };
302
- const aa = null;
303
- function re(e) {
304
- return l.isPlainObject(e) || l.isArray(e);
305
- }
306
- function Ve(e) {
307
- return l.endsWith(e, "[]") ? e.slice(0, -2) : e;
308
- }
309
- function xe(e, t, a) {
310
- return e ? e.concat(t).map(function(i, o) {
311
- return i = Ve(i), !a && o ? "[" + i + "]" : i;
312
- }).join(a ? "." : "") : t;
313
- }
314
- function ia(e) {
315
- return l.isArray(e) && !e.some(re);
316
- }
317
- const oa = l.toFlatObject(l, {}, null, function(e) {
318
- return /^is[A-Z]/.test(e);
319
- });
320
- function W(e, t, a) {
321
- if (!l.isObject(e))
322
- throw new TypeError("target must be an object");
323
- t = t || new FormData(), a = l.toFlatObject(a, {
324
- metaTokens: !0,
325
- dots: !1,
326
- indexes: !1
327
- }, !1, function(g, u) {
328
- return !l.isUndefined(u[g]);
329
- });
330
- const i = a.metaTokens, o = a.visitor || d, r = a.dots, n = a.indexes, c = (a.Blob || typeof Blob < "u" && Blob) && l.isSpecCompliantForm(t);
331
- if (!l.isFunction(o))
332
- throw new TypeError("visitor must be a function");
333
- function p(g) {
334
- if (g === null)
335
- return "";
336
- if (l.isDate(g))
337
- return g.toISOString();
338
- if (!c && l.isBlob(g))
339
- throw new _("Blob is not supported. Use a Buffer instead.");
340
- return l.isArrayBuffer(g) || l.isTypedArray(g) ? c && typeof Blob == "function" ? new Blob([g]) : Buffer.from(g) : g;
341
- }
342
- function d(g, u, v) {
343
- let A = g;
344
- if (g && !v && typeof g == "object") {
345
- if (l.endsWith(u, "{}"))
346
- u = i ? u : u.slice(0, -2), g = JSON.stringify(g);
347
- else if (l.isArray(g) && ia(g) || (l.isFileList(g) || l.endsWith(u, "[]")) && (A = l.toArray(g)))
348
- return u = Ve(u), A.forEach(function(Y, it) {
349
- !(l.isUndefined(Y) || Y === null) && t.append(
350
- // eslint-disable-next-line no-nested-ternary
351
- n === !0 ? xe([u], it, r) : n === null ? u : u + "[]",
352
- p(Y)
353
- );
354
- }), !1;
355
- }
356
- return re(g) ? !0 : (t.append(xe(v, u, r), p(g)), !1);
357
- }
358
- const s = [], m = Object.assign(oa, {
359
- defaultVisitor: d,
360
- convertValue: p,
361
- isVisitable: re
362
- });
363
- function f(g, u) {
364
- if (!l.isUndefined(g)) {
365
- if (s.indexOf(g) !== -1)
366
- throw Error("Circular reference detected in " + u.join("."));
367
- s.push(g), l.forEach(g, function(v, A) {
368
- (!(l.isUndefined(v) || v === null) && o.call(
369
- t,
370
- v,
371
- l.isString(A) ? A.trim() : A,
372
- u,
373
- m
374
- )) === !0 && f(v, u ? u.concat(A) : [A]);
375
- }), s.pop();
376
- }
377
- }
378
- if (!l.isObject(e))
379
- throw new TypeError("data must be an object");
380
- return f(e), t;
381
- }
382
- function Oe(e) {
383
- const t = {
384
- "!": "%21",
385
- "'": "%27",
386
- "(": "%28",
387
- ")": "%29",
388
- "~": "%7E",
389
- "%20": "+",
390
- "%00": "\0"
391
- };
392
- return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g, function(a) {
393
- return t[a];
394
- });
395
- }
396
- function de(e, t) {
397
- this._pairs = [], e && W(e, this, t);
398
- }
399
- const He = de.prototype;
400
- He.append = function(e, t) {
401
- this._pairs.push([e, t]);
402
- };
403
- He.toString = function(e) {
404
- const t = e ? function(a) {
405
- return e.call(this, a, Oe);
406
- } : Oe;
407
- return this._pairs.map(function(a) {
408
- return t(a[0]) + "=" + t(a[1]);
409
- }, "").join("&");
410
- };
411
- function ra(e) {
412
- return encodeURIComponent(e).replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]");
413
- }
414
- function Je(e, t, a) {
415
- if (!t)
416
- return e;
417
- const i = a && a.encode || ra, o = a && a.serialize;
418
- let r;
419
- if (o ? r = o(t, a) : r = l.isURLSearchParams(t) ? t.toString() : new de(t, a).toString(i), r) {
420
- const n = e.indexOf("#");
421
- n !== -1 && (e = e.slice(0, n)), e += (e.indexOf("?") === -1 ? "?" : "&") + r;
422
- }
423
- return e;
424
- }
425
- class Ce {
426
- constructor() {
427
- this.handlers = [];
428
- }
429
- /**
430
- * Add a new interceptor to the stack
431
- *
432
- * @param {Function} fulfilled The function to handle `then` for a `Promise`
433
- * @param {Function} rejected The function to handle `reject` for a `Promise`
434
- *
435
- * @return {Number} An ID used to remove interceptor later
436
- */
437
- use(t, a, i) {
438
- return this.handlers.push({
439
- fulfilled: t,
440
- rejected: a,
441
- synchronous: i ? i.synchronous : !1,
442
- runWhen: i ? i.runWhen : null
443
- }), this.handlers.length - 1;
444
- }
445
- /**
446
- * Remove an interceptor from the stack
447
- *
448
- * @param {Number} id The ID that was returned by `use`
449
- *
450
- * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise
451
- */
452
- eject(t) {
453
- this.handlers[t] && (this.handlers[t] = null);
454
- }
455
- /**
456
- * Clear all interceptors from the stack
457
- *
458
- * @returns {void}
459
- */
460
- clear() {
461
- this.handlers && (this.handlers = []);
462
- }
463
- /**
464
- * Iterate over all the registered interceptors
465
- *
466
- * This method is particularly useful for skipping over any
467
- * interceptors that may have become `null` calling `eject`.
468
- *
469
- * @param {Function} fn The function to call for each interceptor
470
- *
471
- * @returns {void}
472
- */
473
- forEach(t) {
474
- l.forEach(this.handlers, function(a) {
475
- a !== null && t(a);
476
- });
477
- }
478
- }
479
- const We = {
480
- silentJSONParsing: !0,
481
- forcedJSONParsing: !0,
482
- clarifyTimeoutError: !1
483
- }, na = typeof URLSearchParams < "u" ? URLSearchParams : de, la = typeof FormData < "u" ? FormData : null, sa = typeof Blob < "u" ? Blob : null, ca = {
484
- isBrowser: !0,
485
- classes: {
486
- URLSearchParams: na,
487
- FormData: la,
488
- Blob: sa
489
- },
490
- protocols: ["http", "https", "file", "blob", "url", "data"]
491
- }, Ke = typeof window < "u" && typeof document < "u", ua = ((e) => Ke && ["ReactNative", "NativeScript", "NS"].indexOf(e) < 0)(typeof navigator < "u" && navigator.product), da = typeof WorkerGlobalScope < "u" && // eslint-disable-next-line no-undef
492
- self instanceof WorkerGlobalScope && typeof self.importScripts == "function", pa = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
493
- __proto__: null,
494
- hasBrowserEnv: Ke,
495
- hasStandardBrowserEnv: ua,
496
- hasStandardBrowserWebWorkerEnv: da
497
- }, Symbol.toStringTag, { value: "Module" })), O = {
498
- ...pa,
499
- ...ca
500
- };
501
- function ma(e, t) {
502
- return W(e, new O.classes.URLSearchParams(), Object.assign({
503
- visitor: function(a, i, o, r) {
504
- return O.isNode && l.isBuffer(a) ? (this.append(i, a.toString("base64")), !1) : r.defaultVisitor.apply(this, arguments);
505
- }
506
- }, t));
507
- }
508
- function ga(e) {
509
- return l.matchAll(/\w+|\[(\w*)]/g, e).map((t) => t[0] === "[]" ? "" : t[1] || t[0]);
510
- }
511
- function _a(e) {
512
- const t = {}, a = Object.keys(e);
513
- let i;
514
- const o = a.length;
515
- let r;
516
- for (i = 0; i < o; i++)
517
- r = a[i], t[r] = e[r];
518
- return t;
519
- }
520
- function Ye(e) {
521
- function t(a, i, o, r) {
522
- let n = a[r++];
523
- if (n === "__proto__")
524
- return !0;
525
- const c = Number.isFinite(+n), p = r >= a.length;
526
- return n = !n && l.isArray(o) ? o.length : n, p ? (l.hasOwnProp(o, n) ? o[n] = [o[n], i] : o[n] = i, !c) : ((!o[n] || !l.isObject(o[n])) && (o[n] = []), t(a, i, o[n], r) && l.isArray(o[n]) && (o[n] = _a(o[n])), !c);
527
- }
528
- if (l.isFormData(e) && l.isFunction(e.entries)) {
529
- const a = {};
530
- return l.forEachEntry(e, (i, o) => {
531
- t(ga(i), o, a, 0);
532
- }), a;
533
- }
534
- return null;
535
- }
536
- function ba(e, t, a) {
537
- if (l.isString(e))
538
- try {
539
- return (t || JSON.parse)(e), l.trim(e);
540
- } catch (i) {
541
- if (i.name !== "SyntaxError")
542
- throw i;
543
- }
544
- return (a || JSON.stringify)(e);
545
- }
546
- const pe = {
547
- transitional: We,
548
- adapter: ["xhr", "http"],
549
- transformRequest: [function(e, t) {
550
- const a = t.getContentType() || "", i = a.indexOf("application/json") > -1, o = l.isObject(e);
551
- if (o && l.isHTMLForm(e) && (e = new FormData(e)), l.isFormData(e))
552
- return i && i ? JSON.stringify(Ye(e)) : e;
553
- if (l.isArrayBuffer(e) || l.isBuffer(e) || l.isStream(e) || l.isFile(e) || l.isBlob(e))
554
- return e;
555
- if (l.isArrayBufferView(e))
556
- return e.buffer;
557
- if (l.isURLSearchParams(e))
558
- return t.setContentType("application/x-www-form-urlencoded;charset=utf-8", !1), e.toString();
559
- let r;
560
- if (o) {
561
- if (a.indexOf("application/x-www-form-urlencoded") > -1)
562
- return ma(e, this.formSerializer).toString();
563
- if ((r = l.isFileList(e)) || a.indexOf("multipart/form-data") > -1) {
564
- const n = this.env && this.env.FormData;
565
- return W(
566
- r ? { "files[]": e } : e,
567
- n && new n(),
568
- this.formSerializer
569
- );
570
- }
571
- }
572
- return o || i ? (t.setContentType("application/json", !1), ba(e)) : e;
573
- }],
574
- transformResponse: [function(e) {
575
- const t = this.transitional || pe.transitional, a = t && t.forcedJSONParsing, i = this.responseType === "json";
576
- if (e && l.isString(e) && (a && !this.responseType || i)) {
577
- const o = !(t && t.silentJSONParsing) && i;
578
- try {
579
- return JSON.parse(e);
580
- } catch (r) {
581
- if (o)
582
- throw r.name === "SyntaxError" ? _.from(r, _.ERR_BAD_RESPONSE, this, null, this.response) : r;
583
- }
584
- }
585
- return e;
586
- }],
587
- /**
588
- * A timeout in milliseconds to abort a request. If set to 0 (default) a
589
- * timeout is not created.
590
- */
591
- timeout: 0,
592
- xsrfCookieName: "XSRF-TOKEN",
593
- xsrfHeaderName: "X-XSRF-TOKEN",
594
- maxContentLength: -1,
595
- maxBodyLength: -1,
596
- env: {
597
- FormData: O.classes.FormData,
598
- Blob: O.classes.Blob
599
- },
600
- validateStatus: function(e) {
601
- return e >= 200 && e < 300;
602
- },
603
- headers: {
604
- common: {
605
- Accept: "application/json, text/plain, */*",
606
- "Content-Type": void 0
607
- }
608
- }
609
- };
610
- l.forEach(["delete", "get", "head", "post", "put", "patch"], (e) => {
611
- pe.headers[e] = {};
612
- });
613
- const me = pe, ya = l.toObjectSet([
614
- "age",
615
- "authorization",
616
- "content-length",
617
- "content-type",
618
- "etag",
619
- "expires",
620
- "from",
621
- "host",
622
- "if-modified-since",
623
- "if-unmodified-since",
624
- "last-modified",
625
- "location",
626
- "max-forwards",
627
- "proxy-authorization",
628
- "referer",
629
- "retry-after",
630
- "user-agent"
631
- ]), ha = (e) => {
632
- const t = {};
633
- let a, i, o;
634
- return e && e.split(`
635
- `).forEach(function(r) {
636
- o = r.indexOf(":"), a = r.substring(0, o).trim().toLowerCase(), i = r.substring(o + 1).trim(), !(!a || t[a] && ya[a]) && (a === "set-cookie" ? t[a] ? t[a].push(i) : t[a] = [i] : t[a] = t[a] ? t[a] + ", " + i : i);
637
- }), t;
638
- }, Re = Symbol("internals");
639
- function D(e) {
640
- return e && String(e).trim().toLowerCase();
641
- }
642
- function $(e) {
643
- return e === !1 || e == null ? e : l.isArray(e) ? e.map($) : String(e);
644
- }
645
- function fa(e) {
646
- const t = /* @__PURE__ */ Object.create(null), a = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
647
- let i;
648
- for (; i = a.exec(e); )
649
- t[i[1]] = i[2];
650
- return t;
651
- }
652
- const va = (e) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());
653
- function Z(e, t, a, i, o) {
654
- if (l.isFunction(i))
655
- return i.call(this, t, a);
656
- if (o && (t = a), !!l.isString(t)) {
657
- if (l.isString(i))
658
- return t.indexOf(i) !== -1;
659
- if (l.isRegExp(i))
660
- return i.test(t);
661
- }
662
- }
663
- function ka(e) {
664
- return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (t, a, i) => a.toUpperCase() + i);
665
- }
666
- function wa(e, t) {
667
- const a = l.toCamelCase(" " + t);
668
- ["get", "set", "has"].forEach((i) => {
669
- Object.defineProperty(e, i + a, {
670
- value: function(o, r, n) {
671
- return this[i].call(this, t, o, r, n);
672
- },
673
- configurable: !0
674
- });
675
- });
676
- }
677
- class K {
678
- constructor(t) {
679
- t && this.set(t);
680
- }
681
- set(t, a, i) {
682
- const o = this;
683
- function r(c, p, d) {
684
- const s = D(p);
685
- if (!s)
686
- throw new Error("header name must be a non-empty string");
687
- const m = l.findKey(o, s);
688
- (!m || o[m] === void 0 || d === !0 || d === void 0 && o[m] !== !1) && (o[m || p] = $(c));
689
- }
690
- const n = (c, p) => l.forEach(c, (d, s) => r(d, s, p));
691
- return l.isPlainObject(t) || t instanceof this.constructor ? n(t, a) : l.isString(t) && (t = t.trim()) && !va(t) ? n(ha(t), a) : t != null && r(a, t, i), this;
692
- }
693
- get(t, a) {
694
- if (t = D(t), t) {
695
- const i = l.findKey(this, t);
696
- if (i) {
697
- const o = this[i];
698
- if (!a)
699
- return o;
700
- if (a === !0)
701
- return fa(o);
702
- if (l.isFunction(a))
703
- return a.call(this, o, i);
704
- if (l.isRegExp(a))
705
- return a.exec(o);
706
- throw new TypeError("parser must be boolean|regexp|function");
707
- }
708
- }
709
- }
710
- has(t, a) {
711
- if (t = D(t), t) {
712
- const i = l.findKey(this, t);
713
- return !!(i && this[i] !== void 0 && (!a || Z(this, this[i], i, a)));
714
- }
715
- return !1;
716
- }
717
- delete(t, a) {
718
- const i = this;
719
- let o = !1;
720
- function r(n) {
721
- if (n = D(n), n) {
722
- const c = l.findKey(i, n);
723
- c && (!a || Z(i, i[c], c, a)) && (delete i[c], o = !0);
724
- }
725
- }
726
- return l.isArray(t) ? t.forEach(r) : r(t), o;
727
- }
728
- clear(t) {
729
- const a = Object.keys(this);
730
- let i = a.length, o = !1;
731
- for (; i--; ) {
732
- const r = a[i];
733
- (!t || Z(this, this[r], r, t, !0)) && (delete this[r], o = !0);
734
- }
735
- return o;
736
- }
737
- normalize(t) {
738
- const a = this, i = {};
739
- return l.forEach(this, (o, r) => {
740
- const n = l.findKey(i, r);
741
- if (n) {
742
- a[n] = $(o), delete a[r];
743
- return;
744
- }
745
- const c = t ? ka(r) : String(r).trim();
746
- c !== r && delete a[r], a[c] = $(o), i[c] = !0;
747
- }), this;
748
- }
749
- concat(...t) {
750
- return this.constructor.concat(this, ...t);
751
- }
752
- toJSON(t) {
753
- const a = /* @__PURE__ */ Object.create(null);
754
- return l.forEach(this, (i, o) => {
755
- i != null && i !== !1 && (a[o] = t && l.isArray(i) ? i.join(", ") : i);
756
- }), a;
757
- }
758
- [Symbol.iterator]() {
759
- return Object.entries(this.toJSON())[Symbol.iterator]();
760
- }
761
- toString() {
762
- return Object.entries(this.toJSON()).map(([t, a]) => t + ": " + a).join(`
763
- `);
764
- }
765
- get [Symbol.toStringTag]() {
766
- return "AxiosHeaders";
767
- }
768
- static from(t) {
769
- return t instanceof this ? t : new this(t);
770
- }
771
- static concat(t, ...a) {
772
- const i = new this(t);
773
- return a.forEach((o) => i.set(o)), i;
774
- }
775
- static accessor(t) {
776
- const a = (this[Re] = this[Re] = {
777
- accessors: {}
778
- }).accessors, i = this.prototype;
779
- function o(r) {
780
- const n = D(r);
781
- a[n] || (wa(i, r), a[n] = !0);
782
- }
783
- return l.isArray(t) ? t.forEach(o) : o(t), this;
784
- }
785
- }
786
- K.accessor(["Content-Type", "Content-Length", "Accept", "Accept-Encoding", "User-Agent", "Authorization"]);
787
- l.reduceDescriptors(K.prototype, ({ value: e }, t) => {
788
- let a = t[0].toUpperCase() + t.slice(1);
789
- return {
790
- get: () => e,
791
- set(i) {
792
- this[a] = i;
793
- }
794
- };
795
- });
796
- l.freezeMethods(K);
797
- const E = K;
798
- function ee(e, t) {
799
- const a = this || me, i = t || a, o = E.from(i.headers);
800
- let r = i.data;
801
- return l.forEach(e, function(n) {
802
- r = n.call(a, r, o.normalize(), t ? t.status : void 0);
803
- }), o.normalize(), r;
804
- }
805
- function Qe(e) {
806
- return !!(e && e.__CANCEL__);
807
- }
808
- function B(e, t, a) {
809
- _.call(this, e ?? "canceled", _.ERR_CANCELED, t, a), this.name = "CanceledError";
810
- }
811
- l.inherits(B, _, {
812
- __CANCEL__: !0
813
- });
814
- function Aa(e, t, a) {
815
- const i = a.config.validateStatus;
816
- !a.status || !i || i(a.status) ? e(a) : t(new _(
817
- "Request failed with status code " + a.status,
818
- [_.ERR_BAD_REQUEST, _.ERR_BAD_RESPONSE][Math.floor(a.status / 100) - 4],
819
- a.config,
820
- a.request,
821
- a
822
- ));
823
- }
824
- const Sa = O.hasStandardBrowserEnv ? (
825
- // Standard browser envs support document.cookie
826
- {
827
- write(e, t, a, i, o, r) {
828
- const n = [e + "=" + encodeURIComponent(t)];
829
- l.isNumber(a) && n.push("expires=" + new Date(a).toGMTString()), l.isString(i) && n.push("path=" + i), l.isString(o) && n.push("domain=" + o), r === !0 && n.push("secure"), document.cookie = n.join("; ");
830
- },
831
- read(e) {
832
- const t = document.cookie.match(new RegExp("(^|;\\s*)(" + e + ")=([^;]*)"));
833
- return t ? decodeURIComponent(t[3]) : null;
834
- },
835
- remove(e) {
836
- this.write(e, "", Date.now() - 864e5);
837
- }
838
- }
839
- ) : (
840
- // Non-standard browser env (web workers, react-native) lack needed support.
841
- {
842
- write() {
843
- },
844
- read() {
845
- return null;
846
- },
847
- remove() {
848
- }
849
- }
850
- );
851
- function xa(e) {
852
- return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(e);
853
- }
854
- function Oa(e, t) {
855
- return t ? e.replace(/\/?\/$/, "") + "/" + t.replace(/^\/+/, "") : e;
856
- }
857
- function Xe(e, t) {
858
- return e && !xa(t) ? Oa(e, t) : t;
859
- }
860
- const Ca = O.hasStandardBrowserEnv ? (
861
- // Standard browser envs have full support of the APIs needed to test
862
- // whether the request URL is of the same origin as current location.
863
- function() {
864
- const e = /(msie|trident)/i.test(navigator.userAgent), t = document.createElement("a");
865
- let a;
866
- function i(o) {
867
- let r = o;
868
- return e && (t.setAttribute("href", r), r = t.href), t.setAttribute("href", r), {
869
- href: t.href,
870
- protocol: t.protocol ? t.protocol.replace(/:$/, "") : "",
871
- host: t.host,
872
- search: t.search ? t.search.replace(/^\?/, "") : "",
873
- hash: t.hash ? t.hash.replace(/^#/, "") : "",
874
- hostname: t.hostname,
875
- port: t.port,
876
- pathname: t.pathname.charAt(0) === "/" ? t.pathname : "/" + t.pathname
877
- };
878
- }
879
- return a = i(window.location.href), function(o) {
880
- const r = l.isString(o) ? i(o) : o;
881
- return r.protocol === a.protocol && r.host === a.host;
882
- };
883
- }()
884
- ) : (
885
- // Non standard browser envs (web workers, react-native) lack needed support.
886
- /* @__PURE__ */ function() {
887
- return function() {
888
- return !0;
889
- };
890
- }()
891
- );
892
- function Ra(e) {
893
- const t = /^([-+\w]{1,25})(:?\/\/|:)/.exec(e);
894
- return t && t[1] || "";
895
- }
896
- function Ea(e, t) {
897
- e = e || 10;
898
- const a = new Array(e), i = new Array(e);
899
- let o = 0, r = 0, n;
900
- return t = t !== void 0 ? t : 1e3, function(c) {
901
- const p = Date.now(), d = i[r];
902
- n || (n = p), a[o] = c, i[o] = p;
903
- let s = r, m = 0;
904
- for (; s !== o; )
905
- m += a[s++], s = s % e;
906
- if (o = (o + 1) % e, o === r && (r = (r + 1) % e), p - n < t)
907
- return;
908
- const f = d && p - d;
909
- return f ? Math.round(m * 1e3 / f) : void 0;
910
- };
911
- }
912
- function Ee(e, t) {
913
- let a = 0;
914
- const i = Ea(50, 250);
915
- return (o) => {
916
- const r = o.loaded, n = o.lengthComputable ? o.total : void 0, c = r - a, p = i(c), d = r <= n;
917
- a = r;
918
- const s = {
919
- loaded: r,
920
- total: n,
921
- progress: n ? r / n : void 0,
922
- bytes: c,
923
- rate: p || void 0,
924
- estimated: p && n && d ? (n - r) / p : void 0,
925
- event: o
926
- };
927
- s[t ? "download" : "upload"] = !0, e(s);
928
- };
929
- }
930
- const Pa = typeof XMLHttpRequest < "u", qa = Pa && function(e) {
931
- return new Promise(function(t, a) {
932
- let i = e.data;
933
- const o = E.from(e.headers).normalize();
934
- let { responseType: r, withXSRFToken: n } = e, c;
935
- function p() {
936
- e.cancelToken && e.cancelToken.unsubscribe(c), e.signal && e.signal.removeEventListener("abort", c);
937
- }
938
- let d;
939
- if (l.isFormData(i)) {
940
- if (O.hasStandardBrowserEnv || O.hasStandardBrowserWebWorkerEnv)
941
- o.setContentType(!1);
942
- else if ((d = o.getContentType()) !== !1) {
943
- const [u, ...v] = d ? d.split(";").map((A) => A.trim()).filter(Boolean) : [];
944
- o.setContentType([u || "multipart/form-data", ...v].join("; "));
945
- }
946
- }
947
- let s = new XMLHttpRequest();
948
- if (e.auth) {
949
- const u = e.auth.username || "", v = e.auth.password ? unescape(encodeURIComponent(e.auth.password)) : "";
950
- o.set("Authorization", "Basic " + btoa(u + ":" + v));
951
- }
952
- const m = Xe(e.baseURL, e.url);
953
- s.open(e.method.toUpperCase(), Je(m, e.params, e.paramsSerializer), !0), s.timeout = e.timeout;
954
- function f() {
955
- if (!s)
956
- return;
957
- const u = E.from(
958
- "getAllResponseHeaders" in s && s.getAllResponseHeaders()
959
- ), v = {
960
- data: !r || r === "text" || r === "json" ? s.responseText : s.response,
961
- status: s.status,
962
- statusText: s.statusText,
963
- headers: u,
964
- config: e,
965
- request: s
966
- };
967
- Aa(function(A) {
968
- t(A), p();
969
- }, function(A) {
970
- a(A), p();
971
- }, v), s = null;
972
- }
973
- if ("onloadend" in s ? s.onloadend = f : s.onreadystatechange = function() {
974
- !s || s.readyState !== 4 || s.status === 0 && !(s.responseURL && s.responseURL.indexOf("file:") === 0) || setTimeout(f);
975
- }, s.onabort = function() {
976
- s && (a(new _("Request aborted", _.ECONNABORTED, e, s)), s = null);
977
- }, s.onerror = function() {
978
- a(new _("Network Error", _.ERR_NETWORK, e, s)), s = null;
979
- }, s.ontimeout = function() {
980
- let u = e.timeout ? "timeout of " + e.timeout + "ms exceeded" : "timeout exceeded";
981
- const v = e.transitional || We;
982
- e.timeoutErrorMessage && (u = e.timeoutErrorMessage), a(new _(
983
- u,
984
- v.clarifyTimeoutError ? _.ETIMEDOUT : _.ECONNABORTED,
985
- e,
986
- s
987
- )), s = null;
988
- }, O.hasStandardBrowserEnv && (n && l.isFunction(n) && (n = n(e)), n || n !== !1 && Ca(m))) {
989
- const u = e.xsrfHeaderName && e.xsrfCookieName && Sa.read(e.xsrfCookieName);
990
- u && o.set(e.xsrfHeaderName, u);
991
- }
992
- i === void 0 && o.setContentType(null), "setRequestHeader" in s && l.forEach(o.toJSON(), function(u, v) {
993
- s.setRequestHeader(v, u);
994
- }), l.isUndefined(e.withCredentials) || (s.withCredentials = !!e.withCredentials), r && r !== "json" && (s.responseType = e.responseType), typeof e.onDownloadProgress == "function" && s.addEventListener("progress", Ee(e.onDownloadProgress, !0)), typeof e.onUploadProgress == "function" && s.upload && s.upload.addEventListener("progress", Ee(e.onUploadProgress)), (e.cancelToken || e.signal) && (c = (u) => {
995
- s && (a(!u || u.type ? new B(null, e, s) : u), s.abort(), s = null);
996
- }, e.cancelToken && e.cancelToken.subscribe(c), e.signal && (e.signal.aborted ? c() : e.signal.addEventListener("abort", c)));
997
- const g = Ra(m);
998
- if (g && O.protocols.indexOf(g) === -1) {
999
- a(new _("Unsupported protocol " + g + ":", _.ERR_BAD_REQUEST, e));
1000
- return;
1001
- }
1002
- s.send(i || null);
1003
- });
1004
- }, ne = {
1005
- http: aa,
1006
- xhr: qa
1007
- };
1008
- l.forEach(ne, (e, t) => {
1009
- if (e) {
1010
- try {
1011
- Object.defineProperty(e, "name", { value: t });
1012
- } catch {
1013
- }
1014
- Object.defineProperty(e, "adapterName", { value: t });
1015
- }
1016
- });
1017
- const Pe = (e) => `- ${e}`, Ta = (e) => l.isFunction(e) || e === null || e === !1, Ze = {
1018
- getAdapter: (e) => {
1019
- e = l.isArray(e) ? e : [e];
1020
- const { length: t } = e;
1021
- let a, i;
1022
- const o = {};
1023
- for (let r = 0; r < t; r++) {
1024
- a = e[r];
1025
- let n;
1026
- if (i = a, !Ta(a) && (i = ne[(n = String(a)).toLowerCase()], i === void 0))
1027
- throw new _(`Unknown adapter '${n}'`);
1028
- if (i)
1029
- break;
1030
- o[n || "#" + r] = i;
1031
- }
1032
- if (!i) {
1033
- const r = Object.entries(o).map(
1034
- ([c, p]) => `adapter ${c} ` + (p === !1 ? "is not supported by the environment" : "is not available in the build")
1035
- );
1036
- let n = t ? r.length > 1 ? `since :
1037
- ` + r.map(Pe).join(`
1038
- `) : " " + Pe(r[0]) : "as no adapter specified";
1039
- throw new _(
1040
- "There is no suitable adapter to dispatch the request " + n,
1041
- "ERR_NOT_SUPPORT"
1042
- );
1043
- }
1044
- return i;
1045
- },
1046
- adapters: ne
1047
- };
1048
- function te(e) {
1049
- if (e.cancelToken && e.cancelToken.throwIfRequested(), e.signal && e.signal.aborted)
1050
- throw new B(null, e);
1051
- }
1052
- function qe(e) {
1053
- return te(e), e.headers = E.from(e.headers), e.data = ee.call(
1054
- e,
1055
- e.transformRequest
1056
- ), ["post", "put", "patch"].indexOf(e.method) !== -1 && e.headers.setContentType("application/x-www-form-urlencoded", !1), Ze.getAdapter(e.adapter || me.adapter)(e).then(function(t) {
1057
- return te(e), t.data = ee.call(
1058
- e,
1059
- e.transformResponse,
1060
- t
1061
- ), t.headers = E.from(t.headers), t;
1062
- }, function(t) {
1063
- return Qe(t) || (te(e), t && t.response && (t.response.data = ee.call(
1064
- e,
1065
- e.transformResponse,
1066
- t.response
1067
- ), t.response.headers = E.from(t.response.headers))), Promise.reject(t);
1068
- });
1069
- }
1070
- const Te = (e) => e instanceof E ? e.toJSON() : e;
1071
- function N(e, t) {
1072
- t = t || {};
1073
- const a = {};
1074
- function i(d, s, m) {
1075
- return l.isPlainObject(d) && l.isPlainObject(s) ? l.merge.call({ caseless: m }, d, s) : l.isPlainObject(s) ? l.merge({}, s) : l.isArray(s) ? s.slice() : s;
1076
- }
1077
- function o(d, s, m) {
1078
- if (l.isUndefined(s)) {
1079
- if (!l.isUndefined(d))
1080
- return i(void 0, d, m);
1081
- } else
1082
- return i(d, s, m);
1083
- }
1084
- function r(d, s) {
1085
- if (!l.isUndefined(s))
1086
- return i(void 0, s);
1087
- }
1088
- function n(d, s) {
1089
- if (l.isUndefined(s)) {
1090
- if (!l.isUndefined(d))
1091
- return i(void 0, d);
1092
- } else
1093
- return i(void 0, s);
1094
- }
1095
- function c(d, s, m) {
1096
- if (m in t)
1097
- return i(d, s);
1098
- if (m in e)
1099
- return i(void 0, d);
1100
- }
1101
- const p = {
1102
- url: r,
1103
- method: r,
1104
- data: r,
1105
- baseURL: n,
1106
- transformRequest: n,
1107
- transformResponse: n,
1108
- paramsSerializer: n,
1109
- timeout: n,
1110
- timeoutMessage: n,
1111
- withCredentials: n,
1112
- withXSRFToken: n,
1113
- adapter: n,
1114
- responseType: n,
1115
- xsrfCookieName: n,
1116
- xsrfHeaderName: n,
1117
- onUploadProgress: n,
1118
- onDownloadProgress: n,
1119
- decompress: n,
1120
- maxContentLength: n,
1121
- maxBodyLength: n,
1122
- beforeRedirect: n,
1123
- transport: n,
1124
- httpAgent: n,
1125
- httpsAgent: n,
1126
- cancelToken: n,
1127
- socketPath: n,
1128
- responseEncoding: n,
1129
- validateStatus: c,
1130
- headers: (d, s) => o(Te(d), Te(s), !0)
1131
- };
1132
- return l.forEach(Object.keys(Object.assign({}, e, t)), function(d) {
1133
- const s = p[d] || o, m = s(e[d], t[d], d);
1134
- l.isUndefined(m) && s !== c || (a[d] = m);
1135
- }), a;
1136
- }
1137
- const et = "1.6.5", ge = {};
1138
- ["object", "boolean", "number", "function", "string", "symbol"].forEach((e, t) => {
1139
- ge[e] = function(a) {
1140
- return typeof a === e || "a" + (t < 1 ? "n " : " ") + e;
1141
- };
1142
- });
1143
- const Ne = {};
1144
- ge.transitional = function(e, t, a) {
1145
- function i(o, r) {
1146
- return "[Axios v" + et + "] Transitional option '" + o + "'" + r + (a ? ". " + a : "");
1147
- }
1148
- return (o, r, n) => {
1149
- if (e === !1)
1150
- throw new _(
1151
- i(r, " has been removed" + (t ? " in " + t : "")),
1152
- _.ERR_DEPRECATED
1153
- );
1154
- return t && !Ne[r] && (Ne[r] = !0, console.warn(
1155
- i(
1156
- r,
1157
- " has been deprecated since v" + t + " and will be removed in the near future"
1158
- )
1159
- )), e ? e(o, r, n) : !0;
1160
- };
1161
- };
1162
- function Na(e, t, a) {
1163
- if (typeof e != "object")
1164
- throw new _("options must be an object", _.ERR_BAD_OPTION_VALUE);
1165
- const i = Object.keys(e);
1166
- let o = i.length;
1167
- for (; o-- > 0; ) {
1168
- const r = i[o], n = t[r];
1169
- if (n) {
1170
- const c = e[r], p = c === void 0 || n(c, r, e);
1171
- if (p !== !0)
1172
- throw new _("option " + r + " must be " + p, _.ERR_BAD_OPTION_VALUE);
1173
- continue;
1174
- }
1175
- if (a !== !0)
1176
- throw new _("Unknown option " + r, _.ERR_BAD_OPTION);
1177
- }
1178
- }
1179
- const le = {
1180
- assertOptions: Na,
1181
- validators: ge
1182
- }, P = le.validators;
1183
- class G {
1184
- constructor(t) {
1185
- this.defaults = t, this.interceptors = {
1186
- request: new Ce(),
1187
- response: new Ce()
1188
- };
1189
- }
1190
- /**
1191
- * Dispatch a request
1192
- *
1193
- * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
1194
- * @param {?Object} config
1195
- *
1196
- * @returns {Promise} The Promise to be fulfilled
1197
- */
1198
- request(t, a) {
1199
- typeof t == "string" ? (a = a || {}, a.url = t) : a = t || {}, a = N(this.defaults, a);
1200
- const { transitional: i, paramsSerializer: o, headers: r } = a;
1201
- i !== void 0 && le.assertOptions(i, {
1202
- silentJSONParsing: P.transitional(P.boolean),
1203
- forcedJSONParsing: P.transitional(P.boolean),
1204
- clarifyTimeoutError: P.transitional(P.boolean)
1205
- }, !1), o != null && (l.isFunction(o) ? a.paramsSerializer = {
1206
- serialize: o
1207
- } : le.assertOptions(o, {
1208
- encode: P.function,
1209
- serialize: P.function
1210
- }, !0)), a.method = (a.method || this.defaults.method || "get").toLowerCase();
1211
- let n = r && l.merge(
1212
- r.common,
1213
- r[a.method]
1214
- );
1215
- r && l.forEach(
1216
- ["delete", "get", "head", "post", "put", "patch", "common"],
1217
- (u) => {
1218
- delete r[u];
1219
- }
1220
- ), a.headers = E.concat(n, r);
1221
- const c = [];
1222
- let p = !0;
1223
- this.interceptors.request.forEach(function(u) {
1224
- typeof u.runWhen == "function" && u.runWhen(a) === !1 || (p = p && u.synchronous, c.unshift(u.fulfilled, u.rejected));
1225
- });
1226
- const d = [];
1227
- this.interceptors.response.forEach(function(u) {
1228
- d.push(u.fulfilled, u.rejected);
1229
- });
1230
- let s, m = 0, f;
1231
- if (!p) {
1232
- const u = [qe.bind(this), void 0];
1233
- for (u.unshift.apply(u, c), u.push.apply(u, d), f = u.length, s = Promise.resolve(a); m < f; )
1234
- s = s.then(u[m++], u[m++]);
1235
- return s;
1236
- }
1237
- f = c.length;
1238
- let g = a;
1239
- for (m = 0; m < f; ) {
1240
- const u = c[m++], v = c[m++];
1241
- try {
1242
- g = u(g);
1243
- } catch (A) {
1244
- v.call(this, A);
1245
- break;
1246
- }
1247
- }
1248
- try {
1249
- s = qe.call(this, g);
1250
- } catch (u) {
1251
- return Promise.reject(u);
1252
- }
1253
- for (m = 0, f = d.length; m < f; )
1254
- s = s.then(d[m++], d[m++]);
1255
- return s;
1256
- }
1257
- getUri(t) {
1258
- t = N(this.defaults, t);
1259
- const a = Xe(t.baseURL, t.url);
1260
- return Je(a, t.params, t.paramsSerializer);
1261
- }
1262
- }
1263
- l.forEach(["delete", "get", "head", "options"], function(e) {
1264
- G.prototype[e] = function(t, a) {
1265
- return this.request(N(a || {}, {
1266
- method: e,
1267
- url: t,
1268
- data: (a || {}).data
1269
- }));
1270
- };
1271
- });
1272
- l.forEach(["post", "put", "patch"], function(e) {
1273
- function t(a) {
1274
- return function(i, o, r) {
1275
- return this.request(N(r || {}, {
1276
- method: e,
1277
- headers: a ? {
1278
- "Content-Type": "multipart/form-data"
1279
- } : {},
1280
- url: i,
1281
- data: o
1282
- }));
1283
- };
1284
- }
1285
- G.prototype[e] = t(), G.prototype[e + "Form"] = t(!0);
1286
- });
1287
- const z = G;
1288
- class _e {
1289
- constructor(t) {
1290
- if (typeof t != "function")
1291
- throw new TypeError("executor must be a function.");
1292
- let a;
1293
- this.promise = new Promise(function(o) {
1294
- a = o;
1295
- });
1296
- const i = this;
1297
- this.promise.then((o) => {
1298
- if (!i._listeners)
1299
- return;
1300
- let r = i._listeners.length;
1301
- for (; r-- > 0; )
1302
- i._listeners[r](o);
1303
- i._listeners = null;
1304
- }), this.promise.then = (o) => {
1305
- let r;
1306
- const n = new Promise((c) => {
1307
- i.subscribe(c), r = c;
1308
- }).then(o);
1309
- return n.cancel = function() {
1310
- i.unsubscribe(r);
1311
- }, n;
1312
- }, t(function(o, r, n) {
1313
- i.reason || (i.reason = new B(o, r, n), a(i.reason));
1314
- });
1315
- }
1316
- /**
1317
- * Throws a `CanceledError` if cancellation has been requested.
1318
- */
1319
- throwIfRequested() {
1320
- if (this.reason)
1321
- throw this.reason;
1322
- }
1323
- /**
1324
- * Subscribe to the cancel signal
1325
- */
1326
- subscribe(t) {
1327
- if (this.reason) {
1328
- t(this.reason);
1329
- return;
1330
- }
1331
- this._listeners ? this._listeners.push(t) : this._listeners = [t];
1332
- }
1333
- /**
1334
- * Unsubscribe from the cancel signal
1335
- */
1336
- unsubscribe(t) {
1337
- if (!this._listeners)
1338
- return;
1339
- const a = this._listeners.indexOf(t);
1340
- a !== -1 && this._listeners.splice(a, 1);
1341
- }
1342
- /**
1343
- * Returns an object that contains a new `CancelToken` and a function that, when called,
1344
- * cancels the `CancelToken`.
1345
- */
1346
- static source() {
1347
- let t;
1348
- return {
1349
- token: new _e(function(a) {
1350
- t = a;
1351
- }),
1352
- cancel: t
1353
- };
1354
- }
1355
- }
1356
- const Ia = _e;
1357
- function Ua(e) {
1358
- return function(t) {
1359
- return e.apply(null, t);
1360
- };
1361
- }
1362
- function Da(e) {
1363
- return l.isObject(e) && e.isAxiosError === !0;
1364
- }
1365
- const se = {
1366
- Continue: 100,
1367
- SwitchingProtocols: 101,
1368
- Processing: 102,
1369
- EarlyHints: 103,
1370
- Ok: 200,
1371
- Created: 201,
1372
- Accepted: 202,
1373
- NonAuthoritativeInformation: 203,
1374
- NoContent: 204,
1375
- ResetContent: 205,
1376
- PartialContent: 206,
1377
- MultiStatus: 207,
1378
- AlreadyReported: 208,
1379
- ImUsed: 226,
1380
- MultipleChoices: 300,
1381
- MovedPermanently: 301,
1382
- Found: 302,
1383
- SeeOther: 303,
1384
- NotModified: 304,
1385
- UseProxy: 305,
1386
- Unused: 306,
1387
- TemporaryRedirect: 307,
1388
- PermanentRedirect: 308,
1389
- BadRequest: 400,
1390
- Unauthorized: 401,
1391
- PaymentRequired: 402,
1392
- Forbidden: 403,
1393
- NotFound: 404,
1394
- MethodNotAllowed: 405,
1395
- NotAcceptable: 406,
1396
- ProxyAuthenticationRequired: 407,
1397
- RequestTimeout: 408,
1398
- Conflict: 409,
1399
- Gone: 410,
1400
- LengthRequired: 411,
1401
- PreconditionFailed: 412,
1402
- PayloadTooLarge: 413,
1403
- UriTooLong: 414,
1404
- UnsupportedMediaType: 415,
1405
- RangeNotSatisfiable: 416,
1406
- ExpectationFailed: 417,
1407
- ImATeapot: 418,
1408
- MisdirectedRequest: 421,
1409
- UnprocessableEntity: 422,
1410
- Locked: 423,
1411
- FailedDependency: 424,
1412
- TooEarly: 425,
1413
- UpgradeRequired: 426,
1414
- PreconditionRequired: 428,
1415
- TooManyRequests: 429,
1416
- RequestHeaderFieldsTooLarge: 431,
1417
- UnavailableForLegalReasons: 451,
1418
- InternalServerError: 500,
1419
- NotImplemented: 501,
1420
- BadGateway: 502,
1421
- ServiceUnavailable: 503,
1422
- GatewayTimeout: 504,
1423
- HttpVersionNotSupported: 505,
1424
- VariantAlsoNegotiates: 506,
1425
- InsufficientStorage: 507,
1426
- LoopDetected: 508,
1427
- NotExtended: 510,
1428
- NetworkAuthenticationRequired: 511
1429
- };
1430
- Object.entries(se).forEach(([e, t]) => {
1431
- se[t] = e;
1432
- });
1433
- const La = se;
1434
- function tt(e) {
1435
- const t = new z(e), a = Ue(z.prototype.request, t);
1436
- return l.extend(a, z.prototype, t, { allOwnKeys: !0 }), l.extend(a, t, null, { allOwnKeys: !0 }), a.create = function(i) {
1437
- return tt(N(e, i));
1438
- }, a;
1439
- }
1440
- const k = tt(me);
1441
- k.Axios = z;
1442
- k.CanceledError = B;
1443
- k.CancelToken = Ia;
1444
- k.isCancel = Qe;
1445
- k.VERSION = et;
1446
- k.toFormData = W;
1447
- k.AxiosError = _;
1448
- k.Cancel = k.CanceledError;
1449
- k.all = function(e) {
1450
- return Promise.all(e);
1451
- };
1452
- k.spread = Ua;
1453
- k.isAxiosError = Da;
1454
- k.mergeConfig = N;
1455
- k.AxiosHeaders = E;
1456
- k.formToJSON = (e) => Ye(l.isHTMLForm(e) ? new FormData(e) : e);
1457
- k.getAdapter = Ze.getAdapter;
1458
- k.HttpStatusCode = La;
1459
- k.default = k;
1460
- class ja {
1461
- constructor({
1462
- context: t,
1463
- client: a,
1464
- chatboxRef: i,
1465
- onClose: o
1466
- }) {
1467
- this.logs = [], this.chatboxRef = null, this.id = kt(), this.context = t, this.client = a, this.chatboxRef = i, this.onClose = o, this.log({ value: t.input });
1468
- }
1469
- log({ message: t, query: a, value: i }) {
1470
- this.logs.push({ timestamp: (/* @__PURE__ */ new Date()).toISOString(), message: t, query: a, value: i });
1471
- }
1472
- setChatboxRef(t) {
1473
- this.chatboxRef = t;
1474
- }
1475
- async query({ action: t, path: a, body: i, params: o }) {
1476
- var r, n;
1477
- switch (t) {
1478
- case "get":
1479
- case "delete":
1480
- return (r = await this.client[t](a, { params: o })) == null ? void 0 : r.data;
1481
- case "post":
1482
- case "put":
1483
- return (n = await this.client[t](a, i, { params: o })) == null ? void 0 : n.data;
1484
- }
1485
- }
1486
- async integrateChatbox(t, a, i = !1) {
1487
- let o = {
1488
- message: "",
1489
- data: null
1490
- };
1491
- const r = async () => (o = await a(), o);
1492
- return i && this.chatboxRef ? await this.chatboxRef.ask(t, r) : await r(), o;
1493
- }
1494
- async getItemIngredients(t, a = !1) {
1495
- const i = {
1496
- action: "get",
1497
- path: "items/ingredients",
1498
- params: { item_name: t.name }
1499
- }, o = `Suggest ingredients for ${t.name}`;
1500
- this.log({ message: o, query: i });
1501
- const r = await this.integrateChatbox(
1502
- o,
1503
- async () => ({
1504
- message: "",
1505
- data: {
1506
- value: await this.query(i),
1507
- action: "selection"
1508
- }
1509
- }),
1510
- a
1511
- ) || [];
1512
- return this.log({ message: r == null ? void 0 : r.message, value: r == null ? void 0 : r.data }), r;
1513
- }
1514
- async getItemDescription(t, a = !1) {
1515
- const i = {
1516
- action: "get",
1517
- path: "items/description",
1518
- params: { item_name: t.name }
1519
- }, o = `Suggest description for ${t.name}`;
1520
- this.log({ message: o, query: i });
1521
- const r = await this.integrateChatbox(
1522
- o,
1523
- async () => {
1524
- const n = await this.query(i);
1525
- return {
1526
- message: n || "",
1527
- data: {
1528
- value: n
1529
- }
1530
- };
1531
- },
1532
- a
1533
- );
1534
- return this.log({ message: r == null ? void 0 : r.message, value: r == null ? void 0 : r.data }), r;
1535
- }
1536
- async getItemPricing(t, a = !1) {
1537
- const i = {
1538
- action: "get",
1539
- path: "items/pricing",
1540
- params: {
1541
- item_name: t.name,
1542
- lat: t.lat || 4.210484,
1543
- lon: t.lon || 101.975769
1544
- }
1545
- }, o = `Suggest pricing for ${t.name}`;
1546
- this.log({ message: o, query: i });
1547
- const r = await this.integrateChatbox(
1548
- o,
1549
- async () => {
1550
- const n = await this.query(i);
1551
- let c = (n.match(/\d+(\.\d+)?/g) || []).map((p) => parseFloat(p));
1552
- return c = [...new Set(c)], c.sort((p, d) => p - d), {
1553
- message: n,
1554
- data: {
1555
- value: c,
1556
- action: "selection"
1557
- }
1558
- };
1559
- },
1560
- a
1561
- );
1562
- return this.log({ message: r == null ? void 0 : r.message, value: r == null ? void 0 : r.data }), r;
1563
- }
1564
- async autocompleteIngredient(t, a = !1) {
1565
- const i = {
1566
- action: "get",
1567
- path: "ingredients/autocomplete",
1568
- params: { input: t.name }
1569
- }, o = `Autocomplete ingredients for ${t.name}`;
1570
- this.log({ message: o, query: i });
1571
- const r = await this.integrateChatbox(
1572
- o,
1573
- async () => {
1574
- const n = await this.query(i);
1575
- return {
1576
- message: n || "",
1577
- data: { value: n || "" }
1578
- };
1579
- },
1580
- a
1581
- );
1582
- return this.log({ message: r == null ? void 0 : r.message, value: r == null ? void 0 : r.data }), r;
1583
- }
1584
- close(t) {
1585
- var a;
1586
- this.log({ value: t }), (a = this.onClose) == null || a.call(this, this.id);
1587
- }
1588
- }
1589
- class Ba {
1590
- constructor(t, a) {
1591
- this.sessions = [], this.context = t, this.chatboxRef = a, this.client = k.create({ baseURL: t.url }), this.setToken(t.token);
1592
- }
1593
- setToken(t) {
1594
- this.client.defaults.headers.common.Authorization = `Bearer ${t}`;
1595
- }
1596
- setChatboxRef(t) {
1597
- this.chatboxRef = t;
1598
- }
1599
- startSession(t, a) {
1600
- const i = new ja({
1601
- context: t,
1602
- client: this.client,
1603
- chatboxRef: this.chatboxRef || a || null,
1604
- onClose: (o) => this.closeSession(o)
1605
- });
1606
- return this.sessions.push(i), i;
1607
- }
1608
- closeSession(t) {
1609
- this.sessions = this.sessions.filter((a) => a.id !== t);
1610
- }
1611
- }
1612
- function bi(e) {
1613
- const t = I(new Ba(e)), a = ie(() => t.value.sessions || []), i = ie(() => {
1614
- var c;
1615
- return (c = t.value.sessions) == null ? void 0 : c[t.value.sessions.length - 1];
1616
- });
1617
- function o(c) {
1618
- t.value.setChatboxRef(c);
1619
- }
1620
- function r(c) {
1621
- var p;
1622
- return (p = t.value.chatboxRef) == null || p.clear(), t.value.startSession(c);
1623
- }
1624
- function n(c) {
1625
- t.value.setToken(c);
1626
- }
1627
- return {
1628
- linkChatbox: o,
1629
- startSession: r,
1630
- closeSession: (c) => {
1631
- var p;
1632
- return (p = i == null ? void 0 : i.value) == null ? void 0 : p.close(c);
1633
- },
1634
- setToken: n,
1635
- getItemDescription: (...c) => {
1636
- var p;
1637
- return (p = i.value) == null ? void 0 : p.getItemDescription(...c);
1638
- },
1639
- getItemPricing: (...c) => i.value.getItemPricing(...c),
1640
- getItemIngredients: (...c) => i.value.getItemIngredients(...c),
1641
- autocompleteIngredient: (...c) => i.value.autocompleteIngredient(...c),
1642
- session: i,
1643
- sessions: a
1644
- };
1645
- }
1646
- const at = (e) => (rt("data-v-97b727dd"), e = e(), nt(), e), Fa = {
1647
- class: "chatbox",
1648
- id: "chatbox"
1649
- }, Ma = { class: "user-name" }, $a = {
1650
- key: 0,
1651
- class: "message-bubble"
1652
- }, za = /* @__PURE__ */ at(() => /* @__PURE__ */ q("div", { class: "spinner" }, [
1653
- /* @__PURE__ */ q("div", { class: "bounce1" }),
1654
- /* @__PURE__ */ q("div", { class: "bounce2" }),
1655
- /* @__PURE__ */ q("div", { class: "bounce3" })
1656
- ], -1)), Ga = [
1657
- za
1658
- ], Va = {
1659
- key: 1,
1660
- class: "message-bubble message"
1661
- }, Ha = {
1662
- key: 2,
1663
- class: "selection-container"
1664
- }, Ja = /* @__PURE__ */ at(() => /* @__PURE__ */ q("div", { class: "message select-label" }, "Suggestion:", -1)), Wa = ["id", "onClick"], Ka = /* @__PURE__ */ ce({
1665
- __name: "Chatbox",
1666
- emits: ["select"],
1667
- setup(e, { expose: t, emit: a }) {
1668
- const i = I([]), o = a;
1669
- async function r(d, s) {
1670
- i.value.push({
1671
- isUser: !0,
1672
- message: d,
1673
- data: null
1674
- }), c();
1675
- let m = {
1676
- isUser: !1,
1677
- message: "waiting response...",
1678
- data: null,
1679
- isLoading: !0
1680
- };
1681
- const f = i.value.push(m) - 1;
1682
- console.log(f), c();
1683
- let g;
1684
- try {
1685
- g = await s(), i.value[f].data = g.data, i.value[f].message = g.message;
1686
- } catch (u) {
1687
- console.error(u), i.value[f].message = "failed to response";
1688
- } finally {
1689
- i.value[f].isLoading = !1;
1690
- }
1691
- return i.value = [...i.value], c(), g;
1692
- }
1693
- function n(d) {
1694
- o("select", d);
1695
- }
1696
- function c() {
1697
- setTimeout(() => {
1698
- const d = document.getElementById("chatbox");
1699
- d.scrollTop = d.scrollHeight;
1700
- }, 100);
1701
- }
1702
- function p() {
1703
- i.value = [];
1704
- }
1705
- return t({
1706
- ask: r,
1707
- clear: p
1708
- }), (d, s) => (x(), R("div", Fa, [
1709
- (x(!0), R(be, null, ye(i.value, (m, f) => {
1710
- var g;
1711
- return x(), R("div", {
1712
- key: f,
1713
- class: ot(m.isUser ? "user-message" : "remy-message")
1714
- }, [
1715
- q("div", Ma, Q(m.isUser ? "" : "Remy"), 1),
1716
- m.isLoading ? (x(), R("div", $a, Ga)) : m.message ? (x(), R("div", Va, Q(m.message), 1)) : he("", !0),
1717
- ((g = m.data) == null ? void 0 : g.action) === "selection" && m.data.value.length > 0 ? (x(), R("div", Ha, [
1718
- Ja,
1719
- (x(!0), R(be, null, ye(m.data.value, (u, v) => (x(), R("div", {
1720
- class: "message-bubble message selection",
1721
- key: v,
1722
- id: `remy-chatbox-selection-${v}`,
1723
- onClick: () => n(u)
1724
- }, Q(u), 9, Wa))), 128))
1725
- ])) : he("", !0)
1726
- ], 2);
1727
- }), 128))
1728
- ]));
1729
- }
1730
- }), Ya = (e, t) => {
1731
- const a = e.__vccOpts || e;
1732
- for (const [i, o] of t)
1733
- a[i] = o;
1734
- return a;
1735
- }, Qa = /* @__PURE__ */ Ya(Ka, [["__scopeId", "data-v-97b727dd"]]), Xa = {
1736
- install(e) {
1737
- e.component("Chatbox", Qa);
1738
- }
1739
- };
1740
- function Za(e, t) {
1741
- const a = I({ top: 0, bottom: 0, left: 0, right: 0 });
1742
- function i() {
1743
- if (e.value) {
1744
- const o = e.value.getBoundingClientRect();
1745
- a.value = {
1746
- top: o.top,
1747
- bottom: o.bottom,
1748
- left: o.left,
1749
- right: o.right
1750
- };
1751
- }
1752
- }
1753
- return fe(t, async () => {
1754
- await ve(), i();
1755
- }), fe(e, async (o) => {
1756
- o && (await ve(), i());
1757
- }), lt(() => {
1758
- window.addEventListener("resize", i);
1759
- }), st(() => {
1760
- window.removeEventListener("resize", i);
1761
- }), a;
1762
- }
1763
- const ei = /* @__PURE__ */ ce({
1764
- __name: "FullWrapper",
1765
- setup(e) {
1766
- const t = bt(), a = I(null), i = Za(a), o = ie(() => {
1767
- var c;
1768
- const n = t.isAtMost("sm") ? 56 : 0;
1769
- return {
1770
- height: `calc(100dvh - ${((c = i.value) == null ? void 0 : c.top) + 24 + n}px)`
1771
- };
1772
- });
1773
- return (r, n) => (x(), R("div", {
1774
- ref_key: "wrapper",
1775
- ref: a,
1776
- style: ct(o.value)
1777
- }, [
1778
- ut(r.$slots, "default")
1779
- ], 4));
1780
- }
1781
- }), ti = { class: "flex justify-center items-center h-full w-full" }, ai = /* @__PURE__ */ ce({
1782
- __name: "PageLoading",
1783
- setup(e) {
1784
- return (t, a) => {
1785
- const i = dt("FmCircularProgress");
1786
- return x(), pt(ei, null, {
1787
- default: mt(() => [
1788
- q("div", ti, [
1789
- gt(i, { size: "xl" })
1790
- ])
1791
- ]),
1792
- _: 1
1793
- });
1794
- };
1795
- }
1796
- }), b = (e) => _t({
1797
- loader: e,
1798
- loadingComponent: ai
1799
- });
1800
- function yi() {
1801
- const e = I({}), t = (a) => {
1802
- var i;
1803
- ((i = a.data) == null ? void 0 : i.type) === "publish-notifier" && (e.value = a.data.data);
1804
- };
1805
- return window.addEventListener("message", t), { navigatorStatus: e, stop: () => window.removeEventListener("message", t) };
1806
- }
1807
- const ii = /* @__PURE__ */ JSON.parse(`{"title":"Menu","common":{"actions":{"update":"Update","cancel":"Cancel","add":"Add","search":"Search","delete":"Delete","remove":"Remove","deselect_all":"Deselect all","move":"Move","edit":"Edit","download":"Download","save":"Save","confirm":"Confirm","yes":"Yes","no":"No","link":"Link","migrate":"Migrate","add_new_variant":"Add new variant","add_group":"Add group","apply_product":"Apply product","link_product":"Link product","deselect":"Deselect"},"labels":{"name":"Name","detail":"Detail","items_linked":"{count} items linked","search_placeholder":"Search {type}","symbol":"Symbol","products_linked":"{count} product(s) linked","product_linked_singular":"{count} product linked","product_linked_plural":"{count} products linked","enter_name":"Enter name here","product":"Product","selected_items":"{count} items selected","all":"All","category":"Category: {name}","group_name":"Group name","min_select":"Min. select","max_select":"Max. select","group_type":"Group type","stackable":"Stackable","stackable_sublabel":"Customer can choose same option more than once","configuration":"Configuration","variant":"Variant","product_title":"Product title","price":"Price ({symbol})","order_from":"Order from","inventory":"Inventory","search_groups":"Search groups","search_variants":"Search variants","product_count":"{count} product(s) applied","search_product":"Search product","product_image":"Product image","optional":"(optional)","products_selected":"{count} product(s) selected","items_selected":"{count} item(s) selected","catalog":"Catalog","scheduler":"Scheduler","all_time":"All time","main":"Main","unknown":"Unknown","all_day":"All Day","summary":"Summary","scheduler_title":"Scheduler: {label}","link_product_title":"Link product","products_count":"{count} product(s) selected","search":"Search","status":"Status"},"dialog":{"remove_confirmation":"Are you sure to remove {name}?","change_type":{"title":"Change addon group type","message":"Change addon group type will clear all products. Are you sure to proceed?"},"remove":{"catalog":{"title":"Remove catalog","message":"Are you sure to remove {name}?"},"category":{"title":"Remove category","message":"Are you sure to remove {name}?"},"subcategory":{"title":"Remove subcategory","message":"Are you sure to remove {name}?"},"product":{"title":"Remove products","message":"Are you sure to remove {name}?","success":"Product successfully removed."},"recipe":{"title":"Remove recipe","message":"Do you want to remove recipe {name}?"},"ingredient":{"title":"Remove ingredient","message":"Do you want to remove ingredient {name}?"},"takeaway":{"title":"Remove takeaway","message":"Do you want to remove {name}?"},"unit":{"title":"Remove unit","message":"Do you want to remove unit {name}?"},"variant":{"title":"Remove variant","message":"Do you want to remove {name}?"}}},"validation":{"required":"{field} is required","min_max":"Min. select must be less than or equal to Max. select","product_title_required":"Product title is required","min_value":"Min value is {value}","max_value":"Max value is {value}","field_required":"The {field} is required","required_field":"Required","invalid_amount":"Invalid amount","max_default_items":"Number of default item(s) can't be larger than {max}","min_exceeds_available_items":"Min. select ({min}) cannot be greater than available items ({available}) when stackable is disabled","default_items_tip":"{count} / {max} default product(s) selected, default products are auto selected when ordering."},"file":{"accepts":"Accepts .jpg, .jpeg, .png, .gif"},"empty":{"no_group":{"title":"No group found","subtitle":"Seems like you don't have groups created"},"no_variant":{"title":"No variant found","subtitle":"Seems like you don't have variants created"}}},"category":{"title":"Category","add":"Add category","detail":"Category detail","name":"Category name","empty":{"title":"Group your products into category","subtitle":"Use category to organize your products.","no_group":{"title":"No group found","subtitle":"Seems like you don't have groups created"}},"columns":{"title":"Category title","products":"Apply products"},"dialog":{"remove":{"title":"Remove category","error":"Can't delete this category"},"add":{"title":"Add Category","name":{"label":"Category name","placeholder":"Enter category name here","required":"Category name is required"}}},"products":{"title":"Product","add":"Add product","linked_count":"{count} product(s) linked","search":"Search","columns":{"name":"Product name","code":"Product code"}},"selector":{"all":"All","title":"Category: {label}"},"manager":{"dialog":{"add":{"title":"Add Category","action":"Create"},"update":{"title":"Update Category","action":"Update"}}}},"subcategory":{"title":"Subcategory","add":"Add subcategory","detail":"Subcategory detail","name":"Subcategory name","empty":{"title":"Group your products into subcategory","subtitle":"Use subcategory to organize your products."},"columns":{"title":"Subcategory title"},"dialog":{"remove":{"title":"Remove subcategory","error":"Can't delete this subcategory"},"add":{"title":"Add Subcategory","name":{"label":"Subcategory name","placeholder":"Enter subcategory name here","required":"Subcategory name is required"}}},"manager":{"dialog":{"add":{"title":"Add Subcategory","action":"Create"},"update":{"title":"Update Subcategory","action":"Update"}}}},"variant":{"title":"Variant","add":"Add variant","columns":{"name":"Variant name","options":"Option values","applied_products":"Applied products"},"mobile":{"value":"Value: {values}"},"empty":{"title":"Add variant","subtitle":"Variant configuration provides merchants with the capability to offer customizable product options.","no_variant":{"title":"No variant found","subtitle":"Seems like you don't have variants created"}},"select":{"title":"Select variant","subtitle":"Select variant to apply changes"},"form":{"title":{"add":"Add variant","edit":"Edit variant"},"detail":"Variant detail","name":{"label":"Variant name","placeholder":"Cup sizes","helper":"Name this set of options. For example, you could call this option set Cup sizes or Sugar levels.","required":"Variant name is required"},"options":{"title":"Option values","placeholder":"Options","min_required":"Required at least 1 option","name_required":"Option name is required"},"applied_product":"Applied product"}},"unit":{"title":"Unit","add":"Add unit","update":"Update unit","precision":"Precision","precision_placeholder":"Enter a number","empty":{"title":"Add your first unit","subtitle":"Units are used to specify how you want to measure your products."},"columns":{"name":"Name","symbol":"Symbol"},"measurement":{"add":"Add measurement","title":"Measurement {number}","name":"Name","symbol":"Symbol","conversion":"Conversion","preview":"1 {name} equal to {value} {unit}","preview_label":"Preview"}},"print_dept":{"title":"Print Route","add":"Add print route","update":"Edit print route","columns":{"name":"Print route name","products":"Applied product"}},"sku":{"title":"Ingredient","add":"Add ingredient","update":"Update ingredient","columns":{"code":"Code","name":"Name","unit":"Unit"},"empty":{"no_unit":"No unit found","subtitle":"Add a unit to start adding your ingredient."},"validation":{"code_used":"Code used by other ingredient"},"errors":{"select_recipe_ingredient":"Select recipe or ingredient to convert"},"convertible":{"label":"Convertible","sublabel":"Convertible from other recipe or ingredients","convert_to":"Recipes and ingredients convert to"}},"recipe":{"title":"Recipe","add":"Add recipe","update":"Update recipe","columns":{"name":"Name"},"validation":{"bind_required":"Bind at least one recipe or ingredient"},"table":{"columns":{"name":"Name","ingredients":"Ingredients"},"search":{"placeholder":"Search recipes"}},"empty":{"title":"Add your first recipe","subtitle":"Create recipes to standardize your food preparation process","action":"Add recipe"},"actions":{"add":"Add recipe"}},"serving_sequence":{"title":"Serving sequence","add":"Add sequence","update":"Update sequence","columns":{"name":"Sequence name"},"empty":{"title":"No serving sequence","subtitle":"Set up the order in which your dishes are served, ensuring a smooth and organized dining experience."}},"group":{"title":"Group","add":"Add Group","update":"Update group","form":{"tagging":{"title":"Tagging","subtitle":"Group your groups by tags to streamline reporting and management"}},"option":{"title":"Product","subtitle":"Unlinked variant's orderFrom will be set to None","link_products":"Link products","add_option":"Add option","product_title":"Title","product_title_required":"Product title is required","price":"Price ({symbol})","inventory":"Inventory","variant":"Variant","code":"Code","is_default":"Default","should_link_at_least_one_variant":"Should link at least one variant of {name}"},"types":{"normal":"Normal","product":"Product","dynamic":"Dynamic"},"select":{"title":"Select group","subtitle":"Select group to apply changes"},"empty":{"title":"No group found","subtitle":"Seems like you don't have addon groups created."},"search":{"placeholder":"Search groups"},"type":{"title":"Group: {type} type","all":"All type","normal":"Normal type","product":"Product type","dynamic":"Dynamic type"},"list":{"items_linked":"{count} items linked","products_linked":"{count} product(s) linked","columns":{"name":"Group name","products":"Products","type":"Type","applied_products":"Applied products"},"types":{"normal":"Normal","product":"Product","dynamic":"Dynamic"},"variants":"{ count } variant","more_items":"& { count } more"},"actions":{"add":"Add group","duplicate":{"title":"Duplicate group","message":"Are you sure to duplicate {name}?"},"apply_product":"Apply product","duplicate_action":"Duplicate"},"dialogs":{"delete":{"title":"Delete group","message":"Do you want to delete {name}?","unlink_warning":"The following {count} item(s) will be unlinked:"},"update":{"title":"Update group"}},"validation":{"name_duplicate":"Group name already exists"}},"migrate":{"title":"Migrate to new version","description":"Do you want to migrate to new version? Once migrate it will unable to revert to the older version.","message":"Migrate your menu to new version to enjoy more features. Content of new menu will remain the same as current.","notification":{"title":"New version of menu is out now!","description":"Migrate your current menu version to the latest to enjoy more features such as product sequential dispatch, serving sequence, scheduler and more! Your content and current setting will be preserved."},"errors":{"no_restaurant":"Required at least one restaurant to migrate","pos_version":"Upgrade POS to V{version} to use new menu: {restaurants}"}},"scheduler":{"title":"Scheduler","select":{"title":"Select scheduler","all_time":"All time"},"empty":{"title":"No scheduler found","subtitle":"Add a scheduler to schedule time for your product to display.","action":"Add scheduler"},"table":{"columns":{"name":"Scheduler name","repeat":"Repeat","period":"Period","products":"Apply product"},"products_linked":"{count} item linked","search":{"placeholder":"Search schedulers"}},"repeat":{"daily":"Daily","weekdays":"Weekdays","weekends":"Weekends","except":"Daily except {day}","range":"{start} to {end}"},"days":{"monday":"Monday","tuesday":"Tuesday","wednesday":"Wednesday","thursday":"Thursday","friday":"Friday","saturday":"Saturday","sunday":"Sunday"},"dialog":{"add":{"title":"Add scheduler","action":"Add"},"update":{"title":"Update scheduler","action":"Update"},"sections":{"detail":{"title":"Scheduler detail","name":{"label":"Scheduler name","placeholder":"Placeholder","required":"Required"}},"availability":{"title":"Availability","daily":"Daily","weekly":"Weekly"},"period":{"title":"Active period","all_day":"All day","custom":"Custom period","add":"Add period","overlap":"Time periods cannot overlap. Please adjust the periods so they don't overlap or touch."},"autolink":{"title":"Autolink product","label":"Auto link product","sublabel":"Automatically link products based on filters","all_items":"Auto link all items","filter_message":"Auto link items matching following filters.","tooltip":"You can use wildcards ('*' for any characters, '$' for any numeric characters) in filter values. For example, A*1 matches A1, AG1, AC51, but not A2, B1, C9, A$ matches A1, A11, A124 but not AQ1, AG1, AC"},"filter":{"add":"Add filter","matches":"matches","or":"or","types":{"code":"Code","category":"Category"},"placeholder":{"category":"Select category"}},"products":{"title":"Apply product","link":"Link product"}},"actions":{"cancel":"Cancel"}},"dialogs":{"remove":{"title":"Remove scheduler","message":"Are you sure to remove scheduler {name}?"}}},"revert":{"title":"Revert menu","description":"Revert {name}'s menu to the last published version. Delivery catalog will be set to Main if it's not in last published version.","labels":{"restaurant":"Restaurant","revert_to":"Revert to","default":"Default","pos_takeaway":"POS Takeaway","pickup":"Pick up","additional_catalogs":"Additional catalogs"}},"remy":{"title":"Remy","description":"Your AI assistant","actions":{"start":"Start with Remy","close":"Close Remy"},"messages":{"welcome":"Hi! I'm Remy, your AI assistant. How can I help you today?","thinking":"Thinking...","error":"Sorry, I encountered an error. Please try again."}},"picker":{"title":"Select {type}","search":"Search {type}","no_results":"No {type} found","selected":"{count} selected"},"apply_product":{"title":"Apply product","link":{"title":"Link product","subtitle":"Link products to apply changes"},"table":{"category_count":"{name} ({count})","inventory":"Inventory","value":"Value: {values}"}},"catalog":{"title":"Catalog","detail":"Catalog Detail","main":"Master product","form":{"name":"Catalog name","tax":{"title":"Tax calculation","auto":{"label":"Automatic","sublabel":"All price default to exclusive, when order through delivery company it will automatically become tax inclusive"},"manual":{"label":"Manual","sublabel":"You can specify own tax calculation for this catalog"},"inclusive":"{code} inclusive"},"link":{"title":"Link product configuration","auto_link":{"label":"Auto link item","sublabel":"Auto-link products to the main catalog for availability"},"options":{"all":"Available for all","pos_only":"Order on POS only"}},"markup":{"title":"Price markup configuration","auto":{"label":"Auto markup price","sublabel":"Auto-markup prices for catalog, groups, and schedules"},"add":"Add markup configuration","config":"Configuration {number}","percentage":"Markup percentage: {value}%","products":"{count} product(s) linked","all_items":"Apply for all items"},"restaurant_attributes_title":"Restaurant Attributes"},"validation":{"name_used":"Catalog name used","name_required":"Catalog name is required"},"edit":{"back":"Back to catalog","export":"Export","import":"Import","link_product":"Link product","apply_scheduler":"Apply scheduler","tabs":{"product":"Product","category":"Category","group":"Group","takeaway":"Takeaway","setting":"Setting"},"scheduler":{"remove":{"title":"Remove scheduler","message":"Are you sure to remove scheduler {name}?"}}},"usage":{"title":"Catalog usage","tax_calculation":"Tax calculation","products":"{count} products","restaurant":"Restaurant","usage":"Usage"},"table":{"columns":{"title":"Catalog title","tax_calculation":"Tax calculation","auto_link":"Auto link item"}},"empty":{"title":"Build your menu catalog","subtitle":"Organize your menu with a catalog. Add products, set prices, and customize for dine-in, takeout, or delivery."},"actions":{"add":"Add catalog","view_usage":"Catalog usage"},"dialogs":{"remove":{"title":"Remove catalog","message":"Are you sure to remove {name}?","error":"Catalog used by {restaurants} restaurants"}}},"currency":{"input":{"field":"field"}},"order":{"from":{"options":{"all":"Available for all","pos_only":"POS only","none":"None"}}},"inventory":{"title":"Inventory","subtitle":"Adjust ingredient and customise recipe for your product","columns":{"product_name":"Product name","ingredient":"Ingredient","recipe":"Recipe"},"status":{"sku_linked":"{count} sku linked","recipe_linked":"{count} recipe linked","not_set":"Not set"},"dialog":{"title":"{name} inventory"},"form":{"title":"Inventory","product_name":"Product name"},"binding":{"recipe":{"title":"Recipe","columns":{"name":"Recipe","amount":"Amount"}},"ingredient":{"title":"Ingredient","columns":{"name":"Ingredient","amount":"Amount","unit":"Unit"},"select_unit":"Select Unit","loop_warning":"Opps! there's a loop detected on this {type}. Please verify or remove it."},"link":{"title":"Link {type}","recipe":"recipe","ingredient":"ingredient"}}},"link_product":{"title":"Apply products","rules":{"title":"Link products rules","section_title":"Configure advanced linking by rules","order_from":"Order from","restaurant_filter":"Restaurant filter","restaurant_custom_attributes_filter":"Restaurant tagging filter","item_filter":"Product filter","item_custom_attributes_filter":"Product tagging filter","add_rule":"Add rule","hint":"Link products to restaurants based on specific tags or attributes. Product attributes are sourced from the main catalog instead of a subcatalog."}},"catalog_scheduler":{"title":"Update product from","subtitle":"Select the catalog and scheduler you wanted to update your product"},"apply_products":{"category":{"count":"{selected}/{total}"}},"markup":{"dialog":{"title":{"add":"Add markup configuration","update":"Update markup configuration"},"fields":{"percentage":{"label":"Markup percentage","placeholder":"0","required":"Markup percentage is required"}},"options":{"all":"Apply for all products","custom":"Custom products"},"products":{"link":"Link product","count":"{count} product(s) linked"}}},"import":{"dialog":{"title":"Import products","subtitle":"Please select menu or addonGroup file to upload","info":"Please don't change any header line from the original template otherwise the import will fail.","fields":{"type":"Menu type","file":{"replace":"Replace file"}},"actions":{"import":"Import"},"errors":{"select_file":"Please select a file to import"},"button":{"label":"Add files"}}},"product":{"form":{"title":{"add":"Add product","update":"Update product"},"summary":{"title":"Product summary","fields":{"code":"Product code","name":"Product name","category":"Category","order_from":"Order from","selling_price":"Selling price","tax":"Tax","inventory":"Inventory","takeaway":"Takeaway"}},"sections":{"general":{"title":"General setting","description":"Use a different general setting"},"tagging":{"title":"Tagging","subtitle":"Group your products by tags to streamline reporting and management"},"price":{"title":"Update price","description":"Use a different price setting"},"print":{"title":"Update print","description":"Use a different print setting"},"variant":{"title":"Update variant","description":"Use a different variant setting"},"group":{"title":"Update group","description":"Use a different group setting"},"inventory":{"title":"Update inventory","description":"Use a different inventory setting"},"takeaway":{"title":"Update takeaway","description":"Use a different takeaway setting"}},"detail":{"title":"Product detail","fields":{"code":{"label":"Product code","placeholder":"No code"},"name":{"label":"Product name","required":"Name is required","duplicate_warning":"This product shares the same name as {count} other items. They will be grouped as one product in reports."},"description":{"label":"Description","optional":"(optional)","placeholder":"No description"}},"category":{"label":"Categories","label_singular":"Category","required":"Category is required","placeholder":"Select categories to structure your menu","add_new":"Add new Category","add_first":"Please add a product category first","options":{"product":{"label":"Sell as product with add on","sublabel":"Product will appear as a-lar-carte"},"addon":{"label":"Sell as add-on only","sublabel":"Product will appear as add-on only"}}},"subcategory":{"label":"Subcategory","required":"Subcategory is required","add_new":"Add new subcategory"},"path":{"label":"Subcategory - menu path","placeholder":"Select subcategories to structure your menu, e.g. Coffee/Latte","helperText":"Add sub-categories to structure your menu"},"order_from":{"label":"Order from","default":"Follows main"}},"group":{"title":"Groups","subtitle":"Add group to your product to sell them as a combo set","add":"Add group","circularError":"Circular linking detected, group {groupName} is already linked to product {productName}","columns":{"title":"Group title","type":"Type"}},"price":{"title":"Price","fields":{"selling_price":{"label":"Selling price","required":"Price is required"},"tax":{"label":"Tax options not available","label_with_code":"{code} (applicable if restaurant profile {code} is set)"}},"settings":{"title":"Price setting","open_price":{"label":"Open price","sublabel":"Allow adjust price without permission"},"sell_by_unit":{"label":"Sell by unit","sublabel":"Sell products by specific units (weight, length, etc.).","per_unit":{"label":"Per","placeholder":"Enter amount","required":"Per unit is required","min":"Per unit must be greater than 0"},"unit":{"placeholder":"Enter unit","required":"Unit is required"}},"track_costing":{"label":"Track costing"},"min_price":{"label":"Has a minimum price after apply discount"}}},"print":{"title":"Printing","config":{"label":"Printing configuration","group_parent":{"label":"Group with parent","sublabel":"Print this product with its parent when serving as an Add-On"}},"kds":{"label":"KDS configuration","options":{"all":{"label":"All at once","description":"Send products to all departments simultaneously for faster preparation"},"sequential":{"label":"Sequential Dispatch","description":"Send the product to each department sequentially for step-by-step preparation"}}},"routes":{"label":"Linked routes","add":"Add route"}},"takeaway":{"title":"Takeaway","subtitle":"Select a takeaway charge to your products","columns":{"variant":"Product & Variant","product":"Product","takeaway":"Takeaway"},"options":{"follows_main":"Follows main","no_preset":"No preset takeaway","add_new":"Add new Takeaway"}},"variant":{"title":"Variants","subtitle":"Add options like size, color or types","add":"Add variant","columns":{"variant":"Variant","code":"Code","order_from":"Order from","price":"Price","min_price":"Min price"},"validation":{"max_variants":"You can only add up to {max} variants"},"placeholders":{"no_code":"No code","follow_general":"Follow general"}}},"empty":{"with_create":{"title":"Add your products","subtitle":"Start by stocking your store with products your customers will love","action":"Add product"},"no_scheduler":{"title":"No product linked","subtitle":"Add product in this catalog by linking products from main catalog."},"with_scheduler":{"title":"No product applied","subtitle":"Apply product in this scheduler by linking products from main catalog."}},"table":{"columns":{"code":"Code","name":"Product name","category":"Categories","price":"Price ({ currency })","order_from":"Order from","tagging":"Tag"},"category":{"all":"All categories","collapse":"Collapse","expand":"+ {count} more"},"tagging":{"all":"All tagging","collapse":"Collapse","expand":"+ {count} more"},"bulk_edit":{"title":"Bulk edit products","actions":{"reset_all":"Reset all","save":"Save"}},"selection":{"count":"{count} items selected","actions":{"deselect_all":"Deselect all","remove":"Remove"}},"empty":{"title":"Add your products","subtitle":"Start by stocking your store with products your customers will love","actions":{"add":"Add product","import":"Import"}},"search":{"placeholder":"Search products"},"validation":{"name_required":"Name is required","price_min":"Price must be greater or equal than 0"}}},"setting":{"catalog":{"title":"Catalog Detail","fields":{"name":{"label":"Catalog name","required":"Catalog name is required","used":"Catalog name used"}},"warnings":{"delivery":"This catalog is being use by delivery company and other order method. This may cause wrong price calculation, please review the price for each catalog usage."}},"tax":{"title":"Tax calculation","modes":{"auto":{"label":"Automatic","sublabel":"All price default to exclusive, when order through delivery company it will automatically become tax inclusive"},"manual":{"label":"Manual","sublabel":"You can specify own tax calculation for this catalog"}},"inclusive":"{code} inclusive"},"link":{"title":"Link product configuration","auto_link":{"label":"Auto link item","sublabel":"Auto-link products to the main catalog for availability"},"options":{"all":"Available for all","pos_only":"Order on POS only"}},"markup":{"title":"Price markup configuration","auto_markup":{"label":"Auto markup price","sublabel":"Auto-markup prices for catalog, groups, and schedules"},"add":"Add markup configuration","config":"Configuration {number}","percentage":"Markup percentage: {value}%","products":{"all":"Apply for all products","linked":"{count} product(s) linked"}}},"takeaway":{"actions":{"add":"Add takeaway"},"title":"Takeaway","add":"Add takeaway","update":"Update takeaway","columns":{"title":"Takeaway title","price":"Price"},"placeholders":{"title":"Enter takeaway title here"},"empty":{"title":"No takeaway found","subtitle":"Seems like you don't have takeaway created.","action":"Add takeaway"},"table":{"columns":{"name":"Takeaway name","price":"Price ({symbol})","products":"Apply products"},"items_linked":"{count} items linked","search":{"placeholder":"Search takeaways"}}},"thumbnail":{"alt":{"default":"item","with_name":"{name}"}},"cooking_guide":{"title":"Cooking guide","empty":{"title":"Add cooking guide","subtitle":"The cooking guide configuration tool enables merchants to establish standardized cooking instructions for dishes across multiple outlets.","action":"Add guide"},"table":{"columns":{"name":"Guide name","products":"Product linked","steps":"{count} step"},"search":{"placeholder":"Search guides"},"mobile":{"products_linked":"{count} products linked"}},"dialogs":{"remove":{"title":"Remove cooking guide","message":{"prefix":"Are you sure to remove cooking guide ","products_using":"There are ","products_count":" products using this cooking guide. "}}},"actions":{"add":"Add guide","remove":"Remove","cancel":"Cancel"},"dialog":{"add":{"title":"Add guide","action":"Add"},"update":{"title":"Update guide","action":"Update"},"sections":{"guide_detail":{"title":"Guide detail","name":{"label":"Guide name","placeholder":"Placeholder","required":"Required"}},"steps":{"title":"Steps","add":"Add step","empty":"No steps added yet"},"apply_product":{"title":"Apply product","link":"Link product","products_linked":"{count} product(s) linked","search":"Search"}},"actions":{"cancel":"Cancel"}},"step_dialog":{"add":{"title":"Add step","action":"Add"},"update":{"title":"Update step","action":"Update"},"sections":{"variables":{"title":"Variables","add":"Add variable","columns":{"key":"Key","value":"Value"},"placeholders":{"key":"key","value":"Default value"},"validation":{"required":"Required","lowercase":"Lower case alphabet only","duplicate":"Duplicate key"}},"instruction":{"title":"Instruction"}},"actions":{"cancel":"Cancel","back":"Back"}},"step_override_dialog":{"title":"Customize cooking step","columns":{"instructions":"Instructions","variables":"Variables","value":"Value"},"actions":{"save":"Save","cancel":"Cancel"}}},"ingredient":{"title":"Ingredient","empty":{"title":"Add your first ingredient","subtitle":"Ingredients are crucial components in food and beverages. Managing them involves sourcing quality products, ensuring storage compliance, and maintaining safety standards, as they significantly impact flavor and quality.","action":"Add ingredient"},"table":{"columns":{"code":"Code","name":"Name","unit":"Unit"},"search":{"placeholder":"Search ingredients"},"mobile":{"code":"Code: {code}","unit":"Unit: {unit}"}},"actions":{"add":"Add ingredient"}},"print_route":{"title":"Print route","empty":{"title":"No route found","subtitle":"Customize your printing destinations to ensure efficient order management by section.","action":"Add route"},"table":{"columns":{"name":"Print route name","products":"Product linked","products_count":"{count} products"},"search":{"placeholder":"Search routes"},"mobile":{"products_linked":"{count} product(s) linked"}},"dialogs":{"remove":{"title":"Remove print route","message":{"prefix":"Are you sure to remove print route? ","products_using":"There are ","products_count":" products using this print route. "}}},"actions":{"add":"Add route","remove":"Remove","cancel":"Cancel"},"department_dialog":{"add":{"title":"Add route","action":"Add"},"update":{"title":"Update route","action":"Update"},"sections":{"route_detail":{"title":"Route detail","name":{"label":"Route name","placeholder":"Placeholder","required":"Required"}},"link_product":{"title":"Link product","link":"Link product","products_linked":"{count} product(s) linked","search":"Search"}},"actions":{"cancel":"Cancel"}}},"products":{"title":"Products","actions":{"export":"Export","import":"Import","add":"Add product","link":"Link product","apply_scheduler":"Apply scheduler"}},"productInternalTools":{"title":"Product internal tools"},"publish":{"title":"Publish","table":{"columns":{"restaurant":"Restaurant","default":"Default","pos_takeaway":"POS takeaway","pickup":"Pick up","version":"Version"},"search":{"placeholder":"Search"},"status":{"latest":"Latest","outdated":"Outdated"}},"empty":{"title":"Create restaurant","subtitle":"You have not created any restaurant yet. Add a restaurant to start publishing menu","action":"Create restaurant"},"actions":{"publish":"Publish","publish_all":"Publish all","refresh":"Refresh","revert":"Revert Menu"},"labels":{"main_version":"Main version: {version}","catalog":{"main":"Main","invalid":"Invalid catalog"}},"update_catalog_dialog":{"title":"Update catalog","sections":{"default":{"label":"Default catalog","use_default":"Main"},"pos_takeaway":{"label":"POS takeaway catalog"},"pickup":{"label":"Pick up catalog"},"additional":{"title":"Additional catalog","subtitle":"Additional catalogs can be utilized by table & delivery"}},"actions":{"update":"Update","cancel":"Cancel"}}},"tax_setting":{"title":"Tax setting"},"menu_setting":{"title":"Menu setting","fields":{"low_stock":{"not_set":"Not set","must_be_integer":"Value must be an integer","title":"Product threshold for online orders","subtitle":"Disable online orders when stock falls below this limit","helper_text":"If stock reaches or drops below this number, the product will be prompted to be removed from online ordering","updated":"Menu setting updated"}},"tabs":{"menu_configuration":"Menu configuration","price_group":"Price group","link_product_rule_groups":"Link products rule groups"}},"rule_groups":{"title":"Link products rule groups","description":"Manage rule groups for linking products based on restaurant and item attributes","create_group":"Create rule group","edit_group":"Edit rule group","saved_successfully":"Rule group settings saved successfully","search_placeholder":"Search rule groups...","table":{"columns":{"name":"Name","description":"Description","rules_count":"Rules count"}},"form":{"basic_info":"Basic Information","name":"Name","name_placeholder":"Enter rule group name","description":"Description","description_placeholder":"Enter rule group description","rules":"Rules","rules_description":"Configure restaurant and item rules for this group"},"validation":{"name_required":"Name is required","at_least_one_rule_required":"At least one rule is required"},"delete_dialog":{"title":"Delete Rule Group","message":"Are you sure you want to delete '{name}'? This action cannot be undone.","success":"Rule group deleted successfully"}},"price_tier":{"price_group":"Price group","description":"Set different price groups for your products and link them to multiple catalogs","add_price_group":"Add price group","add_price_group_success":"Price group created successfully","group_title":"Group title","price_group_description":"Current catalog is linked to price group. Please manage price in main catalog.","delete_dialog":{"title":"Delete price group","message":"Are you sure to delete price group {name}?","success":"Price group deleted successfully"},"settings_table":{"columns":{"name":"Name"}},"form":{"table":{"columns":{"name":"Group title","price":"Selling price"}}},"price_tier_config":"Price group setting","link_price_tier":"Link price tiers","link_price_group":"Link price group","link_price_group_description":"Select a price group to apply it to a catalog. If no group is linked, the Base Price will be used by default.","not_linked":"Not linked","price_group_rule":"Price group rule","price_group_rule_description":"Link price group to restaurants with specific tags.","restaurant_filter":"Restaurant filter"},"tree_editor":{"title":"Menu management","actions":{"add_category":"Add new category","expand_all":"Expand all","collapse_all":"Collapse all","add_product":"Add product","delete_product":"Delete product","edit_category":"Edit category","delete_category":"Delete category","link_category_to_catalog":"Link category to catalog","link_product_to_catalog":"Link product to catalog","unlink_product_from_catalog":"Unlink product from catalog"},"labels":{"main_catalog":"Main catalog","all_time":"All time","products":"{count} product(s)","variants":"{count} variant(s)","groups":"{count} group(s)","addon":"Addon","unknown":"Unknown","please_select_a_product_to_edit":"Please select a product to edit","no_items":"No items to display"}}}`), oi = {
1808
- menu: ii
1809
- }, ri = /* @__PURE__ */ JSON.parse(`{"title":"เมนู","common":{"actions":{"update":"อัปเดต","cancel":"ยกเลิก","add":"เพิ่ม","search":"ค้นหา","delete":"ลบ","remove":"ลบออก","deselect_all":"ยกเลิกการเลือกทั้งหมด","move":"ย้าย","edit":"แก้ไข","download":"ดาวน์โหลด","save":"บันทึก","confirm":"ยืนยัน","yes":"ใช่","no":"ไม่ใช่","link":"ลิงก์","migrate":"ย้ายข้อมูล","add_new_variant":"เพิ่มตัวแปรใหม่","add_group":"เพิ่มกลุ่ม","apply_product":"ใช้เมนู","link_product":"ลิงก์เมนู","deselect":"ยกเลิกการเลือก"},"labels":{"name":"ชื่อ","detail":"รายละเอียด","items_linked":"เชื่อมโยง {count} รายการ","search_placeholder":"ค้นหา {type}","symbol":"สัญลักษณ์","products_linked":"เชื่อมโยง {count} เมนู","product_linked_singular":"เชื่อมโยง {count} เมนู","product_linked_plural":"เชื่อมโยง {count} เมนู","enter_name":"ป้อนชื่อที่นี่","product":"เมนู","selected_items":"เลือก {count} รายการ","all":"ทั้งหมด","category":"หมวดหมู่: {name}","group_name":"ชื่อกลุ่ม","min_select":"เลือกขั้นต่ำ","max_select":"เลือกสูงสุด","group_type":"ประเภทกลุ่ม","stackable":"ซ้อนได้","stackable_sublabel":"ลูกค้าสามารถเลือกตัวเลือกเดียวกันได้มากกว่าหนึ่งครั้ง","configuration":"การกำหนดค่า","variant":"ตัวแปร","product_title":"ชื่อเมนู","price":"ราคา ({symbol})","order_from":"สั่งซื้อจาก","inventory":"สินค้าคงคลัง","search_groups":"ค้นหากลุ่ม","search_variants":"ค้นหาตัวแปร","product_count":"ใช้ {count} เมนู","search_product":"ค้นหาเมนู","product_image":"รูปภาพเมนู","optional":"(ทางเลือก)","products_selected":"เลือก {count} เมนู","items_selected":"เลือก {count} รายการ","catalog":"แคตตาล็อก","scheduler":"ตัวกำหนดเวลา","all_time":"ตลอดเวลา","main":"หลัก","unknown":"ไม่ทราบ","all_day":"ตลอดทั้งวัน","summary":"สรุป","scheduler_title":"ผู้จัดกำหนดการ: {label}","link_product_title":"เชื่อมโยงเมนู","products_count":"เลือกเมนู {count} รายการ","search":"ค้นหา","status":"สถานะ"},"dialog":{"remove_confirmation":"คุณแน่ใจหรือไม่ที่จะลบ {name}","change_type":{"title":"เปลี่ยนประเภทกลุ่ม Add on","message":"การเปลี่ยนประเภทกลุ่ม Add on จะล้างจากเมนูทั้งหมด คุณแน่ใจหรือไม่ที่จะดำเนินการต่อ"},"remove":{"catalog":{"title":"ลบแคตตาล็อก","message":"คุณแน่ใจหรือไม่ที่จะลบ {name}"},"category":{"title":"ลบหมวดหมู่","message":"คุณแน่ใจหรือไม่ที่จะลบ {name}"},"subcategory":{"title":"ลบหมวดหมู่ย่อย","message":"คุณแน่ใจหรือไม่ว่าจะลบ {name}?"},"product":{"title":"ลบเมนู","message":"คุณแน่ใจหรือไม่ที่จะลบ {name}","success":"ลบเมนูออกเรียบร้อยแล้ว"},"recipe":{"title":"ลบสูตร","message":"คุณต้องการลบสูตร {name} หรือไม่"},"ingredient":{"title":"ลบส่วนผสม","message":"คุณต้องการลบส่วนผสม {name} หรือไม่"},"takeaway":{"title":"ลบรายการนำกลับบ้าน","message":"คุณต้องการลบ {name} หรือไม่"},"unit":{"title":"ลบหน่วย","message":"คุณต้องการลบหน่วย {name} หรือไม่"},"variant":{"title":"ลบตัวแปร","message":"คุณต้องการลบ {name} หรือไม่"}}},"validation":{"required":"{field} จำเป็นต้องระบุ","min_max":"การเลือกขั้นต่ำต้องน้อยกว่าหรือเท่ากับค่าสูงสุด เลือก","product_title_required":"จำเป็นต้องใส่ชื่อเมนู","min_value":"ค่าต่ำสุดคือ {value}","max_value":"ค่าสูงสุดคือ {value}","field_required":"{field} จำเป็นต้องกรอก","required_field":"จำเป็น","invalid_amount":"จำนวนไม่ถูกต้อง","max_default_items":"จำนวนสินค้าเริ่มต้นไม่สามารถมากกว่า {max} ได้","min_exceeds_available_items":"เลือกขั้นต่ำ ({min}) ไม่สามารถมากกว่าสินค้าที่มีจำหน่าย ({available}) เมื่อปิดการใช้งาน stackable","default_items_tip":"เลือกเมนูเริ่มต้น {count} / {max} รายการ เมนูเริ่มต้นจะถูกเลือกโดยอัตโนมัติเมื่อสั่งซื้อ"},"file":{"accepts":"ยอมรับ .jpg, .jpeg, .png, .gif"},"empty":{"no_group":{"title":"ไม่พบกลุ่ม","subtitle":"ดูเหมือนว่าคุณยังไม่ได้สร้างกลุ่ม"},"no_variant":{"title":"ไม่พบตัวแปร","subtitle":"ดูเหมือนว่าคุณยังไม่ได้สร้างตัวแปร"}}},"category":{"title":"หมวดหมู่","add":"เพิ่มหมวดหมู่","detail":"รายละเอียดหมวดหมู่","name":"ชื่อหมวดหมู่","empty":{"title":"จำเป็นต้องเลือกหมวดหมู่สำหรับเมนู","subtitle":"ใช้หมวดหมู่เพื่อจัดระเบียบเมนูของคุณ","no_group":{"title":"ไม่พบกลุ่ม","subtitle":"ดูเหมือนว่าคุณไม่ได้สร้างกลุ่ม"}},"columns":{"title":"ชื่อหมวดหมู่","products":"ใช้เมนู"},"dialog":{"remove":{"title":"ลบหมวดหมู่","error":"ไม่สามารถลบหมวดหมู่นี้ได้"},"add":{"title":"เพิ่มหมวดหมู่","name":{"label":"ชื่อหมวดหมู่","placeholder":"ป้อนชื่อหมวดหมู่ที่นี่","required":"จำเป็นต้องระบุชื่อหมวดหมู่"}}},"products":{"title":"เมนู","add":"เพิ่มเมนู","linked_count":"เชื่อมโยง {count} เมนูที่","search":"ค้นหา","columns":{"name":"ชื่อเมนู","code":"รหัสเมนู"}},"selector":{"all":"ทั้งหมด","title":"หมวดหมู่: {label}"},"manager":{"dialog":{"add":{"title":"เพิ่มหมวดหมู่","action":"สร้าง"},"update":{"title":"อัปเดตหมวดหมู่","action":"อัปเดต"}}}},"subcategory":{"title":"หมวดหมู่ย่อย","add":"เพิ่มหมวดหมู่ย่อย","detail":"รายละเอียดหมวดหมู่ย่อย","name":"ชื่อหมวดหมู่ย่อย","empty":{"title":"จัดกลุ่มผลิตภัณฑ์ของคุณเป็นหมวดหมู่ย่อย","subtitle":"ใช้หมวดหมู่ย่อยเพื่อจัดระเบียบผลิตภัณฑ์ของคุณ"},"columns":{"title":"ชื่อหมวดหมู่ย่อย"},"dialog":{"remove":{"title":"ลบหมวดหมู่ย่อย","error":"ไม่สามารถลบหมวดหมู่ย่อยนี้ได้"},"add":{"title":"เพิ่มหมวดหมู่ย่อย","name":{"label":"ชื่อหมวดหมู่ย่อย","placeholder":"ป้อนชื่อหมวดหมู่ย่อยที่นี่","required":"จำเป็นต้องระบุชื่อหมวดหมู่ย่อย"}}},"manager":{"dialog":{"add":{"title":"เพิ่มหมวดหมู่ย่อย","action":"สร้าง"},"update":{"title":"อัปเดตหมวดหมู่ย่อย","action":"อัปเดต"}}}},"variant":{"title":"ตัวเลือก","add":"เพิ่มตัวแปร","columns":{"name":"ชื่อตัวแปร","options":"ค่าตัวเลือก","applied_products":"ผลิตภัณฑ์ที่นำไปใช้"},"mobile":{"value":"ค่า: {values}"},"empty":{"title":"เพิ่มตัวแปร","subtitle":"การกำหนดค่าตัวแปรช่วยให้ผู้ค้าสามารถเสนอตัวเลือกผลิตภัณฑ์ที่ปรับแต่งได้","no_variant":{"title":"ไม่พบตัวแปร","subtitle":"ดูเหมือนว่าคุณไม่มีตัวแปรที่สร้างขึ้น"}},"select":{"title":"เลือกตัวแปร","subtitle":"เลือกตัวแปรที่จะใช้การเปลี่ยนแปลง"},"form":{"title":{"add":"เพิ่มตัวแปร","edit":"แก้ไขตัวแปร"},"detail":"รายละเอียดตัวแปร","name":{"label":"ชื่อตัวแปร","placeholder":"ขนาดคัพ","helper":"ตั้งชื่อชุดตัวเลือกนี้ ตัวอย่างเช่น คุณสามารถเรียกชุดตัวเลือกนี้ว่าไซส์หรือระดับความหวาน","required":"ชื่อตัวแปรเป็นสิ่งจำเป็น"},"options":{"title":"ค่าตัวเลือก","placeholder":"ตัวเลือก","min_required":"จำเป็นต้องมีอย่างน้อย 1 ตัวเลือก","name_required":"จำเป็นต้องมีชื่อตัวเลือก"},"applied_product":"เมนูที่นำไปใช้"}},"unit":{"title":"หน่วย","add":"เพิ่มหน่วย","update":"อัปเดตหน่วย","precision":"ความแม่นยำ","precision_placeholder":"ป้อนตัวเลข","empty":{"title":"เพิ่มหน่วยแรกของคุณ","subtitle":"หน่วยใช้เพื่อระบุว่าคุณต้องการวัดเมนูของคุณอย่างไร"},"columns":{"name":"ชื่อ","symbol":"สัญลักษณ์"},"measurement":{"add":"เพิ่มการวัด","title":"การวัด {number}","name":"ชื่อ","symbol":"สัญลักษณ์","conversion":"การแปลง","preview":"1 {name} เท่ากับ {value} {unit}","preview_label":"ดูตัวอย่าง"}},"print_dept":{"title":"เส้นทางการพิมพ์","add":"เพิ่มเส้นทางการพิมพ์","update":"แก้ไขเส้นทางการพิมพ์","columns":{"name":"พิมพ์ชื่อเส้นทาง","products":"เมนูที่นำไปใช้"}},"sku":{"title":"ส่วนผสม","add":"เพิ่มส่วนผสม","update":"อัปเดตส่วนผสม","columns":{"code":"รหัส","name":"ชื่อ","unit":"หน่วย"},"empty":{"no_unit":"ไม่พบหน่วย","subtitle":"เพิ่มหน่วยเพื่อเริ่มเพิ่มส่วนผสมของคุณ"},"validation":{"code_used":"รหัสที่ใช้โดยส่วนผสมอื่น"},"errors":{"select_recipe_ingredient":"เลือกสูตรหรือส่วนผสมที่จะแปลง"},"convertible":{"label":"แปลงได้","sublabel":"แปลงได้จากสูตรหรือส่วนผสมอื่น","convert_to":"แปลงสูตรอาหารและส่วนผสมเป็น"}},"recipe":{"title":"สูตร","add":"เพิ่มสูตรอาหาร","update":"อัปเดตสูตรอาหาร","columns":{"name":"ชื่อ"},"validation":{"bind_required":"ผูกสูตรอาหารหรือส่วนผสมอย่างน้อยหนึ่งสูตร"},"table":{"columns":{"name":"ชื่อ","ingredients":"ส่วนผสม"},"search":{"placeholder":"ค้นหาสูตรอาหาร"}},"empty":{"title":"เพิ่มสูตรอาหารแรกของคุณ","subtitle":"สร้างสูตรอาหารเพื่อทำให้กระบวนการเตรียมอาหารของคุณเป็นมาตรฐาน","action":"เพิ่มสูตรอาหาร"},"actions":{"add":"เพิ่มสูตรอาหาร"}},"serving_sequence":{"title":"ลำดับการเสิร์ฟ","add":"เพิ่มลำดับ","update":"อัปเดตลำดับ","columns":{"name":"ชื่อลำดับ"},"empty":{"title":"ไม่มีลำดับการเสิร์ฟ","subtitle":"ตั้งค่าลำดับการเสิร์ฟอาหารของคุณ เพื่อให้แน่ใจว่าจะได้ประสบการณ์การรับประทานอาหารที่ราบรื่นและเป็นระเบียบ"}},"group":{"title":"กลุ่ม","add":"เพิ่มกลุ่ม","update":"อัปเดตกลุ่ม","form":{"tagging":{"title":"การแท็ก","subtitle":"จัดกลุ่มกลุ่มของคุณตามแท็กเพื่อปรับปรุงการรายงานและการจัดการ"}},"option":{"title":"ตัวเลือก","subtitle":"orderFrom ของตัวแปรที่ไม่ได้เชื่อมโยงจะถูกตั้งเป็น None","link_products":"เชื่อมโยงเมนู","add_option":"เพิ่มตัวเลือก","product_title":"ชื่อ","product_title_required":"จำเป็นต้องใส่ชื่อเมนู","price":"ราคา ({symbol})","inventory":"สินค้าคงคลัง","variant":"ตัวแปร","code":"รหัส","is_default":"ค่าเริ่มต้น","should_link_at_least_one_variant":"ควรเชื่อมโยงตัวแปรอย่างน้อยหนึ่งรายการของ {name}"},"types":{"normal":"ปกติ","product":"เมนู","dynamic":"ไดนามิก"},"select":{"title":"เลือกกลุ่ม","subtitle":"เลือกกลุ่มที่จะใช้การเปลี่ยนแปลง"},"empty":{"title":"ไม่พบกลุ่ม","subtitle":"ดูเหมือนว่าคุณไม่ได้สร้างกลุ่ม Add On"},"search":{"placeholder":"ค้นหากลุ่ม"},"type":{"title":"กลุ่ม: ประเภท {type}","all":"ประเภททั้งหมด","normal":"ประเภทปกติ","product":"ประเภทเมนู","dynamic":"ประเภทไดนามิก"},"list":{"items_linked":"รายการเชื่อมโยง {count} รายการ","products_linked":"เมนูเชื่อมโยง {count} รายการ","columns":{"name":"ชื่อกลุ่ม","products":"เมนู","type":"ประเภท","applied_products":"เมนูที่ใช้"},"types":{"normal":"ปกติ","product":"เมนู","dynamic":"ไดนามิก"},"variants":"{ count } ตัวแปร","more_items":"และอีก { count } รายการ"},"actions":{"add":"เพิ่มกลุ่ม","duplicate":{"title":"กลุ่มที่ซ้ำกัน","message":"คุณแน่ใจหรือไม่ที่จะทำซ้ำ {name}"},"apply_product":"ใช้เมนู","duplicate_action":"ทำซ้ำ"},"dialogs":{"delete":{"title":"ลบกลุ่ม","message":"คุณต้องการลบ {name} หรือไม่","unlink_warning":"รายการ {count} รายการต่อไปนี้จะถูกยกเลิกการเชื่อมโยง:"},"update":{"title":"อัปเดตกลุ่ม"}},"validation":{"name_duplicate":"ชื่อกลุ่มมีอยู่แล้ว"}},"migrate":{"title":"ย้ายไปยังเวอร์ชันใหม่","description":"คุณต้องการย้ายไปยังเวอร์ชันใหม่หรือไม่ เมื่อย้ายแล้วจะไม่สามารถย้อนกลับไปใช้เวอร์ชันเก่าได้","message":"ย้ายเมนูของคุณไปยังเวอร์ชันใหม่เพื่อใช้งานฟีเจอร์ต่างๆ ได้มากขึ้น เนื้อหาของเมนูใหม่จะยังคงเหมือนเดิม","notification":{"title":"เวอร์ชันใหม่ของเมนูออกแล้ว!","description":"ย้ายเวอร์ชั่นเมนูปัจจุบันของคุณไปเป็นเวอร์ชั่นล่าสุดเพื่อเพลิดเพลินกับฟีเจอร์ต่างๆ เพิ่มเติม เช่น การจัดส่งผลิตภัณฑ์ตามลำดับ ลำดับการเสิร์ฟ ตัวกำหนดเวลา และอื่นๆ อีกมากมาย เนื้อหาและการตั้งค่าปัจจุบันของคุณจะถูกเก็บรักษาไว้"},"errors":{"no_restaurant":"ต้องมีร้านอาหารอย่างน้อยหนึ่งร้านที่จะย้ายข้อมูล","pos_version":"อัปเกรด POS เป็น V{version} เพื่อใช้เมนูใหม่: {restaurants}"}},"scheduler":{"title":"ตัวจัดตารางเวลา","select":{"title":"เลือกตัวจัดตารางเวลา","all_time":"ตลอดเวลา"},"empty":{"title":"ไม่พบตัวจัดตารางเวลา","subtitle":"เพิ่มตัวจัดตารางเวลาเพื่อกำหนดเวลาให้ผลิตภัณฑ์ของคุณแสดง","action":"เพิ่มตัวจัดตารางเวลา"},"table":{"columns":{"name":"ชื่อตัวจัดตารางเวลา","repeat":"ทำซ้ำ","period":"ระยะเวลา","products":"ใช้เมนู"},"products_linked":"เชื่อมโยงรายการ {count} รายการ","search":{"placeholder":"ค้นหาตัวจัดตารางเวลา"}},"repeat":{"daily":"รายวัน","weekdays":"วันธรรมดา","weekends":"สุดสัปดาห์","except":"รายวัน ยกเว้น {day}","range":"{start} ถึง {end}"},"days":{"monday":"วันจันทร์","tuesday":"วันอังคาร","wednesday":"วันพุธ","thursday":"วันพฤหัสบดี","friday":"วันศุกร์","saturday":"วันเสาร์","sunday":"วันอาทิตย์"},"dialog":{"add":{"title":"เพิ่มตัวจัดตารางเวลา","action":"เพิ่ม"},"update":{"title":"อัปเดตตัวจัดตารางเวลา","action":"อัปเดต"},"sections":{"detail":{"title":"รายละเอียดตัวจัดตารางเวลา","name":{"label":"ชื่อตัวจัดตารางเวลา","placeholder":"ตัวแทน","required":"จำเป็น"}},"availability":{"title":"ความพร้อมใช้งาน","daily":"รายวัน","weekly":"รายสัปดาห์"},"period":{"title":"ระยะเวลาใช้งาน","all_day":"ตลอดทั้งวัน","custom":"ระยะเวลาที่กำหนดเอง","add":"เพิ่มระยะเวลา","overlap":"ระยะเวลาไม่สามารถทับซ้อนหรือติดกันได้ กรุณาปรับระยะเวลาให้มีช่วงว่างระหว่างแต่ละช่วง"},"autolink":{"title":"เชื่อมโยงเมนูโดยอัตโนมัติ","label":"เชื่อมโยงเมนูโดยอัตโนมัติ","sublabel":"เชื่อมโยงเมนูโดยอัตโนมัติตามตัวกรอง","all_items":"เชื่อมโยงรายการทั้งหมดโดยอัตโนมัติ","filter_message":"เชื่อมโยงรายการที่ตรงกับตัวกรองต่อไปนี้โดยอัตโนมัติ","tooltip":"คุณสามารถใช้ไวด์การ์ด ('*' สำหรับอักขระใดๆ และ '$' สำหรับอักขระตัวเลขใดๆ) ในค่าตัวกรอง ตัวอย่างเช่น A*1 ตรงกับ A1, AG1, AC51 แต่ไม่ตรงกับ A2, B1, C9 ส่วน A$ ตรงกับ A1, A11, A124 แต่ไม่ตรงกับ AQ1, AG1, AC"},"filter":{"add":"เพิ่มตัวกรอง","matches":"รายการที่ตรงกัน","or":"หรือ","types":{"code":"รหัส","category":"หมวดหมู่"},"placeholder":{"category":"เลือกหมวดหมู่"}},"products":{"title":"ใช้เมนู","link":"เชื่อมโยงเมนู"}},"actions":{"cancel":"ยกเลิก"}},"dialogs":{"remove":{"title":"ลบตัวกำหนดเวลา","message":"คุณแน่ใจหรือไม่ว่าต้องการลบตัวกำหนดเวลา {name}"}}},"revert":{"title":"ย้อนกลับเมนู","description":"ย้อนกลับเมนูของ {name} เป็นเวอร์ชันที่เผยแพร่ล่าสุด แคตตาล็อกการจัดส่งจะถูกตั้งค่าเป็นหน้าหลักหากไม่อยู่ในเวอร์ชันที่เผยแพร่ล่าสุด","labels":{"restaurant":"ร้านอาหาร","revert_to":"กลับสู่","default":"ค่าเริ่มต้น","pos_takeaway":"POS Takeaway","pickup":"รับสินค้า","additional_catalogs":"แคตตาล็อกเพิ่มเติม"}},"remy":{"title":"Remy","description":"ผู้ช่วย AI ของคุณ","actions":{"start":"เริ่มต้นด้วย Remy","close":"ปิด Remy"},"messages":{"welcome":"สวัสดี ฉันชื่อ Remy ผู้ช่วย AI ของคุณ ฉันจะช่วยคุณได้อย่างไรในวันนี้","thinking":"กำลังคิด...","error":"ขออภัย ฉันพบข้อผิดพลาด โปรดลองอีกครั้ง"}},"picker":{"title":"เลือก {type}","search":"ค้นหา {type}","no_results":"ไม่พบ {type}","selected":"เลือก {count} รายการ"},"apply_product":{"title":"ใช้เมนู","link":{"title":"เชื่อมโยงเมนู","subtitle":"เชื่อมโยงเมนูเพื่อใช้การเปลี่ยนแปลง"},"table":{"category_count":"{name} ({count})","inventory":"สินค้าคงคลัง","value":"ค่า: {values}"}},"catalog":{"title":"แคตตาล็อก","detail":"รายละเอียดแคตตาล็อก","main":"แคตตาล็อกหลัก","form":{"name":"ชื่อแคตตาล็อก","tax":{"title":"การคำนวณภาษี","auto":{"label":"อัตโนมัติ","sublabel":"ราคาทั้งหมดเป็นราคาปกติ เมื่อสั่งซื้อผ่านบริษัทขนส่ง ราคาจะรวมภาษีโดยอัตโนมัติ"},"manual":{"label":"คู่มือ","sublabel":"คุณสามารถระบุการคำนวณภาษีของตัวเองสำหรับแคตตาล็อกนี้ได้"},"inclusive":"รวม {code}"},"link":{"title":"เชื่อมโยงการกำหนดค่าเมนู","auto_link":{"label":"เชื่อมโยงรายการโดยอัตโนมัติ","sublabel":"เชื่อมโยงเมนูโดยอัตโนมัติไปยังแคตตาล็อกหลักเพื่อความพร้อมใช้งาน"},"options":{"all":"พร้อมใช้งานสำหรับทั้งหมด","pos_only":"สั่งซื้อบน POS เท่านั้น"}},"markup":{"title":"กำหนดค่ามาร์กอัปราคา","auto":{"label":"กำหนดราคามาร์กอัปโดยอัตโนมัติ","sublabel":"กำหนดราคามาร์กอัปโดยอัตโนมัติสำหรับแคตตาล็อก กลุ่ม และกำหนดการ"},"add":"เพิ่มการกำหนดค่ามาร์กอัป","config":"การกำหนดค่า {number}","products":"เชื่อมโยงเมนู {count} รายการ","all_items":"นำไปใช้กับรายการทั้งหมด"},"restaurant_attributes_title":"คุณสมบัติร้านอาหาร"},"validation":{"name_used":"ชื่อแคตตาล็อกที่ใช้","name_required":"จำเป็นต้องระบุชื่อแคตตาล็อก"},"edit":{"back":"กลับไปที่แคตตาล็อก","export":"ส่งออก","import":"นำเข้า","link_product":"เชื่อมโยงเมนู","apply_scheduler":"ใช้ตัวกำหนดเวลา","tabs":{"product":"เมนู","category":"หมวดหมู่","group":"กลุ่ม","takeaway":"นำกลับบ้าน","setting":"การตั้งค่า"},"scheduler":{"remove":{"title":"ลบตัวกำหนดเวลา","message":"คุณแน่ใจหรือไม่ว่าต้องการลบตัวกำหนดเวลา {name}?"}}},"usage":{"title":"การใช้งานแคตตาล็อก","tax_calculation":"การคำนวณภาษี","products":"เมนู {count} รายการ","restaurant":"ร้านอาหาร","usage":"การใช้งาน"},"table":{"columns":{"title":"ชื่อแคตตาล็อก","tax_calculation":"การคำนวณภาษี","auto_link":"การเชื่อมโยงรายการอัตโนมัติ"}},"empty":{"title":"สร้างแคตตาล็อกเมนูของคุณ","subtitle":"จัดระเบียบเมนูของคุณด้วยแคตตาล็อก เพิ่มผลิตภัณฑ์ กำหนดราคา และปรับแต่งสำหรับการรับประทานในร้าน ซื้อกลับบ้าน หรือจัดส่ง"},"actions":{"add":"เพิ่มแคตตาล็อก","view_usage":"การใช้งานแคตตาล็อก"},"dialogs":{"remove":{"title":"ลบแคตตาล็อก","message":"คุณแน่ใจหรือไม่ว่าต้องการลบ {name}","error":"แคตตาล็อกที่ใช้โดยร้านอาหาร {restaurants}"}}},"currency":{"input":{"field":"ฟิลด์"}},"order":{"from":{"options":{"all":"พร้อมใช้งานสำหรับทั้งหมด","pos_only":"POS เท่านั้น","none":"ไม่มี"}}},"inventory":{"title":"สินค้าคงคลัง","subtitle":"ปรับส่วนผสมและปรับแต่งสูตรสำหรับเมนูของคุณ","columns":{"product_name":"ชื่อเมนู","ingredient":"ส่วนผสม","recipe":"สูตร"},"status":{"sku_linked":"{count} sku เชื่อมโยง","recipe_linked":"{count} สูตรเชื่อมโยง","not_set":"ไม่ได้ตั้งค่า"},"dialog":{"title":"สินค้าคงคลัง {name}"},"form":{"title":"สินค้าคงคลัง","product_name":"ชื่อเมนู"},"binding":{"recipe":{"title":"สูตร","columns":{"name":"สูตร","amount":"จำนวน"}},"ingredient":{"title":"ส่วนผสม","columns":{"name":"ส่วนผสม","amount":"จำนวน","unit":"หน่วย"},"select_unit":"เลือกหน่วย","loop_warning":"อุ๊ย! ตรวจพบลูปใน {type} นี้ โปรดตรวจสอบหรือลบลูปนั้น"},"link":{"title":"ลิงก์ {type}","recipe":"สูตรอาหาร","ingredient":"ส่วนผสม"}}},"link_product":{"title":"ใช้เมนู","rules":{"title":"กฎการลิงก์เมนู","section_title":"ตั้งค่าการลิงก์ขั้นสูงด้วยกฎ","order_from":"ช่องทางการสั่งซื้อ","restaurant_filter":"ตัวกรองร้านอาหาร","restaurant_custom_attributes_filter":"ตัวกรองแท็กร้านอาหาร","item_filter":"ตัวกรองสินค้า","item_custom_attributes_filter":"ตัวกรองแท็กสินค้า","add_rule":"เพิ่มกฎ","hint":"ลิงก์เมนูกับร้านอาหารโดยใช้แท็กร้านอาหารและคุณลักษณะเมนูค่าเริ่มต้นจากแคตตาล็อกหลักเท่านั้น (ไม่ใช้การแทนที่ในแคตตาล็อกย่อย)"}},"catalog_scheduler":{"title":"อัปเดตเมนูจาก","subtitle":"เลือกแคตตาล็อกและตัวกำหนดเวลาที่คุณต้องการอัปเดตเมนูของคุณ"},"apply_products":{"category":{"count":"{selected}/{total}"}},"markup":{"dialog":{"title":{"add":"เพิ่มการกำหนดค่ามาร์กอัป","update":"อัปเดตการกำหนดค่ามาร์กอัป"},"fields":{"percentage":{"label":"เปอร์เซ็นต์มาร์กอัป","placeholder":"0","required":"จำเป็นต้องมีเปอร์เซ็นต์มาร์กอัป"}},"options":{"all":"ใช้กับเมนูทั้งหมด","custom":"เมนูที่กำหนดเอง"},"products":{"link":"ลิงก์เมนู","count":"ลิงก์เมนู {count} รายการ"}}},"import":{"dialog":{"title":"นำเข้าเมนู","subtitle":"อัพโหลดเอกสารที่จะนำเข้า","info":"โปรดอย่าเปลี่ยนบรรทัดส่วนหัวใดๆ จากเทมเพลตเดิม มิฉะนั้น การนำเข้าจะล้มเหลว","fields":{"type":"ประเภทเมนู","file":{"replace":"แทนที่ไฟล์"}},"actions":{"import":"นำเข้า"},"errors":{"select_file":"โปรดเลือกไฟล์ที่จะนำเข้า"},"button":{"label":"เพิ่มไฟล์"}}},"product":{"form":{"title":{"add":"เพิ่มเมนู","update":"อัปเดตเมนู"},"summary":{"title":"สรุปเมนู","fields":{"code":"รหัสเมนู","name":"ชื่อเมนู","category":"หมวดหมู่","order_from":"สั่งซื้อจาก","selling_price":"ราคาขาย","tax":"ภาษี","inventory":"สินค้าคงคลัง","takeaway":"อาหารนำกลับบ้าน"}},"sections":{"general":{"title":"การตั้งค่าทั่วไป","description":"ใช้การตั้งค่าทั่วไปอื่น"},"tagging":{"title":"การแท็ก","subtitle":"จัดกลุ่มเมนูของคุณตามแท็กเพื่อปรับปรุงการรายงานและการจัดการ"},"price":{"title":"อัปเดตราคา","description":"ใช้การตั้งค่าราคาอื่น"},"print":{"title":"อัปเดตการพิมพ์","description":"ใช้การตั้งค่าการพิมพ์อื่น"},"variant":{"title":"อัปเดตตัวแปร","description":"ใช้การตั้งค่าตัวแปรอื่น"},"group":{"title":"อัปเดตกลุ่ม","description":"ใช้การตั้งค่ากลุ่มที่แตกต่างกัน"},"inventory":{"title":"อัปเดตสินค้าคงคลัง","description":"ใช้การตั้งค่าสินค้าคงคลังอื่น"},"takeaway":{"title":"อัปเดตข้อมูลนำกลับบ้าน","description":"ใช้การตั้งค่านำกลับบ้านอื่น"}},"detail":{"title":"รายละเอียดเมนู","fields":{"code":{"label":"รหัสเมนู","placeholder":"ไม่มีรหัส"},"name":{"label":"ชื่อเมนู","required":"จำเป็นต้องระบุชื่อ","duplicate_warning":"เมนูนี้มีชื่อเดียวกันกับสินค้าอื่นอีก {count} รายการ ซึ่งจะถูกจัดกลุ่มเป็นเมนูเดียวในรายงาน"},"description":{"label":"คำอธิบาย","optional":"(ไม่บังคับ)","placeholder":"ไม่มีคำอธิบาย"}},"category":{"label":"หมวดหมู่","label_singular":"หมวดหมู่","required":"จำเป็นต้องระบุหมวดหมู่","placeholder":"เลือกหมวดหมู่เพื่อจัดโครงสร้างเมนูของคุณ","add_new":"เพิ่มหมวดหมู่ใหม่","add_first":"กรุณาเพิ่มหมวดหมู่สินค้าก่อน","options":{"product":{"label":"ขายเป็นสินค้าพร้อมส่วนเสริม","sublabel":"สินค้าจะปรากฏเป็นรายการสั่งซื้อ"},"addon":{"label":"ขายเป็นรายการเสริมเท่านั้น","sublabel":"สินค้าจะปรากฏเป็นรายการเสริมเท่านั้น"}}},"subcategory":{"label":"หมวดหมู่ย่อย","required":"จำเป็นต้องระบุหมวดหมู่ย่อย","add_new":"เพิ่มหมวดหมู่ย่อยใหม่"},"path":{"label":"หมวดหมู่ย่อย - เส้นทางเมนู","placeholder":"เลือกหมวดหมู่ย่อยเพื่อจัดโครงสร้างเมนูของคุณ เช่น กาแฟ/ลาเต้","helperText":"เพิ่มหมวดหมู่ย่อยเพื่อจัดโครงสร้างเมนูของคุณ"},"order_from":{"label":"สั่งซื้อจาก","default":"ติดตามหน้าหลัก"}},"group":{"title":"กลุ่ม","subtitle":"เพิ่มกลุ่มให้กับเมนูของคุณเพื่อขายเป็นชุดคอมโบ","add":"เพิ่มกลุ่ม","circularError":"ตรวจพบการเชื่อมโยงแบบวนซ้ำ กลุ่ม {groupName} ได้เชื่อมโยงกับเมนู {productName} แล้ว","columns":{"title":"ชื่อกลุ่ม","type":"ประเภท"}},"price":{"title":"ราคา","fields":{"selling_price":{"label":"ราคาขาย","required":"จำเป็นต้องมีราคา"},"tax":{"label":"ตัวเลือกภาษีไม่พร้อมใช้งาน","label_with_code":"{code} (ใช้ได้หากตั้งค่าโปรไฟล์ร้านอาหารเป็น {code})"}},"settings":{"title":"การกำหนดราคา","open_price":{"label":"ราคาเปิด","sublabel":"อนุญาตให้ปรับราคาได้โดยไม่ต้องขออนุญาต"},"sell_by_unit":{"label":"ขายตามหน่วย","sublabel":"ขายเมนูตามหน่วยที่กำหนด (น้ำหนัก ความยาว ฯลฯ)","per_unit":{"label":"ต่อ","placeholder":"ป้อนจำนวน","required":"ต่อหน่วยเป็นสิ่งจำเป็น","min":"ต่อหน่วยต้องมากกว่า 0"},"unit":{"placeholder":"ป้อนหน่วย","required":"จำเป็นต้องมีหน่วย"}},"track_costing":{"label":"ติดตามต้นทุน"},"min_price":{"label":"มีราคาขั้นต่ำหลังจากใช้ส่วนลด"}}},"print":{"title":"การพิมพ์","config":{"label":"การกำหนดค่าการพิมพ์","group_parent":{"label":"จัดกลุ่มกับเมนูหลัก","sublabel":"พิมพ์เมนูนี้พร้อมกับเมนูหลักเมื่อทำหน้าที่เป็น Add-On"}},"kds":{"label":"การกำหนดค่า KDS","options":{"all":{"label":"ทั้งหมดในครั้งเดียว","description":"ส่งเมนูไปยังทุกแผนกพร้อมกันเพื่อการเตรียมการที่รวดเร็วยิ่งขึ้น"},"sequential":{"label":"การจัดส่งแบบต่อเนื่อง","description":"ส่งเมนูไปยังแต่ละแผนกตามลำดับเพื่อการเตรียมการแบบทีละขั้นตอน"}}},"routes":{"label":"เส้นทางที่เชื่อมโยง","add":"เพิ่มเส้นทาง"}},"takeaway":{"title":"การนำกลับบ้าน","subtitle":"เลือกค่าธรรมเนียมการนำกลับบ้านสำหรับเมนูของคุณ","columns":{"variant":"สินค้าและตัวแปร","product":"เมนู","takeaway":"การนำกลับบ้าน"},"options":{"follows_main":"ปฏิบัติตามหลัก","no_preset":"ไม่มีการนำกลับบ้านที่ตั้งไว้ล่วงหน้า","add_new":"เพิ่มการนำกลับบ้านใหม่"}},"variant":{"title":"ตัวแปร","subtitle":"เพิ่มตัวเลือก เช่น ขนาด สี หรือประเภท","add":"เพิ่มตัวแปร","columns":{"variant":"ตัวแปร","code":"รหัส","order_from":"สั่งซื้อจาก","price":"ราคา","min_price":"ราคาต่ำสุด"},"validation":{"max_variants":"คุณสามารถเพิ่มตัวแปรได้สูงสุด {max} รายการ"},"placeholders":{"no_code":"ไม่มีรหัส","follow_general":"ปฏิบัติตามทั่วไป"}}},"empty":{"with_create":{"title":"เพิ่มเมนูของคุณ","subtitle":"เริ่มต้นด้วยการสต็อกสินค้าในร้านของคุณซึ่งลูกค้าของคุณจะชื่นชอบ","action":"เพิ่มเมนู"},"no_scheduler":{"title":"ไม่มีการเชื่อมโยงเมนู","subtitle":"เพิ่มเมนูในแค็ตตาล็อกนี้โดยการเชื่อมโยงเมนูจากแค็ตตาล็อกหลัก"},"with_scheduler":{"title":"ไม่มีการใช้เมนู","subtitle":"ใช้เมนูในตัวกำหนดเวลานี้โดยการเชื่อมโยงเมนูจากแค็ตตาล็อกหลัก"}},"table":{"columns":{"code":"รหัส","name":"ชื่อเมนู","category":"หมวดหมู่","price":"ราคา ({ currency })","order_from":"สั่งซื้อจาก","tagging":"แท็ก"},"category":{"all":"หมวดหมู่ทั้งหมด","collapse":"ยุบ","expand":"+ เพิ่มเติมอีก {count} รายการ"},"tagging":{"all":"แท็กทั้งหมด","collapse":"ยุบ","expand":"+ เพิ่มเติมอีก {count} รายการ"},"bulk_edit":{"title":"แก้ไขเมนูจำนวนมาก","actions":{"reset_all":"รีเซ็ตทั้งหมด","save":"บันทึก"}},"selection":{"count":"เลือกรายการ {count} รายการ","actions":{"deselect_all":"ยกเลิกการเลือกทั้งหมด","remove":"ลบ"}},"empty":{"title":"เพิ่มเมนูของคุณ","subtitle":"เริ่มต้นด้วยการสต็อกสินค้าในร้านของคุณที่ลูกค้าของคุณจะชื่นชอบ","actions":{"add":"เพิ่มเมนู","import":"นำเข้า"}},"search":{"placeholder":"ค้นหาเมนู"},"validation":{"name_required":"จำเป็นต้องระบุชื่อ","price_min":"ราคาต้องมากกว่าหรือเท่ากับ 0"}}},"setting":{"catalog":{"title":"รายละเอียดแคตตาล็อก","fields":{"name":{"label":"ชื่อแคตตาล็อก","required":"จำเป็นต้องระบุชื่อแคตตาล็อก","used":"ชื่อแคตตาล็อกที่ใช้"}},"warnings":{"delivery":"แคตตาล็อกนี้กำลังถูกใช้โดยบริษัทขนส่งและวิธีการสั่งซื้ออื่นๆ ซึ่งอาจทำให้คำนวณราคาผิดพลาดได้ โปรดตรวจสอบราคาสำหรับการใช้แคตตาล็อกแต่ละรายการ"}},"tax":{"title":"การคำนวณภาษี","modes":{"auto":{"label":"อัตโนมัติ","sublabel":"ราคาทั้งหมดเป็นค่าเริ่มต้นแบบไม่รวม เมื่อสั่งซื้อผ่านบริษัทขนส่ง ราคาจะกลายเป็นราคาที่รวมภาษีโดยอัตโนมัติ"},"manual":{"label":"ด้วยตนเอง","sublabel":"คุณสามารถระบุการคำนวณภาษีสำหรับแคตตาล็อกนี้ได้ด้วยตัวเอง"}},"inclusive":"{code} รวม"},"link":{"title":"เชื่อมโยงการกำหนดค่าเมนู","auto_link":{"label":"เชื่อมโยงรายการโดยอัตโนมัติ","sublabel":"เชื่อมโยงเมนูโดยอัตโนมัติไปยังแคตตาล็อกหลักเพื่อให้ทราบถึงความพร้อมใช้งาน"},"options":{"all":"พร้อมใช้งานสำหรับทั้งหมด","pos_only":"สั่งซื้อบน POS เท่านั้น"}},"markup":{"title":"กำหนดค่ามาร์กอัปราคา","auto_markup":{"label":"กำหนดราคามาร์กอัปโดยอัตโนมัติ","sublabel":"กำหนดราคามาร์กอัปโดยอัตโนมัติสำหรับแคตตาล็อก กลุ่ม และกำหนดการ"},"add":"เพิ่มการกำหนดค่ามาร์กอัป","config":"กำหนดค่า {number}","percentage":"เปอร์เซ็นต์มาร์กอัป: {value}%","products":{"all":"นำไปใช้กับผลิตภัณฑ์ทั้งหมด","linked":"{count} เมนูที่เชื่อมโยง"}}},"takeaway":{"actions":{"add":"เพิ่มการซื้อกลับบ้าน"},"title":"การซื้อกลับบ้าน","add":"เพิ่มรายการอาหารนำกลับบ้าน","update":"อัปเดตรายการอาหารนำกลับบ้าน","columns":{"title":"ชื่อรายการอาหารนำกลับบ้าน","price":"ราคา"},"placeholders":{"title":"ใส่ชื่อรายการอาหารนำกลับบ้านที่นี่"},"empty":{"title":"ไม่พบรายการอาหารนำกลับบ้าน","subtitle":"ดูเหมือนว่าคุณยังไม่ได้สร้างรายการอาหารนำกลับบ้าน","action":"เพิ่มรายการอาหารนำกลับบ้าน"},"table":{"columns":{"name":"ชื่อรายการอาหารนำกลับบ้าน","price":"ราคา ({symbol})","products":"ใช้เมนู"},"items_linked":"เชื่อมโยงรายการ {count} รายการ","search":{"placeholder":"ค้นหารายการอาหารนำกลับบ้าน"}}},"thumbnail":{"alt":{"default":"รายการ","with_name":"{name}"}},"cooking_guide":{"title":"คู่มือการทำอาหาร","empty":{"title":"เพิ่มคู่มือการทำอาหาร","subtitle":"เครื่องมือกำหนดค่าคำแนะนำการปรุงอาหารช่วยให้ผู้ค้าสามารถกำหนดคำแนะนำการปรุงอาหารที่เป็นมาตรฐานสำหรับอาหารต่าง ๆ ในหลาย ๆ ร้านค้า","action":"เพิ่มคู่มือ"},"table":{"columns":{"name":"ชื่อคู่มือ","products":"เชื่อมโยงเมนู","steps":"ขั้นตอน {count}"},"search":{"placeholder":"ค้นหาคู่มือ"},"mobile":{"products_linked":"เชื่อมโยงเมนู{count}"}},"dialogs":{"remove":{"title":"ลบคู่มือการทำอาหาร","message":{"prefix":"คุณแน่ใจหรือไม่ว่าต้องการลบคู่มือการทำอาหาร","products_using":"มี","products_count":"เมนูที่ใช้คู่มือการทำอาหารนี้"}}},"actions":{"add":"เพิ่มคู่มือ","remove":"ลบ","cancel":"ยกเลิก"},"dialog":{"add":{"title":"เพิ่มคู่มือ","action":"เพิ่ม"},"update":{"title":"อัปเดตคู่มือ","action":"อัปเดต"},"sections":{"guide_detail":{"title":"รายละเอียดคู่มือ","name":{"label":"ชื่อคู่มือ","placeholder":"ตัวแทน","required":"จำเป็น"}},"steps":{"title":"ขั้นตอน","add":"เพิ่มขั้นตอน","empty":"ยังไม่มีการเพิ่มขั้นตอน"},"apply_product":{"title":"ใช้เมนู","link":"เชื่อมโยงเมนู","products_linked":"เชื่อมโยงเมนู {count} รายการ","search":"ค้นหา"}},"actions":{"cancel":"ยกเลิก"}},"step_dialog":{"add":{"title":"เพิ่มขั้นตอน","action":"เพิ่ม"},"update":{"title":"อัปเดตขั้นตอน","action":"อัปเดต"},"sections":{"variables":{"title":"ตัวแปร","add":"เพิ่มตัวแปร","columns":{"key":"คีย์","value":"มูลค่า"},"placeholders":{"key":"คีย์","value":"ค่าเริ่มต้น"},"validation":{"required":"จำเป็น","lowercase":"ตัวอักษรพิมพ์เล็กเท่านั้น","duplicate":"คีย์ซ้ำ"}},"instruction":{"title":"คำแนะนำ"}},"actions":{"cancel":"ยกเลิก","back":"ย้อนกลับ"}},"step_override_dialog":{"title":"ปรับแต่งขั้นตอนการปรุงอาหาร","columns":{"instructions":"คำแนะนำ","variables":"ตัวแปร","value":"มูลค่า"},"actions":{"save":"บันทึก","cancel":"ยกเลิก"}}},"ingredient":{"title":"ส่วนผสม","empty":{"title":"เพิ่มส่วนผสมแรกของคุณ","subtitle":"ส่วนผสมเป็นส่วนประกอบที่สำคัญในอาหารและเครื่องดื่ม การจัดการส่วนผสมเกี่ยวข้องกับการจัดหาเมนูที่มีคุณภาพ การตรวจสอบความสอดคล้องของการจัดเก็บ และการรักษามาตรฐานความปลอดภัย เนื่องจากส่วนผสมเหล่านี้ส่งผลกระทบอย่างมากต่อรสชาติและคุณภาพ","action":"เพิ่มส่วนผสม"},"table":{"columns":{"code":"รหัส","name":"ชื่อ","unit":"หน่วย"},"search":{"placeholder":"ค้นหาส่วนผสม"},"mobile":{"code":"รหัส: {code}","unit":"หน่วย: {unit}"}},"actions":{"add":"เพิ่มส่วนผสม"}},"print_route":{"title":"พิมพ์เส้นทาง","empty":{"title":"ไม่พบเส้นทาง","subtitle":"ปรับแต่งปลายทางการพิมพ์ของคุณเพื่อให้แน่ใจว่าการจัดการคำสั่งซื้อตามส่วนมีประสิทธิภาพ","action":"เพิ่มเส้นทาง"},"table":{"columns":{"name":"พิมพ์ชื่อเส้นทาง","products":"เชื่อมโยงเมนู","products_count":"เมนู {count} รายการ"},"search":{"placeholder":"ค้นหาเส้นทาง"},"mobile":{"products_linked":"เชื่อมโยงเมนู {count} รายการ"}},"dialogs":{"remove":{"title":"ลบเส้นทางการพิมพ์","message":{"prefix":"คุณแน่ใจหรือไม่ว่าจะลบเส้นทางการพิมพ์?","products_using":"มี","products_count":"เมนูที่ใช้เส้นทางการพิมพ์นี้"}}},"actions":{"add":"เพิ่มเส้นทาง","remove":"ลบ","cancel":"ยกเลิก"},"department_dialog":{"add":{"title":"เพิ่มเส้นทาง","action":"เพิ่ม"},"update":{"title":"อัปเดตเส้นทาง","action":"อัปเดต"},"sections":{"route_detail":{"title":"รายละเอียดเส้นทาง","name":{"label":"ชื่อเส้นทาง","placeholder":"ตัวแทน","required":"จำเป็น"}},"link_product":{"title":"เชื่อมโยงเมนู","link":"เชื่อมโยงเมนู","products_linked":"เชื่อมโยงเมนู {count} รายการ","search":"ค้นหา"}},"actions":{"cancel":"ยกเลิก"}}},"products":{"title":"เมนู","actions":{"export":"ส่งออก","import":"นำเข้า","add":"เพิ่มเมนู","link":"เชื่อมโยงเมนู","apply_scheduler":"ใช้ตัวกำหนดเวลา"}},"productInternalTools":{"title":"เครื่องมือภายในผลิตภัณฑ์"},"publish":{"title":"เผยแพร่","table":{"columns":{"restaurant":"ร้านอาหาร","default":"ค่าเริ่มต้น","pos_takeaway":"POS takeaway","pickup":"รับสินค้า","version":"เวอร์ชัน"},"search":{"placeholder":"ค้นหา"},"status":{"latest":"ล่าสุด","outdated":"ล้าสมัย"}},"empty":{"title":"สร้างร้านอาหาร","subtitle":"คุณยังไม่ได้สร้างร้านอาหาร เพิ่มร้านอาหารเพื่อเริ่มเผยแพร่เมนู","action":"สร้างร้านอาหาร"},"actions":{"publish":"เผยแพร่","publish_all":"เผยแพร่ทั้งหมด","refresh":"รีเฟรช","revert":"ย้อนกลับเมนู"},"labels":{"main_version":"เวอร์ชันหลัก: {version}","catalog":{"main":"หลัก","invalid":"แคตตาล็อกไม่ถูกต้อง"}},"update_catalog_dialog":{"title":"อัปเดตแคตตาล็อก","sections":{"default":{"label":"แคตตาล็อกเริ่มต้น","use_default":"หลัก"},"pos_takeaway":{"label":"POS takeaway catalog"},"pickup":{"label":"Pick up catalog"},"additional":{"title":"แคตตาล็อกเพิ่มเติม","subtitle":"สามารถใช้แคตตาล็อกเพิ่มเติมโดยโต๊ะและการจัดส่งได้"}},"actions":{"update":"อัปเดต","cancel":"ยกเลิก"}}},"tax_setting":{"title":"การตั้งค่าภาษี"},"menu_setting":{"title":"การตั้งค่าเมนู","fields":{"low_stock":{"not_set":"ไม่ตั้งค่า","must_be_integer":"ค่าต้องเป็นจำนวนเต็ม","title":"จำนวนสินค้าสำหรับการสั่งซื้อออนไลน์","subtitle":"ปิดการสั่งซื้อออนไลน์เมื่อสินค้าลดลงเกินจำนวนนี้","helper_text":"ถ้าสินค้าลดลงเกินจำนวนนี้ สินค้าจะถูกแจ้งให้ลบออกจากการสั่งซื้อออนไลน์","updated":"การตั้งค่าเมนูอัปเดตแล้ว"}},"tabs":{"menu_configuration":"การตั้งค่าเมนู","price_group":"กลุ่มราคา","link_product_rule_groups":"กลุ่มกฎการเชื่อมโยงผลิตภัณฑ์"}},"rule_groups":{"title":"กลุ่มกฎการเชื่อมโยงผลิตภัณฑ์","description":"จัดการกลุ่มกฎสำหรับการเชื่อมโยงผลิตภัณฑ์ตามคุณลักษณะของร้านอาหารและรายการ","create_group":"สร้างกลุ่มกฎ","edit_group":"แก้ไขกลุ่มกฎ","saved_successfully":"การตั้งค่ากลุ่มกฎบันทึกเรียบร้อยแล้ว","search_placeholder":"ค้นหากลุ่มกฎ...","table":{"columns":{"name":"ชื่อ","description":"คำอธิบาย","rules_count":"จำนวนกฎ"}},"form":{"basic_info":"ข้อมูลพื้นฐาน","name":"ชื่อ","name_placeholder":"ป้อนชื่อกลุ่มกฎ","description":"คำอธิบาย","description_placeholder":"ป้อนคำอธิบายกลุ่มกฎ","rules":"กฎ","rules_description":"กำหนดค่ากฎร้านอาหารและรายการสำหรับกลุ่มนี้"},"validation":{"name_required":"ต้องระบุชื่อ","at_least_one_rule_required":"ต้องมีอย่างน้อยหนึ่งกฎ"},"delete_dialog":{"title":"ลบกลุ่มกฎ","message":"คุณแน่ใจหรือไม่ว่าต้องการลบ '{name}'? การดำเนินการนี้ไม่สามารถยกเลิกได้","success":"กลุ่มกฎลบออกเรียบร้อยแล้ว"}},"price_tier":{"price_group":"กลุ่มราคา","description":"ตั้งค่ากลุ่มราคาที่แตกต่างกันสำหรับผลิตภัณฑ์ของคุณและเชื่อมโยงไปยังหลายแคตตาล็อก","add_price_group":"เพิ่มกลุ่มราคา","add_price_group_success":"กลุ่มราคาเพิ่มขึ้นเรียบร้อย","group_title":"ชื่อกลุ่ม","price_group_description":"ปัจจุบันกลุ่มราคานี้เชื่อมโยงกับแคตตาล็อก กรุณาจัดการราคาในแคตตาล็อกหลัก","delete_dialog":{"title":"ลบกลุ่มราคา","message":"คุณแน่ใจหรือไม่ว่าจะลบกลุ่มราคา {name}?","success":"กลุ่มราคาลบออกเรียบร้อย"},"settings_table":{"columns":{"name":"ชื่อ"}},"form":{"table":{"columns":{"name":"ชื่อกลุ่ม","price":"ราคาขาย"}}},"price_tier_config":"การตั้งค่ากลุ่มราคา","link_price_tier":"เชื่อมโยงระดับราคา","link_price_group":"เชื่อมโยงกลุ่มราคา","link_price_group_description":"เลือกกลุ่มราคาเพื่อใช้งานในแคตตาล็อก หากไม่มีกลุ่มราคาเชื่อมโยง ราคาฐานจะใช้งานเป็นค่าเริ่มต้น","not_linked":"ไม่เชื่อมโยง","price_group_rule":"กลุ่มราคากฎ","price_group_rule_description":"เชื่อมโยงกลุ่มราคาไปยังร้านอาหารที่มีป้ายชื่อที่ระบุ","restaurant_filter":"ตัวกรองร้านอาหาร"},"tree_editor":{"title":"การจัดการเมนู","actions":{"add_category":"เพิ่มหมวดหมู่ใหม่","expand_all":"ขยายทั้งหมด","collapse_all":"ยุบทั้งหมด","add_product":"เพิ่มผลิตภัณฑ์","delete_product":"ลบผลิตภัณฑ์","edit_category":"แก้ไขหมวดหมู่","delete_category":"ลบหมวดหมู่","link_category_to_catalog":"เชื่อมโยงหมวดหมู่ไปยังแคตตาล็อก","link_product_to_catalog":"เชื่อมโยงผลิตภัณฑ์ไปยังแคตตาล็อก","unlink_product_from_catalog":"ยกเลิกเชื่อมโยงผลิตภัณฑ์จากแคตตาล็อก"},"labels":{"main_catalog":"แคตตาล็อกหลัก","all_time":"ทั้งหมด","products":"{count} ผลิตภัณฑ์","variants":"{count} รูปแบบ","groups":"{count} กลุ่ม","addon":"ส่วนเสริม","unknown":"ไม่ทราบ","please_select_a_product_to_edit":"กรุณาเลือกผลิตภัณฑ์เพื่อแก้ไข","no_items":"ไม่มีผลิตภัณฑ์ที่สามารถแสดง"}}}`), ni = {
1810
- menu: ri
1811
- }, li = /* @__PURE__ */ JSON.parse(`{"title":"菜单","common":{"actions":{"update":"更新","cancel":"取消","add":"添加","search":"搜索","delete":"删除","remove":"移除","deselect_all":"取消选择","move":"移动","edit":"编辑","download":"下载","save":"保存","confirm":"确认","yes":"是","no":"否","link":"链接","migrate":"迁移","add_new_variant":"添加新规格","add_group":"添加组","apply_product":"应用产品","link_product":"链接产品","deselect":"取消选择"},"labels":{"name":"名称","detail":"详情","items_linked":"{count} 个项目已链接","search_placeholder":"搜索 {type}","symbol":"符号","products_linked":"{count} 个产品已链接","product_linked_singular":"{count} 个产品已链接","product_linked_plural":"{count} 个产品已链接","enter_name":"输入名称","product":"产品","selected_items":"{count} 个项目已选择","all":"全部","category":"分类:{name}","group_name":"组名称","min_select":"最少选择","max_select":"最多选择","group_type":"组类型","stackable":"可堆叠","stackable_sublabel":"顾客可以多次选择相同选项","configuration":"配置","variant":"规格","product_title":"产品标题","price":"价格 ({symbol})","order_from":"下单来源","inventory":"库存","search_groups":"搜索组","search_variants":"搜索规格","product_count":"{count} 个产品已应用","search_product":"搜索产品","product_image":"产品图片","optional":"(可选)","products_selected":"{count} 个产品已选择","items_selected":"{count} 个项目已选择","catalog":"目录","scheduler":"调度器","all_time":"全天","main":"主","unknown":"未知","all_day":"全天","summary":"概览","scheduler_title":"调度器:{label}","link_product_title":"链接产品","products_count":"已选 {count} 个产品","search":"搜索","status":"状态"},"dialog":{"remove_confirmation":"确定要移除 {name} 吗?","change_type":{"title":"更改附加组类型","message":"更改附加组类型将清除所有产品。确定要继续吗?"},"remove":{"catalog":{"title":"移除目录","message":"确定要移除 {name} 吗?"},"category":{"title":"移除分类","message":"确定要移除 {name} 吗?"},"subcategory":{"title":"删除子分类","message":"确定要删除 {name} 吗?"},"product":{"title":"移除产品","message":"确定要移除 {name} 吗?","success":"产品已成功移除。"},"recipe":{"title":"移除配方","message":"确定要移除配方 {name} 吗?"},"ingredient":{"title":"移除配料","message":"确定要移除配料 {name} 吗?"},"takeaway":{"title":"移除外带","message":"确定要移除 {name} 吗?"},"unit":{"title":"移除单位","message":"确定要移除单位 {name} 吗?"},"variant":{"title":"移除规格","message":"确定要移除 {name} 吗?"}}},"validation":{"required":"{field} 为必填项","min_max":"最小选择数必须小于或等于最大选择数","product_title_required":"产品标题为必填项","min_value":"最小值为 {value}","max_value":"最大值为 {value}","field_required":"{field} 为必填项","required_field":"必填项","invalid_amount":"无效金额","max_default_items":"组中的默认产品数量不得多于 {max}","min_exceeds_available_items":"禁用可叠加时,最少选择 ({min}) 不能大于可用项目 ({available})","default_items_tip":"已选择 {count} / {max} 个默认产品,默认产品下单时将自动选中"},"file":{"accepts":"接受 .jpg、.jpeg、.png、.gif 格式"},"empty":{"no_group":{"title":"未找到组","subtitle":"您还未创建组"},"no_variant":{"title":"未找到规格","subtitle":"您还没创建任何规格"}}},"category":{"title":"分类","add":"添加分类","detail":"分类详情","name":"分类名称","empty":{"title":"将产品分组到分类中","subtitle":"使用分类来组织您的产品。","no_group":{"title":"未找到分组","subtitle":"看起来您还没有创建任何分组"}},"columns":{"title":"分类标题","products":"应用产品"},"dialog":{"remove":{"title":"移除分类","error":"无法删除此分类"},"add":{"title":"添加分类","name":{"label":"分类名称","placeholder":"在此输入分类名称","required":"分类名称为必填项"}}},"products":{"title":"产品","add":"添加产品","linked_count":"已链接 {count} 个产品","search":"搜索","columns":{"name":"产品名称","code":"代码"}},"selector":{"all":"全部","title":"分类:{label}"},"manager":{"dialog":{"add":{"title":"添加分类","action":"创建"},"update":{"title":"更新分类","action":"更新"}}}},"subcategory":{"title":"子分类","add":"添加子分类","detail":"子分类详情","name":"子分类名称","empty":{"title":"将产品分组到子分类中","subtitle":"使用子分类来组织您的产品。"},"columns":{"title":"子分类标题"},"dialog":{"remove":{"title":"删除子分类","error":"无法删除此子分类"},"add":{"title":"添加子分类","name":{"label":"子分类名称","placeholder":"在此输入子分类名称","required":"子分类名称为必填项"}}},"manager":{"dialog":{"add":{"title":"添加子分类","action":"创建"},"update":{"title":"更新子分类","action":"更新"}}}},"variant":{"title":"规格","add":"添加规格","columns":{"name":"规格名称","options":"选项值","applied_products":"已应用产品"},"mobile":{"value":"值:{values}"},"empty":{"title":"添加规格","subtitle":"规格配置为商家提供自定义产品选项的功能。","no_variant":{"title":"未找到规格","subtitle":"看起来您还没有创建规格"}},"select":{"title":"选择规格","subtitle":"选择规格以应用更改"},"form":{"title":{"add":"添加规格","edit":"编辑规格"},"detail":"规格详情","name":{"label":"规格名称","placeholder":"杯型尺寸","helper":"为这组选项命名。例如,您可以将此选项组命名为杯型尺寸或糖度。","required":"规格名称为必填项"},"options":{"title":"选项值","placeholder":"选项","min_required":"至少需要 1 个选项","name_required":"选项名称为必填项"},"applied_product":"已应用产品"}},"unit":{"title":"单位","add":"添加单位","update":"更新单位","precision":"精度","precision_placeholder":"输入一个数字","empty":{"title":"添加您的第一个单位","subtitle":"单位用于指定您希望如何测量产品。"},"columns":{"name":"名称","symbol":"符号"},"measurement":{"add":"添加测量","title":"测量 {number}","name":"名称","symbol":"符号","conversion":"转换","preview":"1 {name} 等于 {value} {unit}","preview_label":"预览"}},"print_dept":{"title":"打印路线","add":"添加打印路线","update":"编辑打印路线","columns":{"name":"打印路线名称","products":"已应用产品"}},"sku":{"title":"配料","add":"添加配料","update":"更新配料","columns":{"code":"代码","name":"名称","unit":"单位"},"empty":{"no_unit":"未找到单位","subtitle":"添加单位以开始添加配料。"},"validation":{"code_used":"代码已被其他配料使用"},"errors":{"select_recipe_ingredient":"选择配方或配料以转换"},"convertible":{"label":"可转换","sublabel":"可从其他配方或配料转换","convert_to":"配方和配料转换为"}},"recipe":{"title":"配方","add":"添加配方","update":"更新配方","columns":{"name":"名称"},"validation":{"bind_required":"绑定至少一个配方或配料"},"table":{"columns":{"name":"名称","ingredients":"配料"},"search":{"placeholder":"搜索配方"}},"empty":{"title":"添加您的第一个配方","subtitle":"创建配方以标准化您的食品制备流程","action":"添加配方"},"actions":{"add":"添加配方"}},"serving_sequence":{"title":"上菜顺序","add":"添加顺序","update":"更新顺序","columns":{"name":"顺序名称"},"empty":{"title":"没有上菜顺序","subtitle":"设置订单顺序,以确保用餐体验流畅有序。"}},"group":{"title":"组","add":"添加组","update":"更新组","form":{"tagging":{"title":"标签","subtitle":"通过标签对组进行分组,以简化报告和管理"}},"option":{"title":"产品","subtitle":"未选择的变体的 orderFrom 会被设置为 None","link_products":"链接产品","add_option":"添加选项","product_title":"名称","product_title_required":"产品标题为必填项","price":"价格 ({symbol})","inventory":"库存","variant":"规格","code":"代码","is_default":"默认","should_link_at_least_one_variant":"至少需要链接\\"{name}\\"的一个规格"},"types":{"normal":"正常","product":"产品","dynamic":"动态"},"select":{"title":"选择组","subtitle":"选择组以应用更改"},"empty":{"title":"未找到组","subtitle":"看起来您还没有添加附加组。"},"search":{"placeholder":"搜索组"},"type":{"title":"组:{type} 类型","all":"所有类型","normal":"正常类型","product":"产品类型","dynamic":"动态类型"},"list":{"items_linked":"{count} 个项目已链接","products_linked":"{count} 个产品已链接","columns":{"name":"组名称","products":"产品","type":"类型","applied_products":"已应用产品"},"types":{"normal":"正常","product":"产品","dynamic":"动态"},"variants":"{ count } 种规格","more_items":"与其他 { count } 个"},"actions":{"add":"添加组","duplicate":{"title":"复制组","message":"您确定要复制 {name} 吗?"},"apply_product":"应用产品","duplicate_action":"复制"},"dialogs":{"delete":{"title":"删除组","message":"您确定要删除 {name} 吗?","unlink_warning":"以下 {count} 个项目将被取消链接:"},"update":{"title":"更新组"}},"validation":{"name_duplicate":"组名称已存在"}},"migrate":{"title":"迁移到新版本","description":"您想迁移到新版本吗?一旦迁移,将无法恢复到旧版本。","message":"将您的菜单迁移到新版本,以享受更多功能。新菜单的内容将与当前相同。","notification":{"title":"新版本的菜单已发布!","description":"将当前菜单版本迁移到最新版本,以享受更多功能,例如产品顺序分发、上菜顺序、调度器等!您的内容和当前设置将被保留。"},"errors":{"no_restaurant":"至少需要一个餐厅才能迁移","pos_version":"升级 POS 到 V{version} 以使用新菜单:{restaurants}"}},"scheduler":{"title":"调度器","select":{"title":"选择调度器","all_time":"全天"},"empty":{"title":"未找到调度器","subtitle":"添加调度器以安排产品显示时间。","action":"添加调度器"},"table":{"columns":{"name":"调度器名称","repeat":"重复","period":" 时段","products":"应用产品"},"products_linked":"{count} 个项目已链接","search":{"placeholder":"搜索调度器"}},"repeat":{"daily":"每日","weekdays":"工作日","weekends":"周末","except":"每日除外 {day}","range":"{start} 到 {end}"},"days":{"monday":"周一","tuesday":"周二","wednesday":"周三","thursday":"周四","friday":"周五","saturday":"周六","sunday":"周日"},"dialog":{"add":{"title":"添加调度器","action":"添加"},"update":{"title":"更新调度器","action":"更新"},"sections":{"detail":{"title":"调度器详情","name":{"label":"调度器名称","placeholder":"占位符","required":"必填项"}},"availability":{"title":"可用性","daily":"每日","weekly":"每周"},"period":{"title":"启用时段","all_day":"全天","custom":"自定义时段","add":"添加时段","overlap":"时段不能重叠或相接。请调整时段设置,确保各时段之间有间隔。"},"autolink":{"title":"自动链接产品","label":"自动链接产品","sublabel":"根据过滤器自动链接产品","all_items":"自动链接所有项目","filter_message":"自动链接符合以下过滤条件的项目。","tooltip":"您可以在过滤值中使用通配符('*' 用于任何字符,'$' 用于任何数字字符)。例如,A*1 匹配 A1、AG1、AC51,但不匹配 A2、B1、C9、A$ 匹配 A1、A11、A124,但不匹配 AQ1、AG1、AC"},"filter":{"add":"添加过滤器","matches":"匹配","or":"或","types":{"code":"代码","category":"分类"},"placeholder":{"category":"选择分类"}},"products":{"title":"应用产品","link":"链接产品"}},"actions":{"cancel":"取消"}},"dialogs":{"remove":{"title":"移除调度器","message":"您确定要移除调度器 {name} 吗?"}}},"revert":{"title":"恢复菜单","description":"将 {name} 的菜单恢复到上次发布的版本。如果它不在上次发布的版本中,则将外送目录设置为主目录。","labels":{"restaurant":"餐厅","revert_to":"恢复到","default":"默认","pos_takeaway":"POS 外带","pickup":"自取","additional_catalogs":"附加目录"}},"remy":{"title":"Remy","description":"您的 AI 助手","actions":{"start":"与 Remy 开始","close":"关闭 Remy"},"messages":{"welcome":"你好!我是 Remy,您的 AI 助手。今天我能为您做什么?","thinking":"正在思考...","error":"抱歉,我遇到了错误。请再试一次。"}},"picker":{"title":"选择 {type}","search":"搜索 {type}","no_results":"未找到 {type}","selected":"{count} 已选择"},"apply_product":{"title":"应用产品","link":{"title":"链接产品","subtitle":"链接产品以应用更改"},"table":{"category_count":"{name} ({count})","inventory":"库存","value":"值:{values}"}},"catalog":{"title":"目录","detail":"目录详情","main":"主产品","form":{"name":"目录名称","tax":{"title":"税计算","auto":{"label":"自动","sublabel":"所有价格默认排除,当通过外送公司订购时将自动变为含税"},"manual":{"label":"手动","sublabel":"您可以为此目录指定自己的税计算"},"inclusive":"{code} 包含"},"link":{"title":"链接产品配置","auto_link":{"label":"自动链接项目","sublabel":"自动将产品链接至主目录以供可用性"},"options":{"all":"可供所有人使用","pos_only":"仅在 POS 上订购"}},"markup":{"title":"价格加价配置","auto":{"label":"自动加价价格","sublabel":"自动加价价格适用于目录、组和调度"},"add":"添加加价配置","config":"配置 {number}","percentage":"加价百分比:{value}%","products":"{count} 个产品已链接","all_items":"适用于所有项目"},"restaurant_attributes_title":"餐厅属性"},"validation":{"name_used":"目录名称已使用","name_required":"目录名称必填"},"edit":{"back":"返回目录","export":"导出","import":"导入","link_product":"链接产品","apply_scheduler":"应用调度器","tabs":{"product":"产品","category":"分类","group":"组","takeaway":"外带","setting":"设置"},"scheduler":{"remove":{"title":"移除调度器","message":"您确定要移除调度器 {name} 吗?"}}},"usage":{"title":"目录概览","tax_calculation":"税计算","products":"{count} 个产品","restaurant":"餐厅","usage":"使用"},"table":{"columns":{"title":"目录标题","tax_calculation":"税计算","auto_link":"自动链接项目"}},"empty":{"title":"构建您的菜单目录","subtitle":"使用目录组织菜单。添加产品、设置价格并根据用餐、外带或外送进行定制。"},"actions":{"add":"添加目录","view_usage":"目录概览"},"dialogs":{"remove":{"title":"移除目录","message":"您确定要移除 {name} 吗?","error":"目录被 {restaurants} 家餐厅使用"}}},"currency":{"input":{"field":"字段"}},"order":{"from":{"options":{"all":"可供所有人使用","pos_only":"仅在 POS 上订购","none":"无"}}},"inventory":{"title":"库存","subtitle":"调整配料并自定义产品配方","columns":{"product_name":"产品名称","ingredient":"配料","recipe":"配方"},"status":{"sku_linked":"已链接 {count} 个配料","recipe_linked":"已链接 {count} 个配方","not_set":"未设置"},"dialog":{"title":"{name} 库存"},"form":{"title":"库存","product_name":"产品名称"},"binding":{"recipe":{"title":"配方","columns":{"name":"配方","amount":"数量"}},"ingredient":{"title":"配料","columns":{"name":"配料","amount":"数量","unit":"单位"},"select_unit":"选择单位","loop_warning":"哎呀!检测到循环。请验证或删除它。"},"link":{"title":"链接 {type}","recipe":"配方","ingredient":"配料"}}},"link_product":{"title":"应用产品","rules":{"title":"链接产品规则","section_title":"按规则配置高级链接","order_from":"可点单渠道","restaurant_filter":"餐厅筛选","restaurant_custom_attributes_filter":"餐厅标签筛选","item_filter":"产品筛选","item_custom_attributes_filter":"产品标签筛选","add_rule":"添加规则","hint":"根据餐厅标签与产品的主目录默认属性将产品链接到餐厅(忽略子目录覆写)。"}},"catalog_scheduler":{"title":"更新产品来源","subtitle":"选择目录和调度器以更新产品"},"apply_products":{"category":{"count":"{selected}/{total}"}},"markup":{"dialog":{"title":{"add":"添加加价配置","update":"更新加价配置"},"fields":{"percentage":{"label":"加价百分比","placeholder":"0","required":"加价百分比必填"}},"options":{"all":"适用于所有产品","custom":"自定义产品"},"products":{"link":"链接产品","count":"{count} 个产品已链接"}}},"import":{"dialog":{"title":"导入产品","subtitle":"上传需要导入的文档","info":"请不要更改原始模板中的任何标题行,否则导入将失败。","fields":{"type":"菜单类型","file":{"replace":"替换文件"}},"actions":{"import":"导入"},"errors":{"select_file":"请选择要导入的文件"},"button":{"label":"添加文件"}}},"product":{"form":{"title":{"add":"添加产品","update":"更新产品"},"summary":{"title":"产品摘要","fields":{"code":"产品代码","name":"产品名称","category":"分类","order_from":"下单来源","selling_price":"销售价格","tax":"税","inventory":"库存","takeaway":"外带"}},"sections":{"general":{"title":"通用设置","description":"使用不同的通用设置"},"tagging":{"title":"标签","subtitle":"通过标签对产品进行分组,以简化报告和管理"},"price":{"title":"更新价格","description":"使用不同的价格设置"},"print":{"title":"更新打印","description":"使用不同的打印设置"},"variant":{"title":"更新规格","description":"使用不同的规格设置"},"group":{"title":"更新组","description":"使用不同的组设置"},"inventory":{"title":"更新库存","description":"使用不同的库存设置"},"takeaway":{"title":"更新外带","description":"使用不同的外带设置"}},"detail":{"title":"产品详情","fields":{"code":{"label":"产品代码","placeholder":"无代码"},"name":{"label":"产品名称","required":"名称必填","duplicate_warning":"此产品与 {count} 其他项目共享相同名称。它们将在报告中作为一种产品分组。"},"description":{"label":"描述","optional":"(可选)","placeholder":"无描述"}},"category":{"label":"分类","label_singular":"分类","required":"分类必填","placeholder":"选择分类以结构化您的菜单","add_new":"添加新分类","add_first":"请先添加产品分类","options":{"product":{"label":"作为产品或附加项销售","sublabel":"产品可单独销售,也可作为附加项销售"},"addon":{"label":"仅作为附加项销售","sublabel":"产品将作为附加项出现"}}},"subcategory":{"label":"子分类","required":"子分类为必填项","add_new":"添加新子分类"},"path":{"label":"子分类 - 菜单路径","placeholder":"选择子分类以结构化您的菜单,例如:咖啡/拿铁","helperText":"添加子类别以结构化您的菜单"},"order_from":{"label":"下单来源","default":"跟随主目录"}},"group":{"title":"组","subtitle":"为您的产添加组以作为套餐销售","add":"添加组","circularError":"检测到循环链接,组 {groupName} 已链接到产品 {productName}","columns":{"title":"组标题","type":"类型"}},"price":{"title":"价格","fields":{"selling_price":{"label":"销售价格","required":"价格必填"},"tax":{"label":"税选项不可用","label_with_code":"{code}(适用于餐厅配置 {code} 已设置)"}},"settings":{"title":"价格设置","open_price":{"label":"开放价格","sublabel":"允许在不获得许可的情况下调整价格"},"sell_by_unit":{"label":"按单位销售","sublabel":"按特定单位(重量、长度等)销售产品。","per_unit":{"label":"每","placeholder":"输入数量","required":"每单位必填","min":"每单位必须大于 0"},"unit":{"placeholder":"输入单位","required":"单位必填"}},"track_costing":{"label":"跟踪成本"},"min_price":{"label":"在应用折扣后有最低价格"}}},"print":{"title":"打印","config":{"label":"打印配置","group_parent":{"label":"与父级组","sublabel":"在作为附加项提供时打印此产品及其父级"}},"kds":{"label":"KDS 配置","options":{"all":{"label":"一次性发送","description":"将产品一次性发送至所有部门,以加快准备速度"},"sequential":{"label":"顺序分发","description":"将产品按顺序发送至每个部门,逐步准备"}}},"routes":{"label":"链接路线","add":"添加路线"}},"takeaway":{"title":"外带","subtitle":"选择外带费用以添加到产品中","columns":{"variant":"产品 & 规格","product":"产品","takeaway":"外带"},"options":{"follows_main":"跟随主目录","no_preset":"没有预设外带","add_new":"添加新外带"}},"variant":{"title":"规格","subtitle":"添加选项,如大小、颜色或类型","add":"添加规格","columns":{"variant":"规格","code":"代码","order_from":"下单来源","price":"价格","min_price":"最低价格"},"validation":{"max_variants":"您只能添加 {max} 个规格"},"placeholders":{"no_code":"无代码","follow_general":"跟随通用"}}},"empty":{"with_create":{"title":"添加您的产品","subtitle":"首先通过进货您的商店,为您的顾客提供他们喜爱的产品","action":"添加产品"},"no_scheduler":{"title":"没有产品链接","subtitle":"通过从主目录链接产品来添加此目录中的产品。"},"with_scheduler":{"title":"没有应用产品","subtitle":"通过从主目录链接产品来应用此调度器中的产品。"}},"table":{"columns":{"code":"代码","name":"产品名称","category":"分类","price":"价格 ({ currency })","order_from":"下单来源","tagging":"标签"},"category":{"all":"所有分类","collapse":"收起","expand":"+ {count} 个更多"},"tagging":{"all":"所有标签","collapse":"收起","expand":"+ {count} 个"},"bulk_edit":{"title":"批量编辑产品","actions":{"reset_all":"重置所有","save":"保存"}},"selection":{"count":"{count} 项已选择","actions":{"deselect_all":"取消选择所有","remove":"移除"}},"empty":{"title":"添加您的产品","subtitle":"首先通过进货您的商店,为您的顾客提供他们喜爱的产品","actions":{"add":"添加产品","import":"导入"}},"search":{"placeholder":"搜索产品"},"validation":{"name_required":"名称必填","price_min":"价格必须大于或等于 0"}}},"setting":{"catalog":{"title":"目录详情","fields":{"name":{"label":"目录名称","required":"目录名称必填","used":"目录名称已使用"}},"warnings":{"delivery":"此目录正在被外送公司和其他订单方法使用。这可能会导致价格计算错误,请审查每个目录使用的价格。"}},"tax":{"title":"税计算","modes":{"auto":{"label":"自动","sublabel":"所有价格默认排除,当通过外送公司订购时将自动变为含税"},"manual":{"label":"手动","sublabel":"您可以为此目录指定自己的税计算"}},"inclusive":"{code} 包含"},"link":{"title":"链接产品配置","auto_link":{"label":"自动链接项目","sublabel":"自动将产品链接至主目录以供可用性"},"options":{"all":"可供所有人使用","pos_only":"仅在 POS 上订购"}},"markup":{"title":"价格加价配置","auto_markup":{"label":"自动加价价格","sublabel":"自动加价价格适用于目录、组和调度"},"add":"添加加价配置","config":"配置 {number}","percentage":"加价百分比:{value}%","products":{"all":"适用于所有产品","linked":"{count} 个产品已链接"}}},"takeaway":{"actions":{"add":"添加外带"},"title":"外带","add":"添加外带","update":"更新外带","columns":{"title":"外带标题","price":"价格"},"placeholders":{"title":"在此输入外带标题"},"empty":{"title":"未找到外带","subtitle":"看起来您还没有创建外带。","action":"添加外带"},"table":{"columns":{"name":"外带名称","price":"价格 ({symbol})","products":"应用产品"},"items_linked":"{count} 项已链接","search":{"placeholder":"搜索外带"}}},"thumbnail":{"alt":{"default":"项目","with_name":"{name}"}},"cooking_guide":{"title":"烹饪指南","empty":{"title":"添加烹饪指南","subtitle":"烹饪指南配置工具使商家能够为多个分店的标准化烹饪说明。","action":"添加指南"},"table":{"columns":{"name":"指南名称","products":"已链接产品","steps":"{count} 步"},"search":{"placeholder":"搜索指南"},"mobile":{"products_linked":"{count} 个产品已链接"}},"dialogs":{"remove":{"title":"移除烹饪指南","message":{"prefix":"您确定要移除烹饪指南 ","products_using":"有 ","products_count":" 个产品使用此烹饪指南。 "}}},"actions":{"add":"添加指南","remove":"移除","cancel":"取消"},"dialog":{"add":{"title":"添加指南","action":"添加"},"update":{"title":"更新指南","action":"更新"},"sections":{"guide_detail":{"title":"指南详情","name":{"label":"指南名称","placeholder":"占位符","required":"必填项"}},"steps":{"title":"步骤","add":"添加步骤","empty":"尚未添加任何步骤"},"apply_product":{"title":"应用产品","link":"链接产品","products_linked":"{count} 个产品已链接","search":"搜索"}},"actions":{"cancel":"取消"}},"step_dialog":{"add":{"title":"添加步骤","action":"添加"},"update":{"title":"更新步骤","action":"更新"},"sections":{"variables":{"title":"变量","add":"添加变量","columns":{"key":"键","value":"值"},"placeholders":{"key":"键","value":"默认值"},"validation":{"required":"必填项","lowercase":"仅小写字母","duplicate":"重复键"}},"instruction":{"title":"指令"}},"actions":{"cancel":"取消","back":"返回"}},"step_override_dialog":{"title":"自定义烹饪步骤","columns":{"instructions":"指令","variables":"变量","value":"值"},"actions":{"save":"保存","cancel":"取消"}}},"ingredient":{"title":"配料","empty":{"title":"添加您的第一个配料","subtitle":"配料是食物和饮料的重要组成部分。管理它们涉及采购高质量产品、确保存储合规性以及维护安全标准,因为它们对风味和质量有显著影响。","action":"添加配料"},"table":{"columns":{"code":"代码","name":"名称","unit":"单位"},"search":{"placeholder":"搜索配料"},"mobile":{"code":"代码:{code}","unit":"单位:{unit}"}},"actions":{"add":"添加配料"}},"print_route":{"title":"打印路线","empty":{"title":"未找到路线","subtitle":"根据您的打印目的地进行定制,以确保高效的订单管理。","action":"添加路线"},"table":{"columns":{"name":"打印路线名称","products":"已链接产品","products_count":"{count} 个产品"},"search":{"placeholder":"搜索路线"},"mobile":{"products_linked":"{count} 个产品已链接"}},"dialogs":{"remove":{"title":"移除打印路线","message":{"prefix":"您确定要移除打印路线吗? ","products_using":"有 ","products_count":" 个产品使用此打印路线。 "}}},"actions":{"add":"添加路线","remove":"移除","cancel":"取消"},"department_dialog":{"add":{"title":"添加路线","action":"添加"},"update":{"title":"更新路线","action":"更新"},"sections":{"route_detail":{"title":"路线详情","name":{"label":"路线名称","placeholder":"占位符","required":"必填项"}},"link_product":{"title":"链接产品","link":"链接产品","products_linked":"{count} 个产品已链接","search":"搜索"}},"actions":{"cancel":"取消"}}},"products":{"title":"产品","actions":{"export":"导出","import":"导入","add":"添加产品","link":"链接产品","apply_scheduler":"应用调度器"}},"productInternalTools":{"title":"产品内部工具"},"publish":{"title":"发布","table":{"columns":{"restaurant":"餐厅","default":"默认","pos_takeaway":"POS 外带","pickup":"自取","version":"版本"},"search":{"placeholder":"搜索"},"status":{"latest":"最新","outdated":"已过时"}},"empty":{"title":"创建餐厅","subtitle":"您还没有创建任何餐厅。添加餐厅以开始发布菜单","action":"创建餐厅"},"actions":{"publish":"发布","publish_all":"发布所有","refresh":"刷新","revert":"恢复菜单"},"labels":{"main_version":"主版本:{version}","catalog":{"main":"主","invalid":"无效目录"}},"update_catalog_dialog":{"title":"更新目录","sections":{"default":{"label":"默认目录","use_default":"主"},"pos_takeaway":{"label":"POS 外带目录"},"pickup":{"label":"自取目录"},"additional":{"title":"附加目录","subtitle":"附加目录可以用于桌号和外送"}},"actions":{"update":"更新","cancel":"取消"}}},"tax_setting":{"title":"税设置"},"menu_setting":{"title":"菜单设置","fields":{"low_stock":{"not_set":"未设置","must_be_integer":"值必须为整数","title":"在线点单的产品阈值","subtitle":"当库存低于此限制时禁用在线点单","helper_text":"如果库存达到或低于此数量,产品将被提示从在线点单中移除","updated":"菜单设置已更新"}},"tabs":{"menu_configuration":"菜单配置","price_group":"价格组","link_product_rule_groups":"关联产品规则组"}},"rule_groups":{"title":"关联产品规则组","description":"管理基于餐厅和产品属性的产品关联规则组","create_group":"创建规则组","edit_group":"编辑规则组","saved_successfully":"规则组设置已成功保存","search_placeholder":"搜索规则组...","table":{"columns":{"name":"名称","description":"描述","rules_count":"规则数量"}},"form":{"basic_info":"基本信息","name":"名称","name_placeholder":"输入规则组名称","description":"描述","description_placeholder":"输入规则组描述","rules":"规则","rules_description":"为此组配置餐厅和产品规则"},"validation":{"name_required":"名称为必填项","at_least_one_rule_required":"至少需要一个规则"},"delete_dialog":{"title":"删除规则组","message":"您确定要删除'{name}'吗?此操作无法撤销。","success":"规则组删除成功"}},"price_tier":{"price_group":"价格组","description":"设置不同价格组以应用于多个目录","add_price_group":"添加价格组","add_price_group_success":"价格组创建成功","group_title":"组标题","price_group_description":"当前目录已链接到价格组。请在主目录中管理价格。","delete_dialog":{"title":"删除价格组","message":"您确定要删除价格组 {name} 吗?","success":"价格组删除成功"},"settings_table":{"columns":{"name":"名称"}},"form":{"table":{"columns":{"name":"组标题","price":"销售价格"}}},"price_tier_config":"价格组设置","link_price_tier":"链接价格层级","link_price_group":"链接价格组","link_price_group_description":"选择一个价格组以应用于目录。如果没有链接,将使用基础价格。","not_linked":"未链接","price_group_rule":"价格组规则","price_group_rule_description":"链接价格组到具有特定标签的餐厅。","restaurant_filter":"餐厅过滤器"},"tree_editor":{"title":"菜单管理","actions":{"add_category":"添加新分类","expand_all":"展开所有","collapse_all":"折叠所有","add_product":"添加产品","delete_product":"删除产品","edit_category":"编辑","delete_category":"删除分类","link_category_to_catalog":"链接分类到目录","link_product_to_catalog":"链接产品到目录","unlink_product_from_catalog":"取消链接产品"},"labels":{"main_catalog":"主目录","all_time":"所有时间","products":"产品: {count}","variants":"规格: {count}","groups":"组: {count}","addon":"附加项","unknown":"未知","please_select_a_product_to_edit":"请选择一个产品进行编辑","no_items":"没有产品可显示"}}}`), si = {
1812
- menu: li
1813
- }, ci = /* @__PURE__ */ JSON.parse(`{"title":"菜單","common":{"actions":{"update":"更新","cancel":"取消","add":"添加","search":"搜索","delete":"刪除","remove":"移除","deselect_all":"取消選擇","move":"移動","edit":"編輯","download":"下載","save":"保存","confirm":"確認","yes":"是","no":"否","link":"鏈接","migrate":"遷移","add_new_variant":"添加新規格","add_group":"添加組","apply_product":"應用產品","link_product":"鏈接產品","deselect":"取消選擇"},"labels":{"name":"名稱","detail":"詳情","items_linked":"{count} 個項目已鏈接","search_placeholder":"搜索 {type}","symbol":"符號","products_linked":"{count} 個產品已鏈接","product_linked_singular":"{count} 個產品已鏈接","product_linked_plural":"{count} 個產品已鏈接","enter_name":"輸入名稱","product":"產品","selected_items":"{count} 個項目已選擇","all":"全部","category":"分類:{name}","group_name":"組名稱","min_select":"最少選擇","max_select":"最多選擇","group_type":"組類型","stackable":"可堆疊","stackable_sublabel":"顧客可以多次選擇相同選項","configuration":"配置","variant":"規格","product_title":"產品標題","price":"價格 ({symbol})","order_from":"下單來源","inventory":"庫存","search_groups":"搜索組","search_variants":"搜索規格","product_count":"{count} 個產品已應用","search_product":"搜索產品","product_image":"產品圖片","optional":"(可選)","products_selected":"{count} 個產品已選擇","items_selected":"{count} 個項目已選擇","catalog":"目錄","scheduler":"調度器","all_time":"全天","main":"主","unknown":"未知","all_day":"全天","summary":"概覽","scheduler_title":"調度器:{label}","link_product_title":"鏈接產品","products_count":"已選 {count} 個產品","search":"搜索","status":"狀態"},"dialog":{"remove_confirmation":"確定要移除 {name} 嗎?","change_type":{"title":"更改附加組類型","message":"更改附加組類型將清除所有產品。確定要繼續嗎?"},"remove":{"catalog":{"title":"移除目錄","message":"確定要移除 {name} 嗎?"},"category":{"title":"移除分類","message":"確定要移除 {name} 嗎?"},"subcategory":{"title":"移除子分類","message":"確定要移除 {name} 嗎?"},"product":{"title":"移除產品","message":"確定要移除 {name} 嗎?","success":"產品已成功移除。"},"recipe":{"title":"移除配方","message":"確定要移除配方 {name} 嗎?"},"ingredient":{"title":"移除配料","message":"確定要移除配料 {name} 嗎?"},"takeaway":{"title":"移除外帶","message":"確定要移除 {name} 嗎?"},"unit":{"title":"移除單位","message":"確定要移除單位 {name} 嗎?"},"variant":{"title":"移除規格","message":"確定要移除 {name} 嗎?"}}},"validation":{"required":"{field} 為必填項","min_max":"最小選擇數必須小於或等於最大選擇數","product_title_required":"產品標題為必填項","min_value":"最小值為 {value}","max_value":"最大值為 {value}","field_required":"{field} 為必填項","required_field":"必填項","invalid_amount":"無效金額","max_default_items":"組中的默認產品數量不得多於 {max}","min_exceeds_available_items":"禁用可疊加時,最少選擇 ({min}) 不能大於可用項目 ({available})","default_items_tip":"已選擇 {count} / {max} 個默認產品,默認產品下單時將自動選中"},"file":{"accepts":"接受 .jpg、.jpeg、.png、.gif 格式"},"empty":{"no_group":{"title":"未找到組","subtitle":"您還未創建組"},"no_variant":{"title":"未找到規格","subtitle":"您還沒創建任何規格"}}},"category":{"title":"分類","add":"添加分類","detail":"分類詳情","name":"分類名稱","empty":{"title":"將產品分組到分類中","subtitle":"使用分類來組織您的產品。","no_group":{"title":"未找到分組","subtitle":"看起來您還沒有創建任何分組"}},"columns":{"title":"分類標題","products":"應用產品"},"dialog":{"remove":{"title":"移除分類","error":"無法刪除此分類"},"add":{"title":"添加分類","name":{"label":"分類名稱","placeholder":"在此輸入分類名稱","required":"分類名稱為必填項"}}},"products":{"title":"產品","add":"添加產品","linked_count":"已鏈接 {count} 個產品","search":"搜索","columns":{"name":"產品名稱","code":"代碼"}},"selector":{"all":"全部","title":"分類:{label}"},"manager":{"dialog":{"add":{"title":"添加分類","action":"創建"},"update":{"title":"更新分類","action":"更新"}}}},"subcategory":{"title":"子分類","add":"添加子分類","detail":"子分類詳情","name":"子分類名稱","empty":{"title":"將產品分組到子分類中","subtitle":"使用子分類來組織您的產品。"},"columns":{"title":"子分類標題"},"dialog":{"remove":{"title":"移除子分類","error":"無法刪除此子分類"},"add":{"title":"添加子分類","name":{"label":"子分類名稱","placeholder":"在此輸入子分類名稱","required":"子分類名稱為必填項"}}},"manager":{"dialog":{"add":{"title":"添加子分類","action":"創建"},"update":{"title":"更新子分類","action":"更新"}}}},"variant":{"title":"規格","add":"添加規格","columns":{"name":"規格名稱","options":"選項值","applied_products":"已應用產品"},"mobile":{"value":"值:{values}"},"empty":{"title":"添加規格","subtitle":"規格配置為商家提供自定義產品選項的功能。","no_variant":{"title":"未找到規格","subtitle":"看起來您還沒有創建規格"}},"select":{"title":"選擇規格","subtitle":"選擇規格以應用更改"},"form":{"title":{"add":"添加規格","edit":"編輯規格"},"detail":"規格詳情","name":{"label":"規格名稱","placeholder":"杯型尺寸","helper":"為這組選項命名。例如,您可以將此選項組命名為杯型尺寸或糖度。","required":"規格名稱為必填項"},"options":{"title":"選項值","placeholder":"選項","min_required":"至少需要 1 個選項","name_required":"選項名稱為必填項"},"applied_product":"已應用產品"}},"unit":{"title":"單位","add":"添加單位","update":"更新單位","precision":"精度","precision_placeholder":"輸入一個數字","empty":{"title":"添加您的第一個單位","subtitle":"單位用於指定您希望如何測量產品。"},"columns":{"name":"名稱","symbol":"符號"},"measurement":{"add":"添加測量","title":"測量 {number}","name":"名稱","symbol":"符號","conversion":"轉換","preview":"1 {name} 等於 {value} {unit}","preview_label":"預覽"}},"print_dept":{"title":"打印路線","add":"添加打印路線","update":"編輯打印路線","columns":{"name":"打印路線名稱","products":"已應用產品"}},"sku":{"title":"配料","add":"添加配料","update":"更新配料","columns":{"code":"代碼","name":"名稱","unit":"單位"},"empty":{"no_unit":"未找到單位","subtitle":"添加單位以開始添加配料。"},"validation":{"code_used":"代碼已被其他配料使用"},"errors":{"select_recipe_ingredient":"選擇配方或配料以轉換"},"convertible":{"label":"可轉換","sublabel":"可從其他配方或配料轉換","convert_to":"配方和配料轉換為"}},"recipe":{"title":"配方","add":"添加配方","update":"更新配方","columns":{"name":"名稱"},"validation":{"bind_required":"綁定至少一個配方或配料"},"table":{"columns":{"name":"名稱","ingredients":"配料"},"search":{"placeholder":"搜索配方"}},"empty":{"title":"添加您的第一個配方","subtitle":"創建配方以標準化您的食品製備流程","action":"添加配方"},"actions":{"add":"添加配方"}},"serving_sequence":{"title":"上菜順序","add":"添加順序","update":"更新順序","columns":{"name":"順序名稱"},"empty":{"title":"沒有上菜順序","subtitle":"設置訂單順序,以確保用餐體驗流暢有序。"}},"group":{"title":"組","add":"添加組","update":"更新組","form":{"tagging":{"title":"標籤","subtitle":"通過標籤對組進行分組,以簡化報告和管理"}},"option":{"title":"產品","subtitle":"未選擇的變體的 orderFrom 會被設置為 None","link_products":"鏈接產品","add_option":"添加選項","product_title":"名稱","product_title_required":"產品標題為必填項","price":"價格 ({symbol})","inventory":"庫存","variant":"規格","code":"代碼","is_default":"默認","should_link_at_least_one_variant":"至少需要鏈接\\"{name}\\"的一個規格"},"types":{"normal":"正常","product":"產品","dynamic":"動態"},"select":{"title":"選擇組","subtitle":"選擇組以應用更改"},"empty":{"title":"未找到組","subtitle":"看起來您還沒有添加附加組。"},"search":{"placeholder":"搜索組"},"type":{"title":"組:{type} 類型","all":"所有類型","normal":"正常類型","product":"產品類型","dynamic":"動態類型"},"list":{"items_linked":"{count} 個項目已鏈接","products_linked":"{count} 個產品已鏈接","columns":{"name":"組名稱","products":"產品","type":"類型","applied_products":"已應用產品"},"types":{"normal":"正常","product":"產品","dynamic":"動態"},"variants":"{ count } 種規格","more_items":"與其他 { count } 個"},"actions":{"add":"添加組","duplicate":{"title":"複製組","message":"您確定要複製 {name} 嗎?"},"apply_product":"應用產品","duplicate_action":"複製"},"dialogs":{"delete":{"title":"刪除組","message":"您確定要刪除 {name} 嗎?","unlink_warning":"以下 {count} 個項目將被取消連結:"},"update":{"title":"更新組"}},"validation":{"name_duplicate":"組名稱已存在"}},"migrate":{"title":"遷移到新版本","description":"您想遷移到新版本嗎?一旦遷移,將無法恢復到舊版本。","message":"將您的菜單遷移到新版本,以享受更多功能。新菜單的內容將與當前相同。","notification":{"title":"新版本的菜單已發佈!","description":"將當前菜單版本遷移到最新版本,以享受更多功能,例如產品順序分發、上菜順序、調度器等!您的內容和當前設置將被保留。"},"errors":{"no_restaurant":"至少需要一個餐廳才能遷移","pos_version":"升級 POS 到 V{version} 以使用新菜單:{restaurants}"}},"scheduler":{"title":"調度器","select":{"title":"選擇調度器","all_time":"全天"},"empty":{"title":"未找到調度器","subtitle":"添加調度器以安排產品顯示時間。","action":"添加調度器"},"table":{"columns":{"name":"調度器名稱","repeat":"重複","period":" 時段","products":"應用產品"},"products_linked":"{count} 個項目已鏈接","search":{"placeholder":"搜索調度器"}},"repeat":{"daily":"每日","weekdays":"工作日","weekends":"週末","except":"每日除外 {day}","range":"{start} 到 {end}"},"days":{"monday":"週一","tuesday":"週二","wednesday":"週三","thursday":"週四","friday":"週五","saturday":"週六","sunday":"週日"},"dialog":{"add":{"title":"添加調度器","action":"添加"},"update":{"title":"更新調度器","action":"更新"},"sections":{"detail":{"title":"調度器詳情","name":{"label":"調度器名稱","placeholder":"佔位符","required":"必填項"}},"availability":{"title":"可用性","daily":"每日","weekly":"每週"},"period":{"title":"啓用時段","all_day":"全天","custom":"自定義時段","add":"添加時段","overlap":"時段不能重疊或相接。請調整時段設置,確保各時段之間有間隔。"},"autolink":{"title":"自動鏈接產品","label":"自動鏈接產品","sublabel":"根據過濾器自動鏈接產品","all_items":"自動鏈接所有項目","filter_message":"自動鏈接符合以下過濾條件的項目。","tooltip":"您可以在過濾值中使用通配符('*' 用於任何字符,'$' 用於任何數字字符)。例如,A*1 匹配 A1、AG1、AC51,但不匹配 A2、B1、C9、A$ 匹配 A1、A11、A124,但不匹配 AQ1、AG1、AC"},"filter":{"add":"添加過濾器","matches":"匹配","or":"或","types":{"code":"代碼","category":"分類"},"placeholder":{"category":"選擇分類"}},"products":{"title":"應用產品","link":"鏈接產品"}},"actions":{"cancel":"取消"}},"dialogs":{"remove":{"title":"移除調度器","message":"您確定要移除調度器 {name} 嗎?"}}},"revert":{"title":"恢復菜單","description":"將 {name} 的菜單恢復到上次發佈的版本。如果它不在上次發佈的版本中,則將外送目錄設置為主目錄。","labels":{"restaurant":"餐廳","revert_to":"恢復到","default":"默認","pos_takeaway":"POS 外帶","pickup":"自取","additional_catalogs":"附加目錄"}},"remy":{"title":"Remy","description":"您的 AI 助手","actions":{"start":"與 Remy 開始","close":"關閉 Remy"},"messages":{"welcome":"你好!我是 Remy,您的 AI 助手。今天我能為您做什麼?","thinking":"正在思考...","error":"抱歉,我遇到了錯誤。請再試一次。"}},"picker":{"title":"選擇 {type}","search":"搜索 {type}","no_results":"未找到 {type}","selected":"{count} 已選擇"},"apply_product":{"title":"應用產品","link":{"title":"鏈接產品","subtitle":"鏈接產品以應用更改"},"table":{"category_count":"{name} ({count})","inventory":"庫存","value":"值:{values}"}},"catalog":{"title":"目錄","detail":"目錄詳情","main":"主產品","form":{"name":"目錄名稱","tax":{"title":"税計算","auto":{"label":"自動","sublabel":"所有價格默認排除,當通過外送公司訂購時將自動變為含税"},"manual":{"label":"手動","sublabel":"您可以為此目錄指定自己的税計算"},"inclusive":"{code} 包含"},"link":{"title":"鏈接產品配置","auto_link":{"label":"自動鏈接項目","sublabel":"自動將產品鏈接至主目錄以供可用性"},"options":{"all":"可供所有人使用","pos_only":"僅在 POS 上訂購"}},"markup":{"title":"價格加價配置","auto":{"label":"自動加價價格","sublabel":"自動加價價格適用於目錄、組和調度"},"add":"添加加價配置","config":"配置 {number}","percentage":"加價百分比:{value}%","products":"{count} 個產品已鏈接","all_items":"適用於所有項目"},"restaurant_attributes_title":"餐廳屬性"},"validation":{"name_used":"目錄名稱已使用","name_required":"目錄名稱必填"},"edit":{"back":"返回目錄","export":"導出","import":"導入","link_product":"鏈接產品","apply_scheduler":"應用調度器","tabs":{"product":"產品","category":"分類","group":"組","takeaway":"外帶","setting":"設置"},"scheduler":{"remove":{"title":"移除調度器","message":"您確定要移除調度器 {name} 嗎?"}}},"usage":{"title":"目錄概覽","tax_calculation":"税計算","products":"{count} 個產品","restaurant":"餐廳","usage":"使用"},"table":{"columns":{"title":"目錄標題","tax_calculation":"税計算","auto_link":"自動鏈接項目"}},"empty":{"title":"構建您的菜單目錄","subtitle":"使用目錄組織菜單。添加產品、設置價格並根據用餐、外帶或外送進行定製。"},"actions":{"add":"添加目錄","view_usage":"目錄概覽"},"dialogs":{"remove":{"title":"移除目錄","message":"您確定要移除 {name} 嗎?","error":"目錄被 {restaurants} 家餐廳使用"}}},"currency":{"input":{"field":"字段"}},"order":{"from":{"options":{"all":"可供所有人使用","pos_only":"僅在 POS 上訂購","none":"無"}}},"inventory":{"title":"庫存","subtitle":"調整配料並自定義產品配方","columns":{"product_name":"產品名稱","ingredient":"配料","recipe":"配方"},"status":{"sku_linked":"已鏈接 {count} 個配料","recipe_linked":"已鏈接 {count} 個配方","not_set":"未設置"},"dialog":{"title":"{name} 庫存"},"form":{"title":"庫存","product_name":"產品名稱"},"binding":{"recipe":{"title":"配方","columns":{"name":"配方","amount":"數量"}},"ingredient":{"title":"配料","columns":{"name":"配料","amount":"數量","unit":"單位"},"select_unit":"選擇單位","loop_warning":"哎呀!檢測到循環。請驗證或刪除它。"},"link":{"title":"鏈接 {type}","recipe":"配方","ingredient":"配料"}}},"link_product":{"title":"應用產品","rules":{"title":"鏈接產品規則","section_title":"按規則配置高級鏈接","order_from":"可點單渠道","restaurant_filter":"餐廳篩選","restaurant_custom_attributes_filter":"餐廳標籤篩選","item_filter":"產品篩選","item_custom_attributes_filter":"產品標籤篩選","add_rule":"添加規則","hint":"根據餐廳標籤與產品主目錄的默認屬性將產品鏈接到餐廳(忽略子目錄覆寫)。"}},"catalog_scheduler":{"title":"更新產品來源","subtitle":"選擇目錄和調度器以更新產品"},"apply_products":{"category":{"count":"{selected}/{total}"}},"markup":{"dialog":{"title":{"add":"添加加價配置","update":"更新加價配置"},"fields":{"percentage":{"label":"加價百分比","placeholder":"0","required":"加價百分比必填"}},"options":{"all":"適用於所有產品","custom":"自定義產品"},"products":{"link":"鏈接產品","count":"{count} 個產品已鏈接"}}},"import":{"dialog":{"title":"導入產品","subtitle":"上傳需要導入的文檔","info":"請不要更改原始模板中的任何標題行,否則導入將失敗。","fields":{"type":"菜單類型","file":{"replace":"替換文件"}},"actions":{"import":"導入"},"errors":{"select_file":"請選擇要導入的文件"},"button":{"label":"添加文件"}}},"product":{"form":{"title":{"add":"添加產品","update":"更新產品"},"summary":{"title":"產品摘要","fields":{"code":"產品代碼","name":"產品名稱","category":"分類","order_from":"下單來源","selling_price":"銷售價格","tax":"税","inventory":"庫存","takeaway":"外帶"}},"sections":{"general":{"title":"通用設置","description":"使用不同的通用設置"},"tagging":{"title":"標籤","subtitle":"通過標籤對產品進行分組,以簡化報告和管理"},"price":{"title":"更新價格","description":"使用不同的價格設置"},"print":{"title":"更新打印","description":"使用不同的打印設置"},"variant":{"title":"更新規格","description":"使用不同的規格設置"},"group":{"title":"更新組","description":"使用不同的組設置"},"inventory":{"title":"更新庫存","description":"使用不同的庫存設置"},"takeaway":{"title":"更新外帶","description":"使用不同的外帶設置"}},"detail":{"title":"產品詳情","fields":{"code":{"label":"產品代碼","placeholder":"無代碼"},"name":{"label":"產品名稱","required":"名稱必填","duplicate_warning":"此產品與 {count} 其他項目共享相同名稱。它們將在報告中作為一種產品分組。"},"description":{"label":"描述","optional":"(可選)","placeholder":"無描述"}},"category":{"label":"分類","label_singular":"分類","required":"分類必填","placeholder":"選擇分類以結構化您的菜單","add_new":"添加新分類","add_first":"請先添加產品分類","options":{"product":{"label":"作為產品或附加項銷售","sublabel":"產品可單獨銷售,也可作為附加項銷售"},"addon":{"label":"僅作為附加項銷售","sublabel":"產品將作為附加項出現"}}},"subcategory":{"label":"子分類","required":"子分類為必填項","add_new":"添加新子分類"},"path":{"label":"子分類 - 菜單路徑","placeholder":"選擇子分類以建立您的菜單結構,例如:咖啡/拿鐵","helperText":"添加子類別以結構化您的菜單"},"order_from":{"label":"下單來源","default":"跟隨主目錄"}},"group":{"title":"組","subtitle":"為您的產添加組以作為套餐銷售","add":"添加組","circularError":"檢測到循環鏈接,組 {groupName} 已鏈接到產品 {productName}","columns":{"title":"組標題","type":"類型"}},"price":{"title":"價格","fields":{"selling_price":{"label":"銷售價格","required":"價格必填"},"tax":{"label":"税選項不可用","label_with_code":"{code}(適用於餐廳配置 {code} 已設置)"}},"settings":{"title":"價格設置","open_price":{"label":"開放價格","sublabel":"允許在不獲得許可的情況下調整價格"},"sell_by_unit":{"label":"按單位銷售","sublabel":"按特定單位(重量、長度等)銷售產品。","per_unit":{"label":"每","placeholder":"輸入數量","required":"每單位必填","min":"每單位必須大於 0"},"unit":{"placeholder":"輸入單位","required":"單位必填"}},"track_costing":{"label":"跟蹤成本"},"min_price":{"label":"在應用折扣後有最低價格"}}},"print":{"title":"打印","config":{"label":"打印配置","group_parent":{"label":"與父級組","sublabel":"在作為附加項提供時打印此產品及其父級"}},"kds":{"label":"KDS 配置","options":{"all":{"label":"一次性發送","description":"將產品一次性發送至所有部門,以加快準備速度"},"sequential":{"label":"順序分發","description":"將產品按順序發送至每個部門,逐步準備"}}},"routes":{"label":"鏈接路線","add":"添加路線"}},"takeaway":{"title":"外帶","subtitle":"選擇外帶費用以添加到產品中","columns":{"variant":"產品 & 規格","product":"產品","takeaway":"外帶"},"options":{"follows_main":"跟隨主目錄","no_preset":"沒有預設外帶","add_new":"添加新外帶"}},"variant":{"title":"規格","subtitle":"添加選項,如大小、顏色或類型","add":"添加規格","columns":{"variant":"規格","code":"代碼","order_from":"下單來源","price":"價格","min_price":"最低價格"},"validation":{"max_variants":"您只能添加 {max} 個規格"},"placeholders":{"no_code":"無代碼","follow_general":"跟隨通用"}}},"empty":{"with_create":{"title":"添加您的產品","subtitle":"首先通過進貨您的商店,為您的顧客提供他們喜愛的產品","action":"添加產品"},"no_scheduler":{"title":"沒有產品鏈接","subtitle":"通過從主目錄鏈接產品來添加此目錄中的產品。"},"with_scheduler":{"title":"沒有應用產品","subtitle":"通過從主目錄鏈接產品來應用此調度器中的產品。"}},"table":{"columns":{"code":"代碼","name":"產品名稱","category":"分類","price":"價格 ({ currency })","order_from":"下單來源","tagging":"標籤"},"category":{"all":"全部分類","collapse":"收起","expand":"+ 還有 {count} 個"},"tagging":{"all":"全部標籤","collapse":"收起","expand":"+ {count} 個"},"bulk_edit":{"title":"批量編輯產品","actions":{"reset_all":"重置所有","save":"保存"}},"selection":{"count":"{count} 項已選擇","actions":{"deselect_all":"取消選擇所有","remove":"移除"}},"empty":{"title":"添加您的產品","subtitle":"首先通過進貨您的商店,為您的顧客提供他們喜愛的產品","actions":{"add":"添加產品","import":"導入"}},"search":{"placeholder":"搜索產品"},"validation":{"name_required":"名稱必填","price_min":"價格必須大於或等於 0"}}},"setting":{"catalog":{"title":"目錄詳情","fields":{"name":{"label":"目錄名稱","required":"目錄名稱必填","used":"目錄名稱已使用"}},"warnings":{"delivery":"此目錄正在被外送公司和其他訂單方法使用。這可能會導致價格計算錯誤,請審查每個目錄使用的價格。"}},"tax":{"title":"税計算","modes":{"auto":{"label":"自動","sublabel":"所有價格默認排除,當通過外送公司訂購時將自動變為含税"},"manual":{"label":"手動","sublabel":"您可以為此目錄指定自己的税計算"}},"inclusive":"{code} 包含"},"link":{"title":"鏈接產品配置","auto_link":{"label":"自動鏈接項目","sublabel":"自動將產品鏈接至主目錄以供可用性"},"options":{"all":"可供所有人使用","pos_only":"僅在 POS 上訂購"}},"markup":{"title":"價格加價配置","auto_markup":{"label":"自動加價價格","sublabel":"自動加價價格適用於目錄、組和調度"},"add":"添加加價配置","config":"配置 {number}","percentage":"加價百分比:{value}%","products":{"all":"適用於所有產品","linked":"{count} 個產品已鏈接"}}},"takeaway":{"actions":{"add":"添加外帶"},"title":"外帶","add":"添加外帶","update":"更新外帶","columns":{"title":"外帶標題","price":"價格"},"placeholders":{"title":"在此輸入外帶標題"},"empty":{"title":"未找到外帶","subtitle":"看起來您還沒有創建外帶。","action":"添加外帶"},"table":{"columns":{"name":"外帶名稱","price":"價格 ({symbol})","products":"應用產品"},"items_linked":"{count} 項已鏈接","search":{"placeholder":"搜索外帶"}}},"thumbnail":{"alt":{"default":"項目","with_name":"{name}"}},"cooking_guide":{"title":"烹飪指南","empty":{"title":"添加烹飪指南","subtitle":"烹飪指南配置工具使商家能夠為多個分店的標準化烹飪説明。","action":"添加指南"},"table":{"columns":{"name":"指南名稱","products":"已鏈接產品","steps":"{count} 步"},"search":{"placeholder":"搜索指南"},"mobile":{"products_linked":"{count} 個產品已鏈接"}},"dialogs":{"remove":{"title":"移除烹飪指南","message":{"prefix":"您確定要移除烹飪指南 ","products_using":"有 ","products_count":" 個產品使用此烹飪指南。 "}}},"actions":{"add":"添加指南","remove":"移除","cancel":"取消"},"dialog":{"add":{"title":"添加指南","action":"添加"},"update":{"title":"更新指南","action":"更新"},"sections":{"guide_detail":{"title":"指南詳情","name":{"label":"指南名稱","placeholder":"佔位符","required":"必填項"}},"steps":{"title":"步驟","add":"添加步驟","empty":"尚未添加任何步驟"},"apply_product":{"title":"應用產品","link":"鏈接產品","products_linked":"{count} 個產品已鏈接","search":"搜索"}},"actions":{"cancel":"取消"}},"step_dialog":{"add":{"title":"添加步驟","action":"添加"},"update":{"title":"更新步驟","action":"更新"},"sections":{"variables":{"title":"變量","add":"添加變量","columns":{"key":"鍵","value":"值"},"placeholders":{"key":"鍵","value":"默認值"},"validation":{"required":"必填項","lowercase":"僅小寫字母","duplicate":"重複鍵"}},"instruction":{"title":"指令"}},"actions":{"cancel":"取消","back":"返回"}},"step_override_dialog":{"title":"自定義烹飪步驟","columns":{"instructions":"指令","variables":"變量","value":"值"},"actions":{"save":"保存","cancel":"取消"}}},"ingredient":{"title":"配料","empty":{"title":"添加您的第一個配料","subtitle":"配料是食物和飲料的重要組成部分。管理它們涉及採購高質量產品、確保存儲合規性以及維護安全標準,因為它們對風味和質量有顯著影響。","action":"添加配料"},"table":{"columns":{"code":"代碼","name":"名稱","unit":"單位"},"search":{"placeholder":"搜索配料"},"mobile":{"code":"代碼:{code}","unit":"單位:{unit}"}},"actions":{"add":"添加配料"}},"print_route":{"title":"打印路線","empty":{"title":"未找到路線","subtitle":"根據您的打印目的地進行定製,以確保高效的訂單管理。","action":"添加路線"},"table":{"columns":{"name":"打印路線名稱","products":"已鏈接產品","products_count":"{count} 個產品"},"search":{"placeholder":"搜索路線"},"mobile":{"products_linked":"{count} 個產品已鏈接"}},"dialogs":{"remove":{"title":"移除打印路線","message":{"prefix":"您確定要移除打印路線嗎? ","products_using":"有 ","products_count":" 個產品使用此打印路線。 "}}},"actions":{"add":"添加路線","remove":"移除","cancel":"取消"},"department_dialog":{"add":{"title":"添加路線","action":"添加"},"update":{"title":"更新路線","action":"更新"},"sections":{"route_detail":{"title":"路線詳情","name":{"label":"路線名稱","placeholder":"佔位符","required":"必填項"}},"link_product":{"title":"鏈接產品","link":"鏈接產品","products_linked":"{count} 個產品已鏈接","search":"搜索"}},"actions":{"cancel":"取消"}}},"products":{"title":"產品","actions":{"export":"導出","import":"導入","add":"添加產品","link":"鏈接產品","apply_scheduler":"應用調度器"}},"productInternalTools":{"title":"產品內部工具"},"publish":{"title":"發佈","table":{"columns":{"restaurant":"餐廳","default":"默認","pos_takeaway":"POS 外帶","pickup":"自取","version":"版本"},"search":{"placeholder":"搜索"},"status":{"latest":"最新","outdated":"已過時"}},"empty":{"title":"創建餐廳","subtitle":"您還沒有創建任何餐廳。添加餐廳以開始發佈菜單","action":"創建餐廳"},"actions":{"publish":"發佈","publish_all":"發佈所有","refresh":"刷新","revert":"恢復菜單"},"labels":{"main_version":"主版本:{version}","catalog":{"main":"主","invalid":"無效目錄"}},"update_catalog_dialog":{"title":"更新目錄","sections":{"default":{"label":"默認目錄","use_default":"主"},"pos_takeaway":{"label":"POS 外帶目錄"},"pickup":{"label":"自取目錄"},"additional":{"title":"附加目錄","subtitle":"附加目錄可以用於桌號和外送"}},"actions":{"update":"更新","cancel":"取消"}}},"tax_setting":{"title":"税設置"},"menu_setting":{"title":"菜單設置","fields":{"low_stock":{"not_set":"未設置","must_be_integer":"值必須為整數","title":"在線點單的產品閾值","subtitle":"當庫存低於此限制時禁用在線點單","helper_text":"如果庫存達到或低於此數量,產品將被提示從在線點單中移除","updated":"菜單設置已更新"}},"tabs":{"menu_configuration":"菜單配置","price_group":"價格組","link_product_rule_groups":"關聯產品規則組"}},"rule_groups":{"title":"關聯產品規則組","description":"管理基於餐廳和產品屬性的產品關聯規則組","create_group":"創建規則組","edit_group":"編輯規則組","saved_successfully":"規則組設置已成功保存","search_placeholder":"搜索規則組...","table":{"columns":{"name":"名稱","description":"描述","rules_count":"規則數量"}},"form":{"basic_info":"基本信息","name":"名稱","name_placeholder":"輸入規則組名稱","description":"描述","description_placeholder":"輸入規則組描述","rules":"規則","rules_description":"為此組配置餐廳和產品規則"},"validation":{"name_required":"名稱為必填項","at_least_one_rule_required":"至少需要一個規則"},"delete_dialog":{"title":"刪除規則組","message":"您確定要刪除'{name}'嗎?此操作無法撤銷。","success":"規則組刪除成功"}},"price_tier":{"price_group":"價格組","description":"設置不同價格組以應用於多個目錄","add_price_group":"添加價格組","add_price_group_success":"價格組創建成功","group_title":"組標題","price_group_description":"當前目錄已鏈接到價格組。請在主目錄中管理價格。","delete_dialog":{"title":"刪除價格組","message":"您確定要刪除價格組 {name} 嗎?","success":"價格組刪除成功"},"settings_table":{"columns":{"name":"名稱"}},"form":{"table":{"columns":{"name":"組標題","price":"銷售價格"}}},"price_tier_config":"價格組設置","link_price_tier":"鏈接價格層級","link_price_group":"鏈接價格組","link_price_group_description":"選擇一個價格組以應用於目錄。如果沒有鏈接,將使用基礎價格。","not_linked":"未鏈接","price_group_rule":"價格組規則","price_group_rule_description":"鏈接價格組到具有特定標籤的餐廳。","restaurant_filter":"餐廳過濾器"},"tree_editor":{"title":"菜單管理","actions":{"add_category":"添加新分類","expand_all":"展開所有","collapse_all":"摺疊所有","add_product":"添加產品","delete_product":"刪除產品","edit_category":"編輯","delete_category":"刪除分類","link_category_to_catalog":"鏈接分類到目錄","link_product_to_catalog":"鏈接產品到目錄","unlink_product_from_catalog":"取消鏈接產品"},"labels":{"main_catalog":"主目錄","all_time":"所有時間","products":"產品: {count}","variants":"規格: {count}","groups":"組: {count}","addon":"附加項","unknown":"未知","please_select_a_product_to_edit":"請選擇一個產品進行編輯","no_items":"沒有產品可顯示"}}}`), ui = {
1814
- menu: ci
1815
- }, T = I(!1);
1816
- window.addEventListener("message", (e) => {
1817
- var t;
1818
- ((t = e.data) == null ? void 0 : t.type) === "menu-version-notifier" && (T.value = e.data.data.isV4);
1819
- });
1820
- var di = /* @__PURE__ */ ((e) => (e.OVERVIEW = "$menu-overview", e.CATALOG = "$menu-catalog", e.EDIT_CATALOG = "$menu-catalog-edit", e.EDIT_CATALOG_PRODUCT = "$menu-catalog-edit-product", e.EDIT_CATALOG_CATEGORY = "$menu-catalog-edit-category", e.EDIT_CATALOG_GROUP = "$menu-catalog-edit-group", e.EDIT_CATALOG_TAKEAWAY = "$menu-catalog-edit-takeaway", e.EDIT_CATALOG_SETTING = "$menu-catalog-edit-setting", e.SCHEDULER = "$menu-scheduler", e.VARIANT = "$menu-variant", e.COOKING_GUIDE = "$menu-cooking-guide", e.PRINT_ROUTE = "$menu-print-route", e.PUBLISH = "$menu-publish", e))(di || {});
1821
- const h = {
1822
- validationManifest: {
1823
- requiredCaslPermissions: [
1824
- {
1825
- action: ke.Action.manage,
1826
- subject: ke.Subject.Business.menu
1827
- }
1828
- ]
1829
- }
1830
- }, ae = [
1831
- {
1832
- path: "/product",
1833
- name: "$menu-products",
1834
- component: y(b(() => import("./Products-bBYxKoQD.js"))),
1835
- meta: {
1836
- ...h,
1837
- isNavItem: !0,
1838
- i18nId: "menu.products.title"
1839
- }
1840
- },
1841
- {
1842
- path: "/product-internal-tools",
1843
- name: "$menu-product-internal-tools",
1844
- component: y(
1845
- b(() => import("./ProductInternalTools-CPOtlBbf.js"))
1846
- ),
1847
- meta: {
1848
- i18nId: "menu.productInternalTools.title",
1849
- validationManifest: {
1850
- requiredRoles: ["admin"]
1851
- },
1852
- hideNavigation: !0
1853
- }
1854
- },
1855
- {
1856
- path: "/category",
1857
- name: "$menu-category",
1858
- component: y(b(() => import("./Category-DqGNz35T.js"))),
1859
- meta: {
1860
- ...h,
1861
- isNavItem: !0,
1862
- i18nId: "menu.category.title"
1863
- }
1864
- },
1865
- {
1866
- path: "/subcategory",
1867
- name: "$menu-subcategory",
1868
- component: y(b(() => import("./Subcategory-DX8QrFgC.js"))),
1869
- meta: {
1870
- ...h,
1871
- isNavItem: () => T.value,
1872
- i18nId: "menu.subcategory.title"
1873
- }
1874
- },
1875
- {
1876
- path: "/group",
1877
- name: "$menu-group",
1878
- component: y(b(() => import("./Group-BdezABwF.js"))),
1879
- meta: {
1880
- ...h,
1881
- isNavItem: !0,
1882
- i18nId: "menu.group.title"
1883
- }
1884
- },
1885
- {
1886
- path: "/takeaway",
1887
- name: "$menu-takeaway",
1888
- component: y(b(() => import("./Takeaway-DH2SFWfP.js"))),
1889
- meta: {
1890
- ...h,
1891
- isNavItem: !0,
1892
- i18nId: "menu.takeaway.title"
1893
- }
1894
- },
1895
- {
1896
- path: "/scheduler",
1897
- name: "$menu-scheduler",
1898
- component: y(b(() => import("./Scheduler-CbpeTQSj.js"))),
1899
- meta: {
1900
- ...h,
1901
- isNavItem: !0,
1902
- i18nId: "menu.scheduler.title"
1903
- }
1904
- },
1905
- {
1906
- path: "/variant",
1907
- name: "$menu-variant",
1908
- component: y(b(() => import("./Variant-rNyjWODP.js"))),
1909
- meta: {
1910
- ...h,
1911
- isNavItem: !0,
1912
- i18nId: "menu.variant.title"
1913
- }
1914
- },
1915
- {
1916
- path: "/recipe",
1917
- name: "$menu-recipe",
1918
- component: y(b(() => import("./Recipe-COSl8UGA.js"))),
1919
- meta: {
1920
- ...h,
1921
- isNavItem: () => !T.value,
1922
- i18nId: "menu.recipe.title"
1923
- }
1924
- },
1925
- {
1926
- path: "/ingredient",
1927
- name: "$menu-ingredient",
1928
- component: y(b(() => import("./Ingredient-BBI1k8pJ.js"))),
1929
- meta: {
1930
- ...h,
1931
- isNavItem: () => !T.value,
1932
- i18nId: "menu.ingredient.title"
1933
- }
1934
- },
1935
- {
1936
- path: "/unit",
1937
- name: "$menu-unit",
1938
- component: y(b(() => import("./Unit-DMxFyFY2.js"))),
1939
- meta: {
1940
- ...h,
1941
- isNavItem: () => !T.value,
1942
- i18nId: "menu.unit.title"
1943
- }
1944
- },
1945
- {
1946
- path: "/cooking-guide",
1947
- name: "$menu-cooking-guide",
1948
- component: y(b(() => import("./CookingGuide-BDdhXyem.js"))),
1949
- meta: {
1950
- ...h,
1951
- isNavItem: !0,
1952
- i18nId: "menu.cooking_guide.title"
1953
- }
1954
- },
1955
- {
1956
- path: "/print-route",
1957
- name: "$menu-print-route",
1958
- component: y(b(() => import("./PrintRoute-6PwNkgPq.js"))),
1959
- meta: {
1960
- ...h,
1961
- isNavItem: !0,
1962
- i18nId: "menu.print_route.title"
1963
- }
1964
- },
1965
- {
1966
- path: "/serving-sequence",
1967
- name: "$menu-serving-sequence",
1968
- component: y(
1969
- b(() => import("./ServingSequence-cj2B74HR.js"))
1970
- ),
1971
- meta: {
1972
- ...h,
1973
- isNavItem: () => T.value,
1974
- i18nId: "menu.serving_sequence.title"
1975
- }
1976
- },
1977
- {
1978
- path: "/publish",
1979
- name: "$menu-publish",
1980
- component: y(b(() => import("./Publish-D8kDEEHH.js"))),
1981
- meta: {
1982
- ...h,
1983
- isNavItem: !0,
1984
- i18nId: "menu.publish.title"
1985
- }
1986
- },
1987
- {
1988
- path: "/:pathMatch(.*)*",
1989
- redirect: "/catalog"
1990
- },
1991
- {
1992
- path: "/setting",
1993
- name: "$menu-menu-setting",
1994
- component: y(b(() => import("./MenuSetting-C-P1Scc1.js"))),
1995
- meta: {
1996
- ...h,
1997
- isNavItem: !0,
1998
- i18nId: "menu.menu_setting.title"
1999
- }
2000
- },
2001
- {
2002
- path: "/taxsetting",
2003
- name: "$menu-tax-setting",
2004
- redirect: "/setting"
2005
- },
2006
- {
2007
- path: "/catalog",
2008
- name: "$menu-catalog",
2009
- component: y(b(() => import("./Catalog-DH2BdP9z.js"))),
2010
- meta: {
2011
- ...h,
2012
- isNavItem: !0,
2013
- i18nId: "menu.catalog.title"
2014
- }
2015
- },
2016
- {
2017
- path: "/catalog/edit/:id",
2018
- component: y(b(() => import("./_id_-BwarikMA.js"))),
2019
- name: "$menu-catalog-edit",
2020
- meta: {
2021
- ...h
2022
- },
2023
- children: [
2024
- {
2025
- path: "/catalog/edit/:id",
2026
- redirect: {
2027
- name: "$menu-catalog-edit-product"
2028
- /* EDIT_CATALOG_PRODUCT */
2029
- }
2030
- },
2031
- {
2032
- path: "/catalog/edit/:id/product",
2033
- component: y(b(() => import("./Product-C9bWKMnR.js"))),
2034
- name: "$menu-catalog-edit-product",
2035
- meta: { ...h }
2036
- },
2037
- {
2038
- path: "/catalog/edit/:id/category",
2039
- component: y(b(() => import("./Category-qYUvpLdh.js"))),
2040
- name: "$menu-catalog-edit-category",
2041
- meta: { ...h }
2042
- },
2043
- {
2044
- path: "/catalog/edit/:id/group",
2045
- component: y(b(() => import("./Group-CC_L3UT-.js"))),
2046
- name: "$menu-catalog-edit-group",
2047
- meta: { ...h }
2048
- },
2049
- {
2050
- path: "/catalog/edit/:id/takeaway",
2051
- component: y(b(() => import("./Takeaway-DrhBsRCs.js"))),
2052
- name: "$menu-catalog-edit-takeaway",
2053
- meta: { ...h }
2054
- },
2055
- {
2056
- path: "/catalog/edit/:id/setting",
2057
- component: y(b(() => import("./Setting-D23VkUB7.js"))),
2058
- name: "$menu-catalog-edit-setting",
2059
- meta: { ...h }
2060
- }
2061
- ]
2062
- }
2063
- ];
2064
- var Ie;
2065
- ae.push({
2066
- path: "/",
2067
- redirect: {
2068
- name: ((Ie = ae[0].children) == null ? void 0 : Ie[0].name) || ae[0].name
2069
- }
2070
- });
2071
- y(b(() => import("./Catalog-DH2BdP9z.js"))), {
2072
- ...h
2073
- }, y(b(() => import("./_id_-BwarikMA.js"))), { ...h }, y(b(() => import("./Product-C9bWKMnR.js"))), { ...h }, y(b(() => import("./Category-qYUvpLdh.js"))), { ...h }, y(b(() => import("./Group-CC_L3UT-.js"))), { ...h }, y(b(() => import("./Takeaway-DrhBsRCs.js"))), { ...h }, y(b(() => import("./Setting-D23VkUB7.js"))), { ...h };
2074
- const pi = "treeEditorOpen", hi = () => {
2075
- window.postMessage({ type: pi }, "*");
2076
- }, fi = b(() => import("./App-CL10Jg9U.js"));
2077
- function vi(e, t) {
2078
- e.use(Xa);
2079
- }
2080
- const ki = {
2081
- "en-US": oi,
2082
- "zh-CN": si,
2083
- "th-TH": ni,
2084
- "zh-Hant": ui
2085
- };
2086
- export {
2087
- fi as F,
2088
- bi as I,
2089
- di as R,
2090
- pi as T,
2091
- ei as _,
2092
- Za as a,
2093
- vi as b,
2094
- ki as i,
2095
- hi as o,
2096
- ae as r,
2097
- yi as u
2098
- };