mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-01 20:23:36 +00:00
Add ability to select multiple backlog features and edit their configuration in bulk. Selection is limited to backlog column features in the current branch/worktree only. Changes: - Add selection mode toggle in board controls - Add checkbox selection on kanban cards (backlog only) - Disable drag and drop during selection mode - Hide action buttons during selection mode - Add floating selection action bar with Edit/Clear/Select All - Add mass edit dialog with all configuration options in single scroll view - Add server endpoint for bulk feature updates
83 lines
2.2 KiB
TypeScript
83 lines
2.2 KiB
TypeScript
import { useState, useCallback, useEffect } from 'react';
|
|
|
|
interface UseSelectionModeReturn {
|
|
isSelectionMode: boolean;
|
|
selectedFeatureIds: Set<string>;
|
|
selectedCount: number;
|
|
toggleSelectionMode: () => void;
|
|
toggleFeatureSelection: (featureId: string) => void;
|
|
selectAll: (featureIds: string[]) => void;
|
|
clearSelection: () => void;
|
|
isFeatureSelected: (featureId: string) => boolean;
|
|
exitSelectionMode: () => void;
|
|
}
|
|
|
|
export function useSelectionMode(): UseSelectionModeReturn {
|
|
const [isSelectionMode, setIsSelectionMode] = useState(false);
|
|
const [selectedFeatureIds, setSelectedFeatureIds] = useState<Set<string>>(new Set());
|
|
|
|
const toggleSelectionMode = useCallback(() => {
|
|
setIsSelectionMode((prev) => {
|
|
if (prev) {
|
|
// Exiting selection mode - clear selection
|
|
setSelectedFeatureIds(new Set());
|
|
}
|
|
return !prev;
|
|
});
|
|
}, []);
|
|
|
|
const exitSelectionMode = useCallback(() => {
|
|
setIsSelectionMode(false);
|
|
setSelectedFeatureIds(new Set());
|
|
}, []);
|
|
|
|
const toggleFeatureSelection = useCallback((featureId: string) => {
|
|
setSelectedFeatureIds((prev) => {
|
|
const next = new Set(prev);
|
|
if (next.has(featureId)) {
|
|
next.delete(featureId);
|
|
} else {
|
|
next.add(featureId);
|
|
}
|
|
return next;
|
|
});
|
|
}, []);
|
|
|
|
const selectAll = useCallback((featureIds: string[]) => {
|
|
setSelectedFeatureIds(new Set(featureIds));
|
|
}, []);
|
|
|
|
const clearSelection = useCallback(() => {
|
|
setSelectedFeatureIds(new Set());
|
|
}, []);
|
|
|
|
const isFeatureSelected = useCallback(
|
|
(featureId: string) => selectedFeatureIds.has(featureId),
|
|
[selectedFeatureIds]
|
|
);
|
|
|
|
// Handle Escape key to exit selection mode
|
|
useEffect(() => {
|
|
const handleKeyDown = (e: KeyboardEvent) => {
|
|
if (e.key === 'Escape' && isSelectionMode) {
|
|
exitSelectionMode();
|
|
}
|
|
};
|
|
|
|
window.addEventListener('keydown', handleKeyDown);
|
|
return () => window.removeEventListener('keydown', handleKeyDown);
|
|
}, [isSelectionMode, exitSelectionMode]);
|
|
|
|
return {
|
|
isSelectionMode,
|
|
selectedFeatureIds,
|
|
selectedCount: selectedFeatureIds.size,
|
|
toggleSelectionMode,
|
|
toggleFeatureSelection,
|
|
selectAll,
|
|
clearSelection,
|
|
isFeatureSelected,
|
|
exitSelectionMode,
|
|
};
|
|
}
|