Skip to content

Add name badge printing - #1464

Open
daveearley wants to merge 1 commit into
developfrom
feature/badge-printing
Open

daveearley wants to merge 1 commit into
developfrom
feature/badge-printing

Conversation

@daveearley

Copy link
Copy Markdown
Contributor

What changes I've made

Adds name badge printing to the core product (no licence or feature flag).

Badge designer (new Badges page in the event menu)

  • Six templates (Classic, Banner, Minimal, Bold, Sidebar, Artwork) with logo, artwork and sponsor-strip images, homepage fonts, brand colours and text colour overrides.
  • Up to five lines, each showing a name, ticket type, date, custom text or the answer to any registration question. Company, job title and pronoun questions are picked up automatically, and one click adds company and job title questions to checkout.
  • Per-ticket ribbon colours and labels, so speakers, sponsors and staff stand out.
  • Sizes from 62 mm labels and ID cards to A6 and 4×6, printed one per page or on A4/Letter sheets with cutting guides.
  • Two-sided badges: duplex pages with each row mirrored for a long-edge flip, or fold-over badges (front and back on one side of the paper, folded) for single-sided printers.
  • Long names shrink to fit, and a template's main area scales down when the lines are taller than the space left.

Printing

  • Batch printing from the Badges page, the attendees page, and attendee and order menus, with filters (not printed yet, ticket, date) and paging over 1,000 badges.
  • Print status is derived from badge_print_count / badge_printed_at. Changing a name, ticket, seat or an answer shown on the badge puts it back in the reprint queue, including buyer seat changes and seat map relabels.
  • Printing at the door from check-in lists with badge printing switched on: print or reprint from the attendee sheet, auto-print on check-in, per-device label size and back printing, a test print, and a print queue so quick scans don't drop badges.
  • A self check-in kiosk mode for check-in lists: full-screen scan, welcome and "badge ready" screen with a Next check-in button. Attendee lists and search are refused on kiosk lists.

Event features switch

  • Badges are off by default per event and turned on under Event Settings → Features (event_settings.enabled_features, EventFeature::BADGES). Off hides every badge control and stops door printing. Seating and box office are unchanged.

Other

  • The check-in list create/edit form now uses the same expandable rows as the ticket drawer. The row component moved from ProductForm to common/Ledger.

Why I've made these changes

Badge printing is the most common gap for conferences. It hooks into registration questions and the existing check-in flows rather than being a separate tool, and it stays out of the way for the majority of events that don't need it.

Things to review

  • Migrations: 2026_10_29_000000_add_badge_printing adds event_settings.badge_design_settings, attendees.badge_printed_at / badge_print_count and check_in_lists.badge_printing_enabled / kiosk_mode. 2026_10_29_000001 adds the nullable event_settings.enabled_features.

  • API: additive only. There are new staff endpoints under /events/{id}/badge-design and /events/{id}/badges, and new public check-in endpoints for a single attendee's badge. New optional fields:

    • attendees: badge print fields;
    • check-in lists: badge_printing_enabled and kiosk_mode, kept as stored when an update leaves them out;
    • event settings: enabled_features;
    • badge design: fold_over.

    openapi.json is re-exported.

  • Behaviour change in check-in: the public single-attendee lookup now includes that list's check-in, so re-scanning an attendee shows "already checked in".

  • Door privacy: a door badge includes the answers bound to the design even when the list hides question answers from unauthenticated staff, because the organizer chose to print them.

How I've tested these changes

  • Backend:
    • Unit suite (2,344) and full Feature suite (1,575) pass, and pint --test passes.
    • New unit and feature tests cover badge data, reprint flagging (including seat moves and relabels), design defaults and validation, public door endpoints, kiosk restrictions and the features switch.
  • Frontend: npx tsc --noEmit passes. Translations are added for every supported language.
  • E2E:
    • New Playwright specs in e2e/tests/badges/ cover the designer, batch printing, two-sided and fold-over sheets, door printing, auto-print, the kiosk, and the features switch.
    • Check-in list, product, box office, seating and self-service specs pass on the dev stack. The only failure is management/messages-lifecycle, which also fails on develop.
  • Manual: checked in Chrome on desktop, tablet and mobile widths. Paper printing on a real duplex printer hasn't been verified.

Checklist

  • I have read the contributing guidelines.
  • My code follows the coding standards of the project.
  • I have tested my changes, and they work as expected.
  • I understand that this PR will be closed if I do not follow the contributor guidelines and if this PR template is left unedited.

- Badge designer: six templates, logo/artwork/sponsor images, fonts and
  colours, lines bound to registration questions, ticket colour ribbons,
  sizes from labels and ID cards to A6/4x6, A4/Letter sheets with cutting
  guides, and two-sided or fold-over backs.
- Batch printing with printed/needs-reprint tracking; name, ticket, seat
  and badge-answer changes flag a reprint. Print actions on attendee and
  order menus, and a badge column on the attendee table.
- Printing at check-in: print or reprint from the attendee sheet,
  auto-print on check-in, per-device label size and back printing, and a
  print queue. Check-in lists gain badge printing and a self check-in
  kiosk mode.
- Badges are an opt-in per-event feature under Event Settings > Features
  (event_settings.enabled_features); off hides badge UI and door printing.
- The check-in list form now uses expandable rows shared with the product
  form (common/Ledger).
@github-actions

Copy link
Copy Markdown
Contributor

✅ E2E smoke tests: Everything passed.

Mode Result ✅ Passed ❌ Failed ⚠️ Flaky ⏭️ Skipped ⏱️ Duration
Self-hosted ✅ Passed 115 0 0 0 3m 42s

Open the run

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant