PageSourceSearch

https://portal.commoninterest.com/assets/reservations._id_-DwaBeEmE.js

js commoninterest.com collected 2026-09-24 13:28:07 UTC 33,480 bytes, 206 lines download raw bytes

1import{u as ie,r as i,j as e,M as Ae,Y as he,aP as ye,aQ as Le,bP as Fe,k as Ee,cQ as ge,S as Ie,q as qe,F as Oe,v as Pe,B as $e,cR as ve,n as me}from"./elements-DVh2jUIM.js";import{u as ze}from"./useRedirectOnAssociationChange-DZlWegyT.js";import{u as Ue,a as Ve,b as We,S as Ge}from"./index-B-OYTLs2.js";import{i as Be}from"./isSameDay-CQTDJwZ-.js";import{a as Ke,b as _e,i as oe,h as Ye,c as we,d as De,e as ke,j as ue,k as je,l as Ne,s as Qe,m as Re,p as Se,g as Xe,n as Ce,o as Je,q as Ze}from"./amenityReservationRules-C7gAh2I4.js";import{E as et}from"./ExpandableCustomContent-CsA-R1j0.js";import{F as tt}from"./FileUploader-Df3sZ-tI.js";import{u as at}from"./useCustomContent-BqBLnYCa.js";import{s as W}from"./startOfDay-AazlW55I.js";import{aA as He,G as st,j as nt,L as rt,$ as ot}from"./index-DeQvL4I7.js";import{c as it}from"./portal-requests-TK48q8QE.js";import{W as fe}from"./Widget-Bforis7T.js";import{A as pe}from"./authorization-CE7gncHO.js";import{u as lt}from"./useSelectedProperty-XA-z48Yi.js";import{u as dt,c as ct,a as mt,d as ut}from"./reservations-CbBsI4-7.js";import"./addDays-Le9Cqm9z.js";import"./CustomContent-BZeFKqiW.js";import"./index-DWdRGcKw.js";import"./grids-DXrfAsUA.js";import"./useMutation-CfDMVIpo.js";import"./useAuthorization-D7B2eQha.js";import"./useIsNonHomeownerBoardMember-BFprLkBV.js";const ft={sunday:0,monday:1,tuesday:2,wednesday:3,thursday:4,friday:5,saturday:6,su:0,mo:1,tu:2,we:3,th:4,fr:5,sa:6,sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6};function G(a){const s=typeof a=="string"?new Date(a):a;return Temporal.PlainDateTime.from({year:s.getFullYear(),month:s.getMonth()+1,day:s.getDate(),hour:s.getHours(),minute:s.getMinutes(),second:s.getSeconds()}).toZonedDateTime("UTC")}function pt(a){if(typeof a=="string"){const[s,d]=a.split(" "),[b,N,S]=s.split("-").map(Number),[p,x]=d.split(":").map(Number);return new Date(b,N-1,S,p,x)}return new Date(a.year,a.month-1,a.day,a.hour,a.minute,a.second)}function xt(a,s){const d=a.getTime();for(const b of s)if(Be(a,b.start)&&d>=b.start.getTime()&&d<b.end.getTime())return!0;return!1}function yt(a,s,d,b){const N=new Date(a);if(N.setMinutes(N.getMinutes()+s),!d||!d.includes(":"))return N;const[S,p]=d.split(":").map(Number),x=new Date(a);x.setHours(S,p,0,0);let u=null;for(const A of b)Be(A.start,a)&&A.start.getTime()>a.getTime()&&(!u||A.start.getTime()<u.getTime())&&(u=A.start);let H=N;return x.getTime()<H.getTime()&&(H=x),u&&u.getTime()<H.getTime()&&(H=u),H}function Te(){return Temporal.Now.plainDateISO()}function bt(a){const[s]=a.split(":");return`${s.padStart(2,"0")}:00`}function ht(a){const[s,d]=a.split(":").map(Number),b=d>0?s+1:s;return`${String(b).padStart(2,"0")}:00`}function gt({availableStartTime:a,availableEndTime:s,availableDays:d,maxBlockDurationMinutes:b=60,events:N=[],onTimeSlotClick:S,onEventClick:p}){const{t:x}=ie(),u=i.useRef(S),H=i.useRef(p),A=i.useRef(b),B=i.useRef([]),n=i.useRef(s),U=i.useRef(a),y=i.useMemo(()=>bt(a),[a]),V=i.useMemo(()=>ht(s),[s]),q=i.useMemo(()=>d.map(c=>ft[c.toLowerCase()]).filter(c=>c!==void 0),[d]);i.useEffect(()=>{u.current=S,H.current=p,A.current=b,B.current=q,n.current=s,U.current=a},[S,p,b,q,s,a]),i.useEffect(()=>{const c=()=>{const w=document.querySelector(".amenity-calendar");if(!w)return;const F=new Date;F.setHours(0,0,0,0);const O=(f,t)=>{var ee,le;const g=f.querySelector(".sx__week-grid__date"),j=((ee=g==null?void 0:g.textContent)==null?void 0:ee.trim())||((le=f.textContent)==null?void 0:le.trim()),R=j==null?void 0:j.match(/(\d{1,2})/);if(!R)return null;const M=parseInt(R[1],10),L=w.querySelector(".sx__calendar-header__title"),Z=((L==null?void 0:L.textContent)||"").match(/(\w+)\s+(\d{4})/);if(!Z)return null;const z=["january","february","march","april","may","june","july","august","september","october","november","december"].indexOf(Z[1].toLowerCase()),se=parseInt(Z[2],10);if(z===-1)return null;let Q=z,ne=se;return t<3&&M>20&&(Q=z-1,Q<0&&(Q=11,ne=se-1)),t>4&&M<10&&(Q=z+1,Q>11&&(Q=0,ne=se+1)),new Date(ne,Q,M)};w.querySelectorAll(".sx__month-grid-day").forEach(f=>{var ae,z;const t=f.querySelector(".sx__month-grid-day__header");if(!t)return;const g=Array.from(((ae=f.parentElement)==null?void 0:ae.children)||[]).indexOf(f),j=(z=t.textContent)==null?void 0:z.trim(),R=j==null?void 0:j.match(/(\d{1,2})/);let M=!1,L=null;R&&(L=O(t,g%7),L&&(L.setHours(0,0,0,0),M=L.getTime()<F.getTime()));const te=L?L.getDay():g%7;!q.includes(te)||M?f.classList.add("sx__day--unavailable"):f.classList.remove("sx__day--unavailable"),M?f.classList.add("sx__day--past"):f.classList.remove("sx__day--past")});const E=w.querySelectorAll(".sx__week-grid__day"),D=w.querySelectorAll(".sx__time-grid-day"),k=[];let h=null;E.length>
10&&(h=O(E[0],0)),E.forEach((f,t)=>{if(h){const g=new Date(h);g.setDate(h.getDate()+t),k.push(g)}else k.push(O(f,t))});const I=(f,t,g)=>{const j=t?t.getDay():g,R=!q.includes(j);let M=!1;if(t){const L=new Date(t);L.setHours(0,0,0,0),M=L.getTime()<F.getTime()}f.classList.toggle("sx__day--unavailable",R||M),f.classList.toggle("sx__day--past",M)};D.forEach((f,t)=>{if(I(f,k[t],t%7),k[t]){const g=new Date(k[t]);g.setHours(0,0,0,0),g.getTime()<F.getTime()?(f.style.cursor="not-allowed",f.querySelectorAll(".sx__time-grid-day__time-slot").forEach(M=>{M.style.cursor="not-allowed"})):(f.style.cursor="",f.querySelectorAll(".sx__time-grid-day__time-slot").forEach(M=>{M.style.cursor=""}))}}),E.forEach((f,t)=>{I(f,k[t],t%7)}),w.querySelectorAll('.sx__event[data-display="background"]').forEach(f=>{f.style.cursor="not-allowed";const t=f.closest(".sx__time-grid-day");t&&(t.style.cursor="not-allowed",t.querySelectorAll(".sx__time-grid-day__time-slot").forEach(j=>{j.style.cursor="not-allowed"}))})};c();const m=setInterval(c,6e4),_=new MutationObserver(()=>{setTimeout(c,50)}),C=document.querySelector(".amenity-calendar");return C&&_.observe(C,{childList:!0,subtree:!0}),()=>{_.disconnect(),clearInterval(m)}},[q]);const K=i.useMemo(()=>N.map(c=>({id:c.id,title:c.title||x("main.reservations.reserved"),start:G(c.start),end:G(c.end)})),[N,x]),[v,J]=i.useState(new Date);i.useEffect(()=>{const c=setInterval(()=>{J(new Date)},6e4);return()=>clearInterval(c)},[]);const o=i.useMemo(()=>{const c=v,m=new Date(c);m.setHours(0,0,0,0);const _=[];for(let D=1;D<=7;D++){const k=new Date(m);k.setDate(k.getDate()-D);const h=new Date(k);h.setHours(0,0,0,0);const I=new Date(k);I.setHours(23,59,59,999),_.push({id:`past-day-block-${D}`,title:"",start:G(h),end:G(I),display:"background",style:{backgroundColor:"#f3f4f6",borderColor:"#e5e7eb"}})}_.push({id:"past-time-block-today",title:"",start:G(m),end:G(c),display:"background",style:{backgroundColor:"#f3f4f6",borderColor:"#e5e7eb"}});const[C,w]=a.split(":").map(Number),[F]=y.split(":").map(Number);if(w>0)for(let D=0;D<=7;D++){const k=new Date(m);k.setDate(m.getDate()+D);const h=new Date(k);h.setHours(F,0,0,0);const I=new Date(k);I.setHours(C,w,0,0),_.push({id:`unavailable-start-block-${D}`,title:"",start:G(h),end:G(I),display:"background",style:{backgroundColor:"#f3f4f6",borderColor:"#e5e7eb"}})}const[O,P]=s.split(":").map(Number),[E]=V.split(":").map(Number);if(P>0)for(let D=0;D<=7;D++){const k=new Date(m);k.setDate(m.getDate()+D);const h=new Date(k);h.setHours(O,P,0,0);const I=new Date(k);E===0?I.setHours(23,59,59,999):I.setHours(E,0,0,0),_.push({id:`unavailable-end-block-${D}`,title:"",start:G(h),end:G(I),display:"background",style:{backgroundColor:"#f3f4f6",borderColor:"#e5e7eb"}})}return _},[v,a,y,s,V]),Y=i.useRef([]);i.useEffect(()=>{Y.current=N.map(c=>{const m=c.start instanceof Date?c.start:new Date(c.start),_=c.end instanceof Date?c.end:new Date(c.end);return{title:c.title,start:m,end:_}})},[N]);const l=Ue({views:[Ve(),We()],events:K,backgroundEvents:o,selectedDate:Te(),minDate:Te(),dayBoundaries:{start:y,end:V},weekOptions:{gridHeight:600,nDays:7,eventWidth:95,gridStep:60},firstDayOfWeek:7,callbacks:{onEventClick(c){var m;(m=H.current)==null||m.call(H,String(c.id))},onClickDateTime(c){const m=u.current;if(!m)return;const _=pt(c),C=new Date;if(_.getTime()<C.getTime())return;const w=_.getDay();if(!B.current.includes(w))return;const[F,O]=U.current.split(":").map(Number),[P,E]=n.current.split(":").map(Number),D=_.getHours(),k=_.getMinutes(),h=D*60+k,I=F*60+O,$=P*60+E;if(h<I||h>=$)return;const f=Y.current;if(xt(_,f))return;const t=yt(_,A.current,n.current,f);t.getTime()<=_.getTime()||m(_,t)}}});return i.useEffect(()=>{l&&l.events.set(K)},[l,K]),e.jsxs("div",{className:"amenity-calendar",children:[e.jsx("style",{children:`
2        .amenity-calendar {
3          --sx-color-primary: #3b82f6;
4          --sx-color-primary-dark: #2563eb;
5          overflow-x: auto;
6          width: 100%;
7        }
8        .amenity-calendar .sx__calendar {
9          font-family: inherit;
10          min-width: 360px;
11        }
12        /* Header styling */
13        .amenity-calendar .sx__calendar-header {
14          padding: 1rem;
15        }
16        /* Mobile: stack controls, hide View dropdown (Day is only option), show only Date picker */
17        @media (max-width: 899px) {
18          .amenity-calendar .sx__calendar-header {
19            flex-direction: column;
20            align-items: stretch;
21            gap: 0.5rem;
22          }
23          .amenity-calendar .sx__calendar-header .sx__view-selection,
24          .amenity-calendar .sx__calendar-header [class*="view-selection"] {
25            display: none !important;
26          }
27          .amenity-calendar .sx__calendar-header .sx__date-input-wrapper,
28          .amenity-calendar .sx__calendar-header .sx__date-input {
29            width: 100%;
30            max-width: 100%;
31          }
32        }
33        .amenity-calendar .sx__calendar-header__title {
34          font-size: 1rem !important;
35          font-weight: 600;
36        }
37          .sx__today-button {
38          padding: var(--sx-spacing-padding2) var(--sx-spacing-padding4);}
39        /* Navigation buttons */
40        .amenity-calendar .sx__calendar-header__chevron-button,
41        .amenity-calendar .sx__calendar-header__today-button {
42          font-size: 0.75rem !important;
43          padding: 0.25rem 0.5rem !important;
44          background-color: #3b82f6 !important;
45          border-color: #3b82f6 !important;
46          color: #ffffff !important;
47          border-radius: 4px;
48        }
49        .amenity-calendar .sx__calendar-header__chevron-button:hover,
50        .amenity-calendar .sx__calendar-header__today-button:hover {
51          background-color: #2563eb !important;
52          border-color: #2563eb !important;
53        }
54          .sx__view-selection-selected-item, .sx__calendar-header .sx__date-input {
55          padding: var(--sx-spacing-padding2) var(--sx-spacing-padding4);          
56          height: 40px;
57          }
58        /* Replace chevron icons with Font Awesome */
59        .amenity-calendar .sx__calendar-header__chevron-button svg {
60          display: none;
61        }
62        .amenity-calendar .sx__calendar-header__chevron-button::before {
63          font-family: 'Font Awesome 6 Pro', 'Font Awesome 6 Free', FontAwesome;
64          font-weight: 900;
65          font-size: 0.75rem;
66        }
67        .amenity-calendar .sx__calendar-header__chevron-button--previous::before {
68          content: '\\f053'; /* fa-chevron-left */
69        }
70        .amenity-calendar .sx__calendar-header__chevron-button--next::before {
71          content: '\\f054'; /* fa-chevron-right */
72        }
73        /* View toggle buttons */
74        .amenity-calendar .sx__view-selection__button {
75          font-size: 0.75rem !important;
76          padding: 0.25rem 0.5rem !important;
77          background-color: #ffffff !important;
78          border-color: #d1d5db !important;
79          color: #374151 !important;
80        }
81        .amenity-calendar .sx__view-selection__button:hover {
82          background-color: #f3f4f6 !important;
83          border-color: #9ca3af !important;
84        }
85        .amenity-calendar .sx__view-selection__button--active {
86          background-color: #3b82f6 !important;
87          border-color: #3b82f6 !important;
88          color: #ffffff !important;
89        }
90        .amenity-calendar .sx__view-selection__button--active:hover {
91          background-color: #2563eb !important;
92          border-color: #2563eb !important;
93        }
94        /* Time grid styling */
95        .amenity-calendar .sx__time-grid-day__time-slot {
96          height: 2.5rem !important;
97          cursor: pointer !important;
98        }
99        /* Override cursor for time slots in past days or with background events */
100        .amenity-calendar .sx__time-grid-day.sx__day--past .sx__time-grid-day__time-slot,
101        .amenity-calendar .sx__time-grid-day:has(.sx__event[data-display="background"]) .sx__time-grid-day__time-slot {
102          cursor: not-allowed !important;
103        }
104        .amenity-calendar .sx__time-axis__time {
105          font-size: 0.7rem !important;
106        }
107        /* Day header styling */
108        .amenity-calendar .sx__week-grid__day-name,
109        .amenity-calendar .sx__week-grid__date {
110          font-size: 0.75rem !important;
111          font-weight: 600;
112        }
113        /* Event styling */
114        .amenity-calendar .sx__event {
115          cursor: pointer;
116          border-radius: 4px;
117        }
118        .amenity-calendar .sx__event-content {
119          padding: 2px 4px;
120        }
121        /* Grid borders */
122        .amenity-calendar .sx__time-grid-day,
123        .amenity-calendar .sx__week-grid__day {
124          border-color: #e5e7eb !important;
125        }
126        /* Month grid styling */
127        .amenity-calendar .sx__month-grid-day__date {
128          font-size: 0.75rem !important;
129        }
130        /* Current time indicator */
131        .amenity-calendar .sx__current-time-indicator {
132          background-color: #ef4444;
133        }
134        /* Clickable areas */
135        .amenity-calendar .sx__time-grid-day:not(.sx__day--past):not(:has(.sx__event[data-display="background"])),
136        .amenity-calendar .sx__month-grid-day:not(.sx__day--past) {
137          cursor: pointer !important;
138        }
139        /* Unavailable days styling */
140        .amenity-calendar .sx__day--unavailable {
141          background-color: #f3f4f6 !important;
142          cursor: not-allowed !important;
143        }
144        .amenity-calendar .sx__day--unavailable .sx__time-grid-day__time-slot,
145        .amenity-calendar .sx__day--unavailable .sx__month-grid-day__header {
146          cursor: not-allowed !important;
147        }
148        /* Add diagonal stripes pattern for extra visual clarity */
149        .amenity-calendar .sx__month-grid-day.sx__day--unavailable {
150          background: repeating-linear-gradient(
151            -45deg,
152            #f3f4f6,
153            #f3f4f6 5px,
154            #e5e7eb 5px,
155            #e5e7eb 10px
156          ) !important;
157        }
158        .amenity-calendar .sx__time-grid-day.sx__day--unavailable {
159          background-color: #f3f4f6 !important;
160        }
161        .amenity-calendar .sx__week-grid__day.sx__day--unavailable {
162          background-color: #f3f4f6 !important;
163          color: #9ca3af !important;
164        }
165        /* Past days styling - slightly different shade to distinguish from unavailable days */
166        .amenity-calendar .sx__day--past {
167          opacity: 0.6;
168          cursor: not-allowed !important;
169        }
170        .amenity-calendar .sx__month-grid-day.sx__day--past {
171          background: #f9fafb !important;
172          cursor: not-allowed !important;
173        }
174        .amenity-calendar .sx__time-grid-day.sx__day--past {
175          background-color: #f9fafb !important;
176          cursor: not-allowed !important;
177        }
178        .amenity-calendar .sx__time-grid-day.sx__day--past .sx__time-grid-day__time-slot {
179          cursor: not-allowed !important;
180        }
181        .amenity-calendar .sx__week-grid__day.sx__day--past {
182          color: #9ca3af !important;
183          cursor: not-allowed !important;
184        }
185        /* Background events styling - for past times that are not bookable */
186        .amenity-calendar .sx__event[data-display="background"] {
187          cursor: not-allowed !important;
188          opacity: 0.4;
189          pointer-events: auto !important;
190          z-index: 10 !important;
191        }
192        .amenity-calendar .sx__event[data-display="background"] .sx__event-content {
193          display: none;
194        }
195        /* Make time slots covered by background events show disabled cursor */
196        .amenity-calendar .sx__time-grid-day:has(.sx__event[data-display="background"]) {
197          cursor: not-allowed !important;
198        }
199        .amenity-calendar .sx__time-grid-day:has(.sx__event[data-display="background"]) .sx__time-grid-day__time-slot {
200          cursor: not-allowed !important;
201        }
202        /* Also target time slots that are in the past */
203        .amenity-calendar .sx__time-grid-day.sx__day--past .sx__time-grid-day__time-slot {
204          cursor: not-allowed !important;
205        }
206      `}),e.jsx(Ge,{calendarApp:l})]})}function be(a){const[s,d]=a.split(":").map(Number);return{hours:s,minutes:d}}function xe(a){const{hours:s,minutes:d}=be(a);return s*60+d}function Me(a){const s=Math.floor(a/60),d=a%60;return`${String(s).padStart(2,"0")}:${String(d).padStart(2,"0")}`}function vt(a,s,d=30){const b=[],N=be(a),S=be(s);let p=N.hours,x=N.minutes;for(;p<S.hours||p===S.hours&&x<=S.minutes;){const u=`${String(p).padStart(2,"0")}:${String(x).padStart(2,"0")}`;b.push({value:u,label:He(new Date(2e3,0,1,p,x),"h:mm a")}),x+=d,x>=60&&(p+=Math.floor(x/60),x=x%60)}return b}function _t(a,s,d=30,b){return Re(a,s,d,b).map(N=>{const[S,p]=N.split(":").map(Number);return{value:N,label:He(new Date(2e3,0,1,S,p),"h:mm a")}})}function wt({isOpen:a,onClose:s,amenityName:d,initialStartDate:b,initialEndDate:N,availableStartTime:S,availableEndTime:p,availableDays:x,blockDurationMinutes:u,reservationBlocks:H="",reservationBlocksMilliseconds:A,maxRentalDays:B=1,reservationLimitPerDay:n,userReservationsForLimit:U,existingReservations:y=[],isEditMode:V=!1,onDelete:q,onSubmit:K}){const{t:v}=ie(),J=at("ReservationRequest","Homeowner_v2"),[o,Y]=i.useState(void 0),[l,c]=i.useState(void 0),[m,_]=i.useState(""),[C,w]=i.useState(""),[F,O]=i.useState(""),[P,E]=i.useState([]),[D,k]=i.useState(!1),h=Qe(B),I=U??y,$=!V&&n!=null&&n>0&&o!=null&&l!=null&&Ke(o,l,n,I),f=i.useMemo(()=>vt(S,p,30),[S,p]),t=i.useMemo(()=>!o||!l?[]:$?[]:_e(o,l,x)?f.filter(r=>{if(h&&!oe(o,l))return Ye(o,l,r.value,p,u,y);const T=u??30,X=xe(r.value),re=Me(X+T);return we(o,r.value,re,y)}):[],[o,l,f,x,h,u,y,$,p]),g=i.useMemo(()=>!o||!l||!m?p:h&&!oe(o,l)?De(o,l,m,u,p,y):ke(o,m,u,p,y),[o,l,m,u,p,y,h]),j=i.useMemo(()=>{if(!m||!o||!l)return[];const r=_t(m,g,30,u);return h&&!oe(o,l)?r.filter(T=>ue(o,l,m,T.value,y)):r.filter(T=>we(o,m,T.value,y))},[m,o,l,g,u,h,y]),R=i.useMemo(()=>!o||!l?null:W(l)<W(o)?v("main.reservations.endDateBeforeStartDate"):B!=null&&je(o,l)>B?v("main.reservations.maxRentalDaysExceeded",{maxDays:B}):_e(o,l,x)?m&&C&&!ue(o,l,m,C,y)?v("main.reservations.rangeConflictsWithExisting"):null:v("main.reservations.unavailableDaysInRange"),[o,l,B,x,m,C,y,v]),M=m!==""&&t.some(r=>r.value===m),L=C!==""&&j.some(r=>r.value===C),te=!o||!l||!M||!L||$||!!R,Z=r=>{if(Y(r),!r){c(void 0);return}c(r)},ae=r=>{if(!r||!o){c(r);return}const T=Ne(o,B);if(W(r)>W(T)){c(T);return}if(W(r)<W(o)){c(o);return}c(r)},z=i.useCallback((r,T)=>{const X=ke(r,T,u,p,y),re=xe(T)+(u??1/0);return Me(Math.min(re,xe(X)))},[u,p,y]),se=r=>{if(_(r),!(!o||!l)){if(h&&!oe(o,l)){const T=De(o,l,r,u,p,y),X=Re(r,T,30,u).find(re=>ue(o,l,r,re,y));w(X??"");return}w(z(o,r))}},Q=b==null?void 0:b.getTime();i.useEffect(()=>{if(a&&b){const r=new Date(b);Y(r),c(r);const T=Math.floor(b.getMinutes()/30)*30,X=`${String(b.getHours()).padStart(2,"0")}:${String(T).padStart(2,"0")}`;_(X),w(z(r,X))}else if(a&&h){const r=W(new Date);Y(r),c(r),_(""),w("")}else a||(Y(void 0),c(void 0),_(""),w(""),O(""),E([]))},[a,Q,b,u,p,y,h,z]),i.useEffect(()=>{var r;!m||!o||!l||j.some(T=>T.value===C)||w(((r=j[0])==null?void 0:r.value)??"")},[j,C,m,o,l]);const ne=async()=>{if(!(te||!o||!l||D))try{k(!0),await(K==null?void 0:K({startDate:o,endDate:l,startTime:m,endTime:C,eventDetails:F.trim()||void 0,attachments:P.length>0?Fe(P):void 0}))}finally{k(!1)}},ee=o?Ne(o,B):null,le=i.useCallback(r=>{if(!o)return!0;const T=W(r);return T<W(o)?!1:ee?T<=W(ee):!0},[o,ee]),ce=!D;return e.jsx(Ae,{open:a,onClose:s,padded:!1,textAlign:"left",title:d,headerClassName:"px-6",className:"book-reservation-modal",actions:[{text:v(V?"main.reservations.saveChanges":"main.reservations.bookReservation"),onClick:ne,disabled:te||D,variant:"primary","data-qa":"book-reservation-modal-submit"},...V&&q?[{text:v("main.reservations.delete"),onClick:q,variant:"danger","data-qa":"book-reservation-modal-delete"}]:[]],children:e.jsxs("div",{className:"book-reservation-modal-body px-6 py-4",children:[J&&e.jsx("div",{className:"mb-4 w-full",children:e.jsx(et,{content:J})}),e.jsx("p",{className:"book-reservation-modal-title text-xs font-semibold text-base-header opacity-70 uppercase tracking-wide mb-4",children:v(V?"main.reservations.editReservation":"main.reservations.bookReservation")}),e.jsx("div",{className:"book-reservation-modal-form space-y-[18px]",children:$?e.jsx("div",{className:"rounded-md bg-blue-50 px-4 py-4 text-sm text-base-header",children:v("main.reservations.reservationLimitReached",{limit:n})}):e.jsxs(e.Fragment,{children:[e.jsx(i.Suspense,{fallback:e.jsx("div",{className:"h-[70px]"}),children:e.jsx(he,{id:"reservation-start-date",label:v(h?"main.reservations.startDate":"main.reservations.selectDate"),value:o,onChange:Z,minDate:new Date,useMinDate:!1,popupContainer:"body",className:"book-reservation-modal-date"})}),h&&e.jsx(i.Suspense,{fallback:e.jsx("div",{className:"h-[70px]"}),children:e.jsx(he,{id:"reservation-end-date",label:v("main.reservations.endDate"),value:l,onCh
206ange:ae,minDate:o??new Date,beforeShowDay:r=>le(r),useMinDate:!1,disabled:!o,popupContainer:"body",className:"book-reservation-modal-date"})}),e.jsxs("div",{className:"flex gap-[18px]",children:[e.jsxs("div",{className:"flex-1 flex flex-col gap-[6px]",children:[e.jsx(ye,{label:v("main.reservations.startTime"),labelClassName:"font-semibold mb-[6px] text-sm text-base-header",options:t,value:m?t.find(r=>r.value===m):void 0,onChange:r=>se(r.value),placeholder:v("main.reservations.selectTime"),disabled:!o||!l,deriveKey:r=>r.value,anchor:{to:"top start",gap:4},className:"book-reservation-modal-start-time w-full",buttonClassName:"w-full h-[46px] px-4 py-3 pr-10 border border-[#e0e0e0] rounded-md text-base text-base-header focus:outline-none focus:ring-1 focus:ring-input-active focus:border-input-active bg-white cursor-pointer disabled:bg-gray-100 disabled:cursor-not-allowed"}),ce&&o&&l&&t.length===0&&e.jsx("p",{className:"text-xs text-red-500 mt-1",children:v("main.reservations.noAvailableTimesForDate")})]}),e.jsxs("div",{className:"flex-1 flex flex-col gap-[6px]",children:[e.jsx(ye,{label:v("main.reservations.endTime"),labelClassName:"font-semibold mb-[6px] text-sm text-base-header",options:j,value:C?j.find(r=>r.value===C):void 0,onChange:r=>w(r.value),placeholder:v("main.reservations.selectTime"),disabled:!m,deriveKey:r=>
206r.value,anchor:{to:"top start",gap:4},className:"book-reservation-modal-end-time w-full",buttonClassName:"w-full h-[46px] px-4 py-3 pr-10 border border-[#e0e0e0] rounded-md text-base text-base-header focus:outline-none focus:ring-1 focus:ring-input-active focus:border-input-active bg-white cursor-pointer disabled:bg-gray-100 disabled:cursor-not-allowed"}),ce&&m&&j.length===0&&e.jsx("p",{className:"text-xs text-red-500 mt-1",children:v("main.reservations.noAvailableEndTimes")})]})]}),ce&&R&&e.jsx("p",{className:"text-xs text-red-500",children:R}),h&&o&&l&&!R&&!oe(o,l)&&B!=null&&e.jsx("p",{className:"text-xs text-base-header opacity-70",children:v("main.reservations.multiDayHint",{days:je(o,l),maxDays:B})}),e.jsx("div",{className:"book-reservation-modal-details flex flex-col gap-[6px]",children:e.jsx(Le,{label:v("main.requests.reservationRequests.eventDetails"),"data-qa":"reservation-request__event-details",value:F,onChange:r=>O(r.target.value)})}),e.jsx(tt,{id:"book-reservation-file-input",files:P,onSetFiles:E,uploadProgress:0,isUploading:D})]})})]})})}function Dt({open:a,onClose:s,amenityName:d,start:b,end:N,status:S,actionItemId:p}){const{t:x}=ie(),{data:u,isLoading:H}=it(p??0,{enabled:a&&!!p}),A=Ee(b,{format:"short"}),B=`${ge(b)} - ${ge(N)}`,n=u?[{label:x("main.reservations.reservedBy"),value:u.homeownerName},{label:x("main.reservations.property"),value:u.propertyAddress},{label:x("main.reservations.account"),value:u.accountNumber}].filter(y=>!!y.value):[],U=()=>H?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(Ie,{})}):n.length>0?n.map(y=>e.jsx(de,{label:y.label,value:y.value},y.label)):e.jsx("p",{className:"text-sm text-base-body",children:x("main.reservations.reserverDetailsUnavailable")});return e.jsx(Ae,{open:a,onClose:s,padded:!1,textAlign:"left",title:x("main.reservations.reservationDetails"),headerClassName:"px-6",children:e.jsxs("div",{className:"flex flex-col gap-4 px-6 py-4",children:[e.jsx(de,{label:x("main.reservations.amenity"),value:d}),e.jsx(de,{label:x("main.reservations.date"),value:A}),p?U():null,e.jsx(de,{label:x("main.reservations.time"),value:B}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wide text-base-header opacity-70",children:x("main.reservations.status")}),e.jsx("div",{children:e.jsx(kt,{status:S})})]})]})})}function de({label:a,value:s}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("p",{className:"text-xs font-semibold uppercase tracking-wide text-base-header opacity-70",children:a}),e.jsx("p",{className:"text-sm break-words text-base-header",children:s})]})}function kt({status:a}){const{t:s}=ie(),b=s({pending:"main.reservations.statusPending",cancelled:"main.reservations.statusCancelled",approved:"main.reservations.statusApproved"}[a]);return e.jsx("div",{className:qe("h-[24px] px-[10px] flex items-center justify-center rounded-[50px]",a==="pending"&&"bg-orange-100 text-orange-700",a==="approved"&&"bg-[#d9ebfa] text-base-header",a==="cancelled"&&"bg-[#dfeaf0] text-base-header"),children:e.jsx("span",{className:"text-[13px] font-semibold",children:b})})}const jt=({reservationId:a})=>{const{t:s}=ie(),d=st(),b=!!(d!=null&&d.isBoardMember),N=nt(t=>t.userId??void 0),[S]=lt(),p=S==null?void 0:S.ownerId,x=a?parseInt(a,10):void 0,{data:u=[],isLoading:H}=dt((d==null?void 0:d.id)||0),[A,B]=i.useState(x);i.useEffect(()=>{B(x)},[x]);const n=u==null?void 0:u.find(t=>t.id===A),U=i.useMemo(()=>!n||!(u!=null&&u.length)?[]:u.filter(t=>t.category===n.category),[n,u]),{data:y=[],isLoading:V}=ct({associationId:d==null?void 0:d.id,amenityId:A,requestedUserId:N}),{data:q=[],isLoading:K}=mt(),v=i.useMemo(()=>new Set(q.map(t=>t.id.toString())),[q]),J=t=>v.has(t.id)||!!p&&t.homeownerId===p,{mutateAsync:o}=ut(),Y=(t,g)=>{F({start:new Date(t.getTime()),end:new Date(g.getTime())}),P(!1),C(!0)},l=()=>{C(!1),F(null),P(!1)},c=t=>{const g=y.find(j=>j.id===t);g&&(b||J(g))&&D(g)},m=async t=>{if(!A||!n)return;const{succeededDays:g,failedDays:j}
206=await Ze({startDate:t.startDate,endDate:t.endDate,startTime:t.startTime,endTime:t.endTime,maxRentalDays:Se(n.reservationLimit,n.reservationBlocks,n.reservationBlocksMilliseconds),createDay:({startDateTime:R,endDateTime:M})=>o({amenityId:A,reservationStartDate:R,reservationEndDate:M,associationId:d==null?void 0:d.id,propertyOwnerId:p,eventDetails:t.eventDetails,attachments:t.attachments})});if(j.length===0){me({message:s("main.reservations.reservationSuccess"),type:"success"}),l();return}if(g.length===0){me({message:s("main.reservations.reservationError"),type:"error"});return}me({message:s("main.reservations.reservationPartialSuccess",{succeeded:g.length,total:g.length+j.length,failedDates:j.map(R=>Ee(R,{format:"numeric"})).join(", ")}),type:"warning"})},[_,C]=i.useState(!1),[w,F]=i.useState(null),[O,P]=i.useState(!1),[E,D]=i.useState(null),k=i.useMemo(()=>y!=null&&y.length?y.map(t=>({id:t.id,title:t.title,start:t.start,end:t.end,backgroundColor:t.status==="pending"?"#f59e0b":t.status==="cancelled"?"#9ca3af":"#ef4444",borderColor:t.status==="pending"?"#d97706":t.status==="cancelled"?"#6b7280":"#dc2626",textColor:"#ffffff"})):[],[y]),h=i.useMemo(()=>y.filter(t=>t.status!=="cancelled"),[y]),I=i.useMemo(()=>A?q.filter(t=>t.amenityId===A&&t.status!=="cancelled").map(t=>({start:t.start,end:t.end})):[],[q,A]);if(H||V||K)return e.jsx(pe,{requireAuth:!0,children:e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(Ie,{})})});if(!n)return e.jsx(pe,{requireAuth:!0,children:e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx("p",{className:"text-base-body",children:s("main.reservations.amenityNotFound")})})});const $=Se(n.reservationLimit,n.reservationBlocks,n.reservationBlocksMilliseconds);let f;return $==null?f=s("main.reservations.noMaxRentalLength"):$>1?f=s("main.reservations.maxRentalDaysAllowed",{count:$}):f=s("main.reservations.singleDayOnly"),e.jsxs(pe,{requireAuth:!0,children:[e.jsxs("div",{className:"w-full",children:[e.jsxs(rt,{to:"/community/reservations",className:"flex items-center gap-2 text-base-link mb-4 hover:opacity-80",children:[e.jsx(Oe,{icon:Pe,className:"text-md"}),e.jsx("span",{className:"text-md",children:s("main.reservations.backToReservations")})]}),e.jsxs(fe,{children:[e.jsx(fe.Title,{className:"text-2xl",children:U.length>1&&(n==null?void 0:n.category)||(n==null?void 0:n.name)}),e.jsxs(fe.Body,{children:[e.jsxs("div",{className:"flex flex-col md:flex-row gap-6",children:[e.jsx("div",{className:"flex-shrink-0",children:e.jsx("img",{src:n.imageUrl??Xe(n),alt:n.name,className:"w-full md:w-[300px] h-[200px] rounded object-cover"})}),e.jsxs("div",{className:"flex-1 space-y-4",children:[e.jsxs("div",{className:"flex flex-col tablet:flex-row items-stretch tablet:items-end gap-4",children:[U.length>1&&e.jsx("div",{className:"w-full tablet:max-w-xs",children:e.jsx(ye,{label:"",options:U,value:n,onChange:t=>{B(t.id)},deriveKey:t=>t.id.toString(),displayOption:t=>e.jsx("span",{className:"text-lg",children:t.name}),displaySelected:t=>e.jsx("span",{className:"text-lg",children:t.name}),buttonClassName:"w-full pl-4",dropDownClassName:"text-lg"})}),e.jsx($e,{variant:"primary",onClick:()=>{P(!0),C(!0)},className:"amenity-calendar-book-reservation-button",children:s("main.reservations.bookReservation")})]}),e.jsx("p",{className:"text-lg text-base-header leading-relaxed",children:n.description}),e.jsxs("div",{className:"flex flex-col tablet:flex-row gap-6",children:[e.jsxs("div",{className:"bg-base-fill rounded-lg px-6 py-4 border border-widget-border",children:[e.jsx("h4",{className:"text-md font-semibold text-base-header mb-2",children:s("main.reservations.availableHours")}),e.jsxs("p",{className:"text-md text-base-header opacity-70",children:[ve(n.availableStartTime)," -"," ",ve(n.availableEndTime)]})]}),e.jsxs("div",{className:"bg-base-fill rounded-lg px-6 py-4 border border-widget-border",children:[e.jsx("h4",{className:"text-md font-semibold text-base-header mb-2",children:s("main.reservations.reservationBlocks")}),e.jsx("p",{className:"text-md text-base-header opacity-70",children:n.reservationBlocks})]}),e.jsxs("div",{className:"bg-base-fill rounded-lg px-6 py-4 border border-widget-border",children:[e.jsx("h4",{className:"text-md font-semibold text-base-header mb-2",children:s("main.reservations.reservationLimit")}),e.jsx("p",{className:"text-md text-base-header opacity-70",children:n.reservationLimit})]}),e.jsxs("div",{className:"bg-base-fill rounded-lg px-6 py-4 border border-widget-border",children:[e.jsx("h4",{className:"text-md font-semibold text-base-header mb-2",children:s("main.reservations.maxRentalLength")}),e.jsx("p",{className:"text-md text-base-header opacity-70",children:f})]}),e.jsxs("div",{className:"bg-base-fill rounded-lg px-6 py-4 border border-widget-border",children:[e.jsx("h4",{className:"text-md font-semibold text-base-header mb-2",children:s("main.reservations.availableDays")}),e.jsx("p",{className:"text-md text-base-header opacity-70",children:n.availableDays.join(", ")})]})]})]})]}),e.jsxs("div",{className:"mt-6",children:[e.jsx("h3",{className:"text-base font-semibold text-base-header mb-4",children:s("main.reservations.selectTimeSlot")}),e.jsx(gt,{availableStartTime:n.availableStartTime,availableEndTime:n.availableEndTime,availableDays:n.availableDays,maxBlockDurationMinutes:Ce(n.reservationBlocks)??1440,events:k,onT
206imeSlotClick:Y,onEventClick:c},n.id)]})]})]})]}),e.jsx(wt,{isOpen:_,onClose:l,amenityName:n.name,initialStartDate:O||w==null?void 0:w.start,initialEndDate:O||w==null?void 0:w.end,availableStartTime:n.availableStartTime,availableEndTime:n.availableEndTime,availableDays:n.availableDays,blockDurationMinutes:Ce(n.reservationBlocks),reservationBlocks:n.reservationBlocks,reservationBlocksMilliseconds:n.reservationBlocksMilliseconds,maxRentalDays:$,existingReservations:h.map(t=>({start:t.start,end:t.end})),userReservationsForLimit:I,reservationLimitPerDay:Je(n.reservationLimit),onSubmit:m}),E&&e.jsx(Dt,{open:!0,onClose:()=>D(null),amenityName:n.name,start:E.start,end:E.end,status:E.status,actionItemId:E.actionItemId})]})},Kt={title:"Amenity Availability",showPropertySelector:!0,requiresEarlyAccess:"redesign-v3"};function Yt(){ze("/community/reservations");const{id:a}=ot();return e.jsx(jt,{reservationId:a})}export{Yt as Component,Kt as handle};

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.