refactor(web): extract allocation release classification

This commit is contained in:
2026-04-01 10:48:47 +02:00
parent 0ab1374853
commit ca947befde
5 changed files with 220 additions and 34 deletions
@@ -0,0 +1,62 @@
import { buildAllocationBlockClickInfo, buildAllocationMutationPlan } from "./timelineAllocationActions.js";
import { hasAllocationDateChange, shouldTreatAllocationDragAsClick } from "./timelineAllocationFinalize.js";
type AllocationReleaseLike = {
isActive: boolean;
mode: "move" | "resize-start" | "resize-end";
pointerDeltaX: number;
daysDelta: number;
allocationId: string | null;
mutationAllocationId: string | null;
projectId: string | null;
projectName: string | null;
scope: "allocation" | "segment";
allocationStartDate: Date | null;
allocationEndDate: Date | null;
originalStartDate: Date | null;
originalEndDate: Date | null;
currentStartDate: Date | null;
currentEndDate: Date | null;
};
type AllocationBlockClickInfo = ReturnType<typeof buildAllocationBlockClickInfo>;
type AllocationMutationPlan = NonNullable<ReturnType<typeof buildAllocationMutationPlan>>;
export type AllocationReleaseOutcome =
| { kind: "ignore"; preservePreview: false }
| { kind: "reset"; preservePreview: boolean }
| { kind: "shift-click"; allocationId: string; preservePreview: boolean }
| { kind: "click"; clickInfo: NonNullable<AllocationBlockClickInfo>; preservePreview: boolean }
| { kind: "mutation"; mutationPlan: AllocationMutationPlan; preservePreview: true };
export function resolveAllocationRelease(
alloc: AllocationReleaseLike,
{ clickThresholdPx, wasShift }: { clickThresholdPx: number; wasShift: boolean },
): AllocationReleaseOutcome {
if (!alloc.isActive) {
return { kind: "ignore", preservePreview: false };
}
const preservePreview = hasAllocationDateChange(alloc);
const shouldTreatAsClick = shouldTreatAllocationDragAsClick(alloc, clickThresholdPx);
if (shouldTreatAsClick && alloc.allocationId) {
if (wasShift) {
return { kind: "shift-click", allocationId: alloc.allocationId, preservePreview };
}
const clickInfo = buildAllocationBlockClickInfo(alloc);
if (clickInfo) {
return { kind: "click", clickInfo, preservePreview };
}
}
if (preservePreview && alloc.allocationId && alloc.currentStartDate && alloc.currentEndDate) {
const mutationPlan = buildAllocationMutationPlan(alloc);
if (mutationPlan) {
return { kind: "mutation", mutationPlan, preservePreview: true };
}
}
return { kind: "reset", preservePreview };
}