fix(campaigns): complete ACTION_LABELS map and timeline cache invalidation

Adds the 4 backend-logged campaign actions missing from ACTION_LABELS
(delete_campaign, generate_campaign, schedule_campaign,
recurring_campaign_run), and wires campaign-timeline invalidation into
the remaining audit-logging mutations on the page (complete, schedule,
approve/reject modification request) so the timeline panel updates
live instead of only on next reload, consistent with submit/approve/
reject campaign.
This commit is contained in:
kitos
2026-07-03 17:25:15 +02:00
parent 83b4d2578a
commit 164ef25393
2 changed files with 8 additions and 0 deletions
@@ -17,6 +17,10 @@ const ACTION_LABELS: Record<string, string> = {
request_campaign_modification: "Modification requested", request_campaign_modification: "Modification requested",
approve_campaign_modification: "Modification approved", approve_campaign_modification: "Modification approved",
reject_campaign_modification: "Modification rejected", reject_campaign_modification: "Modification rejected",
delete_campaign: "Campaign deleted",
generate_campaign: "Generated from threat actor",
schedule_campaign: "Schedule updated",
recurring_campaign_run: "Recurring run executed",
}; };
export default function CampaignAuditTimeline({ entries, isLoading }: Props) { export default function CampaignAuditTimeline({ entries, isLoading }: Props) {
@@ -140,6 +140,7 @@ export default function CampaignDetailPage() {
mutationFn: () => completeCampaign(campaignId!), mutationFn: () => completeCampaign(campaignId!),
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["campaign", campaignId] }); queryClient.invalidateQueries({ queryKey: ["campaign", campaignId] });
queryClient.invalidateQueries({ queryKey: ["campaign-timeline", campaignId] });
showToast("Campaign completed", "success"); showToast("Campaign completed", "success");
}, },
onError: (err: Error) => showToast(err.message, "error"), onError: (err: Error) => showToast(err.message, "error"),
@@ -159,6 +160,7 @@ export default function CampaignDetailPage() {
scheduleCampaign(campaignId!, payload), scheduleCampaign(campaignId!, payload),
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["campaign", campaignId] }); queryClient.invalidateQueries({ queryKey: ["campaign", campaignId] });
queryClient.invalidateQueries({ queryKey: ["campaign-timeline", campaignId] });
showToast("Schedule updated", "success"); showToast("Schedule updated", "success");
}, },
onError: (err: Error) => showToast(err.message, "error"), onError: (err: Error) => showToast(err.message, "error"),
@@ -199,6 +201,7 @@ export default function CampaignDetailPage() {
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["campaign", campaignId] }); queryClient.invalidateQueries({ queryKey: ["campaign", campaignId] });
queryClient.invalidateQueries({ queryKey: ["campaign-modification-requests", campaignId] }); queryClient.invalidateQueries({ queryKey: ["campaign-modification-requests", campaignId] });
queryClient.invalidateQueries({ queryKey: ["campaign-timeline", campaignId] });
showToast("Modification approved and applied", "success"); showToast("Modification approved and applied", "success");
}, },
onError: (err: Error) => showToast(err.message, "error"), onError: (err: Error) => showToast(err.message, "error"),
@@ -209,6 +212,7 @@ export default function CampaignDetailPage() {
rejectModificationRequest(requestId, notes), rejectModificationRequest(requestId, notes),
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["campaign-modification-requests", campaignId] }); queryClient.invalidateQueries({ queryKey: ["campaign-modification-requests", campaignId] });
queryClient.invalidateQueries({ queryKey: ["campaign-timeline", campaignId] });
showToast("Modification rejected", "success"); showToast("Modification rejected", "success");
}, },
onError: (err: Error) => showToast(err.message, "error"), onError: (err: Error) => showToast(err.message, "error"),