Appearance
Code review β admin UI batch β
- Branch:
feature/empty-state-componentβmaster - Date: 2026-06-23
- Scope: 25 commits, 63 files (+1517 / β247)
- Reviewer: code-reviewer agent over
git diff origin/master...HEAD, synthesized.
Deterministic gate β
| Check | Result |
|---|---|
nx lint web | β 0 errors (13 warnings, baseline) |
nx test web | β 174 passed |
| coverage gate | β statements 77.5% Β· functions 69.0% Β· lines 82.6% (all β₯ threshold) |
nx build web | β |
nx lint/test/build api | β |
What's in the batch β
<ds-empty-state> (adopted everywhere) Β· ds-table reduced to a bare grid + new <ds-list-header> ([schema]+[store], two-way [(search)], (create)) Β· list-page header/empty-state create pattern Β· proposals/pulse form rework + .adm-mform + validation (border + reserved left-aligned message on blur/submit) on ngModel forms and the manual entity modal Β· ai-config tidy-up + .adm-toggle-list Β· emptyListInterceptor (nullβ[]) Β· notifications bell dropdown Β· husky pre-push hook Β· workflow paths-ignore + advanced codeql.yml.
Findings β
π΄ Blocking β
None.
π‘ Should-fix β
nodes-page.htmlempty-state overlaps the add form β the@emptyblock wasn't gated on!adding(), so an empty list + open form rendered both. FIXED β wrapped in@if (!adding()), matching pulse/proposals.paths-ignorevs required status checks (conditional) β ifci/Analyze (go)/Analyze (javascript-typescript)are required in branch protection, a docs-only PR skips them and the required check stays pending forever (can't merge). OPEN β verify branch-protection config; mitigations: keep docs bundled with code (current practice), make the checks non-required, or add a same-named always-green stub for the ignored case.
π’ Nits β
- "New" vs "Add" verb β the
"Add"relabel hit the submit buttons; the header create button and grid empty-state button still say "New {singular}". These are entry points (open the form/modal) vs the submit action, so arguably correct β OPEN decision: unify to "Add" if desired. - Inline-edit asterisk β the modal dropped the required
*; the ds-table inline-edit row still renders it (ds-table.component.html). Inline edit has no border+message validation, so the*is its only required indicator β left as-is pending a decision. - Spec whitespace β double blank line in
ds-table.component.spec.tswherebuttonByTextwas removed. FIXED.
Areas verified clean β
Interceptor (GET + Dispatch-API only, literal-null only, single-resource GETs untouched, all 4 branches tested) Β· two-way [(search)] modelβsignal wiring on all 6 pages Β· resetPageOnSearch / modal resetValidation effects (untracked writes, reseed on reopen) Β· canCreate/canDelete/editExternal honored in header + grid empty state (no capability regression) Β· EmptyState imports present everywhere Β· notif dropdown stacking (scrim z300 / panel z320) Β· CSS mirrored to v2 bespoke.css (only the notif change intentionally diverges, with a NOTE) Β· husky hook mirrors CI Β· Go router reorder is a pure goimports sort.
Verdict β
Safe to push β 0 blocking. Two should-fixes resolved in-branch (nodes overlap, spec whitespace); the paths-ignore/required-checks interaction is the one open item to confirm before relying on docs-only skips. Nits 3β4 are open style decisions.