@happychef/reservation-sidebar 2.7.10 → 2.8.2

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/README.md CHANGED
@@ -1,202 +1,202 @@
1
- # @happychef/reservation-sidebar
2
-
3
- A compound React component for managing restaurant reservations with a sidebar interface.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install @happychef/reservation-sidebar
9
- ```
10
-
11
- ## Features
12
-
13
- - Complete reservation management UI with sidebar
14
- - Guest selection and date/time picking
15
- - Menu and staff assignment
16
- - Giftcard selection support
17
- - Seat/table assignment (terras/restaurant)
18
- - Auto-fill customer information
19
- - Multi-language support (NL/EN)
20
- - TypeScript support with full type definitions
21
- - Both ESM and CJS module formats
22
-
23
- ## Usage
24
-
25
- ### Important: Styling Setup
26
-
27
- The component styles are scoped under `.new-reservation-page` class and require CSS variables. Make sure to:
28
-
29
- 1. **Wrap your app** (or at least the component) with the `.new-reservation-page` class
30
- 2. **Define required CSS variables** in your app's CSS:
31
-
32
- ```css
33
- :root {
34
- --color-blue: #4CAF50;
35
- --color-blue-hover-accent: #45a049;
36
- --color-white: #ffffff;
37
- --border-radius: 4px;
38
- --z-index-sidebar-reservation: 1000;
39
- --z-index-modal: 999;
40
- }
41
- ```
42
-
43
- ### Basic Usage
44
-
45
- ```tsx
46
- import { ReservationSidebar } from '@happychef/reservation-sidebar';
47
- import type { FormData, FormErrors } from '@happychef/reservation-sidebar';
48
-
49
- function App() {
50
- const [isOpen, setIsOpen] = useState(false);
51
- const [formData, setFormData] = useState<FormData>({
52
- guests: 2,
53
- date: '',
54
- time: '',
55
- firstName: '',
56
- lastName: '',
57
- email: '',
58
- phone: '',
59
- extraInfo: '',
60
- menu: '',
61
- personeel: '',
62
- giftcard: '',
63
- zitplaats: '',
64
- selectedTableNumbers: [],
65
- selectedTableIds: [],
66
- reservationMode: 'met_limieten',
67
- });
68
- const [errors, setErrors] = useState<FormErrors>({});
69
- const [isSubmitting, setIsSubmitting] = useState(false);
70
- const [reservationSubmitted, setReservationSubmitted] = useState(false);
71
-
72
- const handleChange = (e) => {
73
- setFormData({ ...formData, [e.target.name]: e.target.value });
74
- };
75
-
76
- const handleFinalSubmit = async () => {
77
- setIsSubmitting(true);
78
- // Submit logic here
79
- setIsSubmitting(false);
80
- setReservationSubmitted(true);
81
- };
82
-
83
- const handleNewReservation = () => {
84
- setReservationSubmitted(false);
85
- // Reset form
86
- };
87
-
88
- return (
89
- <div className="new-reservation-page">
90
- <button onClick={() => setIsOpen(true)}>Open Reservation</button>
91
- <ReservationSidebar
92
- isOpen={isOpen}
93
- onClose={() => setIsOpen(false)}
94
- formData={formData}
95
- errors={errors}
96
- handleChange={handleChange}
97
- handleFinalSubmit={handleFinalSubmit}
98
- setFormData={setFormData}
99
- isSubmitting={isSubmitting}
100
- reservationSubmitted={reservationSubmitted}
101
- onNewReservation={handleNewReservation}
102
- apiBaseDomain="https://happychef.cloud/"
103
- />
104
- </div>
105
- );
106
- }
107
- ```
108
-
109
- ## Sub-components
110
-
111
- You can also use individual sub-components:
112
-
113
- ```tsx
114
- import {
115
- FormField,
116
- GiftcardSelection,
117
- ZitplaatsSelection,
118
- ReservationStepTwo,
119
- ReservationSummary,
120
- } from '@happychef/reservation-sidebar';
121
- ```
122
-
123
- ## API Configuration
124
-
125
- ### Setting the API Base Domain
126
-
127
- You can configure the API base domain in two ways:
128
-
129
- **Method 1: Via Component Prop (Recommended)**
130
- ```tsx
131
- <ReservationSidebar
132
- apiBaseDomain="https://happychef.cloud/"
133
- // ... other props
134
- />
135
- ```
136
-
137
- **Method 2: Via window.baseDomain**
138
- ```tsx
139
- // Set before rendering the component
140
- (window as any).baseDomain = 'https://happychef.cloud/';
141
- ```
142
-
143
- ### API Endpoints
144
-
145
- The component expects the following API endpoints to be available:
146
-
147
- - `GET {baseDomain}api/auth-restaurant/` - Restaurant configuration, timeblocks, menu
148
- - `GET {baseDomain}api/personeel` - Staff/personnel data
149
- - `POST {baseDomain}api/autofill` - Customer autofill by email/phone
150
- - `GET {baseDomain}api/slots/{restaurantId}/{beginDate}/{endDate}` - Reservation slots (for table assignment)
151
-
152
- ## Important Notes
153
-
154
- ### ReservationStepOne Component
155
-
156
- The `ReservationStepOne` component in this package is currently a **placeholder implementation**. The full implementation requires:
157
-
158
- 1. **@happychef/algorithm** package - for table availability calculations
159
- 2. **Multiple complex sub-components**:
160
- - Calendar
161
- - DateSelector
162
- - TimeSelector
163
- - TableSelector
164
- - ValueSelector
165
-
166
- To use the full date/time selection functionality, you'll need to:
167
- - Install the `@happychef/algorithm` package
168
- - Copy the complete StepOne implementation from the source repository
169
- - Ensure all sub-components are properly integrated
170
-
171
- The current placeholder provides basic input fields for guests, date, and time.
172
-
173
- ## TypeScript
174
-
175
- Full TypeScript support is included with comprehensive type definitions.
176
-
177
- ```tsx
178
- import type {
179
- FormData,
180
- FormErrors,
181
- ReservationSidebarProps,
182
- RestaurantData,
183
- MenuData,
184
- Timeblock,
185
- } from '@happychef/reservation-sidebar';
186
- ```
187
-
188
- ## Dependencies
189
-
190
- ### Peer Dependencies
191
- - react >=16.8.0
192
- - react-dom >=16.8.0
193
-
194
- ### Required Dependencies
195
- - axios
196
- - lottie-react
197
- - moment-timezone
198
- - react-icons
199
-
200
- ## License
201
-
202
- MIT
1
+ # @happychef/reservation-sidebar
2
+
3
+ A compound React component for managing restaurant reservations with a sidebar interface.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @happychef/reservation-sidebar
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - Complete reservation management UI with sidebar
14
+ - Guest selection and date/time picking
15
+ - Menu and staff assignment
16
+ - Giftcard selection support
17
+ - Seat/table assignment (terras/restaurant)
18
+ - Auto-fill customer information
19
+ - Multi-language support (NL/EN)
20
+ - TypeScript support with full type definitions
21
+ - Both ESM and CJS module formats
22
+
23
+ ## Usage
24
+
25
+ ### Important: Styling Setup
26
+
27
+ The component styles are scoped under `.new-reservation-page` class and require CSS variables. Make sure to:
28
+
29
+ 1. **Wrap your app** (or at least the component) with the `.new-reservation-page` class
30
+ 2. **Define required CSS variables** in your app's CSS:
31
+
32
+ ```css
33
+ :root {
34
+ --color-blue: #4CAF50;
35
+ --color-blue-hover-accent: #45a049;
36
+ --color-white: #ffffff;
37
+ --border-radius: 4px;
38
+ --z-index-sidebar-reservation: 1000;
39
+ --z-index-modal: 999;
40
+ }
41
+ ```
42
+
43
+ ### Basic Usage
44
+
45
+ ```tsx
46
+ import { ReservationSidebar } from '@happychef/reservation-sidebar';
47
+ import type { FormData, FormErrors } from '@happychef/reservation-sidebar';
48
+
49
+ function App() {
50
+ const [isOpen, setIsOpen] = useState(false);
51
+ const [formData, setFormData] = useState<FormData>({
52
+ guests: 2,
53
+ date: '',
54
+ time: '',
55
+ firstName: '',
56
+ lastName: '',
57
+ email: '',
58
+ phone: '',
59
+ extraInfo: '',
60
+ menu: '',
61
+ personeel: '',
62
+ giftcard: '',
63
+ zitplaats: '',
64
+ selectedTableNumbers: [],
65
+ selectedTableIds: [],
66
+ reservationMode: 'met_limieten',
67
+ });
68
+ const [errors, setErrors] = useState<FormErrors>({});
69
+ const [isSubmitting, setIsSubmitting] = useState(false);
70
+ const [reservationSubmitted, setReservationSubmitted] = useState(false);
71
+
72
+ const handleChange = (e) => {
73
+ setFormData({ ...formData, [e.target.name]: e.target.value });
74
+ };
75
+
76
+ const handleFinalSubmit = async () => {
77
+ setIsSubmitting(true);
78
+ // Submit logic here
79
+ setIsSubmitting(false);
80
+ setReservationSubmitted(true);
81
+ };
82
+
83
+ const handleNewReservation = () => {
84
+ setReservationSubmitted(false);
85
+ // Reset form
86
+ };
87
+
88
+ return (
89
+ <div className="new-reservation-page">
90
+ <button onClick={() => setIsOpen(true)}>Open Reservation</button>
91
+ <ReservationSidebar
92
+ isOpen={isOpen}
93
+ onClose={() => setIsOpen(false)}
94
+ formData={formData}
95
+ errors={errors}
96
+ handleChange={handleChange}
97
+ handleFinalSubmit={handleFinalSubmit}
98
+ setFormData={setFormData}
99
+ isSubmitting={isSubmitting}
100
+ reservationSubmitted={reservationSubmitted}
101
+ onNewReservation={handleNewReservation}
102
+ apiBaseDomain="https://happychef.cloud/"
103
+ />
104
+ </div>
105
+ );
106
+ }
107
+ ```
108
+
109
+ ## Sub-components
110
+
111
+ You can also use individual sub-components:
112
+
113
+ ```tsx
114
+ import {
115
+ FormField,
116
+ GiftcardSelection,
117
+ ZitplaatsSelection,
118
+ ReservationStepTwo,
119
+ ReservationSummary,
120
+ } from '@happychef/reservation-sidebar';
121
+ ```
122
+
123
+ ## API Configuration
124
+
125
+ ### Setting the API Base Domain
126
+
127
+ You can configure the API base domain in two ways:
128
+
129
+ **Method 1: Via Component Prop (Recommended)**
130
+ ```tsx
131
+ <ReservationSidebar
132
+ apiBaseDomain="https://happychef.cloud/"
133
+ // ... other props
134
+ />
135
+ ```
136
+
137
+ **Method 2: Via window.baseDomain**
138
+ ```tsx
139
+ // Set before rendering the component
140
+ (window as any).baseDomain = 'https://happychef.cloud/';
141
+ ```
142
+
143
+ ### API Endpoints
144
+
145
+ The component expects the following API endpoints to be available:
146
+
147
+ - `GET {baseDomain}api/auth-restaurant/` - Restaurant configuration, timeblocks, menu
148
+ - `GET {baseDomain}api/personeel` - Staff/personnel data
149
+ - `POST {baseDomain}api/autofill` - Customer autofill by email/phone
150
+ - `GET {baseDomain}api/slots/{restaurantId}/{beginDate}/{endDate}` - Reservation slots (for table assignment)
151
+
152
+ ## Important Notes
153
+
154
+ ### ReservationStepOne Component
155
+
156
+ The `ReservationStepOne` component in this package is currently a **placeholder implementation**. The full implementation requires:
157
+
158
+ 1. **@happychef/algorithm** package - for table availability calculations
159
+ 2. **Multiple complex sub-components**:
160
+ - Calendar
161
+ - DateSelector
162
+ - TimeSelector
163
+ - TableSelector
164
+ - ValueSelector
165
+
166
+ To use the full date/time selection functionality, you'll need to:
167
+ - Install the `@happychef/algorithm` package
168
+ - Copy the complete StepOne implementation from the source repository
169
+ - Ensure all sub-components are properly integrated
170
+
171
+ The current placeholder provides basic input fields for guests, date, and time.
172
+
173
+ ## TypeScript
174
+
175
+ Full TypeScript support is included with comprehensive type definitions.
176
+
177
+ ```tsx
178
+ import type {
179
+ FormData,
180
+ FormErrors,
181
+ ReservationSidebarProps,
182
+ RestaurantData,
183
+ MenuData,
184
+ Timeblock,
185
+ } from '@happychef/reservation-sidebar';
186
+ ```
187
+
188
+ ## Dependencies
189
+
190
+ ### Peer Dependencies
191
+ - react >=16.8.0
192
+ - react-dom >=16.8.0
193
+
194
+ ### Required Dependencies
195
+ - axios
196
+ - lottie-react
197
+ - moment-timezone
198
+ - react-icons
199
+
200
+ ## License
201
+
202
+ MIT
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ Arguments: `+Array.prototype.slice.call(O).join("")+`
7
7
  ===== Checking date availability for ${q} guests on ${c} =====`),console.log("Restaurant data floors:",p.floors?"present":"missing"),console.log("Table settings:",JSON.stringify(p["table-settings"]||{},null,2));let f=p?.["table-settings"]||{},g=f.isInstalled===true&&f.assignmentMode==="automatic"&&p.floors&&Array.isArray(p.floors);if(console.log(`Table assignment is ${g?"ENABLED":"DISABLED"} for date ${c}`),!Ao(p,c,e,q,W,a,n,s))return console.log(`Date ${c} fails basic availability check`),false;if(!g)return console.log(`Table assignment disabled, date ${c} is available`),true;console.log(`Getting available timeblocks for ${c}`);let u=oo(p,c,e,q,W,a,n,s);if(console.log(`Found ${Object.keys(u).length} available timeblocks before table check`),Object.keys(u).length===0)return console.log(`No available timeblocks on ${c}, date is unavailable`),false;console.log(`Checking table availability for each timeblock on ${c}`);let h=false,R=0;for(let X of Object.keys(u)){if(R++,a&&!ao(p,c,X,a)){console.log(`Time ${X} doesn't match giftcard meal requirements`);continue}if(console.log(`Checking table availability for ${X} on ${c} for ${q} guests`),qo(p,c,X,q,e,null,s)){console.log(`Found available time ${X} with table assignment!`),h=true;break}}return console.log(`Checked ${R}/${Object.keys(u).length} timeblocks`),console.log(`Date ${c} with table check: ${h?"Available":"Unavailable"}`),h}Rb.exports={isDateAvailableWithTableCheck:no};});var Lb=r0(()=>{var{isTimeAvailable:io}=tM(),to={_id:"poer","general-settings":{zitplaatsen:30,uurOpVoorhand:4,dagenInToekomst:90,maxGasten:8,intervalReservatie:15,duurReservatie:120,minutenTotEinde:135,showNoticeForMaxGuests:0,noticePhoneNumber:"",storedNumber:76},menu:[{name:"POER Menu",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"12:00",endHour:"23:00",daysOfWeek:["zaterdag","dinsdag","woensdag","donderdag","vrijdag"],storedNumber:36,_id:"674a9033c1956dd233bafaad"},{name:"A la carte",startDate:"2024-11-30",endDate:"2030-01-01",startHour:"12:00",endHour:"14:00",daysOfWeek:["dinsdag","woensdag","donderdag","vrijdag"],storedNumber:28,_id:"674a9084c1956dd233bafaae"},{name:"Ik weet het nog niet",startDate:"2024-11-30",endDate:"2030-01-01",startHour:"12:00",endHour:"14:00",daysOfWeek:["dinsdag","woensdag","donderdag","vrijdag"],storedNumber:41,_id:"674a90bc64cc52acdd5e6cc2"},{name:"Lunch",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"12:00",endHour:"14:00",daysOfWeek:["dinsdag","woensdag","donderdag","vrijdag"],storedNumber:23,_id:"674adb4e8d6385fb343499f7"},{name:"A la carte",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"18:30",endHour:"20:30",daysOfWeek:["dinsdag","woensdag","donderdag"],storedNumber:50,_id:"674adbf58d6385fb343499f8"},{name:"Ik weet het nog niet",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"18:30",endHour:"20:30",daysOfWeek:["dinsdag","donderdag","woensdag"],storedNumber:54,_id:"674adc208d6385fb343499f9"}],mededeling:[{mededeling:"Gelieve er rekening mee te houden dat we op vrijdagavond en zaterdagavond enkel ons POER menu serveren.",startDate:"2024-11-01",endDate:"2030-01-30",startTime:"18:30",endTime:"20:30",daysOfWeek:["vrijdag","zaterdag"],storedNumber:95,_id:"674ade0a8d6385fb343499fa"}],settings:{pageTitle:"Reserveer nu",generalNotification:"",alignment:"fullScreenColor",backgroundBlur:"blurBackground",storedNumber:61},colors:{backgroundType:"solid",backgroundColor:"#e0debe",gradientStartColor:"#FFFFFF",gradientEndColor:"#000000",animationType:"none",widgetBackgroundColor:"#000000",widgetTextColor:"#FFFFFF",textColor:"#000000",containerColor:"#FFFFFF",buttonColor:"#000000",buttonTextColor:"#FFFFFF",storedNumber:81},exceptions:[{title:"Extra mensen donderdagmiddag",type:"Opening",timeframe:"lunch",startDate:"2024-12-05",endDate:"2024-12-05",startHour:"12:00",endHour:"16:00",maxSeats:"34",daysOfWeek:["donderdag"],storedNumber:74,_id:"67507dc98fb61d6afd54acb0"},{title:"Extra personen donderdagavond",type:"Uitzondering",timeframe:"dinner",startDate:"2024-12-05",endDate:"2024-12-05",startHour:"18:30",endHour:"23:00",maxSeats:"27",daysOfWeek:["donderdag"],storedNumber:88,_id:"67507e3383d7f2de02628f4a"},{title:"Cong\xE9 Periode 22/12 tot 9/01",type:"Sluiting",timeframe:"Volledige Dag",startDate:"2024-12-22",endDate:"2025-01-09",daysOfWeek:[],storedNumber:89,_id:"67511bb38fb61d6afd54acba"}],"openinghours-lunch":{schemeSettings:{Tuesday:{enabled:true,startTime:"12:00",endTime:"13:30",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Wednesday:{enabled:true,startTime:"12:00",endTime:"16:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Thursday:{enabled:true,startTime:"12:00",endTime:"16:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Friday:{enabled:true,startTime:"12:30",endTime:"13:30",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]}},storedNumber:2},"openinghours-dinner":{schemeSettings:{Tuesday:{enabled:true,startTime:"18:30",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"24",shiftsEnabled:false,shifts:[]},Wednesday:{enabled:true,startTime:"16:00",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"24",shiftsEnabled:false,shifts:[]},Thursday:{enabled:true,startTime:"16:00",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"24",shiftsEnabled:false,shifts:[]},Friday:{enabled:true,startTime:"18:30",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Saturday:{enabled:true,startTime:"18:30",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]}},storedNumber:6},fonts:{titleFont:{font:"Poppins",weight:"400"},subtitleFont:{font:"Poppins",weight:"400"},labelFont:{font:"Poppins",weight:"400"},buttonFont:{font:"Poppins",weight:"400"}},theme:{id:10,title:"Herfstbladeren",color:"#D35400",image:"/static/media/default-theme.webp"}},ro=[{guests:10,time:"12:00",date:"2024-12-18"},{guests:100,time:"15:00",date:"2024-12-04"}];console.log("--- Is Time Available Tests ---");var ub="2024-12-10",lb=1e3,so=["12:00","12:15","13:00","19:00","20:00","20:15"];so.forEach(p=>{let c=io(to,ub,p,ro,lb);console.log(`Is ${p} on ${ub} available for ${lb} guests?`,c);});});var Xb=r0((oq,Bb)=>{var Nb=f2(),{shifts:Aq,parseTime:uM,getMealTypeByTime:Ro}=F1();function fo(){let p=Nb().tz("Europe/Brussels");return p.hours()*60+p.minutes()}function uo(p,c,e){let q=Nb().tz("Europe/Brussels").format("YYYY-MM-DD");if(e!==q)return p;console.log(`Applying stop time filter for today (${e})`);let W=c?.["general-settings"]||{},a=fo(),n=W.ontbijtStop||null,s=W.lunchStop||null,r=W.dinerStop||null,f=n?uM(n):null,g=s?uM(s):null,N=r?uM(r):null,u={},h=0,R=0,X=0;for(let B in p){if(!p.hasOwnProperty(B))continue;let l=Ro(B),E=false;l==="breakfast"&&f!==null&&!isNaN(f)&&a>=f?(E=true,h++):l==="lunch"&&g!==null&&!isNaN(g)&&a>=g?(E=true,R++):l==="dinner"&&N!==null&&!isNaN(N)&&a>=N&&(E=true,X++),E||(u[B]=p[B]);}return h>0&&console.log(`Stop time filter removed ${h} breakfast slots.`),R>0&&console.log(`Stop time filter removed ${R} lunch slots.`),X>0&&console.log(`Stop time filter removed ${X} dinner slots.`),u}Bb.exports={filterTimeblocksByStopTimes:uo};});var Tb=r0((qq,mb)=>{function lo(p){let c=parseInt(p.split(":")[0],10);return c>=4&&c<11?"breakfast":c>=11&&c<16?"lunch":c>=16&&c<23?"dinner":null}function Lo(p){if(!p)return null;if(p.$numberInt)return parseInt(p.$numberInt,10);if(typeof p=="number")return p;if(typeof p=="string"){let c=parseInt(p,10);return isNaN(c)?null:c}return null}function No(p,c,e){return p.filter(q=>q.date===c&&q.time===e).reduce((q,W)=>q+(parseInt(W.guests,10)||0),0)}function Bo(p,c,e,q,W){let a={};for(let[n,s]of Object.entries(e)){let r=lo(n);if(!r){a[n]=s;continue}let f=p[`max-arrivals-${r}`];if(!f){a[n]=s;continue}let g=Lo(f[n]);if(g===null){a[n]=s;continue}No(q,c,n)+W<=g&&(a[n]=s);}return a}mb.exports={filterTimeblocksByMaxArrivals:Bo};});var hb=r0((eq,gb)=>{function lM(p){let c=parseInt(p.split(":")[0],10);return c>=4&&c<11?"breakfast":c>=11&&c<16?"lunch":c>=16&&c<23?"dinner":null}function l0(p,...c){console.log(`[MaxGroupsFilter] ${p}`,...c);}function mo(p){if(p==null)return null;if(typeof p=="object"&&p!==null&&"$numberInt"in p){let c=parseInt(p.$numberInt,10);return isNaN(c)?null:c}if(typeof p=="number")return Number.isInteger(p)?p:null;if(typeof p=="string"){let c=parseInt(p,10);return isNaN(c)?null:c}return null}function To(p,c,e,q,W){l0(`--- Running MaxGroupsFilter for Date: ${c}, Guests: ${W} ---`);let a=Object.keys(p).filter(g=>g.startsWith("max-groups-"));l0("Received restaurantData max-group keys:",a.length>0?a:"None found");let n={},s=parseInt(W,10);if(isNaN(s)||s<=0)return l0(`Invalid guest count (${W}). Returning all ${Object.keys(e).length} input blocks unfiltered.`),e;let r=q.filter(g=>g.date===c);l0(`Relevant reservations on ${c}: ${r.length}`),l0(`Input timeblocks count: ${Object.keys(e).length}`);let f={};r.forEach(g=>{let N=lM(g.time);N&&(f[N]||(f[N]=[]),f[N].push(g));}),l0("Reservations grouped by meal type:",f);for(let[g,N]of Object.entries(e)){let u=lM(g);if(l0(`
8
8
  Checking Time: ${g} -> Determined Meal: ${u}`),!u){l0(` Time ${g} has no associated meal type. Keeping block.`),n[g]=N;continue}let h=`max-groups-${u}`,R=p[h];if(l0(` Looking for settings using key: "${h}"`),!R||typeof R!="object"){l0(` No settings found for key "${h}". Filter doesn't apply. Keeping block.`),n[g]=N;continue}l0(` Found settings for ${u}:`,JSON.stringify(R));let X=true,B=Object.keys(R).map(l=>parseInt(l,10)).filter(l=>!isNaN(l)&&l>0).sort((l,E)=>l-E);l0(` Defined numeric limit sizes to check for ${u}: [${B.join(", ")}]`);for(let l of B){let E=String(l);if(l0(` Checking Limit Condition: Groups of size >= ${l}`),s>=l){l0(` Applicable: Booking guests (${s}) >= Limit threshold (${l})`);let S=mo(R[E]);if(l0(` Max groups allowed for >=${l} is: ${S} (raw setting: ${JSON.stringify(R[E])})`),S===null||S<0){l0(` Skipping check: Invalid or non-positive max count defined for size ${l}.`);continue}let y=(f[u]||[]).filter(m=>{let w=parseInt(m.guests,10);return !isNaN(w)&&w>=l}).length;if(l0(` Count of existing groups >=${l} found in ${u}: ${y}`),y+1>S){l0(` *** VIOLATION DETECTED *** for limit >=${l}.`),l0(` (Existing Groups: ${y} + New Group: 1 = ${y+1}, which is > Max Allowed: ${S})`),l0(` Blocking time ${g} due to this violation.`),X=false;break}else l0(` OK: Limit for >=${l} not exceeded. (Existing: ${y} + New: 1 <= Max: ${S})`);}else l0(` Not Applicable: Booking guests (${s}) < Limit threshold (${l}). Skipping this check.`);}X?(l0(` \u2705 Result for time ${g}: ALLOWED (passed all applicable checks)`),n[g]=N):l0(` \u274C Result for time ${g}: BLOCKED (failed at least one limit check)`);}return l0(`--- MaxGroupsFilter Finished. Output timeblocks count: ${Object.keys(n).length} ---`),n}gb.exports={filterTimeblocksByMaxGroups:To,getMealType:lM};});var U1=r0((Wq,yb)=>{var go={...qM(),...s2(),...u2()},ho={...oM()},yo={...r2(),...h1()},vo={...Ab(),...L2(),...eM(),...iM(),...tM(),...fM(),...fb(),...F1(),...Lb()},So={...Xb(),...Tb(),...hb()};yb.exports={...go,...ho,...yo,...vo,...So};});var Qb=r0((hM,Vb)=>{(function(p,c){typeof hM=="object"&&typeof Vb<"u"&&typeof a2=="function"?c(d2()):typeof define=="function"&&define.amd?define(["../moment"],c):c(p.moment);})(hM,(function(p){var c="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),q=[/^jan/i,/^feb/i,/^(maart|mrt\.?)$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],W=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,a=p.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,s){return n?/-MMM-/.test(s)?e[n.month()]:c[n.month()]:c},monthsRegex:W,monthsShortRegex:W,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:q,longMonthsParse:q,shortMonthsParse:q,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xE9\xE9n minuut",mm:"%d minuten",h:"\xE9\xE9n uur",hh:"%d uur",d:"\xE9\xE9n dag",dd:"%d dagen",w:"\xE9\xE9n week",ww:"%d weken",M:"\xE9\xE9n maand",MM:"%d maanden",y:"\xE9\xE9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(n===1||n===8||n>=20?"ste":"de")},week:{dow:1,doy:4}});return a}));});function s0(p,{insertAt:c}={}){if(!p||typeof document>"u")return;let e=document.head||document.getElementsByTagName("head")[0],q=document.createElement("style");q.type="text/css",c==="top"&&e.firstChild?e.insertBefore(q,e.firstChild):e.appendChild(q),q.styleSheet?q.styleSheet.cssText=p:q.appendChild(document.createTextNode(p));}s0(`.new-reservation-page .value-selector{display:flex;flex-direction:column;gap:15px;margin-bottom:20px}.new-reservation-page .non-absolute{position:relative!important}.new-reservation-page .non-absolute:before{background:none}.new-reservation-page .predefined-values{display:flex;gap:10px}.new-reservation-page .predefined-value-button{flex:1;padding:10px;border:1px solid #ccc;border-radius:var(--border-radius);background-color:var(--color-white);cursor:pointer;font-size:1rem;transition:background-color .3s ease}.new-reservation-page .predefined-value-button.active,.new-reservation-page .predefined-value-button:hover{background-color:var(--color-blue);color:var(--color-white)}.new-reservation-page .slider-container{display:flex;align-items:center;gap:15px}.new-reservation-page .slider{flex:1;appearance:none;-webkit-appearance:none;height:5px;background:#ddd;border-radius:5px;outline:none}.new-reservation-page .slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:20px;height:20px;background:var(--color-blue);cursor:pointer;border-radius:50%}.new-reservation-page .value-input{width:80px;padding:10px;border:1px solid #ccc;border-radius:var(--border-radius);font-size:1rem}
9
9
  `);var MA=({setGuests:p,value:c,onChange:e})=>{let q=[1,2,3,"4+"],[W,a]=o0.useState(c||""),[n,s]=o0.useState(false),r=N=>{N==="4+"?(s(true),a(4),p(4),e({target:{name:"guests",value:4}})):(s(false),a(N),p(N),e({target:{name:"guests",value:N}}));},f=N=>{let u=N.target.value;a(u),p(u),e({target:{name:"guests",value:u}});},g=N=>{let u=N.target.value;a(u),p(u),e({target:{name:"guests",value:u}});};return o0__default.default.createElement("div",{className:"value-selector",translate:"no"},o0__default.default.createElement("div",{className:"predefined-values"},q.map(N=>o0__default.default.createElement("button",{key:N,type:"button",className:`predefined-value-button ${W==N||N==="4+"&&n?"active":""}`,onClick:()=>r(N)},N==="4+"?"4+":`${N} p`))),o0__default.default.createElement(framerMotion.AnimatePresence,null,n&&o0__default.default.createElement(framerMotion.motion.div,{className:"slider-container",initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0}},o0__default.default.createElement("input",{type:"range",min:"4",max:"15",step:"1",value:W,onChange:f,className:"slider non-absolute"}),o0__default.default.createElement("input",{type:"number",name:"guests",value:W,onChange:g,className:"value-input",min:"4",max:"100",step:"1"}))))},n2=MA;var s1=x0(b1());var yz=x0(b1()),vz=p=>{let c=(0, yz.default)().tz("Europe/Brussels").startOf("day");return p.clone().add(6,"days").endOf("day").isBefore(c)},Sz=(p,c)=>p.isSame(c,"day");s0(`.new-reservation-page .calendar-container{position:relative;width:100%}.new-reservation-page .calendar-container .calendar-display{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;user-select:none;text-align:left;border-radius:5px}.new-reservation-page .calendar-container .calendar-display span:first-child{flex-grow:1}.new-reservation-page .calendar-container .calendar{position:absolute;z-index:1000;width:100%;background-color:#fff;border:1px solid #ccc;margin-top:5px;padding:10px;border-radius:10px;animation:fadeInCalendar .3s ease-in-out;box-shadow:0 2px 10px #0000001a}@keyframes fadeInCalendar{0%{opacity:0}to{opacity:1}}.new-reservation-page .calendar-container .availability-hold-btn{font-size:10px}.new-reservation-page .calendar-container .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;gap:8px;flex-wrap:wrap}.new-reservation-page .calendar-container .calendar-header button{background-color:transparent;border:none;cursor:pointer;font-size:18px}.new-reservation-page .calendar-container .calendar-header span{font-size:15px;color:gray;font-weight:500}.new-reservation-page .calendar-container .calendar-weeks-wrapper{overflow:hidden;position:relative;width:100%}.new-reservation-page .calendar-container .calendar-table{width:100%;border-collapse:collapse}.new-reservation-page .calendar-container .calendar-table th,.new-reservation-page .calendar-container .calendar-table td{width:14.28%;text-align:center;padding:5px}.calendar-container .calendar-table th{color:#666;font-weight:400;padding-bottom:10px}.new-reservation-page .calendar-container .calendar-table td{vertical-align:middle;cursor:pointer;border:none;opacity:1;position:relative}.new-reservation-page .calendar-container .calendar-table td.empty-day{cursor:default}.new-reservation-page .calendar-container .calendar-table td:hover .day-square.available{transform:scale(1.05)}.new-reservation-page .calendar-container .day-square{position:relative;width:38px;height:38px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;flex-direction:column;transition:all .2s ease;font-size:16px;margin:0 auto}.new-reservation-page .calendar-container .day-number{line-height:1;z-index:2}.new-reservation-page .calendar-container .available .day-square{background-color:#cfc;color:#060}.new-reservation-page .calendar-container .available:hover .day-square{background-color:#b3ffb3}.new-reservation-page .calendar-container .available:active .day-square{background-color:#9f9}.new-reservation-page .calendar-container .unavailable .day-square{background-color:#8b000021;color:#8b0000}.new-reservation-page .calendar-container .gray-out .day-square{background-color:#e0e0e0;color:#999;cursor:not-allowed}.new-reservation-page .calendar-container .selected .day-square{background-color:#060;color:#cfc}.new-reservation-page .calendar-container .calendar-table td.unavailable,.new-reservation-page .calendar-container .calendar-table td.gray-out{cursor:not-allowed}.new-reservation-page .calendar-container .calendar-table td.unavailable:hover .day-square,.new-reservation-page .calendar-container .calendar-table td.gray-out:hover .day-square{transform:none}.new-reservation-page .calendar-container .calendar-table td{border:none}.new-reservation-page .calendar-container .arrow{margin-left:auto;color:gray;display:flex;align-items:center}.new-reservation-page .calendar-container .available .availability-badge{background:#38a169}.new-reservation-page .calendar-container .selected .availability-badge{background:#2d3748}@media screen and (max-width:900px){.calendar-container .day-square{width:35px!important;height:35px!important;font-size:15px!important}.calendar-container .calendar-header span{font-size:12px}.new-reservation-page .calendar-container .availability-toggle-btn{padding:5px 8px;font-size:11px}}
10
- `);var R1=x0(U1());var LM=class{constructor(c=6e4){this.cache=new Map,this.ttl=c;}generateKey(c,...e){return `${c}::${JSON.stringify(e)}`}get(c){let e=this.cache.get(c);return e?Date.now()-e.timestamp>this.ttl?(this.cache.delete(c),null):e.value:null}set(c,e){this.cache.set(c,{value:e,timestamp:Date.now()});}clear(){this.cache.clear();}cleanup(){let c=Date.now();for(let[e,q]of this.cache.entries())c-q.timestamp>this.ttl&&this.cache.delete(e);}},X2=new LM;setInterval(()=>X2.cleanup(),3e4);var O1=(p,c,...e)=>{let q=X2.generateKey(p,...e),W=X2.get(q);if(W!==null)return W;let a=c(...e);return X2.set(q,a),a};var a1={nl:{reservationStepOne:{errors:{openingHoursNotSet:"Openingstijden niet ingesteld.",clickHereToSet:"Klik hier om uw openingsuren in te stellen."},modes:{withLimits:"Met Limieten",unlimited:"Onbeperkt",openingHours:"Openingsuren",free:"Vrij"},fields:{time:"Tijd"},messages:{searchingTables:"Beschikbare tafels zoeken...",noTablesAvailable:"Geen specifieke tafels beschikbaar voor deze selectie."},warnings:{unlimitedMode:"Onbeperkt zal geen rekening houden met maximum limieten."}},calendar:{selectDatePlaceholder:"Selecteer een datum",today:"Vandaag",tomorrow:"Morgen",prevWeek:"Vorige week",nextWeek:"Volgende week",dayHeaders:["Ma","Di","Wo","Do","Vr","Za","Zo"],seatsQuestion:"Zitplaatsen?"},timeSelector:{shifts:{breakfast:"Ontbijt",lunch:"Lunch",dinner:"Diner"},selectMeal:"Selecteer een maaltijd",selectTime:"Selecteer een tijd",noDateSelected:"Selecteer eerst een datum.",noTimes:"Geen beschikbare tijden.",back:"Terug",reservations:"Reservaties",guests:"Gasten"},tableSelector:{label:"Selecteer beschikbare tafel(s):",table:"Tafel",max:"Max",noTables:"Geen specifieke tafels beschikbaar voor deze tijd/gasten combinatie.",manual:"Handmatig"}},en:{reservationStepOne:{errors:{openingHoursNotSet:"Opening hours not set.",clickHereToSet:"Click here to set your opening hours."},modes:{withLimits:"With Limits",unlimited:"Unlimited",openingHours:"Opening Hours",free:"Free"},fields:{time:"Time"},messages:{searchingTables:"Searching for available tables...",noTablesAvailable:"No specific tables available for this selection."},warnings:{unlimitedMode:"Unlimited will not take into account maximum limits."}},calendar:{selectDatePlaceholder:"Select a date",today:"Today",tomorrow:"Tomorrow",prevWeek:"Previous week",nextWeek:"Next week",dayHeaders:["M","T","W","T","F","S","S"],seatsQuestion:"Seating?"},timeSelector:{shifts:{breakfast:"Breakfast",lunch:"Lunch",dinner:"Dinner"},selectMeal:"Select a meal",selectTime:"Select a time",noDateSelected:"Please select a date first.",noTimes:"No available times.",back:"Back",reservations:"Reservations",guests:"Guests"},tableSelector:{label:"Select available table(s):",table:"Table",max:"Max",noTables:"No specific tables available for this time/guest combination.",manual:"Manual"}},fr:{reservationStepOne:{errors:{openingHoursNotSet:"Horaires non d\xE9finies.",clickHereToSet:"Cliquez ici pour d\xE9finir vos horaires."},modes:{withLimits:"Avec Limites",unlimited:"Illimit\xE9",openingHours:"Horaires",free:"Libre"},fields:{time:"Heure"},messages:{searchingTables:"Recherche de tables disponibles...",noTablesAvailable:"Aucune table sp\xE9cifique disponible pour cette s\xE9lection."},warnings:{unlimitedMode:"Illimit\xE9 ne tiendra pas compte des limites maximales."}},calendar:{selectDatePlaceholder:"S\xE9lectionnez une date",today:"Aujourd'hui",tomorrow:"Demain",prevWeek:"Semaine pr\xE9c\xE9dente",nextWeek:"Semaine suivante",dayHeaders:["Lu","Ma","Me","Je","Ve","Sa","Di"],seatsQuestion:"Places ?"},timeSelector:{shifts:{breakfast:"Petit-d\xE9jeuner",lunch:"D\xE9jeuner",dinner:"D\xEEner"},selectMeal:"S\xE9lectionnez un repas",selectTime:"S\xE9lectionnez une heure",noDateSelected:"Veuillez d'abord s\xE9lectionner une date.",noTimes:"Aucun horaire disponible.",back:"Retour",reservations:"R\xE9servations",guests:"Convives"},tableSelector:{label:"S\xE9lectionnez les table(s) disponibles :",table:"Table",max:"Max",noTables:"Aucune table sp\xE9cifique disponible pour cette combinaison temps/convives.",manual:"Manuel"}}};var Eb=o0.memo(({guests:p,selectedDate:c,onSelectDate:e,autoExpand:q,reservationMode:W,restaurantData:a,startDate:n,onWeekChange:s,reservations:r,giftcard:f,zitplaats:g,isAdmin:N=false})=>{let u=localStorage.getItem("preferredLanguage")||"nl",h=a1[u].calendar,[R,X]=o0.useState(q||false),[B,l]=o0.useState(false),E=o0.useRef(null),S=o0.useRef(null),v=(0, s1.default)().tz("Europe/Amsterdam").add(1,"year").endOf("day");o0.useEffect(()=>{q&&X(true);},[q]),o0.useEffect(()=>{let _=V=>{E.current&&!E.current.contains(V.target)&&(X(false),l(false));};return document.addEventListener("mousedown",_),()=>{document.removeEventListener("mousedown",_);}},[]),o0.useEffect(()=>()=>{S.current&&(clearTimeout(S.current),S.current=null);},[]);let y=()=>{S.current&&(clearTimeout(S.current),S.current=null),l(true);},m=(_=1e3)=>{S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{l(false),S.current=null;},_);},w=o0.useCallback((_,V,p0=[])=>{if(_.isBefore(V,"day")||_.isAfter(v,"day"))return 0;let I=_.format("YYYY-MM-DD");if(W==="vrije_keuze")return 21;if(W!=="met_limieten"&&!B)return (0, R1.isDateAvailable)(a,I,r,-1e4,p0,null,N)?21:0;let $=a?.["table-settings"]||{},c0=$.isInstalled===true&&$.assignmentMode==="automatic"&&(B||W==="met_limieten"),D=Z=>c0?O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,I,r,Z,p0,null,N):O1("isDateAvailable",R1.isDateAvailable,a,I,r,Z,p0,null,N);if(!D(1))return 0;if(D(21))return 21;let d0=1,J=21,G=1;for(;d0<=J;){let Z=Math.floor((d0+J)/2);D(Z)?(G=Z,d0=Z+1):J=Z-1;}return G},[a,r,f,N,W,B]),P=o0.useMemo(()=>{if(!R)return [];let _=[],V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=n||V,I=a?.["blocked-slots"]||[],$=p0.clone().startOf("month"),c0=p0.clone().endOf("month"),D=a?.["table-settings"]||{},d0=D.isInstalled===true&&D.assignmentMode==="automatic"&&W==="met_limieten",J=$.clone();for(;J.isSameOrBefore(c0,"day");){let G=J.format("YYYY-MM-DD"),Z;if(W==="vrije_keuze")Z=J.isBetween(V,v,null,"[]");else {let H0=W!=="met_limieten"?-1e4:p,A1=W==="met_limieten"?f:null;d0?Z=O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,G,r,H0,I,A1,N):Z=O1("isDateAvailable",R1.isDateAvailable,a,G,r,H0,I,A1,N);}let D0=w(J,V,I);_.push({date:J.clone(),isPast:J.isBefore(V,"day"),isFuture:J.isAfter(v,"day"),isAvailable:Z,maxGuestsAvailable:D0}),J.add(1,"day");}return _},[R,n,p,W,a,r,f,g,B,N]),x=_=>{_.isAvailable&&!_.isPast&&!_.isFuture&&(e(_.date.format("YYYY-MM-DD")),X(false),l(false));},z0=()=>{let _=n.clone().subtract(1,"month").startOf("month"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day");if(_.clone().endOf("month").isBefore(V,"day")){console.log("Cannot go to previous month. It is in the past.");return}s(_);},q0=()=>{let _=n.clone().add(1,"month").startOf("month");s(_);},R0=()=>{if(!c)return h.selectDatePlaceholder;let _=(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam").startOf("day"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=V.clone().add(1,"day");return _.isSame(V,"day")?h.today:_.isSame(p0,"day")?h.tomorrow:_.format("dddd D MMMM YYYY")},Q=n?(_=>{let p0=n.clone().startOf("month").day(),I=p0===0?6:p0-1,$=[];for(let J=0;J<I;J++)$.push(null);$.push(..._);let c0=$.length,D=Math.ceil(c0/7);for(;$.length<D*7;)$.push(null);let d0=[];for(let J=0;J<D;J++){let G=$.slice(J*7,J*7+7);d0.push(G);}return d0})(P):[],K=h.dayHeaders,b0=_=>_>=21?"20+":String(_);return o0__default.default.createElement("div",{className:"calendar-container",ref:E},o0__default.default.createElement("div",{className:"calendar-display",onClick:()=>X(!R)},o0__default.default.createElement("span",null,R0()),o0__default.default.createElement("span",{className:"arrow"},o0__default.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",style:{transform:R?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s"}},o0__default.default.createElement("path",{d:"M7 10l5 5 5-5",fill:"none",stroke:"currentColor",strokeWidth:"2"})))),R&&n&&o0__default.default.createElement("div",{className:"calendar"},o0__default.default.createElement("div",{className:"calendar-header"},o0__default.default.createElement("button",{type:"button",onClick:z0,"aria-label":h.prevWeek},"<"),o0__default.default.createElement("span",null,n.format("MMMM YYYY")),o0__default.default.createElement("button",{type:"button",onClick:q0,"aria-label":h.nextWeek},">"),o0__default.default.createElement("button",{type:"button",className:`availability-hold-btn ${B?"active":""}`,"aria-pressed":B,"aria-label":"Houd ingedrukt om beschikbaarheden te tonen",onMouseDown:y,onMouseUp:()=>m(1e3),onMouseLeave:()=>m(1e3),onTouchStart:y,onTouchEnd:()=>m(1e3),onTouchCancel:()=>m(1e3),onKeyDown:_=>{(_.key===" "||_.key==="Enter")&&y();},onKeyUp:_=>{(_.key===" "||_.key==="Enter")&&m(1e3);},style:{fontSize:"15px",color:"gray",fontWeight:"450",textDecoration:"underline"}},h.seatsQuestion)),o0__default.default.createElement("div",{className:"calendar-weeks-wrapper"},o0__default.default.createElement("table",{className:"calendar-table"},o0__default.default.createElement("thead",null,o0__default.default.createElement("tr",{translate:"no"},K.map((_,V)=>o0__default.default.createElement("th",{key:V},_)))),o0__default.default.createElement("tbody",null,Q.map((_,V)=>o0__default.default.createElement("tr",{key:V,translate:"no"},_.map((p0,I)=>{if(!p0)return o0__default.default.createElement("td",{key:I,className:"empty-day"});let $=c&&Sz(p0.date,(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam")),c0=[];return p0.isPast?c0.push("gray-out"):p0.isAvailable?c0.push("available"):c0.push("unavailable"),$&&c0.push("selected"),o0__default.default.createElement("td",{key:I,className:c0.join(" "),onClick:()=>x(p0),style:{"--animation-order":I+V*7}},o0__default.default.createElement("div",{className:`day-square ${B?"showing-availabilities":""}`},o0__default.default.createElement("span",{className:"day-number"},B?b0(p0.maxGuestsAvailable):p0.date.date())))}))))))))});Eb.displayName="Calendar";var Cb=Eb;var BM=x0(b1()),wo=({guests:p,formData:c,handleChange:e,resetFormDataFields:q,restaurantData:W,reservations:a,startDate:n,onWeekChange:s,reservationMode:r,isAdmin:f=false})=>{let g=u=>{let h=(0, BM.default)(u).format("YYYY-MM-DD");console.log("Selected date:",h),e({target:{name:"date",value:h}}),q(["time"]);},N=n?n.clone().startOf("month"):(0, BM.default)().startOf("month");return o0__default.default.createElement("div",{className:"form-group date-selector-container"},o0__default.default.createElement(Cb,{guests:p,selectedDate:c.date||null,onSelectDate:g,autoExpand:false,reservationMode:r,restaurantData:W,startDate:N,onWeekChange:s,reservations:a,giftcard:c.giftcard,zitplaats:c.zitplaats,isAdmin:f}))},xb=wo;s0(`.new-reservation-page .time-selector-container{position:relative}.new-reservation-page .time-display{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;user-select:none;text-align:left;border-radius:5px}.new-reservation-page .time-display span:first-child{flex-grow:1}.new-reservation-page .time-selector{position:absolute;z-index:1000;width:100%;max-height:350px;overflow-y:auto;background-color:#fff;border:1px solid #ccc;padding:55px 10px 10px;border-radius:10px;animation:fadeInTimeSelector .3s ease-in-out;top:75px}.new-reservation-page .time-toggle-container{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;padding:10px;background-color:#fff;border-radius:10px 10px 0 0;z-index:1;border-bottom:1px solid #eee}.new-reservation-page .time-toggle-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:20px;border:1px solid #ddd;background-color:#f5f5f5;color:#666;font-size:13px;cursor:pointer;transition:all .2s ease;font-family:inherit}.new-reservation-page .time-toggle-btn:hover{background-color:#e8e8e8;border-color:#ccc}.new-reservation-page .time-toggle-btn.active{background-color:var(--color-blue, #48aaaf);border-color:var(--color-blue, #48aaaf);color:#fff}.new-reservation-page .time-toggle-btn.active:hover{background-color:var(--color-blue, #48aaaf);filter:brightness(.95)}.new-reservation-page .time-toggle-btn svg{flex-shrink:0}.new-reservation-page .time-count{font-weight:400;opacity:.9}@keyframes fadeInTimeSelector{0%{opacity:0}to{opacity:1}}.new-reservation-page .time-period{margin-bottom:15px}.new-reservation-page .time-period-label{font-weight:700;margin-bottom:5px}.new-reservation-page .time-options{display:flex;flex-wrap:wrap;gap:5px}.new-reservation-page .time-option{padding:8px 12px;background-color:#cfc;color:#060;border-radius:5px;cursor:pointer;transition:background-color .2s ease}.new-reservation-page .time-option:hover{background-color:#b3ffb3}.new-reservation-page .time-option.selected{background-color:#060;color:#cfc}.new-reservation-page .info-text{color:#666;font-style:italic}.new-reservation-page .arrow{margin-left:auto;color:gray;display:flex;align-items:center}@media screen and (max-width:480px){.new-reservation-page .time-option{padding:6px 10px;font-size:14px}.new-reservation-page .time-toggle-btn{padding:5px 10px;font-size:12px;gap:4px}.new-reservation-page .time-toggle-btn svg{width:12px;height:12px}}
10
+ `);var R1=x0(U1());var LM=class{constructor(c=6e4){this.cache=new Map,this.ttl=c;}generateKey(c,...e){return `${c}::${JSON.stringify(e)}`}get(c){let e=this.cache.get(c);return e?Date.now()-e.timestamp>this.ttl?(this.cache.delete(c),null):e.value:null}set(c,e){this.cache.set(c,{value:e,timestamp:Date.now()});}clear(){this.cache.clear();}cleanup(){let c=Date.now();for(let[e,q]of this.cache.entries())c-q.timestamp>this.ttl&&this.cache.delete(e);}},X2=new LM;setInterval(()=>X2.cleanup(),3e4);var O1=(p,c,...e)=>{let q=X2.generateKey(p,...e),W=X2.get(q);if(W!==null)return W;let a=c(...e);return X2.set(q,a),a};var a1={nl:{reservationStepOne:{errors:{openingHoursNotSet:"Openingstijden niet ingesteld.",clickHereToSet:"Klik hier om uw openingsuren in te stellen."},modes:{withLimits:"Met Limieten",unlimited:"Onbeperkt",openingHours:"Openingsuren",free:"Vrij"},fields:{time:"Tijd"},messages:{searchingTables:"Beschikbare tafels zoeken...",noTablesAvailable:"Geen specifieke tafels beschikbaar voor deze selectie."},warnings:{unlimitedMode:"Onbeperkt zal geen rekening houden met maximum limieten."}},calendar:{selectDatePlaceholder:"Selecteer een datum",today:"Vandaag",tomorrow:"Morgen",prevWeek:"Vorige week",nextWeek:"Volgende week",dayHeaders:["Ma","Di","Wo","Do","Vr","Za","Zo"],seatsQuestion:"Zitplaatsen?"},timeSelector:{shifts:{breakfast:"Ontbijt",lunch:"Lunch",dinner:"Diner"},selectMeal:"Selecteer een maaltijd",selectTime:"Selecteer een tijd",noDateSelected:"Selecteer eerst een datum.",noTimes:"Geen beschikbare tijden.",back:"Terug",reservations:"Reservaties",guests:"Gasten"},tableSelector:{label:"Selecteer beschikbare tafel(s):",table:"Tafel",max:"Max",noTables:"Geen specifieke tafels beschikbaar voor deze tijd/gasten combinatie.",manual:"Handmatig"}},en:{reservationStepOne:{errors:{openingHoursNotSet:"Opening hours not set.",clickHereToSet:"Click here to set your opening hours."},modes:{withLimits:"With Limits",unlimited:"Unlimited",openingHours:"Opening Hours",free:"Free"},fields:{time:"Time"},messages:{searchingTables:"Searching for available tables...",noTablesAvailable:"No specific tables available for this selection."},warnings:{unlimitedMode:"Unlimited will not take into account maximum limits."}},calendar:{selectDatePlaceholder:"Select a date",today:"Today",tomorrow:"Tomorrow",prevWeek:"Previous week",nextWeek:"Next week",dayHeaders:["M","T","W","T","F","S","S"],seatsQuestion:"Seating?"},timeSelector:{shifts:{breakfast:"Breakfast",lunch:"Lunch",dinner:"Dinner"},selectMeal:"Select a meal",selectTime:"Select a time",noDateSelected:"Please select a date first.",noTimes:"No available times.",back:"Back",reservations:"Reservations",guests:"Guests"},tableSelector:{label:"Select available table(s):",table:"Table",max:"Max",noTables:"No specific tables available for this time/guest combination.",manual:"Manual"}},fr:{reservationStepOne:{errors:{openingHoursNotSet:"Horaires non d\xE9finies.",clickHereToSet:"Cliquez ici pour d\xE9finir vos horaires."},modes:{withLimits:"Avec Limites",unlimited:"Illimit\xE9",openingHours:"Horaires",free:"Libre"},fields:{time:"Heure"},messages:{searchingTables:"Recherche de tables disponibles...",noTablesAvailable:"Aucune table sp\xE9cifique disponible pour cette s\xE9lection."},warnings:{unlimitedMode:"Illimit\xE9 ne tiendra pas compte des limites maximales."}},calendar:{selectDatePlaceholder:"S\xE9lectionnez une date",today:"Aujourd'hui",tomorrow:"Demain",prevWeek:"Semaine pr\xE9c\xE9dente",nextWeek:"Semaine suivante",dayHeaders:["Lu","Ma","Me","Je","Ve","Sa","Di"],seatsQuestion:"Places ?"},timeSelector:{shifts:{breakfast:"Petit-d\xE9jeuner",lunch:"D\xE9jeuner",dinner:"D\xEEner"},selectMeal:"S\xE9lectionnez un repas",selectTime:"S\xE9lectionnez une heure",noDateSelected:"Veuillez d'abord s\xE9lectionner une date.",noTimes:"Aucun horaire disponible.",back:"Retour",reservations:"R\xE9servations",guests:"Convives"},tableSelector:{label:"S\xE9lectionnez les table(s) disponibles :",table:"Table",max:"Max",noTables:"Aucune table sp\xE9cifique disponible pour cette combinaison temps/convives.",manual:"Manuel"}}};var Eb=o0.memo(({guests:p,selectedDate:c,onSelectDate:e,autoExpand:q,reservationMode:W,restaurantData:a,startDate:n,onWeekChange:s,reservations:r,giftcard:f,zitplaats:g,isAdmin:N=false})=>{let u=localStorage.getItem("preferredLanguage")||"nl",h=a1[u].calendar,[R,X]=o0.useState(q||false),[B,l]=o0.useState(false),E=o0.useRef(null),S=o0.useRef(null),v=(0, s1.default)().tz("Europe/Amsterdam").add(1,"year").endOf("day");o0.useEffect(()=>{q&&X(true);},[q]),o0.useEffect(()=>{let _=V=>{E.current&&!E.current.contains(V.target)&&(X(false),l(false));};return document.addEventListener("mousedown",_),()=>{document.removeEventListener("mousedown",_);}},[]),o0.useEffect(()=>()=>{S.current&&(clearTimeout(S.current),S.current=null);},[]);let y=()=>{S.current&&(clearTimeout(S.current),S.current=null),l(true);},m=(_=1e3)=>{S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{l(false),S.current=null;},_);},w=o0.useCallback((_,V,p0=[])=>{if(_.isBefore(V,"day")||_.isAfter(v,"day"))return 0;let I=_.format("YYYY-MM-DD");if(W==="vrije_keuze")return 21;if(W!=="met_limieten"&&!B)return (0, R1.isDateAvailable)(a,I,r,-1e4,p0,null,N)?21:0;let $=a?.["table-settings"]||{},c0=$.isInstalled===true&&$.assignmentMode==="automatic"&&(B||W==="met_limieten"),D=Z=>c0?O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,I,r,Z,p0,null,N):O1("isDateAvailable",R1.isDateAvailable,a,I,r,Z,p0,null,N);if(!D(1))return 0;if(D(21))return 21;let d0=1,J=21,G=1;for(;d0<=J;){let Z=Math.floor((d0+J)/2);D(Z)?(G=Z,d0=Z+1):J=Z-1;}return G},[a,r,f,N,W,B]),P=o0.useMemo(()=>{if(!R)return [];let _=[],V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=n||V,I=a?.["blocked-slots"]||[],$=p0.clone().startOf("month"),c0=p0.clone().endOf("month"),D=a?.["table-settings"]||{},d0=D.isInstalled===true&&D.assignmentMode==="automatic"&&W==="met_limieten",J=$.clone();for(;J.isSameOrBefore(c0,"day");){let G=J.format("YYYY-MM-DD"),Z;if(W==="vrije_keuze")Z=J.isBetween(V,v,null,"[]");else {let H0=W!=="met_limieten"?-1e4:p,A1=W==="met_limieten"?f:null;d0?Z=O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,G,r,H0,I,A1,N):Z=O1("isDateAvailable",R1.isDateAvailable,a,G,r,H0,I,A1,N);}let D0=w(J,V,I);_.push({date:J.clone(),isPast:J.isBefore(V,"day"),isFuture:J.isAfter(v,"day"),isAvailable:Z,maxGuestsAvailable:D0}),J.add(1,"day");}return _},[R,n,p,W,a,r,f,g,B,N]),x=_=>{_.isAvailable&&!_.isPast&&!_.isFuture&&(e(_.date.format("YYYY-MM-DD")),X(false),l(false));},z0=()=>{let _=n.clone().subtract(1,"month").startOf("month"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day");if(_.clone().endOf("month").isBefore(V,"day")){console.log("Cannot go to previous month. It is in the past.");return}s(_);},q0=()=>{let _=n.clone().add(1,"month").startOf("month");s(_);},R0=()=>{if(!c)return h.selectDatePlaceholder;let _=(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam").startOf("day"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=V.clone().add(1,"day");return _.isSame(V,"day")?h.today:_.isSame(p0,"day")?h.tomorrow:_.format("dddd D MMMM YYYY")},Q=n?(_=>{let p0=n.clone().startOf("month").day(),I=p0===0?6:p0-1,$=[];for(let J=0;J<I;J++)$.push(null);$.push(..._);let c0=$.length,D=Math.ceil(c0/7);for(;$.length<D*7;)$.push(null);let d0=[];for(let J=0;J<D;J++){let G=$.slice(J*7,J*7+7);d0.push(G);}return d0})(P):[],K=h.dayHeaders,b0=_=>_>=21?"20+":String(_);return o0__default.default.createElement("div",{className:"calendar-container",ref:E},o0__default.default.createElement("div",{className:"calendar-display",onClick:()=>X(!R)},o0__default.default.createElement("span",null,R0()),o0__default.default.createElement("span",{className:"arrow"},o0__default.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",style:{transform:R?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s"}},o0__default.default.createElement("path",{d:"M7 10l5 5 5-5",fill:"none",stroke:"currentColor",strokeWidth:"2"})))),R&&n&&o0__default.default.createElement("div",{className:"calendar"},o0__default.default.createElement("div",{className:"calendar-header"},o0__default.default.createElement("button",{type:"button",onClick:z0,"aria-label":h.prevWeek},"<"),o0__default.default.createElement("span",null,n.format("MMMM YYYY")),o0__default.default.createElement("button",{type:"button",onClick:q0,"aria-label":h.nextWeek},">"),o0__default.default.createElement("button",{type:"button",className:`availability-hold-btn ${B?"active":""}`,"aria-pressed":B,"aria-label":"Houd ingedrukt om beschikbaarheden te tonen",onMouseDown:y,onMouseUp:()=>m(1e3),onMouseLeave:()=>m(1e3),onTouchStart:y,onTouchEnd:()=>m(1e3),onTouchCancel:()=>m(1e3),onKeyDown:_=>{(_.key===" "||_.key==="Enter")&&y();},onKeyUp:_=>{(_.key===" "||_.key==="Enter")&&m(1e3);},style:{fontSize:"15px",color:"gray",fontWeight:"450",textDecoration:"underline"}},h.seatsQuestion)),o0__default.default.createElement("div",{className:"calendar-weeks-wrapper"},o0__default.default.createElement("table",{className:"calendar-table"},o0__default.default.createElement("thead",null,o0__default.default.createElement("tr",{translate:"no"},K.map((_,V)=>o0__default.default.createElement("th",{key:V},_)))),o0__default.default.createElement("tbody",null,Q.map((_,V)=>o0__default.default.createElement("tr",{key:V,translate:"no"},_.map((p0,I)=>{if(!p0)return o0__default.default.createElement("td",{key:I,className:"empty-day"});let $=c&&Sz(p0.date,(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam")),c0=[];return p0.isPast?c0.push("gray-out"):p0.isAvailable?c0.push("available"):c0.push("unavailable"),$&&c0.push("selected"),o0__default.default.createElement("td",{key:I,className:c0.join(" "),onClick:()=>x(p0),style:{"--animation-order":I+V*7}},o0__default.default.createElement("div",{className:`day-square ${B?"showing-availabilities":""}`},o0__default.default.createElement("span",{className:"day-number"},B?b0(p0.maxGuestsAvailable):p0.date.date())))}))))))))});Eb.displayName="Calendar";var Cb=Eb;var BM=x0(b1()),wo=({guests:p,formData:c,handleChange:e,resetFormDataFields:q,restaurantData:W,reservations:a,startDate:n,onWeekChange:s,reservationMode:r,isAdmin:f=false})=>{let g=u=>{let h=(0, BM.default)(u).format("YYYY-MM-DD");console.log("Selected date:",h),e({target:{name:"date",value:h}}),q(["time"]);},N=n?n.clone().startOf("month"):(0, BM.default)().startOf("month");return o0__default.default.createElement("div",{className:"form-group date-selector-container"},o0__default.default.createElement(Cb,{guests:p,selectedDate:c.date||null,onSelectDate:g,autoExpand:false,reservationMode:r,restaurantData:W,startDate:N,onWeekChange:s,reservations:a,giftcard:c.giftcard,zitplaats:c.zitplaats,isAdmin:f}))},xb=wo;s0(`.new-reservation-page .time-selector-container{position:relative}.new-reservation-page .time-display{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;user-select:none;text-align:left;border-radius:5px}.new-reservation-page .time-display span:first-child{flex-grow:1}.new-reservation-page .time-selector{position:absolute;z-index:1000;width:100%;max-height:350px;overflow-y:auto;background-color:#fff;border:1px solid #ccc;padding:10px;border-radius:10px;animation:fadeInTimeSelector .3s ease-in-out;top:75px}.new-reservation-page .time-toggle-container{display:flex;gap:8px;padding-bottom:10px;margin-bottom:10px;border-bottom:1px solid #eee}.new-reservation-page .time-toggle-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:20px;border:1px solid #ddd;background-color:#f5f5f5;color:#666;font-size:13px;cursor:pointer;transition:all .2s ease;font-family:inherit}.new-reservation-page .time-toggle-btn:hover{background-color:#e8e8e8;border-color:#ccc}.new-reservation-page .time-toggle-btn.active{background-color:var(--color-blue, #48aaaf);border-color:var(--color-blue, #48aaaf);color:#fff}.new-reservation-page .time-toggle-btn.active:hover{background-color:var(--color-blue, #48aaaf);filter:brightness(.95)}.new-reservation-page .time-toggle-btn svg{flex-shrink:0}.new-reservation-page .time-count{font-weight:400;opacity:.9}@keyframes fadeInTimeSelector{0%{opacity:0}to{opacity:1}}.new-reservation-page .time-period{margin-bottom:15px}.new-reservation-page .time-period-label{font-weight:700;margin-bottom:5px}.new-reservation-page .time-options{display:flex;flex-wrap:wrap;gap:5px}.new-reservation-page .time-option{padding:8px 12px;background-color:#cfc;color:#060;border-radius:5px;cursor:pointer;transition:background-color .2s ease}.new-reservation-page .time-option:hover{background-color:#b3ffb3}.new-reservation-page .time-option.selected{background-color:#060;color:#cfc}.new-reservation-page .info-text{color:#666;font-style:italic}.new-reservation-page .arrow{margin-left:auto;color:gray;display:flex;align-items:center}@media screen and (max-width:480px){.new-reservation-page .time-option{padding:6px 10px;font-size:14px}.new-reservation-page .time-toggle-btn{padding:5px 10px;font-size:12px;gap:4px}.new-reservation-page .time-toggle-btn svg{width:12px;height:12px}}
11
11
  `);var XM=x0(b1());var T2=x0(U1()),Db=o0.memo(({guests:p,formData:c,handleChange:e,field:q,selectedDate:W,expanded:a,setCurrentExpandedField:n,restaurantData:s,reservations:r,reservationMode:f,isAdmin:g=false})=>{let N=localStorage.getItem("preferredLanguage")||"nl",u=a1[N].timeSelector,[h,R]=o0.useState(a||false),[X,B]=o0.useState([]),[l,E]=o0.useState(null),[S,v]=o0.useState(null),y=o0.useRef(null),m=o0.useMemo(()=>{if(!r||!W)return {};let F={};return r.forEach(Q=>{if((Q.date||Q.datum)!==W)return;let b0=Q.time||Q.tijd;if(!b0)return;let _=Q.guests||Q.antal||Q.gasten||1;F[b0]||(F[b0]={reservations:0,guests:0}),F[b0].reservations+=1,F[b0].guests+=_;}),F},[r,W]),w=F=>m[F]||{reservations:0,guests:0},P=F=>{v(S===F?null:F);},x={breakfast:{start:"07:00",end:"11:00",label:u.shifts.breakfast},lunch:{start:"11:00",end:"16:00",label:u.shifts.lunch},dinner:{start:"16:00",end:"23:00",label:u.shifts.dinner}};o0.useEffect(()=>{if(!W||!p){B([]);return}if(f==="vrije_keuze")if(l){let F=x[l],Q=XM.default.tz(`${W} ${F.start}`,"YYYY-MM-DD HH:mm","Europe/Brussels"),K=XM.default.tz(`${W} ${F.end}`,"YYYY-MM-DD HH:mm","Europe/Brussels"),b0=[],_=Q.clone();for(;_.isBefore(K);)b0.push({value:_.format("HH:mm"),label:_.format("HH:mm")}),_.add(15,"minutes");B(b0);}else B([]);else if(s&&r){let F=f!=="met_limieten"?-1e4:p,Q=s?.["table-settings"]||{},K=f==="met_limieten"&&Q.isInstalled===true&&Q.assignmentMode==="automatic",b0=f==="met_limieten"?c.giftcard:null,_=s?.["blocked-slots"]||[],V=(0, T2.getAvailableTimeblocks)(s,W,r,F,_,b0,g,c.duration),p0=K?(0, T2.getAvailableTimeblocksWithTableCheck)(s,W,V,F,r,c.duration):V,I=Object.keys(p0).map($=>({value:$,label:p0[$].name||$}));I.sort(($,c0)=>{let[D,d0]=$.value.split(":").map(Number),[J,G]=c0.value.split(":").map(Number);return D*60+d0-(J*60+G)}),B(I),c[q.id]&&!I.some($=>$.value===c[q.id])&&e({target:{name:q.id,value:""}});}else B([]);},[W,p,s,r,f,q.id,l,c[q.id],e]),o0.useEffect(()=>{f==="vrije_keuze"&&(E(null),c[q.id]&&e({target:{name:q.id,value:""}}));},[W,f]);let z0=F=>{e({target:{name:q.id,value:F}}),R(false),n?.(null);},q0=F=>{l!==F&&c[q.id]&&e({target:{name:q.id,value:""}}),E(F);},R0=()=>{if(f==="vrije_keuze")return l?c[q.id]?`${x[l].label} \u2013 ${c[q.id]}`:`${x[l].label} \u2013 ${u.selectTime}`:u.selectMeal;if(c[q.id]){let F=X.find(Q=>Q.value===c[q.id]);return F?F.label:u.selectTime}return u.selectTime};return q?o0__default.default.createElement("div",{className:"form-group time-selector-container",ref:y},W?o0__default.default.createElement(o0__default.default.Fragment,null,o0__default.default.createElement("div",{className:"time-display",onClick:()=>{R(!h),h||n?.(q.id);}},o0__default.default.createElement("span",null,R0()),o0__default.default.createElement("span",{className:"arrow"},o0__default.default.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",style:{transform:h?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s"}},o0__default.default.createElement("path",{d:"M7 10l5 5 5-5",fill:"none",stroke:"currentColor",strokeWidth:"2"})))),h&&o0__default.default.createElement("div",{className:"time-selector"},o0__default.default.createElement("div",{className:"time-toggle-container"},o0__default.default.createElement("button",{className:`time-toggle-btn ${S==="reservations"?"active":""}`,onClick:()=>P("reservations"),type:"button"},o0__default.default.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},o0__default.default.createElement("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),o0__default.default.createElement("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),o0__default.default.createElement("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),o0__default.default.createElement("line",{x1:"3",y1:"10",x2:"21",y2:"10"})),u.reservations),o0__default.default.createElement("button",{className:`time-toggle-btn ${S==="guests"?"active":""}`,onClick:()=>P("guests"),type:"button"},o0__default.default.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},o0__default.default.createElement("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),o0__default.default.createElement("circle",{cx:"9",cy:"7",r:"4"}),o0__default.default.createElement("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),o0__default.default.createElement("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})),u.guests)),f==="vrije_keuze"?l?o0__default.default.createElement("div",{className:"time-period"},o0__default.default.createElement("div",{className:"time-period-label"},x[l].label,o0__default.default.createElement("button",{onClick:()=>E(null),style:{marginLeft:"10px",background:"none",border:"none",cursor:"pointer",color:"#006600",fontSize:"0.9rem",padding:0}},"\u2190 ",u.back)),o0__default.default.createElement("div",{className:"time-options"},X.length===0?o0__default.default.createElement("div",{className:"no-times"},u.noTimes):X.map(F=>{let Q=w(F.value);return o0__default.default.createElement("div",{key:F.value,className:`time-option ${c[q.id]===F.value?"selected":""}`,onClick:()=>z0(F.value)},F.label,S==="reservations"&&Q.reservations>0&&o0__default.default.createElement("span",{className:"time-count"}," - ",Q.reservations),S==="guests"&&Q.guests>0&&o0__default.default.createElement("span",{className:"time-count"}," - ",Q.guests,"p"))}))):o0__default.default.createElement("div",{className:"time-options"},Object.keys(x).map(F=>o0__default.default.createElement("div",{key:F,className:`time-option ${l===F?"selected":""}`,onClick:()=>q0(F)},x[F].label))):o0__default.default.createElement("div",{className:"time-options"},X.length===0?o0__default.default.createElement("div",{className:"no-times"},u.noTimes):X.map(F=>{let Q=w(F.value);return o0__default.default.createElement("div",{key:F.value,className:`time-option ${c[q.id]===F.value?"selected":""}`,onClick:()=>z0(F.value)},F.label,S==="reservations"&&Q.reservations>0&&o0__default.default.createElement("span",{className:"time-count"}," - ",Q.reservations),S==="guests"&&Q.guests>0&&o0__default.default.createElement("span",{className:"time-count"}," - ",Q.guests,"p"))})))):o0__default.default.createElement("p",{className:"info-text"},u.noDateSelected)):null});Db.displayName="TimeSelector";var Pb=Db;s0(`.new-reservation-page .table-selector-container{margin-top:15px;padding:10px;border:1px solid #eee;border-radius:4px;background-color:#f9f9f9}.new-reservation-page .table-selector-label{display:block;margin-bottom:10px;font-weight:700;color:#333;font-size:.95rem}.new-reservation-page .table-options{display:flex;flex-wrap:wrap;gap:10px}.new-reservation-page .table-option{display:inline-block;margin-right:15px;margin-bottom:5px;padding:5px 8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;transition:background-color .2s ease}.new-reservation-page .table-option label{display:flex;align-items:center;cursor:pointer;font-size:.9rem;color:#555}.new-reservation-page .table-option input[type=checkbox]{margin-right:8px;cursor:pointer;accent-color:var(--primary-color, #006600)}.new-reservation-page .table-option:has(input[type=checkbox]:checked){background-color:#e0f2e0;border-color:#060}.new-reservation-page .table-option:hover{background-color:#f0f0f0}.new-reservation-page .info-text{margin-top:10px;font-size:.85rem;color:#666}.new-reservation-page .selected-tables-info{margin-top:10px;font-style:italic}.new-reservation-page .info-text.loading-tables{font-style:italic;color:#060}.new-reservation-page .table-option--manual{border-color:#ff9800;background-color:#fff8e1}.new-reservation-page .table-option--manual:hover{background-color:#ffecb3}.new-reservation-page .table-option--manual:has(input[type=checkbox]:checked){background-color:#ffe082;border-color:#ff9800}
12
12
  `);var Io=({availableTables:p=[],isFetching:c=false,formData:e={},handleChange:q,setFormData:W})=>{let a=localStorage.getItem("preferredLanguage")||"nl",n=a1?.[a]?.tableSelector||{},s={label:n.label||"Tafels",noTables:n.noTables||"Geen tafels beschikbaar voor deze selectie.",table:n.table||"Tafel",max:n.max||"Max"},r=Array.isArray(e.selectedTableNumbers)?e.selectedTableNumbers:[],f=Array.isArray(e.selectedTableIds)?e.selectedTableIds:[],g=(u,h)=>{if(typeof q=="function"){q({target:{multiple:true,updates:{selectedTableNumbers:u,selectedTableIds:h}}});return}typeof W=="function"&&W(R=>({...R,selectedTableNumbers:u,selectedTableIds:h}));},N=u=>h=>{let R=h.target.checked,X=p.find(E=>E.tableNumber===u);if(!X)return;let B=[...r],l=[...f];R?(B.includes(u)||B.push(u),l.includes(X.tableId)||l.push(X.tableId)):(B=B.filter(E=>E!==u),l=l.filter(E=>E!==X.tableId)),B.sort((E,S)=>E-S),g(B,l);};return c?o0__default.default.createElement("div",{className:"form-group table-selector-container"},o0__default.default.createElement("label",{className:"table-selector-label"},s.label),o0__default.default.createElement("p",{className:"info-text"},"Laden\u2026")):!p||p.length===0?o0__default.default.createElement("div",{className:"form-group table-selector-container"},o0__default.default.createElement("label",{className:"table-selector-label"},s.label),o0__default.default.createElement("p",{className:"info-text"},s.noTables)):o0__default.default.createElement("div",{className:"form-group table-selector-container"},o0__default.default.createElement("label",{className:"table-selector-label"},s.label),o0__default.default.createElement("div",{className:"table-options"},p.map(u=>{let h=u.tableNumber,R=u.maxCapacity??u.capacity??u.seats??"-",X=r.includes(h),B=u.isManual===true;return o0__default.default.createElement("div",{key:`${u.tableId||h}`,className:`table-option${B?" table-option--manual":""}`},o0__default.default.createElement("label",null,o0__default.default.createElement("input",{type:"checkbox",value:h,checked:X,onChange:N(h)}),s.table," ",h," (",s.max,": ",R,")"))})))},g2=Io;s0(`.new-reservation-page .form-row .field-label{display:block;margin-bottom:6px;font-weight:600}.new-reservation-page .form-row .reservation-mode-buttons{margin-top:0}.new-reservation-page .reservation-mode-buttons{display:flex;gap:10px;margin-top:10px}.new-reservation-page .reservation-mode-button{flex:1;padding:10px;border:1px solid #ccc;border-radius:var(--border-radius);background-color:var(--color-white);cursor:pointer;font-size:1rem;transition:background-color .3s ease,color .3s ease}.new-reservation-page .reservation-mode-button:nth-child(3){flex:0 0 100%}.new-reservation-page .reservation-modes-container{display:flex;flex-wrap:wrap;margin:0 -5px;width:100%}.new-reservation-page .reservation-mode-button{flex:0 0 calc(50% - 10px);margin:5px;padding:10px;box-sizing:border-box;text-align:center;border:1px solid #ccc;background:#f7f7f7;cursor:pointer}.new-reservation-page .reservation-mode-button.active,.new-reservation-page .reservation-mode-button:hover{background-color:var(--color-blue);color:var(--color-white)}.new-reservation-page .unlimited-mode-warning{display:flex;align-items:flex-start;gap:10px;margin:15px 0;padding:12px 15px;background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:var(--border-radius, 4px);border-left:4px solid #e67e22;font-size:.9rem;line-height:1.4}.new-reservation-page .unlimited-mode-warning .warning-icon{color:#e67e22;font-size:1.1rem;margin-top:2px;flex-shrink:0}.new-reservation-page .unlimited-mode-warning .warning-text{color:#856404;margin:0}@media screen and (max-width:480px){.new-reservation-page .unlimited-mode-warning{margin:10px 0;padding:10px 12px;font-size:.85rem}.new-reservation-page .unlimited-mode-warning .warning-icon{font-size:1rem}}.new-reservation-page .reservation-sidebar-component{position:fixed;top:0;right:-400px;width:400px;height:100%;background-color:#fff;box-shadow:-2px 0 5px #0000001a;z-index:var(--z-index-sidebar-reservation);display:flex;flex-direction:column;overflow-y:auto;transition:right .3s ease-in-out}.new-reservation-page .admin-title{text-align:center;margin-bottom:30px}.new-reservation-page .reservation-sidebar-component.open{right:0}.new-reservation-page .reservation-sidebar-content{padding:60px 20px 20px}.new-reservation-page .close-sidebar-button{position:absolute;top:10px;left:10px;background-color:transparent;border:none;cursor:pointer}.new-reservation-page .close-sidebar-button svg{color:#000}.new-reservation-page .sidebar-section-one,.new-reservation-page .sidebar-section-two{margin-bottom:20px}.new-reservation-page .reservation-footer{margin-top:auto}.new-reservation-page .store-reservation-button{width:100%;padding:12px;background-color:var(--color-blue);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:1.1rem}.new-reservation-page .open-sidebar-button{position:fixed;bottom:20px;right:20px;background-color:var(--color-blue);color:#fff;border:none;border-radius:50%;width:50px;height:50px;cursor:pointer;z-index:var(--z-index-modal)!important;transition:all .3s ease}.new-reservation-page .open-sidebar-button:hover{background-color:var(--color-blue-hover-accent)!important}.new-reservation-page .open-sidebar-button svg{position:relative;top:2px}@media screen and (max-width:480px){.new-reservation-page .reservation-sidebar-component{width:100%}}.new-reservation-page .sidebar-section-personeel{margin-bottom:10px}
13
13
  `);var Gb=x0(b1());var Go=()=>{let p=o0.useCallback(()=>localStorage.getItem("accessToken"),[]),c=o0.useCallback((W,a={})=>{let{params:n,...s}=a,r=p();return _b__default.default.get(W,{...s,params:n,headers:{...s.headers,...r?{Authorization:`Bearer ${r}`}:{}}}).then(f=>f.data).catch(f=>{throw console.error("Error fetching data:",f),f})},[p]),e=o0.useCallback((W,a,n=null,s={})=>{let r=p();return _b__default.default({method:W,url:a,data:n,...s,headers:{...s.headers,...r?{Authorization:`Bearer ${r}`}:{}}}).then(f=>f.data).catch(f=>{throw console.error(`Error with ${W} request:`,f),f})},[p]);return o0.useMemo(()=>({get:c,post:(W,a,n)=>e("POST",W,a,n),put:(W,a,n)=>e("PUT",W,a,n),patch:(W,a,n)=>e("PATCH",W,a,n),delete:(W,a)=>e("DELETE",W,null,a)}),[c,e])},c1=Go;var Hb=x0(U1());var Vo=({duration:p,setDuration:c,handleChange:e,min:q=30,max:W=120,interval:a=30})=>{let [n,s]=o0.useState(false),r=o0.useMemo(()=>{let l=[],E=parseInt(q)||30,S=parseInt(W)||120,v=parseInt(a)||30;for(let y=E;y<=S;y+=v){let m=[],w=Math.floor(y/60),P=y%60;w>0&&m.push(`${w} u`),P>0&&m.push(`${P} min`),l.push({value:y,label:m.join(" ")});}return l},[q,W,a]),f=r.slice(0,3),g=r.length>3;f.some(l=>l.value===parseInt(p));let u=l=>{s(false),c&&c(l),e&&e({target:{name:"duration",value:l}});};o0.useEffect(()=>{!p&&r.length>0&&u(r[0].value);},[]);let h=()=>{let l=f[f.length-1],E=parseInt(a)||30;if(l){let S=l.value+E,v=parseInt(W)||120,y=Math.min(S,v);c&&c(y),e&&e({target:{name:"duration",value:y}}),s(true);}else s(true);},R=l=>{let E=parseInt(p)||parseInt(q)||30,S=parseInt(a)||30,v=parseInt(q)||30,y=parseInt(W)||120,m=E+l*S;m<v&&(m=v),m>y&&(m=y),c&&c(m),e&&e({target:{name:"duration",value:m}});},X={wrapper:{marginBottom:"20px"},grid:{display:"flex",flexWrap:"wrap",gap:"8px"},optionBtn:{padding:"8px 12px",borderRadius:"6px",border:"1px solid #D0D5DD",backgroundColor:"#fff",cursor:"pointer",fontSize:"14px",fontWeight:"500",color:"#344054",textAlign:"center",transition:"all 0.2s",outline:"none",fontFamily:"'Inter', sans-serif', system-ui",flex:1,minWidth:"60px"},activeBtn:{backgroundColor:"#48AAAF",color:"#ffffff",borderColor:"#48AAAF"},stepperContainer:{display:"flex",alignItems:"center",justifyContent:"space-between",marginTop:"10px",padding:"8px",backgroundColor:"#F9FAFB",border:"1px solid #EAECF0",borderRadius:"8px",width:"100%"},stepperBtn:{width:"32px",height:"32px",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:"6px",border:"1px solid #D0D5DD",backgroundColor:"#fff",cursor:"pointer",color:"#344054"},stepperValue:{fontSize:"14px",fontWeight:"600",color:"#101828"}},B=l=>{let E=Math.floor(l/60),S=l%60,v=[];return E>0&&v.push(`${E} u`),S>0&&v.push(`${S} min`),v.join(" ")||`${l} min`};return o0__default.default.createElement("div",{style:X.wrapper},o0__default.default.createElement("style",null,`
package/dist/index.mjs CHANGED
@@ -7,7 +7,7 @@ Arguments: `+Array.prototype.slice.call(O).join("")+`
7
7
  ===== Checking date availability for ${q} guests on ${c} =====`),console.log("Restaurant data floors:",p.floors?"present":"missing"),console.log("Table settings:",JSON.stringify(p["table-settings"]||{},null,2));let f=p?.["table-settings"]||{},g=f.isInstalled===true&&f.assignmentMode==="automatic"&&p.floors&&Array.isArray(p.floors);if(console.log(`Table assignment is ${g?"ENABLED":"DISABLED"} for date ${c}`),!Ao(p,c,e,q,W,a,n,s))return console.log(`Date ${c} fails basic availability check`),false;if(!g)return console.log(`Table assignment disabled, date ${c} is available`),true;console.log(`Getting available timeblocks for ${c}`);let u=oo(p,c,e,q,W,a,n,s);if(console.log(`Found ${Object.keys(u).length} available timeblocks before table check`),Object.keys(u).length===0)return console.log(`No available timeblocks on ${c}, date is unavailable`),false;console.log(`Checking table availability for each timeblock on ${c}`);let h=false,R=0;for(let X of Object.keys(u)){if(R++,a&&!ao(p,c,X,a)){console.log(`Time ${X} doesn't match giftcard meal requirements`);continue}if(console.log(`Checking table availability for ${X} on ${c} for ${q} guests`),qo(p,c,X,q,e,null,s)){console.log(`Found available time ${X} with table assignment!`),h=true;break}}return console.log(`Checked ${R}/${Object.keys(u).length} timeblocks`),console.log(`Date ${c} with table check: ${h?"Available":"Unavailable"}`),h}Rb.exports={isDateAvailableWithTableCheck:no};});var Lb=r0(()=>{var{isTimeAvailable:io}=tM(),to={_id:"poer","general-settings":{zitplaatsen:30,uurOpVoorhand:4,dagenInToekomst:90,maxGasten:8,intervalReservatie:15,duurReservatie:120,minutenTotEinde:135,showNoticeForMaxGuests:0,noticePhoneNumber:"",storedNumber:76},menu:[{name:"POER Menu",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"12:00",endHour:"23:00",daysOfWeek:["zaterdag","dinsdag","woensdag","donderdag","vrijdag"],storedNumber:36,_id:"674a9033c1956dd233bafaad"},{name:"A la carte",startDate:"2024-11-30",endDate:"2030-01-01",startHour:"12:00",endHour:"14:00",daysOfWeek:["dinsdag","woensdag","donderdag","vrijdag"],storedNumber:28,_id:"674a9084c1956dd233bafaae"},{name:"Ik weet het nog niet",startDate:"2024-11-30",endDate:"2030-01-01",startHour:"12:00",endHour:"14:00",daysOfWeek:["dinsdag","woensdag","donderdag","vrijdag"],storedNumber:41,_id:"674a90bc64cc52acdd5e6cc2"},{name:"Lunch",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"12:00",endHour:"14:00",daysOfWeek:["dinsdag","woensdag","donderdag","vrijdag"],storedNumber:23,_id:"674adb4e8d6385fb343499f7"},{name:"A la carte",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"18:30",endHour:"20:30",daysOfWeek:["dinsdag","woensdag","donderdag"],storedNumber:50,_id:"674adbf58d6385fb343499f8"},{name:"Ik weet het nog niet",startDate:"2024-11-01",endDate:"2030-01-30",startHour:"18:30",endHour:"20:30",daysOfWeek:["dinsdag","donderdag","woensdag"],storedNumber:54,_id:"674adc208d6385fb343499f9"}],mededeling:[{mededeling:"Gelieve er rekening mee te houden dat we op vrijdagavond en zaterdagavond enkel ons POER menu serveren.",startDate:"2024-11-01",endDate:"2030-01-30",startTime:"18:30",endTime:"20:30",daysOfWeek:["vrijdag","zaterdag"],storedNumber:95,_id:"674ade0a8d6385fb343499fa"}],settings:{pageTitle:"Reserveer nu",generalNotification:"",alignment:"fullScreenColor",backgroundBlur:"blurBackground",storedNumber:61},colors:{backgroundType:"solid",backgroundColor:"#e0debe",gradientStartColor:"#FFFFFF",gradientEndColor:"#000000",animationType:"none",widgetBackgroundColor:"#000000",widgetTextColor:"#FFFFFF",textColor:"#000000",containerColor:"#FFFFFF",buttonColor:"#000000",buttonTextColor:"#FFFFFF",storedNumber:81},exceptions:[{title:"Extra mensen donderdagmiddag",type:"Opening",timeframe:"lunch",startDate:"2024-12-05",endDate:"2024-12-05",startHour:"12:00",endHour:"16:00",maxSeats:"34",daysOfWeek:["donderdag"],storedNumber:74,_id:"67507dc98fb61d6afd54acb0"},{title:"Extra personen donderdagavond",type:"Uitzondering",timeframe:"dinner",startDate:"2024-12-05",endDate:"2024-12-05",startHour:"18:30",endHour:"23:00",maxSeats:"27",daysOfWeek:["donderdag"],storedNumber:88,_id:"67507e3383d7f2de02628f4a"},{title:"Cong\xE9 Periode 22/12 tot 9/01",type:"Sluiting",timeframe:"Volledige Dag",startDate:"2024-12-22",endDate:"2025-01-09",daysOfWeek:[],storedNumber:89,_id:"67511bb38fb61d6afd54acba"}],"openinghours-lunch":{schemeSettings:{Tuesday:{enabled:true,startTime:"12:00",endTime:"13:30",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Wednesday:{enabled:true,startTime:"12:00",endTime:"16:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Thursday:{enabled:true,startTime:"12:00",endTime:"16:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Friday:{enabled:true,startTime:"12:30",endTime:"13:30",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]}},storedNumber:2},"openinghours-dinner":{schemeSettings:{Tuesday:{enabled:true,startTime:"18:30",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"24",shiftsEnabled:false,shifts:[]},Wednesday:{enabled:true,startTime:"16:00",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"24",shiftsEnabled:false,shifts:[]},Thursday:{enabled:true,startTime:"16:00",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"24",shiftsEnabled:false,shifts:[]},Friday:{enabled:true,startTime:"18:30",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]},Saturday:{enabled:true,startTime:"18:30",endTime:"20:00",maxCapacityEnabled:true,maxCapacity:"30",shiftsEnabled:false,shifts:[]}},storedNumber:6},fonts:{titleFont:{font:"Poppins",weight:"400"},subtitleFont:{font:"Poppins",weight:"400"},labelFont:{font:"Poppins",weight:"400"},buttonFont:{font:"Poppins",weight:"400"}},theme:{id:10,title:"Herfstbladeren",color:"#D35400",image:"/static/media/default-theme.webp"}},ro=[{guests:10,time:"12:00",date:"2024-12-18"},{guests:100,time:"15:00",date:"2024-12-04"}];console.log("--- Is Time Available Tests ---");var ub="2024-12-10",lb=1e3,so=["12:00","12:15","13:00","19:00","20:00","20:15"];so.forEach(p=>{let c=io(to,ub,p,ro,lb);console.log(`Is ${p} on ${ub} available for ${lb} guests?`,c);});});var Xb=r0((oq,Bb)=>{var Nb=f2(),{shifts:Aq,parseTime:uM,getMealTypeByTime:Ro}=F1();function fo(){let p=Nb().tz("Europe/Brussels");return p.hours()*60+p.minutes()}function uo(p,c,e){let q=Nb().tz("Europe/Brussels").format("YYYY-MM-DD");if(e!==q)return p;console.log(`Applying stop time filter for today (${e})`);let W=c?.["general-settings"]||{},a=fo(),n=W.ontbijtStop||null,s=W.lunchStop||null,r=W.dinerStop||null,f=n?uM(n):null,g=s?uM(s):null,N=r?uM(r):null,u={},h=0,R=0,X=0;for(let B in p){if(!p.hasOwnProperty(B))continue;let l=Ro(B),E=false;l==="breakfast"&&f!==null&&!isNaN(f)&&a>=f?(E=true,h++):l==="lunch"&&g!==null&&!isNaN(g)&&a>=g?(E=true,R++):l==="dinner"&&N!==null&&!isNaN(N)&&a>=N&&(E=true,X++),E||(u[B]=p[B]);}return h>0&&console.log(`Stop time filter removed ${h} breakfast slots.`),R>0&&console.log(`Stop time filter removed ${R} lunch slots.`),X>0&&console.log(`Stop time filter removed ${X} dinner slots.`),u}Bb.exports={filterTimeblocksByStopTimes:uo};});var Tb=r0((qq,mb)=>{function lo(p){let c=parseInt(p.split(":")[0],10);return c>=4&&c<11?"breakfast":c>=11&&c<16?"lunch":c>=16&&c<23?"dinner":null}function Lo(p){if(!p)return null;if(p.$numberInt)return parseInt(p.$numberInt,10);if(typeof p=="number")return p;if(typeof p=="string"){let c=parseInt(p,10);return isNaN(c)?null:c}return null}function No(p,c,e){return p.filter(q=>q.date===c&&q.time===e).reduce((q,W)=>q+(parseInt(W.guests,10)||0),0)}function Bo(p,c,e,q,W){let a={};for(let[n,s]of Object.entries(e)){let r=lo(n);if(!r){a[n]=s;continue}let f=p[`max-arrivals-${r}`];if(!f){a[n]=s;continue}let g=Lo(f[n]);if(g===null){a[n]=s;continue}No(q,c,n)+W<=g&&(a[n]=s);}return a}mb.exports={filterTimeblocksByMaxArrivals:Bo};});var hb=r0((eq,gb)=>{function lM(p){let c=parseInt(p.split(":")[0],10);return c>=4&&c<11?"breakfast":c>=11&&c<16?"lunch":c>=16&&c<23?"dinner":null}function l0(p,...c){console.log(`[MaxGroupsFilter] ${p}`,...c);}function mo(p){if(p==null)return null;if(typeof p=="object"&&p!==null&&"$numberInt"in p){let c=parseInt(p.$numberInt,10);return isNaN(c)?null:c}if(typeof p=="number")return Number.isInteger(p)?p:null;if(typeof p=="string"){let c=parseInt(p,10);return isNaN(c)?null:c}return null}function To(p,c,e,q,W){l0(`--- Running MaxGroupsFilter for Date: ${c}, Guests: ${W} ---`);let a=Object.keys(p).filter(g=>g.startsWith("max-groups-"));l0("Received restaurantData max-group keys:",a.length>0?a:"None found");let n={},s=parseInt(W,10);if(isNaN(s)||s<=0)return l0(`Invalid guest count (${W}). Returning all ${Object.keys(e).length} input blocks unfiltered.`),e;let r=q.filter(g=>g.date===c);l0(`Relevant reservations on ${c}: ${r.length}`),l0(`Input timeblocks count: ${Object.keys(e).length}`);let f={};r.forEach(g=>{let N=lM(g.time);N&&(f[N]||(f[N]=[]),f[N].push(g));}),l0("Reservations grouped by meal type:",f);for(let[g,N]of Object.entries(e)){let u=lM(g);if(l0(`
8
8
  Checking Time: ${g} -> Determined Meal: ${u}`),!u){l0(` Time ${g} has no associated meal type. Keeping block.`),n[g]=N;continue}let h=`max-groups-${u}`,R=p[h];if(l0(` Looking for settings using key: "${h}"`),!R||typeof R!="object"){l0(` No settings found for key "${h}". Filter doesn't apply. Keeping block.`),n[g]=N;continue}l0(` Found settings for ${u}:`,JSON.stringify(R));let X=true,B=Object.keys(R).map(l=>parseInt(l,10)).filter(l=>!isNaN(l)&&l>0).sort((l,E)=>l-E);l0(` Defined numeric limit sizes to check for ${u}: [${B.join(", ")}]`);for(let l of B){let E=String(l);if(l0(` Checking Limit Condition: Groups of size >= ${l}`),s>=l){l0(` Applicable: Booking guests (${s}) >= Limit threshold (${l})`);let S=mo(R[E]);if(l0(` Max groups allowed for >=${l} is: ${S} (raw setting: ${JSON.stringify(R[E])})`),S===null||S<0){l0(` Skipping check: Invalid or non-positive max count defined for size ${l}.`);continue}let y=(f[u]||[]).filter(m=>{let w=parseInt(m.guests,10);return !isNaN(w)&&w>=l}).length;if(l0(` Count of existing groups >=${l} found in ${u}: ${y}`),y+1>S){l0(` *** VIOLATION DETECTED *** for limit >=${l}.`),l0(` (Existing Groups: ${y} + New Group: 1 = ${y+1}, which is > Max Allowed: ${S})`),l0(` Blocking time ${g} due to this violation.`),X=false;break}else l0(` OK: Limit for >=${l} not exceeded. (Existing: ${y} + New: 1 <= Max: ${S})`);}else l0(` Not Applicable: Booking guests (${s}) < Limit threshold (${l}). Skipping this check.`);}X?(l0(` \u2705 Result for time ${g}: ALLOWED (passed all applicable checks)`),n[g]=N):l0(` \u274C Result for time ${g}: BLOCKED (failed at least one limit check)`);}return l0(`--- MaxGroupsFilter Finished. Output timeblocks count: ${Object.keys(n).length} ---`),n}gb.exports={filterTimeblocksByMaxGroups:To,getMealType:lM};});var U1=r0((Wq,yb)=>{var go={...qM(),...s2(),...u2()},ho={...oM()},yo={...r2(),...h1()},vo={...Ab(),...L2(),...eM(),...iM(),...tM(),...fM(),...fb(),...F1(),...Lb()},So={...Xb(),...Tb(),...hb()};yb.exports={...go,...ho,...yo,...vo,...So};});var Qb=r0((hM,Vb)=>{(function(p,c){typeof hM=="object"&&typeof Vb<"u"&&typeof a2=="function"?c(d2()):typeof define=="function"&&define.amd?define(["../moment"],c):c(p.moment);})(hM,(function(p){var c="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),e="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),q=[/^jan/i,/^feb/i,/^(maart|mrt\.?)$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],W=/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,a=p.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(n,s){return n?/-MMM-/.test(s)?e[n.month()]:c[n.month()]:c},monthsRegex:W,monthsShortRegex:W,monthsStrictRegex:/^(januari|februari|maart|april|mei|ju[nl]i|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:q,longMonthsParse:q,shortMonthsParse:q,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:true,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"\xE9\xE9n minuut",mm:"%d minuten",h:"\xE9\xE9n uur",hh:"%d uur",d:"\xE9\xE9n dag",dd:"%d dagen",w:"\xE9\xE9n week",ww:"%d weken",M:"\xE9\xE9n maand",MM:"%d maanden",y:"\xE9\xE9n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(n){return n+(n===1||n===8||n>=20?"ste":"de")},week:{dow:1,doy:4}});return a}));});function s0(p,{insertAt:c}={}){if(!p||typeof document>"u")return;let e=document.head||document.getElementsByTagName("head")[0],q=document.createElement("style");q.type="text/css",c==="top"&&e.firstChild?e.insertBefore(q,e.firstChild):e.appendChild(q),q.styleSheet?q.styleSheet.cssText=p:q.appendChild(document.createTextNode(p));}s0(`.new-reservation-page .value-selector{display:flex;flex-direction:column;gap:15px;margin-bottom:20px}.new-reservation-page .non-absolute{position:relative!important}.new-reservation-page .non-absolute:before{background:none}.new-reservation-page .predefined-values{display:flex;gap:10px}.new-reservation-page .predefined-value-button{flex:1;padding:10px;border:1px solid #ccc;border-radius:var(--border-radius);background-color:var(--color-white);cursor:pointer;font-size:1rem;transition:background-color .3s ease}.new-reservation-page .predefined-value-button.active,.new-reservation-page .predefined-value-button:hover{background-color:var(--color-blue);color:var(--color-white)}.new-reservation-page .slider-container{display:flex;align-items:center;gap:15px}.new-reservation-page .slider{flex:1;appearance:none;-webkit-appearance:none;height:5px;background:#ddd;border-radius:5px;outline:none}.new-reservation-page .slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:20px;height:20px;background:var(--color-blue);cursor:pointer;border-radius:50%}.new-reservation-page .value-input{width:80px;padding:10px;border:1px solid #ccc;border-radius:var(--border-radius);font-size:1rem}
9
9
  `);var MA=({setGuests:p,value:c,onChange:e})=>{let q=[1,2,3,"4+"],[W,a]=useState(c||""),[n,s]=useState(false),r=N=>{N==="4+"?(s(true),a(4),p(4),e({target:{name:"guests",value:4}})):(s(false),a(N),p(N),e({target:{name:"guests",value:N}}));},f=N=>{let u=N.target.value;a(u),p(u),e({target:{name:"guests",value:u}});},g=N=>{let u=N.target.value;a(u),p(u),e({target:{name:"guests",value:u}});};return o0.createElement("div",{className:"value-selector",translate:"no"},o0.createElement("div",{className:"predefined-values"},q.map(N=>o0.createElement("button",{key:N,type:"button",className:`predefined-value-button ${W==N||N==="4+"&&n?"active":""}`,onClick:()=>r(N)},N==="4+"?"4+":`${N} p`))),o0.createElement(AnimatePresence,null,n&&o0.createElement(motion.div,{className:"slider-container",initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0}},o0.createElement("input",{type:"range",min:"4",max:"15",step:"1",value:W,onChange:f,className:"slider non-absolute"}),o0.createElement("input",{type:"number",name:"guests",value:W,onChange:g,className:"value-input",min:"4",max:"100",step:"1"}))))},n2=MA;var s1=x0(b1());var yz=x0(b1()),vz=p=>{let c=(0, yz.default)().tz("Europe/Brussels").startOf("day");return p.clone().add(6,"days").endOf("day").isBefore(c)},Sz=(p,c)=>p.isSame(c,"day");s0(`.new-reservation-page .calendar-container{position:relative;width:100%}.new-reservation-page .calendar-container .calendar-display{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;user-select:none;text-align:left;border-radius:5px}.new-reservation-page .calendar-container .calendar-display span:first-child{flex-grow:1}.new-reservation-page .calendar-container .calendar{position:absolute;z-index:1000;width:100%;background-color:#fff;border:1px solid #ccc;margin-top:5px;padding:10px;border-radius:10px;animation:fadeInCalendar .3s ease-in-out;box-shadow:0 2px 10px #0000001a}@keyframes fadeInCalendar{0%{opacity:0}to{opacity:1}}.new-reservation-page .calendar-container .availability-hold-btn{font-size:10px}.new-reservation-page .calendar-container .calendar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;gap:8px;flex-wrap:wrap}.new-reservation-page .calendar-container .calendar-header button{background-color:transparent;border:none;cursor:pointer;font-size:18px}.new-reservation-page .calendar-container .calendar-header span{font-size:15px;color:gray;font-weight:500}.new-reservation-page .calendar-container .calendar-weeks-wrapper{overflow:hidden;position:relative;width:100%}.new-reservation-page .calendar-container .calendar-table{width:100%;border-collapse:collapse}.new-reservation-page .calendar-container .calendar-table th,.new-reservation-page .calendar-container .calendar-table td{width:14.28%;text-align:center;padding:5px}.calendar-container .calendar-table th{color:#666;font-weight:400;padding-bottom:10px}.new-reservation-page .calendar-container .calendar-table td{vertical-align:middle;cursor:pointer;border:none;opacity:1;position:relative}.new-reservation-page .calendar-container .calendar-table td.empty-day{cursor:default}.new-reservation-page .calendar-container .calendar-table td:hover .day-square.available{transform:scale(1.05)}.new-reservation-page .calendar-container .day-square{position:relative;width:38px;height:38px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;flex-direction:column;transition:all .2s ease;font-size:16px;margin:0 auto}.new-reservation-page .calendar-container .day-number{line-height:1;z-index:2}.new-reservation-page .calendar-container .available .day-square{background-color:#cfc;color:#060}.new-reservation-page .calendar-container .available:hover .day-square{background-color:#b3ffb3}.new-reservation-page .calendar-container .available:active .day-square{background-color:#9f9}.new-reservation-page .calendar-container .unavailable .day-square{background-color:#8b000021;color:#8b0000}.new-reservation-page .calendar-container .gray-out .day-square{background-color:#e0e0e0;color:#999;cursor:not-allowed}.new-reservation-page .calendar-container .selected .day-square{background-color:#060;color:#cfc}.new-reservation-page .calendar-container .calendar-table td.unavailable,.new-reservation-page .calendar-container .calendar-table td.gray-out{cursor:not-allowed}.new-reservation-page .calendar-container .calendar-table td.unavailable:hover .day-square,.new-reservation-page .calendar-container .calendar-table td.gray-out:hover .day-square{transform:none}.new-reservation-page .calendar-container .calendar-table td{border:none}.new-reservation-page .calendar-container .arrow{margin-left:auto;color:gray;display:flex;align-items:center}.new-reservation-page .calendar-container .available .availability-badge{background:#38a169}.new-reservation-page .calendar-container .selected .availability-badge{background:#2d3748}@media screen and (max-width:900px){.calendar-container .day-square{width:35px!important;height:35px!important;font-size:15px!important}.calendar-container .calendar-header span{font-size:12px}.new-reservation-page .calendar-container .availability-toggle-btn{padding:5px 8px;font-size:11px}}
10
- `);var R1=x0(U1());var LM=class{constructor(c=6e4){this.cache=new Map,this.ttl=c;}generateKey(c,...e){return `${c}::${JSON.stringify(e)}`}get(c){let e=this.cache.get(c);return e?Date.now()-e.timestamp>this.ttl?(this.cache.delete(c),null):e.value:null}set(c,e){this.cache.set(c,{value:e,timestamp:Date.now()});}clear(){this.cache.clear();}cleanup(){let c=Date.now();for(let[e,q]of this.cache.entries())c-q.timestamp>this.ttl&&this.cache.delete(e);}},X2=new LM;setInterval(()=>X2.cleanup(),3e4);var O1=(p,c,...e)=>{let q=X2.generateKey(p,...e),W=X2.get(q);if(W!==null)return W;let a=c(...e);return X2.set(q,a),a};var a1={nl:{reservationStepOne:{errors:{openingHoursNotSet:"Openingstijden niet ingesteld.",clickHereToSet:"Klik hier om uw openingsuren in te stellen."},modes:{withLimits:"Met Limieten",unlimited:"Onbeperkt",openingHours:"Openingsuren",free:"Vrij"},fields:{time:"Tijd"},messages:{searchingTables:"Beschikbare tafels zoeken...",noTablesAvailable:"Geen specifieke tafels beschikbaar voor deze selectie."},warnings:{unlimitedMode:"Onbeperkt zal geen rekening houden met maximum limieten."}},calendar:{selectDatePlaceholder:"Selecteer een datum",today:"Vandaag",tomorrow:"Morgen",prevWeek:"Vorige week",nextWeek:"Volgende week",dayHeaders:["Ma","Di","Wo","Do","Vr","Za","Zo"],seatsQuestion:"Zitplaatsen?"},timeSelector:{shifts:{breakfast:"Ontbijt",lunch:"Lunch",dinner:"Diner"},selectMeal:"Selecteer een maaltijd",selectTime:"Selecteer een tijd",noDateSelected:"Selecteer eerst een datum.",noTimes:"Geen beschikbare tijden.",back:"Terug",reservations:"Reservaties",guests:"Gasten"},tableSelector:{label:"Selecteer beschikbare tafel(s):",table:"Tafel",max:"Max",noTables:"Geen specifieke tafels beschikbaar voor deze tijd/gasten combinatie.",manual:"Handmatig"}},en:{reservationStepOne:{errors:{openingHoursNotSet:"Opening hours not set.",clickHereToSet:"Click here to set your opening hours."},modes:{withLimits:"With Limits",unlimited:"Unlimited",openingHours:"Opening Hours",free:"Free"},fields:{time:"Time"},messages:{searchingTables:"Searching for available tables...",noTablesAvailable:"No specific tables available for this selection."},warnings:{unlimitedMode:"Unlimited will not take into account maximum limits."}},calendar:{selectDatePlaceholder:"Select a date",today:"Today",tomorrow:"Tomorrow",prevWeek:"Previous week",nextWeek:"Next week",dayHeaders:["M","T","W","T","F","S","S"],seatsQuestion:"Seating?"},timeSelector:{shifts:{breakfast:"Breakfast",lunch:"Lunch",dinner:"Dinner"},selectMeal:"Select a meal",selectTime:"Select a time",noDateSelected:"Please select a date first.",noTimes:"No available times.",back:"Back",reservations:"Reservations",guests:"Guests"},tableSelector:{label:"Select available table(s):",table:"Table",max:"Max",noTables:"No specific tables available for this time/guest combination.",manual:"Manual"}},fr:{reservationStepOne:{errors:{openingHoursNotSet:"Horaires non d\xE9finies.",clickHereToSet:"Cliquez ici pour d\xE9finir vos horaires."},modes:{withLimits:"Avec Limites",unlimited:"Illimit\xE9",openingHours:"Horaires",free:"Libre"},fields:{time:"Heure"},messages:{searchingTables:"Recherche de tables disponibles...",noTablesAvailable:"Aucune table sp\xE9cifique disponible pour cette s\xE9lection."},warnings:{unlimitedMode:"Illimit\xE9 ne tiendra pas compte des limites maximales."}},calendar:{selectDatePlaceholder:"S\xE9lectionnez une date",today:"Aujourd'hui",tomorrow:"Demain",prevWeek:"Semaine pr\xE9c\xE9dente",nextWeek:"Semaine suivante",dayHeaders:["Lu","Ma","Me","Je","Ve","Sa","Di"],seatsQuestion:"Places ?"},timeSelector:{shifts:{breakfast:"Petit-d\xE9jeuner",lunch:"D\xE9jeuner",dinner:"D\xEEner"},selectMeal:"S\xE9lectionnez un repas",selectTime:"S\xE9lectionnez une heure",noDateSelected:"Veuillez d'abord s\xE9lectionner une date.",noTimes:"Aucun horaire disponible.",back:"Retour",reservations:"R\xE9servations",guests:"Convives"},tableSelector:{label:"S\xE9lectionnez les table(s) disponibles :",table:"Table",max:"Max",noTables:"Aucune table sp\xE9cifique disponible pour cette combinaison temps/convives.",manual:"Manuel"}}};var Eb=memo(({guests:p,selectedDate:c,onSelectDate:e,autoExpand:q,reservationMode:W,restaurantData:a,startDate:n,onWeekChange:s,reservations:r,giftcard:f,zitplaats:g,isAdmin:N=false})=>{let u=localStorage.getItem("preferredLanguage")||"nl",h=a1[u].calendar,[R,X]=useState(q||false),[B,l]=useState(false),E=useRef(null),S=useRef(null),v=(0, s1.default)().tz("Europe/Amsterdam").add(1,"year").endOf("day");useEffect(()=>{q&&X(true);},[q]),useEffect(()=>{let _=V=>{E.current&&!E.current.contains(V.target)&&(X(false),l(false));};return document.addEventListener("mousedown",_),()=>{document.removeEventListener("mousedown",_);}},[]),useEffect(()=>()=>{S.current&&(clearTimeout(S.current),S.current=null);},[]);let y=()=>{S.current&&(clearTimeout(S.current),S.current=null),l(true);},m=(_=1e3)=>{S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{l(false),S.current=null;},_);},w=useCallback((_,V,p0=[])=>{if(_.isBefore(V,"day")||_.isAfter(v,"day"))return 0;let I=_.format("YYYY-MM-DD");if(W==="vrije_keuze")return 21;if(W!=="met_limieten"&&!B)return (0, R1.isDateAvailable)(a,I,r,-1e4,p0,null,N)?21:0;let $=a?.["table-settings"]||{},c0=$.isInstalled===true&&$.assignmentMode==="automatic"&&(B||W==="met_limieten"),D=Z=>c0?O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,I,r,Z,p0,null,N):O1("isDateAvailable",R1.isDateAvailable,a,I,r,Z,p0,null,N);if(!D(1))return 0;if(D(21))return 21;let d0=1,J=21,G=1;for(;d0<=J;){let Z=Math.floor((d0+J)/2);D(Z)?(G=Z,d0=Z+1):J=Z-1;}return G},[a,r,f,N,W,B]),P=useMemo(()=>{if(!R)return [];let _=[],V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=n||V,I=a?.["blocked-slots"]||[],$=p0.clone().startOf("month"),c0=p0.clone().endOf("month"),D=a?.["table-settings"]||{},d0=D.isInstalled===true&&D.assignmentMode==="automatic"&&W==="met_limieten",J=$.clone();for(;J.isSameOrBefore(c0,"day");){let G=J.format("YYYY-MM-DD"),Z;if(W==="vrije_keuze")Z=J.isBetween(V,v,null,"[]");else {let H0=W!=="met_limieten"?-1e4:p,A1=W==="met_limieten"?f:null;d0?Z=O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,G,r,H0,I,A1,N):Z=O1("isDateAvailable",R1.isDateAvailable,a,G,r,H0,I,A1,N);}let D0=w(J,V,I);_.push({date:J.clone(),isPast:J.isBefore(V,"day"),isFuture:J.isAfter(v,"day"),isAvailable:Z,maxGuestsAvailable:D0}),J.add(1,"day");}return _},[R,n,p,W,a,r,f,g,B,N]),x=_=>{_.isAvailable&&!_.isPast&&!_.isFuture&&(e(_.date.format("YYYY-MM-DD")),X(false),l(false));},z0=()=>{let _=n.clone().subtract(1,"month").startOf("month"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day");if(_.clone().endOf("month").isBefore(V,"day")){console.log("Cannot go to previous month. It is in the past.");return}s(_);},q0=()=>{let _=n.clone().add(1,"month").startOf("month");s(_);},R0=()=>{if(!c)return h.selectDatePlaceholder;let _=(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam").startOf("day"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=V.clone().add(1,"day");return _.isSame(V,"day")?h.today:_.isSame(p0,"day")?h.tomorrow:_.format("dddd D MMMM YYYY")},Q=n?(_=>{let p0=n.clone().startOf("month").day(),I=p0===0?6:p0-1,$=[];for(let J=0;J<I;J++)$.push(null);$.push(..._);let c0=$.length,D=Math.ceil(c0/7);for(;$.length<D*7;)$.push(null);let d0=[];for(let J=0;J<D;J++){let G=$.slice(J*7,J*7+7);d0.push(G);}return d0})(P):[],K=h.dayHeaders,b0=_=>_>=21?"20+":String(_);return o0.createElement("div",{className:"calendar-container",ref:E},o0.createElement("div",{className:"calendar-display",onClick:()=>X(!R)},o0.createElement("span",null,R0()),o0.createElement("span",{className:"arrow"},o0.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",style:{transform:R?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s"}},o0.createElement("path",{d:"M7 10l5 5 5-5",fill:"none",stroke:"currentColor",strokeWidth:"2"})))),R&&n&&o0.createElement("div",{className:"calendar"},o0.createElement("div",{className:"calendar-header"},o0.createElement("button",{type:"button",onClick:z0,"aria-label":h.prevWeek},"<"),o0.createElement("span",null,n.format("MMMM YYYY")),o0.createElement("button",{type:"button",onClick:q0,"aria-label":h.nextWeek},">"),o0.createElement("button",{type:"button",className:`availability-hold-btn ${B?"active":""}`,"aria-pressed":B,"aria-label":"Houd ingedrukt om beschikbaarheden te tonen",onMouseDown:y,onMouseUp:()=>m(1e3),onMouseLeave:()=>m(1e3),onTouchStart:y,onTouchEnd:()=>m(1e3),onTouchCancel:()=>m(1e3),onKeyDown:_=>{(_.key===" "||_.key==="Enter")&&y();},onKeyUp:_=>{(_.key===" "||_.key==="Enter")&&m(1e3);},style:{fontSize:"15px",color:"gray",fontWeight:"450",textDecoration:"underline"}},h.seatsQuestion)),o0.createElement("div",{className:"calendar-weeks-wrapper"},o0.createElement("table",{className:"calendar-table"},o0.createElement("thead",null,o0.createElement("tr",{translate:"no"},K.map((_,V)=>o0.createElement("th",{key:V},_)))),o0.createElement("tbody",null,Q.map((_,V)=>o0.createElement("tr",{key:V,translate:"no"},_.map((p0,I)=>{if(!p0)return o0.createElement("td",{key:I,className:"empty-day"});let $=c&&Sz(p0.date,(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam")),c0=[];return p0.isPast?c0.push("gray-out"):p0.isAvailable?c0.push("available"):c0.push("unavailable"),$&&c0.push("selected"),o0.createElement("td",{key:I,className:c0.join(" "),onClick:()=>x(p0),style:{"--animation-order":I+V*7}},o0.createElement("div",{className:`day-square ${B?"showing-availabilities":""}`},o0.createElement("span",{className:"day-number"},B?b0(p0.maxGuestsAvailable):p0.date.date())))}))))))))});Eb.displayName="Calendar";var Cb=Eb;var BM=x0(b1()),wo=({guests:p,formData:c,handleChange:e,resetFormDataFields:q,restaurantData:W,reservations:a,startDate:n,onWeekChange:s,reservationMode:r,isAdmin:f=false})=>{let g=u=>{let h=(0, BM.default)(u).format("YYYY-MM-DD");console.log("Selected date:",h),e({target:{name:"date",value:h}}),q(["time"]);},N=n?n.clone().startOf("month"):(0, BM.default)().startOf("month");return o0.createElement("div",{className:"form-group date-selector-container"},o0.createElement(Cb,{guests:p,selectedDate:c.date||null,onSelectDate:g,autoExpand:false,reservationMode:r,restaurantData:W,startDate:N,onWeekChange:s,reservations:a,giftcard:c.giftcard,zitplaats:c.zitplaats,isAdmin:f}))},xb=wo;s0(`.new-reservation-page .time-selector-container{position:relative}.new-reservation-page .time-display{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;user-select:none;text-align:left;border-radius:5px}.new-reservation-page .time-display span:first-child{flex-grow:1}.new-reservation-page .time-selector{position:absolute;z-index:1000;width:100%;max-height:350px;overflow-y:auto;background-color:#fff;border:1px solid #ccc;padding:55px 10px 10px;border-radius:10px;animation:fadeInTimeSelector .3s ease-in-out;top:75px}.new-reservation-page .time-toggle-container{position:absolute;top:0;left:0;right:0;display:flex;gap:8px;padding:10px;background-color:#fff;border-radius:10px 10px 0 0;z-index:1;border-bottom:1px solid #eee}.new-reservation-page .time-toggle-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:20px;border:1px solid #ddd;background-color:#f5f5f5;color:#666;font-size:13px;cursor:pointer;transition:all .2s ease;font-family:inherit}.new-reservation-page .time-toggle-btn:hover{background-color:#e8e8e8;border-color:#ccc}.new-reservation-page .time-toggle-btn.active{background-color:var(--color-blue, #48aaaf);border-color:var(--color-blue, #48aaaf);color:#fff}.new-reservation-page .time-toggle-btn.active:hover{background-color:var(--color-blue, #48aaaf);filter:brightness(.95)}.new-reservation-page .time-toggle-btn svg{flex-shrink:0}.new-reservation-page .time-count{font-weight:400;opacity:.9}@keyframes fadeInTimeSelector{0%{opacity:0}to{opacity:1}}.new-reservation-page .time-period{margin-bottom:15px}.new-reservation-page .time-period-label{font-weight:700;margin-bottom:5px}.new-reservation-page .time-options{display:flex;flex-wrap:wrap;gap:5px}.new-reservation-page .time-option{padding:8px 12px;background-color:#cfc;color:#060;border-radius:5px;cursor:pointer;transition:background-color .2s ease}.new-reservation-page .time-option:hover{background-color:#b3ffb3}.new-reservation-page .time-option.selected{background-color:#060;color:#cfc}.new-reservation-page .info-text{color:#666;font-style:italic}.new-reservation-page .arrow{margin-left:auto;color:gray;display:flex;align-items:center}@media screen and (max-width:480px){.new-reservation-page .time-option{padding:6px 10px;font-size:14px}.new-reservation-page .time-toggle-btn{padding:5px 10px;font-size:12px;gap:4px}.new-reservation-page .time-toggle-btn svg{width:12px;height:12px}}
10
+ `);var R1=x0(U1());var LM=class{constructor(c=6e4){this.cache=new Map,this.ttl=c;}generateKey(c,...e){return `${c}::${JSON.stringify(e)}`}get(c){let e=this.cache.get(c);return e?Date.now()-e.timestamp>this.ttl?(this.cache.delete(c),null):e.value:null}set(c,e){this.cache.set(c,{value:e,timestamp:Date.now()});}clear(){this.cache.clear();}cleanup(){let c=Date.now();for(let[e,q]of this.cache.entries())c-q.timestamp>this.ttl&&this.cache.delete(e);}},X2=new LM;setInterval(()=>X2.cleanup(),3e4);var O1=(p,c,...e)=>{let q=X2.generateKey(p,...e),W=X2.get(q);if(W!==null)return W;let a=c(...e);return X2.set(q,a),a};var a1={nl:{reservationStepOne:{errors:{openingHoursNotSet:"Openingstijden niet ingesteld.",clickHereToSet:"Klik hier om uw openingsuren in te stellen."},modes:{withLimits:"Met Limieten",unlimited:"Onbeperkt",openingHours:"Openingsuren",free:"Vrij"},fields:{time:"Tijd"},messages:{searchingTables:"Beschikbare tafels zoeken...",noTablesAvailable:"Geen specifieke tafels beschikbaar voor deze selectie."},warnings:{unlimitedMode:"Onbeperkt zal geen rekening houden met maximum limieten."}},calendar:{selectDatePlaceholder:"Selecteer een datum",today:"Vandaag",tomorrow:"Morgen",prevWeek:"Vorige week",nextWeek:"Volgende week",dayHeaders:["Ma","Di","Wo","Do","Vr","Za","Zo"],seatsQuestion:"Zitplaatsen?"},timeSelector:{shifts:{breakfast:"Ontbijt",lunch:"Lunch",dinner:"Diner"},selectMeal:"Selecteer een maaltijd",selectTime:"Selecteer een tijd",noDateSelected:"Selecteer eerst een datum.",noTimes:"Geen beschikbare tijden.",back:"Terug",reservations:"Reservaties",guests:"Gasten"},tableSelector:{label:"Selecteer beschikbare tafel(s):",table:"Tafel",max:"Max",noTables:"Geen specifieke tafels beschikbaar voor deze tijd/gasten combinatie.",manual:"Handmatig"}},en:{reservationStepOne:{errors:{openingHoursNotSet:"Opening hours not set.",clickHereToSet:"Click here to set your opening hours."},modes:{withLimits:"With Limits",unlimited:"Unlimited",openingHours:"Opening Hours",free:"Free"},fields:{time:"Time"},messages:{searchingTables:"Searching for available tables...",noTablesAvailable:"No specific tables available for this selection."},warnings:{unlimitedMode:"Unlimited will not take into account maximum limits."}},calendar:{selectDatePlaceholder:"Select a date",today:"Today",tomorrow:"Tomorrow",prevWeek:"Previous week",nextWeek:"Next week",dayHeaders:["M","T","W","T","F","S","S"],seatsQuestion:"Seating?"},timeSelector:{shifts:{breakfast:"Breakfast",lunch:"Lunch",dinner:"Dinner"},selectMeal:"Select a meal",selectTime:"Select a time",noDateSelected:"Please select a date first.",noTimes:"No available times.",back:"Back",reservations:"Reservations",guests:"Guests"},tableSelector:{label:"Select available table(s):",table:"Table",max:"Max",noTables:"No specific tables available for this time/guest combination.",manual:"Manual"}},fr:{reservationStepOne:{errors:{openingHoursNotSet:"Horaires non d\xE9finies.",clickHereToSet:"Cliquez ici pour d\xE9finir vos horaires."},modes:{withLimits:"Avec Limites",unlimited:"Illimit\xE9",openingHours:"Horaires",free:"Libre"},fields:{time:"Heure"},messages:{searchingTables:"Recherche de tables disponibles...",noTablesAvailable:"Aucune table sp\xE9cifique disponible pour cette s\xE9lection."},warnings:{unlimitedMode:"Illimit\xE9 ne tiendra pas compte des limites maximales."}},calendar:{selectDatePlaceholder:"S\xE9lectionnez une date",today:"Aujourd'hui",tomorrow:"Demain",prevWeek:"Semaine pr\xE9c\xE9dente",nextWeek:"Semaine suivante",dayHeaders:["Lu","Ma","Me","Je","Ve","Sa","Di"],seatsQuestion:"Places ?"},timeSelector:{shifts:{breakfast:"Petit-d\xE9jeuner",lunch:"D\xE9jeuner",dinner:"D\xEEner"},selectMeal:"S\xE9lectionnez un repas",selectTime:"S\xE9lectionnez une heure",noDateSelected:"Veuillez d'abord s\xE9lectionner une date.",noTimes:"Aucun horaire disponible.",back:"Retour",reservations:"R\xE9servations",guests:"Convives"},tableSelector:{label:"S\xE9lectionnez les table(s) disponibles :",table:"Table",max:"Max",noTables:"Aucune table sp\xE9cifique disponible pour cette combinaison temps/convives.",manual:"Manuel"}}};var Eb=memo(({guests:p,selectedDate:c,onSelectDate:e,autoExpand:q,reservationMode:W,restaurantData:a,startDate:n,onWeekChange:s,reservations:r,giftcard:f,zitplaats:g,isAdmin:N=false})=>{let u=localStorage.getItem("preferredLanguage")||"nl",h=a1[u].calendar,[R,X]=useState(q||false),[B,l]=useState(false),E=useRef(null),S=useRef(null),v=(0, s1.default)().tz("Europe/Amsterdam").add(1,"year").endOf("day");useEffect(()=>{q&&X(true);},[q]),useEffect(()=>{let _=V=>{E.current&&!E.current.contains(V.target)&&(X(false),l(false));};return document.addEventListener("mousedown",_),()=>{document.removeEventListener("mousedown",_);}},[]),useEffect(()=>()=>{S.current&&(clearTimeout(S.current),S.current=null);},[]);let y=()=>{S.current&&(clearTimeout(S.current),S.current=null),l(true);},m=(_=1e3)=>{S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{l(false),S.current=null;},_);},w=useCallback((_,V,p0=[])=>{if(_.isBefore(V,"day")||_.isAfter(v,"day"))return 0;let I=_.format("YYYY-MM-DD");if(W==="vrije_keuze")return 21;if(W!=="met_limieten"&&!B)return (0, R1.isDateAvailable)(a,I,r,-1e4,p0,null,N)?21:0;let $=a?.["table-settings"]||{},c0=$.isInstalled===true&&$.assignmentMode==="automatic"&&(B||W==="met_limieten"),D=Z=>c0?O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,I,r,Z,p0,null,N):O1("isDateAvailable",R1.isDateAvailable,a,I,r,Z,p0,null,N);if(!D(1))return 0;if(D(21))return 21;let d0=1,J=21,G=1;for(;d0<=J;){let Z=Math.floor((d0+J)/2);D(Z)?(G=Z,d0=Z+1):J=Z-1;}return G},[a,r,f,N,W,B]),P=useMemo(()=>{if(!R)return [];let _=[],V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=n||V,I=a?.["blocked-slots"]||[],$=p0.clone().startOf("month"),c0=p0.clone().endOf("month"),D=a?.["table-settings"]||{},d0=D.isInstalled===true&&D.assignmentMode==="automatic"&&W==="met_limieten",J=$.clone();for(;J.isSameOrBefore(c0,"day");){let G=J.format("YYYY-MM-DD"),Z;if(W==="vrije_keuze")Z=J.isBetween(V,v,null,"[]");else {let H0=W!=="met_limieten"?-1e4:p,A1=W==="met_limieten"?f:null;d0?Z=O1("isDateAvailableWithTableCheck",R1.isDateAvailableWithTableCheck,a,G,r,H0,I,A1,N):Z=O1("isDateAvailable",R1.isDateAvailable,a,G,r,H0,I,A1,N);}let D0=w(J,V,I);_.push({date:J.clone(),isPast:J.isBefore(V,"day"),isFuture:J.isAfter(v,"day"),isAvailable:Z,maxGuestsAvailable:D0}),J.add(1,"day");}return _},[R,n,p,W,a,r,f,g,B,N]),x=_=>{_.isAvailable&&!_.isPast&&!_.isFuture&&(e(_.date.format("YYYY-MM-DD")),X(false),l(false));},z0=()=>{let _=n.clone().subtract(1,"month").startOf("month"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day");if(_.clone().endOf("month").isBefore(V,"day")){console.log("Cannot go to previous month. It is in the past.");return}s(_);},q0=()=>{let _=n.clone().add(1,"month").startOf("month");s(_);},R0=()=>{if(!c)return h.selectDatePlaceholder;let _=(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam").startOf("day"),V=(0, s1.default)().tz("Europe/Amsterdam").startOf("day"),p0=V.clone().add(1,"day");return _.isSame(V,"day")?h.today:_.isSame(p0,"day")?h.tomorrow:_.format("dddd D MMMM YYYY")},Q=n?(_=>{let p0=n.clone().startOf("month").day(),I=p0===0?6:p0-1,$=[];for(let J=0;J<I;J++)$.push(null);$.push(..._);let c0=$.length,D=Math.ceil(c0/7);for(;$.length<D*7;)$.push(null);let d0=[];for(let J=0;J<D;J++){let G=$.slice(J*7,J*7+7);d0.push(G);}return d0})(P):[],K=h.dayHeaders,b0=_=>_>=21?"20+":String(_);return o0.createElement("div",{className:"calendar-container",ref:E},o0.createElement("div",{className:"calendar-display",onClick:()=>X(!R)},o0.createElement("span",null,R0()),o0.createElement("span",{className:"arrow"},o0.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",style:{transform:R?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s"}},o0.createElement("path",{d:"M7 10l5 5 5-5",fill:"none",stroke:"currentColor",strokeWidth:"2"})))),R&&n&&o0.createElement("div",{className:"calendar"},o0.createElement("div",{className:"calendar-header"},o0.createElement("button",{type:"button",onClick:z0,"aria-label":h.prevWeek},"<"),o0.createElement("span",null,n.format("MMMM YYYY")),o0.createElement("button",{type:"button",onClick:q0,"aria-label":h.nextWeek},">"),o0.createElement("button",{type:"button",className:`availability-hold-btn ${B?"active":""}`,"aria-pressed":B,"aria-label":"Houd ingedrukt om beschikbaarheden te tonen",onMouseDown:y,onMouseUp:()=>m(1e3),onMouseLeave:()=>m(1e3),onTouchStart:y,onTouchEnd:()=>m(1e3),onTouchCancel:()=>m(1e3),onKeyDown:_=>{(_.key===" "||_.key==="Enter")&&y();},onKeyUp:_=>{(_.key===" "||_.key==="Enter")&&m(1e3);},style:{fontSize:"15px",color:"gray",fontWeight:"450",textDecoration:"underline"}},h.seatsQuestion)),o0.createElement("div",{className:"calendar-weeks-wrapper"},o0.createElement("table",{className:"calendar-table"},o0.createElement("thead",null,o0.createElement("tr",{translate:"no"},K.map((_,V)=>o0.createElement("th",{key:V},_)))),o0.createElement("tbody",null,Q.map((_,V)=>o0.createElement("tr",{key:V,translate:"no"},_.map((p0,I)=>{if(!p0)return o0.createElement("td",{key:I,className:"empty-day"});let $=c&&Sz(p0.date,(0, s1.default)(c,"YYYY-MM-DD").tz("Europe/Amsterdam")),c0=[];return p0.isPast?c0.push("gray-out"):p0.isAvailable?c0.push("available"):c0.push("unavailable"),$&&c0.push("selected"),o0.createElement("td",{key:I,className:c0.join(" "),onClick:()=>x(p0),style:{"--animation-order":I+V*7}},o0.createElement("div",{className:`day-square ${B?"showing-availabilities":""}`},o0.createElement("span",{className:"day-number"},B?b0(p0.maxGuestsAvailable):p0.date.date())))}))))))))});Eb.displayName="Calendar";var Cb=Eb;var BM=x0(b1()),wo=({guests:p,formData:c,handleChange:e,resetFormDataFields:q,restaurantData:W,reservations:a,startDate:n,onWeekChange:s,reservationMode:r,isAdmin:f=false})=>{let g=u=>{let h=(0, BM.default)(u).format("YYYY-MM-DD");console.log("Selected date:",h),e({target:{name:"date",value:h}}),q(["time"]);},N=n?n.clone().startOf("month"):(0, BM.default)().startOf("month");return o0.createElement("div",{className:"form-group date-selector-container"},o0.createElement(Cb,{guests:p,selectedDate:c.date||null,onSelectDate:g,autoExpand:false,reservationMode:r,restaurantData:W,startDate:N,onWeekChange:s,reservations:a,giftcard:c.giftcard,zitplaats:c.zitplaats,isAdmin:f}))},xb=wo;s0(`.new-reservation-page .time-selector-container{position:relative}.new-reservation-page .time-display{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;user-select:none;text-align:left;border-radius:5px}.new-reservation-page .time-display span:first-child{flex-grow:1}.new-reservation-page .time-selector{position:absolute;z-index:1000;width:100%;max-height:350px;overflow-y:auto;background-color:#fff;border:1px solid #ccc;padding:10px;border-radius:10px;animation:fadeInTimeSelector .3s ease-in-out;top:75px}.new-reservation-page .time-toggle-container{display:flex;gap:8px;padding-bottom:10px;margin-bottom:10px;border-bottom:1px solid #eee}.new-reservation-page .time-toggle-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:20px;border:1px solid #ddd;background-color:#f5f5f5;color:#666;font-size:13px;cursor:pointer;transition:all .2s ease;font-family:inherit}.new-reservation-page .time-toggle-btn:hover{background-color:#e8e8e8;border-color:#ccc}.new-reservation-page .time-toggle-btn.active{background-color:var(--color-blue, #48aaaf);border-color:var(--color-blue, #48aaaf);color:#fff}.new-reservation-page .time-toggle-btn.active:hover{background-color:var(--color-blue, #48aaaf);filter:brightness(.95)}.new-reservation-page .time-toggle-btn svg{flex-shrink:0}.new-reservation-page .time-count{font-weight:400;opacity:.9}@keyframes fadeInTimeSelector{0%{opacity:0}to{opacity:1}}.new-reservation-page .time-period{margin-bottom:15px}.new-reservation-page .time-period-label{font-weight:700;margin-bottom:5px}.new-reservation-page .time-options{display:flex;flex-wrap:wrap;gap:5px}.new-reservation-page .time-option{padding:8px 12px;background-color:#cfc;color:#060;border-radius:5px;cursor:pointer;transition:background-color .2s ease}.new-reservation-page .time-option:hover{background-color:#b3ffb3}.new-reservation-page .time-option.selected{background-color:#060;color:#cfc}.new-reservation-page .info-text{color:#666;font-style:italic}.new-reservation-page .arrow{margin-left:auto;color:gray;display:flex;align-items:center}@media screen and (max-width:480px){.new-reservation-page .time-option{padding:6px 10px;font-size:14px}.new-reservation-page .time-toggle-btn{padding:5px 10px;font-size:12px;gap:4px}.new-reservation-page .time-toggle-btn svg{width:12px;height:12px}}
11
11
  `);var XM=x0(b1());var T2=x0(U1()),Db=memo(({guests:p,formData:c,handleChange:e,field:q,selectedDate:W,expanded:a,setCurrentExpandedField:n,restaurantData:s,reservations:r,reservationMode:f,isAdmin:g=false})=>{let N=localStorage.getItem("preferredLanguage")||"nl",u=a1[N].timeSelector,[h,R]=useState(a||false),[X,B]=useState([]),[l,E]=useState(null),[S,v]=useState(null),y=useRef(null),m=useMemo(()=>{if(!r||!W)return {};let F={};return r.forEach(Q=>{if((Q.date||Q.datum)!==W)return;let b0=Q.time||Q.tijd;if(!b0)return;let _=Q.guests||Q.antal||Q.gasten||1;F[b0]||(F[b0]={reservations:0,guests:0}),F[b0].reservations+=1,F[b0].guests+=_;}),F},[r,W]),w=F=>m[F]||{reservations:0,guests:0},P=F=>{v(S===F?null:F);},x={breakfast:{start:"07:00",end:"11:00",label:u.shifts.breakfast},lunch:{start:"11:00",end:"16:00",label:u.shifts.lunch},dinner:{start:"16:00",end:"23:00",label:u.shifts.dinner}};useEffect(()=>{if(!W||!p){B([]);return}if(f==="vrije_keuze")if(l){let F=x[l],Q=XM.default.tz(`${W} ${F.start}`,"YYYY-MM-DD HH:mm","Europe/Brussels"),K=XM.default.tz(`${W} ${F.end}`,"YYYY-MM-DD HH:mm","Europe/Brussels"),b0=[],_=Q.clone();for(;_.isBefore(K);)b0.push({value:_.format("HH:mm"),label:_.format("HH:mm")}),_.add(15,"minutes");B(b0);}else B([]);else if(s&&r){let F=f!=="met_limieten"?-1e4:p,Q=s?.["table-settings"]||{},K=f==="met_limieten"&&Q.isInstalled===true&&Q.assignmentMode==="automatic",b0=f==="met_limieten"?c.giftcard:null,_=s?.["blocked-slots"]||[],V=(0, T2.getAvailableTimeblocks)(s,W,r,F,_,b0,g,c.duration),p0=K?(0, T2.getAvailableTimeblocksWithTableCheck)(s,W,V,F,r,c.duration):V,I=Object.keys(p0).map($=>({value:$,label:p0[$].name||$}));I.sort(($,c0)=>{let[D,d0]=$.value.split(":").map(Number),[J,G]=c0.value.split(":").map(Number);return D*60+d0-(J*60+G)}),B(I),c[q.id]&&!I.some($=>$.value===c[q.id])&&e({target:{name:q.id,value:""}});}else B([]);},[W,p,s,r,f,q.id,l,c[q.id],e]),useEffect(()=>{f==="vrije_keuze"&&(E(null),c[q.id]&&e({target:{name:q.id,value:""}}));},[W,f]);let z0=F=>{e({target:{name:q.id,value:F}}),R(false),n?.(null);},q0=F=>{l!==F&&c[q.id]&&e({target:{name:q.id,value:""}}),E(F);},R0=()=>{if(f==="vrije_keuze")return l?c[q.id]?`${x[l].label} \u2013 ${c[q.id]}`:`${x[l].label} \u2013 ${u.selectTime}`:u.selectMeal;if(c[q.id]){let F=X.find(Q=>Q.value===c[q.id]);return F?F.label:u.selectTime}return u.selectTime};return q?o0.createElement("div",{className:"form-group time-selector-container",ref:y},W?o0.createElement(o0.Fragment,null,o0.createElement("div",{className:"time-display",onClick:()=>{R(!h),h||n?.(q.id);}},o0.createElement("span",null,R0()),o0.createElement("span",{className:"arrow"},o0.createElement("svg",{width:"12",height:"12",viewBox:"0 0 24 24",style:{transform:h?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s"}},o0.createElement("path",{d:"M7 10l5 5 5-5",fill:"none",stroke:"currentColor",strokeWidth:"2"})))),h&&o0.createElement("div",{className:"time-selector"},o0.createElement("div",{className:"time-toggle-container"},o0.createElement("button",{className:`time-toggle-btn ${S==="reservations"?"active":""}`,onClick:()=>P("reservations"),type:"button"},o0.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},o0.createElement("rect",{x:"3",y:"4",width:"18",height:"18",rx:"2",ry:"2"}),o0.createElement("line",{x1:"16",y1:"2",x2:"16",y2:"6"}),o0.createElement("line",{x1:"8",y1:"2",x2:"8",y2:"6"}),o0.createElement("line",{x1:"3",y1:"10",x2:"21",y2:"10"})),u.reservations),o0.createElement("button",{className:`time-toggle-btn ${S==="guests"?"active":""}`,onClick:()=>P("guests"),type:"button"},o0.createElement("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2"},o0.createElement("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),o0.createElement("circle",{cx:"9",cy:"7",r:"4"}),o0.createElement("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87"}),o0.createElement("path",{d:"M16 3.13a4 4 0 0 1 0 7.75"})),u.guests)),f==="vrije_keuze"?l?o0.createElement("div",{className:"time-period"},o0.createElement("div",{className:"time-period-label"},x[l].label,o0.createElement("button",{onClick:()=>E(null),style:{marginLeft:"10px",background:"none",border:"none",cursor:"pointer",color:"#006600",fontSize:"0.9rem",padding:0}},"\u2190 ",u.back)),o0.createElement("div",{className:"time-options"},X.length===0?o0.createElement("div",{className:"no-times"},u.noTimes):X.map(F=>{let Q=w(F.value);return o0.createElement("div",{key:F.value,className:`time-option ${c[q.id]===F.value?"selected":""}`,onClick:()=>z0(F.value)},F.label,S==="reservations"&&Q.reservations>0&&o0.createElement("span",{className:"time-count"}," - ",Q.reservations),S==="guests"&&Q.guests>0&&o0.createElement("span",{className:"time-count"}," - ",Q.guests,"p"))}))):o0.createElement("div",{className:"time-options"},Object.keys(x).map(F=>o0.createElement("div",{key:F,className:`time-option ${l===F?"selected":""}`,onClick:()=>q0(F)},x[F].label))):o0.createElement("div",{className:"time-options"},X.length===0?o0.createElement("div",{className:"no-times"},u.noTimes):X.map(F=>{let Q=w(F.value);return o0.createElement("div",{key:F.value,className:`time-option ${c[q.id]===F.value?"selected":""}`,onClick:()=>z0(F.value)},F.label,S==="reservations"&&Q.reservations>0&&o0.createElement("span",{className:"time-count"}," - ",Q.reservations),S==="guests"&&Q.guests>0&&o0.createElement("span",{className:"time-count"}," - ",Q.guests,"p"))})))):o0.createElement("p",{className:"info-text"},u.noDateSelected)):null});Db.displayName="TimeSelector";var Pb=Db;s0(`.new-reservation-page .table-selector-container{margin-top:15px;padding:10px;border:1px solid #eee;border-radius:4px;background-color:#f9f9f9}.new-reservation-page .table-selector-label{display:block;margin-bottom:10px;font-weight:700;color:#333;font-size:.95rem}.new-reservation-page .table-options{display:flex;flex-wrap:wrap;gap:10px}.new-reservation-page .table-option{display:inline-block;margin-right:15px;margin-bottom:5px;padding:5px 8px;border:1px solid #ccc;border-radius:4px;background-color:#fff;transition:background-color .2s ease}.new-reservation-page .table-option label{display:flex;align-items:center;cursor:pointer;font-size:.9rem;color:#555}.new-reservation-page .table-option input[type=checkbox]{margin-right:8px;cursor:pointer;accent-color:var(--primary-color, #006600)}.new-reservation-page .table-option:has(input[type=checkbox]:checked){background-color:#e0f2e0;border-color:#060}.new-reservation-page .table-option:hover{background-color:#f0f0f0}.new-reservation-page .info-text{margin-top:10px;font-size:.85rem;color:#666}.new-reservation-page .selected-tables-info{margin-top:10px;font-style:italic}.new-reservation-page .info-text.loading-tables{font-style:italic;color:#060}.new-reservation-page .table-option--manual{border-color:#ff9800;background-color:#fff8e1}.new-reservation-page .table-option--manual:hover{background-color:#ffecb3}.new-reservation-page .table-option--manual:has(input[type=checkbox]:checked){background-color:#ffe082;border-color:#ff9800}
12
12
  `);var Io=({availableTables:p=[],isFetching:c=false,formData:e={},handleChange:q,setFormData:W})=>{let a=localStorage.getItem("preferredLanguage")||"nl",n=a1?.[a]?.tableSelector||{},s={label:n.label||"Tafels",noTables:n.noTables||"Geen tafels beschikbaar voor deze selectie.",table:n.table||"Tafel",max:n.max||"Max"},r=Array.isArray(e.selectedTableNumbers)?e.selectedTableNumbers:[],f=Array.isArray(e.selectedTableIds)?e.selectedTableIds:[],g=(u,h)=>{if(typeof q=="function"){q({target:{multiple:true,updates:{selectedTableNumbers:u,selectedTableIds:h}}});return}typeof W=="function"&&W(R=>({...R,selectedTableNumbers:u,selectedTableIds:h}));},N=u=>h=>{let R=h.target.checked,X=p.find(E=>E.tableNumber===u);if(!X)return;let B=[...r],l=[...f];R?(B.includes(u)||B.push(u),l.includes(X.tableId)||l.push(X.tableId)):(B=B.filter(E=>E!==u),l=l.filter(E=>E!==X.tableId)),B.sort((E,S)=>E-S),g(B,l);};return c?o0.createElement("div",{className:"form-group table-selector-container"},o0.createElement("label",{className:"table-selector-label"},s.label),o0.createElement("p",{className:"info-text"},"Laden\u2026")):!p||p.length===0?o0.createElement("div",{className:"form-group table-selector-container"},o0.createElement("label",{className:"table-selector-label"},s.label),o0.createElement("p",{className:"info-text"},s.noTables)):o0.createElement("div",{className:"form-group table-selector-container"},o0.createElement("label",{className:"table-selector-label"},s.label),o0.createElement("div",{className:"table-options"},p.map(u=>{let h=u.tableNumber,R=u.maxCapacity??u.capacity??u.seats??"-",X=r.includes(h),B=u.isManual===true;return o0.createElement("div",{key:`${u.tableId||h}`,className:`table-option${B?" table-option--manual":""}`},o0.createElement("label",null,o0.createElement("input",{type:"checkbox",value:h,checked:X,onChange:N(h)}),s.table," ",h," (",s.max,": ",R,")"))})))},g2=Io;s0(`.new-reservation-page .form-row .field-label{display:block;margin-bottom:6px;font-weight:600}.new-reservation-page .form-row .reservation-mode-buttons{margin-top:0}.new-reservation-page .reservation-mode-buttons{display:flex;gap:10px;margin-top:10px}.new-reservation-page .reservation-mode-button{flex:1;padding:10px;border:1px solid #ccc;border-radius:var(--border-radius);background-color:var(--color-white);cursor:pointer;font-size:1rem;transition:background-color .3s ease,color .3s ease}.new-reservation-page .reservation-mode-button:nth-child(3){flex:0 0 100%}.new-reservation-page .reservation-modes-container{display:flex;flex-wrap:wrap;margin:0 -5px;width:100%}.new-reservation-page .reservation-mode-button{flex:0 0 calc(50% - 10px);margin:5px;padding:10px;box-sizing:border-box;text-align:center;border:1px solid #ccc;background:#f7f7f7;cursor:pointer}.new-reservation-page .reservation-mode-button.active,.new-reservation-page .reservation-mode-button:hover{background-color:var(--color-blue);color:var(--color-white)}.new-reservation-page .unlimited-mode-warning{display:flex;align-items:flex-start;gap:10px;margin:15px 0;padding:12px 15px;background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:var(--border-radius, 4px);border-left:4px solid #e67e22;font-size:.9rem;line-height:1.4}.new-reservation-page .unlimited-mode-warning .warning-icon{color:#e67e22;font-size:1.1rem;margin-top:2px;flex-shrink:0}.new-reservation-page .unlimited-mode-warning .warning-text{color:#856404;margin:0}@media screen and (max-width:480px){.new-reservation-page .unlimited-mode-warning{margin:10px 0;padding:10px 12px;font-size:.85rem}.new-reservation-page .unlimited-mode-warning .warning-icon{font-size:1rem}}.new-reservation-page .reservation-sidebar-component{position:fixed;top:0;right:-400px;width:400px;height:100%;background-color:#fff;box-shadow:-2px 0 5px #0000001a;z-index:var(--z-index-sidebar-reservation);display:flex;flex-direction:column;overflow-y:auto;transition:right .3s ease-in-out}.new-reservation-page .admin-title{text-align:center;margin-bottom:30px}.new-reservation-page .reservation-sidebar-component.open{right:0}.new-reservation-page .reservation-sidebar-content{padding:60px 20px 20px}.new-reservation-page .close-sidebar-button{position:absolute;top:10px;left:10px;background-color:transparent;border:none;cursor:pointer}.new-reservation-page .close-sidebar-button svg{color:#000}.new-reservation-page .sidebar-section-one,.new-reservation-page .sidebar-section-two{margin-bottom:20px}.new-reservation-page .reservation-footer{margin-top:auto}.new-reservation-page .store-reservation-button{width:100%;padding:12px;background-color:var(--color-blue);color:#fff;border:none;border-radius:5px;cursor:pointer;font-size:1.1rem}.new-reservation-page .open-sidebar-button{position:fixed;bottom:20px;right:20px;background-color:var(--color-blue);color:#fff;border:none;border-radius:50%;width:50px;height:50px;cursor:pointer;z-index:var(--z-index-modal)!important;transition:all .3s ease}.new-reservation-page .open-sidebar-button:hover{background-color:var(--color-blue-hover-accent)!important}.new-reservation-page .open-sidebar-button svg{position:relative;top:2px}@media screen and (max-width:480px){.new-reservation-page .reservation-sidebar-component{width:100%}}.new-reservation-page .sidebar-section-personeel{margin-bottom:10px}
13
13
  `);var Gb=x0(b1());var Go=()=>{let p=useCallback(()=>localStorage.getItem("accessToken"),[]),c=useCallback((W,a={})=>{let{params:n,...s}=a,r=p();return _b.get(W,{...s,params:n,headers:{...s.headers,...r?{Authorization:`Bearer ${r}`}:{}}}).then(f=>f.data).catch(f=>{throw console.error("Error fetching data:",f),f})},[p]),e=useCallback((W,a,n=null,s={})=>{let r=p();return _b({method:W,url:a,data:n,...s,headers:{...s.headers,...r?{Authorization:`Bearer ${r}`}:{}}}).then(f=>f.data).catch(f=>{throw console.error(`Error with ${W} request:`,f),f})},[p]);return useMemo(()=>({get:c,post:(W,a,n)=>e("POST",W,a,n),put:(W,a,n)=>e("PUT",W,a,n),patch:(W,a,n)=>e("PATCH",W,a,n),delete:(W,a)=>e("DELETE",W,null,a)}),[c,e])},c1=Go;var Hb=x0(U1());var Vo=({duration:p,setDuration:c,handleChange:e,min:q=30,max:W=120,interval:a=30})=>{let [n,s]=useState(false),r=useMemo(()=>{let l=[],E=parseInt(q)||30,S=parseInt(W)||120,v=parseInt(a)||30;for(let y=E;y<=S;y+=v){let m=[],w=Math.floor(y/60),P=y%60;w>0&&m.push(`${w} u`),P>0&&m.push(`${P} min`),l.push({value:y,label:m.join(" ")});}return l},[q,W,a]),f=r.slice(0,3),g=r.length>3;f.some(l=>l.value===parseInt(p));let u=l=>{s(false),c&&c(l),e&&e({target:{name:"duration",value:l}});};useEffect(()=>{!p&&r.length>0&&u(r[0].value);},[]);let h=()=>{let l=f[f.length-1],E=parseInt(a)||30;if(l){let S=l.value+E,v=parseInt(W)||120,y=Math.min(S,v);c&&c(y),e&&e({target:{name:"duration",value:y}}),s(true);}else s(true);},R=l=>{let E=parseInt(p)||parseInt(q)||30,S=parseInt(a)||30,v=parseInt(q)||30,y=parseInt(W)||120,m=E+l*S;m<v&&(m=v),m>y&&(m=y),c&&c(m),e&&e({target:{name:"duration",value:m}});},X={wrapper:{marginBottom:"20px"},grid:{display:"flex",flexWrap:"wrap",gap:"8px"},optionBtn:{padding:"8px 12px",borderRadius:"6px",border:"1px solid #D0D5DD",backgroundColor:"#fff",cursor:"pointer",fontSize:"14px",fontWeight:"500",color:"#344054",textAlign:"center",transition:"all 0.2s",outline:"none",fontFamily:"'Inter', sans-serif', system-ui",flex:1,minWidth:"60px"},activeBtn:{backgroundColor:"#48AAAF",color:"#ffffff",borderColor:"#48AAAF"},stepperContainer:{display:"flex",alignItems:"center",justifyContent:"space-between",marginTop:"10px",padding:"8px",backgroundColor:"#F9FAFB",border:"1px solid #EAECF0",borderRadius:"8px",width:"100%"},stepperBtn:{width:"32px",height:"32px",display:"flex",alignItems:"center",justifyContent:"center",borderRadius:"6px",border:"1px solid #D0D5DD",backgroundColor:"#fff",cursor:"pointer",color:"#344054"},stepperValue:{fontSize:"14px",fontWeight:"600",color:"#101828"}},B=l=>{let E=Math.floor(l/60),S=l%60,v=[];return E>0&&v.push(`${E} u`),S>0&&v.push(`${S} min`),v.join(" ")||`${l} min`};return o0.createElement("div",{style:X.wrapper},o0.createElement("style",null,`
package/package.json CHANGED
@@ -1,58 +1,58 @@
1
- {
2
- "name": "@happychef/reservation-sidebar",
3
- "version": "2.7.10",
4
- "description": "A compound component for managing restaurant reservations - JavaScript version with independent styles",
5
- "main": "dist/index.js",
6
- "module": "dist/index.mjs",
7
- "files": [
8
- "dist",
9
- "README.md"
10
- ],
11
- "exports": {
12
- ".": {
13
- "import": "./dist/index.mjs",
14
- "require": "./dist/index.js"
15
- }
16
- },
17
- "scripts": {
18
- "build": "tsup",
19
- "dev": "tsup --watch",
20
- "prepublishOnly": "npm run build"
21
- },
22
- "keywords": [
23
- "react",
24
- "reservation",
25
- "sidebar",
26
- "restaurant",
27
- "happychef"
28
- ],
29
- "author": "HappyChef",
30
- "license": "MIT",
31
- "peerDependencies": {
32
- "axios": "^1.0.0",
33
- "framer-motion": "^10.0.0 || ^11.0.0 || ^12.0.0",
34
- "lottie-react": "^2.0.0",
35
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
36
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
37
- "react-icons": "^4.0.0 || ^5.0.0"
38
- },
39
- "dependencies": {
40
- "moment-timezone": "^0.5.48"
41
- },
42
- "devDependencies": {
43
- "@happychef/algorithm": "^1.2.14",
44
- "axios": "^1.7.9",
45
- "framer-motion": "^12.23.24",
46
- "lottie-react": "^2.4.1",
47
- "moment-timezone": "^0.5.48",
48
- "react": "^18.3.1",
49
- "react-dom": "^18.3.1",
50
- "react-icons": "^5.3.0",
51
- "tsup": "^8.5.1",
52
- "typescript": "^5.9.3"
53
- },
54
- "repository": {
55
- "type": "git",
56
- "url": "https://github.com/thibaultvandesompele2/16-happy-admin-reservation.git"
57
- }
58
- }
1
+ {
2
+ "name": "@happychef/reservation-sidebar",
3
+ "version": "2.8.2",
4
+ "description": "A compound component for managing restaurant reservations - JavaScript version with independent styles",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.mjs",
14
+ "require": "./dist/index.js"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "dev": "tsup --watch",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "react",
24
+ "reservation",
25
+ "sidebar",
26
+ "restaurant",
27
+ "happychef"
28
+ ],
29
+ "author": "HappyChef",
30
+ "license": "MIT",
31
+ "peerDependencies": {
32
+ "axios": "^1.0.0",
33
+ "framer-motion": "^10.0.0 || ^11.0.0 || ^12.0.0",
34
+ "lottie-react": "^2.0.0",
35
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
36
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
37
+ "react-icons": "^4.0.0 || ^5.0.0"
38
+ },
39
+ "dependencies": {
40
+ "moment-timezone": "^0.5.48"
41
+ },
42
+ "devDependencies": {
43
+ "@happychef/algorithm": "^1.2.14",
44
+ "axios": "^1.7.9",
45
+ "framer-motion": "^12.23.24",
46
+ "lottie-react": "^2.4.1",
47
+ "moment-timezone": "^0.5.48",
48
+ "react": "^18.3.1",
49
+ "react-dom": "^18.3.1",
50
+ "react-icons": "^5.3.0",
51
+ "tsup": "^8.5.1",
52
+ "typescript": "^5.9.3"
53
+ },
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "https://github.com/thibaultvandesompele2/16-happy-admin-reservation.git"
57
+ }
58
+ }