XHP Fulfillment · Design exploration — revision 2

Stub Grid cards — status placement study

Stub Grid for parking and XHP tickets, with actions ported verbatim from the production actionButton() and the event title doubling as the purchase link. Use the “Status spot” row below to compare seven placements for the Unconfirmed / In Progress / Available / Issue badge — option 0 is where it sits today (buried in the chip row). Toggles for Claimed by me, Admin and the notes badge are in the toolbar; countdown rings tick live.

Fixed from revision 1: ① “Accept” is gone — it never existed in the app. Unconfirmed rows use Claim, exactly like Available (production treats available and unconfirmed identically). ② The separate Purchase ↗ button is gone — the event name is now the link to the purchase / TM page. ③ Every other button now matches production per status, including Copy Info on every card, Claim Anyway on issues, the in-progress set (Fulfill / Done, Tickets Unavailable, Release, Report Issue), Locked for someone else’s claim, and the admin-only Delist Event. This is a pure UI change — same actions, same labels, same conditions. ④ The chat-bubble notes icon is back — the same speech-bubble and history glyphs the table view uses, with the blue “has notes” state. Two count treatments to pick from via Notes badge below.

Action parity map — what each card renders vs. production actionButton()

Straight port of fulfillment-app-02.js. Nothing added, nothing renamed, nothing dropped; only the arrangement changes.

Row stateProduction buttonsIn these cards
availableClaim · [Delist Event*] · Copy InfoIdentical
unconfirmedClaim · [Delist Event*] · Copy Info — same branch as availableIdentical (was wrongly “Accept” in rev 1)
issueClaim Anyway · [Delist Event*] · Copy InfoIdentical
in_progress · mine · parkingFulfill · Tickets Unavailable · [Link TM Account] · Release · [Delist Event*] · Copy InfoIdentical
in_progress · mine · ticket[Verify Sale] · Done · [Tickets Unavailable] · Release · Report Issue · Copy InfoIdentical
in_progress · someone else“Locked” · [Delist Event*] · Copy InfoIdentical
Purchase / TM linklistingLink() — “Purchase ↗” (parking) / “View ↗” (ticket); “—” when no URLMoved onto the event title; same URL, same new-tab behavior. No URL → plain text + “no link” tag
History / NotesCard-view buttons, note count in the labelIdentical

* Delist Event is parking-only and admin-only (isFulfillmentAdminUser()) — use the Admin toggle. Link TM Account and Verify Sale are conditional in production and shown on the rows that qualify.