@oneclick.dev/cms-core-modules 0.0.102 → 0.0.104

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 (102) hide show
  1. package/dist/AgendaOpeningHoursCard-B7ROIPWw.js +1 -0
  2. package/dist/AgendaOpeningHoursCard-Cp4wxUeK.mjs +172 -0
  3. package/dist/AppointmentListTable-DZJNmTMb.mjs +177 -0
  4. package/dist/AppointmentListTable-Dieu9US_.js +1 -0
  5. package/dist/{ContentEditor-Cjqgb64R.mjs → ContentEditor-B1nfKG_5.mjs} +706 -677
  6. package/dist/{ContentEditor-YgOS3kxS.js → ContentEditor-DdFU8piH.js} +15 -16
  7. package/dist/{Create-6uT9HWar.mjs → Create-BRBh0xjM.mjs} +2 -2
  8. package/dist/{Create-DuZ5nZrX.js → Create-qPeQxkdl.js} +1 -1
  9. package/dist/{DateFormatter-2B0R-DY4.mjs → DateFormatter-Bw-87W31.mjs} +212 -227
  10. package/dist/DateFormatter-CYAD4GBN.js +1 -0
  11. package/dist/{Detail-BZ-iE9vf.js → Detail-C857g62L.js} +1 -1
  12. package/dist/{Detail-CJVMJDP7.mjs → Detail-CujdFApD.mjs} +2 -2
  13. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-DWMqQvHl.mjs +76 -0
  14. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-kpjbVSXg.js +1 -0
  15. package/dist/{Entries-DkRhOt95.js → Entries-BaS6H6ak.js} +1 -1
  16. package/dist/{Entries-dLlCrXXe.mjs → Entries-C8UJkrVC.mjs} +1 -1
  17. package/dist/{Find-Bd1uLqSa.mjs → Find-B24ZEhYM.mjs} +1 -1
  18. package/dist/{NewReservationDialog.vue_vue_type_script_setup_true_lang-Bc946oSc.mjs → NewReservationDialog.vue_vue_type_script_setup_true_lang-9Q7TMm4u.mjs} +37 -37
  19. package/dist/{NewReservationDialog.vue_vue_type_script_setup_true_lang-CqERfyYb.js → NewReservationDialog.vue_vue_type_script_setup_true_lang-DiNzGl-q.js} +1 -1
  20. package/dist/{Overview-DoOASlNz.mjs → Overview-3HWhsqaz.mjs} +2 -2
  21. package/dist/{Overview-37nilXzE.js → Overview-CpHhuiaV.js} +1 -1
  22. package/dist/{Overview-DeQQ0FY3.js → Overview-DAxCu9XC.js} +1 -1
  23. package/dist/{Overview-C--dq51X.mjs → Overview-D_T3K6aq.mjs} +1 -1
  24. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-Cz_22Oce.mjs +2927 -0
  25. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-DPPNc-Z5.js +349 -0
  26. package/dist/TableView-CPAw3h8g.js +4 -0
  27. package/dist/TableView-DXmEF6pY.mjs +6143 -0
  28. package/dist/agenda-BNG05SAq.js +1 -0
  29. package/dist/agenda-D1RxMxBS.mjs +1152 -0
  30. package/dist/availability-CMrRa5y2.mjs +269 -0
  31. package/dist/availability-Cf2YfMwM.js +1 -0
  32. package/dist/booking-data-DgJd0BcM.mjs +889 -0
  33. package/dist/booking-data-Di5GmH_8.js +1 -0
  34. package/dist/cms-core-modules.css +1 -1
  35. package/dist/{exceptions-Bp5BSvxO.js → exceptions-CI0B4xVj.js} +1 -1
  36. package/dist/{exceptions-C97cNZYl.mjs → exceptions-vo8SA5SE.mjs} +68 -68
  37. package/dist/index-BtujSJeg.js +35 -0
  38. package/dist/{index-CrGjxSwa.mjs → index-CrgzoTyR.mjs} +1 -1
  39. package/dist/{index-D2a6wEPh.js → index-DPd3waTN.js} +1 -1
  40. package/dist/{index-CABh6Qn6.mjs → index-DrXxXB2F.mjs} +15 -15
  41. package/dist/{index-B-lVEpFX.mjs → index-MYWjg0zi.mjs} +3 -3
  42. package/dist/index-dOdMm1pV.mjs +1105 -0
  43. package/dist/index.cjs.js +1 -1
  44. package/dist/index.mjs +196 -143
  45. package/dist/interpolation-DEDSLETn.mjs +128 -0
  46. package/dist/interpolation-DERg6Lwt.js +1 -0
  47. package/dist/orders-CzzcFQha.mjs +559 -0
  48. package/dist/orders-ETtbA4aQ.js +1 -0
  49. package/dist/{payment-Bosr0m3u.mjs → payment-C3ohkehF.mjs} +1 -1
  50. package/dist/{payment-DDnC03jb.js → payment-Dfr-Ro-a.js} +1 -1
  51. package/dist/{resources-BtF5RUUq.js → resources-CxeFd57z.js} +1 -1
  52. package/dist/{resources-B7qDBC91.mjs → resources-WI_4SO6T.mjs} +2 -2
  53. package/dist/server-handlers.cjs.js +1 -1
  54. package/dist/server-handlers.mjs +457 -387
  55. package/dist/src/appointments/chat-components/AgendaOpeningHoursCard.vue.d.ts +15 -0
  56. package/dist/src/appointments/components/edit/CustomerInformationFieldEditorDialog.vue.d.ts +17 -5
  57. package/dist/src/appointments/components/edit/EventDialog/BookingsList.vue.d.ts +8 -3
  58. package/dist/src/appointments/components/edit/EventDialog/EventDialog.vue.d.ts +1 -0
  59. package/dist/src/appointments/components/edit/EventDialog/ReservationDetailDialog.vue.d.ts +6 -3
  60. package/dist/src/appointments/components/edit/EventTimeline.vue.d.ts +3 -0
  61. package/dist/src/appointments/components/edit/EventView.vue.d.ts +6 -1
  62. package/dist/src/appointments/components/edit/MetadataSchemaEditorDialog.vue.d.ts +12 -0
  63. package/dist/src/appointments/components/edit/OrderMetadataDisplay.vue.d.ts +21 -0
  64. package/dist/src/appointments/components/edit/dashboard/BookingsList.vue.d.ts +8 -3
  65. package/dist/src/appointments/index.d.ts +53 -0
  66. package/dist/src/appointments/pages/edit/agenda.vue.d.ts +3 -1
  67. package/dist/src/appointments/pages/edit/availability.vue.d.ts +1 -26
  68. package/dist/src/appointments/pages/edit/booking-data.vue.d.ts +65 -0
  69. package/dist/src/appointments/pages/edit/orders.vue.d.ts +7 -3
  70. package/dist/src/appointments/tools.d.ts +52 -0
  71. package/dist/src/appointments/types.d.ts +12 -0
  72. package/dist/src/table/config.d.ts +200 -0
  73. package/dist/src/table/get_data_flow-DEFAULT.json.d.ts +129 -0
  74. package/dist/src/table/index.d.ts +200 -0
  75. package/dist/utils-CanmrIWO.mjs +47 -0
  76. package/dist/utils-Yd6F5mea.js +3 -0
  77. package/package.json +2 -2
  78. package/src/appointments/tools.ts +38 -0
  79. package/dist/AppointmentListTable-CQ0WIXtj.js +0 -1
  80. package/dist/AppointmentListTable-aV_UJd6j.mjs +0 -159
  81. package/dist/DateFormatter-DbtOLV0L.js +0 -1
  82. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-DXa-Xxue.mjs +0 -74
  83. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-ozYrxb2g.js +0 -1
  84. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CL5kbDII.mjs +0 -2782
  85. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-DcyyNvf6.js +0 -349
  86. package/dist/TableView-CIJs118q.mjs +0 -5929
  87. package/dist/TableView-DzZYf34i.js +0 -4
  88. package/dist/agenda-CCOjPiwP.mjs +0 -1133
  89. package/dist/agenda-CNPQfaIQ.js +0 -1
  90. package/dist/availability-B1D4Fyzi.mjs +0 -629
  91. package/dist/availability-DxrUcYbW.js +0 -1
  92. package/dist/index-BOnqrBfY.js +0 -35
  93. package/dist/index-Bj0qaL1N.mjs +0 -1091
  94. package/dist/interpolation-BBwG_ON6.mjs +0 -65
  95. package/dist/interpolation-CsOrww73.js +0 -1
  96. package/dist/orders-BJV5vRQr.mjs +0 -397
  97. package/dist/orders-C1C5IEIP.js +0 -1
  98. package/dist/regular-slots-Cc1jmKuC.mjs +0 -222
  99. package/dist/regular-slots-DBs1XVeN.js +0 -1
  100. package/dist/src/appointments/pages/edit/regular-slots.vue.d.ts +0 -2
  101. package/dist/utils-BVKy9S2J.mjs +0 -29
  102. package/dist/utils-D6CaKJbp.js +0 -2
@@ -0,0 +1,889 @@
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
+ };