Loading…
: offerings.length === 0 ?None yet.
: ( +| Name | Program | Delivery | Status | Seats | |
|---|---|---|---|---|---|
| {o.name} | +{o.program_id} | +{o.delivery_mode.replace('_', ' ')} | +{o.status.replace('_', ' ')} | +{o.capacity === null ? 'unlimited' : `${o.reserved_seats}/${o.capacity}`} | ++ |
Loading…
: ( + <> +{offering.description || 'No description.'}
+Program: {offering.program_id} — Delivery: {offering.delivery_mode.replace('_', ' ')} — Seats: {offering.capacity === null ? 'unlimited' : `${offering.reserved_seats} / ${offering.capacity}`}
+ {canAuthor && (OFFERING_TRANSITIONS[offering.status] || []).length > 0 && ( +Loading…
: ( + <> ++ {readiness.ready_to_open_registration ? 'Ready to open registration' : 'Not yet ready'} +
+Loading…
: agreementReqs.length === 0 ?None configured — registrations can convert without any agreement acceptance.
: ( +Loading…
: registrations.length === 0 ?None yet.
: ( +| Registrant | Type | Status | |
|---|---|---|---|
| {r.registrant_display_name} | +{r.is_minor ? 'minor (guardian)' : 'adult'} | +{r.status.replace('_', ' ')} | ++ |
Loading…
: ( + <> +{notice}
} + +Type: {reg.is_minor ? 'Minor (guardian-registered)' : 'Adult (self-registered)'}
+ {reg.registrant_email &&Contact: {reg.registrant_email}
} + {reg.readiness_notes &&Readiness notes: {reg.readiness_notes}
} + {canAuthor && (REG_TRANSITIONS[reg.status] || []).length > 0 && ( +Loading…
: agreementStatus.required.length === 0 ?No agreements required for this offering.
: ( +Loading…
: notifs.length === 0 ?None sent yet.
: ( +| Type | To | Status | Sent |
|---|---|---|---|
| {n.notification_type.replace(/_/g, ' ')} | +{n.recipient_email_masked || '—'} | +{n.status} | +{n.sent_at ? new Date(n.sent_at).toLocaleString() : '—'} | +