docs(badges): mark Task 2 complete, document font controls and bug fix
- PROJECT doc: Task 2 status → complete (v1); added implementation
details, default px values table, and note on future mm/inch iteration
- PROJECT doc: noted the review page field list bug fix (commit 011fc19a)
- MODULE doc: added "Recently Completed" section above Still Needed;
cleared Badge Review Form and Print Font Controls from HIGH PRIORITY list
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,8 @@
|
|||||||
**Module Path:** `src/routes/events/[event_id]/(badges)/badges/`
|
**Module Path:** `src/routes/events/[event_id]/(badges)/badges/`
|
||||||
**API Module:** `src/lib/ae_events/ae_events__event_badge.ts`
|
**API Module:** `src/lib/ae_events/ae_events__event_badge.ts`
|
||||||
**Database:** `db_events.badge` (Dexie IndexedDB table)
|
**Database:** `db_events.badge` (Dexie IndexedDB table)
|
||||||
**Last Updated:** 2026-02-27 (rev 5)
|
**Last Updated:** 2026-02-27 (rev 6)
|
||||||
|
**Related Docs:** `documentation/PROJECT__AE_Events_Badges_Review_Print.md` (implementation guide)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -16,6 +17,8 @@ The Badges module manages event attendee badges with support for:
|
|||||||
- **QR code generation** for badge scanning
|
- **QR code generation** for badge scanning
|
||||||
- **Print tracking** (count, first/last print datetime)
|
- **Print tracking** (count, first/last print datetime)
|
||||||
- **Advanced search and filtering**
|
- **Advanced search and filtering**
|
||||||
|
- **HTML rendering** in display fields for rich text formatting
|
||||||
|
- **Accessibility features** (text enlargement toggle)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -44,6 +47,19 @@ UI Display Logic:
|
|||||||
3. ELSE → Display placeholder/empty
|
3. ELSE → Display placeholder/empty
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**HTML Rendering (implemented 2026-02-27):**
|
||||||
|
|
||||||
|
Certain fields support HTML markup for rich text formatting. When viewing (not editing), these fields use Svelte's `{@html}` directive to render the markup:
|
||||||
|
- `full_name` / `full_name_override`
|
||||||
|
- `professional_title` / `professional_title_override`
|
||||||
|
- `affiliations` / `affiliations_override`
|
||||||
|
- `location` / `location_override`
|
||||||
|
|
||||||
|
This allows for formatting like:
|
||||||
|
- Bold/italic: `<b>Dr.</b> Jane Smith` or `<i>Chief Medical Officer</i>`
|
||||||
|
- Line breaks: `Hospital Name<br>Department Name`
|
||||||
|
- Special characters and entities
|
||||||
|
|
||||||
**Example — Full Name:**
|
**Example — Full Name:**
|
||||||
```typescript
|
```typescript
|
||||||
// API imports from iMIS
|
// API imports from iMIS
|
||||||
@@ -51,34 +67,38 @@ badge.given_name = "Robert"
|
|||||||
badge.family_name = "Smith"
|
badge.family_name = "Smith"
|
||||||
badge.full_name = "Robert Smith" // Auto-computed
|
badge.full_name = "Robert Smith" // Auto-computed
|
||||||
|
|
||||||
// Staff edits to preferred name
|
// Staff edits to preferred name with HTML
|
||||||
badge.full_name_override = "Bob Smith"
|
badge.full_name_override = "<b>Bob</b> Smith"
|
||||||
|
|
||||||
// Display in UI
|
// Display in UI (review form)
|
||||||
display_name = badge.full_name_override || badge.full_name || "-- no name --"
|
{@html badge.full_name_override || badge.full_name || "— no name —"}
|
||||||
// Result: "Bob Smith"
|
// Result: **Bob** Smith (bold rendered)
|
||||||
|
|
||||||
|
// Edit mode shows raw HTML
|
||||||
|
<input bind:value={editable_full_name_override} />
|
||||||
|
// Shows: <b>Bob</b> Smith (editable as text)
|
||||||
|
|
||||||
// Next cron sync from iMIS
|
// Next cron sync from iMIS
|
||||||
// ✅ badge.full_name updated to "Robert J. Smith" (middle initial added)
|
// ✅ badge.full_name updated to "Robert J. Smith" (middle initial added)
|
||||||
// ✅ badge.full_name_override remains "Bob Smith" (PROTECTED)
|
// ✅ badge.full_name_override remains "<b>Bob</b> Smith" (PROTECTED)
|
||||||
// ✅ Display still shows "Bob Smith"
|
// ✅ Display still shows **Bob** Smith (bold rendered)
|
||||||
```
|
```
|
||||||
|
|
||||||
### Override Fields
|
### Override Fields
|
||||||
|
|
||||||
| Regular Field | Override Field | Purpose | Editable By |
|
| Regular Field | Override Field | Purpose | Editable By | HTML Rendering |
|
||||||
|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
| `pronouns` | `pronouns_override` | Preferred pronouns | Staff, Attendee |
|
| `pronouns` | `pronouns_override` | Preferred pronouns | Staff, Attendee | No |
|
||||||
| `professional_title` | `professional_title_override` | Job title display | Staff, Attendee |
|
| `professional_title` | `professional_title_override` | Job title display | Staff, Attendee | ✅ Yes |
|
||||||
| `full_name` | `full_name_override` | Preferred name display | Staff, Attendee |
|
| `full_name` | `full_name_override` | Preferred name display | Staff, Attendee | ✅ Yes |
|
||||||
| `affiliations` | `affiliations_override` | Organization display | Staff, Attendee |
|
| `affiliations` | `affiliations_override` | Organization display | Staff, Attendee | ✅ Yes |
|
||||||
| `phone` | `phone_override` | Phone number | Staff, Attendee |
|
| `phone` | `phone_override` | Phone number | Staff, Attendee | No |
|
||||||
| `email` | `email_override` | Contact email override | Staff only |
|
| `email` | `email_override` | Contact email override | Staff only | No |
|
||||||
| `location` | `location_override` | City/State/Country display | Staff, Attendee |
|
| `location` | `location_override` | City/State/Country display | Staff, Attendee | ✅ Yes |
|
||||||
| `badge_type` | `badge_type_override` | Badge category label text | Staff only |
|
| `badge_type` | `badge_type_override` | Badge category label text | Staff only | No |
|
||||||
| `badge_type_code` | `badge_type_code_override` | Badge access level code | Staff only |
|
| `badge_type_code` | `badge_type_code_override` | Badge access level code | Staff only | No |
|
||||||
| `registration_type` | `registration_type_override` | Registration category label text | Staff only |
|
| `registration_type` | `registration_type_override` | Registration category label text | Staff only | No |
|
||||||
| `registration_type_code` | `registration_type_code_override` | Registration category code | Staff only |
|
| `registration_type_code` | `registration_type_code_override` | Registration category code | Staff only | No |
|
||||||
|
|
||||||
> **Note:** `phone`, `phone_override`, `pronouns_override`, `registration_type`, `registration_type_code`, `registration_type_override`, `registration_type_code_override` may need to be confirmed against the DB schema via `ae_describe event_badge` and added to `properties_to_save` in `ae_events__event_badge.ts` if not already present.
|
> **Note:** `phone`, `phone_override`, `pronouns_override`, `registration_type`, `registration_type_code`, `registration_type_override`, `registration_type_code_override` may need to be confirmed against the DB schema via `ae_describe event_badge` and added to `properties_to_save` in `ae_events__event_badge.ts` if not already present.
|
||||||
|
|
||||||
@@ -204,11 +224,29 @@ editable_badge_type_code: string | null
|
|||||||
#### Badge Review Form (`ae_comp__badge_review_form.svelte`)
|
#### Badge Review Form (`ae_comp__badge_review_form.svelte`)
|
||||||
|
|
||||||
Form-based review (NOT a badge render). Used by the `/review` page.
|
Form-based review (NOT a badge render). Used by the `/review` page.
|
||||||
|
|
||||||
|
**Props:**
|
||||||
- `can_edit_fields: string[]` prop controls which fields are editable per user level
|
- `can_edit_fields: string[]` prop controls which fields are editable per user level
|
||||||
- `['*']` = administrator (all fields)
|
- `['*']` = administrator (all fields)
|
||||||
- `is_staff: boolean` prop shows/hides the source-data panel
|
- `is_staff: boolean` prop shows/hides the staff-only fields
|
||||||
- Fields show "(overridden)" label when an override value differs from the base field
|
- Fields show "(overridden)" label when an override value differs from the base field
|
||||||
|
|
||||||
|
**Features (implemented 2026-02-27):**
|
||||||
|
- **HTML Rendering**: `full_name_override`, `professional_title_override`, `affiliations_override`, and `location_override` fields render HTML markup using `{@html}` directive when viewing (not when editing)
|
||||||
|
- **Accessibility**: Text enlargement toggle button switches between text-2xl (normal) and text-4xl (enlarged) for improved readability
|
||||||
|
- **Help Modal**: Flowbite Modal component with 6 help sections (Reviewing Badge, Editing Info, Accessibility, QR Code, Lead Scanning, Assistance)
|
||||||
|
- **QR Code Display**: Generates QR code using `core_func.js_generate_qr_code()` with badge ID, supports hover zoom and click-to-expand
|
||||||
|
- **Print Status**: Shows print count, first print datetime, and last print datetime at top of form
|
||||||
|
- **Local Edit Mode**: Independent `local_edit_active` state (never writes to `$ae_loc.edit_mode`)
|
||||||
|
- **Save/Cancel**: Only changed fields sent to API; revert button for override fields
|
||||||
|
|
||||||
|
**Editable Fields:**
|
||||||
|
- Pronouns, Full Name, Professional Title, Affiliations, Phone, Location (all with override support)
|
||||||
|
- Allow Tracking checkbox (lead scanning permission)
|
||||||
|
- Staff-only: Email, Badge Type, Registration Type, Hide, Priority, Notes
|
||||||
|
- Staff-only: Options (`other_1_code` through `other_8_code`) and Tickets (`ticket_1_code` through `ticket_8_code`)
|
||||||
|
- Agree to Terms & Conditions checkbox (attendee-visible when in can_edit_fields)
|
||||||
|
|
||||||
#### Badge Review Page — Header Buttons (implemented 2026-02-27)
|
#### Badge Review Page — Header Buttons (implemented 2026-02-27)
|
||||||
|
|
||||||
| Button | Visible To | Behavior |
|
| Button | Visible To | Behavior |
|
||||||
@@ -227,14 +265,17 @@ Form-based review (NOT a badge render). Used by the `/review` page.
|
|||||||
| Review (Eye icon) | Trusted + Edit Mode only | `<a href="/review">` nav link |
|
| Review (Eye icon) | Trusted + Edit Mode only | `<a href="/review">` nav link |
|
||||||
| Email Link (Mail icon) | All if not printed; Trusted+Edit if printed | Placeholder `alert()` — email API pending |
|
| Email Link (Mail icon) | All if not printed; Trusted+Edit if printed | Placeholder `alert()` — email API pending |
|
||||||
|
|
||||||
#### Badge Review Page — Display Sections (planned, not yet built)
|
#### Badge Review Page — Display Sections (implemented 2026-02-27)
|
||||||
|
|
||||||
In addition to the editable form, the review page will display:
|
The review form (`ae_comp__badge_review_form.svelte`) displays:
|
||||||
|
|
||||||
1. **Print status** — print count + first/last print timestamps (read-only)
|
1. **Print status** ✅ — print count + first/last print timestamps (read-only, hidden if never printed)
|
||||||
2. **QR Code** — the attendee's badge QR code for scanning at the badge kiosk (for automatic badge search + print flow). QR generation code may be recoverable from the legacy AE Badge version.
|
2. **QR Code** ✅ — the attendee's badge QR code for scanning at the badge kiosk (for automatic badge search + print flow). Generated using `core_func.js_generate_qr_code()` with `obj_type: 'event_badge'` and badge ID. Supports hover zoom overlay and click-to-expand.
|
||||||
3. **Options** (`other_1_code` through `other_8_code`) — shown as `[✓] Option X` if the field has a value; hidden if empty
|
3. **Editable Fields** ✅ — all fields with access-level gating, override support, and HTML rendering for display fields
|
||||||
4. **Tickets** (`ticket_1_code` through `ticket_8_code`) — shown as `[✓] Ticket X` if the field has a value; hidden if empty
|
4. **Options** ✅ (`other_1_code` through `other_8_code`) — Staff: editable text inputs; Attendees: shown as `[✓] Option X` checkmark display only when value exists
|
||||||
|
5. **Tickets** ✅ (`ticket_1_code` through `ticket_8_code`) — Staff: editable text inputs; Attendees: shown as `[✓] Ticket X` checkmark display only when value exists
|
||||||
|
6. **Accessibility Toggle** ✅ — Font size enlargement button in sticky header (text-2xl ↔ text-4xl)
|
||||||
|
7. **Help Modal** ✅ — Attendee guidance modal with 6 sections explaining the review process, editing, QR codes, and lead scanning
|
||||||
|
|
||||||
#### Default Field Permissions (hardcoded for now — Axonius first show, mid-April 2026)
|
#### Default Field Permissions (hardcoded for now — Axonius first show, mid-April 2026)
|
||||||
|
|
||||||
@@ -723,9 +764,12 @@ None — all current badge tests passing as of 2026-02-26 (f5e98b8c).
|
|||||||
- ✅ Settings UI for `edit_permissions` per event (`ae_comp__event_settings_badges_form.svelte`)
|
- ✅ Settings UI for `edit_permissions` per event (`ae_comp__event_settings_badges_form.svelte`)
|
||||||
- ✅ All badge module icons converted to Lucide (Font Awesome removed from badge routes)
|
- ✅ All badge module icons converted to Lucide (Font Awesome removed from badge routes)
|
||||||
|
|
||||||
|
### Recently Completed (2026-02-27)
|
||||||
|
- ✅ **Badge Review Form** — `ae_comp__badge_review_form.svelte` fully implemented (fields, QR, save/cancel, options/tickets, accessibility, help modal)
|
||||||
|
- ✅ **Print font size controls (v1)** — Screen-only `[−]/[+]/[↺]` panel on print page; 4 px props added to `ae_comp__badge_obj_view.svelte`; auto-sizing unchanged when props absent
|
||||||
|
- ✅ **Bug fix** — `default_authenticated_fields` / `default_trusted_fields` in `review/+page.svelte` corrected (wrong field names caused silent save drops)
|
||||||
|
|
||||||
### Still Needed — HIGH PRIORITY (first show: April 2026)
|
### Still Needed — HIGH PRIORITY (first show: April 2026)
|
||||||
1. **Badge Review Form — actual fields:** `ae_comp__badge_review_form.svelte` is a stub. Needs full field rendering, edit inputs, save/cancel, and the display-only sections (QR code, print status, option/ticket checkmarks). See `PROJECT__AE_Events_Badges_Review_Print.md` for full spec.
|
|
||||||
2. **Badge Print Page — font size controls:** Screen-only controls to adjust font size for name, professional title, affiliations, and location sections before printing. See project brief.
|
|
||||||
|
|
||||||
### Still Needed — MEDIUM PRIORITY
|
### Still Needed — MEDIUM PRIORITY
|
||||||
1. **Email API for review links:** `send_review_email()` is a placeholder `alert()`. Needs actual email send endpoint.
|
1. **Email API for review links:** `send_review_email()` is a placeholder `alert()`. Needs actual email send endpoint.
|
||||||
|
|||||||
@@ -1,22 +1,75 @@
|
|||||||
# PROJECT: AE Events Badges — Review Form & Print Font Controls
|
# PROJECT: AE Events Badges — Review Form & Print Font Controls
|
||||||
|
|
||||||
**Created:** 2026-02-27
|
**Created:** 2026-02-27
|
||||||
|
**Last Updated:** 2026-02-27
|
||||||
**Branch:** `ae_app_3x_llm`
|
**Branch:** `ae_app_3x_llm`
|
||||||
**Priority:** HIGH — first live event is Axonius, NYC, mid-April 2026
|
**Priority:** HIGH — first live event is Axonius, NYC, mid-April 2026
|
||||||
**Owner:** Scott Idem / One Sky IT
|
**Owner:** Scott Idem / One Sky IT
|
||||||
|
**Status:** ✅ TASK 1 (Badge Review Form) COMPLETE | ✅ TASK 2 (Print Font Controls) COMPLETE — v1
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation Status (2026-02-27)
|
||||||
|
|
||||||
|
### ✅ TASK 1: Badge Review Form — COMPLETE
|
||||||
|
|
||||||
|
The badge review form (`ae_comp__badge_review_form.svelte`) is now fully functional with:
|
||||||
|
- ✅ All editable fields with access-level gating
|
||||||
|
- ✅ Print status display section
|
||||||
|
- ✅ QR code generation and display (hover zoom + click expand)
|
||||||
|
- ✅ Options and Tickets fields (staff edit / attendee view)
|
||||||
|
- ✅ Save/Cancel with change detection
|
||||||
|
- ✅ Override field revert buttons
|
||||||
|
- ✅ **HTML rendering** for full_name, professional_title, affiliations, location
|
||||||
|
- ✅ **Accessibility toggle** for text enlargement (text-2xl ↔ text-4xl)
|
||||||
|
- ✅ **Help modal** with 6 sections of attendee guidance (Flowbite Modal component)
|
||||||
|
- ✅ Local edit mode (never writes to `$ae_loc.edit_mode`)
|
||||||
|
|
||||||
|
**Bug fixed (2026-02-27):** `default_authenticated_fields` and `default_trusted_fields` in
|
||||||
|
`review/+page.svelte` had incorrect field names causing `can_edit()` to silently drop saves.
|
||||||
|
Fixed to use exact names matching the form's `can_edit()` checks.
|
||||||
|
|
||||||
|
### ✅ TASK 2: Badge Print Font Controls — COMPLETE (v1)
|
||||||
|
|
||||||
|
Implemented in commit `3d7279da`. This is a **first draft** — auto font scaling using
|
||||||
|
mm/inch units is planned as a future iteration.
|
||||||
|
|
||||||
|
**What was built:**
|
||||||
|
- `ae_comp__badge_obj_view.svelte`: 4 new optional props (`font_size_name`, `font_size_title`,
|
||||||
|
`font_size_affiliations`, `font_size_location`, all `number` in px). When provided, replaces
|
||||||
|
auto inch-based Tailwind class sizing with an inline `font-size: Npx` style. Existing
|
||||||
|
auto-sizing behavior is completely unchanged when props are absent.
|
||||||
|
- `print/+page.svelte`: Screen-only (`print:hidden`) control panel with 4 rows, one per field.
|
||||||
|
Each row: label, `[−]` button, value display (`58px` or `Auto`), `[+]` button, `[↺]` reset.
|
||||||
|
Step: 2px. `null` state = auto (uses existing inch-based auto-sizing). First `+` click
|
||||||
|
activates at a sensible default that approximates the current auto inch values.
|
||||||
|
|
||||||
|
**Default px values when first activated (≈ inch equivalents at 96dpi):**
|
||||||
|
|
||||||
|
| Field | Default px | Approx. inch | Range |
|
||||||
|
|--------------|------------|--------------|----------|
|
||||||
|
| Name | 58px | ≈ .60in | 20–80px |
|
||||||
|
| Title | 34px | ≈ .35in | 14–56px |
|
||||||
|
| Affiliations | 38px | ≈ .40in | 14–60px |
|
||||||
|
| Location | 34px | ≈ .35in | 14–56px |
|
||||||
|
|
||||||
|
**Future:** Auto font scaling using mm/inch units (physical paper stock measurements).
|
||||||
|
Will likely need to revisit the inch ↔ mm conversion and potentially expose the auto-sizing
|
||||||
|
logic as adjustable rather than replacing it with px overrides.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
The Events Badges module is mostly complete for navigation and search. Two key pieces of
|
The Events Badges module is mostly complete for navigation and search. Two key pieces of
|
||||||
functional UI remain unbuilt and are needed before the first show:
|
functional UI were needed before the first show:
|
||||||
|
|
||||||
1. **Badge Review Form** — `ae_comp__badge_review_form.svelte` is currently a stub. It
|
1. **Badge Review Form** ✅ — `ae_comp__badge_review_form.svelte` now has complete field
|
||||||
needs actual field rendering, edit inputs gated by access level, save/cancel API calls,
|
rendering, edit inputs gated by access level, save/cancel API calls, and display-only
|
||||||
and display-only sections (QR code, print status, option/ticket checkmarks).
|
sections (QR code, print status, option/ticket checkmarks). Also includes accessibility
|
||||||
|
features (text enlargement) and help modal for attendee guidance.
|
||||||
|
|
||||||
2. **Badge Print Font Controls** — The print page header needs screen-only controls
|
2. **Badge Print Font Controls** ⏳ — The print page header needs screen-only controls
|
||||||
(hidden during `window.print()`) to bump font sizes for the name, professional title,
|
(hidden during `window.print()`) to bump font sizes for the name, professional title,
|
||||||
affiliations, and location sections before printing. These only affect the `ae_comp__badge_obj_view.svelte` render — not the page layout/template structural dimensions.
|
affiliations, and location sections before printing. These only affect the `ae_comp__badge_obj_view.svelte` render — not the page layout/template structural dimensions.
|
||||||
|
|
||||||
@@ -107,7 +160,7 @@ and can be used as reference.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Section 1: Display-Only Status Bar (all access levels)
|
### Section 1: Display-Only Status Bar (all access levels) ✅ IMPLEMENTED
|
||||||
|
|
||||||
Always show at top of form. Read-only. No edit controls.
|
Always show at top of form. Read-only. No edit controls.
|
||||||
|
|
||||||
@@ -115,27 +168,35 @@ Always show at top of form. Read-only. No edit controls.
|
|||||||
Print Status: [Not yet printed] OR [Printed 3× — first: Jan 5 2026, last: Jan 5 2026]
|
Print Status: [Not yet printed] OR [Printed 3× — first: Jan 5 2026, last: Jan 5 2026]
|
||||||
```
|
```
|
||||||
|
|
||||||
Use `$lq__event_badge_obj.print_count`, `print_first_datetime`, `print_last_datetime`.
|
**Implemented:** Shows print count with first/last print datetimes. Hidden if `print_count < 1`.
|
||||||
|
Uses `$lq__event_badge_obj.print_count`, `print_first_datetime`, `print_last_datetime`.
|
||||||
Format datetimes with `ae_util.iso_datetime_formatter(dt, 'datetime_iso_12_no_seconds')`.
|
Format datetimes with `ae_util.iso_datetime_formatter(dt, 'datetime_iso_12_no_seconds')`.
|
||||||
Import `ae_util` from `$lib/ae_utils/ae_utils`.
|
Import `ae_util` from `$lib/ae_utils/ae_utils`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Section 2: QR Code (all access levels)
|
### Section 2: QR Code (all access levels) ✅ IMPLEMENTED
|
||||||
|
|
||||||
Display the attendee's badge QR code. This is the same QR code shown on the printed badge
|
Display the attendee's badge QR code. This is the same QR code shown on the printed badge
|
||||||
itself — scanning it at the badge station triggers automatic badge search and print.
|
itself — scanning it at the badge station triggers automatic badge search and print.
|
||||||
|
|
||||||
**Check the legacy AE Badge version for existing QR generation code.** Look in:
|
**Implemented using `core_func.js_generate_qr_code()`:**
|
||||||
- `src/lib/ae_events/` for any QR-related utilities
|
```typescript
|
||||||
- `ae_comp__badge_obj_view.svelte` — the badge render component almost certainly generates
|
qr_data_url = await core_func.js_generate_qr_code('obj', {
|
||||||
a QR code already for the printed badge. Reuse that logic/component if possible.
|
obj_type: 'event_badge',
|
||||||
|
obj_id: event_badge_id
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
The QR code value should encode the badge ID or a URL that resolves to the badge.
|
**Features:**
|
||||||
|
- Hover: Zoom overlay effect (`qr_hovered` state)
|
||||||
|
- Click: Expand/collapse that pushes content down (`qr_expanded` state)
|
||||||
|
- Displays as data URL image from QR code generation
|
||||||
|
- Reactive: automatically regenerates when `event_badge_id` changes
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Section 3: Editable Fields
|
### Section 3: Editable Fields ✅ IMPLEMENTED
|
||||||
|
|
||||||
Render each field as: read-only display when `!can_edit(field)`, or an `<input>` /
|
Render each field as: read-only display when `!can_edit(field)`, or an `<input>` /
|
||||||
`<select>` / `<textarea>` when `can_edit(field)`.
|
`<select>` / `<textarea>` when `can_edit(field)`.
|
||||||
@@ -143,20 +204,42 @@ Render each field as: read-only display when `!can_edit(field)`, or an `<input>`
|
|||||||
Show `(overridden)` label next to override fields when the override value differs from
|
Show `(overridden)` label next to override fields when the override value differs from
|
||||||
the base field value.
|
the base field value.
|
||||||
|
|
||||||
|
**HTML Rendering (implemented 2026-02-27):**
|
||||||
|
The following fields render HTML markup using `{@html}` when viewing (not when editing):
|
||||||
|
- `full_name_override` / `full_name`
|
||||||
|
- `professional_title_override` / `professional_title`
|
||||||
|
- `affiliations_override` / `affiliations`
|
||||||
|
- `location_override` / `location`
|
||||||
|
|
||||||
|
This allows for rich text formatting (bold, italic, line breaks, etc.) in badge displays.
|
||||||
|
|
||||||
|
**Accessibility Features (implemented 2026-02-27):**
|
||||||
|
- Text enlargement toggle button in sticky header
|
||||||
|
- Normal size: `text-2xl` on field values
|
||||||
|
- Enlarged size: `text-4xl` on field values
|
||||||
|
- Button shows visual feedback (gray → blue, "Larger" → "Normal" label)
|
||||||
|
- Applied consistently across all text fields
|
||||||
|
|
||||||
|
**Help Modal (implemented 2026-02-27):**
|
||||||
|
- Flowbite Modal component with 6 sections
|
||||||
|
- Sections: Reviewing Badge, Editing Info, Accessibility, QR Code, Lead Scanning, Assistance
|
||||||
|
- Triggered by Help button (BadgeQuestionMark icon) in sticky header
|
||||||
|
- Currently has placeholder text — can be customized per event/client
|
||||||
|
|
||||||
#### Attendee-Editable Fields (shown to all access levels with link)
|
#### Attendee-Editable Fields (shown to all access levels with link)
|
||||||
|
|
||||||
| Field | Input Type | Notes |
|
| Field | Input Type | Notes |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `pronouns_override` | text input | Fallback display: `pronouns` |
|
| `pronouns_override` | text input | Fallback display: `pronouns` |
|
||||||
| `full_name_override` | text input | Fallback display: `full_name` |
|
| `full_name_override` | text input | Fallback display: `full_name`; **renders HTML** when viewing |
|
||||||
| `professional_title_override` | text input | Fallback display: `professional_title` |
|
| `professional_title_override` | text input | Fallback display: `professional_title`; **renders HTML** when viewing |
|
||||||
| `affiliations_override` | textarea | Fallback display: `affiliations` |
|
| `affiliations_override` | textarea | Fallback display: `affiliations`; **renders HTML** when viewing |
|
||||||
| `phone_override` | text input (tel) | Fallback display: `phone` |
|
| `phone_override` | text input (tel) | Fallback display: `phone` |
|
||||||
| `location_override` | text input | Fallback display: `location` |
|
| `location_override` | text input | Fallback display: `location`; **renders HTML** when viewing |
|
||||||
| `allow_tracking` | checkbox | Label: "Allow exhibitor lead scanning" |
|
| `allow_tracking` | checkbox | Label: "Allow exhibitor lead scanning" |
|
||||||
| `agree_to_tc` | checkbox | Label: "I agree to the Terms and Conditions" + placeholder T&C text block |
|
| `agree_to_tc` | checkbox | Label: "I agree to the Terms and Conditions" + placeholder T&C text block |
|
||||||
|
|
||||||
#### Staff-Only Additional Fields (shown when `is_staff === true`)
|
#### Staff-Only Additional Fields (shown when `is_staff === true`) ✅ IMPLEMENTED
|
||||||
|
|
||||||
| Field | Input Type | Notes |
|
| Field | Input Type | Notes |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -167,7 +250,7 @@ the base field value.
|
|||||||
| `priority` | number input | |
|
| `priority` | number input | |
|
||||||
| `notes` | textarea | |
|
| `notes` | textarea | |
|
||||||
|
|
||||||
#### Staff-Only: Options & Tickets (read-edit, shown when `is_staff === true`)
|
#### Staff-Only: Options & Tickets (read-edit, shown when `is_staff === true`) ✅ IMPLEMENTED
|
||||||
|
|
||||||
**Other/Options** (`other_1_code` through `other_8_code`):
|
**Other/Options** (`other_1_code` through `other_8_code`):
|
||||||
- If field has a value: show as editable text input with label "Option X"
|
- If field has a value: show as editable text input with label "Option X"
|
||||||
@@ -177,14 +260,14 @@ the base field value.
|
|||||||
**Tickets** (`ticket_1_code` through `ticket_8_code`):
|
**Tickets** (`ticket_1_code` through `ticket_8_code`):
|
||||||
- Same pattern as options above, label "Ticket X"
|
- Same pattern as options above, label "Ticket X"
|
||||||
|
|
||||||
#### Attendee-Only: Options & Tickets (display only)
|
#### Attendee-Only: Options & Tickets (display only) ✅ IMPLEMENTED
|
||||||
|
|
||||||
When `!is_staff` and the field has a value: show `[✓] Option X` or `[✓] Ticket X`.
|
When `!is_staff` and the field has a value: show `[✓] Option X` or `[✓] Ticket X`.
|
||||||
When the field is empty: hide entirely (attendees don't see empty slots).
|
When the field is empty: hide entirely (attendees don't see empty slots).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Section 4: Terms & Conditions Block (all, only when `agree_to_tc` in can_edit_fields)
|
### Section 4: Terms & Conditions Block (all, only when `agree_to_tc` in can_edit_fields) ✅ IMPLEMENTED
|
||||||
|
|
||||||
Placeholder text for now:
|
Placeholder text for now:
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user