@oneclick.dev/cms-core-modules 0.0.59 → 0.0.60

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 (147) hide show
  1. package/dist/{Components-D9yIIosM.mjs → Components-C83O-xlF.mjs} +1 -1
  2. package/dist/{ContentEditor-DCmt_y_R.js → ContentEditor-BAepN3Yd.js} +51 -34
  3. package/dist/{ContentEditor-CtGeIzC4.mjs → ContentEditor-BPjWW3d1.mjs} +12341 -10099
  4. package/dist/Create-Bh4g6QW4.js +1 -0
  5. package/dist/{Create-Bwf1RXdG.mjs → Create-Cf7pvh5G.mjs} +38 -39
  6. package/dist/DateFormatter-BPPBZp1j.js +1 -0
  7. package/dist/{CalendarDate-CRT2Viyt.mjs → DateFormatter-DsmlAuYV.mjs} +353 -256
  8. package/dist/{Detail-CpfOQChd.mjs → Detail-B4b_FLDa.mjs} +2 -2
  9. package/dist/{Detail-B-PnkcXD.mjs → Detail-BGD75ul4.mjs} +2 -2
  10. package/dist/{Detail-Dd_OkpcN.js → Detail-BayNaAg9.js} +1 -1
  11. package/dist/{Detail-C4E1T87K.mjs → Detail-Byk781b4.mjs} +3 -3
  12. package/dist/{Detail-Cd5CBVN0.js → Detail-CnK-qbhE.js} +1 -1
  13. package/dist/Detail-CtbWzq-R.js +1 -0
  14. package/dist/{Detail-CNfTDUE5.js → Detail-Cxd2VMOl.js} +1 -1
  15. package/dist/{Detail-BVlGSjOq.mjs → Detail-D10shmpK.mjs} +6 -7
  16. package/dist/{Detail-CwagT6gQ.mjs → Detail-U0mgLKt6.mjs} +2 -2
  17. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-CcysXzmW.mjs +75 -0
  18. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-Czu6Dcde.js +1 -0
  19. package/dist/{Entries-zyhycw1M.mjs → Entries-C6Di46My.mjs} +1 -1
  20. package/dist/{Find-BPR0uU-Z.mjs → Find-B4sAEx0B.mjs} +2 -2
  21. package/dist/{Find-BidEQJxT.js → Find-Ds6OvuH6.js} +1 -1
  22. package/dist/{GlobalStyling-BLQ_1W2y.mjs → GlobalStyling-C9VthHWK.mjs} +1 -1
  23. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-BJitmbPE.mjs +396 -0
  24. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-D50uTpZY.js +1 -0
  25. package/dist/Overview-B-8TLLjh.js +1 -0
  26. package/dist/{Overview-CDN88OSM.mjs → Overview-BCpJNiEB.mjs} +1 -1
  27. package/dist/Overview-B_99j5eA.js +1 -0
  28. package/dist/{Overview-BLsZMHNW.mjs → Overview-CIa1E-HH.mjs} +1 -1
  29. package/dist/{Overview-D1nJLBe1.mjs → Overview-CgViRnNc.mjs} +1 -1
  30. package/dist/Overview-DtWvKB3W.mjs +327 -0
  31. package/dist/Overview-HvlDEgqi.mjs +862 -0
  32. package/dist/{Overview-BH3NwvNX.mjs → Overview-Su8ZUbMs.mjs} +3 -3
  33. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CI8YgHdU.js +345 -0
  34. package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-P-MWwcVh.mjs +2093 -0
  35. package/dist/{TableView-CS13LLxk.mjs → TableView-B8iLWWcP.mjs} +48394 -36321
  36. package/dist/TableView-BxK6R8v3.js +312 -0
  37. package/dist/{TemplateList.vue_vue_type_script_setup_true_lang-BiLAkhIA.mjs → TemplateList.vue_vue_type_script_setup_true_lang-Cmovy7kk.mjs} +5 -5
  38. package/dist/{View-C7axVP9t.mjs → View-DDXN0tKD.mjs} +7 -7
  39. package/dist/View-DfzaVOzS.js +1 -0
  40. package/dist/agenda-D81m29_4.mjs +1135 -0
  41. package/dist/agenda-uzPPxgsW.js +1 -0
  42. package/dist/availability-B-tRp8hB.mjs +629 -0
  43. package/dist/availability-BiBbzEIM.js +1 -0
  44. package/dist/{exceptions-D3b18TiY.mjs → exceptions-BFchkR06.mjs} +70 -71
  45. package/dist/exceptions-C-DPRNQa.js +1 -0
  46. package/dist/index-4tjmIans.js +1 -0
  47. package/dist/index-AmUV8LZQ.mjs +176 -0
  48. package/dist/index-BDaVYdkD.mjs +7763 -0
  49. package/dist/{index-DT1wWnUk.mjs → index-BWDwEd8D.mjs} +1 -1
  50. package/dist/{index-CImCyE3L.mjs → index-BfBBm9uY.mjs} +1 -1
  51. package/dist/{index-DMoyoaks.mjs → index-Bkq58CeQ.mjs} +2 -2
  52. package/dist/{index-DI6mydpm.mjs → index-CABh6Qn6.mjs} +2 -2
  53. package/dist/{index-CQiY-oTN.mjs → index-CQkOH2_3.mjs} +1 -1
  54. package/dist/{index-Bwi1mtkq.mjs → index-CU-tbS5W.mjs} +1 -1
  55. package/dist/{index-BzuHN-r8.mjs → index-Cpnn_Pxd.mjs} +1 -1
  56. package/dist/index-CxETuRsG.js +1 -0
  57. package/dist/{index-DyCHxFp3.mjs → index-DRqJOqUR.mjs} +502 -449
  58. package/dist/index-DTago6vW-Bhr8E1Y6.js +88 -0
  59. package/dist/index-DTago6vW-CnomHQ_S.mjs +4123 -0
  60. package/dist/index-DfV8-6ON.js +245 -0
  61. package/dist/index-Dnn2SCSl.js +1 -0
  62. package/dist/{index-BEGU8Kme.mjs → index-Dpl9sU6a.mjs} +2 -2
  63. package/dist/index-Uf7TwBuW.mjs +110 -0
  64. package/dist/index-YMaY4uuk-BgpTtr73.js +1 -0
  65. package/dist/{index-CKPshlZ8-BQiiP6r_.mjs → index-YMaY4uuk-C_xV5K9Z.mjs} +399 -363
  66. package/dist/{index--jjEzba7.mjs → index-cOnxXTbF.mjs} +1 -1
  67. package/dist/index-hlylYYgy.mjs +24 -0
  68. package/dist/index.cjs.js +1 -1
  69. package/dist/index.mjs +98 -81
  70. package/dist/orders-Bh8w0ueq.mjs +346 -0
  71. package/dist/orders-Dt0zMz97.js +1 -0
  72. package/dist/payment-BQaAqQ5q.js +1 -0
  73. package/dist/payment-BbWByERf.mjs +1080 -0
  74. package/dist/regular-1LXNPviB.js +1 -0
  75. package/dist/regular-_05oq5Tx.mjs +1101 -0
  76. package/dist/regular-slots-Bs3WJB3U.js +1 -0
  77. package/dist/regular-slots-C2NYxLPn.mjs +222 -0
  78. package/dist/resources-DgPnEv76.mjs +811 -0
  79. package/dist/resources-eb0pivDL.js +1 -0
  80. package/dist/src/appointments/components/edit/EditLayout.vue.d.ts +2 -2
  81. package/dist/src/appointments/components/edit/EventDialog/BookingsList.vue.d.ts +92 -0
  82. package/dist/src/appointments/components/edit/EventDialog/CancelReservationDialog.vue.d.ts +8 -0
  83. package/dist/src/appointments/components/edit/EventDialog/EventDialog.vue.d.ts +10 -0
  84. package/dist/src/appointments/components/edit/{EventDialog.vue.d.ts → EventDialog/ResendConfirmationDialog.vue.d.ts} +1 -1
  85. package/dist/src/appointments/components/edit/EventDialog/ReservationDetailDialog.vue.d.ts +51 -0
  86. package/dist/src/appointments/components/edit/EventDialog/TimelineChart.vue.d.ts +24 -0
  87. package/dist/src/appointments/components/edit/EventDialog/TransferReservationDialog.vue.d.ts +4 -0
  88. package/dist/src/appointments/components/edit/EventTimeline.vue.d.ts +15 -7
  89. package/dist/src/appointments/components/edit/NewReservationDialog/NewReservationDialog.vue.d.ts +2 -0
  90. package/dist/src/appointments/components/edit/dashboard/BookingsList.vue.d.ts +68 -0
  91. package/dist/src/appointments/components/edit/dashboard/Timeline.vue.d.ts +15 -0
  92. package/dist/src/appointments/components/edit/dashboard/timeline/ResourceSelector.vue.d.ts +50 -0
  93. package/dist/src/appointments/config.d.ts +30 -0
  94. package/dist/src/appointments/index.d.ts +32 -5
  95. package/dist/src/appointments/pages/edit/agenda.vue.d.ts +1 -1
  96. package/dist/src/appointments/pages/edit/availability.vue.d.ts +1 -1
  97. package/dist/src/appointments/pages/edit/index.vue.d.ts +1 -1
  98. package/dist/src/appointments/pages/edit/orders.vue.d.ts +64 -0
  99. package/dist/src/appointments/pages/edit/payment.vue.d.ts +1 -1
  100. package/dist/src/appointments/pages/edit/regular-slots.vue.d.ts +1 -1
  101. package/dist/src/appointments/pages/edit/resources.vue.d.ts +1 -1
  102. package/dist/src/appointments/routes.d.ts +2 -5
  103. package/dist/src/appointments/types.d.ts +16 -0
  104. package/dist/src/appointments/utils/printReservation.d.ts +45 -0
  105. package/dist/src/content-manager/components/content-editor/ContentStructuredContentSections.vue.d.ts +4 -0
  106. package/dist/src/content-manager/components/content-editor/PageSettings.vue.d.ts +2 -0
  107. package/dist/src/content-manager/components/content-editor/SidebarSectionWrapper.vue.d.ts +11 -1
  108. package/dist/src/content-manager/types.d.ts +5 -0
  109. package/dist/{vee-validate-zod-BPQyEfpF.js → vee-validate-zod-ByykgYKJ.js} +1 -1
  110. package/dist/{vee-validate-zod-IXkfh-6Q.mjs → vee-validate-zod-CcOwoF6y.mjs} +4 -4
  111. package/package.json +4 -2
  112. package/dist/CalendarDate-CWtpXgpD.js +0 -1
  113. package/dist/Create-BP8TX6rj.js +0 -1
  114. package/dist/DateFormatter-BbcSwTs4.js +0 -1
  115. package/dist/DateFormatter-CbO0PVUK.mjs +0 -99
  116. package/dist/Detail-DUo6qKqO.js +0 -1
  117. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-BWuKVkvV.js +0 -1
  118. package/dist/EditLayout.vue_vue_type_script_setup_true_lang-D0-EcU0_.mjs +0 -55
  119. package/dist/Overview-BNMZ9MUK.js +0 -1
  120. package/dist/Overview-CEPodGCn.mjs +0 -311
  121. package/dist/Overview-CvquDPhB.js +0 -1
  122. package/dist/Overview-D67UjG6n.mjs +0 -947
  123. package/dist/RegularSlotEditor.vue_vue_type_script_setup_true_lang-0xZSq0rx.js +0 -1
  124. package/dist/RegularSlotEditor.vue_vue_type_script_setup_true_lang-Bj_PVLLV.mjs +0 -392
  125. package/dist/TableView-Dv4YXBD1.js +0 -111
  126. package/dist/View-7qb_ohVo.js +0 -1
  127. package/dist/agenda-B49oKGeh.mjs +0 -706
  128. package/dist/agenda-DipQ5IWP.js +0 -1
  129. package/dist/availability-C7q9tq6l.js +0 -1
  130. package/dist/availability-DeCkqiu8.mjs +0 -613
  131. package/dist/exceptions-DJ9zWX3k.js +0 -1
  132. package/dist/index-CKPshlZ8-CIz1tDwX.js +0 -1
  133. package/dist/index-DUeFrD-B.js +0 -1
  134. package/dist/index-DsnoK4ia.mjs +0 -579
  135. package/dist/index-WL1P6d3j.js +0 -1
  136. package/dist/index-_mG-aU3Z.mjs +0 -87
  137. package/dist/index-_sQDF1pH.js +0 -1
  138. package/dist/index-klI238nT.mjs +0 -24
  139. package/dist/payment-kTjsV0Jj.js +0 -1
  140. package/dist/payment-zpCM0LD-.mjs +0 -981
  141. package/dist/regular-C4_3YXqx.mjs +0 -602
  142. package/dist/regular-DFwPEbZO.js +0 -1
  143. package/dist/regular-slots-4ooEpICB.mjs +0 -67
  144. package/dist/regular-slots-BAVGbomI.js +0 -1
  145. package/dist/resources-MpQkSstv.mjs +0 -563
  146. package/dist/resources-iM28T3dD.js +0 -1
  147. package/dist/src/appointments/components/edit/RegularSlotEditor.vue.d.ts +0 -16
@@ -0,0 +1,1080 @@
1
+ import { defineComponent as z, inject as H, resolveComponent as m, openBlock as i, createElementBlock as u, createElementVNode as l, createVNode as t, withCtx as o, createTextVNode as s, createCommentVNode as w, ref as M, Fragment as U, renderList as L, unref as b, toDisplayString as k, withModifiers as Z, normalizeClass as B, useTemplateRef as ee, nextTick as te, reactive as ne, provide as le, createBlock as Y, normalizeStyle as oe } from "vue";
2
+ import { _ as se } from "./EditLayout.vue_vue_type_script_setup_true_lang-CcysXzmW.mjs";
3
+ import { DollarSign as de, Pencil as ae, Trash2 as F, PlusCircle as G, Users as K, ChevronDown as ie } from "lucide-vue-next";
4
+ import { useConfirmation as re, useModuleRoute as ue, useModule as me, useFirebaseIntegration as pe } from "@oneclick.dev/cms-kit";
5
+ import { t as ce } from "./index-RLz1QPrf.mjs";
6
+ const fe = { class: "flex gap-3 items-start p-4 border rounded-lg" }, ve = { class: "flex-1 space-y-3" }, ge = { class: "grid grid-cols-2 gap-3" }, xe = { class: "flex items-center space-x-2 my-4" }, ye = { class: "grid grid-cols-2 gap-2" }, be = { key: 0 }, _e = { key: 1 }, ke = { key: 2 }, Ve = { key: 3 }, Oe = { key: 4 }, Ce = { key: 0 }, Se = /* @__PURE__ */ z({
7
+ __name: "Addon",
8
+ props: {
9
+ addOn: {
10
+ type: Object,
11
+ required: !0
12
+ }
13
+ },
14
+ setup(p) {
15
+ const V = H("form"), O = (_) => {
16
+ V.addOns = V.addOns.filter((n) => n.id !== _);
17
+ };
18
+ return (_, n) => {
19
+ const v = m("Label"), y = m("Input"), C = m("Checkbox"), S = m("SelectTrigger"), g = m("SelectItem"), A = m("SelectGroup"), E = m("SelectContent"), N = m("Select"), j = m("Trash2"), q = m("Button");
20
+ return i(), u("div", fe, [
21
+ l("div", ve, [
22
+ l("div", ge, [
23
+ l("div", null, [
24
+ t(v, { class: "text-xs mb-1 block" }, {
25
+ default: o(() => [...n[7] || (n[7] = [
26
+ s("Add-on Name", -1)
27
+ ])]),
28
+ _: 1
29
+ }),
30
+ t(y, {
31
+ modelValue: p.addOn.name,
32
+ "onUpdate:modelValue": n[0] || (n[0] = (x) => p.addOn.name = x),
33
+ placeholder: "e.g., Swimsuit Rental, Towel Service"
34
+ }, null, 8, ["modelValue"])
35
+ ]),
36
+ l("div", null, [
37
+ t(v, { class: "text-xs mb-1 block" }, {
38
+ default: o(() => [...n[8] || (n[8] = [
39
+ s("Price", -1)
40
+ ])]),
41
+ _: 1
42
+ }),
43
+ t(y, {
44
+ modelValue: p.addOn.price,
45
+ "onUpdate:modelValue": n[1] || (n[1] = (x) => p.addOn.price = x),
46
+ modelModifiers: { number: !0 },
47
+ type: "number",
48
+ min: "0",
49
+ step: "0.01",
50
+ placeholder: "0.00",
51
+ class: "no-spinner"
52
+ }, null, 8, ["modelValue"])
53
+ ])
54
+ ]),
55
+ l("div", null, [
56
+ t(v, { class: "text-xs mb-1 block" }, {
57
+ default: o(() => [...n[9] || (n[9] = [
58
+ s("Description (Optional)", -1)
59
+ ])]),
60
+ _: 1
61
+ }),
62
+ t(y, {
63
+ modelValue: p.addOn.description,
64
+ "onUpdate:modelValue": n[2] || (n[2] = (x) => p.addOn.description = x),
65
+ placeholder: "Brief description of this add-on"
66
+ }, null, 8, ["modelValue"])
67
+ ]),
68
+ l("div", xe, [
69
+ t(C, {
70
+ id: `required-${p.addOn.id}`,
71
+ modelValue: p.addOn.required,
72
+ "onUpdate:modelValue": n[3] || (n[3] = (x) => p.addOn.required = x)
73
+ }, null, 8, ["id", "modelValue"]),
74
+ t(v, {
75
+ for: `required-${p.addOn.id}`,
76
+ class: "text-xs font-normal cursor-pointer"
77
+ }, {
78
+ default: o(() => [...n[10] || (n[10] = [
79
+ s(" Required (customer must select this add-on) ", -1)
80
+ ])]),
81
+ _: 1
82
+ }, 8, ["for"])
83
+ ]),
84
+ l("div", ye, [
85
+ l("div", null, [
86
+ t(v, { class: "text-xs mb-1 block" }, {
87
+ default: o(() => [...n[11] || (n[11] = [
88
+ s("Quantity limit", -1)
89
+ ])]),
90
+ _: 1
91
+ }),
92
+ t(N, {
93
+ modelValue: p.addOn.scope,
94
+ "onUpdate:modelValue": n[4] || (n[4] = (x) => p.addOn.scope = x)
95
+ }, {
96
+ default: o(() => [
97
+ t(S, { class: "w-full" }, {
98
+ default: o(() => [
99
+ p.addOn.scope === "RESERVATION" ? (i(), u("span", be, "Once per reservation")) : p.addOn.scope === "TICKET" ? (i(), u("span", _e, "Once per ticket / person")) : p.addOn.scope === "UNLIMITED" ? (i(), u("span", ke, "Unlimited")) : p.addOn.scope === "CUSTOM_LIMIT" ? (i(), u("span", Ve, "Custom limit...")) : (i(), u("span", Oe, "Select a limit…"))
100
+ ]),
101
+ _: 1
102
+ }),
103
+ t(E, null, {
104
+ default: o(() => [
105
+ t(A, { class: "max-w-96" }, {
106
+ default: o(() => [
107
+ t(g, { value: "RESERVATION" }, {
108
+ default: o(() => [...n[12] || (n[12] = [
109
+ l("div", { class: "flex flex-col" }, [
110
+ l("p", { class: "text-sm font-bold mb-1" }, "Once per reservation"),
111
+ l("p", { class: "text-xs" }, "Max 1 per reservation line (charged per reservation).")
112
+ ], -1)
113
+ ])]),
114
+ _: 1
115
+ }),
116
+ t(g, { value: "TICKET" }, {
117
+ default: o(() => [...n[13] || (n[13] = [
118
+ l("div", { class: "flex flex-col" }, [
119
+ l("p", { class: "text-sm font-bold mb-1" }, "Once per ticket / person"),
120
+ l("p", { class: "text-xs" }, "Max 1 per ticket/person (charged per quantity).")
121
+ ], -1)
122
+ ])]),
123
+ _: 1
124
+ }),
125
+ t(g, { value: "UNLIMITED" }, {
126
+ default: o(() => [...n[14] || (n[14] = [
127
+ l("div", { class: "flex flex-col" }, [
128
+ l("p", { class: "text-sm font-bold mb-1" }, "Unlimited"),
129
+ l("p", { class: "text-xs" }, "No limit (can be added multiple times).")
130
+ ], -1)
131
+ ])]),
132
+ _: 1
133
+ }),
134
+ t(g, { value: "CUSTOM_LIMIT" }, {
135
+ default: o(() => [...n[15] || (n[15] = [
136
+ l("div", { class: "flex flex-col" }, [
137
+ l("p", { class: "text-sm font-bold mb-1" }, "Custom limit..."),
138
+ l("p", { class: "text-xs" }, "Set a fixed max amount (e.g. 2, 5, 10).")
139
+ ], -1)
140
+ ])]),
141
+ _: 1
142
+ })
143
+ ]),
144
+ _: 1
145
+ })
146
+ ]),
147
+ _: 1
148
+ })
149
+ ]),
150
+ _: 1
151
+ }, 8, ["modelValue"])
152
+ ]),
153
+ p.addOn.scope === "CUSTOM_LIMIT" ? (i(), u("div", Ce, [
154
+ t(v, { class: "text-xs mb-1 block" }, {
155
+ default: o(() => [...n[16] || (n[16] = [
156
+ s("Fixed limit", -1)
157
+ ])]),
158
+ _: 1
159
+ }),
160
+ t(y, {
161
+ modelValue: p.addOn.limit,
162
+ "onUpdate:modelValue": n[5] || (n[5] = (x) => p.addOn.limit = x),
163
+ modelModifiers: { number: !0 },
164
+ type: "number",
165
+ min: "1",
166
+ step: "1",
167
+ placeholder: "1",
168
+ class: "no-spinner"
169
+ }, null, 8, ["modelValue"])
170
+ ])) : w("", !0)
171
+ ])
172
+ ]),
173
+ t(q, {
174
+ onClick: n[6] || (n[6] = (x) => O(p.addOn.id)),
175
+ variant: "ghost",
176
+ size: "icon",
177
+ class: "mt-6"
178
+ }, {
179
+ default: o(() => [
180
+ t(j, { class: "w-4 h-4 text-destructive" })
181
+ ]),
182
+ _: 1
183
+ })
184
+ ]);
185
+ };
186
+ }
187
+ }), we = { class: "grid gap-2" }, Ie = ["id"], Pe = ["onClick"], Ue = { class: "flex items-center gap-2" }, Ae = { class: "flex items-center gap-1" }, Te = { class: "overflow-hidden" }, Re = /* @__PURE__ */ z({
188
+ __name: "AddonList",
189
+ setup(p, { expose: V }) {
190
+ const { confirm: O } = re(), _ = H("form"), n = M([]), v = async (y) => {
191
+ if (!await O("Are you sure you want to remove this add-on?")) return;
192
+ _.addOns = _.addOns.filter((g) => g.id !== y);
193
+ const S = n.value.indexOf(y);
194
+ S !== -1 && n.value.splice(S, 1), ce("Success!", {
195
+ description: "Add-on removed successfully."
196
+ });
197
+ };
198
+ return V({
199
+ openAddons: n
200
+ }), (y, C) => {
201
+ const S = m("Button");
202
+ return i(), u("div", we, [
203
+ (i(!0), u(U, null, L(b(_).addOns, (g) => (i(), u("div", {
204
+ key: g.id,
205
+ class: "border p-2 rounded",
206
+ id: `addon-${g.id}`
207
+ }, [
208
+ l("div", {
209
+ onClick: (A) => n.value.includes(g.id) ? n.value.splice(n.value.indexOf(g.id), 1) : n.value.push(g.id),
210
+ class: "cursor-pointer font-bold text-muted-foreground flex items-center justify-between gap-2 select-none"
211
+ }, [
212
+ l("span", Ue, [
213
+ t(b(de), { class: "size-4" }),
214
+ s(" " + k(g.name || "Untitled Add-on"), 1)
215
+ ]),
216
+ l("div", Ae, [
217
+ t(S, {
218
+ variant: "ghost",
219
+ size: "icon"
220
+ }, {
221
+ default: o(() => [
222
+ t(b(ae), { class: "size-4" })
223
+ ]),
224
+ _: 1
225
+ }),
226
+ t(S, {
227
+ variant: "ghost",
228
+ size: "icon",
229
+ onClick: Z((A) => v(g.id), ["stop"])
230
+ }, {
231
+ default: o(() => [
232
+ t(b(F), { class: "size-4 text-red-500" })
233
+ ]),
234
+ _: 1
235
+ }, 8, ["onClick"])
236
+ ])
237
+ ], 8, Pe),
238
+ l("div", {
239
+ class: B(["grid", `${n.value.includes(g.id) ? "grid-rows-[1fr]" : "grid-rows-[0fr]"} transition-all duration-300 ease-in-out overflow-hidden`])
240
+ }, [
241
+ l("div", Te, [
242
+ t(Se, { addOn: g }, null, 8, ["addOn"])
243
+ ])
244
+ ], 2)
245
+ ], 8, Ie))), 128))
246
+ ]);
247
+ };
248
+ }
249
+ }), $e = { class: "flex items-center justify-between mb-4" }, De = { class: "space-y-3" }, he = {
250
+ key: 0,
251
+ class: "text-center py-8 text-muted-foreground text-sm border rounded-lg"
252
+ }, Me = /* @__PURE__ */ z({
253
+ __name: "index",
254
+ setup(p) {
255
+ const V = H("form"), O = ee("addonList"), _ = async () => {
256
+ const n = Math.random().toString(36).substr(2, 9);
257
+ V.addOns.push({
258
+ id: n,
259
+ name: "",
260
+ description: "",
261
+ price: 0,
262
+ required: !1
263
+ }), O.value?.openAddons.push(n), await te(), document.getElementById(`addon-${n}`)?.scrollIntoView({ behavior: "smooth", block: "start" });
264
+ };
265
+ return (n, v) => {
266
+ const y = m("Label"), C = m("Button");
267
+ return i(), u("div", null, [
268
+ l("div", $e, [
269
+ l("div", null, [
270
+ t(y, { class: "text-base font-medium" }, {
271
+ default: o(() => [...v[0] || (v[0] = [
272
+ s(" Optional Add-ons & Upcharges ", -1)
273
+ ])]),
274
+ _: 1
275
+ }),
276
+ v[1] || (v[1] = l("p", { class: "text-sm text-muted-foreground mt-1" }, " Offer optional extras that customers can add to their booking (e.g., swimsuit rental). ", -1))
277
+ ]),
278
+ t(C, {
279
+ onClick: _,
280
+ variant: "outline",
281
+ size: "sm"
282
+ }, {
283
+ default: o(() => [
284
+ t(b(G), { class: "w-4 h-4 mr-2" }),
285
+ v[2] || (v[2] = s(" Add Add-on ", -1))
286
+ ]),
287
+ _: 1
288
+ })
289
+ ]),
290
+ l("div", De, [
291
+ t(Re, {
292
+ ref_key: "addonList",
293
+ ref: O
294
+ }, null, 512),
295
+ b(V).addOns.length === 0 ? (i(), u("div", he, ' No add-ons configured. Click "Add Add-on" to create optional extras. ')) : w("", !0)
296
+ ])
297
+ ]);
298
+ };
299
+ }
300
+ }), Le = {
301
+ key: 0,
302
+ class: "max-w-2xl space-y-12"
303
+ }, Be = { class: "flex gap-4 items-end" }, ze = { class: "w-32" }, Ee = { class: "flex items-center justify-between mb-4 gap-4" }, Ne = { class: "space-y-3" }, je = { class: "flex-1 space-y-3" }, qe = { class: "flex gap-3" }, Fe = { class: "flex-1" }, Ge = { class: "flex-1" }, He = { class: "flex items-end" }, We = { class: "flex items-center justify-between mb-4" }, Ye = { class: "space-y-3" }, Ke = { class: "flex-1 space-y-3" }, Qe = { class: "grid grid-cols-2 gap-3" }, Je = { class: "grid grid-cols-2 gap-3" }, Xe = { key: 0 }, Ze = { class: "flex items-center gap-2" }, et = { key: 0 }, tt = { key: 1 }, nt = { key: 2 }, lt = { class: "space-y-1" }, ot = ["onClick"], st = { class: "size-5 rounded-full bg-muted flex items-center justify-center" }, dt = {
304
+ key: 0,
305
+ class: "w-full h-full rounded-full bg-white scale-50"
306
+ }, at = ["onClick"], it = { class: "text-sm flex-1 truncate" }, rt = {
307
+ key: 0,
308
+ class: "w-3 h-3 text-white",
309
+ fill: "none",
310
+ viewBox: "0 0 24 24",
311
+ stroke: "currentColor"
312
+ }, ut = {
313
+ key: 0,
314
+ class: "text-center py-8 text-muted-foreground text-sm border rounded-lg"
315
+ }, mt = {
316
+ key: 0,
317
+ class: "mt-6 p-4 border rounded-lg bg-muted/30"
318
+ }, pt = { class: "space-y-4" }, ct = { class: "flex items-center gap-3" }, ft = { class: "flex-1" }, vt = { class: "text-sm text-muted-foreground" }, gt = { class: "text-xs text-muted-foreground" }, xt = { class: "flex justify-start pt-4 border-t" }, St = /* @__PURE__ */ z({
319
+ __name: "payment",
320
+ setup(p) {
321
+ const { params: V } = ue(), { config: O } = me(), _ = pe(O.project), n = ne({
322
+ paymentType: "full",
323
+ currency: "USD",
324
+ partialPayment: {
325
+ type: "percentage",
326
+ amount: 50
327
+ },
328
+ pricingOptions: [
329
+ {
330
+ id: "1",
331
+ name: "Standard Service",
332
+ price: 0,
333
+ duration: 30,
334
+ // Duration in minutes
335
+ isDefault: !0
336
+ }
337
+ ],
338
+ pricingRules: [],
339
+ addOns: []
340
+ }), v = M(!1), y = M(!0), C = M([]), S = (a, e) => {
341
+ if (!a.resourceIds)
342
+ a.resourceIds = [e];
343
+ else {
344
+ const c = a.resourceIds.indexOf(e);
345
+ c === -1 ? a.resourceIds.push(e) : a.resourceIds.splice(c, 1);
346
+ }
347
+ }, g = (a, e) => {
348
+ a.resourceIds = e ? null : [];
349
+ }, A = async () => {
350
+ v.value = !0;
351
+ try {
352
+ const a = V.value.id;
353
+ if (!a) throw new Error("Missing agenda ID");
354
+ await _.update(O.agendaCollection, a, {
355
+ paymentType: n.paymentType || "full",
356
+ currency: n.currency || "USD",
357
+ partialPayment: {
358
+ type: n.partialPayment.type || "percentage",
359
+ amount: Math.max(Number(n.partialPayment.amount) || 0, 0)
360
+ },
361
+ pricingOptions: n.pricingOptions ?? [],
362
+ pricingRules: n.pricingRules ?? [],
363
+ addOns: n.addOns ?? []
364
+ });
365
+ } catch (a) {
366
+ console.error("Error saving changes:", a);
367
+ } finally {
368
+ v.value = !1;
369
+ }
370
+ }, E = () => {
371
+ const a = Math.random().toString(36).substr(2, 9);
372
+ n.pricingOptions.push({
373
+ id: a,
374
+ name: "",
375
+ price: 0,
376
+ duration: 30,
377
+ // Default 30 minutes
378
+ isDefault: !1
379
+ });
380
+ }, N = (a) => {
381
+ n.pricingOptions = n.pricingOptions.filter((e) => e.id !== a);
382
+ }, j = (a) => {
383
+ n.pricingOptions.forEach((e) => {
384
+ e.isDefault = e.id === a;
385
+ });
386
+ }, q = () => {
387
+ const a = Math.random().toString(36).substr(2, 9);
388
+ n.pricingRules.push({
389
+ id: a,
390
+ name: "",
391
+ condition: "time_after",
392
+ // time_after, time_before, day_of_week, etc.
393
+ conditionValue: "17:00",
394
+ modifier: "fixed",
395
+ // 'fixed' or 'percentage'
396
+ amount: 10,
397
+ resourceIds: null
398
+ // null = all resources
399
+ });
400
+ }, x = (a) => {
401
+ n.pricingRules = n.pricingRules.filter((e) => e.id !== a);
402
+ };
403
+ return (async () => {
404
+ try {
405
+ const a = await _.get(O.agendaCollection, V.value.id);
406
+ a && (n.paymentType = a.paymentType || "full", n.currency = a.currency || "USD", n.partialPayment = {
407
+ type: a.partialPayment?.type || "percentage",
408
+ amount: Number(a.partialPayment?.amount) && a.partialPayment.amount > 0 ? parseFloat(a.partialPayment.amount) : 50
409
+ }, n.pricingOptions = a.pricingOptions || [{
410
+ id: "1",
411
+ name: "Standard Service",
412
+ price: 0,
413
+ duration: 30,
414
+ isDefault: !0
415
+ }], n.pricingRules = a.pricingRules || [], n.addOns = a.addOns || [], C.value = (a.resources || []).filter((e) => e.isActive));
416
+ } catch (a) {
417
+ console.error("Error loading agenda data:", a);
418
+ } finally {
419
+ y.value = !1;
420
+ }
421
+ })(), le("form", n), (a, e) => {
422
+ const c = m("Label"), R = m("SelectValue"), $ = m("SelectTrigger"), f = m("SelectItem"), D = m("SelectContent"), h = m("Select"), I = m("Button"), P = m("Input"), Q = m("PopoverTrigger"), J = m("PopoverContent"), X = m("Popover"), T = m("RadioGroupItem"), W = m("RadioGroup");
423
+ return i(), Y(se, null, {
424
+ default: o(() => [
425
+ e[53] || (e[53] = l("h1", { class: "text-lg font-medium mb-8" }, "Payment Settings", -1)),
426
+ y.value ? w("", !0) : (i(), u("div", Le, [
427
+ l("div", null, [
428
+ l("div", Be, [
429
+ l("div", ze, [
430
+ t(c, { class: "text-base font-medium mb-2" }, {
431
+ default: o(() => [...e[4] || (e[4] = [
432
+ s(" Currency ", -1)
433
+ ])]),
434
+ _: 1
435
+ }),
436
+ t(h, {
437
+ modelValue: n.currency,
438
+ "onUpdate:modelValue": e[0] || (e[0] = (d) => n.currency = d)
439
+ }, {
440
+ default: o(() => [
441
+ t($, { id: "currency" }, {
442
+ default: o(() => [
443
+ t(R, { placeholder: "Currency" })
444
+ ]),
445
+ _: 1
446
+ }),
447
+ t(D, null, {
448
+ default: o(() => [
449
+ t(f, { value: "USD" }, {
450
+ default: o(() => [...e[5] || (e[5] = [
451
+ s("USD ($)", -1)
452
+ ])]),
453
+ _: 1
454
+ }),
455
+ t(f, { value: "EUR" }, {
456
+ default: o(() => [...e[6] || (e[6] = [
457
+ s("EUR (€)", -1)
458
+ ])]),
459
+ _: 1
460
+ }),
461
+ t(f, { value: "GBP" }, {
462
+ default: o(() => [...e[7] || (e[7] = [
463
+ s("GBP (£)", -1)
464
+ ])]),
465
+ _: 1
466
+ }),
467
+ t(f, { value: "CAD" }, {
468
+ default: o(() => [...e[8] || (e[8] = [
469
+ s("CAD ($)", -1)
470
+ ])]),
471
+ _: 1
472
+ })
473
+ ]),
474
+ _: 1
475
+ })
476
+ ]),
477
+ _: 1
478
+ }, 8, ["modelValue"])
479
+ ])
480
+ ])
481
+ ]),
482
+ l("div", null, [
483
+ l("div", Ee, [
484
+ l("div", null, [
485
+ t(c, { class: "text-base font-medium" }, {
486
+ default: o(() => [...e[9] || (e[9] = [
487
+ s(" Service Pricing Options ", -1)
488
+ ])]),
489
+ _: 1
490
+ }),
491
+ e[10] || (e[10] = l("p", { class: "text-sm text-muted-foreground mt-1" }, " Offer multiple service variations with different prices (e.g., haircut styles, massage types). ", -1))
492
+ ]),
493
+ t(I, {
494
+ onClick: E,
495
+ variant: "outline",
496
+ size: "sm"
497
+ }, {
498
+ default: o(() => [
499
+ t(b(G), { class: "w-4 h-4 mr-2" }),
500
+ e[11] || (e[11] = s(" Add Option ", -1))
501
+ ]),
502
+ _: 1
503
+ })
504
+ ]),
505
+ l("div", Ne, [
506
+ (i(!0), u(U, null, L(n.pricingOptions, (d) => (i(), u("div", {
507
+ key: d.id,
508
+ class: "flex gap-3 items-start p-4 border rounded-lg"
509
+ }, [
510
+ l("div", je, [
511
+ l("div", null, [
512
+ t(c, { class: "text-xs mb-1 block" }, {
513
+ default: o(() => [...e[12] || (e[12] = [
514
+ s("Service Name", -1)
515
+ ])]),
516
+ _: 1
517
+ }),
518
+ t(P, {
519
+ modelValue: d.name,
520
+ "onUpdate:modelValue": (r) => d.name = r,
521
+ placeholder: "e.g., Men's Haircut, Women's Haircut"
522
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
523
+ ]),
524
+ l("div", qe, [
525
+ l("div", Fe, [
526
+ t(c, { class: "text-xs mb-1 block" }, {
527
+ default: o(() => [...e[13] || (e[13] = [
528
+ s("Price", -1)
529
+ ])]),
530
+ _: 1
531
+ }),
532
+ t(P, {
533
+ modelValue: d.price,
534
+ "onUpdate:modelValue": (r) => d.price = r,
535
+ modelModifiers: { number: !0 },
536
+ type: "number",
537
+ min: "0",
538
+ step: "0.01",
539
+ placeholder: "0.00",
540
+ class: "no-spinner"
541
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
542
+ ]),
543
+ l("div", Ge, [
544
+ t(c, { class: "text-xs mb-1 block" }, {
545
+ default: o(() => [...e[14] || (e[14] = [
546
+ s("Duration", -1)
547
+ ])]),
548
+ _: 1
549
+ }),
550
+ t(h, {
551
+ modelValue: d.duration,
552
+ "onUpdate:modelValue": (r) => d.duration = r,
553
+ modelModifiers: { number: !0 }
554
+ }, {
555
+ default: o(() => [
556
+ t($, null, {
557
+ default: o(() => [
558
+ t(R, { placeholder: "Duration" })
559
+ ]),
560
+ _: 1
561
+ }),
562
+ t(D, null, {
563
+ default: o(() => [
564
+ t(f, { value: 15 }, {
565
+ default: o(() => [...e[15] || (e[15] = [
566
+ s("15 min", -1)
567
+ ])]),
568
+ _: 1
569
+ }),
570
+ t(f, { value: 30 }, {
571
+ default: o(() => [...e[16] || (e[16] = [
572
+ s("30 min", -1)
573
+ ])]),
574
+ _: 1
575
+ }),
576
+ t(f, { value: 45 }, {
577
+ default: o(() => [...e[17] || (e[17] = [
578
+ s("45 min", -1)
579
+ ])]),
580
+ _: 1
581
+ }),
582
+ t(f, { value: 60 }, {
583
+ default: o(() => [...e[18] || (e[18] = [
584
+ s("1 hour", -1)
585
+ ])]),
586
+ _: 1
587
+ }),
588
+ t(f, { value: 90 }, {
589
+ default: o(() => [...e[19] || (e[19] = [
590
+ s("1.5 hours", -1)
591
+ ])]),
592
+ _: 1
593
+ }),
594
+ t(f, { value: 120 }, {
595
+ default: o(() => [...e[20] || (e[20] = [
596
+ s("2 hours", -1)
597
+ ])]),
598
+ _: 1
599
+ }),
600
+ t(f, { value: 180 }, {
601
+ default: o(() => [...e[21] || (e[21] = [
602
+ s("3 hours", -1)
603
+ ])]),
604
+ _: 1
605
+ }),
606
+ t(f, { value: 240 }, {
607
+ default: o(() => [...e[22] || (e[22] = [
608
+ s("4 hours", -1)
609
+ ])]),
610
+ _: 1
611
+ }),
612
+ t(f, { value: 300 }, {
613
+ default: o(() => [...e[23] || (e[23] = [
614
+ s("5 hours", -1)
615
+ ])]),
616
+ _: 1
617
+ }),
618
+ t(f, { value: 360 }, {
619
+ default: o(() => [...e[24] || (e[24] = [
620
+ s("6 hours", -1)
621
+ ])]),
622
+ _: 1
623
+ }),
624
+ t(f, { value: 480 }, {
625
+ default: o(() => [...e[25] || (e[25] = [
626
+ s("8 hours", -1)
627
+ ])]),
628
+ _: 1
629
+ })
630
+ ]),
631
+ _: 1
632
+ })
633
+ ]),
634
+ _: 1
635
+ }, 8, ["modelValue", "onUpdate:modelValue"])
636
+ ]),
637
+ l("div", He, [
638
+ t(I, {
639
+ onClick: (r) => j(d.id),
640
+ variant: d.isDefault ? "default" : "outline",
641
+ size: "sm"
642
+ }, {
643
+ default: o(() => [
644
+ s(k(d.isDefault ? "Default" : "Set Default"), 1)
645
+ ]),
646
+ _: 2
647
+ }, 1032, ["onClick", "variant"])
648
+ ])
649
+ ])
650
+ ]),
651
+ n.pricingOptions.length > 1 ? (i(), Y(I, {
652
+ key: 0,
653
+ onClick: (r) => N(d.id),
654
+ variant: "ghost",
655
+ size: "icon",
656
+ class: "mt-6"
657
+ }, {
658
+ default: o(() => [
659
+ t(b(F), { class: "w-4 h-4 text-destructive" })
660
+ ]),
661
+ _: 1
662
+ }, 8, ["onClick"])) : w("", !0)
663
+ ]))), 128))
664
+ ])
665
+ ]),
666
+ l("div", null, [
667
+ l("div", We, [
668
+ l("div", null, [
669
+ t(c, { class: "text-base font-medium" }, {
670
+ default: o(() => [...e[26] || (e[26] = [
671
+ s(" Conditional Pricing Rules ", -1)
672
+ ])]),
673
+ _: 1
674
+ }),
675
+ e[27] || (e[27] = l("p", { class: "text-sm text-muted-foreground mt-1" }, " Add extra fees based on time, day, or other conditions (e.g., +€10 after 5pm). ", -1))
676
+ ]),
677
+ t(I, {
678
+ onClick: q,
679
+ variant: "outline",
680
+ size: "sm"
681
+ }, {
682
+ default: o(() => [
683
+ t(b(G), { class: "w-4 h-4 mr-2" }),
684
+ e[28] || (e[28] = s(" Add Rule ", -1))
685
+ ]),
686
+ _: 1
687
+ })
688
+ ]),
689
+ l("div", Ye, [
690
+ (i(!0), u(U, null, L(n.pricingRules, (d) => (i(), u("div", {
691
+ key: d.id,
692
+ class: "flex gap-3 items-start p-4 border rounded-lg"
693
+ }, [
694
+ l("div", Ke, [
695
+ l("div", null, [
696
+ t(c, { class: "text-xs mb-1 block" }, {
697
+ default: o(() => [...e[29] || (e[29] = [
698
+ s("Rule Name", -1)
699
+ ])]),
700
+ _: 1
701
+ }),
702
+ t(P, {
703
+ modelValue: d.name,
704
+ "onUpdate:modelValue": (r) => d.name = r,
705
+ placeholder: "e.g., After Hours Fee, Weekend Surcharge"
706
+ }, null, 8, ["modelValue", "onUpdate:modelValue"])
707
+ ]),
708
+ l("div", Qe, [
709
+ l("div", null, [
710
+ t(c, { class: "text-xs mb-1 block" }, {
711
+ default: o(() => [...e[30] || (e[30] = [
712
+ s("Condition", -1)
713
+ ])]),
714
+ _: 1
715
+ }),
716
+ t(h, {
717
+ modelValue: d.condition,
718
+ "onUpdate:modelValue": (r) => d.condition = r
719
+ }, {
720
+ default: o(() => [
721
+ t($, null, {
722
+ default: o(() => [
723
+ t(R, { placeholder: "Select condition" })
724
+ ]),
725
+ _: 1
726
+ }),
727
+ t(D, null, {
728
+ default: o(() => [
729
+ t(f, { value: "time_after" }, {
730
+ default: o(() => [...e[31] || (e[31] = [
731
+ s("Time After", -1)
732
+ ])]),
733
+ _: 1
734
+ }),
735
+ t(f, { value: "time_before" }, {
736
+ default: o(() => [...e[32] || (e[32] = [
737
+ s("Time Before", -1)
738
+ ])]),
739
+ _: 1
740
+ }),
741
+ t(f, { value: "time_between" }, {
742
+ default: o(() => [...e[33] || (e[33] = [
743
+ s("Time Between", -1)
744
+ ])]),
745
+ _: 1
746
+ }),
747
+ t(f, { value: "day_of_week" }, {
748
+ default: o(() => [...e[34] || (e[34] = [
749
+ s("Day of Week", -1)
750
+ ])]),
751
+ _: 1
752
+ }),
753
+ t(f, { value: "date_range" }, {
754
+ default: o(() => [...e[35] || (e[35] = [
755
+ s("Date Range", -1)
756
+ ])]),
757
+ _: 1
758
+ })
759
+ ]),
760
+ _: 1
761
+ })
762
+ ]),
763
+ _: 1
764
+ }, 8, ["modelValue", "onUpdate:modelValue"])
765
+ ]),
766
+ l("div", null, [
767
+ t(c, { class: "text-xs mb-1 block" }, {
768
+ default: o(() => [...e[36] || (e[36] = [
769
+ s("Value", -1)
770
+ ])]),
771
+ _: 1
772
+ }),
773
+ t(P, {
774
+ modelValue: d.conditionValue,
775
+ "onUpdate:modelValue": (r) => d.conditionValue = r,
776
+ type: d.condition.includes("time") ? "time" : "text",
777
+ placeholder: "e.g., 17:00"
778
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "type"])
779
+ ])
780
+ ]),
781
+ l("div", Je, [
782
+ l("div", null, [
783
+ t(c, { class: "text-xs mb-1 block" }, {
784
+ default: o(() => [...e[37] || (e[37] = [
785
+ s("Fee Type", -1)
786
+ ])]),
787
+ _: 1
788
+ }),
789
+ t(h, {
790
+ modelValue: d.modifier,
791
+ "onUpdate:modelValue": (r) => d.modifier = r
792
+ }, {
793
+ default: o(() => [
794
+ t($, null, {
795
+ default: o(() => [
796
+ t(R, { placeholder: "Select type" })
797
+ ]),
798
+ _: 1
799
+ }),
800
+ t(D, null, {
801
+ default: o(() => [
802
+ t(f, { value: "fixed" }, {
803
+ default: o(() => [...e[38] || (e[38] = [
804
+ s("Fixed Amount", -1)
805
+ ])]),
806
+ _: 1
807
+ }),
808
+ t(f, { value: "percentage" }, {
809
+ default: o(() => [...e[39] || (e[39] = [
810
+ s("Percentage", -1)
811
+ ])]),
812
+ _: 1
813
+ })
814
+ ]),
815
+ _: 1
816
+ })
817
+ ]),
818
+ _: 1
819
+ }, 8, ["modelValue", "onUpdate:modelValue"])
820
+ ]),
821
+ l("div", null, [
822
+ t(c, { class: "text-xs mb-1 block" }, {
823
+ default: o(() => [...e[40] || (e[40] = [
824
+ s("Amount", -1)
825
+ ])]),
826
+ _: 1
827
+ }),
828
+ t(P, {
829
+ modelValue: d.amount,
830
+ "onUpdate:modelValue": (r) => d.amount = r,
831
+ modelModifiers: { number: !0 },
832
+ type: "number",
833
+ min: "0",
834
+ step: "0.01",
835
+ class: "no-spinner",
836
+ placeholder: d.modifier === "percentage" ? "10 (%)" : "10.00"
837
+ }, null, 8, ["modelValue", "onUpdate:modelValue", "placeholder"])
838
+ ])
839
+ ]),
840
+ C.value.length > 0 ? (i(), u("div", Xe, [
841
+ t(c, { class: "text-xs mb-1 block" }, {
842
+ default: o(() => [...e[41] || (e[41] = [
843
+ s("Apply To Resources", -1)
844
+ ])]),
845
+ _: 1
846
+ }),
847
+ t(X, null, {
848
+ default: o(() => [
849
+ t(Q, { "as-child": "" }, {
850
+ default: o(() => [
851
+ t(I, {
852
+ variant: "outline",
853
+ class: "w-full justify-between font-normal"
854
+ }, {
855
+ default: o(() => [
856
+ l("div", Ze, [
857
+ t(b(K), { class: "w-4 h-4 text-muted-foreground" }),
858
+ !d.resourceIds || d.resourceIds.length === 0 ? (i(), u("span", et, "All Resources")) : d.resourceIds.length === 1 ? (i(), u("span", tt, k(C.value.find((r) => r.id === d.resourceIds[0])?.name || "1 resource"), 1)) : (i(), u("span", nt, k(d.resourceIds.length) + " resources", 1))
859
+ ]),
860
+ t(b(ie), { class: "w-4 h-4 opacity-50" })
861
+ ]),
862
+ _: 2
863
+ }, 1024)
864
+ ]),
865
+ _: 2
866
+ }, 1024),
867
+ t(J, {
868
+ class: "w-64 p-2",
869
+ align: "start"
870
+ }, {
871
+ default: o(() => [
872
+ l("div", lt, [
873
+ l("div", {
874
+ class: B(["flex items-center gap-2 p-2 rounded-md hover:bg-muted cursor-pointer transition-colors", { "bg-muted": !d.resourceIds || d.resourceIds.length === 0 }]),
875
+ onClick: (r) => g(d, !0)
876
+ }, [
877
+ l("div", st, [
878
+ t(b(K), { class: "w-3 h-3 text-muted-foreground" })
879
+ ]),
880
+ e[42] || (e[42] = l("span", { class: "text-sm flex-1" }, "All Resources", -1)),
881
+ l("div", {
882
+ class: B(["size-4 rounded-full border-2", !d.resourceIds || d.resourceIds.length === 0 ? "border-primary bg-primary" : "border-muted-foreground"])
883
+ }, [
884
+ !d.resourceIds || d.resourceIds.length === 0 ? (i(), u("div", dt)) : w("", !0)
885
+ ], 2)
886
+ ], 10, ot),
887
+ e[44] || (e[44] = l("div", { class: "border-t my-2" }, null, -1)),
888
+ (i(!0), u(U, null, L(C.value, (r) => (i(), u("div", {
889
+ key: r.id,
890
+ class: "flex items-center gap-2 p-2 rounded-md hover:bg-muted cursor-pointer transition-colors",
891
+ onClick: (bt) => {
892
+ g(d, !1), S(d, r.id);
893
+ }
894
+ }, [
895
+ l("div", {
896
+ class: "size-5 rounded-full flex items-center justify-center text-white text-[10px] font-medium",
897
+ style: oe({ backgroundColor: r.color || "#6b7280" })
898
+ }, k(r.avatarLabel || r.name.charAt(0).toUpperCase()), 5),
899
+ l("span", it, k(r.name), 1),
900
+ l("div", {
901
+ class: B(["size-4 rounded border-2 flex items-center justify-center", d.resourceIds?.includes(r.id) ? "border-primary bg-primary" : "border-muted-foreground"])
902
+ }, [
903
+ d.resourceIds?.includes(r.id) ? (i(), u("svg", rt, [...e[43] || (e[43] = [
904
+ l("path", {
905
+ "stroke-linecap": "round",
906
+ "stroke-linejoin": "round",
907
+ "stroke-width": "3",
908
+ d: "M5 13l4 4L19 7"
909
+ }, null, -1)
910
+ ])])) : w("", !0)
911
+ ], 2)
912
+ ], 8, at))), 128))
913
+ ])
914
+ ]),
915
+ _: 2
916
+ }, 1024)
917
+ ]),
918
+ _: 2
919
+ }, 1024)
920
+ ])) : w("", !0)
921
+ ]),
922
+ t(I, {
923
+ onClick: (r) => x(d.id),
924
+ variant: "ghost",
925
+ size: "icon",
926
+ class: "mt-6"
927
+ }, {
928
+ default: o(() => [
929
+ t(b(F), { class: "w-4 h-4 text-destructive" })
930
+ ]),
931
+ _: 1
932
+ }, 8, ["onClick"])
933
+ ]))), 128)),
934
+ n.pricingRules.length === 0 ? (i(), u("div", ut, ' No pricing rules configured. Click "Add Rule" to create conditional fees. ')) : w("", !0)
935
+ ])
936
+ ]),
937
+ t(Me),
938
+ l("div", null, [
939
+ t(c, { class: "text-base font-medium" }, {
940
+ default: o(() => [...e[45] || (e[45] = [
941
+ s(" Payment Preferences ", -1)
942
+ ])]),
943
+ _: 1
944
+ }),
945
+ e[52] || (e[52] = l("p", { class: "text-sm text-muted-foreground mb-6" }, " Let customers pay full or in part when booking a slot, or pay later. ", -1)),
946
+ t(W, {
947
+ modelValue: n.paymentType,
948
+ "onUpdate:modelValue": e[1] || (e[1] = (d) => n.paymentType = d),
949
+ class: "flex flex-col gap-4"
950
+ }, {
951
+ default: o(() => [
952
+ t(c, {
953
+ for: "r1",
954
+ class: "flex items-start space-x-2 cursor-pointer"
955
+ }, {
956
+ default: o(() => [
957
+ t(T, {
958
+ id: "r1",
959
+ value: "full"
960
+ }),
961
+ e[46] || (e[46] = l("div", null, [
962
+ l("p", null, "Pay Full Amount when Booking"),
963
+ l("p", { class: "text-sm text-muted-foreground mt-1" }, " Your customers are required to complete the payment to confirm their booking. ")
964
+ ], -1))
965
+ ]),
966
+ _: 1
967
+ }),
968
+ t(c, {
969
+ for: "r2",
970
+ class: "flex items-start space-x-2 cursor-pointer"
971
+ }, {
972
+ default: o(() => [
973
+ t(T, {
974
+ id: "r2",
975
+ value: "partial"
976
+ }),
977
+ e[47] || (e[47] = l("div", null, [
978
+ l("p", null, "Pay Part Amount when Booking"),
979
+ l("p", { class: "text-sm text-muted-foreground mt-1" }, " Your customers are required to pay a deposit to confirm their booking. ")
980
+ ], -1))
981
+ ]),
982
+ _: 1
983
+ }),
984
+ t(c, {
985
+ for: "r3",
986
+ class: "flex items-start space-x-2 cursor-pointer"
987
+ }, {
988
+ default: o(() => [
989
+ t(T, {
990
+ id: "r3",
991
+ value: "later"
992
+ }),
993
+ e[48] || (e[48] = l("div", null, [
994
+ l("p", null, "Pay Later at Appointment"),
995
+ l("p", { class: "text-sm text-muted-foreground mt-1" }, " Your customers can book now and pay in person at the time of their appointment. ")
996
+ ], -1))
997
+ ]),
998
+ _: 1
999
+ })
1000
+ ]),
1001
+ _: 1
1002
+ }, 8, ["modelValue"]),
1003
+ n.paymentType === "partial" ? (i(), u("div", mt, [
1004
+ t(c, { class: "text-sm font-medium mb-4 block" }, {
1005
+ default: o(() => [...e[49] || (e[49] = [
1006
+ s(" Deposit Amount Configuration ", -1)
1007
+ ])]),
1008
+ _: 1
1009
+ }),
1010
+ l("div", pt, [
1011
+ t(W, {
1012
+ modelValue: n.partialPayment.type,
1013
+ "onUpdate:modelValue": e[2] || (e[2] = (d) => n.partialPayment.type = d),
1014
+ class: "flex gap-4"
1015
+ }, {
1016
+ default: o(() => [
1017
+ t(c, { class: "flex items-center space-x-2 cursor-pointer" }, {
1018
+ default: o(() => [
1019
+ t(T, { value: "percentage" }),
1020
+ e[50] || (e[50] = l("span", null, "Percentage", -1))
1021
+ ]),
1022
+ _: 1
1023
+ }),
1024
+ t(c, { class: "flex items-center space-x-2 cursor-pointer" }, {
1025
+ default: o(() => [
1026
+ t(T, { value: "fixed" }),
1027
+ e[51] || (e[51] = l("span", null, "Fixed Amount", -1))
1028
+ ]),
1029
+ _: 1
1030
+ })
1031
+ ]),
1032
+ _: 1
1033
+ }, 8, ["modelValue"]),
1034
+ l("div", ct, [
1035
+ l("div", ft, [
1036
+ t(P, {
1037
+ modelValue: n.partialPayment.amount,
1038
+ "onUpdate:modelValue": e[3] || (e[3] = (d) => n.partialPayment.amount = d),
1039
+ modelModifiers: { number: !0 },
1040
+ type: "number",
1041
+ min: "0",
1042
+ max: n.partialPayment.type === "percentage" ? 100 : void 0,
1043
+ step: "0.01",
1044
+ placeholder: n.partialPayment.type === "percentage" ? "50" : "10.00",
1045
+ class: "no-spinner"
1046
+ }, null, 8, ["modelValue", "max", "placeholder"])
1047
+ ]),
1048
+ l("span", vt, k(n.partialPayment.type === "percentage" ? "%" : n.currency), 1)
1049
+ ]),
1050
+ l("p", gt, [
1051
+ n.partialPayment.type === "percentage" ? (i(), u(U, { key: 0 }, [
1052
+ s(" Customers will pay " + k(n.partialPayment.amount) + "% of the total price upfront. ", 1)
1053
+ ], 64)) : (i(), u(U, { key: 1 }, [
1054
+ s(" Customers will pay " + k(n.currency) + " " + k(n.partialPayment.amount) + " upfront. ", 1)
1055
+ ], 64))
1056
+ ])
1057
+ ])
1058
+ ])) : w("", !0)
1059
+ ]),
1060
+ l("div", xt, [
1061
+ t(I, {
1062
+ onClick: A,
1063
+ disabled: v.value
1064
+ }, {
1065
+ default: o(() => [
1066
+ s(k(v.value ? "Saving..." : "Save Changes"), 1)
1067
+ ]),
1068
+ _: 1
1069
+ }, 8, ["disabled"])
1070
+ ])
1071
+ ]))
1072
+ ]),
1073
+ _: 1
1074
+ });
1075
+ };
1076
+ }
1077
+ });
1078
+ export {
1079
+ St as default
1080
+ };