wulf-pulse/components/phishing
lorentz 1a7a5922fe feat(22-05): remediate + mark-false-positive + permission/resolved gating (REVIEW-06, D-05, D-06)
- Add GatedButton: buttons stay in the DOM (D-05) always, wrapped in a
  Tooltip explanation when disabled
- Gate all three actions with hasPermission(role, 'phishing', 'approve'|
  'remediate') from lib/permissions.ts — the identical check the server
  routes enforce, never a bespoke role === 'admin' string check (REVIEW-06)
- Derive resolved = campaignStatus === 'false_positive' OR any completed
  remediation_actions row; resolved-state tooltip mirrors the completed
  action's approver/date or the campaign's updated_at
- Remediate: AlertDialog confirmation listing approved action count/types,
  then POST /remediate (no body), refetch on success
- Mark as false positive: AlertDialog with optional reason Textarea, then
  POST /mark-false-positive { reason? }; disabled reason mirrors the
  server's 409 guard exactly (approved/completed remediation blocks it)
2026-07-16 14:42:05 -04:00
..
action-area-card.tsx feat(22-05): remediate + mark-false-positive + permission/resolved gating (REVIEW-06, D-05, D-06) 2026-07-16 14:42:05 -04:00
classification-card.tsx feat(22-04): add ClassificationCard read-only verdict display 2026-07-16 14:27:29 -04:00
evidence-card.tsx feat(22-03): add EvidenceCard tabbed EML evidence display (REVIEW-03) 2026-07-16 14:29:34 -04:00
timeline-card.tsx feat(22-04): add TimelineCard chronological event renderer 2026-07-16 14:29:15 -04:00
url-list.tsx feat(22-03): add tooltip primitive + inert UrlList component (D-09) 2026-07-16 14:27:11 -04:00