diff --git a/CHANGELOG.md b/CHANGELOG.md index 28ebe0c..347ebd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ and this project follows [Semantic Versioning](https://semver.org/). ## [Unreleased] +## [1.28.1] - 2026-10-21 + +### Added + +- At the door and the self-service kiosk now list the event's bundle deals and show the same bundle cards as the register form: once a ticket from a bundle is picked, **Complete bundle** tops up the ticket numbers, and **+** adds another full set. + +### Fixed + +- At the door now has the same "← Back to dashboard" link as the other dashboard pages. +- At the door's "less than already paid" warning shows the total after bundle deals. + ## [1.28.0] - 2026-10-21 Run `npm run prisma:deploy` in the backend when deploying. This release adds a migration. diff --git a/frontend/src/app/dashboard/supervisor/at-the-door/page.tsx b/frontend/src/app/dashboard/supervisor/at-the-door/page.tsx index dd086b6..b3479e6 100644 --- a/frontend/src/app/dashboard/supervisor/at-the-door/page.tsx +++ b/frontend/src/app/dashboard/supervisor/at-the-door/page.tsx @@ -7,13 +7,14 @@ import { apiFetch } from "@/lib/api"; import { scoreUser } from "@/lib/fuzzyMatch"; import { useDismissingState } from "@/hooks/useDismissingState"; import { CouponCodeField, AppliedCoupon } from "@/components/shared/CouponCodeField"; -import { BundleSavings, useBundleQuote } from "@/components/shared/BundleDeals"; +import { BundleBuilder, BundleOffers, BundleSavings, useBundleQuote } from "@/components/shared/BundleDeals"; +import { BackLink } from "@/components/shared/BackLink"; import { TransferTicketModal, canOfferTransfer } from "@/components/shared/TransferTicketModal"; import { AttendeeNamesEditor, AttendeeEntries, TicketDelivery, attendeesPayload, consentDetailsMissing } from "@/components/shared/AttendeeNamesEditor"; import { DoorOpen, UserPlus, CreditCard, CheckSquare, Ticket, RotateCcw, type LucideIcon } from "lucide-react"; import { errorMessage } from "@/lib/utils"; import { optionUnitNow, variantUnitNow } from "@/lib/pricing"; -import type { Event, EventOption, Registration, Ticket as TicketRecord, UserSummary } from "@/types"; +import type { Event, EventOption, PublicBundle, Registration, Ticket as TicketRecord, UserSummary } from "@/types"; type NewAttendee = { name: string; email: string | null; phone: string | null; notifPref: "email" | "whatsapp" | "both" }; @@ -105,6 +106,7 @@ export default function AtTheDoorPage() { const [doorAllowsNames, setDoorAllowsNames] = useState(false); const [doorYouthStart, setDoorYouthStart] = useState(null); const [doorCollectGender, setDoorCollectGender] = useState(false); + const [doorBundles, setDoorBundles] = useState([]); const [doorNaming, setDoorNaming] = useState(false); const [doorEntries, setDoorEntries] = useState({}); const [doorDelivery, setDoorDelivery] = useState("payer"); @@ -164,8 +166,10 @@ export default function AtTheDoorPage() { setDoorAllowsNames(!!ev.allowNamedAttendees || !!ev.requiresParentalConsent); setDoorYouthStart(ev.requiresParentalConsent ? ev.startDate : null); setDoorCollectGender(!!ev.collectGender); + setDoorBundles(ev.bundles || []); } catch { setEventOptions([]); + setDoorBundles([]); } })(); }, [eventId, token]); @@ -395,7 +399,10 @@ export default function AtTheDoorPage() {
-

At The Door

+
+ +

At The Door

+