@oneclick.dev/cms-core-modules 0.0.122 → 0.0.124

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 (162) hide show
  1. package/dist/{ContentEditor-CoJjsV-m.js → ContentEditor-BcIUumah.js} +63 -59
  2. package/dist/{ContentEditor-DIwqplfB.mjs → ContentEditor-DX1bTQKs.mjs} +27894 -26319
  3. package/dist/{Detail-Dk8E6_uF.mjs → Detail-B7pe808q.mjs} +15 -14
  4. package/dist/Detail-BESGmY7z.js +1 -0
  5. package/dist/{Detail-Cn9Bk0u0.mjs → Detail-B_Q7Qkuz.mjs} +26 -25
  6. package/dist/Detail-CNiLIEh9.js +1 -0
  7. package/dist/{Detail-B_scnidb.mjs → Detail-DNxAzeCs.mjs} +35 -34
  8. package/dist/Detail-t3tOcy3X.js +1 -0
  9. package/dist/Editor-D4evcdhv.mjs +768 -0
  10. package/dist/Editor-gLLtuJbY.js +1 -0
  11. package/dist/FormStatusBadge.vue_vue_type_script_setup_true_lang-BjKpsqT9.js +1 -0
  12. package/dist/FormStatusBadge.vue_vue_type_script_setup_true_lang-D5v5AhLe.mjs +76 -0
  13. package/dist/Knowledge-B66vxz--.js +1 -0
  14. package/dist/Knowledge-BnMTTuJ7.mjs +742 -0
  15. package/dist/{NewReservationDialog.vue_vue_type_script_setup_true_lang-bZidw6RT.mjs → NewReservationDialog.vue_vue_type_script_setup_true_lang-8I_Z9cD_.mjs} +530 -530
  16. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-BVE_uURZ.js +1 -0
  17. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-BdFa-xNf.mjs +3566 -0
  18. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-DzPOadcU.js +925 -0
  19. package/dist/Overview-BE4uYPx0.mjs +745 -0
  20. package/dist/Overview-CQRpFhbJ.mjs +286 -0
  21. package/dist/Overview-CTs7sX4d.js +1 -0
  22. package/dist/Overview-Cj89XXKN.js +1 -0
  23. package/dist/Overview-D_c18mbR.mjs +248 -0
  24. package/dist/Overview-g4Rcj245.js +1 -0
  25. package/dist/TableCalculationWidget-CkQPrVUd.js +59 -0
  26. package/dist/TableCalculationWidget-CrqcLGfU.mjs +254 -0
  27. package/dist/TableDataWidget-7qvC3Egd.js +1 -0
  28. package/dist/TableDataWidget-DMTSoGRO.mjs +121 -0
  29. package/dist/TableOverviewCard-AFq-puJs.js +1 -0
  30. package/dist/TableOverviewCard-Ci0d4o4w.mjs +391 -0
  31. package/dist/TableResultView.vue_vue_type_script_setup_true_lang-CBn-Oxl9.mjs +534 -0
  32. package/dist/TableResultView.vue_vue_type_script_setup_true_lang-C_Lv-SmJ.js +1 -0
  33. package/dist/TableRowActionCard-BhdnnPaq.mjs +266 -0
  34. package/dist/TableRowActionCard-IzB6tNN-.js +1 -0
  35. package/dist/TableView-6mdrL3zx.js +4 -0
  36. package/dist/TableView-Du5nOE6R.mjs +8228 -0
  37. package/dist/Test-CzmOmi53.mjs +447 -0
  38. package/dist/Test-USDtNFY1.js +1 -0
  39. package/dist/UserDetail-DpUL3mhk.mjs +1483 -0
  40. package/dist/UserDetail-KRIfxaYd.js +1 -0
  41. package/dist/{agenda-BCKDYOeF.mjs → agenda-DWdbWUbb.mjs} +10 -9
  42. package/dist/agenda-r9Gl85GL.js +1 -0
  43. package/dist/cms-core-modules.css +1 -1
  44. package/dist/dateRangePresets-B-l5b_wR.mjs +48 -0
  45. package/dist/dateRangePresets-CPWqst_x.js +1 -0
  46. package/dist/fuse-Deb-Iq39.mjs +1473 -0
  47. package/dist/fuse-_CGUd5Zq.js +1 -0
  48. package/dist/{index-DU3Ib10Z.mjs → index-B_qaX29C.mjs} +7 -6
  49. package/dist/index-CQuN5rKx.js +1 -0
  50. package/dist/index-CnDGeInm.js +1 -0
  51. package/dist/index-CqDTc5Ig.mjs +20 -0
  52. package/dist/index-CyvvAdt4.js +1 -0
  53. package/dist/index-DIRD7t5_.mjs +20 -0
  54. package/dist/index-OJuBYR60.mjs +57 -0
  55. package/dist/{index-Bk3yLv_G.js → index-yHLT6gaZ.js} +3 -3
  56. package/dist/index.cjs.js +1 -1
  57. package/dist/index.mjs +671 -118
  58. package/dist/{orders-CElKNc1v.mjs → orders-BfTLIm7U.mjs} +10 -9
  59. package/dist/orders-DUa2PVoa.js +1 -0
  60. package/dist/reports-ChCsd1Gk.mjs +1107 -0
  61. package/dist/reports-DmJPm8uP.js +158 -0
  62. package/dist/row-item-C1dUyimV.mjs +204 -0
  63. package/dist/row-item-Cyo3m3MZ.js +1 -0
  64. package/dist/server-handlers.cjs.js +1 -1
  65. package/dist/server-handlers.mjs +1764 -605
  66. package/dist/src/appointments/components/edit/EventDialog/BookingsList.vue.d.ts +9 -3
  67. package/dist/src/appointments/components/edit/EventDialog/OrderDetailDialog.vue.d.ts +2 -0
  68. package/dist/src/appointments/components/edit/EventDialog/ReservationDetailDialog.vue.d.ts +4 -2
  69. package/dist/src/appointments/components/edit/dashboard/BookingsList.vue.d.ts +9 -3
  70. package/dist/src/appointments/pages/edit/orders.vue.d.ts +9 -3
  71. package/dist/src/appointments/pages/edit/reports.vue.d.ts +229 -1
  72. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Container.d.ts +1 -1
  73. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Row.d.ts +7 -0
  74. package/dist/src/contentManager/components/content-editor/tiptap-extensions/Stack.d.ts +7 -0
  75. package/dist/src/contentManager/components/content-editor/tiptap-extensions/helpers/resizeHistory.d.ts +9 -0
  76. package/dist/src/contentManager/components/content-editor/tiptap-menus/ElementEditorMenu.vue.d.ts +3 -1
  77. package/dist/src/firebaseAuthManager/components/DeleteUserDialog.vue.d.ts +25 -0
  78. package/dist/src/firebaseAuthManager/components/ReasonActionDialog.vue.d.ts +23 -0
  79. package/dist/src/firebaseAuthManager/components/UserStatusBadge.vue.d.ts +5 -0
  80. package/dist/src/firebaseAuthManager/config.d.ts +151 -0
  81. package/dist/src/firebaseAuthManager/index.d.ts +163 -0
  82. package/dist/src/firebaseAuthManager/index.vue.d.ts +14 -0
  83. package/dist/src/firebaseAuthManager/metadata.d.ts +2 -0
  84. package/dist/src/firebaseAuthManager/pages/Overview.vue.d.ts +2 -0
  85. package/dist/src/firebaseAuthManager/pages/UserDetail.vue.d.ts +2 -0
  86. package/dist/src/firebaseAuthManager/permissions.d.ts +5 -0
  87. package/dist/src/firebaseAuthManager/routes.d.ts +5 -0
  88. package/dist/src/firebaseAuthManager/server.d.ts +162 -0
  89. package/dist/src/firebaseAuthManager/types.d.ts +84 -0
  90. package/dist/src/formBuilder/components/FormPreviewDialog.vue.d.ts +12 -0
  91. package/dist/src/formBuilder/components/FormStatusBadge.vue.d.ts +9 -0
  92. package/dist/src/formBuilder/config.d.ts +31 -0
  93. package/dist/src/formBuilder/index.d.ts +44 -0
  94. package/dist/src/formBuilder/index.vue.d.ts +14 -0
  95. package/dist/src/formBuilder/lib/forms.d.ts +11 -0
  96. package/dist/src/formBuilder/metadata.d.ts +2 -0
  97. package/dist/src/formBuilder/pages/Editor.vue.d.ts +2 -0
  98. package/dist/src/formBuilder/pages/Overview.vue.d.ts +2 -0
  99. package/dist/src/formBuilder/permissions.d.ts +5 -0
  100. package/dist/src/formBuilder/routes.d.ts +5 -0
  101. package/dist/src/formBuilder/server.d.ts +87 -0
  102. package/dist/src/formBuilder/tools.d.ts +1 -0
  103. package/dist/src/formBuilder/types.d.ts +46 -0
  104. package/dist/src/helpbot/composables/useHelpbotApi.d.ts +18 -0
  105. package/dist/src/helpbot/config.d.ts +17 -0
  106. package/dist/src/helpbot/index.d.ts +29 -0
  107. package/dist/src/helpbot/index.vue.d.ts +2 -0
  108. package/dist/src/helpbot/metadata.d.ts +2 -0
  109. package/dist/src/helpbot/pages/Knowledge.vue.d.ts +4 -0
  110. package/dist/src/helpbot/pages/Overview.vue.d.ts +2 -0
  111. package/dist/src/helpbot/pages/Test.vue.d.ts +4 -0
  112. package/dist/src/helpbot/permissions.d.ts +5 -0
  113. package/dist/src/helpbot/routes.d.ts +5 -0
  114. package/dist/src/helpbot/types.d.ts +42 -0
  115. package/dist/src/index.d.ts +3 -0
  116. package/dist/src/server-handlers.d.ts +2 -0
  117. package/dist/src/table/chat-components/TableCalculationWidget.vue.d.ts +15 -0
  118. package/dist/src/table/chat-components/TableDataWidget.vue.d.ts +15 -0
  119. package/dist/src/table/chat-components/TableOverviewCard.vue.d.ts +61 -0
  120. package/dist/src/table/chat-components/TableResultView.vue.d.ts +48 -0
  121. package/dist/src/table/chat-components/TableRowActionCard.vue.d.ts +15 -0
  122. package/dist/src/table/components/filters/DialogTableFilterOptionItem.vue.d.ts +16 -0
  123. package/dist/src/table/components/filters/NumberComparisonFilter.vue.d.ts +12 -0
  124. package/dist/src/table/components/filters/NumberComparisonFilterSettings.vue.d.ts +12 -0
  125. package/dist/src/table/components/filters/NumberRangeFilter.vue.d.ts +12 -0
  126. package/dist/src/table/components/filters/NumberRangeFilterSettings.vue.d.ts +12 -0
  127. package/dist/src/table/components/filters/filter-utils.d.ts +14 -0
  128. package/dist/src/table/composables/useTableAgentTools.d.ts +33 -0
  129. package/dist/src/table/index.d.ts +339 -0
  130. package/dist/src/table/tool-sandbox.d.ts +13 -0
  131. package/dist/src/table/tool-utils.d.ts +11 -0
  132. package/dist/src/table/tools.d.ts +333 -1
  133. package/dist/src/table/types.d.ts +79 -0
  134. package/dist/tool-sandbox-DdkMLkDK.mjs +182 -0
  135. package/dist/tool-sandbox-DoF1PsyS.js +115 -0
  136. package/dist/types-9N-DKxNj.mjs +250 -0
  137. package/dist/types-BMraG1kN.js +1 -0
  138. package/dist/types-Cem0vPo_.js +1 -0
  139. package/dist/types-ibC3-e1N.mjs +2630 -0
  140. package/dist/useHelpbotApi-BIIungOh.js +1 -0
  141. package/dist/useHelpbotApi-HC9JSiSn.mjs +229 -0
  142. package/dist/useTableAgentTools-D5mzGf3A.js +1 -0
  143. package/dist/useTableAgentTools-DcN3kYRL.mjs +131 -0
  144. package/dist/vee-validate-zod-BQElPD0m.js +1 -0
  145. package/dist/vee-validate-zod-CN16K2x9.mjs +1780 -0
  146. package/package.json +17 -17
  147. package/src/formBuilder/tools.ts +1 -0
  148. package/src/table/tools.ts +304 -1
  149. package/dist/Detail-BCUUNWvp.js +0 -1
  150. package/dist/Detail-DGg_xXZc.js +0 -1
  151. package/dist/Detail-Sc2qZdxj.js +0 -1
  152. package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-BdZbcubW.js +0 -1
  153. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-BYSeUW_V.js +0 -925
  154. package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-DwAUYR8p.mjs +0 -5021
  155. package/dist/TableView-Ctnep-Qu.mjs +0 -6247
  156. package/dist/TableView-DJqyJL9L.js +0 -4
  157. package/dist/agenda-B54F8cEr.js +0 -1
  158. package/dist/orders-BMosTk6r.js +0 -1
  159. package/dist/reports-BQT_GZzU.js +0 -158
  160. package/dist/reports-DksZCTOw.mjs +0 -837
  161. package/dist/vee-validate-zod-SjDT8X35.mjs +0 -4404
  162. package/dist/vee-validate-zod-VCmLnrtQ.js +0 -1
@@ -0,0 +1 @@
1
+ "use strict";const e=require("vue"),ee=require("lucide-vue-next"),fe=require("@oneclick.dev/cms-kit"),he=require("./utils-Yd6F5mea.js"),pe=require("./DateFormatter-CSAbE3BC.js"),_e=require("./_plugin-vue_export-helper-BHFhmbuH.js"),ye={class:"space-y-3"},xe={class:"grid gap-4 @md/modal:grid-cols-2 @2xl/modal:grid-cols-3 @4xl/modal:grid-cols-4 overflow-hidden p-1"},Ne={key:0,class:"flex items-center gap-3 min-h-9"},be={key:0,class:"italic text-xs opacity-50"},Ve={key:0,class:"italic text-xs opacity-50"},Ce={key:0,class:"italic text-xs opacity-50"},Se={key:0,class:"italic text-xs opacity-50"},we={key:0,class:"text-red-400"},Ee={class:"list-disc pl-4"},Te=e.defineComponent({__name:"CustomerInformation",props:{agendaData:{}},setup(D,{expose:A}){const E=[{id:"firstName",fieldName:"First Name",fieldType:"text",required:!0,visible:!0},{id:"lastName",fieldName:"Last Name",fieldType:"text",required:!0,visible:!0},{id:"phone",fieldName:"Phone No",fieldType:"tel",required:!0,visible:!0},{id:"email",fieldName:"Email",fieldType:"email",required:!0,visible:!0},{id:"birthDate",fieldName:"Birth date",fieldType:"date",required:!0,visible:!0}],O=new Set(["firstName","email"]),X=new Set(["firstName"]),F=D,U=e.ref([]),_=e.reactive({}),T=e.computed(()=>{const m=F.agendaData?.customerInformationFields,v=(Array.isArray(m)&&m.length>0?m:E).filter(S=>S?.id&&(S.visible!==!1||O.has(S.id))).map(S=>({...S,required:X.has(S.id),visible:!0})),h=E.filter(S=>O.has(S.id)&&!v.some(Z=>Z.id===S.id)).map(S=>({...S,required:X.has(S.id),visible:!0}));return[...v,...h]}),C=m=>m.fieldName||m.id,B=m=>m.replace(/[^A-Za-z0-9_-]/g,"-"),y=(m,V)=>["new-res-customer-info",m.id,V].filter(Boolean).map(h=>B(h)).join("-"),L=m=>m.fieldType==="email"||m.fieldType==="tel"||m.fieldType==="date"?m.fieldType:"text",$=m=>Array.isArray(m.options)?m.options.filter(Boolean):[],I=m=>m.fieldType==="checkbox"?!1:"",z=(m=!1)=>{const V=new Set(T.value.map(v=>v.id));Object.keys(_).forEach(v=>{V.has(v)||delete _[v]}),T.value.forEach(v=>{const h=I(v);(m||_[v.id]===void 0||typeof _[v.id]!=typeof h)&&(_[v.id]=h)})},x=()=>{const m=T.value.reduce((V,v)=>{const h=_[v.id];return V[v.id]=typeof h=="string"?h.trim():!!h,V},{});return Object.entries(m).forEach(([V,v])=>{_[V]=v}),m},Q=(m,V)=>m.fieldType==="checkbox"?V===!0:typeof V=="string"?V.trim().length>0:V!=null,P=()=>{U.value=[],z(!0)},Y=()=>{const m=[],V=x();return T.value.forEach(v=>{const h=V[v.id],S=C(v);v.required&&!Q(v,h)&&m.push(`Please fill in ${S}.`),v.fieldType==="email"&&Q(v,h)&&typeof h=="string"&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(h)===!1&&m.push(`Please fill in a correct ${S}.`)}),U.value=m,m.length===0};return e.watch(T,()=>{z()},{immediate:!0}),A({getCustomerInfo:x,reset:P,validateForm:Y}),(m,V)=>{const v=e.resolveComponent("Checkbox"),h=e.resolveComponent("Label"),S=e.resolveComponent("SelectValue"),Z=e.resolveComponent("SelectTrigger"),se=e.resolveComponent("SelectItem"),te=e.resolveComponent("SelectGroup"),K=e.resolveComponent("SelectContent"),oe=e.resolveComponent("Select"),W=e.resolveComponent("RadioGroupItem"),ne=e.resolveComponent("RadioGroup"),ae=e.resolveComponent("Input");return e.openBlock(),e.createElementBlock("div",ye,[V[0]||(V[0]=e.createElementVNode("h2",{class:"text-sm font-medium"},"Customer Information",-1)),e.createElementVNode("div",xe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,u=>(e.openBlock(),e.createElementBlock("div",{key:u.id,class:e.normalizeClass(["grid gap-2",u.fieldType==="checkbox"?"@md/modal:col-span-2":""])},[u.fieldType==="checkbox"?(e.openBlock(),e.createElementBlock("div",Ne,[e.createVNode(v,{id:y(u),modelValue:_[u.id],"onUpdate:modelValue":k=>_[u.id]=k},null,8,["id","modelValue","onUpdate:modelValue"]),e.createVNode(h,{for:y(u),class:"font-normal cursor-pointer"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(C(u))+" ",1),u.required?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",be,"optional"))]),_:2},1032,["for"])])):u.fieldType==="select"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createVNode(h,{for:y(u)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(C(u))+" ",1),u.required?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Ve,"optional"))]),_:2},1032,["for"]),e.createVNode(oe,{modelValue:_[u.id],"onUpdate:modelValue":k=>_[u.id]=k},{default:e.withCtx(()=>[e.createVNode(Z,{id:y(u),class:"w-full"},{default:e.withCtx(()=>[e.createVNode(S,{placeholder:`Select ${C(u)}`},null,8,["placeholder"])]),_:2},1032,["id"]),e.createVNode(K,null,{default:e.withCtx(()=>[e.createVNode(te,null,{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($(u),k=>(e.openBlock(),e.createBlock(se,{key:k,value:k},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(k),1)]),_:2},1032,["value"]))),128))]),_:2},1024)]),_:2},1024)]),_:2},1032,["modelValue","onUpdate:modelValue"])],64)):u.fieldType==="radio"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[e.createVNode(h,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(C(u))+" ",1),u.required?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Ce,"optional"))]),_:2},1024),e.createVNode(ne,{modelValue:_[u.id],"onUpdate:modelValue":k=>_[u.id]=k,class:"grid gap-2"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($(u),k=>(e.openBlock(),e.createElementBlock("div",{key:k,class:"flex items-center gap-2"},[e.createVNode(W,{id:y(u,k),value:k},null,8,["id","value"]),e.createVNode(h,{for:y(u,k),class:"font-normal cursor-pointer"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(k),1)]),_:2},1032,["for"])]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue"])],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createVNode(h,{for:y(u)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(C(u))+" ",1),u.required?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Se,"optional"))]),_:2},1032,["for"]),e.createVNode(ae,{modelValue:_[u.id],"onUpdate:modelValue":k=>_[u.id]=k,id:y(u),type:L(u),autocomplete:"off"},null,8,["modelValue","onUpdate:modelValue","id","type"])],64))],2))),128))]),U.value.length>0?(e.openBlock(),e.createElementBlock("div",we,[e.createElementVNode("ul",Ee,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(U.value,u=>(e.openBlock(),e.createElementBlock("li",{key:u},e.toDisplayString(u),1))),128))])])):e.createCommentVNode("",!0)])}}});function Be(D={}){const A=e.ref(null),E=e.ref(!1),O=e.ref(!1),X=e.ref(!1),F=e.ref(!1),U=D.dragSpeed??1.1,_=D.dragThreshold??10,T=D.edgeThreshold??10,C=D.ignoreDragSelector??'input, select, textarea, [contenteditable="true"], [data-horizontal-scroll-ignore-drag]';let B=null,y=0,L=0,$=!1,I=null,z=null,x=null;const Q=()=>{I===null||typeof window>"u"||(window.clearTimeout(I),I=null)},P=()=>{const r=A.value;if(!r){O.value=!1,X.value=!1,F.value=!1;return}const l=Math.max(r.scrollWidth-r.clientWidth,0);O.value=l>T,X.value=O.value&&r.scrollLeft>T,F.value=O.value&&r.scrollLeft<l-T},Y=()=>{e.nextTick(()=>{if(typeof window>"u"){P();return}window.requestAnimationFrame(()=>P())})},m=()=>{if(typeof D.scrollStep=="number")return D.scrollStep;const r=A.value;return r?Math.max(Math.floor(r.clientWidth*.72),180):240},V=(r,l="smooth")=>{const N=A.value;if(N){if(N.scrollBy({left:r,behavior:l}),l==="auto"){P();return}Y()}},v=()=>{V(-m())},h=()=>{V(m())},S=()=>{const r=A.value;B!==null&&r?.hasPointerCapture?.(B)&&r.releasePointerCapture(B),E.value&&($=!0,Q(),typeof window<"u"&&(I=window.setTimeout(()=>{$=!1,I=null},0))),B=null,E.value=!1,r&&(r.style.userSelect="",r.style.cursor=""),P()},Z=()=>{P()},se=r=>{const l=A.value;if(!l||!O.value||Math.abs(r.deltaY)<=Math.abs(r.deltaX))return;const N=r.deltaY<0,G=r.deltaY>0;N&&!X.value||G&&!F.value||(r.preventDefault(),l.scrollLeft+=r.deltaY,P())},te=r=>r instanceof Element?!!r.closest(C):!1,K=r=>{const l=A.value;!l||!O.value||r.pointerType!=="touch"&&r.button===0&&(te(r.target)||(B=r.pointerId,y=r.clientX,L=l.scrollLeft,$=!1))},oe=r=>{const l=A.value;if(!l||B!==r.pointerId)return;const N=r.clientX-y;!E.value&&Math.abs(N)<_||(E.value||(E.value=!0,l.style.userSelect="none",l.style.cursor="grabbing",l.setPointerCapture?.(r.pointerId)),r.preventDefault(),l.scrollLeft=L-N*U,P())},W=r=>{B===r.pointerId&&S()},ne=()=>{B!==null&&S()},ae=r=>{$&&(r.preventDefault(),r.stopPropagation(),$=!1)},u=r=>{typeof ResizeObserver<"u"&&(z=new ResizeObserver(()=>P()),z.observe(r)),D.observeMutations!==!1&&typeof MutationObserver<"u"&&(x=new MutationObserver(()=>Y()),x.observe(r,{childList:!0,subtree:!0,characterData:!0}))},k=()=>{z?.disconnect(),x?.disconnect(),z=null,x=null},ce=r=>{r.addEventListener("scroll",Z),r.addEventListener("wheel",se,{passive:!1}),r.addEventListener("pointerdown",K),r.addEventListener("pointermove",oe),r.addEventListener("pointerup",W),r.addEventListener("pointercancel",ne),r.addEventListener("lostpointercapture",ne),r.addEventListener("click",ae,!0),u(r),Y()},le=r=>{r.removeEventListener("scroll",Z),r.removeEventListener("wheel",se),r.removeEventListener("pointerdown",K),r.removeEventListener("pointermove",oe),r.removeEventListener("pointerup",W),r.removeEventListener("pointercancel",ne),r.removeEventListener("lostpointercapture",ne),r.removeEventListener("click",ae,!0),k()};return e.watch(A,(r,l)=>{l&&le(l),r?ce(r):P()}),e.onMounted(()=>{Y()}),e.onBeforeUnmount(()=>{Q(),A.value&&le(A.value),$=!1,S()}),{canScrollLeft:e.computed(()=>X.value),canScrollRight:e.computed(()=>F.value),containerRef:A,isDragging:E,isScrollable:O,refresh:Y,scrollNext:h,scrollPrev:v,showLeftShadow:X,showRightShadow:F}}const De={class:"flex items-start justify-between gap-3"},$e={class:"text-sm font-medium"},Ie={key:0,class:"mt-1 text-xs text-muted-foreground"},Re={class:"grid gap-4 @md/quick-adder:grid-cols-2 @2xl/quick-adder:grid-cols-3 @4xl/quick-adder:grid-cols-4"},Fe={class:"grid gap-2"},Oe={key:0,class:"grid gap-2"},Le={key:1,class:"grid gap-2"},Me={key:2,class:"grid gap-2"},Ae={class:"grid gap-2"},Pe={class:"grid gap-2"},Ue={key:0,class:"rounded-md border border-dashed bg-muted/20 px-4 py-4 text-sm text-muted-foreground"},ze={key:1,class:"relative flex items-center gap-2 overflow-hidden"},qe={class:"relative min-w-0 flex-1 overflow-hidden"},je={key:0,class:"pointer-events-none absolute inset-y-0 left-0 z-10 w-10 md:w-20 bg-gradient-to-r from-background via-background/95 to-transparent"},He={key:1,class:"pointer-events-none absolute inset-y-0 right-0 z-10 w-10 md:w-20 bg-gradient-to-l from-background via-background/95 to-transparent"},Qe={key:0,class:"absolute -top-1 -right-1 flex items-center justify-center bg-primary rounded-full text-background size-4"},Ye={class:"flex flex-wrap gap-2"},We=["onClick"],Ge={key:0},Xe={key:1},Ze={key:2},Ke=e.defineComponent({__name:"QuickReservationAdder",props:{agendaData:{},surface:{default:"card"}},emits:["add"],setup(D,{emit:A}){const E=D,O=A,X=new pe.$fb18d541ea1ad717$export$ad991b66133851cf("en-US",{dateStyle:"long"}),F=pe.$14e0f24ef4ac5c92$export$d0bdf45af03a6ea3(pe.$14e0f24ef4ac5c92$export$aa8b41735afcabd2()),U=e.computed(()=>E.surface==="popover"),_=e.ref(""),T=e.ref(void 0),C=e.ref(""),B=e.ref(""),y=e.ref([]),L=e.ref(1),$=e.ref(0),I=e.computed(()=>E.agendaData?.resources?.find(r=>r.id===C.value)),z=r=>{const[l,N]=r.split(":").map(Number);return l*60+N},x=r=>{const l=Math.floor(r/60),N=r%60;return`${l.toString().padStart(2,"0")}:${N.toString().padStart(2,"0")}`},Q=()=>{if(!I.value)return[];const r=I.value.interval||60;let l=null,N=null;for(const a of Object.values(I.value.openingHours||{}))for(const n of a){const d=z(n.start),g=z(n.end);(l===null||d<l)&&(l=d),(N===null||g>N)&&(N=g)}if(l===null||N===null)return[];const G=[];for(let a=l;a<N;a+=r)G.push(x(a));return G},P=e.computed(()=>{const r=Number($.value);return T.value&&C.value&&B.value&&y.value.length>0&&Number.isFinite(r)&&r>=0}),Y=e.computed(()=>Q()),{canScrollLeft:m,canScrollRight:V,containerRef:v,isDragging:h,isScrollable:S,scrollNext:Z,scrollPrev:se,showLeftShadow:te,showRightShadow:K}=Be(),oe=r=>y.value.includes(r),W=r=>{if(oe(r)){y.value=y.value.filter(l=>l!==r);return}y.value=[...y.value,r].sort((l,N)=>z(l)-z(N))},ne=(r,l)=>{T.value=r?e.markRaw(r):void 0,_.value=r?`${r}`:"",l()},ae=e.ref(""),u=e.ref(""),k=e.ref([]),ce=()=>{O("add",{date:T.value,resourceId:C.value,pricingOptionId:B.value,startTimes:y.value,spots:L.value,paid:Number($.value)||0}),y.value=[],k.value=[],u.value="",ae.value=""},le=()=>{_.value=F.toString(),T.value=F,C.value=E.agendaData?.resources?.[0]?.id||"",B.value=E.agendaData?.pricingOptions?.find(r=>r.isDefault)?.id||E.agendaData?.pricingOptions?.[0]?.id||"",y.value=[],L.value=1,$.value=0,ae.value=""};return e.onMounted(()=>{le()}),(r,l)=>{const N=e.resolveComponent("Label"),G=e.resolveComponent("Button"),a=e.resolveComponent("PopoverTrigger"),n=e.resolveComponent("Calendar"),d=e.resolveComponent("PopoverContent"),g=e.resolveComponent("Popover"),w=e.resolveComponent("DynamicSelectOption"),j=e.resolveComponent("DynamicSelect"),q=e.resolveComponent("Input");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(e.unref(he.classNames)("@container/quick-adder grid gap-4 overflow-hidden bg-background",e.unref(U)?"p-5 sm:p-6":"rounded-md border p-4"))},[e.createElementVNode("div",De,[e.createElementVNode("div",null,[e.createElementVNode("h3",$e,e.toDisplayString(e.unref(U)?"Quick add reservations":"Add reservations"),1),e.unref(U)?(e.openBlock(),e.createElementBlock("p",Ie," Choose one date and add multiple timeslots in one pass. ")):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Re,[e.createElementVNode("div",Fe,[e.createVNode(N,null,{default:e.withCtx(()=>[...l[4]||(l[4]=[e.createTextVNode("Date",-1)])]),_:1}),e.createVNode(g,null,{default:e.withCtx(({close:p})=>[e.createVNode(a,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(G,{type:"button",variant:"outline",class:e.normalizeClass(e.unref(he.classNames)("w-full justify-start text-left font-normal",!e.unref(T)&&"text-muted-foreground"))},{default:e.withCtx(()=>[e.createVNode(e.unref(ee.CalendarIcon)),e.createTextVNode(" "+e.toDisplayString(e.unref(T)?e.unref(X).format(e.unref(T).toDate(e.unref(pe.$14e0f24ef4ac5c92$export$aa8b41735afcabd2)())):"Pick a date"),1)]),_:1},8,["class"])]),_:1}),e.createVNode(d,{class:"w-auto p-0",align:"start"},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":e.unref(T),"default-placeholder":e.unref(F),layout:"month-and-year","initial-focus":"","onUpdate:modelValue":re=>ne(re,p),minValue:e.unref(pe.$14e0f24ef4ac5c92$export$d0bdf45af03a6ea3)(e.unref(pe.$14e0f24ef4ac5c92$export$aa8b41735afcabd2)())},null,8,["model-value","default-placeholder","onUpdate:modelValue","minValue"])]),_:2},1024)]),_:1})]),D.agendaData.resources?.length>1?(e.openBlock(),e.createElementBlock("div",Oe,[e.createVNode(N,null,{default:e.withCtx(()=>[...l[5]||(l[5]=[e.createTextVNode("Resource",-1)])]),_:1}),e.createVNode(j,{modelValue:e.unref(C),"onUpdate:modelValue":l[0]||(l[0]=p=>e.isRef(C)?C.value=p:null),"wrapper-class":"w-full",class:"w-full",placeholder:"Select resource"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.agendaData.resources||[],p=>(e.openBlock(),e.createBlock(w,{key:p.id,value:p.id},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"])])):e.createCommentVNode("",!0),D.agendaData.pricingOptions?.length>1?(e.openBlock(),e.createElementBlock("div",Le,[e.createVNode(N,null,{default:e.withCtx(()=>[...l[6]||(l[6]=[e.createTextVNode("Type",-1)])]),_:1}),e.createVNode(j,{modelValue:e.unref(B),"onUpdate:modelValue":l[1]||(l[1]=p=>e.isRef(B)?B.value=p:null),"wrapper-class":"w-full",class:"w-full",placeholder:"Select type"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.agendaData.pricingOptions||[],p=>(e.openBlock(),e.createBlock(w,{key:p.id,value:p.id},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p.name)+" ("+e.toDisplayString(p.duration)+"min) ",1)]),_:2},1032,["value"]))),128))]),_:1},8,["modelValue"])])):e.createCommentVNode("",!0),D.agendaData?.maxTicketsPerReservation>1?(e.openBlock(),e.createElementBlock("div",Me,[e.createVNode(N,null,{default:e.withCtx(()=>[...l[7]||(l[7]=[e.createTextVNode("Spots/tickets",-1)])]),_:1}),e.createVNode(q,{modelValue:e.unref(L),"onUpdate:modelValue":l[2]||(l[2]=p=>e.isRef(L)?L.value=p:null),modelModifiers:{number:!0},type:"number",min:"1",class:"no-spinner",autocomplete:"off"},null,8,["modelValue"])])):e.createCommentVNode("",!0),e.createElementVNode("div",Ae,[e.createVNode(N,null,{default:e.withCtx(()=>[...l[8]||(l[8]=[e.createTextVNode("Paid (per reservation)",-1)])]),_:1}),e.createVNode(q,{modelValue:e.unref($),"onUpdate:modelValue":l[3]||(l[3]=p=>e.isRef($)?$.value=p:null),modelModifiers:{number:!0},type:"number",min:"0",step:"1",class:"no-spinner",autocomplete:"off"},null,8,["modelValue"]),l[9]||(l[9]=e.createElementVNode("p",{class:"text-xs text-muted-foreground"}," This amount is copied to every reservation you add. ",-1))])]),e.createElementVNode("div",Pe,[e.createVNode(N,null,{default:e.withCtx(()=>[...l[10]||(l[10]=[e.createTextVNode("Available hours",-1)])]),_:1}),e.unref(Y).length===0?(e.openBlock(),e.createElementBlock("div",Ue," No preset hours are available for this resource. You can still add a custom time below. ")):(e.openBlock(),e.createElementBlock("div",ze,[e.unref(m)?(e.openBlock(),e.createBlock(G,{key:0,type:"button",size:"icon",variant:"outline",class:"hidden absolute size-8 shrink-0 rounded-full shadow-sm md:inline-flex z-[11] left-0.5",onClick:e.unref(se)},{default:e.withCtx(()=>[e.createVNode(e.unref(ee.ChevronLeft),{class:"size-4"})]),_:1},8,["onClick"])):e.createCommentVNode("",!0),e.createElementVNode("div",qe,[e.unref(te)?(e.openBlock(),e.createElementBlock("div",je)):e.createCommentVNode("",!0),e.unref(K)?(e.openBlock(),e.createElementBlock("div",He)):e.createCommentVNode("",!0),e.createElementVNode("div",{ref_key:"hourScrollContainer",ref:v,class:e.normalizeClass(e.unref(he.classNames)("hour-scroll-track flex w-full min-w-0 gap-2 overflow-x-auto overscroll-contain py-2",e.unref(S)&&!e.unref(h)&&"cursor-grab",e.unref(h)&&"cursor-grabbing select-none"))},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(Y),p=>(e.openBlock(),e.createBlock(G,{key:p,type:"button",variant:"outline",class:e.normalizeClass(["relative h-12 shrink-0",oe(p)?"border-primary!":""]),onClick:re=>W(p)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p)+" ",1),oe(p)?(e.openBlock(),e.createElementBlock("div",Qe,[e.createVNode(e.unref(ee.Check),{class:"size-3"})])):e.createCommentVNode("",!0)]),_:2},1032,["class","onClick"]))),128))],2)]),e.unref(V)?(e.openBlock(),e.createBlock(G,{key:1,type:"button",size:"icon",variant:"outline",class:"hidden absolute size-8 shrink-0 rounded-full shadow-sm md:inline-flex z-[11] right-0.5",onClick:e.unref(Z)},{default:e.withCtx(()=>[e.createVNode(e.unref(ee.ChevronRight),{class:"size-4"})]),_:1},8,["onClick"])):e.createCommentVNode("",!0)])),e.createElementVNode("div",Ye,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(k),p=>(e.openBlock(),e.createElementBlock("div",{key:p,class:"relative"},[e.createVNode(G,{type:"button",variant:"outline",class:"h-12 px-4 py-2"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p),1)]),_:2},1024),e.createElementVNode("div",{class:"absolute -top-1 -right-1 flex items-center justify-center bg-red-500 rounded-full text-white size-4 cursor-pointer",onClick:re=>{k.value=e.unref(k).filter(J=>J!==p),y.value=e.unref(y).filter(J=>J!==p)}},[e.createVNode(e.unref(ee.X),{class:"size-3"})],8,We)]))),128))])]),e.createElementVNode("div",null,[e.createVNode(G,{disabled:!e.unref(P),onClick:ce},{default:e.withCtx(()=>[e.unref(y).length===0?(e.openBlock(),e.createElementBlock("span",Ge,"Select at least one timeslot")):e.unref(y).length===1?(e.openBlock(),e.createElementBlock("span",Xe,"Add 1 reservation")):(e.openBlock(),e.createElementBlock("span",Ze,"Add "+e.toDisplayString(e.unref(y).length)+" reservations",1))]),_:1},8,["disabled"])])],2)}}}),Je=_e._export_sfc(Ke,[["__scopeId","data-v-30be47b0"]]),et={class:"space-y-3"},tt={class:"flex flex-wrap items-center justify-between gap-3"},ot={class:"text-xs text-muted-foreground"},nt={class:"flex flex-wrap items-center gap-2"},at={key:0,class:"rounded-md border border-dashed bg-muted/20 px-4 py-6 text-sm text-muted-foreground"},rt={key:1,class:"space-y-3"},st={class:"flex items-start gap-2 p-3 md:hidden"},lt=["aria-expanded","onClick"],it={class:"mt-0.5 flex size-10 shrink-0 items-center justify-center rounded-full bg-muted text-sm font-semibold text-muted-foreground"},ct={class:"min-w-0 flex-1"},dt={class:"flex items-start justify-between gap-3"},ut={class:"min-w-0"},mt={class:"block truncate text-base font-semibold"},pt={class:"mt-1 block truncate text-xs text-muted-foreground"},ft={class:"mt-1 block truncate text-xs text-muted-foreground"},gt={class:"flex size-10 shrink-0 items-center justify-center rounded-xl border border-border/70 text-muted-foreground"},vt={class:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-muted-foreground"},ht={class:"inline-flex items-center gap-1.5"},kt={class:"inline-flex items-center gap-1.5"},_t={class:"hidden items-start justify-between gap-3 p-4 pb-0 md:flex"},yt={class:"text-sm font-medium"},xt={class:"text-xs text-muted-foreground"},Nt={class:"grid gap-4 border-t pt-3 md:grid-cols-2 md:border-0 md:pt-4 xl:grid-cols-5"},bt={class:"grid gap-2"},Vt={class:"grid gap-2"},Ct={key:0,class:"text-xs text-orange-500"},St={class:"grid gap-2"},wt={key:0,class:"text-xs text-muted-foreground"},Et={key:1,class:"flex items-center h-[36px] text-sm"},Tt={key:0},Bt={key:1},Dt={key:2},$t={key:0,class:"grid gap-2"},It=e.defineComponent({__name:"ReservationLines",props:{modelValue:{},agendaData:{},availabilityByReservation:{}},emits:["add","quick-add","update:modelValue"],setup(D,{emit:A}){const E=D,O=A,X=/^([01]\d|2[0-3]):[0-5]\d$/,F=e.computed(()=>E.modelValue??[]),U=e.computed(()=>Number(E.agendaData?.maxTicketsPerReservation)>1),_=e.ref(null),T=e.ref(!1),C=e.computed(()=>String(E.agendaData?.currency||"EUR").toUpperCase()),B=e.computed(()=>{try{return new Intl.NumberFormat("en-US",{style:"currency",currency:C.value,minimumFractionDigits:2,maximumFractionDigits:2})}catch{return new Intl.NumberFormat("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}}),y=a=>{O("update:modelValue",a)},L=a=>["date","resourceId","pricingOption"].includes(a),$=a=>{if(!a.date||!a.resourceId||!a.pricingOption)return a;const n=W(a);return n.length===0?{...a,startTime:""}:n.includes(a.startTime)?a:{...a,startTime:n[0]}},I=(a,n,d)=>{y(F.value.map(g=>{if(g.id!==a)return g;if(n==="date"){const j={...g,date:String(d??""),dateValue:d||void 0};return $(j)}const w={...g,[n]:d};return L(n)?$(w):w}))},z=(a,n)=>{const d=Number(n);I(a,"paid",Number.isFinite(d)?d:0)},x=(a,n)=>{const d=Number(n);I(a,"spots",Number.isFinite(d)&&d>0?d:1)},Q=a=>{y(F.value.filter(n=>n.id!==a))},P=a=>{O("quick-add",a),T.value=!1},Y=a=>E.agendaData?.pricingOptions?.find(n=>n.id===a.pricingOption),m=a=>{const n=Y(a);return n?n.duration?`${n.name} (${n.duration}min)`:n.name:"Reservation"},V=a=>E.agendaData?.resources?.find(n=>n.id===a.resourceId),v=a=>V(a)?.name||"Unknown resource",h=a=>{if(!a||!X.test(a))return null;const[n,d]=a.split(":").map(Number);return n*60+d},S=a=>{const n=(a%1440+1440)%1440,d=Math.floor(n/60),g=n%60;return`${d.toString().padStart(2,"0")}:${g.toString().padStart(2,"0")}`},Z=a=>{const n=Number(Y(a)?.duration);return Number.isFinite(n)&&n>0?n:0},se=a=>{if(!a.startTime)return"";const n=Z(a);if(n<=0)return"";const d=h(a.startTime);return d===null?"":S(d+n)},te=a=>{if(!/^\d{4}-\d{2}-\d{2}$/.test(a))return null;const[n,d,g]=a.split("-").map(Number),w=new Date(n,d-1,g);return Number.isNaN(w.getTime())||w.getFullYear()!==n||w.getMonth()!==d-1||w.getDate()!==g?null:w},K=(a,n)=>(E.agendaData?.exceptions||[]).find(g=>n>=g.startDate&&n<=g.endDate?!g.resourceIds||g.resourceIds.length===0?!0:g.resourceIds.includes(a):!1)||null,oe=a=>{const n=V(a),d=te(a.date);if(!n||!d)return[];const g=K(n.id,a.date);if(g)return g.isClosed?[]:(g.timeslots||[]).map(j=>({start:j.startTime,end:j.endTime}));const w=d.getDay();return n.openingHours?.[w]||[]},W=a=>{const n=V(a);if(!n)return[];const d=Number(n.interval)>0?Number(n.interval):60,g=Z(a),w=new Set;for(const j of oe(a)){const q=h(j.start),p=h(j.end);if(q===null||p===null||p<=q)continue;const re=g>0?p-g:p-d;for(let J=q;J<=re;J+=d)w.add(S(J))}return Array.from(w).sort((j,q)=>(h(j)??0)-(h(q)??0))},ne=a=>{if(!a.startTime)return"Select time";const n=se(a);return n?`${a.startTime} - ${n}`:a.startTime},ae=a=>{const n=Number(a);if(!Number.isFinite(n))return C.value==="EUR"?"€0.00":"0.00";try{return B.value.format(n)}catch{return`${n.toFixed(2)}`}},u=a=>{const n=Number(a.spots),d=Number.isFinite(n)&&n>0?n:1;return d===1?"1 spot":`${d} spots`},k=a=>E.availabilityByReservation?.[a.id]??null,ce=a=>{const n=k(a);return!n||n.status==="checking"?"text-muted-foreground":n.status==="available"?"text-green-600 dark:text-green-400":"text-red-600 dark:text-red-400"},le=a=>{if(!/^\d{4}-\d{2}-\d{2}$/.test(a))return null;const[n,d,g]=a.split("-").map(Number),w=new Date(n,d-1,g);return Number.isNaN(w.getTime())||w.getFullYear()!==n||w.getMonth()!==d-1||w.getDate()!==g?null:(w.setHours(0,0,0,0),w)},r=a=>{const n=le(String(a.date||"").trim());if(!n)return"";const d=new Date;if(d.setHours(0,0,0,0),n<d)return"This date is in the past. Double-check it before saving.";const g=new Date(d);return g.setFullYear(g.getFullYear()+1),n>g?"This date is more than a year ahead. Double-check it before saving.":""},l=a=>!a.date||!a.startTime||!a.resourceId||!a.pricingOption,N=a=>_.value===a,G=a=>{_.value=_.value===a?null:a};return e.watch(F,a=>{const n=new Set(a.map(d=>d.id));if(_.value&&!n.has(_.value)&&(_.value=null),!_.value){const d=a.find(l);d&&(_.value=d.id)}},{immediate:!0}),(a,n)=>{const d=e.resolveComponent("Button"),g=e.resolveComponent("PopoverTrigger"),w=e.resolveComponent("PopoverContent"),j=e.resolveComponent("Popover"),q=e.resolveComponent("Label"),p=e.resolveComponent("DynamicSelectOption"),re=e.resolveComponent("DynamicSelect"),J=e.resolveComponent("Input"),ge=e.resolveComponent("SelectValue"),ve=e.resolveComponent("SelectTrigger"),t=e.resolveComponent("SelectItem"),s=e.resolveComponent("SelectContent"),c=e.resolveComponent("Select");return e.openBlock(),e.createElementBlock("div",et,[e.createElementVNode("div",tt,[e.createElementVNode("p",ot,e.toDisplayString(F.value.length===1?"1 reservation line":`${F.value.length} reservation lines`),1),e.createElementVNode("div",nt,[e.createVNode(j,{open:T.value,"onUpdate:open":n[0]||(n[0]=o=>T.value=o)},{default:e.withCtx(()=>[e.createVNode(g,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(d,{type:"button",variant:"outline",size:"sm",class:"gap-2"},{default:e.withCtx(()=>[e.createVNode(e.unref(ee.Zap),{class:"size-4 text-primary"}),n[2]||(n[2]=e.createTextVNode(" Quick add ",-1))]),_:1})]),_:1}),e.createVNode(w,{align:"end",class:"max-h-[80vh] w-[min(34rem,calc(100vw-2rem))] overflow-y-auto p-0"},{default:e.withCtx(()=>[T.value?(e.openBlock(),e.createBlock(Je,{key:0,surface:"popover",agendaData:D.agendaData,onAdd:P},null,8,["agendaData"])):e.createCommentVNode("",!0)]),_:1})]),_:1},8,["open"]),e.createVNode(d,{type:"button",variant:"outline",size:"sm",onClick:n[1]||(n[1]=o=>O("add"))},{default:e.withCtx(()=>[e.createVNode(e.unref(ee.Plus),{class:"size-4"}),n[3]||(n[3]=e.createTextVNode(" Add line ",-1))]),_:1})])]),F.value.length===0?(e.openBlock(),e.createElementBlock("div",at," Use Quick add to create filled reservation lines, or add an empty line manually. ")):(e.openBlock(),e.createElementBlock("div",rt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.value,(o,f)=>(e.openBlock(),e.createElementBlock("div",{key:o.id,class:"rounded-xl border bg-background"},[e.createElementVNode("div",st,[e.createElementVNode("button",{type:"button",class:"flex min-w-0 flex-1 items-start gap-3 rounded-lg px-1 py-1 text-left outline-none transition-colors hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring/50","aria-expanded":N(o.id),onClick:i=>G(o.id)},[e.createElementVNode("span",it,e.toDisplayString(f+1),1),e.createElementVNode("span",ct,[e.createElementVNode("span",dt,[e.createElementVNode("span",ut,[e.createElementVNode("span",mt,e.toDisplayString(ne(o)),1),e.createElementVNode("span",pt,e.toDisplayString(o.date||"No date selected"),1),e.createElementVNode("span",ft,e.toDisplayString(v(o))+" · "+e.toDisplayString(m(o)),1),k(o)?.message?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["mt-1 block text-xs font-medium",ce(o)])},e.toDisplayString(k(o)?.message),3)):e.createCommentVNode("",!0)]),e.createElementVNode("span",gt,[e.createVNode(e.unref(ee.Pencil),{class:"size-4"})])]),e.createElementVNode("span",vt,[e.createElementVNode("span",ht,[e.createVNode(e.unref(ee.Users),{class:"size-4"}),e.createTextVNode(" "+e.toDisplayString(u(o)),1)]),e.createElementVNode("span",kt,[e.createVNode(e.unref(ee.Tag),{class:"size-4"}),e.createTextVNode(" "+e.toDisplayString(ae(o.paid)),1)])])])],8,lt),e.createVNode(d,{type:"button",variant:"ghost",size:"icon",class:"mt-1 shrink-0",onClick:i=>Q(o.id)},{default:e.withCtx(()=>[e.createVNode(e.unref(ee.Trash2),{class:"size-4"})]),_:1},8,["onClick"])]),e.createElementVNode("div",_t,[e.createElementVNode("div",null,[e.createElementVNode("p",yt,"Reservation "+e.toDisplayString(f+1),1),e.createElementVNode("p",xt,e.toDisplayString(v(o))+" · "+e.toDisplayString(m(o)),1),k(o)?.message?(e.openBlock(),e.createElementBlock("p",{key:0,class:e.normalizeClass(["mt-1 text-xs font-medium",ce(o)])},e.toDisplayString(k(o)?.message),3)):e.createCommentVNode("",!0)]),e.createVNode(d,{type:"button",variant:"ghost",size:"icon",class:"shrink-0",onClick:i=>Q(o.id)},{default:e.withCtx(()=>[e.createVNode(e.unref(ee.Trash2),{class:"size-4"})]),_:1},8,["onClick"])]),e.createElementVNode("div",{class:e.normalizeClass(["px-3 pb-3 md:px-4 md:pb-4 overflow-hidden",N(o.id)?"block":"hidden md:block"])},[e.createElementVNode("div",Nt,[e.createElementVNode("div",bt,[e.createVNode(q,null,{default:e.withCtx(()=>[...n[4]||(n[4]=[e.createTextVNode("Resource",-1)])]),_:1}),e.createVNode(re,{"model-value":o.resourceId,"wrapper-class":"w-full",class:"w-full",placeholder:"Select resource","onUpdate:modelValue":i=>I(o.id,"resourceId",String(i??""))},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.agendaData?.resources||[],i=>(e.openBlock(),e.createBlock(p,{key:i.id,value:i.id},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),e.createElementVNode("div",Vt,[e.createVNode(q,null,{default:e.withCtx(()=>[...n[5]||(n[5]=[e.createTextVNode("Date",-1)])]),_:1}),e.createVNode(J,{"model-value":o.date,type:"date","onUpdate:modelValue":i=>I(o.id,"date",String(i??""))},null,8,["model-value","onUpdate:modelValue"]),r(o)?(e.openBlock(),e.createElementBlock("p",Ct,e.toDisplayString(r(o)),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",St,[e.createVNode(q,{for:`new_reservation_res_line_${f}_time`},{default:e.withCtx(()=>[...n[6]||(n[6]=[e.createTextVNode("Time",-1)])]),_:1},8,["for"]),o.resourceId&&o.date?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(c,{"model-value":o.startTime,"onUpdate:modelValue":i=>I(o.id,"startTime",String(i??""))},{default:e.withCtx(()=>[e.createVNode(ve,{id:`new_reservation_res_line_${f}_time`,class:"w-full"},{default:e.withCtx(()=>[e.createVNode(ge,{placeholder:"Select an hour"})]),_:1},8,["id"]),e.createVNode(s,null,{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(W(o),i=>(e.openBlock(),e.createBlock(t,{key:i,value:i},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i),1)]),_:2},1032,["value"]))),128))]),_:2},1024)]),_:2},1032,["model-value","onUpdate:modelValue"]),o.resourceId&&o.date&&W(o).length===0?(e.openBlock(),e.createElementBlock("p",wt," No times are available for this resource on the selected date. ")):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createElementBlock("p",Et,[!o.resourceId&&!o.date?(e.openBlock(),e.createElementBlock("span",Tt,"Please select a resource and date.")):o.resourceId?o.date?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Dt,"Please select a date.")):(e.openBlock(),e.createElementBlock("span",Bt,"Please select a resource."))]))]),e.createElementVNode("div",{class:e.normalizeClass(["grid gap-2",{hidden:D.agendaData?.pricingOptions?.length<2}])},[e.createVNode(q,null,{default:e.withCtx(()=>[...n[7]||(n[7]=[e.createTextVNode("Type",-1)])]),_:1}),e.createVNode(re,{"model-value":o.pricingOption,"wrapper-class":"w-full",class:"w-full",placeholder:"Select type","onUpdate:modelValue":i=>I(o.id,"pricingOption",String(i??""))},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.agendaData?.pricingOptions||[],i=>(e.openBlock(),e.createBlock(p,{key:i.id,value:i.id},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])],2),e.createElementVNode("div",{class:e.normalizeClass(["grid gap-4",U.value?"md:grid-cols-2 xl:grid-cols-2 xl:col-span-1":""])},[U.value?(e.openBlock(),e.createElementBlock("div",$t,[e.createVNode(q,null,{default:e.withCtx(()=>[...n[8]||(n[8]=[e.createTextVNode("Spots",-1)])]),_:1}),e.createVNode(J,{"model-value":o.spots,type:"number",min:"1",class:"no-spinner","onUpdate:modelValue":i=>x(o.id,i)},null,8,["model-value","onUpdate:modelValue"])])):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["grid gap-2",U.value?"":"md:col-span-2 xl:col-span-1"])},[e.createVNode(q,null,{default:e.withCtx(()=>[...n[9]||(n[9]=[e.createTextVNode("Paid",-1)])]),_:1}),e.createVNode(J,{"model-value":o.paid,type:"number",min:"0",step:"1",class:"no-spinner","onUpdate:modelValue":i=>z(o.id,i)},null,8,["model-value","onUpdate:modelValue"])],2)],2)])],2)]))),128))]))])}}}),Rt={class:"space-y-5 md:mt-5"},Ft={class:"space-y-3"},Ot={class:"mt-4 text-red-400"},Lt={class:"list-disc pl-4"},Mt={key:0},At={key:1},Pt={key:2},ke="",Ut=e.defineComponent({__name:"NewReservationDialog",props:{agendaData:{}},setup(D){const A=D,{params:E}=fe.useModuleRoute(),{config:O}=fe.useModule(),{log:X,logError:F}=fe.useLogs(),U=fe.useFirebaseIntegration(O.project),_=e.computed(()=>E.value?.id??E.id??""),T=e.inject("agendaData",e.ref({})),C=e.computed(()=>A.agendaData??T.value??{}),B=e.ref(!1),y=e.ref(!1),L=e.ref({});let $=0;const I=e.ref([]),z=/^([01]\d|2[0-3]):[0-5]\d$/,x=e.ref([]),Q=e.ref(null),P=e.computed(()=>Object.values(L.value).some(t=>t.status==="checking")),Y=e.computed(()=>Object.values(L.value).some(t=>t.status==="unavailable")),m=()=>C.value?.resources?.[0]?.id??"",V=()=>C.value?.pricingOptions?.find(t=>t.isDefault===!0)?.id??C.value?.pricingOptions?.[0]?.id??"",v=()=>{const t=new Date,s=t.getFullYear(),c=`${t.getMonth()+1}`.padStart(2,"0"),o=`${t.getDate()}`.padStart(2,"0");return`${s}-${c}-${o}`},h=t=>{let s=t?.pricingOption??V(),c=C.value?.pricingOptions?.find(f=>f.id===s)?.price??0;typeof c=="string"&&(c=Number(c));let o=t?.paid??c;return typeof o=="string"&&(o=Number(o)),{id:`reservation_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,spots:Number(t?.spots)||1,paid:Number.isFinite(o)?o:0,resourceId:t?.resourceId??m(),pricingOption:s,date:t?.date??v(),dateValue:t?.dateValue,startTime:t?.startTime??ke}},S=()=>{x.value=[h()]},Z=t=>(!t.date||t.date===v())&&t.startTime===ke,se=()=>{const t=x.value[x.value.length-1];x.value=[...x.value,h(t?{...t}:void 0)]},te=t=>C.value?.pricingOptions?.find(s=>s.id===t.pricingOption),K=t=>C.value?.resources?.find(s=>s.id===t.resourceId),oe=()=>{const t=Number(C.value?.maxTicketsPerReservation);return Number.isFinite(t)&&t>0?t:null},W=t=>`Reservation ${t+1}`,ne=t=>{const s=String(t.date||"").trim(),c=String(t.startTime||"").trim(),o=String(t.resourceId||"").trim();return!s||!c||!o?"":`${o}_${s}_${c}`},ae=()=>{const t=[],s=new Map,c=oe();return x.value.forEach((o,f)=>{const i=W(f),R=String(o.date||"").trim(),M=String(o.startTime||"").trim(),b=String(o.resourceId||"").trim(),H=String(o.pricingOption||"").trim(),ue=Number(o.spots),de=Number(o.paid);R||t.push(`${i}: please select a date.`),M?z.test(M)||t.push(`${i}: please enter a valid time.`):t.push(`${i}: please select a time.`),b?K(o)||t.push(`${i}: the selected resource is no longer available.`):t.push(`${i}: please select a resource.`),H?te(o)||t.push(`${i}: the selected type is no longer available.`):t.push(`${i}: please select a type.`),!Number.isFinite(ue)||ue<=0?t.push(`${i}: spots must be at least 1.`):c!==null&&ue>c&&t.push(`${i}: spots cannot be more than ${c}.`),(!Number.isFinite(de)||de<0)&&t.push(`${i}: paid amount must be 0 or higher.`);const ie=ne(o);if(ie){const me=s.get(ie);me!==void 0?t.push(`${i}: duplicate of ${W(me).toLowerCase()}.`):s.set(ie,f)}}),t},u=t=>{const s=t.startTimes.map(c=>h({date:t.date?`${t.date}`:"",dateValue:t.date,pricingOption:t.pricingOptionId,resourceId:t.resourceId,spots:t.spots,paid:t.paid,startTime:c}));if(s.length!==0){if(x.value.length===1&&Z(x.value[0])){x.value=s;return}x.value=[...x.value,...s]}},k=t=>{if(!t||!z.test(t))return null;const[s,c]=t.split(":").map(Number);return s*60+c},ce=t=>{const s=(t%1440+1440)%1440,c=Math.floor(s/60),o=s%60;return`${c.toString().padStart(2,"0")}:${o.toString().padStart(2,"0")}`},le=t=>{if(!t.startTime||!t.pricingOption)return"";const s=te(t),c=Number(s?.duration);if(!Number.isFinite(c)||c<=0)return t.startTime;const o=k(t.startTime);return o===null?"":ce(o+c)},r=t=>{const s=Number(t.spots);return Number.isFinite(s)&&s>0?s:1},l=t=>{const s=Number(K(t)?.capacity);return Number.isFinite(s)&&s>0?s:1},N=t=>{const s=String(t.date||"").trim(),c=String(t.resourceId||"").trim(),o=k(t.startTime),f=k(le(t));return!s||!c||!K(t)||!te(t)||o===null||f===null||f<=o?null:{reservation:t,date:s,resourceId:c,startMinutes:o,endMinutes:f,capacity:l(t),requestedSpots:r(t)}},G=t=>["approved","needs_approval"].includes(t?.status),a=(t,s,c,o)=>t<o&&s>c,n=t=>`${t} ${t===1?"spot":"spots"}`,d=(t,s,c)=>t<c?{status:"unavailable",message:`Not enough spots: ${n(Math.max(t,0))} open, needs ${n(c)}.`}:{status:"available",message:`Available: ${t} of ${s} ${s===1?"spot":"spots"} open, ${n(t-c)} will remain.`},g=t=>t?.id||t?.orderId||"",w=(t,s)=>{const c=[];for(let o=0;o<t.length;o+=s)c.push(t.slice(o,o+s));return c},j=async t=>{const s=new Map,c=[];for(const o of w(t,10)){const f=[{field:"status",operator:"==",value:"confirmed"},{field:"flattenedReservationDates",operator:"array-contains-any",value:o}];_.value&&f.unshift({field:"agendaId",operator:"==",value:_.value});const i=await U.find(O.reservationsCollection,{filters:f});for(const R of i||[]){const M=g(R);M?s.set(M,R):c.push(R)}}return[...s.values(),...c]},q=(t,s)=>{let c=0;for(const o of t)for(const f of o?.reservations||[]){if(!G(f)||f?.date!==s.date||f?.resourceId!==s.resourceId)continue;const i=k(f?.timeslot?.startTime),R=k(f?.timeslot?.endTime);if(i===null||R===null||R<=i||!a(s.startMinutes,s.endMinutes,i,R))continue;const M=Number(f?.spots);c+=Number.isFinite(M)&&M>0?M:1}return c},p=t=>{let s=0;for(const c of x.value){if(c.id===t.reservation.id)continue;const o=N(c);o&&o.date===t.date&&o.resourceId===t.resourceId&&a(t.startMinutes,t.endMinutes,o.startMinutes,o.endMinutes)&&(s+=o.requestedSpots)}return s},re=async()=>{const t=++$,s=x.value.map(N).filter(o=>!!o),c=s.reduce((o,f)=>(o[f.reservation.id]={status:"checking",message:"Checking availability..."},o),{});if(L.value=c,!B.value||s.length===0)return c;try{const o=Array.from(new Set(s.map(R=>`${R.resourceId}_${R.date}`))),f=await j(o);if(t!==$)return null;const i=s.reduce((R,M)=>{const b=q(f,M)+p(M),H=M.capacity-b;return R[M.reservation.id]=d(H,M.capacity,M.requestedSpots),R},{});return L.value=i,i}catch(o){if(t!==$)return null;console.error("Error checking new reservation availability:",o);const f=s.reduce((i,R)=>(i[R.reservation.id]={status:"error",message:"Could not check availability for this reservation."},i),{});return L.value=f,f}},J=t=>t?x.value.flatMap((s,c)=>{const o=t[s.id];return o?o.status==="unavailable"?[`${W(c)}: ${o.message}`]:o.status==="error"?[`${W(c)}: availability could not be checked.`]:[]:[]}):["Could not check availability before creating the reservation."];e.watch(B,async t=>{t?(I.value=[],S(),await e.nextTick(),Q.value?.reset()):($+=1,L.value={})}),e.watch(x,()=>{B.value&&re()},{deep:!0});const ge=()=>{const t=[];I.value=[];const s=Q.value,c=s?s.validateForm():!1;return s||t.push("Customer information form is unavailable."),x.value.length===0&&t.push("Please add at least one reservation."),t.push(...ae()),I.value=t,t.length===0&&c},ve=async()=>{const t=Q.value;if(!t||!ge())return;const s=await re(),c=J(s);if(c.length>0){I.value=c;return}let o=!1;try{y.value=!0;const f=t.getCustomerInfo(),i=x.value.map(b=>{const H=Number(b.paid)||0,ue=Number(b.spots)||1,de=te(b),ie=K(b),me=b.date;return{paidAmount:H,flattenedReservationDate:`${b.resourceId}_${me}`,flattenedReservation:`${b.resourceId}_${me}_${b.startTime.replace(":","")}`,reservation:{status:"approved",totalPrice:Number(H.toFixed(2)),basePrice:Number((H/ue).toFixed(2)),addOnsPrice:0,addOns:[],date:me,id:`res_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,pricingOption:{duration:de?.duration||"",id:de?.id||"",name:de?.name||"",price:de?.price||""},pricingOptionId:b.pricingOption,resource:{avatarLabel:ie?.avatarLabel||"",color:ie?.color||"",description:ie?.description||"",id:ie?.id||"",name:ie?.name||""},resourceId:b.resourceId,spots:ue,timeslot:{startTime:b.startTime,endTime:le(b)}}}}),R=Number(i.reduce((b,H)=>b+H.paidAmount,0).toFixed(2)),M={agendaId:_.value,customerInfo:f,metadata:{},amountPaid:R,amountDue:0,subtotal:R,total:R,createdAt:new Date,updatedAt:new Date,discount:0,flattenedReservationDates:Array.from(new Set(i.map(b=>b.flattenedReservationDate))),flattenedReservations:i.map(b=>b.flattenedReservation),paymentStatus:"paid",paymentType:"full",reservations:i.map(b=>b.reservation),status:"confirmed"};await U.add(O.reservationsCollection,M),o=!0,X(`${i.length} ${i.length>1?"reservations":"reservation"} created in Studio`,{agendaId:_.value,reservationIds:i.map(b=>b.reservation.id),amountPaid:R,reservations:i.map(b=>`${b.reservation.resource.name}: ${b.reservation.date} ${b.reservation.timeslot.startTime}`)})}catch(f){F("Failed to create reservation in Studio",{error:f instanceof Error?f.message:String(f),agendaId:_.value}),console.error("Error creating reservation:",f)}finally{y.value=!1,o&&(B.value=!1)}};return(t,s)=>{const c=e.resolveComponent("Button"),o=e.resolveComponent("ResponsiveModalTrigger"),f=e.resolveComponent("ResponsiveModalTitle"),i=e.resolveComponent("ResponsiveModalHeader"),R=e.resolveComponent("ResponsiveModalFooter"),M=e.resolveComponent("ResponsiveModalScrollContent"),b=e.resolveComponent("ResponsiveModal");return e.openBlock(),e.createBlock(b,{open:B.value,"onUpdate:open":s[1]||(s[1]=H=>B.value=H)},{default:e.withCtx(()=>[e.createVNode(o,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(c,null,{default:e.withCtx(()=>[e.createVNode(e.unref(ee.Plus),{class:"size-4"}),s[2]||(s[2]=e.createTextVNode(" Add Reservation ",-1))]),_:1})]),_:1}),e.createVNode(M,{class:"@container/modal sm:max-w-7xl"},{default:e.withCtx(()=>[e.createVNode(i,null,{default:e.withCtx(()=>[e.createVNode(f,null,{default:e.withCtx(()=>[...s[3]||(s[3]=[e.createTextVNode("Create new reservation",-1)])]),_:1})]),_:1}),e.createElementVNode("div",Rt,[e.createVNode(Te,{ref_key:"customerInformationRef",ref:Q,agendaData:C.value},null,8,["agendaData"]),s[5]||(s[5]=e.createElementVNode("div",{class:"w-full h-[1px] bg-border my-8"},null,-1)),e.createElementVNode("div",Ft,[s[4]||(s[4]=e.createElementVNode("div",{class:"flex items-center justify-between gap-3"},[e.createElementVNode("h2",{class:"text-sm font-medium"},"Reservations")],-1)),e.createVNode(It,{modelValue:x.value,"onUpdate:modelValue":s[0]||(s[0]=H=>x.value=H),agendaData:C.value,"availability-by-reservation":L.value,onAdd:se,onQuickAdd:u},null,8,["modelValue","agendaData","availability-by-reservation"])]),e.createElementVNode("div",Ot,[e.createElementVNode("ul",Lt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.value,H=>(e.openBlock(),e.createElementBlock("li",{key:H},e.toDisplayString(H),1))),128))])])]),e.createVNode(R,{class:"gap-2"},{default:e.withCtx(()=>[e.createVNode(c,{onClick:ve,disabled:y.value||P.value||Y.value},{default:e.withCtx(()=>[y.value?(e.openBlock(),e.createElementBlock("span",Mt,"Creating...")):P.value?(e.openBlock(),e.createElementBlock("span",At,"Checking availability...")):(e.openBlock(),e.createElementBlock("span",Pt,e.toDisplayString(x.value.length>1?`Create ${x.value.length} reservations`:"Create reservation"),1))]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["open"])}}});exports._sfc_main=Ut;