feat(ui): consolidate finding lists on mounted surfaces [SPRINT-020]
Replace bespoke finding list in findings-container and inline table in release-detail security tab with shared FindingListComponent and FindingRowComponent using data adapters for type bridging. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# Orphan Finding List Consolidation
|
||||
|
||||
Sprint: SPRINT_20260308_020_FE_orphan_finding_list_consolidation
|
||||
|
||||
## Summary
|
||||
|
||||
Revived the dormant shared `FindingListComponent` and `FindingRowComponent` by adopting them on two mounted surfaces that previously used bespoke finding list rendering:
|
||||
|
||||
1. **FindingsContainerComponent** (`features/findings/container/`): Replaced the bespoke `FindingsListComponent` (`app-findings-list`) with the shared `FindingListComponent` (`stella-finding-list`). Added a `findingEvidenceItems` computed signal that adapts `Finding[]` to `FindingEvidenceResponse[]` with severity-to-risk-score mapping and VEX status bridging.
|
||||
|
||||
2. **ReleaseDetailComponent** (`features/release-orchestrator/releases/release-detail/`): Replaced the bespoke inline HTML `<table>` on the security-inputs tab with the shared `FindingListComponent`. Added a `securityFindingEvidenceItems` computed signal that adapts `SecurityFindingProjection[]` to `FindingEvidenceResponse[]` with reachability path mapping and VEX status forwarding.
|
||||
|
||||
## Mounted hosts
|
||||
|
||||
| Widget | Host component | Route context | Adoption type |
|
||||
|---|---|---|---|
|
||||
| FindingListComponent + FindingRowComponent | FindingsContainerComponent | `/security/findings` (detail view) | Replaces bespoke `app-findings-list` |
|
||||
| FindingListComponent + FindingRowComponent | ReleaseDetailComponent | `/releases/:releaseId` (security-inputs tab) | Replaces bespoke inline `<table>` |
|
||||
|
||||
## Exclusions
|
||||
|
||||
| Surface | Reason |
|
||||
|---|---|
|
||||
| `FindingsDetailPageComponent` (`features/triage/components/findings-detail-page/`) | Card-based layout with triage lane toggle, gated buckets, and gating reason filter. Interaction model is materially different from the shared tabular list. |
|
||||
| `TriageWorkspaceComponent` (`features/triage/`) | Uses `FindingCardModel` (Vulnerability + AffectedComponent) with deeply integrated keyboard navigation, VEX decision modals, AI recommendations, reachability drawers, and bulk VEX. Interaction model is materially different. |
|
||||
| `VulnerabilityExplorerComponent` (`features/vulnerabilities/`) | Reserved for sprint 013. Explicitly excluded per sprint scope. |
|
||||
|
||||
## Data contracts
|
||||
|
||||
- `FindingEvidenceResponse` (from `triage-evidence.models.ts`): The shared list's primary input type.
|
||||
- `Finding` (from `findings-list.component.ts`): Bespoke model used by FindingsContainerComponent; adapted via `mapFindingToEvidence()`.
|
||||
- `SecurityFindingProjection` (inline in `release-detail.component.ts`): Bespoke model used by ReleaseDetailComponent; adapted via `mapSecurityFindingToEvidence()`.
|
||||
|
||||
## Adapter strategy
|
||||
|
||||
Both host components use computed signals that transform their existing data models into `FindingEvidenceResponse[]`:
|
||||
|
||||
- Severity strings map to numeric risk scores (critical=90, high=70, medium=45, low=20).
|
||||
- Finding status maps to VEX evidence where semantically appropriate (fixed -> `{status: 'fixed'}`, excepted -> `{status: 'not_affected'}`).
|
||||
- Reachability booleans map to `reachable_path` arrays.
|
||||
- Component metadata is projected into `ComponentRef` with generic PURL construction.
|
||||
|
||||
## Test coverage
|
||||
|
||||
- `findings-container-finding-list-adoption.component.spec.ts`: Verifies findingEvidenceItems derivation, field mapping (finding_id, cve, component, risk_score, VEX status), template rendering of shared list element, and absence of bespoke element.
|
||||
- `release-detail-finding-list-adoption.component.spec.ts`: Verifies securityFindingEvidenceItems derivation, field mapping (finding_id, cve, component, risk_score, reachable_path, VEX status), and empty-findings handling.
|
||||
|
||||
## Files changed
|
||||
|
||||
- `src/Web/StellaOps.Web/src/app/features/findings/container/findings-container.component.ts`
|
||||
- `src/Web/StellaOps.Web/src/app/features/release-orchestrator/releases/release-detail/release-detail.component.ts`
|
||||
- `src/Web/StellaOps.Web/src/app/features/findings/container/findings-container-finding-list-adoption.component.spec.ts` (new)
|
||||
- `src/Web/StellaOps.Web/src/app/features/release-orchestrator/releases/release-detail/release-detail-finding-list-adoption.component.spec.ts` (new)
|
||||
Reference in New Issue
Block a user