@withpotter/pages-bookings 0.13.0-next.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dashboard/(bookings)/attendees/page.js +8 -0
- package/dist/dashboard/(bookings)/attendees/page.js.map +1 -0
- package/dist/dashboard/(bookings)/availability/_components/availability-screen.js +714 -0
- package/dist/dashboard/(bookings)/availability/_components/availability-screen.js.map +1 -0
- package/dist/dashboard/(bookings)/availability/_components/month-availability.js +130 -0
- package/dist/dashboard/(bookings)/availability/_components/month-availability.js.map +1 -0
- package/dist/dashboard/(bookings)/availability/page.js +10 -0
- package/dist/dashboard/(bookings)/availability/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/assign-resource-modal.js +133 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/assign-resource-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-constants.js +26 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-constants.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-desktop-layout.js +194 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-desktop-layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-layout-props.js +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-layout-props.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-lede.js +189 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-lede.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-meta.js +38 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-meta.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-layout.js +315 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-screen.js +94 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-mobile-screen.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-money.js +54 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-money.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-split.js +71 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/booking-split.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancel-booking-modal.js +102 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancel-booking-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancellation-notice.js +33 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/cancellation-notice.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/customer-info-card.js +65 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/customer-info-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/index.js +23 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/intake-answers-card.js +19 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/intake-answers-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/refund-booking-modal.js +156 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/refund-booking-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/reschedule-booking-modal.js +120 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/reschedule-booking-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/security-deposit-card.js +63 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/security-deposit-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/settle-deposit-modal.js +141 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/settle-deposit-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/ticket-row-actions.js +49 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/ticket-row-actions.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/waiting-queue-notice.js +42 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/waiting-queue-notice.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_components.js +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/index.js +19 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/use-booking-detail-data.js +352 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks/use-booking-detail-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/_hooks.js +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/layout.js +33 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/page.js +356 -0
- package/dist/dashboard/(bookings)/bookings/[bookingId]/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/appointment-calendar-layout.js +34 -0
- package/dist/dashboard/(bookings)/bookings/_components/appointment-calendar-layout.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-constants.js +92 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-constants.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-tab-hints.js +32 -0
- package/dist/dashboard/(bookings)/bookings/_components/booking-tab-hints.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-filter-bar.js +131 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-filter-bar.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-mobile-controls.js +119 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-mobile-controls.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-screen.js +414 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-screen.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-table.js +192 -0
- package/dist/dashboard/(bookings)/bookings/_components/bookings-table.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/cannot-take-bookings.js +34 -0
- package/dist/dashboard/(bookings)/bookings/_components/cannot-take-bookings.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/demo-data.js +176 -0
- package/dist/dashboard/(bookings)/bookings/_components/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/index.js +9 -0
- package/dist/dashboard/(bookings)/bookings/_components/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/booking-card.js +126 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/booking-card.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/demo-data.js +142 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/handover.js +128 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/handover.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/index.js +17 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/past-band.js +69 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/past-band.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/resource-board.js +111 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/resource-board.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/today-band.js +61 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/today-band.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/upcoming-band.js +113 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/upcoming-band.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/waiting-queue.js +62 -0
- package/dist/dashboard/(bookings)/bookings/_components/today/waiting-queue.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today-board.js +192 -0
- package/dist/dashboard/(bookings)/bookings/_components/today-board.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_components/today.js +1 -0
- package/dist/dashboard/(bookings)/bookings/_components.js +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/index.js +5 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/index.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-bookings-data.js +331 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-bookings-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-today-data.js +309 -0
- package/dist/dashboard/(bookings)/bookings/_hooks/use-today-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/_hooks.js +1 -0
- package/dist/dashboard/(bookings)/bookings/_lib/booking-link.js +13 -0
- package/dist/dashboard/(bookings)/bookings/_lib/booking-link.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/attendee-cards.js +60 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/attendee-cards.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/qr-scanner-modal.js +225 -0
- package/dist/dashboard/(bookings)/bookings/attendees/_components/qr-scanner-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/demo-data.js +195 -0
- package/dist/dashboard/(bookings)/bookings/attendees/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/attendees/page.js +341 -0
- package/dist/dashboard/(bookings)/bookings/attendees/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/new/page.js +129 -0
- package/dist/dashboard/(bookings)/bookings/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/page.js +10 -0
- package/dist/dashboard/(bookings)/bookings/page.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/save-buttons.js +36 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/save-buttons.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/session-creator.js +386 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_components/session-creator.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_lib/session-payload.js +62 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/_lib/session-payload.js.map +1 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/page.js +10 -0
- package/dist/dashboard/(bookings)/bookings/sessions/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-nav.js +84 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-nav.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-range.js +84 -0
- package/dist/dashboard/(bookings)/calendar/_components/calendar-range.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/day-board-view.js +279 -0
- package/dist/dashboard/(bookings)/calendar/_components/day-board-view.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/event-detail-modal.js +113 -0
- package/dist/dashboard/(bookings)/calendar/_components/event-detail-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/format.js +22 -0
- package/dist/dashboard/(bookings)/calendar/_components/format.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/month-grid.js +109 -0
- package/dist/dashboard/(bookings)/calendar/_components/month-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/resource-day-grid.js +325 -0
- package/dist/dashboard/(bookings)/calendar/_components/resource-day-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/slot-action-sheet.js +209 -0
- package/dist/dashboard/(bookings)/calendar/_components/slot-action-sheet.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-block-drag.js +77 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-block-drag.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-calendar-nav.js +69 -0
- package/dist/dashboard/(bookings)/calendar/_components/use-calendar-nav.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/week-grid.js +202 -0
- package/dist/dashboard/(bookings)/calendar/_components/week-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/_components/year-grid.js +111 -0
- package/dist/dashboard/(bookings)/calendar/_components/year-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar/page.js +8 -0
- package/dist/dashboard/(bookings)/calendar/page.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feed-modal.js +126 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feed-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feeds-section.js +99 -0
- package/dist/dashboard/(bookings)/calendar-sync/_components/channel-feeds-section.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/demo-data.js +64 -0
- package/dist/dashboard/(bookings)/calendar-sync/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/calendar-sync/page.js +15 -0
- package/dist/dashboard/(bookings)/calendar-sync/page.js.map +1 -0
- package/dist/dashboard/(bookings)/check-in/page.js +252 -0
- package/dist/dashboard/(bookings)/check-in/page.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-attendees.js +108 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-attendees.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-share.js +73 -0
- package/dist/dashboard/(bookings)/events/[eventId]/_components/event-share.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/layout.js +10 -0
- package/dist/dashboard/(bookings)/events/[eventId]/layout.js.map +1 -0
- package/dist/dashboard/(bookings)/events/[eventId]/page.js +247 -0
- package/dist/dashboard/(bookings)/events/[eventId]/page.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_components/event-grid.js +44 -0
- package/dist/dashboard/(bookings)/events/_components/event-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_components/event-poster.js +17 -0
- package/dist/dashboard/(bookings)/events/_components/event-poster.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_hooks/use-events-data.js +55 -0
- package/dist/dashboard/(bookings)/events/_hooks/use-events-data.js.map +1 -0
- package/dist/dashboard/(bookings)/events/_lib/event-facts.js +68 -0
- package/dist/dashboard/(bookings)/events/_lib/event-facts.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-composer.js +295 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-composer.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-poster.js +65 -0
- package/dist/dashboard/(bookings)/events/new/_components/event-poster.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/_components/ticket-tiers.js +75 -0
- package/dist/dashboard/(bookings)/events/new/_components/ticket-tiers.js.map +1 -0
- package/dist/dashboard/(bookings)/events/new/page.js +10 -0
- package/dist/dashboard/(bookings)/events/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/events/page.js +214 -0
- package/dist/dashboard/(bookings)/events/page.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/layout.js +36 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/layout.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/page.js +351 -0
- package/dist/dashboard/(bookings)/resources/[resourceId]/page.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/block-time-modal.js +130 -0
- package/dist/dashboard/(bookings)/resources/_components/block-time-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/category-card.js +74 -0
- package/dist/dashboard/(bookings)/resources/_components/category-card.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/category-form-dialog.js +197 -0
- package/dist/dashboard/(bookings)/resources/_components/category-form-dialog.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/day-editor.js +194 -0
- package/dist/dashboard/(bookings)/resources/_components/day-editor.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/group-dialog.js +170 -0
- package/dist/dashboard/(bookings)/resources/_components/group-dialog.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/group-header.js +90 -0
- package/dist/dashboard/(bookings)/resources/_components/group-header.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/index.js +22 -0
- package/dist/dashboard/(bookings)/resources/_components/index.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/mobile-category-form-sheet.js +256 -0
- package/dist/dashboard/(bookings)/resources/_components/mobile-category-form-sheet.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-form.js +420 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-form.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-picker.js +144 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-picker.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-type-picker-empty.js +109 -0
- package/dist/dashboard/(bookings)/resources/_components/resource-type-picker-empty.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-empty.js +103 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-empty.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-grid.js +160 -0
- package/dist/dashboard/(bookings)/resources/_components/roster-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-editor.js +244 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-editor.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-timezone-field.js +25 -0
- package/dist/dashboard/(bookings)/resources/_components/schedule-timezone-field.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/solo-schedule-view.js +146 -0
- package/dist/dashboard/(bookings)/resources/_components/solo-schedule-view.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/team-onboarding-dialog.js +161 -0
- package/dist/dashboard/(bookings)/resources/_components/team-onboarding-dialog.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components/week-grid.js +175 -0
- package/dist/dashboard/(bookings)/resources/_components/week-grid.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_components.js +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/index.js +8 -0
- package/dist/dashboard/(bookings)/resources/_hooks/index.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-resource-categories-data.js +86 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-resource-categories-data.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster-page.js +138 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster-page.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster.js +182 -0
- package/dist/dashboard/(bookings)/resources/_hooks/use-roster.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_hooks.js +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/presets.js +147 -0
- package/dist/dashboard/(bookings)/resources/_lib/presets.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/schedule-timezone.js +17 -0
- package/dist/dashboard/(bookings)/resources/_lib/schedule-timezone.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/shapes.js +105 -0
- package/dist/dashboard/(bookings)/resources/_lib/shapes.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/_lib/week.js +122 -0
- package/dist/dashboard/(bookings)/resources/_lib/week.js.map +1 -0
- package/dist/dashboard/(bookings)/resources/page.js +391 -0
- package/dist/dashboard/(bookings)/resources/page.js.map +1 -0
- package/dist/dashboard/(bookings)/schedule/page.js +8 -0
- package/dist/dashboard/(bookings)/schedule/page.js.map +1 -0
- package/dist/dashboard/(bookings)/today/page.js +14 -0
- package/dist/dashboard/(bookings)/today/page.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/_components/demo-data.js +99 -0
- package/dist/dashboard/(bookings)/waitlist/_components/demo-data.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/_components/offer-spot-modal.js +71 -0
- package/dist/dashboard/(bookings)/waitlist/_components/offer-spot-modal.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/_components/waitlist-entry-editor.js +150 -0
- package/dist/dashboard/(bookings)/waitlist/_components/waitlist-entry-editor.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/new/page.js +59 -0
- package/dist/dashboard/(bookings)/waitlist/new/page.js.map +1 -0
- package/dist/dashboard/(bookings)/waitlist/page.js +317 -0
- package/dist/dashboard/(bookings)/waitlist/page.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const WEEK_DAYS = [1, 2, 3, 4, 5, 6, 0];
|
|
2
|
+
const DAY_INITIAL = ["S", "M", "T", "W", "T", "F", "S"];
|
|
3
|
+
const DAY_SHORT = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
4
|
+
const DAY_LONG = [
|
|
5
|
+
"Sunday",
|
|
6
|
+
"Monday",
|
|
7
|
+
"Tuesday",
|
|
8
|
+
"Wednesday",
|
|
9
|
+
"Thursday",
|
|
10
|
+
"Friday",
|
|
11
|
+
"Saturday"
|
|
12
|
+
];
|
|
13
|
+
const HOURS_KEYS = [
|
|
14
|
+
"sun",
|
|
15
|
+
"mon",
|
|
16
|
+
"tue",
|
|
17
|
+
"wed",
|
|
18
|
+
"thu",
|
|
19
|
+
"fri",
|
|
20
|
+
"sat"
|
|
21
|
+
];
|
|
22
|
+
function isoDay(date) {
|
|
23
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
24
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
25
|
+
return `${date.getFullYear()}-${month}-${day}`;
|
|
26
|
+
}
|
|
27
|
+
function addDays(date, count) {
|
|
28
|
+
const next = new Date(date);
|
|
29
|
+
next.setDate(next.getDate() + count);
|
|
30
|
+
return next;
|
|
31
|
+
}
|
|
32
|
+
function startOfWeek(date) {
|
|
33
|
+
const start = new Date(date);
|
|
34
|
+
start.setHours(0, 0, 0, 0);
|
|
35
|
+
return addDays(start, -((start.getDay() + 6) % 7));
|
|
36
|
+
}
|
|
37
|
+
function weekLabel(monday) {
|
|
38
|
+
const sunday = addDays(monday, 6);
|
|
39
|
+
const month = (d) => d.toLocaleDateString("en-GB", { month: "short" });
|
|
40
|
+
return month(monday) === month(sunday) ? `${monday.getDate()}\u2013${sunday.getDate()} ${month(sunday)}` : `${monday.getDate()} ${month(monday)} \u2013 ${sunday.getDate()} ${month(sunday)}`;
|
|
41
|
+
}
|
|
42
|
+
function daySlots(schedule, dow) {
|
|
43
|
+
if (!schedule) return void 0;
|
|
44
|
+
const day = schedule[dow];
|
|
45
|
+
if (!day) return void 0;
|
|
46
|
+
if (!day.available) return null;
|
|
47
|
+
const slots = (day.slots ?? []).filter((s) => s?.start && s?.end);
|
|
48
|
+
return slots.length ? slots : null;
|
|
49
|
+
}
|
|
50
|
+
function fmtClock(value) {
|
|
51
|
+
const [rawHour, rawMinute] = value.split(":");
|
|
52
|
+
const hour = Number(rawHour);
|
|
53
|
+
const minute = Number(rawMinute);
|
|
54
|
+
if (!Number.isFinite(hour)) return value;
|
|
55
|
+
const suffix = hour < 12 ? "am" : "pm";
|
|
56
|
+
const twelve = hour % 12 === 0 ? 12 : hour % 12;
|
|
57
|
+
return minute ? `${twelve}:${String(minute).padStart(2, "0")}${suffix}` : `${twelve}${suffix}`;
|
|
58
|
+
}
|
|
59
|
+
function fmtSlots(slots) {
|
|
60
|
+
return slots.map((s) => `${fmtClock(s.start)}\u2013${fmtClock(s.end)}`).join(", ");
|
|
61
|
+
}
|
|
62
|
+
function blocksOn(blocks, resourceId, iso) {
|
|
63
|
+
return blocks.filter(
|
|
64
|
+
(b) => (b.resourceId ?? "") === resourceId && isoDay(new Date(b.start)) === iso
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
function summariseHours(hours) {
|
|
68
|
+
const signature = (dow) => {
|
|
69
|
+
const day = hours.days[HOURS_KEYS[dow]];
|
|
70
|
+
if (!day?.enabled) return "closed";
|
|
71
|
+
return fmtSlots(day.slots ?? []) || "closed";
|
|
72
|
+
};
|
|
73
|
+
const runs = [];
|
|
74
|
+
for (const dow of WEEK_DAYS) {
|
|
75
|
+
const label = signature(dow);
|
|
76
|
+
const last = runs[runs.length - 1];
|
|
77
|
+
if (last && last.label === label) last.to = dow;
|
|
78
|
+
else runs.push({ from: dow, to: dow, label });
|
|
79
|
+
}
|
|
80
|
+
return runs.map(({ from, to, label }) => {
|
|
81
|
+
const days = from === to ? DAY_SHORT[from] : `${DAY_SHORT[from]}\u2013${DAY_SHORT[to]}`;
|
|
82
|
+
return label === "closed" ? `${days} closed` : `${days} ${label}`;
|
|
83
|
+
}).join(" \xB7 ");
|
|
84
|
+
}
|
|
85
|
+
function businessSlots(hours, dow) {
|
|
86
|
+
const day = hours.days[HOURS_KEYS[dow]];
|
|
87
|
+
if (!day?.enabled) return null;
|
|
88
|
+
const slots = (day.slots ?? []).filter((s) => s?.start && s?.end);
|
|
89
|
+
return slots.length ? slots : null;
|
|
90
|
+
}
|
|
91
|
+
function weekStates(schedule, hours, blockedDows = /* @__PURE__ */ new Set()) {
|
|
92
|
+
return WEEK_DAYS.map((dow) => {
|
|
93
|
+
const own = daySlots(schedule, dow);
|
|
94
|
+
const inherited = own === void 0;
|
|
95
|
+
const slots = inherited ? businessSlots(hours, dow) : own;
|
|
96
|
+
return {
|
|
97
|
+
dow,
|
|
98
|
+
hours: slots ? fmtSlots(slots) : null,
|
|
99
|
+
inherited,
|
|
100
|
+
blocked: blockedDows.has(dow)
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
DAY_INITIAL,
|
|
106
|
+
DAY_LONG,
|
|
107
|
+
DAY_SHORT,
|
|
108
|
+
HOURS_KEYS,
|
|
109
|
+
WEEK_DAYS,
|
|
110
|
+
addDays,
|
|
111
|
+
blocksOn,
|
|
112
|
+
businessSlots,
|
|
113
|
+
daySlots,
|
|
114
|
+
fmtClock,
|
|
115
|
+
fmtSlots,
|
|
116
|
+
isoDay,
|
|
117
|
+
startOfWeek,
|
|
118
|
+
summariseHours,
|
|
119
|
+
weekLabel,
|
|
120
|
+
weekStates
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=week.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_lib/week.ts"],"sourcesContent":["import type { CalendarEventItem } from '@withpotter/lib/api/types';\nimport type { WeeklyHours } from '@withpotter/hooks/use-hours-data';\nimport type { ScheduleSlot, WeeklySchedule } from '@withpotter/lib/resource-types';\n\n/**\n * Monday first, everywhere on this surface.\n *\n * `WeeklySchedule` is keyed by `Date.getDay()`, which starts on Sunday, and a\n * rota is read Monday to Sunday. Rather than let each component pick, the order\n * is declared once and every strip, grid and summary walks it.\n */\nexport const WEEK_DAYS = [1, 2, 3, 4, 5, 6, 0] as const;\n\n/** Indexed by `getDay()`, not by position in the week. */\nexport const DAY_INITIAL = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];\nexport const DAY_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nexport const DAY_LONG = [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n];\n\n/** `WeeklyHours` is keyed by name; this maps a `getDay()` onto it. */\nexport const HOURS_KEYS = [\n 'sun',\n 'mon',\n 'tue',\n 'wed',\n 'thu',\n 'fri',\n 'sat',\n] as const;\n\n/** Local YYYY-MM-DD. `toISOString` would shift a Lagos evening into tomorrow. */\nexport function isoDay(date: Date): string {\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n}\n\nexport function addDays(date: Date, count: number): Date {\n const next = new Date(date);\n next.setDate(next.getDate() + count);\n return next;\n}\n\n/** The Monday on or before `date`. */\nexport function startOfWeek(date: Date): Date {\n const start = new Date(date);\n start.setHours(0, 0, 0, 0);\n return addDays(start, -((start.getDay() + 6) % 7));\n}\n\n/** \"24–30 Aug\", or \"28 Jul – 3 Aug\" when the week straddles two months. */\nexport function weekLabel(monday: Date): string {\n const sunday = addDays(monday, 6);\n const month = (d: Date) => d.toLocaleDateString('en-GB', { month: 'short' });\n return month(monday) === month(sunday)\n ? `${monday.getDate()}–${sunday.getDate()} ${month(sunday)}`\n : `${monday.getDate()} ${month(monday)} – ${sunday.getDate()} ${month(sunday)}`;\n}\n\n/**\n * What this resource works on that weekday, or null for a day it does not.\n *\n * A resource with no schedule of its own is not closed — it has never been\n * given one, and the business's own hours govern it. That difference is the\n * caller's to draw, so this returns `undefined` for \"never answered\" and `null`\n * for \"answered: not that day\".\n */\nexport function daySlots(\n schedule: WeeklySchedule | null | undefined,\n dow: number,\n): ScheduleSlot[] | null | undefined {\n if (!schedule) return undefined;\n const day = schedule[dow];\n if (!day) return undefined;\n if (!day.available) return null;\n const slots = (day.slots ?? []).filter((s) => s?.start && s?.end);\n return slots.length ? slots : null;\n}\n\n/**\n * \"09:00\" → \"9am\", \"09:30\" → \"9:30am\".\n *\n * A shift is read aloud as nine to five, not as nine to seventeen: the 24-hour\n * spelling made a summary line say \"Mon–Fri 9–17\", which is nobody's working\n * week. The fields that SET a time stay 24-hour, because that is what the API\n * stores and what `TimeField` edits.\n */\nexport function fmtClock(value: string): string {\n const [rawHour, rawMinute] = value.split(':');\n const hour = Number(rawHour);\n const minute = Number(rawMinute);\n if (!Number.isFinite(hour)) return value;\n const suffix = hour < 12 ? 'am' : 'pm';\n const twelve = hour % 12 === 0 ? 12 : hour % 12;\n return minute\n ? `${twelve}:${String(minute).padStart(2, '0')}${suffix}`\n : `${twelve}${suffix}`;\n}\n\n/** \"9am–5pm\", or \"9am–1pm, 2pm–6pm\" for a split shift. */\nexport function fmtSlots(slots: ScheduleSlot[]): string {\n return slots.map((s) => `${fmtClock(s.start)}–${fmtClock(s.end)}`).join(', ');\n}\n\n/** Every block on one resource on one local day. */\nexport function blocksOn(\n blocks: CalendarEventItem[],\n resourceId: string,\n iso: string,\n): CalendarEventItem[] {\n return blocks.filter(\n (b) =>\n (b.resourceId ?? '') === resourceId && isoDay(new Date(b.start)) === iso,\n );\n}\n\n/**\n * The trading week in one line: \"Mon–Fri 9–5 · Sat 10–2 · Closed Sun\".\n *\n * Runs of identical days collapse, because a merchant reads their own week as\n * two or three shapes and not as seven rows — seven rows is what the editor is\n * for, and it is one press away.\n */\nexport function summariseHours(hours: WeeklyHours): string {\n const signature = (dow: number) => {\n const day = hours.days[HOURS_KEYS[dow]];\n if (!day?.enabled) return 'closed';\n return fmtSlots(day.slots ?? []) || 'closed';\n };\n\n const runs: Array<{ from: number; to: number; label: string }> = [];\n for (const dow of WEEK_DAYS) {\n const label = signature(dow);\n const last = runs[runs.length - 1];\n if (last && last.label === label) last.to = dow;\n else runs.push({ from: dow, to: dow, label });\n }\n\n return runs\n .map(({ from, to, label }) => {\n const days =\n from === to ? DAY_SHORT[from] : `${DAY_SHORT[from]}–${DAY_SHORT[to]}`;\n return label === 'closed' ? `${days} closed` : `${days} ${label}`;\n })\n .join(' · ');\n}\n\n/** One day of one resource's week, resolved against the business's own. */\nexport interface DayState {\n dow: number;\n /** The shift, \"9–5\". Null means not working that day. */\n hours: string | null;\n /** True when this came from the business's hours, not the resource's own. */\n inherited: boolean;\n /** Some of that day is blocked off. */\n blocked: boolean;\n}\n\n/** The business's own shift on a weekday, or null for a day it is shut. */\nexport function businessSlots(\n hours: WeeklyHours,\n dow: number,\n): ScheduleSlot[] | null {\n const day = hours.days[HOURS_KEYS[dow]];\n if (!day?.enabled) return null;\n const slots = (day.slots ?? []).filter((s) => s?.start && s?.end);\n return slots.length ? slots : null;\n}\n\n/**\n * A resource's week, Monday first.\n *\n * A resource with no schedule of its own is not a resource that never works —\n * the business's hours govern it until someone says otherwise, and drawing it\n * as seven closed days is the same lie as drawing it as seven open ones.\n */\nexport function weekStates(\n schedule: WeeklySchedule | null | undefined,\n hours: WeeklyHours,\n blockedDows: Set<number> = new Set(),\n): DayState[] {\n return WEEK_DAYS.map((dow) => {\n const own = daySlots(schedule, dow);\n const inherited = own === undefined;\n const slots = inherited ? businessSlots(hours, dow) : own;\n return {\n dow,\n hours: slots ? fmtSlots(slots) : null,\n inherited,\n blocked: blockedDows.has(dow),\n };\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { FLAT_CONTROL, TOOLBAR_H } from "@withpotter/ui-kit/toolbar-parts";
|
|
4
|
+
import { AnimatePresence } from "motion/react";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
import { useRouter } from "next/navigation";
|
|
7
|
+
import { Plus, SearchX } from "lucide-react";
|
|
8
|
+
import { useHoursData } from "@withpotter/hooks/use-hours-data";
|
|
9
|
+
import { useBusinessLocations } from "@withpotter/lib/use-business-locations";
|
|
10
|
+
import { useModuleLabel } from "@withpotter/lib/use-module-label";
|
|
11
|
+
import { useEntityLabel } from "@withpotter/lib/intents/use-entity-label";
|
|
12
|
+
import { useIntentConfig } from "@withpotter/lib/intents/use-intent-config";
|
|
13
|
+
import { useRegisterRefresh } from "@withpotter/components/mobile/pull-to-refresh-context";
|
|
14
|
+
import { Button } from "@withpotter/ui-kit/button";
|
|
15
|
+
import { ListPage } from "@withpotter/ui-kit/list-page";
|
|
16
|
+
import { MobilePageHeader } from "@withpotter/components/mobile/mobile-page-header";
|
|
17
|
+
import { ListStates } from "@withpotter/ui-kit/list-states";
|
|
18
|
+
import { FilterBar } from "@withpotter/ui-kit/filter-bar";
|
|
19
|
+
import { FilterField } from "@withpotter/ui-kit/filter-menu";
|
|
20
|
+
import { Select } from "@withpotter/ui-kit/select";
|
|
21
|
+
import { TableEmptyState } from "@withpotter/ui-kit/table-empty-state";
|
|
22
|
+
import { useRoster, useRosterPage } from "./_hooks";
|
|
23
|
+
import { availabilityWords } from "./_lib/shapes";
|
|
24
|
+
import {
|
|
25
|
+
BlockTimeModal,
|
|
26
|
+
DayEditor,
|
|
27
|
+
GroupDialog,
|
|
28
|
+
ResourceForm,
|
|
29
|
+
RosterEmpty,
|
|
30
|
+
RosterGrid,
|
|
31
|
+
WeekGrid
|
|
32
|
+
} from "./_components";
|
|
33
|
+
function ResourcesPage() {
|
|
34
|
+
const [emptyPickerOpen, setEmptyPickerOpen] = useState(false);
|
|
35
|
+
const router = useRouter();
|
|
36
|
+
const { hours } = useHoursData();
|
|
37
|
+
const intentConfig = useIntentConfig();
|
|
38
|
+
const resourceLabel = useEntityLabel("resource");
|
|
39
|
+
const defaultTitle = useModuleLabel("resources", resourceLabel.plural);
|
|
40
|
+
const genericTitle = useModuleLabel("resources", "Resources");
|
|
41
|
+
const { locations, isMultiSite } = useBusinessLocations();
|
|
42
|
+
const branches = isMultiSite ? locations : [];
|
|
43
|
+
const roster = useRoster();
|
|
44
|
+
const {
|
|
45
|
+
categories,
|
|
46
|
+
rows,
|
|
47
|
+
usage,
|
|
48
|
+
loading,
|
|
49
|
+
error,
|
|
50
|
+
saving,
|
|
51
|
+
refetch,
|
|
52
|
+
createGroup,
|
|
53
|
+
updateGroup,
|
|
54
|
+
deleteGroup,
|
|
55
|
+
createResource,
|
|
56
|
+
updateResource,
|
|
57
|
+
setResourceStatus,
|
|
58
|
+
blockTime,
|
|
59
|
+
unblockTime
|
|
60
|
+
} = roster;
|
|
61
|
+
useRegisterRefresh(refetch);
|
|
62
|
+
const {
|
|
63
|
+
pageTitle,
|
|
64
|
+
groupId,
|
|
65
|
+
group,
|
|
66
|
+
setGroup,
|
|
67
|
+
view,
|
|
68
|
+
weekStart,
|
|
69
|
+
setWeekStart,
|
|
70
|
+
search,
|
|
71
|
+
setSearch,
|
|
72
|
+
status,
|
|
73
|
+
setStatus,
|
|
74
|
+
locationId,
|
|
75
|
+
setLocationId,
|
|
76
|
+
today,
|
|
77
|
+
blocks,
|
|
78
|
+
refetchBlocks,
|
|
79
|
+
addingTo,
|
|
80
|
+
setAddingTo,
|
|
81
|
+
editingGroup,
|
|
82
|
+
setEditingGroup,
|
|
83
|
+
addingGroup,
|
|
84
|
+
setAddingGroup,
|
|
85
|
+
blockingFor,
|
|
86
|
+
setBlockingFor,
|
|
87
|
+
blockError,
|
|
88
|
+
setBlockError,
|
|
89
|
+
editingDay,
|
|
90
|
+
setEditingDay,
|
|
91
|
+
filtered,
|
|
92
|
+
sections,
|
|
93
|
+
isEmpty,
|
|
94
|
+
narrowed,
|
|
95
|
+
showBands,
|
|
96
|
+
targetGroup,
|
|
97
|
+
handleDelete,
|
|
98
|
+
handleBlock
|
|
99
|
+
} = useRosterPage(roster, defaultTitle, genericTitle);
|
|
100
|
+
const intentKey = intentConfig.all[0]?.key ?? null;
|
|
101
|
+
const openCreateResource = () => {
|
|
102
|
+
setEmptyPickerOpen(true);
|
|
103
|
+
};
|
|
104
|
+
return /* @__PURE__ */ jsxs(
|
|
105
|
+
ListPage,
|
|
106
|
+
{
|
|
107
|
+
largeTitle: true,
|
|
108
|
+
title: pageTitle,
|
|
109
|
+
breadcrumbs: group ? [
|
|
110
|
+
{ label: "Resources", href: "/dashboard/resources" },
|
|
111
|
+
{ label: group.labelPlural }
|
|
112
|
+
] : void 0,
|
|
113
|
+
mobileHeader: /* @__PURE__ */ jsx(
|
|
114
|
+
MobilePageHeader,
|
|
115
|
+
{
|
|
116
|
+
title: pageTitle,
|
|
117
|
+
action: {
|
|
118
|
+
label: "Create",
|
|
119
|
+
icon: Plus,
|
|
120
|
+
compact: true,
|
|
121
|
+
onClick: openCreateResource
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
actions: /* @__PURE__ */ jsxs(
|
|
126
|
+
Button,
|
|
127
|
+
{
|
|
128
|
+
className: `${TOOLBAR_H} ${FLAT_CONTROL}`,
|
|
129
|
+
"aria-label": "Create resource",
|
|
130
|
+
disabled: categories.length > 0 && !targetGroup,
|
|
131
|
+
onClick: openCreateResource,
|
|
132
|
+
children: [
|
|
133
|
+
/* @__PURE__ */ jsx(Plus, {}),
|
|
134
|
+
"Create"
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
),
|
|
138
|
+
children: [
|
|
139
|
+
/* @__PURE__ */ jsx(
|
|
140
|
+
RosterEmpty,
|
|
141
|
+
{
|
|
142
|
+
resourceLabel,
|
|
143
|
+
saving,
|
|
144
|
+
showEmptyState: isEmpty && categories.length === 0,
|
|
145
|
+
onCreateCategory: async (preset) => {
|
|
146
|
+
const created = await createGroup({
|
|
147
|
+
label: preset.singular,
|
|
148
|
+
labelPlural: preset.plural,
|
|
149
|
+
kind: preset.kind
|
|
150
|
+
});
|
|
151
|
+
if (created && typeof created === "object" && "id" in created && typeof created.id === "string") {
|
|
152
|
+
setEmptyPickerOpen(false);
|
|
153
|
+
router.push(`/dashboard/resources?newGroup=${created.id}`);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
pickerOpen: emptyPickerOpen,
|
|
157
|
+
onPickerOpenChange: setEmptyPickerOpen
|
|
158
|
+
}
|
|
159
|
+
),
|
|
160
|
+
!loading && (categories.length > 0 || !isEmpty) ? /* @__PURE__ */ jsxs("div", { className: "-mt-8 space-y-4 lg:mt-6", children: [
|
|
161
|
+
/* @__PURE__ */ jsxs(
|
|
162
|
+
FilterBar,
|
|
163
|
+
{
|
|
164
|
+
toolbar: true,
|
|
165
|
+
search,
|
|
166
|
+
onSearchChange: setSearch,
|
|
167
|
+
placeholder: `Search ${pageTitle.toLowerCase()}`,
|
|
168
|
+
activeCount: Number(!!groupId) + Number(!!status),
|
|
169
|
+
filterInsideSearch: true,
|
|
170
|
+
children: [
|
|
171
|
+
categories.length > 1 && /* @__PURE__ */ jsx(FilterField, { label: "Group", children: /* @__PURE__ */ jsx(
|
|
172
|
+
Select,
|
|
173
|
+
{
|
|
174
|
+
value: groupId,
|
|
175
|
+
onChange: setGroup,
|
|
176
|
+
options: [
|
|
177
|
+
{ value: "", label: "All groups" },
|
|
178
|
+
...Array.from(
|
|
179
|
+
new Map(
|
|
180
|
+
categories.filter(
|
|
181
|
+
(category) => rows.some(
|
|
182
|
+
(row) => row.categoryId === category.id
|
|
183
|
+
) || category.id === groupId
|
|
184
|
+
).map((category) => [
|
|
185
|
+
category.labelPlural.toLowerCase(),
|
|
186
|
+
{
|
|
187
|
+
value: category.id,
|
|
188
|
+
label: category.labelPlural
|
|
189
|
+
}
|
|
190
|
+
])
|
|
191
|
+
).values()
|
|
192
|
+
)
|
|
193
|
+
],
|
|
194
|
+
placeholder: "All groups",
|
|
195
|
+
ariaLabel: "Filter resources by group"
|
|
196
|
+
}
|
|
197
|
+
) }),
|
|
198
|
+
/* @__PURE__ */ jsx(FilterField, { label: "Status", children: /* @__PURE__ */ jsx(
|
|
199
|
+
Select,
|
|
200
|
+
{
|
|
201
|
+
value: status,
|
|
202
|
+
onChange: setStatus,
|
|
203
|
+
options: [
|
|
204
|
+
{ value: "", label: "All statuses" },
|
|
205
|
+
{ value: "active", label: "Bookable" },
|
|
206
|
+
{ value: "inactive", label: "Off the board" }
|
|
207
|
+
],
|
|
208
|
+
placeholder: "All statuses",
|
|
209
|
+
ariaLabel: "Filter resources by status"
|
|
210
|
+
}
|
|
211
|
+
) }),
|
|
212
|
+
branches.length > 1 && /* @__PURE__ */ jsx(FilterField, { label: "Where", children: /* @__PURE__ */ jsx(
|
|
213
|
+
Select,
|
|
214
|
+
{
|
|
215
|
+
value: locationId,
|
|
216
|
+
onChange: setLocationId,
|
|
217
|
+
options: [
|
|
218
|
+
{ value: "", label: "All locations" },
|
|
219
|
+
...branches.map((location) => ({
|
|
220
|
+
value: location.id,
|
|
221
|
+
label: location.name
|
|
222
|
+
}))
|
|
223
|
+
],
|
|
224
|
+
placeholder: "All locations",
|
|
225
|
+
ariaLabel: "Filter resources by location"
|
|
226
|
+
}
|
|
227
|
+
) })
|
|
228
|
+
]
|
|
229
|
+
}
|
|
230
|
+
),
|
|
231
|
+
/* @__PURE__ */ jsx(
|
|
232
|
+
ListStates,
|
|
233
|
+
{
|
|
234
|
+
loading,
|
|
235
|
+
isEmpty: filtered.length === 0 && sections.length === 0,
|
|
236
|
+
error,
|
|
237
|
+
onRetry: refetch,
|
|
238
|
+
empty: (
|
|
239
|
+
/* Two different nothings. A group with no rows in it has never
|
|
240
|
+
been filled — offering to clear a filter that is not on is the
|
|
241
|
+
empty state answering a question nobody asked. */
|
|
242
|
+
narrowed ? /* @__PURE__ */ jsx(
|
|
243
|
+
TableEmptyState,
|
|
244
|
+
{
|
|
245
|
+
icon: SearchX,
|
|
246
|
+
title: `No ${pageTitle.toLowerCase()} match that`,
|
|
247
|
+
description: "Clear the search or the filters to see the rest."
|
|
248
|
+
}
|
|
249
|
+
) : /* @__PURE__ */ jsx(
|
|
250
|
+
TableEmptyState,
|
|
251
|
+
{
|
|
252
|
+
icon: Plus,
|
|
253
|
+
title: `No ${pageTitle.toLowerCase()} yet`,
|
|
254
|
+
description: group ? `Add the ${pageTitle.toLowerCase()} customers can book.` : "Add the things a booking takes up."
|
|
255
|
+
}
|
|
256
|
+
)
|
|
257
|
+
),
|
|
258
|
+
children: view === "grid" ? /* @__PURE__ */ jsx(
|
|
259
|
+
RosterGrid,
|
|
260
|
+
{
|
|
261
|
+
sections,
|
|
262
|
+
showHeadings: showBands,
|
|
263
|
+
usage,
|
|
264
|
+
hours,
|
|
265
|
+
blocks,
|
|
266
|
+
locations: branches,
|
|
267
|
+
onAddTo: setAddingTo,
|
|
268
|
+
onBlockTime: setBlockingFor,
|
|
269
|
+
onToggleStatus: (row) => setResourceStatus(
|
|
270
|
+
row.id,
|
|
271
|
+
row.status === "active" ? "inactive" : "active"
|
|
272
|
+
),
|
|
273
|
+
onDelete: handleDelete
|
|
274
|
+
}
|
|
275
|
+
) : /* @__PURE__ */ jsx(
|
|
276
|
+
WeekGrid,
|
|
277
|
+
{
|
|
278
|
+
sections,
|
|
279
|
+
showBands,
|
|
280
|
+
usage,
|
|
281
|
+
hours,
|
|
282
|
+
blocks,
|
|
283
|
+
weekStart,
|
|
284
|
+
showGroup: false,
|
|
285
|
+
locations: branches,
|
|
286
|
+
onAddTo: setAddingTo,
|
|
287
|
+
onRenameGroup: setEditingGroup,
|
|
288
|
+
onWeekChange: setWeekStart,
|
|
289
|
+
onEditDay: (row, date) => setEditingDay({ row, date })
|
|
290
|
+
}
|
|
291
|
+
)
|
|
292
|
+
}
|
|
293
|
+
)
|
|
294
|
+
] }) : null,
|
|
295
|
+
/* @__PURE__ */ jsxs(AnimatePresence, { children: [
|
|
296
|
+
addingTo && /* @__PURE__ */ jsx(
|
|
297
|
+
ResourceForm,
|
|
298
|
+
{
|
|
299
|
+
open: true,
|
|
300
|
+
category: addingTo,
|
|
301
|
+
categories,
|
|
302
|
+
onSave: async (data) => {
|
|
303
|
+
await createResource(data);
|
|
304
|
+
setAddingTo(null);
|
|
305
|
+
},
|
|
306
|
+
onClose: () => setAddingTo(null)
|
|
307
|
+
}
|
|
308
|
+
),
|
|
309
|
+
(addingGroup || editingGroup) && /* @__PURE__ */ jsx(
|
|
310
|
+
GroupDialog,
|
|
311
|
+
{
|
|
312
|
+
category: editingGroup,
|
|
313
|
+
intentKey,
|
|
314
|
+
saving,
|
|
315
|
+
onSave: async (data) => {
|
|
316
|
+
if (editingGroup) await updateGroup(editingGroup.id, data);
|
|
317
|
+
else await createGroup(data);
|
|
318
|
+
setAddingGroup(false);
|
|
319
|
+
setEditingGroup(null);
|
|
320
|
+
},
|
|
321
|
+
onDelete: editingGroup ? async (id) => {
|
|
322
|
+
await deleteGroup(id);
|
|
323
|
+
setEditingGroup(null);
|
|
324
|
+
if (groupId === id) setGroup("");
|
|
325
|
+
} : void 0,
|
|
326
|
+
onClose: () => {
|
|
327
|
+
setAddingGroup(false);
|
|
328
|
+
setEditingGroup(null);
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
editingGroup?.id ?? "new-group"
|
|
332
|
+
),
|
|
333
|
+
blockingFor && /* @__PURE__ */ jsx(
|
|
334
|
+
BlockTimeModal,
|
|
335
|
+
{
|
|
336
|
+
resources: rows,
|
|
337
|
+
defaultResourceId: blockingFor.id,
|
|
338
|
+
resourceLabel: resourceLabel.singular,
|
|
339
|
+
defaultDate: today,
|
|
340
|
+
byTheNight: availabilityWords(blockingFor.category?.kind).byTheNight,
|
|
341
|
+
saving,
|
|
342
|
+
error: blockError,
|
|
343
|
+
onBlock: handleBlock,
|
|
344
|
+
onClose: () => {
|
|
345
|
+
setBlockingFor(null);
|
|
346
|
+
setBlockError(null);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
),
|
|
350
|
+
editingDay && /* @__PURE__ */ jsx(
|
|
351
|
+
DayEditor,
|
|
352
|
+
{
|
|
353
|
+
row: editingDay.row,
|
|
354
|
+
date: editingDay.date,
|
|
355
|
+
hours,
|
|
356
|
+
blocks,
|
|
357
|
+
saving,
|
|
358
|
+
onSave: async (change) => {
|
|
359
|
+
if (change.schedule) {
|
|
360
|
+
await updateResource(editingDay.row.id, {
|
|
361
|
+
schedule: change.schedule
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
if (change.block) {
|
|
365
|
+
await blockTime({
|
|
366
|
+
resourceId: editingDay.row.id,
|
|
367
|
+
...change.block
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
if (change.unblock) {
|
|
371
|
+
await unblockTime(
|
|
372
|
+
editingDay.row.id,
|
|
373
|
+
change.unblock.date,
|
|
374
|
+
change.unblock.startTime
|
|
375
|
+
);
|
|
376
|
+
}
|
|
377
|
+
if (change.block || change.unblock) await refetchBlocks();
|
|
378
|
+
setEditingDay(null);
|
|
379
|
+
},
|
|
380
|
+
onClose: () => setEditingDay(null)
|
|
381
|
+
}
|
|
382
|
+
)
|
|
383
|
+
] })
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
export {
|
|
389
|
+
ResourcesPage as default
|
|
390
|
+
};
|
|
391
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/dashboard/%28bookings%29/resources/page.tsx"],"sourcesContent":["'use client';\n\nimport { FLAT_CONTROL, TOOLBAR_H } from '@withpotter/ui-kit/toolbar-parts';\nimport { AnimatePresence } from 'motion/react';\nimport { useState } from 'react';\nimport { useRouter } from 'next/navigation';\nimport { Plus, SearchX } from 'lucide-react';\nimport { useHoursData } from '@withpotter/hooks/use-hours-data';\nimport { useBusinessLocations } from '@withpotter/lib/use-business-locations';\nimport { useModuleLabel } from '@withpotter/lib/use-module-label';\nimport { useEntityLabel } from '@withpotter/lib/intents/use-entity-label';\nimport { useIntentConfig } from '@withpotter/lib/intents/use-intent-config';\nimport type { ResourcePreset } from './_lib/presets';\nimport { useRegisterRefresh } from '@withpotter/components/mobile/pull-to-refresh-context';\nimport type {\n CreateResourceInput,\n UpdateResourceInput,\n} from '@withpotter/lib/resource-types';\nimport { Button } from '@withpotter/ui-kit/button';\nimport { ListPage } from '@withpotter/ui-kit/list-page';\nimport { MobilePageHeader } from '@withpotter/components/mobile/mobile-page-header';\nimport { ListStates } from '@withpotter/ui-kit/list-states';\nimport { FilterBar } from '@withpotter/ui-kit/filter-bar';\nimport { FilterField } from '@withpotter/ui-kit/filter-menu';\nimport { Select } from '@withpotter/ui-kit/select';\nimport { TableEmptyState } from '@withpotter/ui-kit/table-empty-state';\nimport { useRoster, useRosterPage } from './_hooks';\nimport { availabilityWords } from './_lib/shapes';\nimport {\n BlockTimeModal,\n DayEditor,\n GroupDialog,\n ResourceForm,\n RosterEmpty,\n RosterGrid,\n WeekGrid,\n} from './_components';\n\nexport default function ResourcesPage() {\n const [emptyPickerOpen, setEmptyPickerOpen] = useState(false);\n const router = useRouter();\n const { hours } = useHoursData();\n const intentConfig = useIntentConfig();\n\n /**\n * The two words this page can be called. `rosterLabel` picks between them,\n * and it is the same ladder the sidebar row runs — so the title matches the\n * row that was pressed to get here. The page remains the neutral Resources\n * directory; categories are chosen inside the creation flow.\n */\n const resourceLabel = useEntityLabel('resource');\n const defaultTitle = useModuleLabel('resources', resourceLabel.plural);\n const genericTitle = useModuleLabel('resources', 'Resources');\n\n /**\n * Cached for five minutes and shared with the create form, so the roster\n * knowing about branches costs a request the app was already making.\n */\n const { locations, isMultiSite } = useBusinessLocations();\n const branches = isMultiSite ? locations : [];\n\n const roster = useRoster();\n const {\n categories,\n rows,\n usage,\n loading,\n error,\n saving,\n refetch,\n createGroup,\n updateGroup,\n deleteGroup,\n createResource,\n updateResource,\n setResourceStatus,\n blockTime,\n unblockTime,\n } = roster;\n useRegisterRefresh(refetch);\n\n const {\n pageTitle,\n groupId,\n group,\n setGroup,\n view,\n weekStart,\n setWeekStart,\n search,\n setSearch,\n status,\n setStatus,\n locationId,\n setLocationId,\n today,\n blocks,\n refetchBlocks,\n addingTo,\n setAddingTo,\n editingGroup,\n setEditingGroup,\n addingGroup,\n setAddingGroup,\n blockingFor,\n setBlockingFor,\n blockError,\n setBlockError,\n editingDay,\n setEditingDay,\n filtered,\n sections,\n isEmpty,\n narrowed,\n showBands,\n targetGroup,\n handleDelete,\n handleBlock,\n } = useRosterPage(roster, defaultTitle, genericTitle);\n\n const intentKey = intentConfig.all[0]?.key ?? null;\n const openCreateResource = () => {\n setEmptyPickerOpen(true);\n };\n\n return (\n <ListPage\n largeTitle\n title={pageTitle}\n breadcrumbs={\n group\n ? [\n { label: 'Resources', href: '/dashboard/resources' },\n { label: group.labelPlural },\n ]\n : undefined\n }\n mobileHeader={\n <MobilePageHeader\n title={pageTitle}\n action={{\n label: 'Create',\n icon: Plus,\n compact: true,\n onClick: openCreateResource,\n }}\n />\n }\n actions={\n <Button\n className={`${TOOLBAR_H} ${FLAT_CONTROL}`}\n aria-label=\"Create resource\"\n disabled={categories.length > 0 && !targetGroup}\n onClick={openCreateResource}\n >\n <Plus />\n Create\n </Button>\n }\n >\n <RosterEmpty\n resourceLabel={resourceLabel}\n saving={saving}\n showEmptyState={isEmpty && categories.length === 0}\n onCreateCategory={async (preset: ResourcePreset) => {\n const created = await createGroup({\n label: preset.singular,\n labelPlural: preset.plural,\n kind: preset.kind,\n });\n if (\n created &&\n typeof created === 'object' &&\n 'id' in created &&\n typeof created.id === 'string'\n ) {\n setEmptyPickerOpen(false);\n router.push(`/dashboard/resources?newGroup=${created.id}`);\n }\n }}\n pickerOpen={emptyPickerOpen}\n onPickerOpenChange={setEmptyPickerOpen}\n />\n\n {!loading && (categories.length > 0 || !isEmpty) ? (\n <div className=\"-mt-8 space-y-4 lg:mt-6\">\n <FilterBar\n toolbar\n search={search}\n onSearchChange={setSearch}\n placeholder={`Search ${pageTitle.toLowerCase()}`}\n activeCount={Number(!!groupId) + Number(!!status)}\n filterInsideSearch\n >\n {categories.length > 1 && (\n <FilterField label=\"Group\">\n <Select\n value={groupId}\n onChange={setGroup}\n options={[\n { value: '', label: 'All groups' },\n ...Array.from(\n new Map(\n categories\n .filter(\n (category) =>\n rows.some(\n (row) => row.categoryId === category.id,\n ) || category.id === groupId,\n )\n .map((category) => [\n category.labelPlural.toLowerCase(),\n {\n value: category.id,\n label: category.labelPlural,\n },\n ]),\n ).values(),\n ),\n ]}\n placeholder=\"All groups\"\n ariaLabel=\"Filter resources by group\"\n />\n </FilterField>\n )}\n <FilterField label=\"Status\">\n <Select\n value={status}\n onChange={setStatus}\n options={[\n { value: '', label: 'All statuses' },\n { value: 'active', label: 'Bookable' },\n { value: 'inactive', label: 'Off the board' },\n ]}\n placeholder=\"All statuses\"\n ariaLabel=\"Filter resources by status\"\n />\n </FilterField>\n {branches.length > 1 && (\n <FilterField label=\"Where\">\n <Select\n value={locationId}\n onChange={setLocationId}\n options={[\n { value: '', label: 'All locations' },\n ...branches.map((location) => ({\n value: location.id,\n label: location.name,\n })),\n ]}\n placeholder=\"All locations\"\n ariaLabel=\"Filter resources by location\"\n />\n </FilterField>\n )}\n </FilterBar>\n\n <ListStates\n loading={loading}\n isEmpty={filtered.length === 0 && sections.length === 0}\n error={error}\n onRetry={refetch}\n empty={\n /* Two different nothings. A group with no rows in it has never\n been filled — offering to clear a filter that is not on is the\n empty state answering a question nobody asked. */\n narrowed ? (\n <TableEmptyState\n icon={SearchX}\n title={`No ${pageTitle.toLowerCase()} match that`}\n description=\"Clear the search or the filters to see the rest.\"\n />\n ) : (\n <TableEmptyState\n icon={Plus}\n title={`No ${pageTitle.toLowerCase()} yet`}\n description={\n group\n ? `Add the ${pageTitle.toLowerCase()} customers can book.`\n : 'Add the things a booking takes up.'\n }\n />\n )\n }\n >\n {view === 'grid' ? (\n <RosterGrid\n sections={sections}\n showHeadings={showBands}\n usage={usage}\n hours={hours}\n blocks={blocks}\n locations={branches}\n onAddTo={setAddingTo}\n onBlockTime={setBlockingFor}\n onToggleStatus={(row) =>\n setResourceStatus(\n row.id,\n row.status === 'active' ? 'inactive' : 'active',\n )\n }\n onDelete={handleDelete}\n />\n ) : (\n <WeekGrid\n sections={sections}\n showBands={showBands}\n usage={usage}\n hours={hours}\n blocks={blocks}\n weekStart={weekStart}\n showGroup={false}\n locations={branches}\n onAddTo={setAddingTo}\n onRenameGroup={setEditingGroup}\n onWeekChange={setWeekStart}\n onEditDay={(row, date) => setEditingDay({ row, date })}\n />\n )}\n </ListStates>\n </div>\n ) : null}\n\n <AnimatePresence>\n {addingTo && (\n <ResourceForm\n open\n category={addingTo}\n categories={categories}\n onSave={async (data) => {\n await createResource(data as unknown as CreateResourceInput);\n // The form does not close itself; it never had to, because the\n // screen it used to live on unmounted it on save.\n setAddingTo(null);\n }}\n onClose={() => setAddingTo(null)}\n />\n )}\n\n {(addingGroup || editingGroup) && (\n <GroupDialog\n key={editingGroup?.id ?? 'new-group'}\n category={editingGroup}\n intentKey={intentKey}\n saving={saving}\n onSave={async (data) => {\n if (editingGroup) await updateGroup(editingGroup.id, data);\n else await createGroup(data);\n setAddingGroup(false);\n setEditingGroup(null);\n }}\n onDelete={\n editingGroup\n ? async (id) => {\n await deleteGroup(id);\n setEditingGroup(null);\n if (groupId === id) setGroup('');\n }\n : undefined\n }\n onClose={() => {\n setAddingGroup(false);\n setEditingGroup(null);\n }}\n />\n )}\n\n {blockingFor && (\n <BlockTimeModal\n resources={rows}\n defaultResourceId={blockingFor.id}\n resourceLabel={resourceLabel.singular}\n defaultDate={today}\n byTheNight={\n availabilityWords(blockingFor.category?.kind).byTheNight\n }\n saving={saving}\n error={blockError}\n onBlock={handleBlock}\n onClose={() => {\n setBlockingFor(null);\n setBlockError(null);\n }}\n />\n )}\n\n {editingDay && (\n <DayEditor\n row={editingDay.row}\n date={editingDay.date}\n hours={hours}\n blocks={blocks}\n saving={saving}\n onSave={async (change) => {\n if (change.schedule) {\n await updateResource(editingDay.row.id, {\n schedule: change.schedule,\n } as UpdateResourceInput);\n }\n if (change.block) {\n await blockTime({\n resourceId: editingDay.row.id,\n ...change.block,\n });\n }\n if (change.unblock) {\n await unblockTime(\n editingDay.row.id,\n change.unblock.date,\n change.unblock.startTime,\n );\n }\n if (change.block || change.unblock) await refetchBlocks();\n setEditingDay(null);\n }}\n onClose={() => setEditingDay(null)}\n />\n )}\n </AnimatePresence>\n </ListPage>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/dashboard/%28bookings%29/schedule/page.tsx"],"sourcesContent":["import { redirect } from 'next/navigation';\n\n/**\n * Schedule was a mobile-only week view over the calendar events.\n *\n * The bookings calendar now carries its own Day/Week/Month/Year switch over the\n * same records, so this was a second read-only window on data the merchant can\n * already act on. This route keeps working for old links and bookmarks.\n */\nexport default function SchedulePage() {\n redirect('/dashboard/bookings?view=calendar');\n}\n"],"mappings":"AAAA,SAAS,gBAAgB;AASV,SAAR,eAAgC;AACrC,WAAS,mCAAmC;AAC9C;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useRouter } from "next/navigation";
|
|
4
|
+
function TodayRedirect() {
|
|
5
|
+
const router = useRouter();
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
router.replace("/dashboard/bookings?view=today");
|
|
8
|
+
}, [router]);
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
TodayRedirect as default
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/dashboard/%28bookings%29/today/page.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport { useRouter } from 'next/navigation';\n\n/**\n * Today is a view of Appointments now, not a screen beside it.\n *\n * The two drew the same picture — resources across, the day down — and only\n * the desk board could act on it: the calendar view creates in a gap and opens\n * a detail, and cannot check anybody in. One surface, three views, and this\n * route keeps every link, bookmark and staff-home redirect that already points\n * here working.\n */\nexport default function TodayRedirect() {\n const router = useRouter();\n\n useEffect(() => {\n router.replace('/dashboard/bookings?view=today');\n }, [router]);\n\n return null;\n}\n"],"mappings":";AAEA,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAWX,SAAR,gBAAiC;AACtC,QAAM,SAAS,UAAU;AAEzB,YAAU,MAAM;AACd,WAAO,QAAQ,gCAAgC;AAAA,EACjD,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;","names":[]}
|