From 06c913955c2692b4cde77fd53e90a52ad86d1cb4 Mon Sep 17 00:00:00 2001 From: kitos Date: Mon, 20 Jul 2026 16:18:27 +0200 Subject: [PATCH] fix(campaigns,ui): remove admin from campaign-from-threat-actor gate, bump red/blue label saturation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ThreatActorDetailPage wrongly let admins see/click 'Generate Campaign' — the backend already rejects admin there (require_any_role_strict), but the button was still shown, exposing a dead-end action. Now matches CampaignsPage's own admin-excluded gate. - Red/blue team badges (role pills, team tabs, assignee controls, test state badges) bumped from -400 text/-900/50 bg to -500 text/-900/70 bg for more saturated, readable team colors. --- frontend/src/components/test-detail/AssigneeControl.tsx | 4 ++-- frontend/src/components/test-detail/TeamTabs.tsx | 4 ++-- frontend/src/components/test-detail/TestDetailHeader.tsx | 6 +++--- frontend/src/pages/ThreatActorDetailPage.tsx | 3 +-- frontend/src/pages/UsersPage.tsx | 8 ++++---- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/test-detail/AssigneeControl.tsx b/frontend/src/components/test-detail/AssigneeControl.tsx index 2838a6d..a67e802 100644 --- a/frontend/src/components/test-detail/AssigneeControl.tsx +++ b/frontend/src/components/test-detail/AssigneeControl.tsx @@ -24,8 +24,8 @@ interface Props { } const SIDE_STYLE = { - red: "border-red-500/40 bg-red-900/20 text-red-400 hover:bg-red-900/40", - blue: "border-blue-500/40 bg-blue-900/20 text-blue-400 hover:bg-blue-900/40", + red: "border-red-500/40 bg-red-900/20 text-red-500 hover:bg-red-900/40", + blue: "border-blue-500/40 bg-blue-900/20 text-blue-500 hover:bg-blue-900/40", }; const ELIGIBLE_ROLES: Record<"operator" | "reviewer", Record<"red" | "blue", string[]>> = { diff --git a/frontend/src/components/test-detail/TeamTabs.tsx b/frontend/src/components/test-detail/TeamTabs.tsx index 61a6795..763b594 100644 --- a/frontend/src/components/test-detail/TeamTabs.tsx +++ b/frontend/src/components/test-detail/TeamTabs.tsx @@ -43,8 +43,8 @@ const TABS: { key: TabKey; label: string; icon: React.ReactNode }[] = [ ]; const TAB_COLORS: Record = { - red: "border-red-500 text-red-400", - blue: "border-blue-500 text-blue-400", + red: "border-red-500 text-red-500", + blue: "border-blue-500 text-blue-500", summary: "border-cyan-500 text-cyan-400", timeline: "border-gray-500 text-gray-400", }; diff --git a/frontend/src/components/test-detail/TestDetailHeader.tsx b/frontend/src/components/test-detail/TestDetailHeader.tsx index 29efc2b..ddf3b97 100644 --- a/frontend/src/components/test-detail/TestDetailHeader.tsx +++ b/frontend/src/components/test-detail/TestDetailHeader.tsx @@ -52,13 +52,13 @@ const STATE_INDEX: Record = { const STATE_BADGE: Record = { draft: "bg-gray-800/50 text-gray-400 border-gray-600/30", - red_executing: "bg-red-900/50 text-red-400 border-red-500/30", + red_executing: "bg-red-900/70 text-red-500 border-red-500/40", red_review: "bg-amber-900/50 text-amber-400 border-amber-500/30", - blue_evaluating: "bg-blue-900/50 text-blue-400 border-blue-500/30", + blue_evaluating: "bg-blue-900/70 text-blue-500 border-blue-500/40", blue_review: "bg-purple-900/50 text-purple-400 border-purple-500/30", in_review: "bg-blue-900/50 text-blue-400 border-blue-500/30", validated: "bg-green-900/50 text-green-400 border-green-500/30", - rejected: "bg-red-900/50 text-red-400 border-red-500/30", + rejected: "bg-red-900/70 text-red-500 border-red-500/40", disputed: "bg-amber-900/50 text-amber-400 border-amber-500/30", }; diff --git a/frontend/src/pages/ThreatActorDetailPage.tsx b/frontend/src/pages/ThreatActorDetailPage.tsx index 0e5da96..757d895 100644 --- a/frontend/src/pages/ThreatActorDetailPage.tsx +++ b/frontend/src/pages/ThreatActorDetailPage.tsx @@ -107,8 +107,7 @@ export default function ThreatActorDetailPage() { const queryClient = useQueryClient(); const { user } = useAuth(); - const canGenerate = - user?.role === "admin" || user?.role === "red_lead" || user?.role === "blue_lead"; + const canGenerate = user?.role === "red_lead" || user?.role === "blue_lead"; // ── Campaign generation modal state ───────────────────────────── const [showCampaignModal, setShowCampaignModal] = useState(false); diff --git a/frontend/src/pages/UsersPage.tsx b/frontend/src/pages/UsersPage.tsx index 1c1ef4e..ae344e5 100644 --- a/frontend/src/pages/UsersPage.tsx +++ b/frontend/src/pages/UsersPage.tsx @@ -33,10 +33,10 @@ const ROLES = [ const roleBadgeColors: Record = { admin: "bg-purple-900/50 text-purple-400 border-purple-500/30", - red_tech: "bg-red-900/50 text-red-400 border-red-500/30", - blue_tech: "bg-blue-900/50 text-blue-400 border-blue-500/30", - red_lead: "bg-red-900/50 text-red-400 border-red-500/30", - blue_lead: "bg-blue-900/50 text-blue-400 border-blue-500/30", + red_tech: "bg-red-900/70 text-red-500 border-red-500/40", + blue_tech: "bg-blue-900/70 text-blue-500 border-blue-500/40", + red_lead: "bg-red-900/70 text-red-500 border-red-500/40", + blue_lead: "bg-blue-900/70 text-blue-500 border-blue-500/40", manager: "bg-amber-900/50 text-amber-400 border-amber-500/30", viewer: "bg-gray-800/50 text-gray-400 border-gray-600/30", };