From f19d10e19c0b3adfe1002b6ed27f3787c9ceea6e Mon Sep 17 00:00:00 2001 From: kitos Date: Fri, 3 Jul 2026 14:56:14 +0200 Subject: [PATCH] feat(campaigns): remove lead-set start dates, add pending-approval filter --- frontend/src/pages/CampaignsPage.tsx | 56 ++-------------------------- 1 file changed, 4 insertions(+), 52 deletions(-) diff --git a/frontend/src/pages/CampaignsPage.tsx b/frontend/src/pages/CampaignsPage.tsx index 74de7d1..71719bd 100644 --- a/frontend/src/pages/CampaignsPage.tsx +++ b/frontend/src/pages/CampaignsPage.tsx @@ -17,6 +17,7 @@ import { useAuth } from "../context/AuthContext"; const statusColors: Record = { draft: "bg-gray-800/50 text-gray-400 border-gray-600/30", + pending_approval: "bg-amber-900/50 text-amber-400 border-amber-500/30", active: "bg-cyan-900/50 text-cyan-400 border-cyan-500/30", completed: "bg-green-900/50 text-green-400 border-green-500/30", archived: "bg-gray-800/50 text-gray-500 border-gray-700/30", @@ -49,13 +50,11 @@ export default function CampaignsPage() { const [showCreateForm, setShowCreateForm] = useState(false); const [showActorSelector, setShowActorSelector] = useState(false); const [actorSearch, setActorSearch] = useState(""); - const [actorStartDate, setActorStartDate] = useState(""); const [newCampaign, setNewCampaign] = useState({ name: "", description: "", type: "custom", target_platform: "", - start_date: "", }); const canCreate = user?.role === "admin" || user?.role === "red_lead" || user?.role === "blue_lead"; @@ -75,7 +74,7 @@ export default function CampaignsPage() { onSuccess: (campaign) => { queryClient.invalidateQueries({ queryKey: ["campaigns"] }); setShowCreateForm(false); - setNewCampaign({ name: "", description: "", type: "custom", target_platform: "", start_date: "" }); + setNewCampaign({ name: "", description: "", type: "custom", target_platform: "" }); navigate(`/campaigns/${campaign.id}`); }, }); @@ -88,12 +87,10 @@ export default function CampaignsPage() { }); const generateMutation = useMutation({ - mutationFn: (actorId: string) => - generateCampaignFromThreatActor(actorId, actorStartDate ? { start_date: actorStartDate } : undefined), + mutationFn: (actorId: string) => generateCampaignFromThreatActor(actorId), onSuccess: (campaign) => { queryClient.invalidateQueries({ queryKey: ["campaigns"] }); setShowActorSelector(false); - setActorStartDate(""); navigate(`/campaigns/${campaign.id}`); }, }); @@ -170,6 +167,7 @@ export default function CampaignsPage() { > + @@ -228,29 +226,6 @@ export default function CampaignsPage() { - - {/* Start date */} -
- - setNewCampaign((c) => ({ ...c, start_date: e.target.value }))} - className="w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-gray-300 focus:border-cyan-500 focus:outline-none [color-scheme:dark]" - /> - {newCampaign.start_date && ( -

- - Tests won't be queued until {new Date(newCampaign.start_date + "T00:00:00").toLocaleDateString("en-GB", { day: "numeric", month: "long", year: "numeric" })}. Manual activation before that date is blocked. -

- )} -
- {/* Start date */} -
- - setActorStartDate(e.target.value)} - className="w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-gray-300 focus:border-cyan-500 focus:outline-none [color-scheme:dark]" - /> - {actorStartDate && ( -

- - Tests won't be queued until {new Date(actorStartDate + "T00:00:00").toLocaleDateString("en-GB", { day: "numeric", month: "long", year: "numeric" })} -

- )} -
- {/* Actor list */}
{isLoadingActors ? (