@oneclick.dev/cms-core-modules 0.0.115 → 0.0.116

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 (87) hide show
  1. package/dist/{ContentEditor-MctMvN7D.js → ContentEditor-CsbOFg3a.js} +52 -52
  2. package/dist/{ContentEditor-C5yNNLeV.mjs → ContentEditor-Df5uWpVC.mjs} +10337 -8677
  3. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-gozJKXvM.js +1 -0
  4. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-pDO9b4Pv.mjs +77 -0
  5. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-BHeMJ6nr.mjs +1476 -0
  6. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-C2zwt5UF.js +1 -0
  7. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-BYSeUW_V.js +925 -0
  8. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-DwAUYR8p.mjs +5021 -0
  9. package/dist/Overview-CBahJviK.js +1 -0
  10. package/dist/Overview-CVQ1pkuD.mjs +527 -0
  11. package/dist/TableView-Csv5Lycy.mjs +6234 -0
  12. package/dist/TableView-Cwal0BPW.js +4 -0
  13. package/dist/agenda-BSdlrfxv.mjs +1253 -0
  14. package/dist/agenda-Bev1mO7E.js +1 -0
  15. package/dist/availability-ClBGVgE9.js +1 -0
  16. package/dist/availability-D8JdA4rP.mjs +274 -0
  17. package/dist/booking-data-Px7XCIfU.mjs +1024 -0
  18. package/dist/booking-data-aMS1p_3g.js +1 -0
  19. package/dist/cms-core-modules.css +1 -1
  20. package/dist/exceptions-CqityDo9.mjs +651 -0
  21. package/dist/exceptions-DXqc0Nza.js +1 -0
  22. package/dist/index-CM4eaK5T.mjs +1245 -0
  23. package/dist/index-DliTZzwI.js +35 -0
  24. package/dist/index.cjs.js +1 -1
  25. package/dist/index.mjs +12 -11
  26. package/dist/orders-1swJVKw2.js +1 -0
  27. package/dist/orders-D41GbzIa.mjs +624 -0
  28. package/dist/payment-BJHgpaeT.js +1 -0
  29. package/dist/payment-D5j-68Ig.mjs +1278 -0
  30. package/dist/refunds-D9nTeD2d.mjs +436 -0
  31. package/dist/refunds-oVB2Opib.js +1 -0
  32. package/dist/resources-8WouFvJe.js +1 -0
  33. package/dist/resources-B-D5MUhV.mjs +975 -0
  34. package/dist/server-handlers.cjs.js +1 -1
  35. package/dist/server-handlers.mjs +626 -515
  36. package/dist/src/appointments/components/edit/EventDialog/BookingsList.vue.d.ts +146 -5
  37. package/dist/src/appointments/components/edit/EventDialog/CancelRefundReservationDialog.vue.d.ts +33 -0
  38. package/dist/src/appointments/components/edit/EventDialog/OrderDetailDialog.vue.d.ts +26 -8
  39. package/dist/src/appointments/components/edit/EventDialog/RefundDetailsDisplay.vue.d.ts +8 -0
  40. package/dist/src/appointments/components/edit/EventDialog/ReservationDetailDialog.vue.d.ts +91 -5
  41. package/dist/src/appointments/components/edit/EventDialog/TransferReservationDialog.vue.d.ts +20 -3
  42. package/dist/src/appointments/components/edit/NewReservationDialog/ReservationLines.vue.d.ts +5 -0
  43. package/dist/src/appointments/components/edit/OrderMetadataDisplay.vue.d.ts +20 -2
  44. package/dist/src/appointments/components/edit/dashboard/BookingsList.vue.d.ts +240 -0
  45. package/dist/src/appointments/composables/useAgendaMetadataSchema.d.ts +37 -0
  46. package/dist/src/appointments/pages/edit/orders.vue.d.ts +225 -0
  47. package/dist/src/appointments/pages/edit/refunds.vue.d.ts +2 -0
  48. package/dist/src/appointments/server.d.ts +2 -0
  49. package/dist/src/appointments/types.d.ts +6 -0
  50. package/dist/src/appointments/utils/printReservation.d.ts +65 -3
  51. package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/Table.d.ts +36 -0
  52. package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/Table.vue.d.ts +95 -0
  53. package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/TableCell.d.ts +13 -0
  54. package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/TableHeader.d.ts +6 -0
  55. package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/TableRow.d.ts +6 -0
  56. package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/index.d.ts +4 -0
  57. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/TableMenu.vue.d.ts +13 -0
  58. package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/index.d.ts +14 -0
  59. package/package.json +2 -2
  60. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-DWMqQvHl.mjs +0 -76
  61. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-kpjbVSXg.js +0 -1
  62. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-Baqy-rTT.js +0 -1
  63. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-Dx4Bpa2m.mjs +0 -1263
  64. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-COrK1j0S.js +0 -1
  65. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-Vb3q8EVv.mjs +0 -330
  66. package/dist/Overview-98nkJUWN.mjs +0 -481
  67. package/dist/Overview-Dl8cMlsr.js +0 -1
  68. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CuwREvXD.js +0 -349
  69. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-GYNZ_yhD.mjs +0 -3077
  70. package/dist/TableView-CVfkyj1k.js +0 -4
  71. package/dist/TableView-zDx0IegJ.mjs +0 -6096
  72. package/dist/agenda-BaJu3-1c.js +0 -1
  73. package/dist/agenda-BwVY_8oM.mjs +0 -1165
  74. package/dist/availability-CMrRa5y2.mjs +0 -269
  75. package/dist/availability-Cf2YfMwM.js +0 -1
  76. package/dist/booking-data-DgJd0BcM.mjs +0 -889
  77. package/dist/booking-data-Di5GmH_8.js +0 -1
  78. package/dist/exceptions-B6P9UiCj.js +0 -1
  79. package/dist/exceptions-De9-FvdP.mjs +0 -646
  80. package/dist/index-DL6orwdK.js +0 -35
  81. package/dist/index-hH3e-IYz.mjs +0 -1187
  82. package/dist/orders-C65SlpJy.mjs +0 -618
  83. package/dist/orders-XVzWAgG1.js +0 -1
  84. package/dist/payment-C3ohkehF.mjs +0 -1080
  85. package/dist/payment-Dfr-Ro-a.js +0 -1
  86. package/dist/resources-CxeFd57z.js +0 -1
  87. package/dist/resources-DwYxn2Vi.mjs +0 -811
@@ -1,889 +0,0 @@
1
- import { defineComponent as X, ref as V, reactive as ee, computed as W, resolveComponent as d, openBlock as c, createBlock as F, withCtx as l, createVNode as e, createTextVNode as m, createElementVNode as i, unref as k, createCommentVNode as T, createElementBlock as b, Fragment as U, renderList as M, toDisplayString as I } from "vue";
2
- import { _ as me } from "./EditLayout.vue_vue_type_script_setup_true_lang-DWMqQvHl.mjs";
3
- import { Lock as ce, LockOpen as fe, Pencil as te, Eye as pe, EyeOff as ve, Trash2 as le, PlusCircle as oe } from "lucide-vue-next";
4
- import { useConfirmation as ae, useModuleRoute as ge, useModule as ye, useFirebaseIntegration as be } from "@oneclick.dev/cms-kit";
5
- const _e = { class: "space-y-6 py-4" }, xe = { class: "grid grid-cols-2 gap-6" }, ke = { class: "relative" }, Fe = {
6
- key: 0,
7
- class: "text-xs text-red-600 mt-1"
8
- }, Ie = { key: 0 }, Ce = { key: 1 }, De = { class: "flex items-center gap-3" }, he = {
9
- key: 2,
10
- class: "grid gap-2"
11
- }, Se = { class: "w-full flex justify-between items-center" }, Ve = { class: "flex items-center gap-2 ml-auto" }, Ne = /* @__PURE__ */ X({
12
- __name: "CustomerInformationFieldEditorDialog",
13
- props: {
14
- keysInUse: {
15
- type: Array,
16
- default: () => []
17
- }
18
- },
19
- emits: ["add-field", "update-field", "remove-field"],
20
- setup(G, { expose: R, emit: H }) {
21
- const N = H, h = G, { confirm: C } = ae(), t = V(!1), S = V("add"), w = V(null), r = ee({
22
- id: "",
23
- fieldName: "",
24
- fieldDescription: "",
25
- fieldType: "text",
26
- required: !1,
27
- isNativeField: !1,
28
- visible: !0,
29
- options: []
30
- }), z = W(() => {
31
- const p = new Set(h.keysInUse);
32
- return S.value === "edit" && w.value && p.delete(w.value), p;
33
- }), B = [
34
- { value: "text", label: "Text Box" },
35
- { value: "checkbox", label: "Checkbox" },
36
- { value: "radio", label: "Radio Button" },
37
- { value: "select", label: "Select" },
38
- { value: "date", label: "Date Picker" }
39
- ], E = (p) => {
40
- S.value = p ? "edit" : "add", a.value = [], r.id = p?.id || "", w.value = p?.id || null, r.fieldName = p?.fieldName || "", r.fieldDescription = p?.fieldDescription || "", r.fieldType = p?.fieldType || "text", r.required = p?.required || !1, r.isNativeField = p?.isNativeField || !1, r.options = p?.options || [], r.visible = p?.visible !== void 0 ? p.visible : !0, $.value = S.value === "edit", t.value = !0;
41
- }, P = () => {
42
- t.value = !1, a.value = [];
43
- }, D = () => {
44
- A() && (N("add-field", { ...r }), t.value = !1);
45
- }, O = () => {
46
- A() && (N("update-field", w.value, { ...r }), t.value = !1);
47
- }, x = () => {
48
- N("remove-field", w.value), t.value = !1;
49
- }, a = V([]), A = () => (a.value = [], r.fieldName = r.fieldName.trim(), r.fieldName ? !0 : (a.value.push("Field name is required."), !1)), $ = V(!1), j = async () => {
50
- await C("Previous orders using this field won't update to reflect changes. Are you sure you want to change the key?") && ($.value = !1);
51
- };
52
- return R({
53
- openDialog: E
54
- }), (p, n) => {
55
- const K = d("DialogTitle"), s = d("DialogHeader"), o = d("Label"), y = d("Input"), v = d("Button"), u = d("SelectValue"), _ = d("SelectTrigger"), L = d("SelectItem"), q = d("SelectContent"), Z = d("Select"), J = d("TagsInputItemText"), Y = d("TagsInputItemDelete"), f = d("TagsInputItem"), Q = d("TagsInputInput"), ie = d("TagsInput"), ne = d("Checkbox"), se = d("DialogFooter"), de = d("DialogScrollContent"), re = d("Dialog");
56
- return c(), F(re, {
57
- open: t.value,
58
- "onUpdate:open": n[6] || (n[6] = (g) => t.value = g)
59
- }, {
60
- default: l(() => [
61
- e(de, { class: "sm:max-w-2xl" }, {
62
- default: l(() => [
63
- e(s, null, {
64
- default: l(() => [
65
- e(K, null, {
66
- default: l(() => [...n[7] || (n[7] = [
67
- m("Customer Information", -1)
68
- ])]),
69
- _: 1
70
- })
71
- ]),
72
- _: 1
73
- }),
74
- i("div", _e, [
75
- i("div", xe, [
76
- i("div", null, [
77
- e(o, {
78
- class: "text-bsmase font-normal mb-1.5",
79
- for: "customer-info-field-dialog-fieldname"
80
- }, {
81
- default: l(() => [...n[8] || (n[8] = [
82
- m("Field Name", -1)
83
- ])]),
84
- _: 1
85
- }),
86
- e(y, {
87
- modelValue: r.fieldName,
88
- "onUpdate:modelValue": n[0] || (n[0] = (g) => r.fieldName = g),
89
- id: "customer-info-field-dialog-fieldname"
90
- }, null, 8, ["modelValue"])
91
- ]),
92
- i("div", null, [
93
- e(o, {
94
- class: "text-bsmase font-normal mb-1.5",
95
- for: "customer-info-field-dialog-fieldname"
96
- }, {
97
- default: l(() => [...n[9] || (n[9] = [
98
- m("Key", -1)
99
- ])]),
100
- _: 1
101
- }),
102
- i("div", ke, [
103
- e(y, {
104
- modelValue: r.id,
105
- "onUpdate:modelValue": n[1] || (n[1] = (g) => r.id = g),
106
- id: "customer-info-field-dialog-fieldname",
107
- disabled: $.value
108
- }, null, 8, ["modelValue", "disabled"]),
109
- $.value ? (c(), F(v, {
110
- key: 0,
111
- variant: "ghost",
112
- size: "icon",
113
- class: "absolute group top-0 right-0",
114
- onClick: j
115
- }, {
116
- default: l(() => [
117
- e(k(ce), { class: "size-4 block group-hover:hidden" }),
118
- e(k(fe), { class: "size-4 hidden group-hover:block" })
119
- ]),
120
- _: 1
121
- })) : T("", !0)
122
- ]),
123
- k(z).has(r.id) ? (c(), b("p", Fe, " Key already in use. ")) : T("", !0)
124
- ])
125
- ]),
126
- i("div", null, [
127
- e(o, {
128
- class: "text-sm font-normal mb-1.5",
129
- for: "customer-info-field-dialog-field-description"
130
- }, {
131
- default: l(() => [...n[10] || (n[10] = [
132
- m("Description", -1)
133
- ])]),
134
- _: 1
135
- }),
136
- e(y, {
137
- modelValue: r.fieldDescription,
138
- "onUpdate:modelValue": n[2] || (n[2] = (g) => r.fieldDescription = g),
139
- id: "customer-info-field-dialog-field-description"
140
- }, null, 8, ["modelValue"])
141
- ]),
142
- r.isNativeField ? T("", !0) : (c(), b("div", Ie, [
143
- e(o, { class: "text-sm font-normal mb-1.5" }, {
144
- default: l(() => [...n[11] || (n[11] = [
145
- m("Field Type", -1)
146
- ])]),
147
- _: 1
148
- }),
149
- e(Z, {
150
- modelValue: r.fieldType,
151
- "onUpdate:modelValue": n[3] || (n[3] = (g) => r.fieldType = g)
152
- }, {
153
- default: l(() => [
154
- e(_, null, {
155
- default: l(() => [
156
- e(u, { placeholder: "Select field type" })
157
- ]),
158
- _: 1
159
- }),
160
- e(q, null, {
161
- default: l(() => [
162
- (c(), b(U, null, M(B, (g) => e(L, {
163
- key: g.value,
164
- value: g.value
165
- }, {
166
- default: l(() => [
167
- m(I(g.label), 1)
168
- ]),
169
- _: 2
170
- }, 1032, ["value"])), 64))
171
- ]),
172
- _: 1
173
- })
174
- ]),
175
- _: 1
176
- }, 8, ["modelValue"])
177
- ])),
178
- r.fieldType === "select" || r.fieldType === "radio" ? (c(), b("div", Ce, [
179
- e(o, {
180
- class: "text-sm font-normal mb-1.5",
181
- for: "customer-info-field-dialog-field-new-option"
182
- }, {
183
- default: l(() => [...n[12] || (n[12] = [
184
- m("Options", -1)
185
- ])]),
186
- _: 1
187
- }),
188
- e(ie, {
189
- modelValue: r.options,
190
- "onUpdate:modelValue": n[4] || (n[4] = (g) => r.options = g)
191
- }, {
192
- default: l(() => [
193
- (c(!0), b(U, null, M(r.options, (g) => (c(), F(f, {
194
- key: g,
195
- value: g
196
- }, {
197
- default: l(() => [
198
- e(J),
199
- e(Y)
200
- ]),
201
- _: 1
202
- }, 8, ["value"]))), 128)),
203
- e(Q, {
204
- placeholder: "New option...",
205
- id: "customer-info-field-dialog-field-new-option"
206
- })
207
- ]),
208
- _: 1
209
- }, 8, ["modelValue"])
210
- ])) : T("", !0),
211
- i("div", De, [
212
- e(ne, {
213
- id: "customer-info-field-dialog-field-required",
214
- modelValue: r.required,
215
- "onUpdate:modelValue": n[5] || (n[5] = (g) => r.required = g)
216
- }, null, 8, ["modelValue"]),
217
- e(o, {
218
- for: "customer-info-field-dialog-field-required",
219
- class: "text-base font-normal cursor-pointer"
220
- }, {
221
- default: l(() => [...n[13] || (n[13] = [
222
- m(" Is this field mandatory? ", -1)
223
- ])]),
224
- _: 1
225
- })
226
- ]),
227
- a.value.length > 0 ? (c(), b("p", he, [
228
- (c(!0), b(U, null, M(a.value, (g, ue) => (c(), b("span", {
229
- key: ue,
230
- class: "text-sm text-red-600 block"
231
- }, I(g), 1))), 128))
232
- ])) : T("", !0)
233
- ]),
234
- e(se, { class: "gap-2" }, {
235
- default: l(() => [
236
- i("div", Se, [
237
- S.value === "edit" && !r.isNativeField ? (c(), F(v, {
238
- key: 0,
239
- variant: "destructive",
240
- onClick: x
241
- }, {
242
- default: l(() => [...n[14] || (n[14] = [
243
- m(" Remove Field ", -1)
244
- ])]),
245
- _: 1
246
- })) : T("", !0),
247
- i("div", Ve, [
248
- e(v, {
249
- variant: "outline",
250
- onClick: P
251
- }, {
252
- default: l(() => [...n[15] || (n[15] = [
253
- m(" Cancel ", -1)
254
- ])]),
255
- _: 1
256
- }),
257
- S.value === "add" ? (c(), F(v, {
258
- key: 0,
259
- onClick: D
260
- }, {
261
- default: l(() => [...n[16] || (n[16] = [
262
- m(" Add Field ", -1)
263
- ])]),
264
- _: 1
265
- })) : (c(), F(v, {
266
- key: 1,
267
- onClick: O
268
- }, {
269
- default: l(() => [...n[17] || (n[17] = [
270
- m(" Update Field ", -1)
271
- ])]),
272
- _: 1
273
- }))
274
- ])
275
- ])
276
- ]),
277
- _: 1
278
- })
279
- ]),
280
- _: 1
281
- })
282
- ]),
283
- _: 1
284
- }, 8, ["open"]);
285
- };
286
- }
287
- }), Te = { class: "space-y-6 py-4" }, we = { class: "text-xs text-muted-foreground" }, $e = { class: "grid grid-cols-2 gap-4" }, Ue = {
288
- key: 0,
289
- class: "grid gap-2"
290
- }, Me = { class: "w-full flex justify-between items-center" }, ze = { class: "flex items-center gap-2 ml-auto" }, Ae = /* @__PURE__ */ X({
291
- __name: "MetadataSchemaEditorDialog",
292
- emits: ["add-field", "update-field", "remove-field"],
293
- setup(G, { expose: R, emit: H }) {
294
- const N = H, h = V(!1), C = V("add"), t = ee({
295
- id: "",
296
- key: "",
297
- label: "",
298
- display: "field",
299
- scope: "order",
300
- icon: "",
301
- color: "",
302
- order: 0
303
- }), S = [
304
- { value: "highlight", label: "Highlight", description: "Large prominent card — ideal for door codes, PINs" },
305
- { value: "badge", label: "Badge", description: "Colored pill in the order header — ideal for membership, VIP status" },
306
- { value: "field", label: "Field", description: "Standard label-value row in order details" },
307
- { value: "hidden", label: "Hidden", description: "Not shown in the UI — internal system fields" }
308
- ], w = [
309
- { value: "order", label: "Order", description: "Attached to the whole order" },
310
- { value: "reservation", label: "Reservation", description: "Attached to each individual reservation" }
311
- ], r = (x) => {
312
- C.value = x ? "edit" : "add", D.value = [], t.id = x?.id || "", t.key = x?.key || "", t.label = x?.label || "", t.display = x?.display || "field", t.scope = x?.scope || "order", t.icon = x?.icon || "", t.color = x?.color || "", t.order = x?.order || 0, h.value = !0;
313
- }, z = () => {
314
- h.value = !1, D.value = [];
315
- }, B = () => {
316
- O() && (N("add-field", { ...t }), h.value = !1);
317
- }, E = () => {
318
- O() && (N("update-field", { ...t }), h.value = !1);
319
- }, P = () => {
320
- N("remove-field", t.id), h.value = !1;
321
- }, D = V([]), O = () => (D.value = [], t.key = t.key.trim(), t.label = t.label.trim(), t.key || D.value.push("Metadata key is required."), t.label || D.value.push("Display label is required."), t.key && !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(t.key) && D.value.push("Key must be alphanumeric (letters, numbers, underscores)."), D.value.length === 0);
322
- return R({
323
- openDialog: r
324
- }), (x, a) => {
325
- const A = d("DialogTitle"), $ = d("DialogDescription"), j = d("DialogHeader"), p = d("Label"), n = d("Input"), K = d("RadioGroupItem"), s = d("RadioGroup"), o = d("SelectValue"), y = d("SelectTrigger"), v = d("SelectItem"), u = d("SelectContent"), _ = d("Select"), L = d("LucideIconPicker"), q = d("Button"), Z = d("DialogFooter"), J = d("DialogScrollContent"), Y = d("Dialog");
326
- return c(), F(Y, {
327
- open: h.value,
328
- "onUpdate:open": a[7] || (a[7] = (f) => h.value = f)
329
- }, {
330
- default: l(() => [
331
- e(J, { class: "sm:max-w-2xl" }, {
332
- default: l(() => [
333
- e(j, null, {
334
- default: l(() => [
335
- e(A, null, {
336
- default: l(() => [
337
- m(I(C.value === "add" ? "Add Metadata Field" : "Edit Metadata Field"), 1)
338
- ]),
339
- _: 1
340
- }),
341
- e($, null, {
342
- default: l(() => [...a[8] || (a[8] = [
343
- m(" Configure how an external metadata field is displayed on orders. ", -1)
344
- ])]),
345
- _: 1
346
- })
347
- ]),
348
- _: 1
349
- }),
350
- i("div", Te, [
351
- i("div", null, [
352
- e(p, {
353
- class: "text-sm font-normal mb-1.5",
354
- for: "metadata-field-key"
355
- }, {
356
- default: l(() => [...a[9] || (a[9] = [
357
- m("Metadata Key", -1)
358
- ])]),
359
- _: 1
360
- }),
361
- e(n, {
362
- modelValue: t.key,
363
- "onUpdate:modelValue": a[0] || (a[0] = (f) => t.key = f),
364
- id: "metadata-field-key",
365
- placeholder: "e.g. doorCode, membershipTier",
366
- disabled: C.value === "edit"
367
- }, null, 8, ["modelValue", "disabled"]),
368
- a[10] || (a[10] = i("p", { class: "text-xs text-muted-foreground mt-1" }, " The key in the metadata object. Must match what your external system writes. ", -1))
369
- ]),
370
- i("div", null, [
371
- e(p, {
372
- class: "text-sm font-normal mb-1.5",
373
- for: "metadata-field-label"
374
- }, {
375
- default: l(() => [...a[11] || (a[11] = [
376
- m("Display Label", -1)
377
- ])]),
378
- _: 1
379
- }),
380
- e(n, {
381
- modelValue: t.label,
382
- "onUpdate:modelValue": a[1] || (a[1] = (f) => t.label = f),
383
- id: "metadata-field-label",
384
- placeholder: "e.g. Door Code, Membership"
385
- }, null, 8, ["modelValue"])
386
- ]),
387
- i("div", null, [
388
- e(p, { class: "text-sm font-normal mb-1.5" }, {
389
- default: l(() => [...a[12] || (a[12] = [
390
- m("Display Mode", -1)
391
- ])]),
392
- _: 1
393
- }),
394
- e(s, {
395
- modelValue: t.display,
396
- "onUpdate:modelValue": a[2] || (a[2] = (f) => t.display = f)
397
- }, {
398
- default: l(() => [
399
- (c(), b(U, null, M(S, (f) => i("div", {
400
- key: f.value,
401
- class: "flex items-start space-x-3 space-y-0 rounded-md border p-3 mb-2"
402
- }, [
403
- e(K, {
404
- value: f.value,
405
- id: `display-${f.value}`,
406
- class: "mt-0.5"
407
- }, null, 8, ["value", "id"]),
408
- i("div", null, [
409
- e(p, {
410
- for: `display-${f.value}`,
411
- class: "font-medium cursor-pointer"
412
- }, {
413
- default: l(() => [
414
- m(I(f.label), 1)
415
- ]),
416
- _: 2
417
- }, 1032, ["for"]),
418
- i("p", we, I(f.description), 1)
419
- ])
420
- ])), 64))
421
- ]),
422
- _: 1
423
- }, 8, ["modelValue"])
424
- ]),
425
- i("div", null, [
426
- e(p, { class: "text-sm font-normal mb-1.5" }, {
427
- default: l(() => [...a[13] || (a[13] = [
428
- m("Scope", -1)
429
- ])]),
430
- _: 1
431
- }),
432
- e(_, {
433
- modelValue: t.scope,
434
- "onUpdate:modelValue": a[3] || (a[3] = (f) => t.scope = f)
435
- }, {
436
- default: l(() => [
437
- e(y, null, {
438
- default: l(() => [
439
- e(o, { placeholder: "Select scope" })
440
- ]),
441
- _: 1
442
- }),
443
- e(u, null, {
444
- default: l(() => [
445
- (c(), b(U, null, M(w, (f) => e(v, {
446
- key: f.value,
447
- value: f.value
448
- }, {
449
- default: l(() => [
450
- m(I(f.label) + " — " + I(f.description), 1)
451
- ]),
452
- _: 2
453
- }, 1032, ["value"])), 64))
454
- ]),
455
- _: 1
456
- })
457
- ]),
458
- _: 1
459
- }, 8, ["modelValue"])
460
- ]),
461
- i("div", $e, [
462
- i("div", null, [
463
- e(p, {
464
- class: "text-sm font-normal mb-1.5",
465
- for: "metadata-field-icon"
466
- }, {
467
- default: l(() => [...a[14] || (a[14] = [
468
- m("Icon (Optional)", -1)
469
- ])]),
470
- _: 1
471
- }),
472
- e(L, {
473
- id: "metadata-field-icon",
474
- modelValue: t.icon,
475
- "onUpdate:modelValue": a[4] || (a[4] = (f) => t.icon = f)
476
- }, null, 8, ["modelValue"])
477
- ]),
478
- i("div", null, [
479
- e(p, {
480
- class: "text-sm font-normal mb-1.5",
481
- for: "metadata-field-color"
482
- }, {
483
- default: l(() => [...a[15] || (a[15] = [
484
- m("Color (Optional)", -1)
485
- ])]),
486
- _: 1
487
- }),
488
- e(n, {
489
- modelValue: t.color,
490
- "onUpdate:modelValue": a[5] || (a[5] = (f) => t.color = f),
491
- id: "metadata-field-color",
492
- placeholder: "e.g. #FFD700"
493
- }, null, 8, ["modelValue"])
494
- ])
495
- ]),
496
- i("div", null, [
497
- e(p, {
498
- class: "text-sm font-normal mb-1.5",
499
- for: "metadata-field-order"
500
- }, {
501
- default: l(() => [...a[16] || (a[16] = [
502
- m("Sort Order (Optional)", -1)
503
- ])]),
504
- _: 1
505
- }),
506
- e(n, {
507
- modelValue: t.order,
508
- "onUpdate:modelValue": a[6] || (a[6] = (f) => t.order = f),
509
- modelModifiers: { number: !0 },
510
- id: "metadata-field-order",
511
- type: "number",
512
- placeholder: "0",
513
- class: "max-w-24"
514
- }, null, 8, ["modelValue"]),
515
- a[17] || (a[17] = i("p", { class: "text-xs text-muted-foreground mt-1" }, "Lower numbers appear first.", -1))
516
- ]),
517
- D.value.length > 0 ? (c(), b("p", Ue, [
518
- (c(!0), b(U, null, M(D.value, (f, Q) => (c(), b("span", {
519
- key: Q,
520
- class: "text-sm text-red-600 block"
521
- }, I(f), 1))), 128))
522
- ])) : T("", !0)
523
- ]),
524
- e(Z, { class: "gap-2" }, {
525
- default: l(() => [
526
- i("div", Me, [
527
- C.value === "edit" ? (c(), F(q, {
528
- key: 0,
529
- variant: "destructive",
530
- onClick: P
531
- }, {
532
- default: l(() => [...a[18] || (a[18] = [
533
- m(" Remove Field ", -1)
534
- ])]),
535
- _: 1
536
- })) : T("", !0),
537
- i("div", ze, [
538
- e(q, {
539
- variant: "outline",
540
- onClick: z
541
- }, {
542
- default: l(() => [...a[19] || (a[19] = [
543
- m("Cancel", -1)
544
- ])]),
545
- _: 1
546
- }),
547
- C.value === "add" ? (c(), F(q, {
548
- key: 0,
549
- onClick: B
550
- }, {
551
- default: l(() => [...a[20] || (a[20] = [
552
- m("Add Field", -1)
553
- ])]),
554
- _: 1
555
- })) : (c(), F(q, {
556
- key: 1,
557
- onClick: E
558
- }, {
559
- default: l(() => [...a[21] || (a[21] = [
560
- m("Update Field", -1)
561
- ])]),
562
- _: 1
563
- }))
564
- ])
565
- ])
566
- ]),
567
- _: 1
568
- })
569
- ]),
570
- _: 1
571
- })
572
- ]),
573
- _: 1
574
- }, 8, ["open"]);
575
- };
576
- }
577
- }), Le = {
578
- key: 0,
579
- class: "max-w-2xl"
580
- }, Re = { class: "border rounded-md p-4 mb-4" }, Oe = { class: "font-medium text-sm" }, qe = { class: "flex items-center justify-between gap-4 mt-4" }, Be = { class: "border rounded-md p-4 mb-4" }, Ee = {
581
- key: 0,
582
- class: "text-sm text-muted-foreground py-4 text-center"
583
- }, Pe = { class: "flex items-center gap-3 min-w-0" }, je = { class: "min-w-0" }, He = { class: "font-medium text-sm" }, Ke = { class: "text-xs text-muted-foreground" }, Ge = { class: "bg-muted px-1 py-0.5 rounded text-xs" }, Ze = { class: "flex items-center shrink-0" }, Je = { class: "flex justify-start mt-8" }, et = /* @__PURE__ */ X({
584
- __name: "booking-data",
585
- setup(G) {
586
- const { params: R } = ge(), { confirm: H } = ae(), { config: N } = ye(), h = be(N.project), C = [
587
- {
588
- id: "firstName",
589
- fieldName: "First Name",
590
- fieldType: "text",
591
- required: !0,
592
- visible: !0,
593
- isNativeField: !0
594
- },
595
- {
596
- id: "lastName",
597
- fieldName: "Last Name",
598
- fieldType: "text",
599
- required: !0,
600
- visible: !0,
601
- isNativeField: !0
602
- },
603
- {
604
- id: "phone",
605
- fieldName: "Phone No",
606
- fieldType: "tel",
607
- required: !0,
608
- visible: !0,
609
- isNativeField: !0
610
- },
611
- {
612
- id: "email",
613
- fieldName: "Email",
614
- fieldType: "email",
615
- required: !0,
616
- visible: !0,
617
- isNativeField: !0
618
- },
619
- {
620
- id: "birthdate",
621
- fieldName: "Birthdate",
622
- fieldType: "date",
623
- required: !0,
624
- visible: !0,
625
- isNativeField: !0
626
- }
627
- ], t = ee({
628
- customerInformationFields: [...C],
629
- metadataSchema: []
630
- }), S = V(!1), w = V(!0), r = V(null), z = V(null), B = W(() => {
631
- if (t.customerInformationFields.length !== C.length) return !0;
632
- const s = (y) => JSON.stringify({ ...y }, Object.keys(y).sort()), o = new Set(t.customerInformationFields.map(s));
633
- return C.some((y) => !o.has(s(y)));
634
- }), E = () => {
635
- t.customerInformationFields = [...C];
636
- }, P = (s) => {
637
- const { isNativeField: o, options: y, ...v } = s;
638
- v.fieldType !== "radio" && v.fieldType !== "select" ? delete v.options : v.options = y;
639
- let u = v.id;
640
- if (!u || t.customerInformationFields.some((_) => _.id === u))
641
- for (u = Math.random().toString(36).substr(2, 9); t.customerInformationFields.some((_) => _.id === u); )
642
- u = Math.random().toString(36).substr(2, 9);
643
- t.customerInformationFields.push({ ...v, id: u });
644
- }, D = (s, o) => {
645
- const { isNativeField: y, options: v, ...u } = o;
646
- y && (u.isNativeField = !0), (u.fieldType === "radio" || u.fieldType === "select") && (u.options = v);
647
- const _ = t.customerInformationFields.findIndex((L) => L.id === s);
648
- _ !== -1 && (t.customerInformationFields[_] = { ...u });
649
- }, O = async (s) => {
650
- t.customerInformationFields = t.customerInformationFields.filter((o) => o.id !== s);
651
- }, x = (s) => {
652
- let o = Math.random().toString(36).substr(2, 9);
653
- for (; t.metadataSchema.find((y) => y.id === o); )
654
- o = Math.random().toString(36).substr(2, 9);
655
- t.metadataSchema.push({ ...s, id: o });
656
- }, a = (s) => {
657
- const o = t.metadataSchema.findIndex((y) => y.id === s.id);
658
- o !== -1 && (t.metadataSchema[o] = { ...s });
659
- }, A = (s) => {
660
- t.metadataSchema = t.metadataSchema.filter((o) => o.id !== s);
661
- }, $ = W(() => [...t.metadataSchema].sort((s, o) => (s.order || 0) - (o.order || 0))), j = (s) => {
662
- switch (s) {
663
- case "highlight":
664
- return "Highlight";
665
- case "badge":
666
- return "Badge";
667
- case "field":
668
- return "Field";
669
- case "hidden":
670
- return "Hidden";
671
- default:
672
- return s;
673
- }
674
- }, p = (s) => s === "order" ? "Order" : "Reservation", n = async () => {
675
- S.value = !0;
676
- try {
677
- const s = R.value.id;
678
- if (!s) throw new Error("Missing agenda ID");
679
- await h.update(N.agendaCollection, s, {
680
- customerInformationFields: t.customerInformationFields ?? [],
681
- metadataSchema: t.metadataSchema ?? []
682
- });
683
- } catch (s) {
684
- console.error("Error saving changes:", s);
685
- } finally {
686
- S.value = !1;
687
- }
688
- };
689
- return (async () => {
690
- try {
691
- const s = await h.get(N.agendaCollection, R.value.id);
692
- s && (t.customerInformationFields = s.customerInformationFields || [...C], t.metadataSchema = s.metadataSchema || []);
693
- } catch (s) {
694
- console.error("Error loading agenda data:", s);
695
- } finally {
696
- w.value = !1;
697
- }
698
- })(), (s, o) => {
699
- const y = d("Label"), v = d("Button");
700
- return c(), F(me, null, {
701
- default: l(() => [
702
- o[12] || (o[12] = i("h1", { class: "text-lg font-medium mb-2" }, "Booking Data", -1)),
703
- o[13] || (o[13] = i("p", { class: "text-sm text-muted-foreground mb-8" }, "Customer form fields & order metadata", -1)),
704
- w.value ? T("", !0) : (c(), b("div", Le, [
705
- i("div", null, [
706
- e(y, { class: "text-base font-medium" }, {
707
- default: l(() => [...o[2] || (o[2] = [
708
- m(" Customer Information ", -1)
709
- ])]),
710
- _: 1
711
- }),
712
- o[5] || (o[5] = i("p", { class: "text-sm text-muted-foreground mb-2" }, " Fields the customer fills in when booking. ", -1)),
713
- i("div", Re, [
714
- (c(!0), b(U, null, M(t.customerInformationFields, (u) => (c(), b("div", {
715
- key: u.id,
716
- class: "flex items-center justify-between hover:bg-input/50 px-2 rounded"
717
- }, [
718
- i("div", null, [
719
- i("p", Oe, I(u.fieldName), 1)
720
- ]),
721
- i("div", null, [
722
- e(v, {
723
- variant: "ghost",
724
- size: "icon",
725
- onClick: (_) => r.value.openDialog(u),
726
- class: "active:scale-90 transition-transform duration-150"
727
- }, {
728
- default: l(() => [
729
- e(k(te), { class: "size-4" })
730
- ]),
731
- _: 1
732
- }, 8, ["onClick"]),
733
- e(v, {
734
- variant: "ghost",
735
- size: "icon",
736
- onClick: (_) => u.visible = !u.visible,
737
- class: "active:scale-90 transition-transform duration-150"
738
- }, {
739
- default: l(() => [
740
- u.visible ? (c(), F(k(pe), {
741
- key: 0,
742
- class: "size-4"
743
- })) : (c(), F(k(ve), {
744
- key: 1,
745
- class: "size-4"
746
- }))
747
- ]),
748
- _: 2
749
- }, 1032, ["onClick"]),
750
- e(v, {
751
- variant: "ghost",
752
- size: "icon",
753
- disabled: u.isNativeField,
754
- onClick: (_) => t.customerInformationFields = t.customerInformationFields.filter((L) => L.id !== u.id),
755
- class: "active:scale-90 transition-transform duration-150"
756
- }, {
757
- default: l(() => [
758
- e(k(le), { class: "size-4" })
759
- ]),
760
- _: 1
761
- }, 8, ["disabled", "onClick"])
762
- ])
763
- ]))), 128)),
764
- i("div", qe, [
765
- e(v, {
766
- size: "sm",
767
- onClick: o[0] || (o[0] = (u) => r.value.openDialog())
768
- }, {
769
- default: l(() => [
770
- e(k(oe), { class: "size-4" }),
771
- o[3] || (o[3] = m(" Add New Field ", -1))
772
- ]),
773
- _: 1
774
- }),
775
- k(B) ? (c(), F(v, {
776
- key: 0,
777
- size: "sm",
778
- variant: "outline",
779
- onClick: E
780
- }, {
781
- default: l(() => [...o[4] || (o[4] = [
782
- m(" Reset to Default ", -1)
783
- ])]),
784
- _: 1
785
- })) : T("", !0)
786
- ])
787
- ]),
788
- e(Ne, {
789
- ref_key: "customerInfoFieldDialog",
790
- ref: r,
791
- keysInUse: t.customerInformationFields.map((u) => u.id),
792
- onAddField: P,
793
- onUpdateField: D,
794
- onRemoveField: O
795
- }, null, 8, ["keysInUse"])
796
- ]),
797
- o[11] || (o[11] = i("hr", { class: "my-8" }, null, -1)),
798
- i("div", null, [
799
- e(y, { class: "text-base font-medium" }, {
800
- default: l(() => [...o[6] || (o[6] = [
801
- m(" Order Metadata ", -1)
802
- ])]),
803
- _: 1
804
- }),
805
- o[10] || (o[10] = i("p", { class: "text-sm text-muted-foreground mb-2" }, " Configure how externally-attached data is displayed on orders. Your external systems (Cloud Functions, webhooks, API) write metadata to orders — this controls how it appears in the dashboard. ", -1)),
806
- i("div", Be, [
807
- k($).length === 0 ? (c(), b("div", Ee, " No metadata fields configured yet. ")) : T("", !0),
808
- (c(!0), b(U, null, M(k($), (u) => (c(), b("div", {
809
- key: u.id,
810
- class: "flex items-center justify-between hover:bg-input/50 px-2 py-1 rounded"
811
- }, [
812
- i("div", Pe, [
813
- i("div", je, [
814
- i("p", He, I(u.label), 1),
815
- i("p", Ke, [
816
- i("code", Ge, I(u.key), 1),
817
- o[7] || (o[7] = i("span", { class: "mx-1" }, "·", -1)),
818
- i("span", null, I(j(u.display)), 1),
819
- o[8] || (o[8] = i("span", { class: "mx-1" }, "·", -1)),
820
- i("span", null, I(p(u.scope)), 1)
821
- ])
822
- ])
823
- ]),
824
- i("div", Ze, [
825
- e(v, {
826
- variant: "ghost",
827
- size: "icon",
828
- onClick: (_) => z.value.openDialog(u),
829
- class: "active:scale-90 transition-transform duration-150"
830
- }, {
831
- default: l(() => [
832
- e(k(te), { class: "size-4" })
833
- ]),
834
- _: 1
835
- }, 8, ["onClick"]),
836
- e(v, {
837
- variant: "ghost",
838
- size: "icon",
839
- onClick: (_) => A(u.id),
840
- class: "active:scale-90 transition-transform duration-150"
841
- }, {
842
- default: l(() => [
843
- e(k(le), { class: "size-4" })
844
- ]),
845
- _: 1
846
- }, 8, ["onClick"])
847
- ])
848
- ]))), 128)),
849
- e(v, {
850
- size: "sm",
851
- class: "mt-4",
852
- onClick: o[1] || (o[1] = (u) => z.value.openDialog())
853
- }, {
854
- default: l(() => [
855
- e(k(oe), { class: "size-4" }),
856
- o[9] || (o[9] = m(" Add Metadata Field ", -1))
857
- ]),
858
- _: 1
859
- })
860
- ]),
861
- e(Ae, {
862
- ref_key: "metadataSchemaDialog",
863
- ref: z,
864
- onAddField: x,
865
- onUpdateField: a,
866
- onRemoveField: A
867
- }, null, 512)
868
- ]),
869
- i("div", Je, [
870
- e(v, {
871
- onClick: n,
872
- disabled: S.value
873
- }, {
874
- default: l(() => [
875
- m(I(S.value ? "Saving..." : "Save Changes"), 1)
876
- ]),
877
- _: 1
878
- }, 8, ["disabled"])
879
- ])
880
- ]))
881
- ]),
882
- _: 1
883
- });
884
- };
885
- }
886
- });
887
- export {
888
- et as default
889
- };