Files
prowler/ui/lib/jira-dispatch-action.ts
2026-07-22 20:23:13 +02:00

75 lines
2.2 KiB
TypeScript

import { getJiraSelectionBatches } from "@/lib/jira-dispatch-selection";
import {
JIRA_DISPATCH_MODE,
JIRA_DISPATCH_TARGET,
JIRA_TARGET_SELECTION_KIND,
type JiraDispatchMode,
} from "@/types/integrations";
import type { JiraDispatchModalPayload } from "@/types/jira-dispatch";
export interface JiraDispatchActionState {
defaultDispatchMode: JiraDispatchMode;
canChooseGroupedDispatch: boolean;
requiresUpgrade: boolean;
}
export interface JiraActionLabelCounts {
findingGroupCount?: number;
findingCount?: number;
}
export const getJiraDispatchActionState = (
payload: JiraDispatchModalPayload,
groupedDispatchEnabled: boolean,
): JiraDispatchActionState => {
const batches = getJiraSelectionBatches(payload.selection);
const targetCount = batches.reduce(
(count, batch) => count + batch.targetIds.length,
0,
);
const hasFindingGroupTargets = batches.some(
(batch) => batch.targetType === JIRA_DISPATCH_TARGET.CHECK_ID,
);
const requiresGroupedFeature =
hasFindingGroupTargets || batches.length > 1 || targetCount > 1;
const firstBatch = batches[0];
const canChooseGroupedDispatch =
groupedDispatchEnabled &&
payload.selection.kind !== JIRA_TARGET_SELECTION_KIND.BATCHES &&
(firstBatch.targetType === JIRA_DISPATCH_TARGET.FINDING_ID
? firstBatch.targetIds.length > 1
: firstBatch.targetIds.length === 1 &&
(payload.selectedResourceCount ?? 0) > 1);
return {
defaultDispatchMode: requiresGroupedFeature
? JIRA_DISPATCH_MODE.GROUPED
: JIRA_DISPATCH_MODE.INDIVIDUAL,
canChooseGroupedDispatch,
requiresUpgrade: requiresGroupedFeature && !groupedDispatchEnabled,
};
};
const buildEntityLabel = (
count: number,
singular: string,
plural: string,
): string | null => {
if (count === 0) return null;
return `${count} ${count === 1 ? singular : plural}`;
};
export const buildJiraActionLabel = ({
findingGroupCount = 0,
findingCount = 0,
}: JiraActionLabelCounts): string => {
const entities = [
buildEntityLabel(findingGroupCount, "Finding Group", "Finding Groups"),
buildEntityLabel(findingCount, "Finding", "Findings"),
].filter(Boolean);
return entities.length > 0
? `Send ${entities.join(" and ")} to Jira`
: "Send to Jira";
};