@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,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ShieldCheck } from "lucide-react";
|
|
4
|
+
import { Button } from "@withpotter/ui-kit/button";
|
|
5
|
+
import { EmptyNote } from "@withpotter/ui-kit";
|
|
6
|
+
const COPY = {
|
|
7
|
+
due: {
|
|
8
|
+
label: "Due",
|
|
9
|
+
note: "Charged with the booking. It becomes held once the money lands."
|
|
10
|
+
},
|
|
11
|
+
held: {
|
|
12
|
+
label: "Held",
|
|
13
|
+
note: "The guest's money, held by you until checkout."
|
|
14
|
+
},
|
|
15
|
+
released: {
|
|
16
|
+
label: "Released",
|
|
17
|
+
note: "Returned to the guest."
|
|
18
|
+
},
|
|
19
|
+
forfeited: {
|
|
20
|
+
label: "Kept",
|
|
21
|
+
note: "Kept against damage."
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const TONE = {
|
|
25
|
+
due: "bg-[var(--warning-bg)] text-[var(--warning)]",
|
|
26
|
+
held: "bg-[var(--accent-secondary)] text-[var(--text-primary)]",
|
|
27
|
+
released: "bg-[var(--success-bg)] text-[var(--success)]",
|
|
28
|
+
forfeited: "bg-[var(--error-bg)] text-[var(--error)]"
|
|
29
|
+
};
|
|
30
|
+
function SecurityDepositCard({
|
|
31
|
+
amount,
|
|
32
|
+
status,
|
|
33
|
+
formatCurrency,
|
|
34
|
+
onSettle
|
|
35
|
+
}) {
|
|
36
|
+
const copy = COPY[status];
|
|
37
|
+
const settled = status === "released" || status === "forfeited";
|
|
38
|
+
return /* @__PURE__ */ jsxs("div", { className: "p-4", children: [
|
|
39
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
40
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(ShieldCheck, { className: "text-[var(--text-tertiary)]" }),
|
|
43
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--text-secondary)]", children: "Security deposit" })
|
|
44
|
+
] }),
|
|
45
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-lg font-semibold text-[var(--text-primary)]", children: formatCurrency(amount) }),
|
|
46
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-[var(--text-tertiary)]", children: copy.note })
|
|
47
|
+
] }),
|
|
48
|
+
/* @__PURE__ */ jsx(
|
|
49
|
+
"span",
|
|
50
|
+
{
|
|
51
|
+
className: `shrink-0 rounded-full px-2 py-0.5 text-xs font-medium ${TONE[status]}`,
|
|
52
|
+
children: copy.label
|
|
53
|
+
}
|
|
54
|
+
)
|
|
55
|
+
] }),
|
|
56
|
+
status === "held" && onSettle && /* @__PURE__ */ jsx(Button, { variant: "secondary", className: "mt-3 w-full", onClick: onSettle, children: "Settle deposit" }),
|
|
57
|
+
settled && /* @__PURE__ */ jsx(EmptyNote, { className: "mt-3", children: "Nothing further to do." })
|
|
58
|
+
] });
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
SecurityDepositCard
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=security-deposit-card.js.map
|
package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/security-deposit-card.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/dashboard/%28bookings%29/bookings/%5BbookingId%5D/_components/security-deposit-card.tsx"],"sourcesContent":["'use client';\n\nimport { ShieldCheck } from 'lucide-react';\nimport type { DepositStatus } from '@withpotter/lib/api/types';\nimport { Button } from '@withpotter/ui-kit/button';\nimport { EmptyNote } from '@withpotter/ui-kit';\n\ninterface SecurityDepositCardProps {\n amount: number;\n status: DepositStatus;\n formatCurrency: (n: number) => string;\n /** Opens the settle dialog. Absent while the deposit is still uncollected,\n * since there is nothing yet to give back. */\n onSettle?: () => void;\n}\n\nconst COPY: Record<DepositStatus, { label: string; note: string }> = {\n due: {\n label: 'Due',\n note: 'Charged with the booking. It becomes held once the money lands.',\n },\n held: {\n label: 'Held',\n note: \"The guest's money, held by you until checkout.\",\n },\n released: {\n label: 'Released',\n note: 'Returned to the guest.',\n },\n forfeited: {\n label: 'Kept',\n note: 'Kept against damage.',\n },\n};\n\nconst TONE: Record<DepositStatus, string> = {\n due: 'bg-[var(--warning-bg)] text-[var(--warning)]',\n held: 'bg-[var(--accent-secondary)] text-[var(--text-primary)]',\n released: 'bg-[var(--success-bg)] text-[var(--success)]',\n forfeited: 'bg-[var(--error-bg)] text-[var(--error)]',\n};\n\n/**\n * The refundable deposit, kept visibly apart from what the booking earned.\n *\n * Rolled in with the total it would read as takings, and the one question that\n * matters at checkout — how much of this is still the guest's — would have no\n * answer on the screen. Applies to anything let out: a short-let, a vacation\n * rental, a hall.\n */\nexport function SecurityDepositCard({\n amount,\n status,\n formatCurrency,\n onSettle,\n}: SecurityDepositCardProps) {\n const copy = COPY[status];\n const settled = status === 'released' || status === 'forfeited';\n\n return (\n <div className=\"p-4\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <ShieldCheck className=\"text-[var(--text-tertiary)]\" />\n <span className=\"text-sm text-[var(--text-secondary)]\">\n Security deposit\n </span>\n </div>\n <p className=\"mt-2 text-lg font-semibold text-[var(--text-primary)]\">\n {formatCurrency(amount)}\n </p>\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\n {copy.note}\n </p>\n </div>\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-xs font-medium ${TONE[status]}`}\n >\n {copy.label}\n </span>\n </div>\n\n {status === 'held' && onSettle && (\n <Button variant=\"secondary\" className=\"mt-3 w-full\" onClick={onSettle}>\n Settle deposit\n </Button>\n )}\n\n {settled && (\n <EmptyNote className=\"mt-3\">Nothing further to do.</EmptyNote>\n )}\n </div>\n );\n}\n"],"mappings":";AA+DU,SACE,KADF;AA7DV,SAAS,mBAAmB;AAE5B,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAW1B,MAAM,OAA+D;AAAA,EACnE,KAAK;AAAA,IACH,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;AAEA,MAAM,OAAsC;AAAA,EAC1C,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AACb;AAUO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,OAAO,KAAK,MAAM;AACxB,QAAM,UAAU,WAAW,cAAc,WAAW;AAEpD,SACE,qBAAC,SAAI,WAAU,OACb;AAAA,yBAAC,SAAI,WAAU,0CACb;AAAA,2BAAC,SAAI,WAAU,WACb;AAAA,6BAAC,SAAI,WAAU,2BACb;AAAA,8BAAC,eAAY,WAAU,+BAA8B;AAAA,UACrD,oBAAC,UAAK,WAAU,wCAAuC,8BAEvD;AAAA,WACF;AAAA,QACA,oBAAC,OAAE,WAAU,yDACV,yBAAe,MAAM,GACxB;AAAA,QACA,oBAAC,OAAE,WAAU,4CACV,eAAK,MACR;AAAA,SACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,yDAAyD,KAAK,MAAM,CAAC;AAAA,UAE/E,eAAK;AAAA;AAAA,MACR;AAAA,OACF;AAAA,IAEC,WAAW,UAAU,YACpB,oBAAC,UAAO,SAAQ,aAAY,WAAU,eAAc,SAAS,UAAU,4BAEvE;AAAA,IAGD,WACC,oBAAC,aAAU,WAAU,QAAO,oCAAsB;AAAA,KAEtD;AAEJ;","names":[]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { RefreshCw, ShieldCheck } from "lucide-react";
|
|
5
|
+
import {
|
|
6
|
+
Dialog,
|
|
7
|
+
DialogContent,
|
|
8
|
+
DialogHeader,
|
|
9
|
+
DialogTitle,
|
|
10
|
+
DialogDescription,
|
|
11
|
+
DialogFooter
|
|
12
|
+
} from "@withpotter/ui-kit/dialog";
|
|
13
|
+
import { Button } from "@withpotter/ui-kit/button";
|
|
14
|
+
import { Input, ErrorBanner } from "@withpotter/ui-kit";
|
|
15
|
+
function SettleDepositModal({
|
|
16
|
+
bookingNumber,
|
|
17
|
+
deposit,
|
|
18
|
+
formatCurrency,
|
|
19
|
+
settling,
|
|
20
|
+
error,
|
|
21
|
+
onSettle,
|
|
22
|
+
onClose
|
|
23
|
+
}) {
|
|
24
|
+
const [action, setAction] = useState("release");
|
|
25
|
+
const [amount, setAmount] = useState(String(deposit));
|
|
26
|
+
const [reason, setReason] = useState("");
|
|
27
|
+
const numericAmount = Number(amount);
|
|
28
|
+
const releasing = action === "release";
|
|
29
|
+
const kept = releasing ? Math.max(0, deposit - numericAmount) : deposit;
|
|
30
|
+
const canSubmit = !settling && (releasing ? numericAmount > 0 && numericAmount <= deposit : reason.trim().length > 0);
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
Dialog,
|
|
33
|
+
{
|
|
34
|
+
open: true,
|
|
35
|
+
onOpenChange: (o) => {
|
|
36
|
+
if (!o) onClose();
|
|
37
|
+
},
|
|
38
|
+
children: /* @__PURE__ */ jsxs(DialogContent, { className: "max-w-md", children: [
|
|
39
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
40
|
+
/* @__PURE__ */ jsxs(DialogTitle, { className: "flex items-center gap-2", children: [
|
|
41
|
+
/* @__PURE__ */ jsx(ShieldCheck, { className: "size-5 text-[var(--text-tertiary)]" }),
|
|
42
|
+
"Settle deposit"
|
|
43
|
+
] }),
|
|
44
|
+
/* @__PURE__ */ jsxs(DialogDescription, { children: [
|
|
45
|
+
formatCurrency(deposit),
|
|
46
|
+
" held on #",
|
|
47
|
+
bookingNumber,
|
|
48
|
+
"."
|
|
49
|
+
] })
|
|
50
|
+
] }),
|
|
51
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
52
|
+
error && /* @__PURE__ */ jsx(ErrorBanner, { children: error }),
|
|
53
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
54
|
+
["release", "Give it back"],
|
|
55
|
+
["forfeit", "Keep it"]
|
|
56
|
+
].map(([value, label]) => /* @__PURE__ */ jsx(
|
|
57
|
+
"button",
|
|
58
|
+
{
|
|
59
|
+
type: "button",
|
|
60
|
+
onClick: () => {
|
|
61
|
+
setAction(value);
|
|
62
|
+
if (value === "release") setAmount(String(deposit));
|
|
63
|
+
},
|
|
64
|
+
className: `rounded-lg border px-3 py-2 text-sm font-medium transition-colors ${action === value ? "border-brand-500/40 bg-[var(--accent-secondary)] text-[var(--text-primary)]" : "border-[var(--border-default)] bg-[var(--bg-base)] text-[var(--text-secondary)] hover:bg-[var(--interactive-hover)]"}`,
|
|
65
|
+
children: label
|
|
66
|
+
},
|
|
67
|
+
value
|
|
68
|
+
)) }),
|
|
69
|
+
releasing && /* @__PURE__ */ jsxs("div", { children: [
|
|
70
|
+
/* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-medium text-[var(--text-tertiary)]", children: "Amount to return" }),
|
|
71
|
+
/* @__PURE__ */ jsx(
|
|
72
|
+
Input,
|
|
73
|
+
{
|
|
74
|
+
type: "number",
|
|
75
|
+
inputMode: "decimal",
|
|
76
|
+
min: 0,
|
|
77
|
+
max: deposit,
|
|
78
|
+
value: amount,
|
|
79
|
+
onChange: (e) => setAmount(e.target.value)
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
numericAmount > deposit && /* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-[var(--error)]", children: [
|
|
83
|
+
"Can\u2019t exceed the ",
|
|
84
|
+
formatCurrency(deposit),
|
|
85
|
+
" collected."
|
|
86
|
+
] }),
|
|
87
|
+
kept > 0 && numericAmount <= deposit && /* @__PURE__ */ jsxs("p", { className: "mt-1 text-xs text-[var(--text-tertiary)]", children: [
|
|
88
|
+
"You keep ",
|
|
89
|
+
formatCurrency(kept),
|
|
90
|
+
"."
|
|
91
|
+
] })
|
|
92
|
+
] }),
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
94
|
+
/* @__PURE__ */ jsx("label", { className: "mb-1 block text-xs font-medium text-[var(--text-tertiary)]", children: releasing && kept === 0 ? "Note (optional)" : "Reason" }),
|
|
95
|
+
/* @__PURE__ */ jsx(
|
|
96
|
+
Input,
|
|
97
|
+
{
|
|
98
|
+
value: reason,
|
|
99
|
+
onChange: (e) => setReason(e.target.value),
|
|
100
|
+
placeholder: "e.g. replaced the broken kettle"
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
!releasing && reason.trim().length === 0 && /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-[var(--text-tertiary)]", children: "Keeping a deposit needs a reason on the record." })
|
|
104
|
+
] })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
"button",
|
|
109
|
+
{
|
|
110
|
+
type: "button",
|
|
111
|
+
onClick: onClose,
|
|
112
|
+
className: "px-4 py-2 text-sm font-medium text-[var(--text-secondary)] hover:text-[var(--text-primary)]",
|
|
113
|
+
children: "Cancel"
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
Button,
|
|
118
|
+
{
|
|
119
|
+
variant: "ghost",
|
|
120
|
+
className: "text-[var(--bg-base)] hover:opacity-90",
|
|
121
|
+
onClick: () => onSettle({
|
|
122
|
+
action,
|
|
123
|
+
amount: releasing ? numericAmount : void 0,
|
|
124
|
+
reason: reason.trim() || void 0
|
|
125
|
+
}),
|
|
126
|
+
disabled: !canSubmit,
|
|
127
|
+
children: settling ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
128
|
+
/* @__PURE__ */ jsx(RefreshCw, { className: "size-4 animate-spin" }),
|
|
129
|
+
"Settling..."
|
|
130
|
+
] }) : releasing ? "Return deposit" : "Keep deposit"
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
] })
|
|
134
|
+
] })
|
|
135
|
+
}
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
SettleDepositModal
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=settle-deposit-modal.js.map
|
package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/settle-deposit-modal.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/dashboard/%28bookings%29/bookings/%5BbookingId%5D/_components/settle-deposit-modal.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { RefreshCw, ShieldCheck } from 'lucide-react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n DialogFooter,\n} from '@withpotter/ui-kit/dialog';\nimport { Button } from '@withpotter/ui-kit/button';\nimport { Input, ErrorBanner } from '@withpotter/ui-kit';\n\ninterface SettleDepositModalProps {\n bookingNumber: string;\n /** The deposit that was collected. The most anyone can give back or keep. */\n deposit: number;\n formatCurrency: (n: number) => string;\n settling: boolean;\n error?: string | null;\n onSettle: (data: {\n action: 'release' | 'forfeit';\n amount?: number;\n reason?: string;\n }) => void;\n onClose: () => void;\n}\n\n/**\n * Checkout, as one decision rather than two.\n *\n * Giving the whole deposit back and keeping all of it are the ends of the same\n * dial, and the useful case sits between them: the guest broke one thing, so\n * some is kept and the rest goes home. Releasing part of the deposit does both\n * in one action, which is how an owner actually thinks about it.\n */\nexport function SettleDepositModal({\n bookingNumber,\n deposit,\n formatCurrency,\n settling,\n error,\n onSettle,\n onClose,\n}: SettleDepositModalProps) {\n const [action, setAction] = useState<'release' | 'forfeit'>('release');\n const [amount, setAmount] = useState(String(deposit));\n const [reason, setReason] = useState('');\n\n const numericAmount = Number(amount);\n const releasing = action === 'release';\n const kept = releasing ? Math.max(0, deposit - numericAmount) : deposit;\n\n const canSubmit =\n !settling &&\n (releasing\n ? numericAmount > 0 && numericAmount <= deposit\n : reason.trim().length > 0);\n\n return (\n <Dialog\n open\n onOpenChange={(o) => {\n if (!o) onClose();\n }}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle className=\"flex items-center gap-2\">\n <ShieldCheck className=\"size-5 text-[var(--text-tertiary)]\" />\n Settle deposit\n </DialogTitle>\n <DialogDescription>\n {formatCurrency(deposit)} held on #{bookingNumber}.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n {error && <ErrorBanner>{error}</ErrorBanner>}\n\n <div className=\"grid grid-cols-2 gap-2\">\n {(\n [\n ['release', 'Give it back'],\n ['forfeit', 'Keep it'],\n ] as const\n ).map(([value, label]) => (\n <button\n key={value}\n type=\"button\"\n onClick={() => {\n setAction(value);\n if (value === 'release') setAmount(String(deposit));\n }}\n className={`rounded-lg border px-3 py-2 text-sm font-medium transition-colors ${\n action === value\n ? 'border-brand-500/40 bg-[var(--accent-secondary)] text-[var(--text-primary)]'\n : 'border-[var(--border-default)] bg-[var(--bg-base)] text-[var(--text-secondary)] hover:bg-[var(--interactive-hover)]'\n }`}\n >\n {label}\n </button>\n ))}\n </div>\n\n {releasing && (\n <div>\n <label className=\"mb-1 block text-xs font-medium text-[var(--text-tertiary)]\">\n Amount to return\n </label>\n <Input\n type=\"number\"\n inputMode=\"decimal\"\n min={0}\n max={deposit}\n value={amount}\n onChange={(e) => setAmount(e.target.value)}\n />\n {numericAmount > deposit && (\n <p className=\"mt-1 text-xs text-[var(--error)]\">\n Can’t exceed the {formatCurrency(deposit)} collected.\n </p>\n )}\n {kept > 0 && numericAmount <= deposit && (\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\n You keep {formatCurrency(kept)}.\n </p>\n )}\n </div>\n )}\n\n <div>\n <label className=\"mb-1 block text-xs font-medium text-[var(--text-tertiary)]\">\n {releasing && kept === 0 ? 'Note (optional)' : 'Reason'}\n </label>\n <Input\n value={reason}\n onChange={(e) => setReason(e.target.value)}\n placeholder=\"e.g. replaced the broken kettle\"\n />\n {!releasing && reason.trim().length === 0 && (\n <p className=\"mt-1 text-xs text-[var(--text-tertiary)]\">\n Keeping a deposit needs a reason on the record.\n </p>\n )}\n </div>\n </div>\n\n <DialogFooter>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-4 py-2 text-sm font-medium text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n >\n Cancel\n </button>\n <Button\n variant=\"ghost\"\n className=\"text-[var(--bg-base)] hover:opacity-90\"\n onClick={() =>\n onSettle({\n action,\n amount: releasing ? numericAmount : undefined,\n reason: reason.trim() || undefined,\n })\n }\n disabled={!canSubmit}\n >\n {settling ? (\n <>\n <RefreshCw className=\"size-4 animate-spin\" />\n Settling...\n </>\n ) : releasing ? (\n 'Return deposit'\n ) : (\n 'Keep deposit'\n )}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";AAsEU,SAqGI,UApGF,KADF;AApEV,SAAS,gBAAgB;AACzB,SAAS,WAAW,mBAAmB;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AACvB,SAAS,OAAO,mBAAmB;AAyB5B,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAgC,SAAS;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,OAAO,OAAO,CAAC;AACpD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AAEvC,QAAM,gBAAgB,OAAO,MAAM;AACnC,QAAM,YAAY,WAAW;AAC7B,QAAM,OAAO,YAAY,KAAK,IAAI,GAAG,UAAU,aAAa,IAAI;AAEhE,QAAM,YACJ,CAAC,aACA,YACG,gBAAgB,KAAK,iBAAiB,UACtC,OAAO,KAAK,EAAE,SAAS;AAE7B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAI;AAAA,MACJ,cAAc,CAAC,MAAM;AACnB,YAAI,CAAC,EAAG,SAAQ;AAAA,MAClB;AAAA,MAEA,+BAAC,iBAAc,WAAU,YACvB;AAAA,6BAAC,gBACC;AAAA,+BAAC,eAAY,WAAU,2BACrB;AAAA,gCAAC,eAAY,WAAU,sCAAqC;AAAA,YAAE;AAAA,aAEhE;AAAA,UACA,qBAAC,qBACE;AAAA,2BAAe,OAAO;AAAA,YAAE;AAAA,YAAW;AAAA,YAAc;AAAA,aACpD;AAAA,WACF;AAAA,QAEA,qBAAC,SAAI,WAAU,aACZ;AAAA,mBAAS,oBAAC,eAAa,iBAAM;AAAA,UAE9B,oBAAC,SAAI,WAAU,0BAEX;AAAA,YACE,CAAC,WAAW,cAAc;AAAA,YAC1B,CAAC,WAAW,SAAS;AAAA,UACvB,EACA,IAAI,CAAC,CAAC,OAAO,KAAK,MAClB;AAAA,YAAC;AAAA;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM;AACb,0BAAU,KAAK;AACf,oBAAI,UAAU,UAAW,WAAU,OAAO,OAAO,CAAC;AAAA,cACpD;AAAA,cACA,WAAW,qEACT,WAAW,QACP,gFACA,qHACN;AAAA,cAEC;AAAA;AAAA,YAZI;AAAA,UAaP,CACD,GACH;AAAA,UAEC,aACC,qBAAC,SACC;AAAA,gCAAC,WAAM,WAAU,8DAA6D,8BAE9E;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,KAAK;AAAA,gBACL,KAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA;AAAA,YAC3C;AAAA,YACC,gBAAgB,WACf,qBAAC,OAAE,WAAU,oCAAmC;AAAA;AAAA,cAC5B,eAAe,OAAO;AAAA,cAAE;AAAA,eAC5C;AAAA,YAED,OAAO,KAAK,iBAAiB,WAC5B,qBAAC,OAAE,WAAU,4CAA2C;AAAA;AAAA,cAC5C,eAAe,IAAI;AAAA,cAAE;AAAA,eACjC;AAAA,aAEJ;AAAA,UAGF,qBAAC,SACC;AAAA,gCAAC,WAAM,WAAU,8DACd,uBAAa,SAAS,IAAI,oBAAoB,UACjD;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,gBACzC,aAAY;AAAA;AAAA,YACd;AAAA,YACC,CAAC,aAAa,OAAO,KAAK,EAAE,WAAW,KACtC,oBAAC,OAAE,WAAU,4CAA2C,6DAExD;AAAA,aAEJ;AAAA,WACF;AAAA,QAEA,qBAAC,gBACC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cACX;AAAA;AAAA,UAED;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS,MACP,SAAS;AAAA,gBACP;AAAA,gBACA,QAAQ,YAAY,gBAAgB;AAAA,gBACpC,QAAQ,OAAO,KAAK,KAAK;AAAA,cAC3B,CAAC;AAAA,cAEH,UAAU,CAAC;AAAA,cAEV,qBACC,iCACE;AAAA,oCAAC,aAAU,WAAU,uBAAsB;AAAA,gBAAE;AAAA,iBAE/C,IACE,YACF,mBAEA;AAAA;AAAA,UAEJ;AAAA,WACF;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import Link from "next/link";
|
|
3
|
+
import { bookingsApi } from "@withpotter/lib/api/bookings";
|
|
4
|
+
import { buildCustomerTicketPath } from "@withpotter/lib/ticket-access";
|
|
5
|
+
function TicketRowActions({
|
|
6
|
+
tenantSlug,
|
|
7
|
+
bookingId,
|
|
8
|
+
ticketId,
|
|
9
|
+
ticketCode,
|
|
10
|
+
className = ""
|
|
11
|
+
}) {
|
|
12
|
+
if (!tenantSlug || !ticketId && !ticketCode) return null;
|
|
13
|
+
return /* @__PURE__ */ jsxs(
|
|
14
|
+
"div",
|
|
15
|
+
{
|
|
16
|
+
className: `flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-[var(--text-secondary)] ${className}`.trim(),
|
|
17
|
+
children: [
|
|
18
|
+
ticketCode && /* @__PURE__ */ jsx(
|
|
19
|
+
Link,
|
|
20
|
+
{
|
|
21
|
+
href: buildCustomerTicketPath(tenantSlug, ticketCode),
|
|
22
|
+
target: "_blank",
|
|
23
|
+
rel: "noreferrer",
|
|
24
|
+
className: "font-medium transition-colors hover:text-[var(--text-primary)]",
|
|
25
|
+
children: "Open ticket"
|
|
26
|
+
}
|
|
27
|
+
),
|
|
28
|
+
ticketId && /* @__PURE__ */ jsx(
|
|
29
|
+
"a",
|
|
30
|
+
{
|
|
31
|
+
href: bookingsApi.getSingleTicketPdfUrl(
|
|
32
|
+
tenantSlug,
|
|
33
|
+
bookingId,
|
|
34
|
+
ticketId
|
|
35
|
+
),
|
|
36
|
+
target: "_blank",
|
|
37
|
+
rel: "noreferrer",
|
|
38
|
+
className: "font-medium transition-colors hover:text-[var(--text-primary)]",
|
|
39
|
+
children: "PDF"
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
TicketRowActions
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=ticket-row-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/dashboard/%28bookings%29/bookings/%5BbookingId%5D/_components/ticket-row-actions.tsx"],"sourcesContent":["import Link from 'next/link';\nimport { bookingsApi } from '@withpotter/lib/api/bookings';\nimport { buildCustomerTicketPath } from '@withpotter/lib/ticket-access';\n\nexport function TicketRowActions({\n tenantSlug,\n bookingId,\n ticketId,\n ticketCode,\n className = '',\n}: {\n tenantSlug?: string;\n bookingId: string;\n ticketId?: string;\n ticketCode?: string | null;\n className?: string;\n}) {\n if (!tenantSlug || (!ticketId && !ticketCode)) return null;\n\n return (\n <div\n className={`flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-[var(--text-secondary)] ${className}`.trim()}\n >\n {ticketCode && (\n <Link\n href={buildCustomerTicketPath(tenantSlug, ticketCode)}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium transition-colors hover:text-[var(--text-primary)]\"\n >\n Open ticket\n </Link>\n )}\n {ticketId && (\n <a\n href={bookingsApi.getSingleTicketPdfUrl(\n tenantSlug,\n bookingId,\n ticketId,\n )}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-medium transition-colors hover:text-[var(--text-primary)]\"\n >\n PDF\n </a>\n )}\n </div>\n );\n}\n"],"mappings":"AAoBI,SAII,KAJJ;AApBJ,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAC5B,SAAS,+BAA+B;AAEjC,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,GAMG;AACD,MAAI,CAAC,cAAe,CAAC,YAAY,CAAC,WAAa,QAAO;AAEtD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,oFAAoF,SAAS,GAAG,KAAK;AAAA,MAE/G;AAAA,sBACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,wBAAwB,YAAY,UAAU;AAAA,YACpD,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA,QAED,YACC;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,YAAY;AAAA,cAChB;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,QAAO;AAAA,YACP,KAAI;AAAA,YACJ,WAAU;AAAA,YACX;AAAA;AAAA,QAED;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { motion, AnimatePresence, useReducedMotion } from "motion/react";
|
|
4
|
+
import { Users } from "lucide-react";
|
|
5
|
+
import { useApiQuery } from "@withpotter/hooks/use-api-query";
|
|
6
|
+
import { waitlistApi } from "@withpotter/lib/api/waitlist";
|
|
7
|
+
import { springs } from "@withpotter/lib/motion";
|
|
8
|
+
function WaitingQueueNotice({
|
|
9
|
+
date,
|
|
10
|
+
resourceId
|
|
11
|
+
}) {
|
|
12
|
+
const reduce = useReducedMotion();
|
|
13
|
+
const { data } = useApiQuery(
|
|
14
|
+
["waitlist-queue", date, resourceId],
|
|
15
|
+
(slug) => waitlistApi.queue(slug, date, resourceId),
|
|
16
|
+
{ enabled: Boolean(date) }
|
|
17
|
+
);
|
|
18
|
+
const queue = Array.isArray(data) ? data : data?.data ?? [];
|
|
19
|
+
const waiting = queue.filter((e) => e.status === "waiting");
|
|
20
|
+
const next = waiting[0];
|
|
21
|
+
return /* @__PURE__ */ jsx(AnimatePresence, { children: waiting.length > 0 && /* @__PURE__ */ jsxs(
|
|
22
|
+
motion.div,
|
|
23
|
+
{
|
|
24
|
+
initial: reduce ? false : { opacity: 0, y: -6 },
|
|
25
|
+
animate: { opacity: 1, y: 0 },
|
|
26
|
+
exit: reduce ? void 0 : { opacity: 0, y: -6 },
|
|
27
|
+
transition: springs.gentle,
|
|
28
|
+
className: "flex items-start gap-3 rounded-lg border border-[var(--info)]/20 bg-[var(--info-bg)] p-3",
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsx(Users, { className: "mt-0.5 h-[15px] w-[15px] flex-shrink-0 text-[var(--info)]" }),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm leading-relaxed text-[var(--info)]", children: [
|
|
32
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: waiting.length === 1 ? "1 person is waiting for this day" : `${waiting.length} people are waiting for this day` }),
|
|
33
|
+
/* @__PURE__ */ jsx("p", { className: "mt-0.5 opacity-90", children: next?.customerName || next?.customerEmail ? `${next.customerName || next.customerEmail} is next in line and will be offered this slot automatically, with two hours to respond.` : "The next person in line will be offered this slot automatically, with two hours to respond." })
|
|
34
|
+
] })
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
) });
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
WaitingQueueNotice
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=waiting-queue-notice.js.map
|
package/dist/dashboard/(bookings)/bookings/[bookingId]/_components/waiting-queue-notice.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/dashboard/%28bookings%29/bookings/%5BbookingId%5D/_components/waiting-queue-notice.tsx"],"sourcesContent":["'use client';\n\nimport { motion, AnimatePresence, useReducedMotion } from 'motion/react';\nimport { Users } from 'lucide-react';\nimport { useApiQuery } from '@withpotter/hooks/use-api-query';\nimport type { WaitlistItem } from '@withpotter/lib/api/types';\nimport { waitlistApi } from '@withpotter/lib/api/waitlist';\nimport { springs } from '@withpotter/lib/motion';\n\n/**\n * \"Cancelling this frees the slot for Chidi, who is next in line.\"\n *\n * potter-api already closes this loop on its own: `booking.cancelled` fires,\n * waitlist-cancellation.listener finds the next person waiting for that date\n * and resource, and offers them the slot with a two-hour window. All of that\n * was invisible. Staff pressed cancel and saw nothing, so the one mechanism\n * that turns a cancellation back into revenue may as well not have existed.\n *\n * Shown before the cancel is confirmed, because it changes how the decision\n * feels: giving a slot away is easier when you can see who catches it.\n */\nexport function WaitingQueueNotice({\n date,\n resourceId,\n}: {\n /** yyyy-mm-dd of the booking being cancelled. */\n date?: string;\n resourceId?: string;\n}) {\n const reduce = useReducedMotion();\n\n const { data } = useApiQuery(\n ['waitlist-queue', date, resourceId],\n (slug) => waitlistApi.queue(slug, date!, resourceId),\n { enabled: Boolean(date) },\n );\n\n // The controller returns either a bare array or a { data } envelope\n // depending on the usecase; accept both rather than guess.\n const queue: WaitlistItem[] = Array.isArray(data) ? data : (data?.data ?? []);\n const waiting = queue.filter((e) => e.status === 'waiting');\n const next = waiting[0];\n\n return (\n <AnimatePresence>\n {waiting.length > 0 && (\n <motion.div\n initial={reduce ? false : { opacity: 0, y: -6 }}\n animate={{ opacity: 1, y: 0 }}\n exit={reduce ? undefined : { opacity: 0, y: -6 }}\n transition={springs.gentle}\n className=\"flex items-start gap-3 rounded-lg border border-[var(--info)]/20 bg-[var(--info-bg)] p-3\"\n >\n <Users className=\"mt-0.5 h-[15px] w-[15px] flex-shrink-0 text-[var(--info)]\" />\n <div className=\"text-sm leading-relaxed text-[var(--info)]\">\n <p className=\"font-medium\">\n {waiting.length === 1\n ? '1 person is waiting for this day'\n : `${waiting.length} people are waiting for this day`}\n </p>\n <p className=\"mt-0.5 opacity-90\">\n {next?.customerName || next?.customerEmail\n ? `${next.customerName || next.customerEmail} is next in line and will be offered this slot automatically, with two hours to respond.`\n : 'The next person in line will be offered this slot automatically, with two hours to respond.'}\n </p>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n"],"mappings":";AAqDU,cACA,YADA;AAnDV,SAAS,QAAQ,iBAAiB,wBAAwB;AAC1D,SAAS,aAAa;AACtB,SAAS,mBAAmB;AAE5B,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AAcjB,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AACF,GAIG;AACD,QAAM,SAAS,iBAAiB;AAEhC,QAAM,EAAE,KAAK,IAAI;AAAA,IACf,CAAC,kBAAkB,MAAM,UAAU;AAAA,IACnC,CAAC,SAAS,YAAY,MAAM,MAAM,MAAO,UAAU;AAAA,IACnD,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,EAC3B;AAIA,QAAM,QAAwB,MAAM,QAAQ,IAAI,IAAI,OAAQ,MAAM,QAAQ,CAAC;AAC3E,QAAM,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AAC1D,QAAM,OAAO,QAAQ,CAAC;AAEtB,SACE,oBAAC,mBACE,kBAAQ,SAAS,KAChB;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,SAAS,QAAQ,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC9C,SAAS,EAAE,SAAS,GAAG,GAAG,EAAE;AAAA,MAC5B,MAAM,SAAS,SAAY,EAAE,SAAS,GAAG,GAAG,GAAG;AAAA,MAC/C,YAAY,QAAQ;AAAA,MACpB,WAAU;AAAA,MAEV;AAAA,4BAAC,SAAM,WAAU,6DAA4D;AAAA,QAC7E,qBAAC,SAAI,WAAU,8CACb;AAAA,8BAAC,OAAE,WAAU,eACV,kBAAQ,WAAW,IAChB,qCACA,GAAG,QAAQ,MAAM,oCACvB;AAAA,UACA,oBAAC,OAAE,WAAU,qBACV,gBAAM,gBAAgB,MAAM,gBACzB,GAAG,KAAK,gBAAgB,KAAK,aAAa,6FAC1C,+FACN;AAAA,WACF;AAAA;AAAA;AAAA,EACF,GAEJ;AAEJ;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './_components/index.js';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
useBookingDetailData,
|
|
3
|
+
BOOKING_STATUS_CONFIG,
|
|
4
|
+
useBookingStatusConfig,
|
|
5
|
+
STATUS_TRANSITIONS,
|
|
6
|
+
formatFullDate,
|
|
7
|
+
formatTime,
|
|
8
|
+
formatDateTime
|
|
9
|
+
} from "./use-booking-detail-data";
|
|
10
|
+
export {
|
|
11
|
+
BOOKING_STATUS_CONFIG,
|
|
12
|
+
STATUS_TRANSITIONS,
|
|
13
|
+
formatDateTime,
|
|
14
|
+
formatFullDate,
|
|
15
|
+
formatTime,
|
|
16
|
+
useBookingDetailData,
|
|
17
|
+
useBookingStatusConfig
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/dashboard/%28bookings%29/bookings/%5BbookingId%5D/_hooks/index.ts"],"sourcesContent":["export {\n useBookingDetailData,\n BOOKING_STATUS_CONFIG,\n useBookingStatusConfig,\n STATUS_TRANSITIONS,\n formatFullDate,\n formatTime,\n formatDateTime,\n type BookingStatus,\n} from './use-booking-detail-data';\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;","names":[]}
|