@oneclick.dev/cms-core-modules 0.0.114 → 0.0.116
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ContentEditor-MctMvN7D.js → ContentEditor-CsbOFg3a.js} +52 -52
- package/dist/{ContentEditor-C5yNNLeV.mjs → ContentEditor-Df5uWpVC.mjs} +10337 -8677
- package/dist/EditLayout.vue_vue_type_script_setup_true_lang-gozJKXvM.js +1 -0
- package/dist/EditLayout.vue_vue_type_script_setup_true_lang-pDO9b4Pv.mjs +77 -0
- package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-BHeMJ6nr.mjs +1476 -0
- package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-C2zwt5UF.js +1 -0
- package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-BYSeUW_V.js +925 -0
- package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-DwAUYR8p.mjs +5021 -0
- package/dist/Overview-CBahJviK.js +1 -0
- package/dist/Overview-CVQ1pkuD.mjs +527 -0
- package/dist/TableView-Csv5Lycy.mjs +6234 -0
- package/dist/TableView-Cwal0BPW.js +4 -0
- package/dist/agenda-BSdlrfxv.mjs +1253 -0
- package/dist/agenda-Bev1mO7E.js +1 -0
- package/dist/availability-ClBGVgE9.js +1 -0
- package/dist/availability-D8JdA4rP.mjs +274 -0
- package/dist/booking-data-Px7XCIfU.mjs +1024 -0
- package/dist/booking-data-aMS1p_3g.js +1 -0
- package/dist/cms-core-modules.css +1 -1
- package/dist/exceptions-CqityDo9.mjs +651 -0
- package/dist/exceptions-DXqc0Nza.js +1 -0
- package/dist/index-CM4eaK5T.mjs +1245 -0
- package/dist/index-DliTZzwI.js +35 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.mjs +12 -11
- package/dist/orders-1swJVKw2.js +1 -0
- package/dist/orders-D41GbzIa.mjs +624 -0
- package/dist/payment-BJHgpaeT.js +1 -0
- package/dist/payment-D5j-68Ig.mjs +1278 -0
- package/dist/refunds-D9nTeD2d.mjs +436 -0
- package/dist/refunds-oVB2Opib.js +1 -0
- package/dist/resources-8WouFvJe.js +1 -0
- package/dist/resources-B-D5MUhV.mjs +975 -0
- package/dist/server-handlers.cjs.js +1 -1
- package/dist/server-handlers.mjs +626 -515
- package/dist/src/appointments/components/edit/EventDialog/BookingsList.vue.d.ts +146 -5
- package/dist/src/appointments/components/edit/EventDialog/CancelRefundReservationDialog.vue.d.ts +33 -0
- package/dist/src/appointments/components/edit/EventDialog/OrderDetailDialog.vue.d.ts +26 -8
- package/dist/src/appointments/components/edit/EventDialog/RefundDetailsDisplay.vue.d.ts +8 -0
- package/dist/src/appointments/components/edit/EventDialog/ReservationDetailDialog.vue.d.ts +91 -5
- package/dist/src/appointments/components/edit/EventDialog/TransferReservationDialog.vue.d.ts +20 -3
- package/dist/src/appointments/components/edit/NewReservationDialog/ReservationLines.vue.d.ts +5 -0
- package/dist/src/appointments/components/edit/OrderMetadataDisplay.vue.d.ts +20 -2
- package/dist/src/appointments/components/edit/dashboard/BookingsList.vue.d.ts +240 -0
- package/dist/src/appointments/composables/useAgendaMetadataSchema.d.ts +37 -0
- package/dist/src/appointments/pages/edit/orders.vue.d.ts +225 -0
- package/dist/src/appointments/pages/edit/refunds.vue.d.ts +2 -0
- package/dist/src/appointments/server.d.ts +2 -0
- package/dist/src/appointments/types.d.ts +6 -0
- package/dist/src/appointments/utils/printReservation.d.ts +65 -3
- package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/Table.d.ts +36 -0
- package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/Table.vue.d.ts +95 -0
- package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/TableCell.d.ts +13 -0
- package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/TableHeader.d.ts +6 -0
- package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/TableRow.d.ts +6 -0
- package/dist/src/contentManager/components/content-editor/tiptap-extensions/table/index.d.ts +4 -0
- package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/TableMenu.vue.d.ts +13 -0
- package/dist/src/contentManager/components/content-editor/tiptap-menus/element-editor-views/index.d.ts +14 -0
- package/package.json +2 -2
- package/dist/EditLayout.vue_vue_type_script_setup_true_lang-DWMqQvHl.mjs +0 -76
- package/dist/EditLayout.vue_vue_type_script_setup_true_lang-kpjbVSXg.js +0 -1
- package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-Baqy-rTT.js +0 -1
- package/dist/NewReservationDialog.vue_vue_type_script_setup_true_lang-Dx4Bpa2m.mjs +0 -1263
- package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-COrK1j0S.js +0 -1
- package/dist/OrderDetailDialog.vue_vue_type_script_setup_true_lang-Vb3q8EVv.mjs +0 -330
- package/dist/Overview-98nkJUWN.mjs +0 -481
- package/dist/Overview-Dl8cMlsr.js +0 -1
- package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-CuwREvXD.js +0 -349
- package/dist/ReservationDetailDialog.vue_vue_type_script_setup_true_lang-GYNZ_yhD.mjs +0 -3077
- package/dist/TableView-CVfkyj1k.js +0 -4
- package/dist/TableView-zDx0IegJ.mjs +0 -6096
- package/dist/agenda-BaJu3-1c.js +0 -1
- package/dist/agenda-BwVY_8oM.mjs +0 -1165
- package/dist/availability-CMrRa5y2.mjs +0 -269
- package/dist/availability-Cf2YfMwM.js +0 -1
- package/dist/booking-data-DgJd0BcM.mjs +0 -889
- package/dist/booking-data-Di5GmH_8.js +0 -1
- package/dist/exceptions-B6P9UiCj.js +0 -1
- package/dist/exceptions-De9-FvdP.mjs +0 -646
- package/dist/index-DL6orwdK.js +0 -35
- package/dist/index-hH3e-IYz.mjs +0 -1187
- package/dist/orders-C65SlpJy.mjs +0 -618
- package/dist/orders-XVzWAgG1.js +0 -1
- package/dist/payment-C3ohkehF.mjs +0 -1080
- package/dist/payment-Dfr-Ro-a.js +0 -1
- package/dist/resources-CxeFd57z.js +0 -1
- package/dist/resources-DwYxn2Vi.mjs +0 -811
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("vue"),te=require("lucide-vue-next"),ve=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"},Be=e.defineComponent({__name:"CustomerInformation",props:{agendaData:{}},setup($,{expose:U}){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}],L=new Set(["firstName","email"]),Z=$,R=e.ref([]),V=e.reactive({}),B=e.computed(()=>{const d=Z.agendaData?.customerInformationFields,g=(Array.isArray(d)&&d.length>0?d:E).filter(N=>N?.id&&(N.visible!==!1||L.has(N.id))).map(N=>({...N,required:L.has(N.id),visible:!0})),_=E.filter(N=>L.has(N.id)&&!g.some(X=>X.id===N.id)).map(N=>({...N,required:!0,visible:!0}));return[...g,..._]}),T=d=>d.fieldName||d.id,I=d=>d.replace(/[^A-Za-z0-9_-]/g,"-"),h=(d,x)=>["new-res-customer-info",d.id,x].filter(Boolean).map(_=>I(_)).join("-"),w=d=>d.fieldType==="email"||d.fieldType==="tel"||d.fieldType==="date"?d.fieldType:"text",M=d=>Array.isArray(d.options)?d.options.filter(Boolean):[],A=d=>d.fieldType==="checkbox"?!1:"",D=(d=!1)=>{const x=new Set(B.value.map(g=>g.id));Object.keys(V).forEach(g=>{x.has(g)||delete V[g]}),B.value.forEach(g=>{const _=A(g);(d||V[g.id]===void 0||typeof V[g.id]!=typeof _)&&(V[g.id]=_)})},W=()=>{const d=B.value.reduce((x,g)=>{const _=V[g.id];return x[g.id]=typeof _=="string"?_.trim():!!_,x},{});return Object.entries(d).forEach(([x,g])=>{V[x]=g}),d},k=(d,x)=>d.fieldType==="checkbox"?x===!0:typeof x=="string"?x.trim().length>0:x!=null,G=()=>{R.value=[],D(!0)},z=()=>{const d=[],x=W();return B.value.forEach(g=>{const _=x[g.id],N=T(g);g.required&&!k(g,_)&&d.push(`Please fill in ${N}.`),g.fieldType==="email"&&k(g,_)&&typeof _=="string"&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(_)===!1&&d.push(`Please fill in a correct ${N}.`)}),R.value=d,d.length===0};return e.watch(B,()=>{D()},{immediate:!0}),U({getCustomerInfo:W,reset:G,validateForm:z}),(d,x)=>{const g=e.resolveComponent("Checkbox"),_=e.resolveComponent("Label"),N=e.resolveComponent("SelectValue"),X=e.resolveComponent("SelectTrigger"),oe=e.resolveComponent("SelectItem"),re=e.resolveComponent("SelectGroup"),ne=e.resolveComponent("SelectContent"),j=e.resolveComponent("Select"),se=e.resolveComponent("RadioGroupItem"),H=e.resolveComponent("RadioGroup"),K=e.resolveComponent("Input");return e.openBlock(),e.createElementBlock("div",ye,[x[0]||(x[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(B.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(g,{id:h(u),modelValue:V[u.id],"onUpdate:modelValue":C=>V[u.id]=C},null,8,["id","modelValue","onUpdate:modelValue"]),e.createVNode(_,{for:h(u),class:"font-normal cursor-pointer"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(T(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(_,{for:h(u)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(T(u))+" ",1),u.required?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Ve,"optional"))]),_:2},1032,["for"]),e.createVNode(j,{modelValue:V[u.id],"onUpdate:modelValue":C=>V[u.id]=C},{default:e.withCtx(()=>[e.createVNode(X,{id:h(u),class:"w-full"},{default:e.withCtx(()=>[e.createVNode(N,{placeholder:`Select ${T(u)}`},null,8,["placeholder"])]),_:2},1032,["id"]),e.createVNode(ne,null,{default:e.withCtx(()=>[e.createVNode(re,null,{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M(u),C=>(e.openBlock(),e.createBlock(oe,{key:C,value:C},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(C),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(_,null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(T(u))+" ",1),u.required?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Ce,"optional"))]),_:2},1024),e.createVNode(H,{modelValue:V[u.id],"onUpdate:modelValue":C=>V[u.id]=C,class:"grid gap-2"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M(u),C=>(e.openBlock(),e.createElementBlock("div",{key:C,class:"flex items-center gap-2"},[e.createVNode(se,{id:h(u,C),value:C},null,8,["id","value"]),e.createVNode(_,{for:h(u,C),class:"font-normal cursor-pointer"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(C),1)]),_:2},1032,["for"])]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue"])],64)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:3},[e.createVNode(_,{for:h(u)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(T(u))+" ",1),u.required?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Se,"optional"))]),_:2},1032,["for"]),e.createVNode(K,{modelValue:V[u.id],"onUpdate:modelValue":C=>V[u.id]=C,id:h(u),type:w(u),autocomplete:"off"},null,8,["modelValue","onUpdate:modelValue","id","type"])],64))],2))),128))]),R.value.length>0?(e.openBlock(),e.createElementBlock("div",we,[e.createElementVNode("ul",Ee,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(R.value,u=>(e.openBlock(),e.createElementBlock("li",{key:u},e.toDisplayString(u),1))),128))])])):e.createCommentVNode("",!0)])}}});function Te($={}){const U=e.ref(null),E=e.ref(!1),L=e.ref(!1),Z=e.ref(!1),R=e.ref(!1),V=$.dragSpeed??1.1,B=$.dragThreshold??10,T=$.edgeThreshold??10,I=$.ignoreDragSelector??'input, select, textarea, [contenteditable="true"], [data-horizontal-scroll-ignore-drag]';let h=null,w=0,M=0,A=!1,D=null,W=null,k=null;const G=()=>{D===null||typeof window>"u"||(window.clearTimeout(D),D=null)},z=()=>{const o=U.value;if(!o){L.value=!1,Z.value=!1,R.value=!1;return}const m=Math.max(o.scrollWidth-o.clientWidth,0);L.value=m>T,Z.value=L.value&&o.scrollLeft>T,R.value=L.value&&o.scrollLeft<m-T},d=()=>{e.nextTick(()=>{if(typeof window>"u"){z();return}window.requestAnimationFrame(()=>z())})},x=()=>{if(typeof $.scrollStep=="number")return $.scrollStep;const o=U.value;return o?Math.max(Math.floor(o.clientWidth*.72),180):240},g=(o,m="smooth")=>{const O=U.value;if(O){if(O.scrollBy({left:o,behavior:m}),m==="auto"){z();return}d()}},_=()=>{g(-x())},N=()=>{g(x())},X=()=>{const o=U.value;h!==null&&o?.hasPointerCapture?.(h)&&o.releasePointerCapture(h),E.value&&(A=!0,G(),typeof window<"u"&&(D=window.setTimeout(()=>{A=!1,D=null},0))),h=null,E.value=!1,o&&(o.style.userSelect="",o.style.cursor=""),z()},oe=()=>{z()},re=o=>{const m=U.value;if(!m||!L.value||Math.abs(o.deltaY)<=Math.abs(o.deltaX))return;const O=o.deltaY<0,J=o.deltaY>0;O&&!Z.value||J&&!R.value||(o.preventDefault(),m.scrollLeft+=o.deltaY,z())},ne=o=>o instanceof Element?!!o.closest(I):!1,j=o=>{const m=U.value;!m||!L.value||o.pointerType!=="touch"&&o.button===0&&(ne(o.target)||(h=o.pointerId,w=o.clientX,M=m.scrollLeft,A=!1))},se=o=>{const m=U.value;if(!m||h!==o.pointerId)return;const O=o.clientX-w;!E.value&&Math.abs(O)<B||(E.value||(E.value=!0,m.style.userSelect="none",m.style.cursor="grabbing",m.setPointerCapture?.(o.pointerId)),o.preventDefault(),m.scrollLeft=M-O*V,z())},H=o=>{h===o.pointerId&&X()},K=()=>{h!==null&&X()},u=o=>{A&&(o.preventDefault(),o.stopPropagation(),A=!1)},C=o=>{typeof ResizeObserver<"u"&&(W=new ResizeObserver(()=>z()),W.observe(o)),$.observeMutations!==!1&&typeof MutationObserver<"u"&&(k=new MutationObserver(()=>d()),k.observe(o,{childList:!0,subtree:!0,characterData:!0}))},Q=()=>{W?.disconnect(),k?.disconnect(),W=null,k=null},ce=o=>{o.addEventListener("scroll",oe),o.addEventListener("wheel",re,{passive:!1}),o.addEventListener("pointerdown",j),o.addEventListener("pointermove",se),o.addEventListener("pointerup",H),o.addEventListener("pointercancel",K),o.addEventListener("lostpointercapture",K),o.addEventListener("click",u,!0),C(o),d()},b=o=>{o.removeEventListener("scroll",oe),o.removeEventListener("wheel",re),o.removeEventListener("pointerdown",j),o.removeEventListener("pointermove",se),o.removeEventListener("pointerup",H),o.removeEventListener("pointercancel",K),o.removeEventListener("lostpointercapture",K),o.removeEventListener("click",u,!0),Q()};return e.watch(U,(o,m)=>{m&&b(m),o?ce(o):z()}),e.onMounted(()=>{d()}),e.onBeforeUnmount(()=>{G(),U.value&&b(U.value),A=!1,X()}),{canScrollLeft:e.computed(()=>Z.value),canScrollRight:e.computed(()=>R.value),containerRef:U,isDragging:E,isScrollable:L,refresh:d,scrollNext:N,scrollPrev:_,showLeftShadow:Z,showRightShadow:R}}const De={class:"flex items-start justify-between gap-3"},$e={class:"text-sm font-medium"},Re={key:0,class:"mt-1 text-xs text-muted-foreground"},Ie={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={key:0,class:"rounded-md border border-dashed bg-muted/20 px-4 py-4 text-sm text-muted-foreground"},Ue={key:1,class:"relative flex items-center gap-2 overflow-hidden"},ze={class:"relative min-w-0 flex-1 overflow-hidden"},qe={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"},je={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"},He={key:0,class:"absolute -top-1 -right-1 flex items-center justify-center bg-primary rounded-full text-background size-4"},Qe={class:"flex flex-wrap gap-2"},Ye=["onClick"],We={key:0},Ge={key:1},Xe={key:2},Ze=e.defineComponent({__name:"QuickReservationAdder",props:{agendaData:{},surface:{default:"card"}},emits:["add"],setup($,{emit:U}){const E=$,L=U,Z=new pe.$fb18d541ea1ad717$export$ad991b66133851cf("en-US",{dateStyle:"long"}),R=pe.$14e0f24ef4ac5c92$export$d0bdf45af03a6ea3(pe.$14e0f24ef4ac5c92$export$aa8b41735afcabd2()),V=e.computed(()=>E.surface==="popover"),B=e.ref(""),T=e.ref(void 0),I=e.ref(""),h=e.ref(""),w=e.ref([]),M=e.ref(1),A=e.computed(()=>E.agendaData?.resources?.find(b=>b.id===I.value)),D=b=>{const[o,m]=b.split(":").map(Number);return o*60+m},W=b=>{const o=Math.floor(b/60),m=b%60;return`${o.toString().padStart(2,"0")}:${m.toString().padStart(2,"0")}`},k=()=>{if(!A.value)return[];const b=A.value.interval||60;let o=null,m=null;for(const J of Object.values(A.value.openingHours||{}))for(const r of J){const a=D(r.start),c=D(r.end);(o===null||a<o)&&(o=a),(m===null||c>m)&&(m=c)}if(o===null||m===null)return[];const O=[];for(let J=o;J<m;J+=b)O.push(W(J));return O},G=e.computed(()=>T.value&&I.value&&h.value&&w.value.length>0),z=e.computed(()=>k()),{canScrollLeft:d,canScrollRight:x,containerRef:g,isDragging:_,isScrollable:N,scrollNext:X,scrollPrev:oe,showLeftShadow:re,showRightShadow:ne}=Te(),j=b=>w.value.includes(b),se=b=>{if(j(b)){w.value=w.value.filter(o=>o!==b);return}w.value=[...w.value,b].sort((o,m)=>D(o)-D(m))},H=(b,o)=>{T.value=b?e.markRaw(b):void 0,B.value=b?`${b}`:"",o()},K=e.ref(""),u=e.ref(""),C=e.ref([]),Q=()=>{L("add",{date:T.value,resourceId:I.value,pricingOptionId:h.value,startTimes:w.value,spots:M.value}),w.value=[],C.value=[],u.value="",K.value=""},ce=()=>{B.value=R.toString(),T.value=R,I.value=E.agendaData?.resources?.[0]?.id||"",h.value=E.agendaData?.pricingOptions?.find(b=>b.isDefault)?.id||E.agendaData?.pricingOptions?.[0]?.id||"",w.value=[],M.value=1,K.value=""};return e.onMounted(()=>{ce()}),(b,o)=>{const m=e.resolveComponent("Label"),O=e.resolveComponent("Button"),J=e.resolveComponent("PopoverTrigger"),r=e.resolveComponent("Calendar"),a=e.resolveComponent("PopoverContent"),c=e.resolveComponent("Popover"),v=e.resolveComponent("DynamicSelectOption"),S=e.resolveComponent("DynamicSelect"),Y=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(V)?"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(V)?"Quick add reservations":"Add reservations"),1),e.unref(V)?(e.openBlock(),e.createElementBlock("p",Re," Choose one date and add multiple timeslots in one pass. ")):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Ie,[e.createElementVNode("div",Fe,[e.createVNode(m,null,{default:e.withCtx(()=>[...o[3]||(o[3]=[e.createTextVNode("Date",-1)])]),_:1}),e.createVNode(c,null,{default:e.withCtx(({close:p})=>[e.createVNode(J,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(O,{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(te.CalendarIcon)),e.createTextVNode(" "+e.toDisplayString(e.unref(T)?e.unref(Z).format(e.unref(T).toDate(e.unref(pe.$14e0f24ef4ac5c92$export$aa8b41735afcabd2)())):"Pick a date"),1)]),_:1},8,["class"])]),_:1}),e.createVNode(a,{class:"w-auto p-0",align:"start"},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":e.unref(T),"default-placeholder":e.unref(R),layout:"month-and-year","initial-focus":"","onUpdate:modelValue":ee=>H(ee,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})]),$.agendaData.resources?.length>1?(e.openBlock(),e.createElementBlock("div",Oe,[e.createVNode(m,null,{default:e.withCtx(()=>[...o[4]||(o[4]=[e.createTextVNode("Resource",-1)])]),_:1}),e.createVNode(S,{modelValue:e.unref(I),"onUpdate:modelValue":o[0]||(o[0]=p=>e.isRef(I)?I.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($.agendaData.resources||[],p=>(e.openBlock(),e.createBlock(v,{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),$.agendaData.pricingOptions?.length>1?(e.openBlock(),e.createElementBlock("div",Le,[e.createVNode(m,null,{default:e.withCtx(()=>[...o[5]||(o[5]=[e.createTextVNode("Type",-1)])]),_:1}),e.createVNode(S,{modelValue:e.unref(h),"onUpdate:modelValue":o[1]||(o[1]=p=>e.isRef(h)?h.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($.agendaData.pricingOptions||[],p=>(e.openBlock(),e.createBlock(v,{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),$.agendaData?.maxTicketsPerReservation>1?(e.openBlock(),e.createElementBlock("div",Me,[e.createVNode(m,null,{default:e.withCtx(()=>[...o[6]||(o[6]=[e.createTextVNode("Spots/tickets",-1)])]),_:1}),e.createVNode(Y,{modelValue:e.unref(M),"onUpdate:modelValue":o[2]||(o[2]=p=>e.isRef(M)?M.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(m,null,{default:e.withCtx(()=>[...o[7]||(o[7]=[e.createTextVNode("Available hours",-1)])]),_:1}),e.unref(z).length===0?(e.openBlock(),e.createElementBlock("div",Pe," No preset hours are available for this resource. You can still add a custom time below. ")):(e.openBlock(),e.createElementBlock("div",Ue,[e.unref(d)?(e.openBlock(),e.createBlock(O,{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(oe)},{default:e.withCtx(()=>[e.createVNode(e.unref(te.ChevronLeft),{class:"size-4"})]),_:1},8,["onClick"])):e.createCommentVNode("",!0),e.createElementVNode("div",ze,[e.unref(re)?(e.openBlock(),e.createElementBlock("div",qe)):e.createCommentVNode("",!0),e.unref(ne)?(e.openBlock(),e.createElementBlock("div",je)):e.createCommentVNode("",!0),e.createElementVNode("div",{ref_key:"hourScrollContainer",ref:g,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(N)&&!e.unref(_)&&"cursor-grab",e.unref(_)&&"cursor-grabbing select-none"))},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(z),p=>(e.openBlock(),e.createBlock(O,{key:p,type:"button",variant:"outline",class:e.normalizeClass(["relative h-12 shrink-0",j(p)?"border-primary!":""]),onClick:ee=>se(p)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(p)+" ",1),j(p)?(e.openBlock(),e.createElementBlock("div",He,[e.createVNode(e.unref(te.Check),{class:"size-3"})])):e.createCommentVNode("",!0)]),_:2},1032,["class","onClick"]))),128))],2)]),e.unref(x)?(e.openBlock(),e.createBlock(O,{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(X)},{default:e.withCtx(()=>[e.createVNode(e.unref(te.ChevronRight),{class:"size-4"})]),_:1},8,["onClick"])):e.createCommentVNode("",!0)])),e.createElementVNode("div",Qe,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(C),p=>(e.openBlock(),e.createElementBlock("div",{key:p,class:"relative"},[e.createVNode(O,{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:ee=>{C.value=e.unref(C).filter(ae=>ae!==p),w.value=e.unref(w).filter(ae=>ae!==p)}},[e.createVNode(e.unref(te.X),{class:"size-3"})],8,Ye)]))),128))])]),e.createElementVNode("div",null,[e.createVNode(O,{disabled:!e.unref(G),onClick:Q},{default:e.withCtx(()=>[e.unref(w).length===0?(e.openBlock(),e.createElementBlock("span",We,"Select at least one timeslot")):e.unref(w).length===1?(e.openBlock(),e.createElementBlock("span",Ge,"Add 1 reservation")):(e.openBlock(),e.createElementBlock("span",Xe,"Add "+e.toDisplayString(e.unref(w).length)+" reservations",1))]),_:1},8,["disabled"])])],2)}}}),Ke=_e._export_sfc(Ze,[["__scopeId","data-v-c7529556"]]),Je={class:"space-y-3"},et={class:"flex flex-wrap items-center justify-between gap-3"},tt={class:"text-xs text-muted-foreground"},nt={class:"flex flex-wrap items-center gap-2"},ot={key:0,class:"rounded-md border border-dashed bg-muted/20 px-4 py-6 text-sm text-muted-foreground"},at={key:1,class:"space-y-3"},rt={class:"flex items-start gap-2 p-3 md:hidden"},st=["aria-expanded","onClick"],lt={class:"mt-0.5 flex size-10 shrink-0 items-center justify-center rounded-full bg-muted text-sm font-semibold text-muted-foreground"},it={class:"min-w-0 flex-1"},ct={class:"flex items-start justify-between gap-3"},dt={class:"min-w-0"},ut={class:"block truncate text-base font-semibold"},mt={class:"mt-1 block truncate text-xs text-muted-foreground"},pt={class:"mt-1 block truncate text-xs text-muted-foreground"},ft={class:"flex size-10 shrink-0 items-center justify-center rounded-xl border border-border/70 text-muted-foreground"},gt={class:"mt-3 flex flex-wrap items-center gap-x-4 gap-y-1 text-sm text-muted-foreground"},vt={class:"inline-flex items-center gap-1.5"},ht={class:"inline-flex items-center gap-1.5"},kt={class:"hidden items-start justify-between gap-3 p-4 pb-0 md:flex"},_t={class:"text-sm font-medium"},yt={class:"text-xs text-muted-foreground"},xt={class:"grid gap-4 border-t pt-3 md:grid-cols-2 md:border-0 md:pt-4 xl:grid-cols-5"},Nt={class:"grid gap-2"},bt={class:"grid gap-2"},Vt={key:0,class:"text-xs text-orange-500"},Ct={class:"grid gap-2"},St={key:0,class:"text-xs text-muted-foreground"},wt={key:1,class:"flex items-center h-[36px] text-sm"},Et={key:0},Bt={key:1},Tt={key:2},Dt={key:0,class:"grid gap-2"},$t=e.defineComponent({__name:"ReservationLines",props:{modelValue:{},agendaData:{},availabilityByReservation:{}},emits:["add","quick-add","update:modelValue"],setup($,{emit:U}){const E=$,L=U,Z=/^([01]\d|2[0-3]):[0-5]\d$/,R=e.computed(()=>E.modelValue??[]),V=e.computed(()=>Number(E.agendaData?.maxTicketsPerReservation)>1),B=e.ref(null),T=e.ref(!1),I=e.computed(()=>String(E.agendaData?.currency||"EUR").toUpperCase()),h=e.computed(()=>{try{return new Intl.NumberFormat("en-US",{style:"currency",currency:I.value,minimumFractionDigits:2,maximumFractionDigits:2})}catch{return new Intl.NumberFormat("en-US",{minimumFractionDigits:2,maximumFractionDigits:2})}}),w=r=>{L("update:modelValue",r)},M=r=>["date","resourceId","pricingOption"].includes(r),A=r=>{if(!r.date||!r.resourceId||!r.pricingOption)return r;const a=H(r);return a.length===0?{...r,startTime:""}:a.includes(r.startTime)?r:{...r,startTime:a[0]}},D=(r,a,c)=>{w(R.value.map(v=>{if(v.id!==r)return v;if(a==="date"){const Y={...v,date:String(c??""),dateValue:c||void 0};return A(Y)}const S={...v,[a]:c};return M(a)?A(S):S}))},W=(r,a)=>{const c=Number(a);D(r,"paid",Number.isFinite(c)?c:0)},k=(r,a)=>{const c=Number(a);D(r,"spots",Number.isFinite(c)&&c>0?c:1)},G=r=>{w(R.value.filter(a=>a.id!==r))},z=r=>{L("quick-add",r),T.value=!1},d=r=>E.agendaData?.pricingOptions?.find(a=>a.id===r.pricingOption),x=r=>{const a=d(r);return a?a.duration?`${a.name} (${a.duration}min)`:a.name:"Reservation"},g=r=>E.agendaData?.resources?.find(a=>a.id===r.resourceId),_=r=>g(r)?.name||"Unknown resource",N=r=>{if(!r||!Z.test(r))return null;const[a,c]=r.split(":").map(Number);return a*60+c},X=r=>{const a=(r%1440+1440)%1440,c=Math.floor(a/60),v=a%60;return`${c.toString().padStart(2,"0")}:${v.toString().padStart(2,"0")}`},oe=r=>{const a=Number(d(r)?.duration);return Number.isFinite(a)&&a>0?a:0},re=r=>{if(!r.startTime)return"";const a=oe(r);if(a<=0)return"";const c=N(r.startTime);return c===null?"":X(c+a)},ne=r=>{if(!/^\d{4}-\d{2}-\d{2}$/.test(r))return null;const[a,c,v]=r.split("-").map(Number),S=new Date(a,c-1,v);return Number.isNaN(S.getTime())||S.getFullYear()!==a||S.getMonth()!==c-1||S.getDate()!==v?null:S},j=(r,a)=>(E.agendaData?.exceptions||[]).find(v=>a>=v.startDate&&a<=v.endDate?!v.resourceIds||v.resourceIds.length===0?!0:v.resourceIds.includes(r):!1)||null,se=r=>{const a=g(r),c=ne(r.date);if(!a||!c)return[];const v=j(a.id,r.date);if(v)return v.isClosed?[]:(v.timeslots||[]).map(Y=>({start:Y.startTime,end:Y.endTime}));const S=c.getDay();return a.openingHours?.[S]||[]},H=r=>{const a=g(r);if(!a)return[];const c=Number(a.interval)>0?Number(a.interval):60,v=oe(r),S=new Set;for(const Y of se(r)){const p=N(Y.start),ee=N(Y.end);if(p===null||ee===null||ee<=p)continue;const ae=v>0?ee-v:ee-c;for(let le=p;le<=ae;le+=c)S.add(X(le))}return Array.from(S).sort((Y,p)=>(N(Y)??0)-(N(p)??0))},K=r=>{if(!r.startTime)return"Select time";const a=re(r);return a?`${r.startTime} - ${a}`:r.startTime},u=r=>{const a=Number(r);if(!Number.isFinite(a))return I.value==="EUR"?"€0.00":"0.00";try{return h.value.format(a)}catch{return`${a.toFixed(2)}`}},C=r=>{const a=Number(r.spots),c=Number.isFinite(a)&&a>0?a:1;return c===1?"1 spot":`${c} spots`},Q=r=>E.availabilityByReservation?.[r.id]??null,ce=r=>{const a=Q(r);return!a||a.status==="checking"?"text-muted-foreground":a.status==="available"?"text-green-600 dark:text-green-400":"text-red-600 dark:text-red-400"},b=r=>{if(!/^\d{4}-\d{2}-\d{2}$/.test(r))return null;const[a,c,v]=r.split("-").map(Number),S=new Date(a,c-1,v);return Number.isNaN(S.getTime())||S.getFullYear()!==a||S.getMonth()!==c-1||S.getDate()!==v?null:(S.setHours(0,0,0,0),S)},o=r=>{const a=b(String(r.date||"").trim());if(!a)return"";const c=new Date;if(c.setHours(0,0,0,0),a<c)return"This date is in the past. Double-check it before saving.";const v=new Date(c);return v.setFullYear(v.getFullYear()+1),a>v?"This date is more than a year ahead. Double-check it before saving.":""},m=r=>!r.date||!r.startTime||!r.resourceId||!r.pricingOption,O=r=>B.value===r,J=r=>{B.value=B.value===r?null:r};return e.watch(R,r=>{const a=new Set(r.map(c=>c.id));if(B.value&&!a.has(B.value)&&(B.value=null),!B.value){const c=r.find(m);c&&(B.value=c.id)}},{immediate:!0}),(r,a)=>{const c=e.resolveComponent("Button"),v=e.resolveComponent("PopoverTrigger"),S=e.resolveComponent("PopoverContent"),Y=e.resolveComponent("Popover"),p=e.resolveComponent("Label"),ee=e.resolveComponent("DynamicSelectOption"),ae=e.resolveComponent("DynamicSelect"),le=e.resolveComponent("Input"),fe=e.resolveComponent("SelectValue"),ge=e.resolveComponent("SelectTrigger"),t=e.resolveComponent("SelectItem"),s=e.resolveComponent("SelectContent"),i=e.resolveComponent("Select");return e.openBlock(),e.createElementBlock("div",Je,[e.createElementVNode("div",et,[e.createElementVNode("p",tt,e.toDisplayString(R.value.length===1?"1 reservation line":`${R.value.length} reservation lines`),1),e.createElementVNode("div",nt,[e.createVNode(Y,{open:T.value,"onUpdate:open":a[0]||(a[0]=n=>T.value=n)},{default:e.withCtx(()=>[e.createVNode(v,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(c,{type:"button",variant:"outline",size:"sm",class:"gap-2"},{default:e.withCtx(()=>[e.createVNode(e.unref(te.Zap),{class:"size-4 text-primary"}),a[2]||(a[2]=e.createTextVNode(" Quick add ",-1))]),_:1})]),_:1}),e.createVNode(S,{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(Ke,{key:0,surface:"popover",agendaData:$.agendaData,onAdd:z},null,8,["agendaData"])):e.createCommentVNode("",!0)]),_:1})]),_:1},8,["open"]),e.createVNode(c,{type:"button",variant:"outline",size:"sm",onClick:a[1]||(a[1]=n=>L("add"))},{default:e.withCtx(()=>[e.createVNode(e.unref(te.Plus),{class:"size-4"}),a[3]||(a[3]=e.createTextVNode(" Add line ",-1))]),_:1})])]),R.value.length===0?(e.openBlock(),e.createElementBlock("div",ot," Use Quick add to create filled reservation lines, or add an empty line manually. ")):(e.openBlock(),e.createElementBlock("div",at,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(R.value,(n,f)=>(e.openBlock(),e.createElementBlock("div",{key:n.id,class:"rounded-xl border bg-background"},[e.createElementVNode("div",rt,[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":O(n.id),onClick:l=>J(n.id)},[e.createElementVNode("span",lt,e.toDisplayString(f+1),1),e.createElementVNode("span",it,[e.createElementVNode("span",ct,[e.createElementVNode("span",dt,[e.createElementVNode("span",ut,e.toDisplayString(K(n)),1),e.createElementVNode("span",mt,e.toDisplayString(n.date||"No date selected"),1),e.createElementVNode("span",pt,e.toDisplayString(_(n))+" · "+e.toDisplayString(x(n)),1),Q(n)?.message?(e.openBlock(),e.createElementBlock("span",{key:0,class:e.normalizeClass(["mt-1 block text-xs font-medium",ce(n)])},e.toDisplayString(Q(n)?.message),3)):e.createCommentVNode("",!0)]),e.createElementVNode("span",ft,[e.createVNode(e.unref(te.Pencil),{class:"size-4"})])]),e.createElementVNode("span",gt,[e.createElementVNode("span",vt,[e.createVNode(e.unref(te.Users),{class:"size-4"}),e.createTextVNode(" "+e.toDisplayString(C(n)),1)]),e.createElementVNode("span",ht,[e.createVNode(e.unref(te.Tag),{class:"size-4"}),e.createTextVNode(" "+e.toDisplayString(u(n.paid)),1)])])])],8,st),e.createVNode(c,{type:"button",variant:"ghost",size:"icon",class:"mt-1 shrink-0",onClick:l=>G(n.id)},{default:e.withCtx(()=>[e.createVNode(e.unref(te.Trash2),{class:"size-4"})]),_:1},8,["onClick"])]),e.createElementVNode("div",kt,[e.createElementVNode("div",null,[e.createElementVNode("p",_t,"Reservation "+e.toDisplayString(f+1),1),e.createElementVNode("p",yt,e.toDisplayString(_(n))+" · "+e.toDisplayString(x(n)),1),Q(n)?.message?(e.openBlock(),e.createElementBlock("p",{key:0,class:e.normalizeClass(["mt-1 text-xs font-medium",ce(n)])},e.toDisplayString(Q(n)?.message),3)):e.createCommentVNode("",!0)]),e.createVNode(c,{type:"button",variant:"ghost",size:"icon",class:"shrink-0",onClick:l=>G(n.id)},{default:e.withCtx(()=>[e.createVNode(e.unref(te.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",O(n.id)?"block":"hidden md:block"])},[e.createElementVNode("div",xt,[e.createElementVNode("div",Nt,[e.createVNode(p,null,{default:e.withCtx(()=>[...a[4]||(a[4]=[e.createTextVNode("Resource",-1)])]),_:1}),e.createVNode(ae,{"model-value":n.resourceId,"wrapper-class":"w-full",class:"w-full",placeholder:"Select resource","onUpdate:modelValue":l=>D(n.id,"resourceId",String(l??""))},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.agendaData?.resources||[],l=>(e.openBlock(),e.createBlock(ee,{key:l.id,value:l.id},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])]),e.createElementVNode("div",bt,[e.createVNode(p,null,{default:e.withCtx(()=>[...a[5]||(a[5]=[e.createTextVNode("Date",-1)])]),_:1}),e.createVNode(le,{"model-value":n.date,type:"date","onUpdate:modelValue":l=>D(n.id,"date",String(l??""))},null,8,["model-value","onUpdate:modelValue"]),o(n)?(e.openBlock(),e.createElementBlock("p",Vt,e.toDisplayString(o(n)),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ct,[e.createVNode(p,{for:`new_reservation_res_line_${f}_time`},{default:e.withCtx(()=>[...a[6]||(a[6]=[e.createTextVNode("Time",-1)])]),_:1},8,["for"]),n.resourceId&&n.date?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(i,{"model-value":n.startTime,"onUpdate:modelValue":l=>D(n.id,"startTime",String(l??""))},{default:e.withCtx(()=>[e.createVNode(ge,{id:`new_reservation_res_line_${f}_time`,class:"w-full"},{default:e.withCtx(()=>[e.createVNode(fe,{placeholder:"Select an hour"})]),_:1},8,["id"]),e.createVNode(s,null,{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(H(n),l=>(e.openBlock(),e.createBlock(t,{key:l,value:l},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l),1)]),_:2},1032,["value"]))),128))]),_:2},1024)]),_:2},1032,["model-value","onUpdate:modelValue"]),n.resourceId&&n.date&&H(n).length===0?(e.openBlock(),e.createElementBlock("p",St," No times are available for this resource on the selected date. ")):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createElementBlock("p",wt,[!n.resourceId&&!n.date?(e.openBlock(),e.createElementBlock("span",Et,"Please select a resource and date.")):n.resourceId?n.date?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("span",Tt,"Please select a date.")):(e.openBlock(),e.createElementBlock("span",Bt,"Please select a resource."))]))]),e.createElementVNode("div",{class:e.normalizeClass(["grid gap-2",{hidden:$.agendaData?.pricingOptions?.length<2}])},[e.createVNode(p,null,{default:e.withCtx(()=>[...a[7]||(a[7]=[e.createTextVNode("Type",-1)])]),_:1}),e.createVNode(ae,{"model-value":n.pricingOption,"wrapper-class":"w-full",class:"w-full",placeholder:"Select type","onUpdate:modelValue":l=>D(n.id,"pricingOption",String(l??""))},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.agendaData?.pricingOptions||[],l=>(e.openBlock(),e.createBlock(ee,{key:l.id,value:l.id},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.name),1)]),_:2},1032,["value"]))),128))]),_:1},8,["model-value","onUpdate:modelValue"])],2),e.createElementVNode("div",{class:e.normalizeClass(["grid gap-4",V.value?"md:grid-cols-2 xl:grid-cols-2 xl:col-span-1":""])},[V.value?(e.openBlock(),e.createElementBlock("div",Dt,[e.createVNode(p,null,{default:e.withCtx(()=>[...a[8]||(a[8]=[e.createTextVNode("Spots",-1)])]),_:1}),e.createVNode(le,{"model-value":n.spots,type:"number",min:"1",class:"no-spinner","onUpdate:modelValue":l=>k(n.id,l)},null,8,["model-value","onUpdate:modelValue"])])):e.createCommentVNode("",!0),e.createElementVNode("div",{class:e.normalizeClass(["grid gap-2",V.value?"":"md:col-span-2 xl:col-span-1"])},[e.createVNode(p,null,{default:e.withCtx(()=>[...a[9]||(a[9]=[e.createTextVNode("Paid",-1)])]),_:1}),e.createVNode(le,{"model-value":n.paid,type:"number",min:"0",step:"1",class:"no-spinner","onUpdate:modelValue":l=>W(n.id,l)},null,8,["model-value","onUpdate:modelValue"])],2)],2)])],2)]))),128))]))])}}}),Rt={class:"space-y-5 md:mt-5"},It={class:"space-y-3"},Ft={class:"mt-4 text-red-400"},Ot={class:"list-disc pl-4"},Lt={key:0},Mt={key:1},At={key:2},ke="",Pt=e.defineComponent({__name:"NewReservationDialog",props:{agendaData:{}},setup($){const U=$,{params:E}=ve.useModuleRoute(),{config:L}=ve.useModule(),{log:Z,logError:R}=useLogs(),V=ve.useFirebaseIntegration(L.project),B=e.computed(()=>E.value?.id??E.id??""),T=e.inject("agendaData",e.ref({})),I=e.computed(()=>U.agendaData??T.value??{}),h=e.ref(!1),w=e.ref(!1),M=e.ref({});let A=0;const D=e.ref([]),W=/^([01]\d|2[0-3]):[0-5]\d$/,k=e.ref([]),G=e.ref(null),z=e.computed(()=>Object.values(M.value).some(t=>t.status==="checking")),d=e.computed(()=>Object.values(M.value).some(t=>t.status==="unavailable")),x=()=>I.value?.resources?.[0]?.id??"",g=()=>I.value?.pricingOptions?.find(t=>t.isDefault===!0)?.id??I.value?.pricingOptions?.[0]?.id??"",_=()=>{const t=new Date,s=t.getFullYear(),i=`${t.getMonth()+1}`.padStart(2,"0"),n=`${t.getDate()}`.padStart(2,"0");return`${s}-${i}-${n}`},N=t=>{let s=t?.pricingOption??g(),i=I.value?.pricingOptions?.find(f=>f.id===s)?.price??0;typeof i=="string"&&(i=Number(i));let n=t?.paid??i;return typeof n=="string"&&(n=Number(n)),{id:`reservation_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,spots:Number(t?.spots)||1,paid:Number.isFinite(n)?n:0,resourceId:t?.resourceId??x(),pricingOption:s,date:t?.date??_(),dateValue:t?.dateValue,startTime:t?.startTime??ke}},X=()=>{k.value=[N()]},oe=t=>(!t.date||t.date===_())&&t.startTime===ke,re=()=>{const t=k.value[k.value.length-1];k.value=[...k.value,N(t?{...t}:void 0)]},ne=t=>I.value?.pricingOptions?.find(s=>s.id===t.pricingOption),j=t=>I.value?.resources?.find(s=>s.id===t.resourceId),se=()=>{const t=Number(I.value?.maxTicketsPerReservation);return Number.isFinite(t)&&t>0?t:null},H=t=>`Reservation ${t+1}`,K=t=>{const s=String(t.date||"").trim(),i=String(t.startTime||"").trim(),n=String(t.resourceId||"").trim();return!s||!i||!n?"":`${n}_${s}_${i}`},u=()=>{const t=[],s=new Map,i=se();return k.value.forEach((n,f)=>{const l=H(f),F=String(n.date||"").trim(),P=String(n.startTime||"").trim(),y=String(n.resourceId||"").trim(),q=String(n.pricingOption||"").trim(),ue=Number(n.spots),de=Number(n.paid);F||t.push(`${l}: please select a date.`),P?W.test(P)||t.push(`${l}: please enter a valid time.`):t.push(`${l}: please select a time.`),y?j(n)||t.push(`${l}: the selected resource is no longer available.`):t.push(`${l}: please select a resource.`),q?ne(n)||t.push(`${l}: the selected type is no longer available.`):t.push(`${l}: please select a type.`),!Number.isFinite(ue)||ue<=0?t.push(`${l}: spots must be at least 1.`):i!==null&&ue>i&&t.push(`${l}: spots cannot be more than ${i}.`),(!Number.isFinite(de)||de<0)&&t.push(`${l}: paid amount must be 0 or higher.`);const ie=K(n);if(ie){const me=s.get(ie);me!==void 0?t.push(`${l}: duplicate of ${H(me).toLowerCase()}.`):s.set(ie,f)}}),t},C=t=>{const s=t.startTimes.map(i=>N({date:t.date?`${t.date}`:"",dateValue:t.date,pricingOption:t.pricingOptionId,resourceId:t.resourceId,spots:t.spots,startTime:i}));if(s.length!==0){if(k.value.length===1&&oe(k.value[0])){k.value=s;return}k.value=[...k.value,...s]}},Q=t=>{if(!t||!W.test(t))return null;const[s,i]=t.split(":").map(Number);return s*60+i},ce=t=>{const s=(t%1440+1440)%1440,i=Math.floor(s/60),n=s%60;return`${i.toString().padStart(2,"0")}:${n.toString().padStart(2,"0")}`},b=t=>{if(!t.startTime||!t.pricingOption)return"";const s=ne(t),i=Number(s?.duration);if(!Number.isFinite(i)||i<=0)return t.startTime;const n=Q(t.startTime);return n===null?"":ce(n+i)},o=t=>{const s=Number(t.spots);return Number.isFinite(s)&&s>0?s:1},m=t=>{const s=Number(j(t)?.capacity);return Number.isFinite(s)&&s>0?s:1},O=t=>{const s=String(t.date||"").trim(),i=String(t.resourceId||"").trim(),n=Q(t.startTime),f=Q(b(t));return!s||!i||!j(t)||!ne(t)||n===null||f===null||f<=n?null:{reservation:t,date:s,resourceId:i,startMinutes:n,endMinutes:f,capacity:m(t),requestedSpots:o(t)}},J=t=>["approved","needs_approval"].includes(t?.status),r=(t,s,i,n)=>t<n&&s>i,a=t=>`${t} ${t===1?"spot":"spots"}`,c=(t,s,i)=>t<i?{status:"unavailable",message:`Not enough spots: ${a(Math.max(t,0))} open, needs ${a(i)}.`}:{status:"available",message:`Available: ${t} of ${s} ${s===1?"spot":"spots"} open, ${a(t-i)} will remain.`},v=t=>t?.id||t?.orderId||"",S=(t,s)=>{const i=[];for(let n=0;n<t.length;n+=s)i.push(t.slice(n,n+s));return i},Y=async t=>{const s=new Map,i=[];for(const n of S(t,10)){const f=[{field:"status",operator:"==",value:"confirmed"},{field:"flattenedReservationDates",operator:"array-contains-any",value:n}];B.value&&f.unshift({field:"agendaId",operator:"==",value:B.value});const l=await V.find(L.reservationsCollection,{filters:f});for(const F of l||[]){const P=v(F);P?s.set(P,F):i.push(F)}}return[...s.values(),...i]},p=(t,s)=>{let i=0;for(const n of t)for(const f of n?.reservations||[]){if(!J(f)||f?.date!==s.date||f?.resourceId!==s.resourceId)continue;const l=Q(f?.timeslot?.startTime),F=Q(f?.timeslot?.endTime);if(l===null||F===null||F<=l||!r(s.startMinutes,s.endMinutes,l,F))continue;const P=Number(f?.spots);i+=Number.isFinite(P)&&P>0?P:1}return i},ee=t=>{let s=0;for(const i of k.value){if(i.id===t.reservation.id)continue;const n=O(i);n&&n.date===t.date&&n.resourceId===t.resourceId&&r(t.startMinutes,t.endMinutes,n.startMinutes,n.endMinutes)&&(s+=n.requestedSpots)}return s},ae=async()=>{const t=++A,s=k.value.map(O).filter(n=>!!n),i=s.reduce((n,f)=>(n[f.reservation.id]={status:"checking",message:"Checking availability..."},n),{});if(M.value=i,!h.value||s.length===0)return i;try{const n=Array.from(new Set(s.map(F=>`${F.resourceId}_${F.date}`))),f=await Y(n);if(t!==A)return null;const l=s.reduce((F,P)=>{const y=p(f,P)+ee(P),q=P.capacity-y;return F[P.reservation.id]=c(q,P.capacity,P.requestedSpots),F},{});return M.value=l,l}catch(n){if(t!==A)return null;console.error("Error checking new reservation availability:",n);const f=s.reduce((l,F)=>(l[F.reservation.id]={status:"error",message:"Could not check availability for this reservation."},l),{});return M.value=f,f}},le=t=>t?k.value.flatMap((s,i)=>{const n=t[s.id];return n?n.status==="unavailable"?[`${H(i)}: ${n.message}`]:n.status==="error"?[`${H(i)}: availability could not be checked.`]:[]:[]}):["Could not check availability before creating the reservation."];e.watch(h,async t=>{t?(D.value=[],X(),await e.nextTick(),G.value?.reset()):(A+=1,M.value={})}),e.watch(k,()=>{h.value&&ae()},{deep:!0});const fe=()=>{const t=[];D.value=[];const s=G.value,i=s?s.validateForm():!1;return s||t.push("Customer information form is unavailable."),k.value.length===0&&t.push("Please add at least one reservation."),t.push(...u()),D.value=t,t.length===0&&i},ge=async()=>{const t=G.value;if(!t||!fe())return;const s=await ae(),i=le(s);if(i.length>0){D.value=i;return}let n=!1;try{w.value=!0;const f=t.getCustomerInfo(),l=k.value.map(y=>{const q=Number(y.paid)||0,ue=Number(y.spots)||1,de=ne(y),ie=j(y),me=y.date;return{paidAmount:q,flattenedReservationDate:`${y.resourceId}_${me}`,flattenedReservation:`${y.resourceId}_${me}_${y.startTime.replace(":","")}`,reservation:{status:"approved",totalPrice:Number(q.toFixed(2)),basePrice:Number((q/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:y.pricingOption,resource:{avatarLabel:ie?.avatarLabel||"",color:ie?.color||"",description:ie?.description||"",id:ie?.id||"",name:ie?.name||""},resourceId:y.resourceId,spots:ue,timeslot:{startTime:y.startTime,endTime:b(y)}}}}),F=Number(l.reduce((y,q)=>y+q.paidAmount,0).toFixed(2)),P={agendaId:B.value,customerInfo:f,metadata:{},amountPaid:F,amountDue:0,subtotal:F,total:F,createdAt:new Date,updatedAt:new Date,discount:0,flattenedReservationDates:Array.from(new Set(l.map(y=>y.flattenedReservationDate))),flattenedReservations:l.map(y=>y.flattenedReservation),paymentStatus:"paid",paymentType:"full",reservations:l.map(y=>y.reservation),status:"confirmed"};await V.add(L.reservationsCollection,P),n=!0,Z(`${l.length} ${l.length>1?"reservations":"reservation"} created in Studio`,{agendaId:B.value,reservationIds:l.map(y=>y.reservation.id),amountPaid:F,reservations:l.map(y=>`${y.reservation.resource.name}: ${y.reservation.date} ${y.reservation.timeslot.startTime}`)})}catch(f){R("Failed to create reservation in Studio",{error:f instanceof Error?f.message:String(f),agendaId:B.value}),console.error("Error creating reservation:",f)}finally{w.value=!1,n&&(h.value=!1)}};return(t,s)=>{const i=e.resolveComponent("Button"),n=e.resolveComponent("ResponsiveModalTrigger"),f=e.resolveComponent("ResponsiveModalTitle"),l=e.resolveComponent("ResponsiveModalHeader"),F=e.resolveComponent("ResponsiveModalFooter"),P=e.resolveComponent("ResponsiveModalScrollContent"),y=e.resolveComponent("ResponsiveModal");return e.openBlock(),e.createBlock(y,{open:h.value,"onUpdate:open":s[1]||(s[1]=q=>h.value=q)},{default:e.withCtx(()=>[e.createVNode(n,{"as-child":""},{default:e.withCtx(()=>[e.createVNode(i,null,{default:e.withCtx(()=>[e.createVNode(e.unref(te.Plus),{class:"size-4"}),s[2]||(s[2]=e.createTextVNode(" Add Reservation ",-1))]),_:1})]),_:1}),e.createVNode(P,{class:"@container/modal sm:max-w-7xl"},{default:e.withCtx(()=>[e.createVNode(l,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(Be,{ref_key:"customerInformationRef",ref:G,agendaData:I.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",It,[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($t,{modelValue:k.value,"onUpdate:modelValue":s[0]||(s[0]=q=>k.value=q),agendaData:I.value,"availability-by-reservation":M.value,onAdd:re,onQuickAdd:C},null,8,["modelValue","agendaData","availability-by-reservation"])]),e.createElementVNode("div",Ft,[e.createElementVNode("ul",Ot,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,q=>(e.openBlock(),e.createElementBlock("li",{key:q},e.toDisplayString(q),1))),128))])])]),e.createVNode(F,{class:"gap-2"},{default:e.withCtx(()=>[e.createVNode(i,{onClick:ge,disabled:w.value||z.value||d.value},{default:e.withCtx(()=>[w.value?(e.openBlock(),e.createElementBlock("span",Lt,"Creating...")):z.value?(e.openBlock(),e.createElementBlock("span",Mt,"Checking availability...")):(e.openBlock(),e.createElementBlock("span",At,e.toDisplayString(k.value.length>1?`Create ${k.value.length} reservations`:"Create reservation"),1))]),_:1},8,["disabled"])]),_:1})]),_:1})]),_:1},8,["open"])}}});exports._sfc_main=Pt;
|