1import{a as p,$ as r}from"./app-BMB7SW2A.js";import{g,o as D}from"./router-B4-bvdrn.js";import{e as V}from"./styles-OiTMiKUM.js";import{i as q}from"./index-HYjaO52u.js";import{a6 as Y}from"./src-pages-app-index-_ZjinjR4.js";import{o as f}from"./state-BNFBaZXw.js";import{r as F}from"./chip-BXzMHW7J.js";import"./index-DccQzYGv.js";import"./index-DDlvirwQ.js";import"./MorphSVGPlugin-B-vk8YRp.js";import"./index-B79LEOz5.js";import"./index-B9fViuMG.js";import"./urls-CmoUUsuo.js";import"./haptics-0J6I5ZKw.js";import"./index-7_ZwoNWQ.js";import"./index-DWnXxI_3.js";import"./info-DKN5wgY5.js";import"./init-CuVSQ5H_.js";import"./index-CU5uiC6B.js";import"./_commonjsHelpers-CE1G-McA.js";import"./index-D9_lbuvr.js";import"./route-resolver-B7oJAapS.js";import"./datetime-DuZlTmL3.js";import"./deep-links-BvYBh5T9.js";/* empty css *//* empty css */import"./index-DEtACHfK.js";import"./index.esm-DVXwz09-.js";const s={screen:"#calendarScheduleScreen",inlineCalendar:"#calendarScheduleInlineView",monthTitle:"#calendarScheduleMonthTitle",sidePage:"#calendarScheduleSidePage"},H=` 2<section id="calendarScheduleScreen" class="calendar-screen" style="display:none"> 3 <div class="calendar-interface"> 4 <section class="calendar-month-page page"> 5 <div class="navbar"> 6 <div class="navbar-bg"></div> 7 <div class="navbar-inner"> 8 <div class="left"> 9 <a class="link icon-only tooltip-init" data-click="calendarSchedulePrevPeriod" data-tooltip="Previous period" aria-label="Previous period"> 10 <i class="fa-solid fa-chevron-left"></i> 11 </a> 12 <a class="link icon-only tooltip-init" data-click="calendarScheduleNextPeriod" data-tooltip="Next period" aria-label="Next period"> 13 <i class="fa-solid fa-chevron-right"></i> 14 </a> 15 </div> 16 <div class="title" id="calendarScheduleMonthTitle">Schedule</div> 17 <div class="right"> 18 <a class="link icon-only tooltip-init" data-click="calendarScheduleToday" data-tooltip="Go to today" aria-label="Go to today"> 19 <i class="fa-solid fa-calendar-day"></i> 20 </a> 21 </div> 22 </div> 23 </div> 24 <div class="page-content"> 25 <div id="calendarScheduleInlineView"></div> 26 </div> 27 </section> 28 <section class="calendar-side-page page" id="calendarScheduleSidePage"></section> 29 </div> 30</section>`,E=r(".center");E&&!r(s.screen)&&E.insertAdjacentHTML("beforeend",H);const m=r(s.screen),k=r(V.screen),_="router-transition-f7-parallax-forward",R="router-transition-f7-parallax-backward",j=460,e={active:!1,schedulerId:0,orgId:0,timezone:typeof Intl<"u"&&Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC",month:"",view:null,selectedDate:"",selectedSlotStartUtc:"",inlineEl:null,sidePageEl:null,monthTitleEl:null,calendar:null,sideViewEl:null,timesPageEl:null,confirmPageEl:null,timesContentEl:null,confirmContentEl:null,bookingActionState:null,transitionQueue:Promise.resolve(),onBooked:null};function K(){return typeof Intl<"u"&&Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"}function I(t){return[t.getFullYear(),String(t.getMonth()+1).padStart(2,"0"),String(t.getDate()).padStart(2,"0")].join("-")}function S(t=""){const i=String(t||"").trim();if(!/^\d{4}-\d{2}$/.test(i))return null;const[n,a]=i.split("-").map(Number);return!n||!a?null:{year:n,month:a}}function $(t="",i=0){const n=S(t),a=n?new Date(n.year,n.month-1,1):new Date;return a.setMonth(a.getMonth()+Number(i||0)),`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}`}function Q(t=""){const i=S(t);return i?new Date(i.year,i.month-1,1).toLocaleDateString(void 0,{month:"long",year:"numeric"}):"Schedule"}function Z(t=""){const i=new Date(`${t}T00:00:00`);return Number.isNaN(i.getTime())?t:i.toLocaleDateString(void 0,{weekday:"long",month:"long",day:"numeric"})}function y(t,i){const n=new Date(String(t||"").replace(" ","T")+"Z");return Number.isNaN(n.getTime())?"":new Intl.DateTimeFormat(void 0,{timeZone:i||e.timezone||"UTC",hour:"numeric",minute:"2-digit",weekday:"short",month:"short",day:"numeric"}).format(n)}function G(t){if(t==null)return"Unknown error";if(typeof t=="string")return t;
30if(typeof t?.reason=="string"&&t.reason.trim())return t.reason;if(typeof t?.message=="string"&&t.message.trim())return t.message;try{return JSON.stringify(t)}catch{return String(t)}}function W(){const t=f.raw||{},i=String(t?.email||"").trim();if(i)return i;const n=String(t?.username||"").trim();return n.includes("@")?n:""}function J(){const t=[e.timezone,"America/Los_Angeles","America/Denver","America/Chicago","America/New_York","UTC"],i=new Set;return t.filter(n=>{const a=String(n||"").trim();return!a||i.has(a)?!1:(i.add(a),!0)}).map(n=>{const a=n===e.timezone?" selected":"";return`<option value="${n.attr()}"${a}>${n.html()}</option>`}).join("")}function h(t=""){const i=Array.isArray(e.view?.days)?e.view.days.find(n=>String(n?.date||"")===String(t||"")):null;return Array.isArray(i?.slots)?i.slots:[]}function A(){return h(e.selectedDate).find(t=>String(t?.startUtc||"")===e.selectedSlotStartUtc)||null}function L(){if(Array.isArray(e.view?.bookings))return e.view.bookings;const t=e.view?.booking||null;return t?[t]:[]}function x(){return Math.max(1,Number(e.view?.scheduler?.personBookingLimit||1))}function b(){return L().length<x()}function X(){if(!e.active)return"Appointment scheduling is not ready.";if(!b())return"You have reached the booking limit for this scheduler.";const t=A(),i=e.confirmContentEl?.querySelector(".calendar-schedule-email-input");return t?i&&!i.checkValidity()?i.validationMessage||"Enter a valid email.":{verified:!0,data:{slot:t,email:String(i?.value||"").trim(),note:String(e.confirmContentEl?.querySelector(".calendar-schedule-note-input")?.value||"").trim()}}:"Select an available time."}async function ee({slot:t,email:i,note:n}){const a=await p.fetch({action:"calendar:bookScheduler",id:e.schedulerId,targetOrgId:e.orgId,startUtc:t.startUtc,timezone:e.timezone,note:n,email:i},{error:!0,success:"Appointment booked"});if(!a?.booking)throw new Error("Scheduler booking response missing booking payload.");e.onBooked?.(a.booking),await g({route:"/app/calendar",replace:!0})}function te(){e.calendar&&(e.calendar.destroy?.(),e.calendar=null),e.inlineEl&&(e.inlineEl.innerHTML="")}function T(){return new Promise(t=>{if(typeof window.requestAnimationFrame=="function"){window.requestAnimationFrame(()=>t());return}setTimeout(t,0)})}function ie(t){return new Promise(i=>setTimeout(i,t))}function N(t){return e.transitionQueue=e.transitionQueue.then(t).catch(i=>{console.error("calendar schedule: side transition failed",i)}),e.transitionQueue}function o(t){t&&t.classList.remove("page-next","page-previous","page-current")}async function U(t,i,n){const a=e.sideViewEl;if(!a||!i||!n||i===n)return;const l=t==="forward"?_:R;n.style.display="block",t==="forward"?(o(i),o(n),i.classList.add("page-current"),n.classList.add("page-next")):(o(i),o(n),i.classList.add("page-current"),n.classList.add("page-previous")),a.classList.add("router-transition",l),await T(),await T(),await ie(j),a.classList.remove("router-transition",l),t==="forward"?(i.classList.remove("page-current"),i.classList.add("page-previous"),n.classList.remove("page-next"),n.classList.add("page-current")):(n.classList.remove("page-previous"),n.classList.add("page-current"),i.classList.remove("page-current","page-next","page-previous"))}function ne(){e.sidePageEl&&(e.sidePageEl.innerHTML=` 31 <div class="view calendar-schedule-side-view"> 32 <div class="page page-current" id="calendarScheduleTimesPage"> 33 <div class="navbar"> 34 <div class="navbar-bg"></div> 35 <div class="navbar-inner"> 36 <div class="left"> 37 <a class="link back tooltip-init" data-click="exitCalendarSchedule" data-tooltip="Exit scheduling" aria-label="Exit scheduling"> 38 <i class="icon icon-back"></i> 39 </a> 40 </div> 41 <div class="title">Schedule</div> 42 </div> 43 </div> 44 <div class="page-content" id="calendarScheduleTimesContent"></div> 45 </div> 46 <div class="page" id="calendarScheduleConfirmPage" style="display:none;"> 47 <div class="navbar"> 48 <div class="navbar-bg"></div> 49 <div class="navbar-inner"> 50 <div class="left"> 51 <a class="link back" data-click="backSchedulerSlotConfirm" aria-label="Back to available times"> 52 <i class="icon icon-back"></i> 53 </a> 54 </div> 55 <div class="title">Confirm Appointment</div> 56 <div class="right"> 57 <a class="link icon-only" data-calendar-schedule-confirm aria-label="Confirm appointment"> 58 <i class="icon fa-solid fa-check fa-lg"></i> 59 </a> 60 </div> 61 </div> 62 </div> 63 <div class="page-content" id="calendarScheduleConfirmContent"></div> 64 </div> 65 </div> 66 `,e.sideViewEl=e.sidePageEl.querySelector(".calendar-schedule-side-view"),e.timesPageEl=e.sidePageEl.querySelector("#calendarScheduleTimesPage"),e.confirmPageEl=e.sidePageEl.querySelector("#calendarScheduleConfirmPage"),e.timesContentEl=e.sidePageEl.querySelector("#calendarScheduleTimesContent"),e.confirmContentEl=e.sidePageEl.querySelector("#calendarScheduleConfirmContent"),e.bookingActionState=Y(e.confirmPageEl.querySelector("[data-calendar-schedule-confirm]"),{before:{className:"link icon-only color-gray",style:{}},after:{className:"link icon-only color-blue",style:{}},scope:e.confirmPageEl,verification:X,success:ee}))}function M(){!e.timesPageEl||!e.confirmPageEl||(o(e.timesPageEl),o(e.confirmPageEl),e.timesPageEl.style.display="block",e.confirmPageEl.style.display="none",e.timesPageEl.classList.add("page-current"))}function C(){const t=e.view?.scheduler||{},i=String(t?.orgName||"").trim(),n=String(t?.orgImg||"/assets/images/app/logo96.png").trim(),a=t?.orgId?F({id:t.orgId,name:i||"Organization",avatar:n}):"",l=[t?.hostValue?`
67 <span class="chip color-orange"> 68 <span class="chip-media"><i class="fa-regular fa-user"></i></span> 69 <span class="chip-label">${`${String(t.hostLabel||"Invited by")}: ${String(t.hostValue)}`.html()}</span> 70 </span> 71 `:"",t?.contactValue?` 72 <span class="chip color-blue"> 73 <span class="chip-media"><i class="fa-regular fa-envelope"></i></span> 74 <span class="chip-label">${`${String(t.contactLabel||"Contact")}: ${String(t.contactValue)}`.html()}</span> 75 </span> 76 `:"",t?.duration?` 77 <span class="chip color-green"> 78 <span class="chip-media"><i class="fa-regular fa-clock"></i></span> 79 <span class="chip-label">${`${String(t.duration)} minutes`.html()}</span> 80 </span> 81 `:"",t?.location?` 82 <span class="chip color-purple"> 83 <span class="chip-media"><i class="fa-solid fa-location-dot"></i></span> 84 <span class="chip-label">${String(t.location).html()}</span> 85 </span> 86 `:""].filter(Boolean);return` 87 <div class="block margin-top"> 88 <h2 class="no-margin">${String(t?.title||"Scheduler").html()}</h2> 89 ${a?`<div class="margin-top-half margin-bottom-half">${a}</div>`:""} 90 ${t?.desc?`<p class="calendar-schedule-description">${String(t.desc).html().replace(/\n/g,"<br>")}</p>`:""} 91 </div> 92 ${l.length?` 93 <div class="block no-margin-top"> 94 <div class="flex flex-wrap flex-gap"> 95 ${l.join("")} 96 </div> 97 </div> 98 `:""} 99 `}function ae(t,i){if(!t.length)return"";const n=Math.max(0,i-t.length),a=n>0?`You can book ${n} more ${n===1?"appointment":"appointments"}.`:"You have reached the booking limit for this scheduler.";return` 100 <div class="block"> 101 <p class="no-margin"><strong>Appointments Scheduled</strong></p> 102 <p class="dashboard-muted no-margin">${`${t.length} of ${i} appointments booked.`.html()} ${a.html()}</p> 103 </div> 104 <div class="list list-strong list-dividers inset"> 105 <ul> 106 ${t.map(l=>{const O=String(l?.title||e.view?.scheduler?.title||"Appointment");return` 107 <li> 108 <div class="item-content"> 109 <div class="item-media"><i class="fa-regular fa-calendar-check"></i></div> 110 <div class="item-inner"> 111 <div class="item-title">${y(l?.startUtc,l?.timezone||e.timezone).html()}</div> 112 <div class="item-text">${O.html()}</div> 113 ${l?.note?`<div class="item-text">${String(l.note).html()}</div>`:""} 114 ${l?.email?`<div class="item-text">${String(l.email).html()}</div>`:""} 115 </div> 116 </div> 117 </li> 118 `}).join("")} 119 </ul> 120 </div> 121 `}function w(){if(!e.timesContentEl)return;const t=L(),i=x(),n=ae(t,i),a=h(e.selectedDate);if(!b()){e.timesContentEl.innerHTML=` 122 ${C()} 123 ${n} 124 `;return}e.timesContentEl.innerHTML=` 125 ${C()} 126 ${n} 127 <div class="list list-strong list-dividers inset"> 128 <ul> 129 <li class="item-content item-input"> 130 <div class="item-inner"> 131 <div class="item-title item-label">Time Zone</div> 132 <div class="item-input-wrap"> 133 <select data-change="changeSchedulerTimezone">${J()}</select> 134 </div> 135 </div> 136 </li> 137 </ul> 138 </div> 139 <div class="block"> 140 <p class="no-margin"><strong>${e.selectedDate?Z(e.selectedDate).html():"Choose a date"}</strong></p> 141 <p class="dashboard-muted no-margin">Select a time to continue.</p> 142 </div> 143 ${e.selectedDate?"":'<div class="block-footer">Choose a date on the calendar to see available times.</div>'} 144 ${e.selectedDate&&!a.length?'<div class="block-footer">No available times for this date.</div>':""} 145 ${e.selectedDate&&a.length?` 146 <div class="list list-strong list-dividers inset"> 147 <ul> 148 ${a.map(l=>` 149 <li>
150 <a href="" class="item-link item-content" data-click="openSchedulerSlotConfirm" data-start-utc="${String(l?.startUtc||"").attr()}"> 151 <div class="item-inner"> 152 <div class="item-title">${y(l?.startUtc,e.timezone).html()}</div> 153 <div class="item-after">Select</div> 154 </div> 155 </a> 156 </li> 157 `).join("")} 158 </ul> 159 </div> 160 `:""} 161 `}function u(){if(!e.confirmContentEl)return;const t=A();if(!t){e.confirmContentEl.innerHTML='<div class="block">Choose a time first.</div>',e.bookingActionState?.refresh();return}const i=f.raw||{},n=String(i?.name||i?.username||"Your account").trim(),a=W(),l=String(e.view?.scheduler?.notePrompt||"").trim();e.confirmContentEl.innerHTML=` 162 <div class="block"> 163 <p class="no-margin"><strong>${String(e.view?.scheduler?.title||"Appointment").html()}</strong></p> 164 <p class="dashboard-muted no-margin">${y(t?.startUtc,e.timezone).html()}</p> 165 </div> 166 <div class="list list-strong list-dividers inset"> 167 <ul> 168 <li> 169 <div class="item-content"> 170 <div class="item-inner"> 171 <div class="item-title">Booking As</div> 172 <div class="item-after">${n.html()}</div> 173 </div> 174 </div> 175 </li> 176 <li class="item-content item-input"> 177 <div class="item-inner"> 178 <div class="item-title item-label">Email</div> 179 <div class="item-input-wrap"> 180 <input type="email" class="calendar-schedule-email-input" placeholder="[email protected]" value="${a.attr()}"> 181 <span class="input-clear-button"></span> 182 </div> 183 </div> 184 </li> 185 <li class="item-content item-input"> 186 <div class="item-inner"> 187 <div class="item-title item-label">Note</div> 188 <div class="item-input-wrap"> 189 <textarea class="resizable calendar-schedule-note-input" placeholder="${(l||"Optional note").attr()}"></textarea> 190 </div> 191 </div> 192 </li> 193 </ul> 194 </div> 195 `,e.bookingActionState?.refresh()}function le(){e.monthTitleEl&&(e.monthTitleEl.textContent=Q(e.month))}function P(){return(e.view?.days||[]).map(t=>({date:new Date(`${t.date}T00:00:00`),color:"#ff9f5a"}))}function z(){const t=e.inlineEl;if(!t)return;e.calendar||(t.innerHTML="",e.calendar=q().calendar.create({containerEl:t,value:e.selectedDate?[new Date(`${e.selectedDate}T00:00:00`)]:[],events:P(),header:!1,toolbar:!1,weekHeader:!0,firstDay:7,monthSelector:!1,monthPicker:!1,yearSelector:!1,yearPicker:!1,closeOnSelect:!1,direction:"horizontal",on:{change(n,a){const l=a?.[0];l&&(e.selectedDate=I(l),e.selectedSlotStartUtc="",w(),u(),v())},monthYearChangeStart(n){const a=`${n.currentYear}-${String(n.currentMonth+1).padStart(2,"0")}`;a!==e.month&&c(a)}}}),!e.calendar?.opened&&typeof e.calendar?.open=="function"&&e.calendar.open()),e.calendar.params.events=P();const i=S(e.month);i&&(e.calendar.currentYear!==i.year||e.calendar.currentMonth!==i.month-1)&&e.calendar.setYearMonth(i.year,i.month-1,0),e.calendar.setValue(e.selectedDate?[new Date(`${e.selectedDate}T00:00:00`)]:[]),e.calendar.update()}async function v(){if(!(!e.timesPageEl||!e.confirmPageEl)){if(e.timesPageEl.classList.contains("page-current")){M();return}await N(async()=>{await U("backward",e.confirmPageEl,e.timesPageEl),e.confirmPageEl.style.display="none"})}}async function re(){!e.timesPageEl||!e.confirmPageEl||e.confirmPageEl.classList.contains("page-current")||(e.confirmPageEl.style.display="block",await N(async()=>{await U("forward",e.timesPageEl,e.confirmPageEl)}))}async function c(t=""){if(!e.active||e.schedulerId<=0||e.orgId<=0)return;const i=t||e.month||"",n=await p.fetch({action:"calendar:viewScheduler",id:e.schedulerId,targetOrgId:e.orgId,month:i,timezone:e.timezone},{error:!0});if(!n?.scheduler)throw new Error("Scheduler response missing scheduler payload.");e.view={scheduler:n.scheduler,days:Array.isArray(n?.days)?n.days:[],booking:n?.booking||null,bookings:Array.isArray(n?.bookings)?n.bookings:n?.booking?[n.booking]:[]},e.month=String(n?.month||i||"").trim(),e.selectedDate||(e.selectedDate=e.view.days?.[0]?.date||""),e.selectedDate&&!h(e.selectedDate).length&&(e.selectedDate=e.view.days?.[0]?.date||"",e.selectedSlotStartUtc=""),le(),w(),u(),z(),await v()}function B(){te(),e.bookingActionState?.destroy(),e.active=!1,e.schedulerId=0,e.orgId=0,e.timezone=K(),e.month="",e.view=null,e.selectedDate="",e.selectedSlotStartUtc="",e.inline
195El=null,e.sidePageEl=null,e.monthTitleEl=null,e.sideViewEl=null,e.timesPageEl=null,e.confirmPageEl=null,e.timesContentEl=null,e.confirmContentEl=null,e.bookingActionState=null,e.transitionQueue=Promise.resolve(),e.onBooked=null}async function se(t={}){if(B(),e.active=!0,e.schedulerId=Number(t.schedulerId||0),e.orgId=Number(t.orgId||0),e.inlineEl=t.inlineEl||null,e.sidePageEl=t.sidePageEl||null,e.monthTitleEl=t.monthTitleEl||null,e.onBooked=typeof t.onBooked=="function"?t.onBooked:null,!e.inlineEl||!e.sidePageEl||!e.monthTitleEl)throw new Error("Schedule page requires inline calendar, side page, and month title elements.");if(ne(),M(),e.schedulerId<=0||e.orgId<=0)throw new Error("Scheduler route is missing scheduler or organization identifiers.");await Promise.all([f.loadUser().catch(()=>null),c()]),u()}p.click.register({async exitCalendarSchedule(t,i){i?.preventDefault?.(),await g({route:"/app/calendar",replace:!0})},async openSchedulerSlotConfirm(t,i){i?.preventDefault?.(),!(!e.active||!b())&&(e.selectedSlotStartUtc=String(t.dataset.startUtc||""),u(),await re())},async backSchedulerSlotConfirm(t,i){i?.preventDefault?.(),await v()},calendarSchedulePrevPeriod(){d.prevPeriod()},calendarScheduleNextPeriod(){d.nextPeriod()},calendarScheduleToday(){d.today()}});p.change.register({changeSchedulerTimezone(t){e.active&&(e.timezone=String(t.value||"").trim()||"UTC",c(e.month))}});const d={isActive(){return e.active},async openInScreen(t={}){await se(t)},close(){B()},async prevPeriod(){e.active&&await c($(e.month,-1))},async nextPeriod(){e.active&&await c($(e.month,1))},async today(){if(!e.active)return;const t=new Date,i=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`;await c(i);const n=I(t);h(n).length&&(e.selectedDate=n,e.selectedSlotStartUtc="",w(),u(),z(),await v())}};D({route:"/app/calendar/schedule/:orgId/:id",exact:!0},{async open(t){const i=Number(t?.params?.id||0),n=Number(t?.params?.orgId||0);if(i<=0||n<=0){g({route:"/app/calendar",replace:!0});return}k&&(k.style.display="none"),m&&(m.style.display="block"),document.title="Schedule | bizybear";try{await d.openInScreen({schedulerId:i,orgId:n,inlineEl:r(s.inlineCalendar),sidePageEl:r(s.sidePage),monthTitleEl:r(s.monthTitle)})}catch(a){console.error("calendar schedule: route failed",a);const l=r(s.sidePage);l&&(l.innerHTML=` 196 <div class="page"> 197 <div class="navbar"> 198 <div class="navbar-bg"></div> 199 <div class="navbar-inner"> 200 <div class="left"> 201 <a class="link back" data-click="exitCalendarSchedule" aria-label="Exit scheduling"> 202 <i class="icon icon-back"></i> 203 </a> 204 </div> 205 <div class="title">Schedule</div> 206 </div> 207 </div> 208 <div class="page-content"> 209 <div class="block"> 210 <p class="no-margin"><strong>Scheduler failed to load.</strong></p> 211 <p class="dashboard-muted no-margin">${G(a).html()}</p> 212 </div> 213 </div> 214 </div>`)}},close(){d.close(),m&&(m.style.display="none")}});D({route:"/app/calendar/organizations/:orgId/schedule/:id",exact:!0},{open(t){g({route:`/app/calendar/schedule/${encodeURIComponent(t.params.orgId)}/${encodeURIComponent(t.params.id)}`,replace:!0})}});export{d as default,G as formatScheduleLoadError};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.