Skip to content

AR register

The AR register is the spine of the supervision regime. It renders at /demo/principal/register and shows every AR the principal firm supervises — fixture-set ARs plus any draft appointments still inside their PS22/11 thirty-day notification window. Filter, search, sort, drill in. Multi-select for bulk actions. Export the result to CSV when an auditor asks. Primary CTA in the header lands you in the appointment wizard.

Live: lending-agent-oversight.vercel.app/demo/principal/register.

A header strip with primary CTA, a filter bar, the table, an empty-state surface when filters return nothing, and a sticky bulk-action bar that appears when one or more rows are selected.

  • Page title AR register.
  • Skin name and rubric code (Heritage Mortgage Network · MCOB rubric) in muted small caps.
  • One-line subtitle: “Filter, sort, and drill into any AR. The register the FCA expects you to keep, in a shape that doesn’t go stale.”
  • Right-side primary CTA: + Appoint a new AR or IAR at size="lg", brand-coloured. Routes to /demo/principal/register/new.

A horizontal row of inputs above the table.

  • Search. Free-text input (Search trading name, FRN, city…). Matches trading name, legal name, FRN, and city. Client-side filter applied on every keystroke.
  • Status. Single-select dropdown: All statuses, Pending appointment, Active, Suspended, Under investigation, Terminated.
  • Risk band. Single-select dropdown: All risk bands, Critical, High, Elevated, Moderate, Low.
  • Export CSV. Button on the right of the filter bar. Downloads the current filtered set with trading name, FRN, type, status, risk score, last review date, primary contact (production: REP025-staging schema).

A counter line below shows Showing N of M ARs.

ColumnNotes
SelectPer-row checkbox. Header carries select-all-visible. Stops row navigation on click.
Trading nameBold; primary-contact name in muted text below.
FRNTabular-nums monospace, hidden < 640px. “Via principal” for IARs.
TypeAR / IAR in uppercase tracked-out.
ScoreRight-aligned, bold tabular-nums (rounded).
BandRiskBandBadge (severity-coloured chip).
StatusStatus badge, hidden < 768px.
CityHidden < 1024px.
Trailing ArrowUpRight icon to signal drill-in affordance.

Rows that need attention carry a 3px left-edge inset box-shadow rail in a semantic colour:

StatusRail colour
pending-appointmentvar(--brand-primary) (skin’s brand colour) — makes the freshly-appointed AR unmistakable while in the 30-day window
under-investigationvar(--destructive)
suspended, terminatedvar(--muted-foreground)
activeno rail

The pattern scales to any future status without re-styling the row body. Selection state adds a bg-foreground/[0.04] tint via data-selected="true".

Default sort is two-tier:

  1. pending-appointment rows float to the top so the freshly-appointed AR is immediately visible.
  2. The rest sort by riskScore descending.

Clicking a column header re-sorts on that field (planned). Sort state is not yet URL-encoded; that’s flagged for v2.

Selecting any rows reveals a sticky black-pill bar centred at the bottom of the viewport, animated in over 220ms (y: 24 → 0, opacity fade). The bar carries:

  • N selected counter
  • Schedule review — opens a modal explaining that a file-review task will be added to the principal-compliance queue for each selected AR, honouring the firm’s review programme rules.
  • Send reminder — opens a modal explaining that a required-action notification will land on each AR’s home surface (in-product action + email in production).
  • Export CSV — opens a modal naming the REP025-staging schema and the columns it produces.
  • × — clear selection.

Each confirmation is a standard Dialog. The action commits, the selection clears, and the bar slides back out. In production each bulk action writes one AuditEvent per AR plus one parent BulkAction event so the trail is reproducible.

The register has two distinct empty states, both anchored in the empty-state component pattern (icon, headline, body copy, CTA):

Headline: “No ARs match these filters”. Body: “Try clearing the filter or broaden the risk band.” CTA: Clear all filters (secondary). Icon: Search.

Reached when no ARs are on the register at all (not possible in shipped fixtures; the production state for a fresh tenant). Headline: “No ARs on the register yet”. Body: “Appoint your first AR or IAR. Companies House, CreditSafe, and the FCA Register will populate the record automatically.” CTA: + Appoint a new AR or IAR (primary). Icon: Plus.

The network-empty state is sales-friendly: it points the reader at the appointment flow and reinforces the auto-enrichment promise.

  • Mobile (< 640px). Filter bar collapses; FRN, Status, City columns hide. Bulk-action bar centres on the bottom edge with max-w-[calc(100vw-2rem)].
  • Tablet (640-1024px). FRN and Status visible; City hidden.
  • Desktop (> 1024px). Full table; max content width 1280px.
  • app/demo/principal/register/page.tsx (page shell with the appointment CTA)
  • components/principal/ar-register-table.tsx (table, filters, bulk action bar, empty states, all in one file)
  • components/principal/risk-band-badge.tsx
  • Click any row to land on AR detail.
  • The Critical band filter is one click to reach the highest-risk ARs.
  • The KPI tiles on the principal home deep-link into pre-filtered views (e.g. the headline Open the critical-band cohort link routes here with ?band=critical).
  • The + Appoint a new AR or IAR button routes into the appointment wizard, which appends a pending-appointment AR to the top of this list on submission.
  • The Manage AR menu on the AR detail can suspend or terminate the AR, transitioning the row into the destructive or muted rail style.