@happychef/reservation-sidebar 2.8.44 → 2.8.45
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 +202 -202
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +56 -56
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
|
@@ -39,7 +39,7 @@ Checking Time: ${v} -> Determined Meal: ${B}`),!B){N0(` Time ${v} has no associ
|
|
|
39
39
|
border-color: #48AAAF !important;
|
|
40
40
|
}
|
|
41
41
|
`),o0__default.default.createElement("div",{style:g.grid},R.map(N=>o0__default.default.createElement("button",{key:N.value,type:"button",className:`duration-btn ${parseInt(b)===N.value?"active-duration":""}`,tabIndex:"-1",style:{...g.optionBtn,...!a&&parseInt(b)===N.value?g.activeBtn:{}},onClick:()=>B(N.value),onMouseDown:C=>C.preventDefault()},N.label)),v&&o0__default.default.createElement("button",{type:"button",className:`duration-btn ${a?"active-duration":""}`,tabIndex:"-1",style:{...g.optionBtn,...a?g.activeBtn:{},flex:"0 0 auto",width:"auto",minWidth:"40px"},onClick:h,onMouseDown:N=>N.preventDefault()},a?o0__default.default.createElement(fa.FaMinus,{size:12}):o0__default.default.createElement(fa.FaPlus,{size:12}))),o0__default.default.createElement(framerMotion.AnimatePresence,null,a&&o0__default.default.createElement(framerMotion.motion.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},style:{overflow:"hidden"}},o0__default.default.createElement("div",{style:g.stepperContainer},o0__default.default.createElement("button",{type:"button",style:g.stepperBtn,onClick:()=>f(-1)},o0__default.default.createElement(fa.FaMinus,{size:12})),o0__default.default.createElement("span",{style:g.stepperValue},l(parseInt(b)||0)),o0__default.default.createElement("button",{type:"button",style:g.stepperBtn,onClick:()=>f(1)},o0__default.default.createElement(fa.FaPlus,{size:12}))))))},S2=M4;var Qb=o0.memo(({formData:b,errors:c,handleChange:q,handleStepOneSubmit:e,setFormData:W,timeblocks:n,loadingTimeblocks:a,timeblocksError:s,restaurantData:r,isAdmin:R=false})=>{let v=localStorage.getItem("preferredLanguage")||"nl",u=a1[v].reservationStepOne,[B,h]=o0.useState(b.guests||2),[f,g]=o0.useState(null),[l,N]=o0.useState([]),C=o1(),[E,y]=o0.useState([]),[S,m]=o0.useState(false),[j,_]=o0.useState(false),H=o0.useRef(false),A0=o0.useRef(false),p0=o0.useRef(false),a0=o0.useCallback(F=>{W(k=>{let J={...k};return F.forEach(z0=>{J[z0]="";}),(F.includes("date")||F.includes("time")||F.includes("guests"))&&(J.selectedTableNumbers=[],J.selectedTableIds=[],y([])),J});},[W]);o0.useEffect(()=>{let k=(0, Vb.default)().tz("Europe/Amsterdam").startOf("day").clone().startOf("isoWeek");for(;kz(k);)k.add(1,"week");g(k);},[]),o0.useEffect(()=>{(async()=>{if(f&&(b.reservationMode==="met_limieten"||b.reservationMode==="zonder_regels"||b.reservationMode==="vrije_keuze")){let k=r?.["table-settings"]||{},J=k.isInstalled===true&&k.assignmentMode==="automatic";if(b.reservationMode==="met_limieten"||b.reservationMode==="vrije_keuze"||b.reservationMode==="zonder_regels"&&J){let z0=f.format("YYYY-MM-DD"),u0=f.clone().add(13,"days").format("YYYY-MM-DD"),T0=localStorage.getItem("username"),f0=`${window.baseDomain}api/slots/${T0}/${z0}/${u0}`;try{let A=await C.get(f0,{noCache:!0});N(A||[]);}catch(A){console.error("Error fetching reservations:",A),N([]);}}else N([]);}else N([]);})();},[f,C,b.reservationMode,r]),o0.useEffect(()=>{window.__reservationDashboardPreset&&b.date?(window.__reservationDashboardPreset=false,p0.current=true,A0.current=true):_(false);},[b.date]),o0.useEffect(()=>{if(p0.current&&r&&Object.keys(r).length>0&&b.date&&b.reservationMode==="met_limieten"){p0.current=false;let F=r?.["blocked-slots"]||[],k=b.guests||2,J=r?.["table-settings"]||{},z0=J.isInstalled===true&&J.assignmentMode==="automatic",u0;z0?u0=(0, U0.isDateAvailableWithTableCheck)(r,b.date,l,k,F,null,R,null,b.zitplaats||null):u0=(0, U0.isDateAvailable)(r,b.date,l,k,F,null,R),u0?(_(false),A0.current=false):(_(true),A0.current=true,W(T0=>({...T0,reservationMode:"vrije_keuze"})));}},[r,l,b.date,b.guests,b.reservationMode,R,W]);let q0=F=>{g(F),a0(["date","time","selectedTableNumbers","selectedTableIds"]);};o0.useEffect(()=>{if(!H.current){let F=false,k={};b.reservationMode||(k.reservationMode="met_limieten",F=true),(!b.guests||b.guests==="")&&(k.guests=B,F=true),Array.isArray(b.selectedTableNumbers)||(k.selectedTableNumbers=[],F=true),Array.isArray(b.selectedTableIds)||(k.selectedTableIds=[],F=true),F&&setTimeout(()=>{q({target:{multiple:true,updates:k}});},0),H.current=true;}},[b.reservationMode,b.guests,b.selectedTableNumbers,b.selectedTableIds,B,q]);let Y=o0.useMemo(()=>r?.["table-settings"]||{},[r]),X=o0.useMemo(()=>Y.isInstalled===true&&Y.assignmentMode==="automatic",[Y]),U=o0.useMemo(()=>["met_limieten","zonder_regels","vrije_keuze"].includes(b.reservationMode),[b.reservationMode]),x=o0.useMemo(()=>U&&b.date&&b.time&&b.guests>0&&X&&E.length>0,[U,b.date,b.time,b.guests,X,E.length]);o0.useEffect(()=>{if(!X||!b.date||!b.time||b.guests<=0||!r||!l){y([]),m(false);return}m(true);let F=setTimeout(()=>{(window.requestIdleCallback||(J=>setTimeout(J,1)))(()=>{try{let J=new Set;r?.manualFloors&&Array.isArray(r.manualFloors)&&r.manualFloors.forEach(A=>{(A.tables||[]).forEach(d=>{d.tableNumber!=null&&J.add(d.tableNumber);});});let z0=[...r?.floors||[],...r?.manualFloors||[]],u0={...r,floors:z0},f0=F0("getAvailableTablesForTime",U0.getAvailableTablesForTime,u0,b.date,b.time,b.guests,l,b.zitplaats||null).map(A=>({...A,isManual:J.has(A.tableNumber)}));y(f0);}catch(J){console.error("Error calculating available tables:",J),y([]);}finally{m(false);}});},500);return ()=>{clearTimeout(F),m(false);}},[X,b.date,b.time,b.guests,b.zitplaats,r,l]),o0.useEffect(()=>{if(E.length>0){let F=b.selectedTableNumbers||[],k=b.selectedTableIds||[],J=[],z0=[];F.forEach(u0=>{let T0=E.find(f0=>f0.tableNumber===u0);T0&&k.includes(T0.tableId)&&(J.push(u0),z0.push(T0.tableId));}),J.length!==F.length&&setTimeout(()=>{q({target:{multiple:true,updates:{selectedTableNumbers:J,selectedTableIds:z0}}});},0);}else (b.selectedTableNumbers?.length>0||b.selectedTableIds?.length>0)&&setTimeout(()=>{q({target:{multiple:true,updates:{selectedTableNumbers:[],selectedTableIds:[]}}});},0);},[E,b.selectedTableNumbers,b.selectedTableIds]);let I=F=>{let k=parseInt(F.target.value,10)||1;h(k),_(false),W(J=>{let z0={...J,guests:k};if(z0.selectedTableNumbers=[],z0.selectedTableIds=[],z0.reservationMode==="vrije_keuze")return z0;if(z0.date&&r&&Object.keys(r).length>0){let u0=r?.["blocked-slots"]||[],T0=z0.reservationMode!=="met_limieten"?-1e4:k,f0=r?.["table-settings"]||{},A=z0.reservationMode==="met_limieten"&&f0.isInstalled===true&&f0.assignmentMode==="automatic",d;if(A?d=F0("isDateAvailableWithTableCheck",U0.isDateAvailableWithTableCheck,r,z0.date,l,T0,u0,null,R,null,z0.zitplaats||null):d=F0("isDateAvailable",U0.isDateAvailable,r,z0.date,l,T0,u0,null,R),!d)z0.date="",z0.time="";else if(z0.time){let t=(0, U0.getAvailableTimeblocks)(r,z0.date,l,T0,u0,null,R,z0.duration||null);(A?(0, U0.getAvailableTimeblocksWithTableCheck)(r,z0.date,t,T0,l,z0.zitplaats||null,z0.duration||null):t)[z0.time]||(z0.time="");}}return z0});};o0.useEffect(()=>{if(A0.current){A0.current=false;return}a0(["date","time","selectedTableNumbers","selectedTableIds"]);},[b.reservationMode,a0]);let V=F=>{_(false),F==="met_limieten"?q({target:{name:"reservationMode",value:"met_limieten"}}):F==="onbeperkt_parent"&&(["zonder_regels","vrije_keuze"].includes(b.reservationMode)||q({target:{name:"reservationMode",value:"zonder_regels"}}));},c0=F=>{_(false),q({target:{name:"reservationMode",value:F}});},O0=b.reservationMode,d0=!!r?.["general-settings"]?.seatSelectionEnabled,P=Array.isArray(r?.["general-settings"]?.seatAreas)?r["general-settings"].seatAreas:["Terras","Restaurant"],X0=F=>{W(k=>({...k,zitplaats:F}));};return s?o0__default.default.createElement("div",null,u.errors.openingHoursNotSet," ",o0__default.default.createElement("a",{href:"https://happychef.cloud/#/openinghours/dinner",target:"_blank",rel:"noopener noreferrer",style:{color:"var(--color-blue)",textDecoration:"underline"}},u.errors.clickHereToSet)):o0__default.default.createElement("form",{className:"account-manage-form",noValidate:true},o0__default.default.createElement("div",{className:"form-group reservation-mode"},o0__default.default.createElement("div",{className:"reservation-modes-container"},o0__default.default.createElement("button",{type:"button",className:`reservation-mode-button ${O0==="met_limieten"?"active":""}`,onClick:()=>V("met_limieten"),"aria-pressed":O0==="met_limieten"},u.modes.withLimits),o0__default.default.createElement("button",{type:"button",className:`reservation-mode-button ${["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)?"active":""}`,onClick:()=>V("onbeperkt_parent"),"aria-pressed":["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)},u.modes.unlimited)),["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)&&o0__default.default.createElement("div",{className:"reservation-modes-container sub-modes"},o0__default.default.createElement("button",{type:"button",className:`reservation-mode-button ${O0==="zonder_regels"?"active":""}`,onClick:()=>c0("zonder_regels"),"aria-pressed":O0==="zonder_regels"},u.modes.openingHours),o0__default.default.createElement("button",{type:"button",className:`reservation-mode-button ${O0==="vrije_keuze"?"active":""}`,onClick:()=>c0("vrije_keuze"),"aria-pressed":O0==="vrije_keuze"},u.modes.free))),["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)&&o0__default.default.createElement("div",{className:"unlimited-mode-warning"},o0__default.default.createElement("div",{className:"warning-text"},j?u.warnings?.dateNotAvailableWithLimits||"Let op: deze datum is niet beschikbaar met limieten voor dit aantal gasten. De modus is automatisch overgezet naar onbeperkt vrij.":u.warnings?.unlimitedMode||(v==="nl"?"Let op: Bij onbeperkte boekingen wordt geen rekening gehouden met de maximale capaciteit van het restaurant. De maximale zitplaatslimiet kan worden overschreden.":"Warning: Unlimited bookings do not take into account the restaurant's maximum capacity. The maximum seating limit may be exceeded."))),o0__default.default.createElement(d2,{setGuests:h,value:b.guests||B,onChange:I,error:c.guests}),d0&&U&&b.guests>0&&o0__default.default.createElement("div",{className:"form-row",style:{marginTop:12}},o0__default.default.createElement("div",{className:"reservation-mode-buttons"},P.map(F=>o0__default.default.createElement("button",{key:F,type:"button",className:`reservation-mode-button ${b.zitplaats===F?"active":""}`,onClick:()=>X0(F),"aria-pressed":b.zitplaats===F},F))),c.zitplaats&&o0__default.default.createElement("small",{className:"error"},c.zitplaats)),r?.account_type==="bowling"&&o0__default.default.createElement(S2,{duration:b.duration,handleChange:F=>{q(F),a0(["date","time","selectedTableNumbers","selectedTableIds"]);},min:r["general-settings"]?.minDuration||30,max:r["general-settings"]?.maxDuration||120,interval:r["general-settings"]?.durationInterval||30}),U&&b.guests>0&&o0__default.default.createElement(Fb,{guests:b.guests,formData:b,handleChange:q,resetFormDataFields:a0,restaurantData:r,reservations:l,startDate:f,onWeekChange:q0,reservationMode:O0,isAdmin:R}),U&&b.date&&o0__default.default.createElement(jb,{guests:b.guests,formData:b,handleChange:q,field:{id:"time",label:u.fields.time},selectedDate:b.date,setCurrentExpandedField:()=>{},restaurantData:r,reservations:l,reservationMode:O0,zitplaats:b.zitplaats||null,isAdmin:R}),x&&o0__default.default.createElement(y2,{availableTables:E,isFetching:S,formData:b,setFormData:W,handleChange:q}),S&&b.date&&b.time&&b.guests>0&&o0__default.default.createElement("div",{style:{textAlign:"center",padding:"10px",color:"#666",fontSize:"14px"}},"Beschikbare tafels berekenen..."))});Qb.displayName="ReservationStepOne";var yM=Qb;var SM=()=>localStorage.getItem("preferredLanguage")||"nl",j0=(b,c,q="nl")=>{let e=SM();return (b[e]||b[q]||{})[c]||{}};var $b={nl:{formField:{selectPlaceholder:"Selecteer een optie",tooltip:{confirm:"Klik om te Bevestigen",source:"Gevonden met Happy Ai"}}},en:{formField:{selectPlaceholder:"Select an option",tooltip:{confirm:"Click to Confirm",source:"Found with Happy Ai"}}},fr:{formField:{selectPlaceholder:"S\xE9lectionnez une option",tooltip:{confirm:"Cliquez pour confirmer",source:"Trouv\xE9 avec Happy Ai"}}}};R0(`.new-reservation-page .form-group .magic-tooltip{transition:transform .2s ease;transform-origin:bottom right}.new-reservation-page .form-group .magic-tooltip:hover{transform:scale(1.05)}.form-field-label{display:block;font-size:.8rem;font-weight:600;margin-bottom:4px;color:#333}.required-asterisk{color:red;margin-left:2px}.name-match-item{padding:8px 0;cursor:pointer;transition:background-color .15s ease}.name-match-item:hover{background-color:#f5f0f7}.name-match-item:not(:last-child){border-bottom:1px solid #f0f0f0}
|
|
42
|
-
`);var A4=({label:b,name:c,type:q="text",icon:e,value:W,onChange:n,onBlur:a,error:s,placeholder:r,halfWidth:R,options:v=[],selectPlaceholder:u,rightIcon:B,onRightIconClick:h,tooltipContent:f,tooltipAlign:g,required:l})=>{let N=j0($b,"formField"),C=u||N.selectPlaceholder,[E,y]=o0.useState(false),S=o0.useRef(null),m=o0.useRef(null),j=B,_=e;o0.useEffect(()=>{let Y=X=>{S.current&&!S.current.contains(X.target)&&(m.current&&clearTimeout(m.current),y(false));};return E&&document.addEventListener("mousedown",Y),()=>document.removeEventListener("mousedown",Y)},[E]);let A0={name:c,value:W,onChange:n,onBlur:a,"aria-label":b,className:`form-control ${s?"input-error":""}`,style:e?{paddingLeft:"35px",boxSizing:"border-box"}:{}},p0=()=>q==="select"?o0__default.default.createElement("select",{...A0},o0__default.default.createElement("option",{value:""},C),v.map(Y=>o0__default.default.createElement("option",{key:Y.value,value:Y.value},Y.label))):q==="textarea"?o0__default.default.createElement("textarea",{...A0,placeholder:r}):o0__default.default.createElement("input",{type:q,...A0,placeholder:r}),a0=q==="textarea";return o0__default.default.createElement("div",{className:`form-group ${R?"half-width":""}`,style:{position:"relative"}},l&&b&&o0__default.default.createElement("label",{className:"form-field-label"},b," ",o0__default.default.createElement("span",{className:"required-asterisk"},"*")),o0__default.default.createElement("div",{className:"input-container",style:{position:"relative"}},_&&o0__default.default.createElement(_,{className:"input-icon",style:{position:"absolute",left:"10px",top:a0?"12px":"50%",transform:a0?"none":"translateY(-50%)",color:"#6c757d",pointerEvents:"none",zIndex:1}}),p0(),j&&o0__default.default.createElement("div",{className:"magic-wand-container",onClick:h,onMouseEnter:()=>{m.current&&clearTimeout(m.current),y(true);},onMouseLeave:()=>{m.current=setTimeout(()=>y(false),1200);},style:{position:"absolute",top:"50%",right:"10px",transform:"translateY(-50%)",cursor:"pointer"}},o0__default.default.createElement(j,{className:"magic-wand-icon",style:{color:"#B567C2"}}),E&&f&&o0__default.default.createElement("div",{ref:S,className:"magic-tooltip",style:{position:"absolute",bottom:"100%",...g==="left"?{left:0}:{right:0},backgroundColor:"#fff",color:"#333",borderRadius:"8px",fontSize:"0.9rem",boxShadow:"0px 4px 10px rgba(0,0,0,0.15)",zIndex:1e3,marginBottom:"8px",minWidth:"220px",overflow:"hidden"}},o0__default.default.createElement("div",{style:{position:"relative",zIndex:2,padding:"12px 20px"}},o0__default.default.createElement("div",{style:{borderBottom:"1px solid #eee",marginBottom:"8px",paddingBottom:"4px"}},f),o0__default.default.createElement("div",{style:{fontWeight:"bold",fontSize:"13px",textAlign:"center",marginTop:"8px"}},N.tooltip?.confirm),o0__default.default.createElement("div",{style:{fontSize:"0.7rem",textAlign:"center",color:"#999",marginTop:"4px"}},N.tooltip?.source))))),s&&o0__default.default.createElement("p",{className:"form-error"},s))},_0=o0__default.default.memo(A4);var V0=P0(c1());P0(Mp());var zp={nl:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",extraInfo:"Extra info",seatPlace:"Zitplaats"},placeholders:{firstName:"Voornaam",lastName:"Achternaam",email:"E-mailadres",phone:"Mobiel nummer",extraInfo:"Extra informatie",seatPlace:"Selecteer zitplaats"},magic:{title:"Gast Gegevens"}},reservationSummary:{title:"Reservatie Gegevens",guests:"Aantal gasten",date:"Datum",time:"Tijd",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",menu:"Menu",staff:"Aangemaakt door",giftcard:"Cadeaubon",extraInfo:"Extra informatie",seatPlace:"Zitplaats",newReservationButton:"Nieuwe Reservatie Maken"}},en:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",extraInfo:"Extra Info",seatPlace:"Seating area"},placeholders:{firstName:"First Name",lastName:"Last Name",email:"Email Address",phone:"Mobile Number",extraInfo:"Extra Information",seatPlace:"Select seating area"},magic:{title:"Guest Details"}},reservationSummary:{title:"Reservation Details",guests:"Number of Guests",date:"Date",time:"Time",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",menu:"Menu",staff:"Created by",giftcard:"Gift Card",extraInfo:"Extra Information",seatPlace:"Seating area",newReservationButton:"New Reservation"}},fr:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise"},placeholders:{firstName:"Pr\xE9nom",lastName:"Nom",email:"Adresse e-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"S\xE9lectionner une zone d\u2019assise"},magic:{title:"D\xE9tails Invit\xE9"}},reservationSummary:{title:"D\xE9tails de la R\xE9servation",guests:"Nombre d'invit\xE9s",date:"Date",time:"Heure",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",menu:"Menu",staff:"Cr\xE9\xE9 par",giftcard:"Carte Cadeau",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise",newReservationButton:"Nouvelle R\xE9servation"}}};R0(`.new-reservation-page .name-fields{display:flex;gap:20px}.input-container .form-control{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 10px 10px
|
|
42
|
+
`);var A4=({label:b,name:c,type:q="text",icon:e,value:W,onChange:n,onBlur:a,error:s,placeholder:r,halfWidth:R,options:v=[],selectPlaceholder:u,rightIcon:B,onRightIconClick:h,tooltipContent:f,tooltipAlign:g,required:l})=>{let N=j0($b,"formField"),C=u||N.selectPlaceholder,[E,y]=o0.useState(false),S=o0.useRef(null),m=o0.useRef(null),j=B,_=e;o0.useEffect(()=>{let Y=X=>{S.current&&!S.current.contains(X.target)&&(m.current&&clearTimeout(m.current),y(false));};return E&&document.addEventListener("mousedown",Y),()=>document.removeEventListener("mousedown",Y)},[E]);let A0={name:c,value:W,onChange:n,onBlur:a,"aria-label":b,className:`form-control ${s?"input-error":""}`,style:e?{paddingLeft:"35px",boxSizing:"border-box"}:{}},p0=()=>q==="select"?o0__default.default.createElement("select",{...A0},o0__default.default.createElement("option",{value:""},C),v.map(Y=>o0__default.default.createElement("option",{key:Y.value,value:Y.value},Y.label))):q==="textarea"?o0__default.default.createElement("textarea",{...A0,placeholder:r}):o0__default.default.createElement("input",{type:q,...A0,placeholder:r}),a0=q==="textarea";return o0__default.default.createElement("div",{className:`form-group ${R?"half-width":""}`,style:{position:"relative"}},l&&b&&o0__default.default.createElement("label",{className:"form-field-label"},b," ",o0__default.default.createElement("span",{className:"required-asterisk"},"*")),o0__default.default.createElement("div",{className:"input-container",style:{position:"relative"}},_&&o0__default.default.createElement(_,{className:"input-icon",style:{position:"absolute",left:"10px",top:a0?"12px":"50%",transform:a0?"none":"translateY(-50%)",color:"#6c757d",pointerEvents:"none",zIndex:1}}),p0(),j&&o0__default.default.createElement("div",{className:"magic-wand-container",onClick:h,onMouseEnter:()=>{m.current&&clearTimeout(m.current),y(true);},onMouseLeave:()=>{m.current=setTimeout(()=>y(false),1200);},style:{position:"absolute",top:"50%",right:"10px",transform:"translateY(-50%)",cursor:"pointer"}},o0__default.default.createElement(j,{className:"magic-wand-icon",style:{color:"#B567C2"}}),E&&f&&o0__default.default.createElement("div",{ref:S,className:"magic-tooltip",style:{position:"absolute",bottom:"100%",...g==="left"?{left:0}:{right:0},backgroundColor:"#fff",color:"#333",borderRadius:"8px",fontSize:"0.9rem",boxShadow:"0px 4px 10px rgba(0,0,0,0.15)",zIndex:1e3,marginBottom:"8px",minWidth:"220px",overflow:"hidden"}},o0__default.default.createElement("div",{style:{position:"relative",zIndex:2,padding:"12px 20px"}},o0__default.default.createElement("div",{style:{borderBottom:"1px solid #eee",marginBottom:"8px",paddingBottom:"4px"}},f),o0__default.default.createElement("div",{style:{fontWeight:"bold",fontSize:"13px",textAlign:"center",marginTop:"8px"}},N.tooltip?.confirm),o0__default.default.createElement("div",{style:{fontSize:"0.7rem",textAlign:"center",color:"#999",marginTop:"4px"}},N.tooltip?.source))))),s&&o0__default.default.createElement("p",{className:"form-error"},s))},_0=o0__default.default.memo(A4);var V0=P0(c1());P0(Mp());var zp={nl:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",extraInfo:"Extra info",seatPlace:"Zitplaats"},placeholders:{firstName:"Voornaam",lastName:"Achternaam",email:"E-mailadres",phone:"Mobiel nummer",extraInfo:"Extra informatie",seatPlace:"Selecteer zitplaats"},magic:{title:"Gast Gegevens"}},reservationSummary:{title:"Reservatie Gegevens",guests:"Aantal gasten",date:"Datum",time:"Tijd",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",menu:"Menu",staff:"Aangemaakt door",giftcard:"Cadeaubon",extraInfo:"Extra informatie",seatPlace:"Zitplaats",newReservationButton:"Nieuwe Reservatie Maken"}},en:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",extraInfo:"Extra Info",seatPlace:"Seating area"},placeholders:{firstName:"First Name",lastName:"Last Name",email:"Email Address",phone:"Mobile Number",extraInfo:"Extra Information",seatPlace:"Select seating area"},magic:{title:"Guest Details"}},reservationSummary:{title:"Reservation Details",guests:"Number of Guests",date:"Date",time:"Time",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",menu:"Menu",staff:"Created by",giftcard:"Gift Card",extraInfo:"Extra Information",seatPlace:"Seating area",newReservationButton:"New Reservation"}},fr:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise"},placeholders:{firstName:"Pr\xE9nom",lastName:"Nom",email:"Adresse e-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"S\xE9lectionner une zone d\u2019assise"},magic:{title:"D\xE9tails Invit\xE9"}},reservationSummary:{title:"D\xE9tails de la R\xE9servation",guests:"Nombre d'invit\xE9s",date:"Date",time:"Heure",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",menu:"Menu",staff:"Cr\xE9\xE9 par",giftcard:"Carte Cadeau",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise",newReservationButton:"Nouvelle R\xE9servation"}}};R0(`.new-reservation-page .name-fields{display:flex;gap:20px}.input-container .form-control{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 10px 10px 35px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;-webkit-user-select:none;user-select:none;text-align:left;border-radius:5px;font-size:16px;box-sizing:border-box}
|
|
43
43
|
`);var cp=o0__default.default.memo(({formData:b,errors:c,handleChange:q,setFormData:e,menuData:W})=>{let n=SM(),a=j0(zp,"reservationStepTwoFiltering"),[s,r]=o0.useState([]),[R,v]=o0.useState(false),[u,B]=o0.useState(null),[h,f]=o0.useState([]),g=o1(),l=fa.FaMagic,N=()=>{u&&E();};o0.useEffect(()=>{if(V0.default.locale(n),!b.date||!b.time||!W.length)return r([]);let Y=(0, V0.default)(`${b.date} ${b.time}`,"YYYY-MM-DD HH:mm"),X=W.filter(U=>{let x=Y.isBetween((0, V0.default)(U.startDate,"YYYY-MM-DD"),(0, V0.default)(U.endDate,"YYYY-MM-DD"),"day","[]"),I=(0, V0.default)(b.time,"HH:mm").isBetween((0, V0.default)(U.startHour,"HH:mm"),(0, V0.default)(U.endHour,"HH:mm"),"minute","[]"),V=(0, V0.default)(Y).locale("nl").format("dddd").toLowerCase(),c0=(0, V0.default)(Y).locale("en").format("dddd").toLowerCase(),O0=(U.daysOfWeek||[]).map(P=>P.toLowerCase()),d0=!O0.length||O0.includes(V)||O0.includes(c0);return x&&I&&d0});r(X);},[b.date,b.time,W,n]);let C=async()=>{if(R||u)return;let Y=(b.email||"").trim().toLowerCase(),X=(b.phone||"").trim(),U=Y&&[".com",".net",".be",".nl"].some(V=>Y.endsWith(V)),x=!!X&&(X.startsWith("+32")?X.length>=12:X.length>=10);if(!U&&!x)return;let I=[];U&&I.push("email"),x&&I.push("phone");try{let V=await g.post(`${window.baseDomain}api/autofill`,{email:Y,phone:X});V?.firstName&&V?.lastName&&V?.email&&V?.phone&&B({...V,sources:I});}catch{console.error("Autofill error");}};o0.useEffect(()=>{C();},[b.email,b.phone]);let E=()=>{u&&(e(Y=>({...Y,firstName:u.firstName,lastName:u.lastName,email:u.email,phone:u.phone})),v(true),B(null));},y=async()=>{let Y=(b.firstName||"").trim(),X=(b.lastName||"").trim();if(Y.length<2&&X.length<2){f([]);return}try{let U=await g.post(`${window.baseDomain}api/autofill-name`,{firstName:Y||void 0,lastName:X||void 0});Array.isArray(U)&&U.length>0?f(U):f([]);}catch{f([]);}},S=Y=>{e(X=>({...X,firstName:Y.firstName,lastName:Y.lastName,email:Y.email,phone:Y.phone})),f([]),v(true);};o0.useEffect(()=>{if(R)return;let Y=(b.firstName||"").trim(),X=(b.lastName||"").trim();if(Y.length<2&&X.length<2){f([]);return}f([]);let U=setTimeout(()=>{y();},500);return ()=>clearTimeout(U)},[b.firstName,b.lastName]);let m=o0.useMemo(()=>{if(!u)return {email:{},phone:{}};let Y=u.sources.includes("email")&&(b.email||"").trim().toLowerCase()===u.email.trim().toLowerCase(),X=u.sources.includes("phone")&&(b.phone||"").trim()===u.phone.trim(),U={rightIcon:l,onRightIconClick:N};return {email:Y?{...U,tooltipContent:o0__default.default.createElement("div",null,o0__default.default.createElement("div",{style:{textAlign:"center",fontWeight:"bold"}},a.magic?.title),o0__default.default.createElement("div",null,u.firstName," ",u.lastName),o0__default.default.createElement("div",null,u.phone))}:{},phone:X?{...U,tooltipContent:o0__default.default.createElement("div",null,o0__default.default.createElement("div",{style:{textAlign:"center",fontWeight:"bold"}},a.magic?.title),o0__default.default.createElement("div",null,u.firstName," ",u.lastName),o0__default.default.createElement("div",null,u.email))}:{}}},[u,b.email,b.phone,a.magic?.title]),j=o0.useMemo(()=>{if(!h.length)return {firstName:{},lastName:{}};let X=(b.lastName||"").trim().length>0?"lastName":"firstName",U=o0__default.default.createElement("div",{style:{maxHeight:"200px",overflowY:"auto"}},h.map((I,V)=>o0__default.default.createElement("div",{key:V,className:"name-match-item",onClick:c0=>{c0.stopPropagation(),S(I);}},o0__default.default.createElement("div",{style:{fontWeight:"500"}},I.firstName," ",I.lastName),o0__default.default.createElement("div",{style:{fontSize:"0.8rem",color:"#666"}},I.email),I.phone&&o0__default.default.createElement("div",{style:{fontSize:"0.8rem",color:"#666"}},I.phone)))),x={rightIcon:fa.FaMagic,onRightIconClick:()=>{},tooltipContent:o0__default.default.createElement("div",null,o0__default.default.createElement("div",{style:{textAlign:"center",fontWeight:"bold"}},a.magic?.title),U)};return {firstName:X==="firstName"?{...x,tooltipAlign:"left"}:{},lastName:X==="lastName"?x:{}}},[h,b.lastName,a.magic?.title]),{reservationMode:_}=b,H=_==="check_in",A0=window.generalSettings?.obligatedFields||[],p0=Y=>A0.includes(Y),a0=Y=>!H&&p0(Y),q0=(Y,X)=>{let U=a.labels?.[Y]||X;return H?`${U} (Optioneel)`:p0(Y)?`${U} *`:U};return o0__default.default.createElement("div",{className:"reservation-step-two"},o0__default.default.createElement("div",{className:"account-manage-form"},s.length>0&&o0__default.default.createElement(_0,{label:`${a.labels?.menu||"Menu"}${H?" (Optioneel)":""}`,name:"menu",type:"select",options:s.map(Y=>({value:Y.name,label:Y.name})),value:b.menu,onChange:q,error:H?null:c.menu}),o0__default.default.createElement("div",{className:"name-fields"},o0__default.default.createElement(_0,{label:q0("firstName","Voornaam"),name:"firstName",placeholder:a.placeholders?.firstName||"",value:b.firstName,onChange:q,error:H?null:c.firstName,icon:fa.FaUser,required:a0("firstName"),...j.firstName}),o0__default.default.createElement(_0,{label:q0("lastName","Achternaam"),name:"lastName",placeholder:a.placeholders?.lastName||"",value:b.lastName,onChange:q,error:H?null:c.lastName,icon:fa.FaUser,required:a0("lastName"),...j.lastName})),o0__default.default.createElement(_0,{label:q0("email","Email"),name:"email",type:"email",placeholder:a.placeholders?.email||"",value:b.email,onChange:q,onBlur:C,error:c.email,icon:fa.FaEnvelope,required:a0("email"),...m.email}),o0__default.default.createElement(_0,{label:q0("phone","Telefoon"),name:"phone",type:"tel",placeholder:a.placeholders?.phone||"",value:b.phone,onChange:q,onBlur:C,error:c.phone,icon:fa.FaPhone,required:a0("phone"),...m.phone}),o0__default.default.createElement(_0,{label:a.labels?.extraInfo||"Extra info",name:"extraInfo",type:"textarea",placeholder:a.placeholders?.extraInfo||"",value:b.extraInfo,onChange:q,error:c.extraInfo,icon:fa.FaInfoCircle})))});cp.displayName="ReservationStepTwo";var k2=cp;var Ap={nl:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",extraInfo:"Extra info",seatPlace:"Zitplaats"},placeholders:{firstName:"Voornaam",lastName:"Achternaam",email:"E-mailadres",phone:"Mobiel nummer",extraInfo:"Extra informatie",seatPlace:"Selecteer zitplaats"},magic:{title:"Gast Gegevens"}},reservationSummary:{title:"Reservatie Gegevens",guests:"Aantal gasten",date:"Datum",time:"Tijd",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",menu:"Menu",staff:"Aangemaakt door",giftcard:"Cadeaubon",extraInfo:"Extra informatie",seatPlace:"Zitplaats",newReservationButton:"Nieuwe Reservatie Maken"}},en:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",extraInfo:"Extra Info",seatPlace:"Seating area"},placeholders:{firstName:"First Name",lastName:"Last Name",email:"Email Address",phone:"Mobile Number",extraInfo:"Extra Information",seatPlace:"Select seating area"},magic:{title:"Guest Details"}},reservationSummary:{title:"Reservation Details",guests:"Number of Guests",date:"Date",time:"Time",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",menu:"Menu",staff:"Created by",giftcard:"Gift Card",extraInfo:"Extra Information",seatPlace:"Seating area",newReservationButton:"New Reservation"}},fr:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise"},placeholders:{firstName:"Pr\xE9nom",lastName:"Nom",email:"Adresse e-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"S\xE9lectionner une zone d\u2019assise"},magic:{title:"D\xE9tails Invit\xE9"}},reservationSummary:{title:"D\xE9tails de la R\xE9servation",guests:"Nombre d'invit\xE9s",date:"Date",time:"Heure",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",menu:"Menu",staff:"Cr\xE9\xE9 par",giftcard:"Carte Cadeau",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise",newReservationButton:"Nouvelle R\xE9servation"}}};R0(`.new-reservation-page .reservation-sidebar-component .reservation-summary .modal-title{margin-top:0;margin-bottom:20px}.new-reservation-page .reservation-sidebar-component .reservation-summary .reservation-details{list-style-type:none;padding:0;margin:0 0 20px;width:100%}.new-reservation-page .reservation-sidebar-component .reservation-summary .reservation-details li{margin-bottom:10px;font-size:15px;align-items:left;text-align:left}.new-reservation-page .reservation-sidebar-component .reservation-summary .reservation-details li strong{font-weight:700}.new-reservation-page .reservation-sidebar-component .reservation-summary{align-items:left}
|
|
44
44
|
`);var a4=({formData:b,onNewReservation:c})=>{let q=j0(Ap,"reservationSummary");return o0__default.default.createElement("div",{className:"reservation-summary"},o0__default.default.createElement("ul",{className:"reservation-details"},o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.title)),o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.guests,":")," ",b.guests),o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.date,":")," ",b.date),o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.time,":")," ",b.time),o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.firstName,":")," ",b.firstName),o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.lastName,":")," ",b.lastName),o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.email,":")," ",b.email),o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.phone,":")," ",b.phone),b.menu&&o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.menu,":")," ",b.menu),b.personeel&&o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.staff,":")," ",b.personeel),b.giftcard&&o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.giftcard,":")," ",b.giftcard),b.extraInfo&&o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.extraInfo,":")," ",b.extraInfo),b.zitplaats&&o0__default.default.createElement("li",null,o0__default.default.createElement("strong",null,q.seatPlace,":")," ",b.zitplaats)),o0__default.default.createElement("button",{className:"button-style-3",onClick:c},q.newReservationButton))},w2=a4;var op={nl:{zitplaatsSelection:{labels:{seating:"Zitplaats"},options:{noPreference:"Geen voorkeur"}},giftcardSelection:{labels:{giftcard:"Cadeaubon"},options:{noGiftcard:"Geen Cadeaubon"}}},en:{zitplaatsSelection:{labels:{seating:"Seating"},options:{noPreference:"No preference"}},giftcardSelection:{labels:{giftcard:"Gift Card"},options:{noGiftcard:"No Gift Card"}}},fr:{zitplaatsSelection:{labels:{seating:"Place Assise"},options:{noPreference:"Pas de pr\xE9f\xE9rence"}},giftcardSelection:{labels:{giftcard:"Cadeau"},options:{noGiftcard:"Pas de carte"}}}};R0(`.new-reservation-page .giftcard-selection{margin-bottom:20px}.new-reservation-page .giftcard-options{display:flex;gap:20px;margin:10px 0}.new-reservation-page .giftcard-option{display:flex;align-items:center;gap:8px;cursor:pointer}.new-reservation-page .form-label{font-weight:500;margin-bottom:8px;display:block}.new-reservation-page .giftcard-option input[type=radio]{margin:0;cursor:pointer}.new-reservation-page .giftcard-option label{cursor:pointer}
|
|
45
45
|
`);var r4=({restaurantData:b,formData:c,handleChange:q,resetFormDataFields:e})=>{let W=j0(op,"giftcardSelection"),[n,a]=o0.useState([]);if(o0.useEffect(()=>{if(!b)return;let R=["breakfast","lunch","dinner"],v=new Set;R.forEach(u=>{let B=b[`openinghours-${u}`]?.schemeSettings||{};Object.values(B).forEach(h=>{h?.giftcardsEnabled&&Array.isArray(h.giftcards)&&h.giftcards.forEach(f=>{let g=typeof f=="string"?f.trim():String(f||"").trim();g&&v.add(g);});});}),a([...v]);},[b]),!n.length)return null;let s=n.map(R=>({value:R,label:R})),r=R=>{q({target:{name:"giftcard",value:R.target.value}}),e(["date","time"]);};return o0__default.default.createElement("div",{className:"giftcard-selection"},o0__default.default.createElement(_0,{label:W.labels?.giftcard||"Giftcard",name:"giftcard",type:"select",options:s,value:c.giftcard||"",onChange:r,selectPlaceholder:W.options?.noGiftcard||"Geen giftcard"}))},x2=r4;var P2=P0(c1());var ep={nl:{reservationSidebar:{saveButton:"Opslaan",saveButtonLoading:"Opslaan..."}},en:{reservationSidebar:{saveButton:"Save",saveButtonLoading:"Saving..."}},fr:{reservationSidebar:{saveButton:"Enregistrer",saveButtonLoading:"Enregistrement..."}}};R0(`.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}.admin-title{text-align:center;margin-bottom:30px}.reservation-sidebar-component.open{right:0}.reservation-sidebar-content{padding:60px 20px 20px}.close-sidebar-button{position:absolute;top:10px;left:10px;background-color:transparent;border:none;cursor:pointer}.close-sidebar-button svg{color:#000}.sidebar-section-one,.sidebar-section-two{margin-bottom:20px}.reservation-footer{margin-top:auto}.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}.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}.open-sidebar-button:hover{background-color:var(--color-blue-hover-accent)!important}.open-sidebar-button svg{position:relative;top:2px}@media screen and (max-width:480px){.reservation-sidebar-component{width:100%}}.sidebar-section-personeel{margin-bottom:10px}.sidebar-tabs{display:flex;border-bottom:1px solid #ddd;margin-bottom:20px}.sidebar-tab-button{flex:1;padding:10px;border:none;background:transparent;border-bottom:none;font-weight:400;cursor:pointer;color:#666}.sidebar-tab-button.active{border-bottom:2px solid var(--color-blue);font-weight:700;color:var(--color-blue)}
|
package/dist/index.mjs
CHANGED
|
@@ -39,7 +39,7 @@ Checking Time: ${v} -> Determined Meal: ${B}`),!B){N0(` Time ${v} has no associ
|
|
|
39
39
|
border-color: #48AAAF !important;
|
|
40
40
|
}
|
|
41
41
|
`),o0.createElement("div",{style:g.grid},R.map(N=>o0.createElement("button",{key:N.value,type:"button",className:`duration-btn ${parseInt(b)===N.value?"active-duration":""}`,tabIndex:"-1",style:{...g.optionBtn,...!a&&parseInt(b)===N.value?g.activeBtn:{}},onClick:()=>B(N.value),onMouseDown:C=>C.preventDefault()},N.label)),v&&o0.createElement("button",{type:"button",className:`duration-btn ${a?"active-duration":""}`,tabIndex:"-1",style:{...g.optionBtn,...a?g.activeBtn:{},flex:"0 0 auto",width:"auto",minWidth:"40px"},onClick:h,onMouseDown:N=>N.preventDefault()},a?o0.createElement(FaMinus,{size:12}):o0.createElement(FaPlus,{size:12}))),o0.createElement(AnimatePresence,null,a&&o0.createElement(motion.div,{initial:{opacity:0,height:0},animate:{opacity:1,height:"auto"},exit:{opacity:0,height:0},style:{overflow:"hidden"}},o0.createElement("div",{style:g.stepperContainer},o0.createElement("button",{type:"button",style:g.stepperBtn,onClick:()=>f(-1)},o0.createElement(FaMinus,{size:12})),o0.createElement("span",{style:g.stepperValue},l(parseInt(b)||0)),o0.createElement("button",{type:"button",style:g.stepperBtn,onClick:()=>f(1)},o0.createElement(FaPlus,{size:12}))))))},S2=M4;var Qb=memo(({formData:b,errors:c,handleChange:q,handleStepOneSubmit:e,setFormData:W,timeblocks:n,loadingTimeblocks:a,timeblocksError:s,restaurantData:r,isAdmin:R=false})=>{let v=localStorage.getItem("preferredLanguage")||"nl",u=a1[v].reservationStepOne,[B,h]=useState(b.guests||2),[f,g]=useState(null),[l,N]=useState([]),C=o1(),[E,y]=useState([]),[S,m]=useState(false),[j,_]=useState(false),H=useRef(false),A0=useRef(false),p0=useRef(false),a0=useCallback(F=>{W(k=>{let J={...k};return F.forEach(z0=>{J[z0]="";}),(F.includes("date")||F.includes("time")||F.includes("guests"))&&(J.selectedTableNumbers=[],J.selectedTableIds=[],y([])),J});},[W]);useEffect(()=>{let k=(0, Vb.default)().tz("Europe/Amsterdam").startOf("day").clone().startOf("isoWeek");for(;kz(k);)k.add(1,"week");g(k);},[]),useEffect(()=>{(async()=>{if(f&&(b.reservationMode==="met_limieten"||b.reservationMode==="zonder_regels"||b.reservationMode==="vrije_keuze")){let k=r?.["table-settings"]||{},J=k.isInstalled===true&&k.assignmentMode==="automatic";if(b.reservationMode==="met_limieten"||b.reservationMode==="vrije_keuze"||b.reservationMode==="zonder_regels"&&J){let z0=f.format("YYYY-MM-DD"),u0=f.clone().add(13,"days").format("YYYY-MM-DD"),T0=localStorage.getItem("username"),f0=`${window.baseDomain}api/slots/${T0}/${z0}/${u0}`;try{let A=await C.get(f0,{noCache:!0});N(A||[]);}catch(A){console.error("Error fetching reservations:",A),N([]);}}else N([]);}else N([]);})();},[f,C,b.reservationMode,r]),useEffect(()=>{window.__reservationDashboardPreset&&b.date?(window.__reservationDashboardPreset=false,p0.current=true,A0.current=true):_(false);},[b.date]),useEffect(()=>{if(p0.current&&r&&Object.keys(r).length>0&&b.date&&b.reservationMode==="met_limieten"){p0.current=false;let F=r?.["blocked-slots"]||[],k=b.guests||2,J=r?.["table-settings"]||{},z0=J.isInstalled===true&&J.assignmentMode==="automatic",u0;z0?u0=(0, U0.isDateAvailableWithTableCheck)(r,b.date,l,k,F,null,R,null,b.zitplaats||null):u0=(0, U0.isDateAvailable)(r,b.date,l,k,F,null,R),u0?(_(false),A0.current=false):(_(true),A0.current=true,W(T0=>({...T0,reservationMode:"vrije_keuze"})));}},[r,l,b.date,b.guests,b.reservationMode,R,W]);let q0=F=>{g(F),a0(["date","time","selectedTableNumbers","selectedTableIds"]);};useEffect(()=>{if(!H.current){let F=false,k={};b.reservationMode||(k.reservationMode="met_limieten",F=true),(!b.guests||b.guests==="")&&(k.guests=B,F=true),Array.isArray(b.selectedTableNumbers)||(k.selectedTableNumbers=[],F=true),Array.isArray(b.selectedTableIds)||(k.selectedTableIds=[],F=true),F&&setTimeout(()=>{q({target:{multiple:true,updates:k}});},0),H.current=true;}},[b.reservationMode,b.guests,b.selectedTableNumbers,b.selectedTableIds,B,q]);let Y=useMemo(()=>r?.["table-settings"]||{},[r]),X=useMemo(()=>Y.isInstalled===true&&Y.assignmentMode==="automatic",[Y]),U=useMemo(()=>["met_limieten","zonder_regels","vrije_keuze"].includes(b.reservationMode),[b.reservationMode]),x=useMemo(()=>U&&b.date&&b.time&&b.guests>0&&X&&E.length>0,[U,b.date,b.time,b.guests,X,E.length]);useEffect(()=>{if(!X||!b.date||!b.time||b.guests<=0||!r||!l){y([]),m(false);return}m(true);let F=setTimeout(()=>{(window.requestIdleCallback||(J=>setTimeout(J,1)))(()=>{try{let J=new Set;r?.manualFloors&&Array.isArray(r.manualFloors)&&r.manualFloors.forEach(A=>{(A.tables||[]).forEach(d=>{d.tableNumber!=null&&J.add(d.tableNumber);});});let z0=[...r?.floors||[],...r?.manualFloors||[]],u0={...r,floors:z0},f0=F0("getAvailableTablesForTime",U0.getAvailableTablesForTime,u0,b.date,b.time,b.guests,l,b.zitplaats||null).map(A=>({...A,isManual:J.has(A.tableNumber)}));y(f0);}catch(J){console.error("Error calculating available tables:",J),y([]);}finally{m(false);}});},500);return ()=>{clearTimeout(F),m(false);}},[X,b.date,b.time,b.guests,b.zitplaats,r,l]),useEffect(()=>{if(E.length>0){let F=b.selectedTableNumbers||[],k=b.selectedTableIds||[],J=[],z0=[];F.forEach(u0=>{let T0=E.find(f0=>f0.tableNumber===u0);T0&&k.includes(T0.tableId)&&(J.push(u0),z0.push(T0.tableId));}),J.length!==F.length&&setTimeout(()=>{q({target:{multiple:true,updates:{selectedTableNumbers:J,selectedTableIds:z0}}});},0);}else (b.selectedTableNumbers?.length>0||b.selectedTableIds?.length>0)&&setTimeout(()=>{q({target:{multiple:true,updates:{selectedTableNumbers:[],selectedTableIds:[]}}});},0);},[E,b.selectedTableNumbers,b.selectedTableIds]);let I=F=>{let k=parseInt(F.target.value,10)||1;h(k),_(false),W(J=>{let z0={...J,guests:k};if(z0.selectedTableNumbers=[],z0.selectedTableIds=[],z0.reservationMode==="vrije_keuze")return z0;if(z0.date&&r&&Object.keys(r).length>0){let u0=r?.["blocked-slots"]||[],T0=z0.reservationMode!=="met_limieten"?-1e4:k,f0=r?.["table-settings"]||{},A=z0.reservationMode==="met_limieten"&&f0.isInstalled===true&&f0.assignmentMode==="automatic",d;if(A?d=F0("isDateAvailableWithTableCheck",U0.isDateAvailableWithTableCheck,r,z0.date,l,T0,u0,null,R,null,z0.zitplaats||null):d=F0("isDateAvailable",U0.isDateAvailable,r,z0.date,l,T0,u0,null,R),!d)z0.date="",z0.time="";else if(z0.time){let t=(0, U0.getAvailableTimeblocks)(r,z0.date,l,T0,u0,null,R,z0.duration||null);(A?(0, U0.getAvailableTimeblocksWithTableCheck)(r,z0.date,t,T0,l,z0.zitplaats||null,z0.duration||null):t)[z0.time]||(z0.time="");}}return z0});};useEffect(()=>{if(A0.current){A0.current=false;return}a0(["date","time","selectedTableNumbers","selectedTableIds"]);},[b.reservationMode,a0]);let V=F=>{_(false),F==="met_limieten"?q({target:{name:"reservationMode",value:"met_limieten"}}):F==="onbeperkt_parent"&&(["zonder_regels","vrije_keuze"].includes(b.reservationMode)||q({target:{name:"reservationMode",value:"zonder_regels"}}));},c0=F=>{_(false),q({target:{name:"reservationMode",value:F}});},O0=b.reservationMode,d0=!!r?.["general-settings"]?.seatSelectionEnabled,P=Array.isArray(r?.["general-settings"]?.seatAreas)?r["general-settings"].seatAreas:["Terras","Restaurant"],X0=F=>{W(k=>({...k,zitplaats:F}));};return s?o0.createElement("div",null,u.errors.openingHoursNotSet," ",o0.createElement("a",{href:"https://happychef.cloud/#/openinghours/dinner",target:"_blank",rel:"noopener noreferrer",style:{color:"var(--color-blue)",textDecoration:"underline"}},u.errors.clickHereToSet)):o0.createElement("form",{className:"account-manage-form",noValidate:true},o0.createElement("div",{className:"form-group reservation-mode"},o0.createElement("div",{className:"reservation-modes-container"},o0.createElement("button",{type:"button",className:`reservation-mode-button ${O0==="met_limieten"?"active":""}`,onClick:()=>V("met_limieten"),"aria-pressed":O0==="met_limieten"},u.modes.withLimits),o0.createElement("button",{type:"button",className:`reservation-mode-button ${["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)?"active":""}`,onClick:()=>V("onbeperkt_parent"),"aria-pressed":["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)},u.modes.unlimited)),["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)&&o0.createElement("div",{className:"reservation-modes-container sub-modes"},o0.createElement("button",{type:"button",className:`reservation-mode-button ${O0==="zonder_regels"?"active":""}`,onClick:()=>c0("zonder_regels"),"aria-pressed":O0==="zonder_regels"},u.modes.openingHours),o0.createElement("button",{type:"button",className:`reservation-mode-button ${O0==="vrije_keuze"?"active":""}`,onClick:()=>c0("vrije_keuze"),"aria-pressed":O0==="vrije_keuze"},u.modes.free))),["onbeperkt_parent","zonder_regels","vrije_keuze"].includes(O0)&&o0.createElement("div",{className:"unlimited-mode-warning"},o0.createElement("div",{className:"warning-text"},j?u.warnings?.dateNotAvailableWithLimits||"Let op: deze datum is niet beschikbaar met limieten voor dit aantal gasten. De modus is automatisch overgezet naar onbeperkt vrij.":u.warnings?.unlimitedMode||(v==="nl"?"Let op: Bij onbeperkte boekingen wordt geen rekening gehouden met de maximale capaciteit van het restaurant. De maximale zitplaatslimiet kan worden overschreden.":"Warning: Unlimited bookings do not take into account the restaurant's maximum capacity. The maximum seating limit may be exceeded."))),o0.createElement(d2,{setGuests:h,value:b.guests||B,onChange:I,error:c.guests}),d0&&U&&b.guests>0&&o0.createElement("div",{className:"form-row",style:{marginTop:12}},o0.createElement("div",{className:"reservation-mode-buttons"},P.map(F=>o0.createElement("button",{key:F,type:"button",className:`reservation-mode-button ${b.zitplaats===F?"active":""}`,onClick:()=>X0(F),"aria-pressed":b.zitplaats===F},F))),c.zitplaats&&o0.createElement("small",{className:"error"},c.zitplaats)),r?.account_type==="bowling"&&o0.createElement(S2,{duration:b.duration,handleChange:F=>{q(F),a0(["date","time","selectedTableNumbers","selectedTableIds"]);},min:r["general-settings"]?.minDuration||30,max:r["general-settings"]?.maxDuration||120,interval:r["general-settings"]?.durationInterval||30}),U&&b.guests>0&&o0.createElement(Fb,{guests:b.guests,formData:b,handleChange:q,resetFormDataFields:a0,restaurantData:r,reservations:l,startDate:f,onWeekChange:q0,reservationMode:O0,isAdmin:R}),U&&b.date&&o0.createElement(jb,{guests:b.guests,formData:b,handleChange:q,field:{id:"time",label:u.fields.time},selectedDate:b.date,setCurrentExpandedField:()=>{},restaurantData:r,reservations:l,reservationMode:O0,zitplaats:b.zitplaats||null,isAdmin:R}),x&&o0.createElement(y2,{availableTables:E,isFetching:S,formData:b,setFormData:W,handleChange:q}),S&&b.date&&b.time&&b.guests>0&&o0.createElement("div",{style:{textAlign:"center",padding:"10px",color:"#666",fontSize:"14px"}},"Beschikbare tafels berekenen..."))});Qb.displayName="ReservationStepOne";var yM=Qb;var SM=()=>localStorage.getItem("preferredLanguage")||"nl",j0=(b,c,q="nl")=>{let e=SM();return (b[e]||b[q]||{})[c]||{}};var $b={nl:{formField:{selectPlaceholder:"Selecteer een optie",tooltip:{confirm:"Klik om te Bevestigen",source:"Gevonden met Happy Ai"}}},en:{formField:{selectPlaceholder:"Select an option",tooltip:{confirm:"Click to Confirm",source:"Found with Happy Ai"}}},fr:{formField:{selectPlaceholder:"S\xE9lectionnez une option",tooltip:{confirm:"Cliquez pour confirmer",source:"Trouv\xE9 avec Happy Ai"}}}};R0(`.new-reservation-page .form-group .magic-tooltip{transition:transform .2s ease;transform-origin:bottom right}.new-reservation-page .form-group .magic-tooltip:hover{transform:scale(1.05)}.form-field-label{display:block;font-size:.8rem;font-weight:600;margin-bottom:4px;color:#333}.required-asterisk{color:red;margin-left:2px}.name-match-item{padding:8px 0;cursor:pointer;transition:background-color .15s ease}.name-match-item:hover{background-color:#f5f0f7}.name-match-item:not(:last-child){border-bottom:1px solid #f0f0f0}
|
|
42
|
-
`);var A4=({label:b,name:c,type:q="text",icon:e,value:W,onChange:n,onBlur:a,error:s,placeholder:r,halfWidth:R,options:v=[],selectPlaceholder:u,rightIcon:B,onRightIconClick:h,tooltipContent:f,tooltipAlign:g,required:l})=>{let N=j0($b,"formField"),C=u||N.selectPlaceholder,[E,y]=useState(false),S=useRef(null),m=useRef(null),j=B,_=e;useEffect(()=>{let Y=X=>{S.current&&!S.current.contains(X.target)&&(m.current&&clearTimeout(m.current),y(false));};return E&&document.addEventListener("mousedown",Y),()=>document.removeEventListener("mousedown",Y)},[E]);let A0={name:c,value:W,onChange:n,onBlur:a,"aria-label":b,className:`form-control ${s?"input-error":""}`,style:e?{paddingLeft:"35px",boxSizing:"border-box"}:{}},p0=()=>q==="select"?o0.createElement("select",{...A0},o0.createElement("option",{value:""},C),v.map(Y=>o0.createElement("option",{key:Y.value,value:Y.value},Y.label))):q==="textarea"?o0.createElement("textarea",{...A0,placeholder:r}):o0.createElement("input",{type:q,...A0,placeholder:r}),a0=q==="textarea";return o0.createElement("div",{className:`form-group ${R?"half-width":""}`,style:{position:"relative"}},l&&b&&o0.createElement("label",{className:"form-field-label"},b," ",o0.createElement("span",{className:"required-asterisk"},"*")),o0.createElement("div",{className:"input-container",style:{position:"relative"}},_&&o0.createElement(_,{className:"input-icon",style:{position:"absolute",left:"10px",top:a0?"12px":"50%",transform:a0?"none":"translateY(-50%)",color:"#6c757d",pointerEvents:"none",zIndex:1}}),p0(),j&&o0.createElement("div",{className:"magic-wand-container",onClick:h,onMouseEnter:()=>{m.current&&clearTimeout(m.current),y(true);},onMouseLeave:()=>{m.current=setTimeout(()=>y(false),1200);},style:{position:"absolute",top:"50%",right:"10px",transform:"translateY(-50%)",cursor:"pointer"}},o0.createElement(j,{className:"magic-wand-icon",style:{color:"#B567C2"}}),E&&f&&o0.createElement("div",{ref:S,className:"magic-tooltip",style:{position:"absolute",bottom:"100%",...g==="left"?{left:0}:{right:0},backgroundColor:"#fff",color:"#333",borderRadius:"8px",fontSize:"0.9rem",boxShadow:"0px 4px 10px rgba(0,0,0,0.15)",zIndex:1e3,marginBottom:"8px",minWidth:"220px",overflow:"hidden"}},o0.createElement("div",{style:{position:"relative",zIndex:2,padding:"12px 20px"}},o0.createElement("div",{style:{borderBottom:"1px solid #eee",marginBottom:"8px",paddingBottom:"4px"}},f),o0.createElement("div",{style:{fontWeight:"bold",fontSize:"13px",textAlign:"center",marginTop:"8px"}},N.tooltip?.confirm),o0.createElement("div",{style:{fontSize:"0.7rem",textAlign:"center",color:"#999",marginTop:"4px"}},N.tooltip?.source))))),s&&o0.createElement("p",{className:"form-error"},s))},_0=o0.memo(A4);var V0=P0(c1());P0(Mp());var zp={nl:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",extraInfo:"Extra info",seatPlace:"Zitplaats"},placeholders:{firstName:"Voornaam",lastName:"Achternaam",email:"E-mailadres",phone:"Mobiel nummer",extraInfo:"Extra informatie",seatPlace:"Selecteer zitplaats"},magic:{title:"Gast Gegevens"}},reservationSummary:{title:"Reservatie Gegevens",guests:"Aantal gasten",date:"Datum",time:"Tijd",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",menu:"Menu",staff:"Aangemaakt door",giftcard:"Cadeaubon",extraInfo:"Extra informatie",seatPlace:"Zitplaats",newReservationButton:"Nieuwe Reservatie Maken"}},en:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",extraInfo:"Extra Info",seatPlace:"Seating area"},placeholders:{firstName:"First Name",lastName:"Last Name",email:"Email Address",phone:"Mobile Number",extraInfo:"Extra Information",seatPlace:"Select seating area"},magic:{title:"Guest Details"}},reservationSummary:{title:"Reservation Details",guests:"Number of Guests",date:"Date",time:"Time",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",menu:"Menu",staff:"Created by",giftcard:"Gift Card",extraInfo:"Extra Information",seatPlace:"Seating area",newReservationButton:"New Reservation"}},fr:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise"},placeholders:{firstName:"Pr\xE9nom",lastName:"Nom",email:"Adresse e-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"S\xE9lectionner une zone d\u2019assise"},magic:{title:"D\xE9tails Invit\xE9"}},reservationSummary:{title:"D\xE9tails de la R\xE9servation",guests:"Nombre d'invit\xE9s",date:"Date",time:"Heure",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",menu:"Menu",staff:"Cr\xE9\xE9 par",giftcard:"Carte Cadeau",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise",newReservationButton:"Nouvelle R\xE9servation"}}};R0(`.new-reservation-page .name-fields{display:flex;gap:20px}.input-container .form-control{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 10px 10px
|
|
42
|
+
`);var A4=({label:b,name:c,type:q="text",icon:e,value:W,onChange:n,onBlur:a,error:s,placeholder:r,halfWidth:R,options:v=[],selectPlaceholder:u,rightIcon:B,onRightIconClick:h,tooltipContent:f,tooltipAlign:g,required:l})=>{let N=j0($b,"formField"),C=u||N.selectPlaceholder,[E,y]=useState(false),S=useRef(null),m=useRef(null),j=B,_=e;useEffect(()=>{let Y=X=>{S.current&&!S.current.contains(X.target)&&(m.current&&clearTimeout(m.current),y(false));};return E&&document.addEventListener("mousedown",Y),()=>document.removeEventListener("mousedown",Y)},[E]);let A0={name:c,value:W,onChange:n,onBlur:a,"aria-label":b,className:`form-control ${s?"input-error":""}`,style:e?{paddingLeft:"35px",boxSizing:"border-box"}:{}},p0=()=>q==="select"?o0.createElement("select",{...A0},o0.createElement("option",{value:""},C),v.map(Y=>o0.createElement("option",{key:Y.value,value:Y.value},Y.label))):q==="textarea"?o0.createElement("textarea",{...A0,placeholder:r}):o0.createElement("input",{type:q,...A0,placeholder:r}),a0=q==="textarea";return o0.createElement("div",{className:`form-group ${R?"half-width":""}`,style:{position:"relative"}},l&&b&&o0.createElement("label",{className:"form-field-label"},b," ",o0.createElement("span",{className:"required-asterisk"},"*")),o0.createElement("div",{className:"input-container",style:{position:"relative"}},_&&o0.createElement(_,{className:"input-icon",style:{position:"absolute",left:"10px",top:a0?"12px":"50%",transform:a0?"none":"translateY(-50%)",color:"#6c757d",pointerEvents:"none",zIndex:1}}),p0(),j&&o0.createElement("div",{className:"magic-wand-container",onClick:h,onMouseEnter:()=>{m.current&&clearTimeout(m.current),y(true);},onMouseLeave:()=>{m.current=setTimeout(()=>y(false),1200);},style:{position:"absolute",top:"50%",right:"10px",transform:"translateY(-50%)",cursor:"pointer"}},o0.createElement(j,{className:"magic-wand-icon",style:{color:"#B567C2"}}),E&&f&&o0.createElement("div",{ref:S,className:"magic-tooltip",style:{position:"absolute",bottom:"100%",...g==="left"?{left:0}:{right:0},backgroundColor:"#fff",color:"#333",borderRadius:"8px",fontSize:"0.9rem",boxShadow:"0px 4px 10px rgba(0,0,0,0.15)",zIndex:1e3,marginBottom:"8px",minWidth:"220px",overflow:"hidden"}},o0.createElement("div",{style:{position:"relative",zIndex:2,padding:"12px 20px"}},o0.createElement("div",{style:{borderBottom:"1px solid #eee",marginBottom:"8px",paddingBottom:"4px"}},f),o0.createElement("div",{style:{fontWeight:"bold",fontSize:"13px",textAlign:"center",marginTop:"8px"}},N.tooltip?.confirm),o0.createElement("div",{style:{fontSize:"0.7rem",textAlign:"center",color:"#999",marginTop:"4px"}},N.tooltip?.source))))),s&&o0.createElement("p",{className:"form-error"},s))},_0=o0.memo(A4);var V0=P0(c1());P0(Mp());var zp={nl:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",extraInfo:"Extra info",seatPlace:"Zitplaats"},placeholders:{firstName:"Voornaam",lastName:"Achternaam",email:"E-mailadres",phone:"Mobiel nummer",extraInfo:"Extra informatie",seatPlace:"Selecteer zitplaats"},magic:{title:"Gast Gegevens"}},reservationSummary:{title:"Reservatie Gegevens",guests:"Aantal gasten",date:"Datum",time:"Tijd",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",menu:"Menu",staff:"Aangemaakt door",giftcard:"Cadeaubon",extraInfo:"Extra informatie",seatPlace:"Zitplaats",newReservationButton:"Nieuwe Reservatie Maken"}},en:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",extraInfo:"Extra Info",seatPlace:"Seating area"},placeholders:{firstName:"First Name",lastName:"Last Name",email:"Email Address",phone:"Mobile Number",extraInfo:"Extra Information",seatPlace:"Select seating area"},magic:{title:"Guest Details"}},reservationSummary:{title:"Reservation Details",guests:"Number of Guests",date:"Date",time:"Time",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",menu:"Menu",staff:"Created by",giftcard:"Gift Card",extraInfo:"Extra Information",seatPlace:"Seating area",newReservationButton:"New Reservation"}},fr:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise"},placeholders:{firstName:"Pr\xE9nom",lastName:"Nom",email:"Adresse e-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"S\xE9lectionner une zone d\u2019assise"},magic:{title:"D\xE9tails Invit\xE9"}},reservationSummary:{title:"D\xE9tails de la R\xE9servation",guests:"Nombre d'invit\xE9s",date:"Date",time:"Heure",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",menu:"Menu",staff:"Cr\xE9\xE9 par",giftcard:"Carte Cadeau",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise",newReservationButton:"Nouvelle R\xE9servation"}}};R0(`.new-reservation-page .name-fields{display:flex;gap:20px}.input-container .form-control{display:flex;align-items:center;justify-content:space-between;width:100%;padding:10px 10px 10px 35px;background-color:#fff;border:#ccc 1px solid;cursor:pointer;-webkit-user-select:none;user-select:none;text-align:left;border-radius:5px;font-size:16px;box-sizing:border-box}
|
|
43
43
|
`);var cp=o0.memo(({formData:b,errors:c,handleChange:q,setFormData:e,menuData:W})=>{let n=SM(),a=j0(zp,"reservationStepTwoFiltering"),[s,r]=useState([]),[R,v]=useState(false),[u,B]=useState(null),[h,f]=useState([]),g=o1(),l=FaMagic,N=()=>{u&&E();};useEffect(()=>{if(V0.default.locale(n),!b.date||!b.time||!W.length)return r([]);let Y=(0, V0.default)(`${b.date} ${b.time}`,"YYYY-MM-DD HH:mm"),X=W.filter(U=>{let x=Y.isBetween((0, V0.default)(U.startDate,"YYYY-MM-DD"),(0, V0.default)(U.endDate,"YYYY-MM-DD"),"day","[]"),I=(0, V0.default)(b.time,"HH:mm").isBetween((0, V0.default)(U.startHour,"HH:mm"),(0, V0.default)(U.endHour,"HH:mm"),"minute","[]"),V=(0, V0.default)(Y).locale("nl").format("dddd").toLowerCase(),c0=(0, V0.default)(Y).locale("en").format("dddd").toLowerCase(),O0=(U.daysOfWeek||[]).map(P=>P.toLowerCase()),d0=!O0.length||O0.includes(V)||O0.includes(c0);return x&&I&&d0});r(X);},[b.date,b.time,W,n]);let C=async()=>{if(R||u)return;let Y=(b.email||"").trim().toLowerCase(),X=(b.phone||"").trim(),U=Y&&[".com",".net",".be",".nl"].some(V=>Y.endsWith(V)),x=!!X&&(X.startsWith("+32")?X.length>=12:X.length>=10);if(!U&&!x)return;let I=[];U&&I.push("email"),x&&I.push("phone");try{let V=await g.post(`${window.baseDomain}api/autofill`,{email:Y,phone:X});V?.firstName&&V?.lastName&&V?.email&&V?.phone&&B({...V,sources:I});}catch{console.error("Autofill error");}};useEffect(()=>{C();},[b.email,b.phone]);let E=()=>{u&&(e(Y=>({...Y,firstName:u.firstName,lastName:u.lastName,email:u.email,phone:u.phone})),v(true),B(null));},y=async()=>{let Y=(b.firstName||"").trim(),X=(b.lastName||"").trim();if(Y.length<2&&X.length<2){f([]);return}try{let U=await g.post(`${window.baseDomain}api/autofill-name`,{firstName:Y||void 0,lastName:X||void 0});Array.isArray(U)&&U.length>0?f(U):f([]);}catch{f([]);}},S=Y=>{e(X=>({...X,firstName:Y.firstName,lastName:Y.lastName,email:Y.email,phone:Y.phone})),f([]),v(true);};useEffect(()=>{if(R)return;let Y=(b.firstName||"").trim(),X=(b.lastName||"").trim();if(Y.length<2&&X.length<2){f([]);return}f([]);let U=setTimeout(()=>{y();},500);return ()=>clearTimeout(U)},[b.firstName,b.lastName]);let m=useMemo(()=>{if(!u)return {email:{},phone:{}};let Y=u.sources.includes("email")&&(b.email||"").trim().toLowerCase()===u.email.trim().toLowerCase(),X=u.sources.includes("phone")&&(b.phone||"").trim()===u.phone.trim(),U={rightIcon:l,onRightIconClick:N};return {email:Y?{...U,tooltipContent:o0.createElement("div",null,o0.createElement("div",{style:{textAlign:"center",fontWeight:"bold"}},a.magic?.title),o0.createElement("div",null,u.firstName," ",u.lastName),o0.createElement("div",null,u.phone))}:{},phone:X?{...U,tooltipContent:o0.createElement("div",null,o0.createElement("div",{style:{textAlign:"center",fontWeight:"bold"}},a.magic?.title),o0.createElement("div",null,u.firstName," ",u.lastName),o0.createElement("div",null,u.email))}:{}}},[u,b.email,b.phone,a.magic?.title]),j=useMemo(()=>{if(!h.length)return {firstName:{},lastName:{}};let X=(b.lastName||"").trim().length>0?"lastName":"firstName",U=o0.createElement("div",{style:{maxHeight:"200px",overflowY:"auto"}},h.map((I,V)=>o0.createElement("div",{key:V,className:"name-match-item",onClick:c0=>{c0.stopPropagation(),S(I);}},o0.createElement("div",{style:{fontWeight:"500"}},I.firstName," ",I.lastName),o0.createElement("div",{style:{fontSize:"0.8rem",color:"#666"}},I.email),I.phone&&o0.createElement("div",{style:{fontSize:"0.8rem",color:"#666"}},I.phone)))),x={rightIcon:FaMagic,onRightIconClick:()=>{},tooltipContent:o0.createElement("div",null,o0.createElement("div",{style:{textAlign:"center",fontWeight:"bold"}},a.magic?.title),U)};return {firstName:X==="firstName"?{...x,tooltipAlign:"left"}:{},lastName:X==="lastName"?x:{}}},[h,b.lastName,a.magic?.title]),{reservationMode:_}=b,H=_==="check_in",A0=window.generalSettings?.obligatedFields||[],p0=Y=>A0.includes(Y),a0=Y=>!H&&p0(Y),q0=(Y,X)=>{let U=a.labels?.[Y]||X;return H?`${U} (Optioneel)`:p0(Y)?`${U} *`:U};return o0.createElement("div",{className:"reservation-step-two"},o0.createElement("div",{className:"account-manage-form"},s.length>0&&o0.createElement(_0,{label:`${a.labels?.menu||"Menu"}${H?" (Optioneel)":""}`,name:"menu",type:"select",options:s.map(Y=>({value:Y.name,label:Y.name})),value:b.menu,onChange:q,error:H?null:c.menu}),o0.createElement("div",{className:"name-fields"},o0.createElement(_0,{label:q0("firstName","Voornaam"),name:"firstName",placeholder:a.placeholders?.firstName||"",value:b.firstName,onChange:q,error:H?null:c.firstName,icon:FaUser,required:a0("firstName"),...j.firstName}),o0.createElement(_0,{label:q0("lastName","Achternaam"),name:"lastName",placeholder:a.placeholders?.lastName||"",value:b.lastName,onChange:q,error:H?null:c.lastName,icon:FaUser,required:a0("lastName"),...j.lastName})),o0.createElement(_0,{label:q0("email","Email"),name:"email",type:"email",placeholder:a.placeholders?.email||"",value:b.email,onChange:q,onBlur:C,error:c.email,icon:FaEnvelope,required:a0("email"),...m.email}),o0.createElement(_0,{label:q0("phone","Telefoon"),name:"phone",type:"tel",placeholder:a.placeholders?.phone||"",value:b.phone,onChange:q,onBlur:C,error:c.phone,icon:FaPhone,required:a0("phone"),...m.phone}),o0.createElement(_0,{label:a.labels?.extraInfo||"Extra info",name:"extraInfo",type:"textarea",placeholder:a.placeholders?.extraInfo||"",value:b.extraInfo,onChange:q,error:c.extraInfo,icon:FaInfoCircle})))});cp.displayName="ReservationStepTwo";var k2=cp;var Ap={nl:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",extraInfo:"Extra info",seatPlace:"Zitplaats"},placeholders:{firstName:"Voornaam",lastName:"Achternaam",email:"E-mailadres",phone:"Mobiel nummer",extraInfo:"Extra informatie",seatPlace:"Selecteer zitplaats"},magic:{title:"Gast Gegevens"}},reservationSummary:{title:"Reservatie Gegevens",guests:"Aantal gasten",date:"Datum",time:"Tijd",firstName:"Voornaam",lastName:"Achternaam",email:"E-mail",phone:"Mobiel nummer",menu:"Menu",staff:"Aangemaakt door",giftcard:"Cadeaubon",extraInfo:"Extra informatie",seatPlace:"Zitplaats",newReservationButton:"Nieuwe Reservatie Maken"}},en:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",extraInfo:"Extra Info",seatPlace:"Seating area"},placeholders:{firstName:"First Name",lastName:"Last Name",email:"Email Address",phone:"Mobile Number",extraInfo:"Extra Information",seatPlace:"Select seating area"},magic:{title:"Guest Details"}},reservationSummary:{title:"Reservation Details",guests:"Number of Guests",date:"Date",time:"Time",firstName:"First Name",lastName:"Last Name",email:"Email",phone:"Mobile Number",menu:"Menu",staff:"Created by",giftcard:"Gift Card",extraInfo:"Extra Information",seatPlace:"Seating area",newReservationButton:"New Reservation"}},fr:{reservationStepTwoFiltering:{labels:{menu:"Menu",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise"},placeholders:{firstName:"Pr\xE9nom",lastName:"Nom",email:"Adresse e-mail",phone:"Num\xE9ro de portable",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"S\xE9lectionner une zone d\u2019assise"},magic:{title:"D\xE9tails Invit\xE9"}},reservationSummary:{title:"D\xE9tails de la R\xE9servation",guests:"Nombre d'invit\xE9s",date:"Date",time:"Heure",firstName:"Pr\xE9nom",lastName:"Nom",email:"E-mail",phone:"Num\xE9ro de portable",menu:"Menu",staff:"Cr\xE9\xE9 par",giftcard:"Carte Cadeau",extraInfo:"Informations suppl\xE9mentaires",seatPlace:"Zone d\u2019assise",newReservationButton:"Nouvelle R\xE9servation"}}};R0(`.new-reservation-page .reservation-sidebar-component .reservation-summary .modal-title{margin-top:0;margin-bottom:20px}.new-reservation-page .reservation-sidebar-component .reservation-summary .reservation-details{list-style-type:none;padding:0;margin:0 0 20px;width:100%}.new-reservation-page .reservation-sidebar-component .reservation-summary .reservation-details li{margin-bottom:10px;font-size:15px;align-items:left;text-align:left}.new-reservation-page .reservation-sidebar-component .reservation-summary .reservation-details li strong{font-weight:700}.new-reservation-page .reservation-sidebar-component .reservation-summary{align-items:left}
|
|
44
44
|
`);var a4=({formData:b,onNewReservation:c})=>{let q=j0(Ap,"reservationSummary");return o0.createElement("div",{className:"reservation-summary"},o0.createElement("ul",{className:"reservation-details"},o0.createElement("li",null,o0.createElement("strong",null,q.title)),o0.createElement("li",null,o0.createElement("strong",null,q.guests,":")," ",b.guests),o0.createElement("li",null,o0.createElement("strong",null,q.date,":")," ",b.date),o0.createElement("li",null,o0.createElement("strong",null,q.time,":")," ",b.time),o0.createElement("li",null,o0.createElement("strong",null,q.firstName,":")," ",b.firstName),o0.createElement("li",null,o0.createElement("strong",null,q.lastName,":")," ",b.lastName),o0.createElement("li",null,o0.createElement("strong",null,q.email,":")," ",b.email),o0.createElement("li",null,o0.createElement("strong",null,q.phone,":")," ",b.phone),b.menu&&o0.createElement("li",null,o0.createElement("strong",null,q.menu,":")," ",b.menu),b.personeel&&o0.createElement("li",null,o0.createElement("strong",null,q.staff,":")," ",b.personeel),b.giftcard&&o0.createElement("li",null,o0.createElement("strong",null,q.giftcard,":")," ",b.giftcard),b.extraInfo&&o0.createElement("li",null,o0.createElement("strong",null,q.extraInfo,":")," ",b.extraInfo),b.zitplaats&&o0.createElement("li",null,o0.createElement("strong",null,q.seatPlace,":")," ",b.zitplaats)),o0.createElement("button",{className:"button-style-3",onClick:c},q.newReservationButton))},w2=a4;var op={nl:{zitplaatsSelection:{labels:{seating:"Zitplaats"},options:{noPreference:"Geen voorkeur"}},giftcardSelection:{labels:{giftcard:"Cadeaubon"},options:{noGiftcard:"Geen Cadeaubon"}}},en:{zitplaatsSelection:{labels:{seating:"Seating"},options:{noPreference:"No preference"}},giftcardSelection:{labels:{giftcard:"Gift Card"},options:{noGiftcard:"No Gift Card"}}},fr:{zitplaatsSelection:{labels:{seating:"Place Assise"},options:{noPreference:"Pas de pr\xE9f\xE9rence"}},giftcardSelection:{labels:{giftcard:"Cadeau"},options:{noGiftcard:"Pas de carte"}}}};R0(`.new-reservation-page .giftcard-selection{margin-bottom:20px}.new-reservation-page .giftcard-options{display:flex;gap:20px;margin:10px 0}.new-reservation-page .giftcard-option{display:flex;align-items:center;gap:8px;cursor:pointer}.new-reservation-page .form-label{font-weight:500;margin-bottom:8px;display:block}.new-reservation-page .giftcard-option input[type=radio]{margin:0;cursor:pointer}.new-reservation-page .giftcard-option label{cursor:pointer}
|
|
45
45
|
`);var r4=({restaurantData:b,formData:c,handleChange:q,resetFormDataFields:e})=>{let W=j0(op,"giftcardSelection"),[n,a]=useState([]);if(useEffect(()=>{if(!b)return;let R=["breakfast","lunch","dinner"],v=new Set;R.forEach(u=>{let B=b[`openinghours-${u}`]?.schemeSettings||{};Object.values(B).forEach(h=>{h?.giftcardsEnabled&&Array.isArray(h.giftcards)&&h.giftcards.forEach(f=>{let g=typeof f=="string"?f.trim():String(f||"").trim();g&&v.add(g);});});}),a([...v]);},[b]),!n.length)return null;let s=n.map(R=>({value:R,label:R})),r=R=>{q({target:{name:"giftcard",value:R.target.value}}),e(["date","time"]);};return o0.createElement("div",{className:"giftcard-selection"},o0.createElement(_0,{label:W.labels?.giftcard||"Giftcard",name:"giftcard",type:"select",options:s,value:c.giftcard||"",onChange:r,selectPlaceholder:W.options?.noGiftcard||"Geen giftcard"}))},x2=r4;var P2=P0(c1());var ep={nl:{reservationSidebar:{saveButton:"Opslaan",saveButtonLoading:"Opslaan..."}},en:{reservationSidebar:{saveButton:"Save",saveButtonLoading:"Saving..."}},fr:{reservationSidebar:{saveButton:"Enregistrer",saveButtonLoading:"Enregistrement..."}}};R0(`.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}.admin-title{text-align:center;margin-bottom:30px}.reservation-sidebar-component.open{right:0}.reservation-sidebar-content{padding:60px 20px 20px}.close-sidebar-button{position:absolute;top:10px;left:10px;background-color:transparent;border:none;cursor:pointer}.close-sidebar-button svg{color:#000}.sidebar-section-one,.sidebar-section-two{margin-bottom:20px}.reservation-footer{margin-top:auto}.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}.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}.open-sidebar-button:hover{background-color:var(--color-blue-hover-accent)!important}.open-sidebar-button svg{position:relative;top:2px}@media screen and (max-width:480px){.reservation-sidebar-component{width:100%}}.sidebar-section-personeel{margin-bottom:10px}.sidebar-tabs{display:flex;border-bottom:1px solid #ddd;margin-bottom:20px}.sidebar-tab-button{flex:1;padding:10px;border:none;background:transparent;border-bottom:none;font-weight:400;cursor:pointer;color:#666}.sidebar-tab-button.active{border-bottom:2px solid var(--color-blue);font-weight:700;color:var(--color-blue)}
|
package/package.json
CHANGED
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@happychef/reservation-sidebar",
|
|
3
|
-
"version": "2.8.
|
|
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
|
-
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
35
|
-
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
36
|
-
"react-icons": "^4.0.0 || ^5.0.0"
|
|
37
|
-
},
|
|
38
|
-
"dependencies": {
|
|
39
|
-
"moment-timezone": "^0.5.48"
|
|
40
|
-
},
|
|
41
|
-
"devDependencies": {
|
|
42
|
-
"@happychef/algorithm": "^1.2.
|
|
43
|
-
"axios": "^1.7.9",
|
|
44
|
-
"framer-motion": "^12.23.24",
|
|
45
|
-
"moment-timezone": "^0.5.48",
|
|
46
|
-
"react": "^18.3.1",
|
|
47
|
-
"react-dom": "^18.3.1",
|
|
48
|
-
"react-icons": "^5.3.0",
|
|
49
|
-
"tsup": "^8.5.1",
|
|
50
|
-
"typescript": "^5.9.3"
|
|
51
|
-
},
|
|
52
|
-
"repository": {
|
|
53
|
-
"type": "git",
|
|
54
|
-
"url": "https://github.com/thibaultvandesompele2/16-happy-admin-reservation.git"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@happychef/reservation-sidebar",
|
|
3
|
+
"version": "2.8.45",
|
|
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
|
+
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
35
|
+
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
|
|
36
|
+
"react-icons": "^4.0.0 || ^5.0.0"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"moment-timezone": "^0.5.48"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@happychef/algorithm": "^1.2.30",
|
|
43
|
+
"axios": "^1.7.9",
|
|
44
|
+
"framer-motion": "^12.23.24",
|
|
45
|
+
"moment-timezone": "^0.5.48",
|
|
46
|
+
"react": "^18.3.1",
|
|
47
|
+
"react-dom": "^18.3.1",
|
|
48
|
+
"react-icons": "^5.3.0",
|
|
49
|
+
"tsup": "^8.5.1",
|
|
50
|
+
"typescript": "^5.9.3"
|
|
51
|
+
},
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "https://github.com/thibaultvandesompele2/16-happy-admin-reservation.git"
|
|
55
|
+
}
|
|
56
|
+
}
|