Skip to content

feat(action-center): action center from the October 2026 redesign (#902) - #927

Merged
alex-dembele merged 3 commits into
masterfrom
feat/902-action-center
Oct 9, 2026
Merged

alex-dembele merged 3 commits into
masterfrom
feat/902-action-center

Conversation

@alex-dembele

Copy link
Copy Markdown
Member

Third screen of the redesign epic (#899). Stacked on #926 (dashboard), itself on #925 (shell): the base is feat/901-dashboard, so the diff shows only this issue.

What changes for the user

The Action Center now looks and reads like the mockup: a sentence with how much is waiting and how much is late, kind chips with counts, the work grouped by deadline (overdue, this week, later, no date), and on each row the type's tile, the title, a facts line ("Vulnérabilité · KEV · SLA dépassé · CVE-2025-55241 · Contrôleur de domaine AD"), the due pill, one verb (Ouvrir, Examiner, Valider, Revoir, Renouveler, Relancer) and a tick where the work can be finished from the list.

Owner decisions (2026-10-08) built in

  • The tick does the real work, after a 5 s undo window, through the record's own endpoint: mitigation to Done, finding to Remediated, incident to Resolved, remediation plan to Completed. Approvals, critical risks, evidence and vendor follow-ups need a judgement and have no tick.
  • Organisation admins and owners see every category of the tenant. Before, an admin with no business role saw only their approvals, which is why the list was empty on a fresh tenant.
  • Every finding has a remediation deadline: first seen + 7 / 14 / 30 / 60 days by severity, at most 14 days for a KEV flaw (CISA BOD 22-01). Migration 0070 adds sla_due_at and backfills it; a save hook keeps it in step with severity.

Backend

  • Three new categories: vulnerability_sla (deadline passed or within 7 days), vendor_followup (questionnaire unanswered past or near its due date, titled with the vendor name, vendor matched on the tenant), mitigation_review (plans in REVIEW).
  • meta on each item: facts only (status, severity, CVE, asset, KEV, sent date), never a sentence. OpenAPI contract updated, TS types regenerated. The regeneration also picks up schema changes that were already on master but not in the generated file.
  • Role mapping: security analyst and DSI get vulnerability deadlines; risk manager and compliance officer get vendor follow-ups. The existing ratchet (no role is shown a category it cannot open) covers the new ones.
  • Fix: open incidents are read as open or in_progress. The query looked for investigating, which the incident API never writes, so incidents under way were missing.

Verified

  • go test ./...: all packages pass, including new use-case tests (admin sees all, meta and links, role perimeters) and repository tests for the three new queries with a second tenant seeded.
  • npx tsc -b --noEmit clean, npx vitest run 111 files / 1008 tests, lint at its ceiling (96).
  • Live on Postgres with the design dataset: migration 0070 applied and backfilled, 14 actions grouped as in the mockup in dark and light, the tick on a vulnerability hid the row, offered "Annuler", and 5 s later the row in Postgres read remediated. 414 px without overflow, axe on main 0 serious/critical in both themes.

Not done here

Closes #902

The redesigned queue and the action center show how long is left to fix
each finding, and nothing held that date. sla_due_at is the first-seen
date plus the owner's default window for the severity (critical 7 days,
high 14, medium 30, low 60), capped at 14 days for a KEV-listed flaw as
in CISA BOD 22-01. A save hook recomputes it, so a severity change moves
it; migration 0070 adds the column and backfills existing rows.
Informational findings get no deadline unless they are on the KEV list.

Signed-off-by: alex-dembele <alexandredembele16@gmail.com>
…eviews (#902)

The redesigned action center lists the work an RSSI actually chases, and
three kinds of it had no source here:

- vulnerability_sla: open findings whose remediation deadline has passed
  or falls within the week, earliest first, KEV first at equal deadline;
- vendor_followup: questionnaires sent and unanswered past or near their
  due date, titled with the vendor's name (the vendor is matched on the
  tenant too);
- mitigation_review: plans waiting for someone to validate them.

Organisation admins and owners now see every category of the tenant
(owner decision); before, an admin with no business role saw only their
own approvals, an empty list. Security analysts and the DSI get the
vulnerability deadlines, risk managers and compliance officers the vendor
follow-ups. The ratchet that no role is shown a category it cannot open
covers the three new ones.

Each item now carries a meta map of facts (status, severity, CVE, asset,
KEV) so the row can word them, and the status is what lets the client
complete and undo. Open incidents now include the in_progress status the
incident API writes; only 'investigating', which nothing writes, was
read before.

Signed-off-by: alex-dembele <alexandredembele16@gmail.com>
…design (#902)

One column at 1000 px: how much is waiting and how much is late, kind
chips with their counts (approvals, vulnerabilities, risks and plans,
compliance, third parties, and incidents when there are some), then the
work grouped by deadline: overdue, this week, later, no date. Within a
group the server's order stands.

Each row has the type's tile, the record's title, a line of facts worded
from the server's meta (KEV, SLA breached, CVE, asset, days without a
vendor answer), the due pill, one verb that opens the record and, when
the work can be finished from the list, a tick. The tick does the real
work after a 5 s undo window, through the record's own endpoint
(mitigation to Done, finding to Remediated, incident to Resolved,
remediation plan to Completed); approvals, critical risks, evidence and
vendors have none (owner decision).

The page reads the API's full 100-item page so the chips and groups
count everything; the pager takes over past that. The deep-link guard
and its tests are unchanged, and the dashboard's priority list shares
the icons, wording and due pill. useSoftDelete takes a failure message,
so a failed completion no longer says the delete failed. The generated
API types are regenerated from docs/openapi.yaml, which also brings in
schema changes already on master.

Signed-off-by: alex-dembele <alexandredembele16@gmail.com>
Base automatically changed from feat/901-dashboard to master October 9, 2026 08:55
@alex-dembele alex-dembele self-assigned this Oct 9, 2026
@alex-dembele alex-dembele reopened this Oct 9, 2026
@alex-dembele
alex-dembele merged commit 08fd74e into master Oct 9, 2026
13 of 25 checks passed
@alex-dembele
alex-dembele deleted the feat/902-action-center branch October 9, 2026 08:58
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.

feat(frontend): action center on the redesign layout

1 participant