Files
hope-events/frontend/src/content/help/supervisor-waitlist.tsx
T
joshuaandClaude Opus 5.5 f99b84858e Session gaps: per-session waitlist, door session picker, all-sessions choice
- 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>
2026-10-23 11:38:21 +02:00

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&apos;s Visibility step, tick &quot;Waitlist for sold-out tickets&quot;, 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 &quot;Join waitlist&quot;. 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 &quot;Join waitlist&quot; 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&apos;t claimed in time, it expires and the places go to the next person. An offer for a session never runs past the session&apos;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&apos;s waitlist.</p>
</div>
),
},
],
};