@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,244 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Plus, Trash2 } from "lucide-react";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
import { DAY_LABELS } from "@withpotter/lib/resource-types";
|
|
6
|
+
import { TimeField, Checkbox } from "@withpotter/ui-kit";
|
|
7
|
+
function getDefaultSchedule() {
|
|
8
|
+
const schedule = {};
|
|
9
|
+
for (let i = 0; i < 7; i++) {
|
|
10
|
+
schedule[i] = {
|
|
11
|
+
available: i >= 1 && i <= 5,
|
|
12
|
+
// Mon-Fri
|
|
13
|
+
slots: i >= 1 && i <= 5 ? [{ start: "09:00", end: "17:00" }] : []
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
return schedule;
|
|
17
|
+
}
|
|
18
|
+
function ScheduleEditor({
|
|
19
|
+
schedule,
|
|
20
|
+
onChange,
|
|
21
|
+
title = "The week it works",
|
|
22
|
+
layout = "rows"
|
|
23
|
+
}) {
|
|
24
|
+
const [selectedDay, setSelectedDay] = useState(1);
|
|
25
|
+
const toggleDay = (dayIndex) => {
|
|
26
|
+
const day = schedule[dayIndex] ?? { available: false, slots: [] };
|
|
27
|
+
const newAvailable = !day.available;
|
|
28
|
+
onChange({
|
|
29
|
+
...schedule,
|
|
30
|
+
[dayIndex]: {
|
|
31
|
+
available: newAvailable,
|
|
32
|
+
slots: newAvailable && (!day.slots || day.slots.length === 0) ? [{ start: "09:00", end: "17:00" }] : day.slots ?? []
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const updateSlot = (dayIndex, slotIndex, field, value) => {
|
|
37
|
+
const day = schedule[dayIndex];
|
|
38
|
+
if (!day?.slots) return;
|
|
39
|
+
const newSlots = [...day.slots];
|
|
40
|
+
newSlots[slotIndex] = { ...newSlots[slotIndex], [field]: value };
|
|
41
|
+
onChange({
|
|
42
|
+
...schedule,
|
|
43
|
+
[dayIndex]: { ...day, slots: newSlots }
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
const addSlot = (dayIndex) => {
|
|
47
|
+
const day = schedule[dayIndex];
|
|
48
|
+
if (!day) return;
|
|
49
|
+
const slots = day.slots ?? [];
|
|
50
|
+
const lastSlot = slots[slots.length - 1];
|
|
51
|
+
const newStart = lastSlot ? lastSlot.end : "09:00";
|
|
52
|
+
onChange({
|
|
53
|
+
...schedule,
|
|
54
|
+
[dayIndex]: {
|
|
55
|
+
...day,
|
|
56
|
+
slots: [...slots, { start: newStart, end: "17:00" }]
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const removeSlot = (dayIndex, slotIndex) => {
|
|
61
|
+
const day = schedule[dayIndex];
|
|
62
|
+
if (!day?.slots) return;
|
|
63
|
+
const newSlots = day.slots.filter((_, i) => i !== slotIndex);
|
|
64
|
+
onChange({
|
|
65
|
+
...schedule,
|
|
66
|
+
[dayIndex]: {
|
|
67
|
+
...day,
|
|
68
|
+
available: newSlots.length > 0,
|
|
69
|
+
slots: newSlots
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
74
|
+
title && /* @__PURE__ */ jsx("p", { className: "mb-2 block text-sm font-medium text-[var(--text-primary)]", children: title }),
|
|
75
|
+
layout === "week-grid" ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
76
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 gap-2 sm:grid-cols-7", children: DAY_LABELS.map((dayLabel, dayIndex) => {
|
|
77
|
+
const day = schedule[dayIndex] ?? {
|
|
78
|
+
available: false,
|
|
79
|
+
slots: []
|
|
80
|
+
};
|
|
81
|
+
return /* @__PURE__ */ jsxs(
|
|
82
|
+
"button",
|
|
83
|
+
{
|
|
84
|
+
type: "button",
|
|
85
|
+
"aria-pressed": selectedDay === dayIndex,
|
|
86
|
+
onClick: () => setSelectedDay(dayIndex),
|
|
87
|
+
className: `min-h-16 rounded-lg border p-2 text-left transition-colors ${selectedDay === dayIndex ? "border-brand-500 bg-[var(--accent-secondary)]" : "border-[var(--border-default)] bg-[var(--bg-base)]"}`,
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
"span",
|
|
91
|
+
{
|
|
92
|
+
className: `block text-xs font-medium ${selectedDay === dayIndex ? "text-[var(--accent-secondary-ink)]" : "text-[var(--text-primary)]"}`,
|
|
93
|
+
children: dayLabel.slice(0, 3)
|
|
94
|
+
}
|
|
95
|
+
),
|
|
96
|
+
/* @__PURE__ */ jsx(
|
|
97
|
+
"span",
|
|
98
|
+
{
|
|
99
|
+
className: `mt-2 block text-xs ${day.available ? "text-[var(--accent-secondary-ink)]" : "text-[var(--text-muted)]"}`,
|
|
100
|
+
children: day.available ? "Open" : "Off"
|
|
101
|
+
}
|
|
102
|
+
)
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
dayIndex
|
|
106
|
+
);
|
|
107
|
+
}) }),
|
|
108
|
+
(() => {
|
|
109
|
+
const dayIndex = selectedDay;
|
|
110
|
+
const dayLabel = DAY_LABELS[dayIndex];
|
|
111
|
+
const day = schedule[dayIndex] ?? {
|
|
112
|
+
available: false,
|
|
113
|
+
slots: []
|
|
114
|
+
};
|
|
115
|
+
return /* @__PURE__ */ jsxs("div", { className: "surface-inset !border-brand-500/40 p-3", children: [
|
|
116
|
+
/* @__PURE__ */ jsxs("div", { className: "mb-3 flex items-center justify-between", children: [
|
|
117
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-[var(--text-primary)]", children: dayLabel }),
|
|
118
|
+
/* @__PURE__ */ jsx(
|
|
119
|
+
Checkbox,
|
|
120
|
+
{
|
|
121
|
+
checked: day.available,
|
|
122
|
+
onChange: () => toggleDay(dayIndex),
|
|
123
|
+
label: /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-[var(--text-primary)]", children: day.available ? "Open" : "Off" })
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] }),
|
|
127
|
+
day.available ? /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
128
|
+
(day.slots ?? []).map((slot, slotIndex) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
TimeField,
|
|
131
|
+
{
|
|
132
|
+
value: slot.start,
|
|
133
|
+
onChange: (value) => updateSlot(dayIndex, slotIndex, "start", value)
|
|
134
|
+
}
|
|
135
|
+
),
|
|
136
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--text-primary)]", children: "to" }),
|
|
137
|
+
/* @__PURE__ */ jsx(
|
|
138
|
+
TimeField,
|
|
139
|
+
{
|
|
140
|
+
value: slot.end,
|
|
141
|
+
onChange: (value) => updateSlot(dayIndex, slotIndex, "end", value)
|
|
142
|
+
}
|
|
143
|
+
),
|
|
144
|
+
/* @__PURE__ */ jsx(
|
|
145
|
+
"button",
|
|
146
|
+
{
|
|
147
|
+
type: "button",
|
|
148
|
+
"aria-label": `Remove ${dayLabel} time slot`,
|
|
149
|
+
onClick: () => removeSlot(dayIndex, slotIndex),
|
|
150
|
+
className: "cursor-pointer p-1 text-[var(--text-muted)] hover:text-[var(--error)]",
|
|
151
|
+
children: /* @__PURE__ */ jsx(Trash2, {})
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
] }, slotIndex)),
|
|
155
|
+
/* @__PURE__ */ jsxs(
|
|
156
|
+
"button",
|
|
157
|
+
{
|
|
158
|
+
type: "button",
|
|
159
|
+
onClick: () => addSlot(dayIndex),
|
|
160
|
+
className: "flex cursor-pointer items-center gap-1 text-xs text-[var(--accent-secondary-ink)] hover:text-[var(--text-primary)]",
|
|
161
|
+
children: [
|
|
162
|
+
/* @__PURE__ */ jsx(Plus, {}),
|
|
163
|
+
"Add time slot"
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
)
|
|
167
|
+
] }) : /* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--text-muted)]", children: "Customers cannot book this day." })
|
|
168
|
+
] });
|
|
169
|
+
})()
|
|
170
|
+
] }) : DAY_LABELS.map((dayLabel, dayIndex) => {
|
|
171
|
+
const day = schedule[dayIndex] ?? { available: false, slots: [] };
|
|
172
|
+
return /* @__PURE__ */ jsxs(
|
|
173
|
+
"div",
|
|
174
|
+
{
|
|
175
|
+
className: `flex items-start gap-3 p-3 rounded-md border transition-colors ${day.available ? "border-[var(--border-default)] bg-[var(--bg-base)]" : "border-[var(--border-default)] bg-[var(--bg-subtle)]"}`,
|
|
176
|
+
children: [
|
|
177
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-[100px] pt-2", children: /* @__PURE__ */ jsx(
|
|
178
|
+
Checkbox,
|
|
179
|
+
{
|
|
180
|
+
checked: day.available,
|
|
181
|
+
onChange: () => toggleDay(dayIndex),
|
|
182
|
+
label: /* @__PURE__ */ jsx(
|
|
183
|
+
"span",
|
|
184
|
+
{
|
|
185
|
+
className: `text-sm font-medium ${day.available ? "text-[var(--text-primary)]" : "text-[var(--text-muted)]"}`,
|
|
186
|
+
children: dayLabel
|
|
187
|
+
}
|
|
188
|
+
)
|
|
189
|
+
}
|
|
190
|
+
) }),
|
|
191
|
+
day.available && /* @__PURE__ */ jsxs("div", { className: "flex-1 space-y-2", children: [
|
|
192
|
+
(day.slots ?? []).map((slot, slotIndex) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
193
|
+
/* @__PURE__ */ jsx(
|
|
194
|
+
TimeField,
|
|
195
|
+
{
|
|
196
|
+
value: slot.start,
|
|
197
|
+
onChange: (value) => updateSlot(dayIndex, slotIndex, "start", value)
|
|
198
|
+
}
|
|
199
|
+
),
|
|
200
|
+
/* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--text-tertiary)]", children: "to" }),
|
|
201
|
+
/* @__PURE__ */ jsx(
|
|
202
|
+
TimeField,
|
|
203
|
+
{
|
|
204
|
+
value: slot.end,
|
|
205
|
+
onChange: (value) => updateSlot(dayIndex, slotIndex, "end", value)
|
|
206
|
+
}
|
|
207
|
+
),
|
|
208
|
+
/* @__PURE__ */ jsx(
|
|
209
|
+
"button",
|
|
210
|
+
{
|
|
211
|
+
"aria-label": "Delete",
|
|
212
|
+
type: "button",
|
|
213
|
+
onClick: () => removeSlot(dayIndex, slotIndex),
|
|
214
|
+
className: "p-1 text-[var(--text-muted)] hover:text-[var(--error)] cursor-pointer",
|
|
215
|
+
children: /* @__PURE__ */ jsx(Trash2, {})
|
|
216
|
+
}
|
|
217
|
+
)
|
|
218
|
+
] }, slotIndex)),
|
|
219
|
+
/* @__PURE__ */ jsxs(
|
|
220
|
+
"button",
|
|
221
|
+
{
|
|
222
|
+
type: "button",
|
|
223
|
+
onClick: () => addSlot(dayIndex),
|
|
224
|
+
className: "flex items-center gap-1 text-xs text-brand-500 hover:text-brand-600 cursor-pointer",
|
|
225
|
+
children: [
|
|
226
|
+
/* @__PURE__ */ jsx(Plus, {}),
|
|
227
|
+
"Add time slot"
|
|
228
|
+
]
|
|
229
|
+
}
|
|
230
|
+
)
|
|
231
|
+
] }),
|
|
232
|
+
!day.available && /* @__PURE__ */ jsx("span", { className: "text-sm text-[var(--text-muted)] pt-2", children: "Off" })
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
dayIndex
|
|
236
|
+
);
|
|
237
|
+
})
|
|
238
|
+
] });
|
|
239
|
+
}
|
|
240
|
+
export {
|
|
241
|
+
ScheduleEditor,
|
|
242
|
+
getDefaultSchedule
|
|
243
|
+
};
|
|
244
|
+
//# sourceMappingURL=schedule-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/schedule-editor.tsx"],"sourcesContent":["'use client';\n\nimport { Plus, Trash2 } from 'lucide-react';\nimport { useState } from 'react';\nimport type { WeeklySchedule, ScheduleSlot } from '@withpotter/lib/resource-types';\nimport { DAY_LABELS } from '@withpotter/lib/resource-types';\nimport { TimeField, Checkbox } from '@withpotter/ui-kit';\n\n// ─── Props ───────────────────────────────────────────────────────────────────\n\ninterface ScheduleEditorProps {\n schedule: WeeklySchedule;\n onChange: (schedule: WeeklySchedule) => void;\n /** Null when the surface around it already names the section. */\n title?: string | null;\n layout?: 'rows' | 'week-grid';\n}\n\n// ─── Default Schedule ────────────────────────────────────────────────────────\n\nexport function getDefaultSchedule(): WeeklySchedule {\n const schedule: WeeklySchedule = {};\n for (let i = 0; i < 7; i++) {\n schedule[i] = {\n available: i >= 1 && i <= 5, // Mon-Fri\n slots: i >= 1 && i <= 5 ? [{ start: '09:00', end: '17:00' }] : [],\n };\n }\n return schedule;\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function ScheduleEditor({\n schedule,\n onChange,\n title = 'The week it works',\n layout = 'rows',\n}: ScheduleEditorProps) {\n const [selectedDay, setSelectedDay] = useState(1);\n const toggleDay = (dayIndex: number) => {\n const day = schedule[dayIndex] ?? { available: false, slots: [] };\n const newAvailable = !day.available;\n onChange({\n ...schedule,\n [dayIndex]: {\n available: newAvailable,\n slots:\n newAvailable && (!day.slots || day.slots.length === 0)\n ? [{ start: '09:00', end: '17:00' }]\n : (day.slots ?? []),\n },\n });\n };\n\n const updateSlot = (\n dayIndex: number,\n slotIndex: number,\n field: keyof ScheduleSlot,\n value: string,\n ) => {\n const day = schedule[dayIndex];\n if (!day?.slots) return;\n const newSlots = [...day.slots];\n newSlots[slotIndex] = { ...newSlots[slotIndex], [field]: value };\n onChange({\n ...schedule,\n [dayIndex]: { ...day, slots: newSlots },\n });\n };\n\n const addSlot = (dayIndex: number) => {\n const day = schedule[dayIndex];\n if (!day) return;\n const slots = day.slots ?? [];\n const lastSlot = slots[slots.length - 1];\n const newStart = lastSlot ? lastSlot.end : '09:00';\n onChange({\n ...schedule,\n [dayIndex]: {\n ...day,\n slots: [...slots, { start: newStart, end: '17:00' }],\n },\n });\n };\n\n const removeSlot = (dayIndex: number, slotIndex: number) => {\n const day = schedule[dayIndex];\n if (!day?.slots) return;\n const newSlots = day.slots.filter((_, i) => i !== slotIndex);\n onChange({\n ...schedule,\n [dayIndex]: {\n ...day,\n available: newSlots.length > 0,\n slots: newSlots,\n },\n });\n };\n\n return (\n <div className=\"space-y-2\">\n {/* Null where the section around it already carries the name: a heading\n that ships under another heading saying the same thing is the\n \"section heading ships alone\" rule, twice over. */}\n {title && (\n <p className=\"mb-2 block text-sm font-medium text-[var(--text-primary)]\">\n {title}\n </p>\n )}\n\n {layout === 'week-grid' ? (\n <>\n <div className=\"grid grid-cols-4 gap-2 sm:grid-cols-7\">\n {DAY_LABELS.map((dayLabel, dayIndex) => {\n const day = schedule[dayIndex] ?? {\n available: false,\n slots: [],\n };\n return (\n <button\n key={dayIndex}\n type=\"button\"\n aria-pressed={selectedDay === dayIndex}\n onClick={() => setSelectedDay(dayIndex)}\n className={`min-h-16 rounded-lg border p-2 text-left transition-colors ${\n selectedDay === dayIndex\n ? 'border-brand-500 bg-[var(--accent-secondary)]'\n : 'border-[var(--border-default)] bg-[var(--bg-base)]'\n }`}\n >\n <span\n className={`block text-xs font-medium ${\n selectedDay === dayIndex\n ? 'text-[var(--accent-secondary-ink)]'\n : 'text-[var(--text-primary)]'\n }`}\n >\n {dayLabel.slice(0, 3)}\n </span>\n <span\n className={`mt-2 block text-xs ${\n day.available\n ? 'text-[var(--accent-secondary-ink)]'\n : 'text-[var(--text-muted)]'\n }`}\n >\n {day.available ? 'Open' : 'Off'}\n </span>\n </button>\n );\n })}\n </div>\n {(() => {\n const dayIndex = selectedDay;\n const dayLabel = DAY_LABELS[dayIndex];\n const day = schedule[dayIndex] ?? {\n available: false,\n slots: [],\n };\n return (\n <div className=\"surface-inset !border-brand-500/40 p-3\">\n <div className=\"mb-3 flex items-center justify-between\">\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\n {dayLabel}\n </span>\n <Checkbox\n checked={day.available}\n onChange={() => toggleDay(dayIndex)}\n label={\n <span className=\"text-sm font-medium text-[var(--text-primary)]\">\n {day.available ? 'Open' : 'Off'}\n </span>\n }\n />\n </div>\n {day.available ? (\n <div className=\"space-y-2\">\n {(day.slots ?? []).map((slot, slotIndex) => (\n <div key={slotIndex} className=\"flex items-center gap-2\">\n <TimeField\n value={slot.start}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'start', value)\n }\n />\n <span className=\"text-sm text-[var(--text-primary)]\">\n to\n </span>\n <TimeField\n value={slot.end}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'end', value)\n }\n />\n <button\n type=\"button\"\n aria-label={`Remove ${dayLabel} time slot`}\n onClick={() => removeSlot(dayIndex, slotIndex)}\n className=\"cursor-pointer p-1 text-[var(--text-muted)] hover:text-[var(--error)]\"\n >\n <Trash2 />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => addSlot(dayIndex)}\n className=\"flex cursor-pointer items-center gap-1 text-xs text-[var(--accent-secondary-ink)] hover:text-[var(--text-primary)]\"\n >\n <Plus />\n Add time slot\n </button>\n </div>\n ) : (\n <p className=\"text-xs text-[var(--text-muted)]\">\n Customers cannot book this day.\n </p>\n )}\n </div>\n );\n })()}\n </>\n ) : (\n DAY_LABELS.map((dayLabel, dayIndex) => {\n const day = schedule[dayIndex] ?? { available: false, slots: [] };\n\n return (\n <div\n key={dayIndex}\n className={`flex items-start gap-3 p-3 rounded-md border transition-colors ${\n day.available\n ? 'border-[var(--border-default)] bg-[var(--bg-base)]'\n : 'border-[var(--border-default)] bg-[var(--bg-subtle)]'\n }`}\n >\n {/* Day toggle */}\n {/* The wrapper keeps the column width and top offset the row is\n laid out against; Checkbox owns everything inside it. */}\n <div className=\"min-w-[100px] pt-2\">\n <Checkbox\n checked={day.available}\n onChange={() => toggleDay(dayIndex)}\n label={\n <span\n className={`text-sm font-medium ${\n day.available\n ? 'text-[var(--text-primary)]'\n : 'text-[var(--text-muted)]'\n }`}\n >\n {dayLabel}\n </span>\n }\n />\n </div>\n\n {/* Slots */}\n {day.available && (\n <div className=\"flex-1 space-y-2\">\n {(day.slots ?? []).map((slot, slotIndex) => (\n <div key={slotIndex} className=\"flex items-center gap-2\">\n <TimeField\n value={slot.start}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'start', value)\n }\n />\n <span className=\"text-sm text-[var(--text-tertiary)]\">\n to\n </span>\n <TimeField\n value={slot.end}\n onChange={(value) =>\n updateSlot(dayIndex, slotIndex, 'end', value)\n }\n />\n <button\n aria-label=\"Delete\"\n type=\"button\"\n onClick={() => removeSlot(dayIndex, slotIndex)}\n className=\"p-1 text-[var(--text-muted)] hover:text-[var(--error)] cursor-pointer\"\n >\n <Trash2 />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => addSlot(dayIndex)}\n className=\"flex items-center gap-1 text-xs text-brand-500 hover:text-brand-600 cursor-pointer\"\n >\n <Plus />\n Add time slot\n </button>\n </div>\n )}\n\n {/* Off indicator */}\n {!day.available && (\n <span className=\"text-sm text-[var(--text-muted)] pt-2\">\n Off\n </span>\n )}\n </div>\n );\n })\n )}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Select } from "@withpotter/ui-kit";
|
|
4
|
+
import { timezoneOptions } from "../_lib/schedule-timezone";
|
|
5
|
+
function ScheduleTimezoneField({
|
|
6
|
+
value,
|
|
7
|
+
onChange
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
10
|
+
/* @__PURE__ */ jsx("label", { className: "text-ink mb-1 block text-sm font-medium", children: "Those hours are in" }),
|
|
11
|
+
/* @__PURE__ */ jsx(
|
|
12
|
+
Select,
|
|
13
|
+
{
|
|
14
|
+
value,
|
|
15
|
+
onChange,
|
|
16
|
+
options: timezoneOptions(value)
|
|
17
|
+
}
|
|
18
|
+
),
|
|
19
|
+
/* @__PURE__ */ jsx("p", { className: "text-ink-subtle mt-1 text-xs", children: "Every time you offer is read against this clock." })
|
|
20
|
+
] });
|
|
21
|
+
}
|
|
22
|
+
export {
|
|
23
|
+
ScheduleTimezoneField
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=schedule-timezone-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/schedule-timezone-field.tsx"],"sourcesContent":["'use client';\n\nimport { Select } from '@withpotter/ui-kit';\nimport { timezoneOptions } from '../_lib/schedule-timezone';\n\n/**\n * The clock the week above is written against.\n *\n * Sits with the schedule because it is the schedule's other half: \"09:00 to\n * 17:00\" is not a time until you say where.\n */\nexport function ScheduleTimezoneField({\n value,\n onChange,\n}: {\n value: string;\n onChange: (value: string) => void;\n}) {\n return (\n <div>\n <label className=\"text-ink mb-1 block text-sm font-medium\">\n Those hours are in\n </label>\n <Select\n value={value}\n onChange={onChange}\n options={timezoneOptions(value)}\n />\n <p className=\"text-ink-subtle mt-1 text-xs\">\n Every time you offer is read against this clock.\n </p>\n </div>\n );\n}\n"],"mappings":";AAmBI,SACE,KADF;AAjBJ,SAAS,cAAc;AACvB,SAAS,uBAAuB;AAQzB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGG;AACD,SACE,qBAAC,SACC;AAAA,wBAAC,WAAM,WAAU,2CAA0C,gCAE3D;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS,gBAAgB,KAAK;AAAA;AAAA,IAChC;AAAA,IACA,oBAAC,OAAE,WAAU,gCAA+B,8DAE5C;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect, useCallback, useRef } from "react";
|
|
4
|
+
import { Save, Loader2, UserPlus } from "lucide-react";
|
|
5
|
+
import { useAuth } from "@withpotter/lib/auth-context";
|
|
6
|
+
import { resourcesApi } from "@withpotter/lib/api";
|
|
7
|
+
import {
|
|
8
|
+
ScheduleEditor,
|
|
9
|
+
getDefaultSchedule
|
|
10
|
+
} from "@withpotter/components/resource-scheduling/schedule-editor";
|
|
11
|
+
function SoloScheduleView({ onAddTeamMember }) {
|
|
12
|
+
const { tenant, user } = useAuth();
|
|
13
|
+
const [resource, setResource] = useState(null);
|
|
14
|
+
const [schedule, setSchedule] = useState(getDefaultSchedule());
|
|
15
|
+
const [loading, setLoading] = useState(true);
|
|
16
|
+
const [saving, setSaving] = useState(false);
|
|
17
|
+
const [saved, setSaved] = useState(false);
|
|
18
|
+
const [error, setError] = useState(null);
|
|
19
|
+
const initRef = useRef(false);
|
|
20
|
+
const slug = tenant?.slug ?? "";
|
|
21
|
+
const loadOrCreateSoloResource = useCallback(async () => {
|
|
22
|
+
if (!slug) return;
|
|
23
|
+
if (initRef.current) return;
|
|
24
|
+
initRef.current = true;
|
|
25
|
+
setLoading(true);
|
|
26
|
+
setError(null);
|
|
27
|
+
try {
|
|
28
|
+
const res = await resourcesApi.listFull(slug, { type: "staff" });
|
|
29
|
+
const resources = res?.data ?? [];
|
|
30
|
+
const soloResource = resources.find((r) => !r.categoryId);
|
|
31
|
+
if (soloResource) {
|
|
32
|
+
setResource(soloResource);
|
|
33
|
+
if (soloResource.schedule) {
|
|
34
|
+
setSchedule(soloResource.schedule);
|
|
35
|
+
}
|
|
36
|
+
} else {
|
|
37
|
+
const created = await resourcesApi.create(slug, {
|
|
38
|
+
type: "staff",
|
|
39
|
+
name: user?.name || tenant?.businessName || "Provider",
|
|
40
|
+
schedule: getDefaultSchedule(),
|
|
41
|
+
defaultDurationMinutes: 60,
|
|
42
|
+
bufferMinutes: 15,
|
|
43
|
+
advanceBookingDays: 30
|
|
44
|
+
});
|
|
45
|
+
setResource(created);
|
|
46
|
+
if (created.schedule) {
|
|
47
|
+
setSchedule(created.schedule);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} catch {
|
|
51
|
+
setError("Failed to load schedule. Please try again.");
|
|
52
|
+
initRef.current = false;
|
|
53
|
+
} finally {
|
|
54
|
+
setLoading(false);
|
|
55
|
+
}
|
|
56
|
+
}, [slug, user?.name, tenant?.businessName]);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
loadOrCreateSoloResource();
|
|
59
|
+
}, [loadOrCreateSoloResource]);
|
|
60
|
+
const handleSave = async () => {
|
|
61
|
+
if (!resource || !slug) return;
|
|
62
|
+
setSaving(true);
|
|
63
|
+
setSaved(false);
|
|
64
|
+
try {
|
|
65
|
+
await resourcesApi.updateSchedule(slug, resource.id, schedule);
|
|
66
|
+
setSaved(true);
|
|
67
|
+
setTimeout(() => setSaved(false), 2e3);
|
|
68
|
+
} catch {
|
|
69
|
+
setError("Failed to save schedule. Please try again.");
|
|
70
|
+
} finally {
|
|
71
|
+
setSaving(false);
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
if (loading) {
|
|
75
|
+
return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-64", children: /* @__PURE__ */ jsx(Loader2, { className: "w-6 h-6 animate-spin text-[var(--text-muted)]" }) });
|
|
76
|
+
}
|
|
77
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
78
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3", children: [
|
|
79
|
+
/* @__PURE__ */ jsxs(
|
|
80
|
+
"button",
|
|
81
|
+
{
|
|
82
|
+
onClick: onAddTeamMember,
|
|
83
|
+
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-secondary)] border border-[var(--border-default)] rounded-md hover:bg-[var(--interactive-hover)] cursor-pointer transition-colors",
|
|
84
|
+
children: [
|
|
85
|
+
/* @__PURE__ */ jsx(UserPlus, { className: "w-4 h-4" }),
|
|
86
|
+
"Add team member"
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
),
|
|
90
|
+
/* @__PURE__ */ jsxs(
|
|
91
|
+
"button",
|
|
92
|
+
{
|
|
93
|
+
onClick: handleSave,
|
|
94
|
+
disabled: saving,
|
|
95
|
+
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors disabled:opacity-50",
|
|
96
|
+
children: [
|
|
97
|
+
saving ? /* @__PURE__ */ jsx(Loader2, { className: "w-4 h-4 animate-spin" }) : /* @__PURE__ */ jsx(Save, { className: "w-4 h-4" }),
|
|
98
|
+
saved ? "Saved" : saving ? "Saving..." : "Save Schedule"
|
|
99
|
+
]
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
] }),
|
|
103
|
+
error && /* @__PURE__ */ jsx("div", { className: "px-4 py-3 text-sm text-[var(--error)] bg-[var(--error-bg)] border border-[var(--error)]/20 rounded-md", children: error }),
|
|
104
|
+
/* @__PURE__ */ jsxs("div", { className: "bg-[var(--bg-base)] border border-[var(--border-default)] rounded-md p-6", children: [
|
|
105
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 mb-6", children: [
|
|
106
|
+
/* @__PURE__ */ jsx("div", { className: "w-12 h-12 rounded-full bg-[var(--accent-secondary)] flex items-center justify-center text-lg font-medium text-brand-600", children: resource?.name?.charAt(0)?.toUpperCase() || "?" }),
|
|
107
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
108
|
+
/* @__PURE__ */ jsx("h2", { className: "text-base font-medium text-[var(--text-primary)]", children: resource?.name || "Provider" }),
|
|
109
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-secondary)]", children: "You\u2019re the only provider \u2014 customers book directly with you" })
|
|
110
|
+
] })
|
|
111
|
+
] }),
|
|
112
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-4 mb-6", children: [
|
|
113
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
114
|
+
/* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-[var(--text-secondary)] mb-1.5", children: "Default duration" }),
|
|
115
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-[var(--text-primary)]", children: [
|
|
116
|
+
resource?.defaultDurationMinutes || 60,
|
|
117
|
+
" min"
|
|
118
|
+
] })
|
|
119
|
+
] }),
|
|
120
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
121
|
+
/* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-[var(--text-secondary)] mb-1.5", children: "Buffer between bookings" }),
|
|
122
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-[var(--text-primary)]", children: [
|
|
123
|
+
resource?.bufferMinutes || 15,
|
|
124
|
+
" min"
|
|
125
|
+
] })
|
|
126
|
+
] }),
|
|
127
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
128
|
+
/* @__PURE__ */ jsx("label", { className: "block text-xs font-medium text-[var(--text-secondary)] mb-1.5", children: "Advance booking" }),
|
|
129
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm text-[var(--text-primary)]", children: [
|
|
130
|
+
"Up to ",
|
|
131
|
+
resource?.advanceBookingDays || 30,
|
|
132
|
+
" days"
|
|
133
|
+
] })
|
|
134
|
+
] })
|
|
135
|
+
] }),
|
|
136
|
+
/* @__PURE__ */ jsxs("div", { className: "border-t border-[var(--border-subtle)] pt-6", children: [
|
|
137
|
+
/* @__PURE__ */ jsx("h3", { className: "text-sm font-medium text-[var(--text-primary)] mb-4", children: "Working hours" }),
|
|
138
|
+
/* @__PURE__ */ jsx(ScheduleEditor, { schedule, onChange: setSchedule })
|
|
139
|
+
] })
|
|
140
|
+
] })
|
|
141
|
+
] });
|
|
142
|
+
}
|
|
143
|
+
export {
|
|
144
|
+
SoloScheduleView
|
|
145
|
+
};
|
|
146
|
+
//# sourceMappingURL=solo-schedule-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/dashboard/%28bookings%29/resources/_components/solo-schedule-view.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { Save, Loader2, UserPlus } from 'lucide-react';\nimport { useAuth } from '@withpotter/lib/auth-context';\nimport { resourcesApi } from '@withpotter/lib/api';\nimport type { Resource, WeeklySchedule } from '@withpotter/lib/resource-types';\nimport {\n ScheduleEditor,\n getDefaultSchedule,\n} from '@withpotter/components/resource-scheduling/schedule-editor';\n\ninterface SoloScheduleViewProps {\n onAddTeamMember: () => void;\n}\n\nexport function SoloScheduleView({ onAddTeamMember }: SoloScheduleViewProps) {\n const { tenant, user } = useAuth();\n const [resource, setResource] = useState<Resource | null>(null);\n const [schedule, setSchedule] =\n useState<WeeklySchedule>(getDefaultSchedule());\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [saved, setSaved] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Guard against concurrent/duplicate creation (React StrictMode fires effects twice)\n const initRef = useRef(false);\n\n const slug = tenant?.slug ?? '';\n\n // Load or auto-create the solo provider resource\n const loadOrCreateSoloResource = useCallback(async () => {\n if (!slug) return;\n // Prevent concurrent calls from creating duplicates\n if (initRef.current) return;\n initRef.current = true;\n\n setLoading(true);\n setError(null);\n\n try {\n const res = await resourcesApi.listFull(slug, { type: 'staff' });\n const resources = res?.data ?? [];\n const soloResource = resources.find((r) => !r.categoryId);\n\n if (soloResource) {\n setResource(soloResource);\n if (soloResource.schedule) {\n setSchedule(soloResource.schedule);\n }\n } else {\n const created = await resourcesApi.create(slug, {\n type: 'staff',\n name: user?.name || tenant?.businessName || 'Provider',\n schedule: getDefaultSchedule(),\n defaultDurationMinutes: 60,\n bufferMinutes: 15,\n advanceBookingDays: 30,\n });\n setResource(created);\n if (created.schedule) {\n setSchedule(created.schedule);\n }\n }\n } catch {\n setError('Failed to load schedule. Please try again.');\n // Allow retry on error\n initRef.current = false;\n } finally {\n setLoading(false);\n }\n }, [slug, user?.name, tenant?.businessName]);\n\n useEffect(() => {\n loadOrCreateSoloResource();\n }, [loadOrCreateSoloResource]);\n\n const handleSave = async () => {\n if (!resource || !slug) return;\n setSaving(true);\n setSaved(false);\n try {\n await resourcesApi.updateSchedule(slug, resource.id, schedule);\n setSaved(true);\n setTimeout(() => setSaved(false), 2000);\n } catch {\n setError('Failed to save schedule. Please try again.');\n } finally {\n setSaving(false);\n }\n };\n\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-64\">\n <Loader2 className=\"w-6 h-6 animate-spin text-[var(--text-muted)]\" />\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n {/* Actions */}\n <div className=\"flex items-center justify-end gap-3\">\n <button\n onClick={onAddTeamMember}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-secondary)] border border-[var(--border-default)] rounded-md hover:bg-[var(--interactive-hover)] cursor-pointer transition-colors\"\n >\n <UserPlus className=\"w-4 h-4\" />\n Add team member\n </button>\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors disabled:opacity-50\"\n >\n {saving ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Save className=\"w-4 h-4\" />\n )}\n {saved ? 'Saved' : saving ? 'Saving...' : 'Save Schedule'}\n </button>\n </div>\n\n {error && (\n <div className=\"px-4 py-3 text-sm text-[var(--error)] bg-[var(--error-bg)] border border-[var(--error)]/20 rounded-md\">\n {error}\n </div>\n )}\n\n {/* Provider Card */}\n <div className=\"bg-[var(--bg-base)] border border-[var(--border-default)] rounded-md p-6\">\n <div className=\"flex items-center gap-4 mb-6\">\n <div className=\"w-12 h-12 rounded-full bg-[var(--accent-secondary)] flex items-center justify-center text-lg font-medium text-brand-600\">\n {resource?.name?.charAt(0)?.toUpperCase() || '?'}\n </div>\n <div>\n <h2 className=\"text-base font-medium text-[var(--text-primary)]\">\n {resource?.name || 'Provider'}\n </h2>\n <p className=\"text-sm text-[var(--text-secondary)]\">\n You’re the only provider — customers book directly\n with you\n </p>\n </div>\n </div>\n\n {/* Booking defaults */}\n <div className=\"grid grid-cols-3 gap-4 mb-6\">\n <div>\n <label className=\"block text-xs font-medium text-[var(--text-secondary)] mb-1.5\">\n Default duration\n </label>\n <div className=\"text-sm text-[var(--text-primary)]\">\n {resource?.defaultDurationMinutes || 60} min\n </div>\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[var(--text-secondary)] mb-1.5\">\n Buffer between bookings\n </label>\n <div className=\"text-sm text-[var(--text-primary)]\">\n {resource?.bufferMinutes || 15} min\n </div>\n </div>\n <div>\n <label className=\"block text-xs font-medium text-[var(--text-secondary)] mb-1.5\">\n Advance booking\n </label>\n <div className=\"text-sm text-[var(--text-primary)]\">\n Up to {resource?.advanceBookingDays || 30} days\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-[var(--border-subtle)] pt-6\">\n <h3 className=\"text-sm font-medium text-[var(--text-primary)] mb-4\">\n Working hours\n </h3>\n <ScheduleEditor schedule={schedule} onChange={setSchedule} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { X, Users, Loader2, ArrowRight } from "lucide-react";
|
|
5
|
+
import { KIND_OPTIONS } from "@withpotter/lib/resource-types";
|
|
6
|
+
function TeamOnboardingDialog({
|
|
7
|
+
open,
|
|
8
|
+
onClose,
|
|
9
|
+
onComplete
|
|
10
|
+
}) {
|
|
11
|
+
const [step, setStep] = useState("intro");
|
|
12
|
+
const [kind, setKind] = useState("person");
|
|
13
|
+
const [label, setLabel] = useState("");
|
|
14
|
+
const [labelPlural, setLabelPlural] = useState("");
|
|
15
|
+
const [saving, setSaving] = useState(false);
|
|
16
|
+
const [error, setError] = useState(null);
|
|
17
|
+
const handleLabelChange = (value) => {
|
|
18
|
+
setLabel(value);
|
|
19
|
+
if (!labelPlural || labelPlural === label + "s" || labelPlural === label + "es") {
|
|
20
|
+
setLabelPlural(
|
|
21
|
+
value.endsWith("s") || value.endsWith("sh") || value.endsWith("ch") ? value + "es" : value + "s"
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const handleComplete = async () => {
|
|
26
|
+
if (!label.trim()) return;
|
|
27
|
+
setSaving(true);
|
|
28
|
+
setError(null);
|
|
29
|
+
try {
|
|
30
|
+
const kindOption = KIND_OPTIONS.find((k) => k.value === kind);
|
|
31
|
+
await onComplete({
|
|
32
|
+
label: label.trim(),
|
|
33
|
+
labelPlural: labelPlural.trim() || label.trim() + "s",
|
|
34
|
+
kind,
|
|
35
|
+
icon: kindOption?.emoji || "\u{1F464}"
|
|
36
|
+
});
|
|
37
|
+
} catch {
|
|
38
|
+
setError("Something went wrong. Please try again.");
|
|
39
|
+
setSaving(false);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const reset = () => {
|
|
43
|
+
setStep("intro");
|
|
44
|
+
setKind("person");
|
|
45
|
+
setLabel("");
|
|
46
|
+
setLabelPlural("");
|
|
47
|
+
setSaving(false);
|
|
48
|
+
setError(null);
|
|
49
|
+
};
|
|
50
|
+
const handleClose = () => {
|
|
51
|
+
reset();
|
|
52
|
+
onClose();
|
|
53
|
+
};
|
|
54
|
+
if (!open) return null;
|
|
55
|
+
return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex items-center justify-center", children: [
|
|
56
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-black/40", onClick: handleClose }),
|
|
57
|
+
/* @__PURE__ */ jsxs("div", { className: "relative bg-[var(--bg-base)] rounded-md shadow-xl w-full max-w-lg mx-4", children: [
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-[var(--border-default)]", children: [
|
|
59
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold text-[var(--text-primary)]", children: step === "intro" ? "Growing your team?" : "Set up your team" }),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
"button",
|
|
62
|
+
{
|
|
63
|
+
"aria-label": "Close",
|
|
64
|
+
onClick: handleClose,
|
|
65
|
+
className: "p-1 text-[var(--text-tertiary)] hover:text-[var(--text-primary)] cursor-pointer",
|
|
66
|
+
children: /* @__PURE__ */ jsx(X, { className: "w-5 h-5" })
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] }),
|
|
70
|
+
/* @__PURE__ */ jsx("div", { className: "px-6 py-5", children: step === "intro" ? /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
71
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-16 h-16 mx-auto rounded-full bg-[var(--accent-secondary)]", children: /* @__PURE__ */ jsx(Users, { className: "w-8 h-8 text-brand-500" }) }),
|
|
72
|
+
/* @__PURE__ */ jsxs("div", { className: "text-center space-y-2", children: [
|
|
73
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-secondary)] leading-relaxed", children: "Right now, customers book directly with you. Adding team members lets you organize providers into groups (e.g. \u201CStylists\u201D, \u201CTherapists\u201D) with individual schedules." }),
|
|
74
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-[var(--text-secondary)] leading-relaxed", children: "Your existing schedule and bookings will be preserved \u2014 you\u2019ll just be organizing them under a team." })
|
|
75
|
+
] })
|
|
76
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
|
|
77
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
78
|
+
/* @__PURE__ */ jsx("label", { className: "block text-sm font-medium text-[var(--text-primary)] mb-2", children: "What type of team?" }),
|
|
79
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-2", children: KIND_OPTIONS.map((option) => /* @__PURE__ */ jsxs(
|
|
80
|
+
"button",
|
|
81
|
+
{
|
|
82
|
+
onClick: () => setKind(option.value),
|
|
83
|
+
className: `flex items-center gap-3 p-3 rounded-md border text-left cursor-pointer transition-colors ${kind === option.value ? "border-brand-500 bg-[var(--accent-secondary)] text-brand-700" : "border-[var(--border-default)] hover:bg-[var(--interactive-hover)] text-[var(--text-secondary)]"}`,
|
|
84
|
+
children: [
|
|
85
|
+
/* @__PURE__ */ jsx("span", { className: "text-xl", children: option.emoji }),
|
|
86
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
87
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm font-medium", children: option.label }),
|
|
88
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-[var(--text-tertiary)]", children: option.description })
|
|
89
|
+
] })
|
|
90
|
+
]
|
|
91
|
+
},
|
|
92
|
+
option.value
|
|
93
|
+
)) })
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
96
|
+
/* @__PURE__ */ jsx("label", { className: "block text-sm font-medium text-[var(--text-primary)] mb-1.5", children: "What do you call them?" }),
|
|
97
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-[var(--text-tertiary)] mb-2", children: "e.g. \u201CStylist\u201D / \u201CStylists\u201D, \u201CRoom\u201D / \u201CRooms\u201D" }),
|
|
98
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
99
|
+
/* @__PURE__ */ jsx(
|
|
100
|
+
"input",
|
|
101
|
+
{
|
|
102
|
+
type: "text",
|
|
103
|
+
value: label,
|
|
104
|
+
onChange: (e) => handleLabelChange(e.target.value),
|
|
105
|
+
placeholder: "Singular (e.g. Stylist)",
|
|
106
|
+
className: "w-full px-3 py-2 text-sm border border-[var(--border-default)] rounded-md bg-[var(--bg-base)] text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500"
|
|
107
|
+
}
|
|
108
|
+
),
|
|
109
|
+
/* @__PURE__ */ jsx(
|
|
110
|
+
"input",
|
|
111
|
+
{
|
|
112
|
+
type: "text",
|
|
113
|
+
value: labelPlural,
|
|
114
|
+
onChange: (e) => setLabelPlural(e.target.value),
|
|
115
|
+
placeholder: "Plural (e.g. Stylists)",
|
|
116
|
+
className: "w-full px-3 py-2 text-sm border border-[var(--border-default)] rounded-md bg-[var(--bg-base)] text-[var(--text-primary)] placeholder:text-[var(--text-muted)] focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500"
|
|
117
|
+
}
|
|
118
|
+
)
|
|
119
|
+
] })
|
|
120
|
+
] }),
|
|
121
|
+
error && /* @__PURE__ */ jsx("div", { className: "text-sm text-[var(--error)]", children: error })
|
|
122
|
+
] }) }),
|
|
123
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3 px-6 py-4 border-t border-[var(--border-default)]", children: [
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
"button",
|
|
126
|
+
{
|
|
127
|
+
onClick: handleClose,
|
|
128
|
+
className: "px-4 py-2 text-sm font-medium text-[var(--text-secondary)] hover:text-[var(--text-primary)] cursor-pointer",
|
|
129
|
+
children: "Cancel"
|
|
130
|
+
}
|
|
131
|
+
),
|
|
132
|
+
step === "intro" ? /* @__PURE__ */ jsxs(
|
|
133
|
+
"button",
|
|
134
|
+
{
|
|
135
|
+
onClick: () => setStep("setup"),
|
|
136
|
+
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors",
|
|
137
|
+
children: [
|
|
138
|
+
"Let\u2019s set it up",
|
|
139
|
+
/* @__PURE__ */ jsx(ArrowRight, { className: "w-4 h-4" })
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
) : /* @__PURE__ */ jsxs(
|
|
143
|
+
"button",
|
|
144
|
+
{
|
|
145
|
+
onClick: handleComplete,
|
|
146
|
+
disabled: !label.trim() || saving,
|
|
147
|
+
className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-[var(--text-inverse)] bg-brand-500 rounded-md hover:bg-brand-600 cursor-pointer transition-colors disabled:opacity-50",
|
|
148
|
+
children: [
|
|
149
|
+
saving ? /* @__PURE__ */ jsx(Loader2, { className: "w-4 h-4 animate-spin" }) : null,
|
|
150
|
+
saving ? "Setting up..." : "Create Team"
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
] })
|
|
155
|
+
] })
|
|
156
|
+
] });
|
|
157
|
+
}
|
|
158
|
+
export {
|
|
159
|
+
TeamOnboardingDialog
|
|
160
|
+
};
|
|
161
|
+
//# sourceMappingURL=team-onboarding-dialog.js.map
|