refactor: Move DocumentsListProps to DocumentsPanel and implement desk view selection and ID generation.

This commit is contained in:
2025-11-25 11:55:55 +01:00
parent f4c0af4730
commit 9c116cfe8c
4 changed files with 181 additions and 306 deletions
@@ -50,7 +50,6 @@ import useDocumentMutations from './useDocumentMutations';
import useDetailWorkspace from '../../detail/useDetailWorkspace';
import useWorkspaceTaxonomies from './useWorkspaceTaxonomies';
import useWorkspaceBreadcrumbs from './useWorkspaceBreadcrumbs';
import useWorkspaceDeskProps from './useWorkspaceDeskProps';
import useWorkspaceSelectionSync from './useWorkspaceSelectionSync';
import type { DocumentId, FolderId as FolderIdentifier, Identifier } from '../../types/identifiers';
@@ -351,7 +350,6 @@ const useDocumentsWorkspace = ({
searchResultIds,
setSearchResultIds,
searchLoading,
activeTagFilters,
setActiveTagFilters,
activeCorrespondentFilters,
setActiveCorrespondentFilters,
@@ -807,7 +805,6 @@ const useDocumentsWorkspace = ({
});
const {
promoteSelectionOrder,
clearDocumentSelection,
} = useDocumentsSelection({
showingSearchResults,
@@ -1157,22 +1154,6 @@ const useDocumentsWorkspace = ({
tagLookupById,
});
const inspectDocumentForDesk = useCallback(
(docOrId?: DocumentLike | Identifier | null) => {
if (docOrId == null) {
return;
}
const docId: Identifier | null = Object(docOrId) === docOrId
? (docOrId as DocumentLike)?.id ?? null
: (docOrId as Identifier | null);
if (docId == null) {
return;
}
inspectDocument(docId);
},
[inspectDocument],
);
const handleEntryPointerCore = useEntryPointerCore({
onSelectEntry: (entry, event, { rowKey, modifierClick, primaryClick }) => {
const { type, id } = entry;
@@ -1211,28 +1192,6 @@ const useDocumentsWorkspace = ({
tenantIdRef,
});
const deskWorkspaceProps = useWorkspaceDeskProps({
viewDocuments,
inspectDocumentForDesk,
handleEntryPointer: handleEntryPointerCore,
selectedEntries,
selectionAnchorRef,
applySelection,
showingSearchResults,
searchQuery,
activeTagFilters,
activeCorrespondentFilters,
selectedFolder,
promoteSelectionOrder,
handleDocumentTagDrop,
ensureAssetUrl,
getDocumentAsset,
currentTenantId,
documentLinks,
ensureDownloadUrl,
});
const documentsPanelProps = useDocumentsPanelProps({
currentFolderName,
breadcrumbs,
@@ -1281,13 +1240,11 @@ const useDocumentsWorkspace = ({
ensureDownloadUrl,
selectionValue: selection,
});
const documentsTableProps = useMemo(
() => ({
...documentsPanelProps,
deskWorkspaceProps,
}),
[documentsPanelProps, deskWorkspaceProps],
[documentsPanelProps],
);
const sidebarProps = useSidebarProps({
@@ -1,138 +0,0 @@
import { useCallback, useMemo } from 'react';
import type { MutableRefObject } from 'react';
import { createDocumentEntryKey } from '../../app/entryKey';
import type { Identifier } from '../../types/identifiers';
interface ApplySelectionFn {
(keys: string[], options?: { anchor: string | null; interactedKeys?: string[] }): unknown;
}
interface UseWorkspaceDeskPropsArgs {
viewDocuments: unknown[];
inspectDocumentForDesk?: (id: Identifier | null) => void;
handleEntryPointer: (params: { rowKey?: string | null; id?: Identifier | null; type?: string; event?: any }) => void;
selectedEntries: string[];
selectionAnchorRef: MutableRefObject<Identifier | string | null>;
applySelection: ApplySelectionFn;
showingSearchResults: boolean;
searchQuery: string;
activeTagFilters: Array<string>;
activeCorrespondentFilters: Array<string>;
selectedFolder: Identifier | 'root' | null;
promoteSelectionOrder: () => void;
handleDocumentTagDrop: (docId: Identifier, tagId: Identifier) => Promise<void> | void;
ensureAssetUrl: (docId: Identifier, asset: any, options?: Record<string, unknown>) => Promise<any> | null;
getDocumentAsset: (doc: any, type: string) => any;
currentTenantId: Identifier | null;
documentLinks: Map<Identifier, unknown> | null;
ensureDownloadUrl?: (docId: Identifier, options?: { force?: boolean }) => Promise<unknown>;
}
const useWorkspaceDeskProps = ({
viewDocuments,
inspectDocumentForDesk,
handleEntryPointer,
selectedEntries,
selectionAnchorRef,
applySelection,
showingSearchResults,
searchQuery,
activeTagFilters,
activeCorrespondentFilters,
selectedFolder,
promoteSelectionOrder,
handleDocumentTagDrop,
ensureAssetUrl,
getDocumentAsset,
currentTenantId,
documentLinks,
ensureDownloadUrl,
}: UseWorkspaceDeskPropsArgs) => {
const handleDeskDocumentStackSelect = useCallback(
(docIds: Array<Identifier | string>) => {
if (!Array.isArray(docIds) || docIds.length === 0) {
return;
}
const rowKeys = docIds
.map((id) => createDocumentEntryKey(id as Identifier))
.filter((value): value is string => typeof value === 'string');
if (!rowKeys.length) {
return;
}
const nextKeys = [...selectedEntries];
rowKeys.forEach((key) => {
if (!nextKeys.includes(key)) {
nextKeys.push(key);
}
});
const anchor = (rowKeys[0]
|| selectionAnchorRef.current
|| nextKeys[nextKeys.length - 1]) as string | null;
applySelection(nextKeys, {
anchor,
interactedKeys: rowKeys,
});
},
[applySelection, selectedEntries, selectionAnchorRef],
);
const deskViewId = useMemo(() => {
if (showingSearchResults) {
const trimmedQuery = searchQuery.trim();
const tagsKey = [...activeTagFilters].sort().join(',');
const correspondentsKey = [...activeCorrespondentFilters].sort().join(',');
return `search:${trimmedQuery}|tags:${tagsKey}|corr:${correspondentsKey}`;
}
const folderKey = selectedFolder && selectedFolder !== '' ? selectedFolder : 'root';
return `folder:${folderKey}`;
}, [
showingSearchResults,
searchQuery,
activeTagFilters,
activeCorrespondentFilters,
selectedFolder,
]);
const deskWorkspaceProps = useMemo(
() => ({
entries: viewDocuments,
onDocumentActivate: inspectDocumentForDesk,
onDocumentClick: handleEntryPointer,
onDocumentStackSelect: handleDeskDocumentStackSelect,
onPromoteSelection: promoteSelectionOrder,
onDocumentTagDrop: handleDocumentTagDrop,
ensureAssetUrl,
getDocumentAsset,
activeTagFilters,
tenantId: currentTenantId,
viewId: deskViewId,
documentLinks,
ensureDownloadUrl,
}),
[
viewDocuments,
inspectDocumentForDesk,
handleEntryPointer,
handleDeskDocumentStackSelect,
promoteSelectionOrder,
handleDocumentTagDrop,
ensureAssetUrl,
getDocumentAsset,
activeTagFilters,
currentTenantId,
deskViewId,
documentLinks,
ensureDownloadUrl,
],
);
return deskWorkspaceProps;
};
export default useWorkspaceDeskProps;