refactor(web): extract timeline multi-select helpers

This commit is contained in:
2026-04-01 09:50:03 +02:00
parent 3abb3bc865
commit 43f04d66c8
3 changed files with 178 additions and 21 deletions
+67
View File
@@ -0,0 +1,67 @@
type MultiSelectStateLike = {
isSelecting: boolean;
startX: number;
startY: number;
currentX: number;
currentY: number;
selectedAllocationIds: string[];
selectedResourceIds: string[];
dateRange: { start: Date; end: Date } | null;
multiDragDaysDelta: number;
isMultiDragging: boolean;
multiDragMode: string;
};
export function createMultiSelectState<TState extends MultiSelectStateLike>(
currentX: number,
currentY: number,
defaults: Pick<
TState,
| "selectedAllocationIds"
| "selectedResourceIds"
| "dateRange"
| "multiDragDaysDelta"
| "isMultiDragging"
| "multiDragMode"
>,
): TState {
return {
isSelecting: true,
startX: currentX,
startY: currentY,
currentX,
currentY,
...defaults,
} as TState;
}
export function updateMultiSelectDraft<TState extends MultiSelectStateLike>(
state: TState,
currentX: number,
currentY: number,
): TState {
return {
...state,
currentX,
currentY,
};
}
export function finalizeMultiSelectDraft<TState extends MultiSelectStateLike>(
state: TState,
currentX: number,
currentY: number,
minDistancePx = 5,
): TState | null {
const distance = Math.hypot(currentX - state.startX, currentY - state.startY);
if (distance < minDistancePx) {
return null;
}
return {
...state,
isSelecting: false,
currentX,
currentY,
};
}