From 41555bb57d671f524290125268a7dac4564aa78f Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Fri, 28 Nov 2025 20:50:24 +0100 Subject: [PATCH] feat: Add shift-click additive selection for documents in grid view --- frontend/src/documents/hooks/useDocumentItemLogic.ts | 9 +++++++-- frontend/src/documents/panel/DocumentsPanel.tsx | 1 + frontend/src/hooks/documents/useDocumentsWorkspace.ts | 8 +++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/frontend/src/documents/hooks/useDocumentItemLogic.ts b/frontend/src/documents/hooks/useDocumentItemLogic.ts index 64bea6d..90deca2 100644 --- a/frontend/src/documents/hooks/useDocumentItemLogic.ts +++ b/frontend/src/documents/hooks/useDocumentItemLogic.ts @@ -9,6 +9,7 @@ import type { Identifier } from '../../types/identifiers'; interface UseDocumentItemLogicProps extends DocumentsViewProps { doc: Document; viewLogic: DocumentViewLogic; + onEntryPointer?: (entry: any, event: any) => void; } export const useDocumentItemLogic = (props: UseDocumentItemLogicProps) => { @@ -55,8 +56,12 @@ export const useDocumentItemLogic = (props: UseDocumentItemLogicProps) => { const handlers = { onClick: (event: React.MouseEvent) => { - const key = createDocumentEntryKey(doc.id); - handleEntrySelection(key, event); + if (props.onEntryPointer) { + props.onEntryPointer({ type: 'document', id: doc.id, key: createDocumentEntryKey(doc.id), document: doc }, event); + } else { + const key = createDocumentEntryKey(doc.id); + handleEntrySelection(key, event); + } }, onDoubleClick: (event: React.MouseEvent) => onDocumentActivate?.(doc, event), onDragStart: (event: DragEvent) => onDocumentDragStart?.(event, doc), diff --git a/frontend/src/documents/panel/DocumentsPanel.tsx b/frontend/src/documents/panel/DocumentsPanel.tsx index c58dcdd..345a09b 100644 --- a/frontend/src/documents/panel/DocumentsPanel.tsx +++ b/frontend/src/documents/panel/DocumentsPanel.tsx @@ -465,6 +465,7 @@ const DocumentsPanelInner: React.FC = ({ onCorrespondentClick: toggleCorrespondentFilter, tenantId: currentTenantId, viewId, + onEntryPointer, }; const renderBody = () => { diff --git a/frontend/src/hooks/documents/useDocumentsWorkspace.ts b/frontend/src/hooks/documents/useDocumentsWorkspace.ts index 2296e29..1165300 100644 --- a/frontend/src/hooks/documents/useDocumentsWorkspace.ts +++ b/frontend/src/hooks/documents/useDocumentsWorkspace.ts @@ -1141,7 +1141,13 @@ const useDocumentsWorkspace = ({ const key = rowKey || (type === EntryType.document ? createDocumentEntryKey(id) : createFolderEntryKey(id)); if (key) { - handleEntrySelection(key, event); + if (documentsViewMode === 'grid' && (event as any).shiftKey) { + // Additive selection for Shift+Click in Grid View + const newSelection = Array.from(new Set([...selectedEntries, key])); + applySelection(newSelection, { anchor: key, interactedKeys: [key] }); + } else { + handleEntrySelection(key, event); + } } if (type === EntryType.folder && !modifierClick && primaryClick) { selectFolder(id);