- Waitlist per session: entries for pick-sessions tickets name a session; offers use that session's free places, never run past its start, and claim links tick it. Held offers count towards session capacity. - At the door: the Select items pop-up has the session picker, with today's session preselected for new attendees. - On pick-sessions events every ticket shows the session list straight away. "All sessions" tickets record the ticked sessions (RegistrationOption.sessionIds) at one price; scanning, attendance, certificates, reminders and capacity follow them. - Fix: per-session stock limits weren't enforced (takenCount filtered WaitlistEntry by a sessionId column that didn't exist, and the error was swallowed), and the public event page lost its stock info. - Fix: editing a door registration with picked sessions couldn't be saved. - Fix: the offline-scanning service worker served /_next/static cache-first forever, so dev browsers that had opened the scanner ran stale code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
57 lines
3.0 KiB
TypeScript
57 lines
3.0 KiB
TypeScript
import React from "react";
|
|
import { ListChecks, Send, Clock, ArrowUpDown, UserMinus, Settings } from "lucide-react";
|
|
import { GuideItem } from "@/components/shared/GuideItem";
|
|
import type { HelpContent } from "./types";
|
|
|
|
/** Help content for /dashboard/supervisor/waitlist. */
|
|
export const supervisorWaitlistHelpContent: HelpContent = {
|
|
title: "Waitlist",
|
|
subtitle: "People waiting for sold-out tickets.",
|
|
tabs: [
|
|
{
|
|
key: "how",
|
|
label: "How it works",
|
|
icon: ListChecks,
|
|
content: (
|
|
<div className="space-y-4">
|
|
<div className="space-y-4">
|
|
<GuideItem icon={Settings} title="Turning it on" tone="brand">
|
|
In the event wizard's Visibility step, tick "Waitlist for sold-out tickets", set how long offered places are held (24 hours by default), and whether someone can be offered fewer places than they asked for.
|
|
</GuideItem>
|
|
<GuideItem icon={ListChecks} title="Joining" tone="green">
|
|
When a ticket is sold out, the event and registration pages show "Join waitlist". People pick the ticket and how many, and can leave again from My Events. On events where people pick sessions, the waitlist is per session: a full session shows "Join waitlist" in the session list, and the Ticket column shows which session someone is waiting for.
|
|
</GuideItem>
|
|
<GuideItem icon={Send} title="Offers" tone="violet">
|
|
When places free up — a cancellation, a smaller booking, or a higher stock limit — the next person in line is emailed or WhatsApped a claim link. The places are held for them, so nobody else can buy them in the meantime.
|
|
</GuideItem>
|
|
<GuideItem icon={Clock} title="Expiry" tone="amber">
|
|
If the offer isn't claimed in time, it expires and the places go to the next person. An offer for a session never runs past the session's start. Claiming goes through normal registration and payment, with early-bird and coupon rules as usual.
|
|
</GuideItem>
|
|
</div>
|
|
</div>
|
|
),
|
|
},
|
|
{
|
|
key: "tools",
|
|
label: "This page",
|
|
icon: ArrowUpDown,
|
|
content: (
|
|
<div className="space-y-4">
|
|
<div className="space-y-4">
|
|
<GuideItem icon={Send} title="Offer place" tone="brand">
|
|
Send someone an offer straight away, even if no place has freed up (this can take the event over its stock limit).
|
|
</GuideItem>
|
|
<GuideItem icon={ArrowUpDown} title="Reorder" tone="green">
|
|
Move someone up or down the queue.
|
|
</GuideItem>
|
|
<GuideItem icon={UserMinus} title="Remove" tone="rose">
|
|
Take someone off the waitlist. If they were holding an offer, it goes to the next person.
|
|
</GuideItem>
|
|
</div>
|
|
<p className="text-xs text-gray-500">The daily summary email shows how many people are on each event's waitlist.</p>
|
|
</div>
|
|
),
|
|
},
|
|
],
|
|
};
|