From 8aa1872ea50a031613a447494e8c9742560e69c4 Mon Sep 17 00:00:00 2001 From: Nils Schneider Date: Thu, 4 Dec 2025 23:05:35 +0100 Subject: [PATCH] refactor: Reorganize frontend by moving UI components, hooks, and utilities to new `components`, `logic`, `features`, and `lib` directories --- frontend/src/app/DocumentsRoute.tsx | 2 +- frontend/src/app/LoginRoute.tsx | 4 +- frontend/src/app/SettingsRoute.tsx | 2 +- frontend/src/app/UploadQueueOverlay.tsx | 4 +- frontend/src/app/useDocumentsSearch.ts | 2 +- frontend/src/app/useDocumentsShell.ts | 2 +- frontend/src/app/useManagementModals.tsx | 4 +- frontend/src/app/useWorkspaceSurface.tsx | 2 +- .../{ui => components}/BreadcrumbTrail.tsx | 0 .../src/{ui => components}/PanelHeader.tsx | 0 .../src/{ui => components}/QuickAddMenu.tsx | 0 .../src/components/StatusToastOverlay.tsx | 2 +- frontend/src/{ui => components}/classNames.ts | 0 frontend/src/{ui => components}/icons.tsx | 0 .../src/{ui => components}/useFloatingMenu.ts | 0 .../{ => components}/DesktopDocumentCard.tsx | 12 +++--- .../{ => components}/DesktopPreviewCard.tsx | 8 ++-- .../{ => components}/DesktopWorkspace.tsx | 26 ++++++------ .../components}/workspace-cards.css | 0 .../components}/workspace-items.css | 0 .../components}/workspace-layout.css | 0 .../PointerTrackingContext.tsx | 2 +- .../{ => interactions}/useCardPointer.ts | 4 +- .../src/desktop/{ => logic}/CardDragLogic.ts | 0 .../src/desktop/{ => logic}/CardPhysics.ts | 0 .../src/desktop/{ => logic}/LayoutSystem.ts | 2 +- frontend/src/desktop/{ => logic}/db.ts | 6 +-- .../desktop/tags/useDeskTagInteractions.ts | 2 +- frontend/src/desktop/utils/layoutUtils.ts | 2 +- frontend/src/detail/PreviewZoomOverlay.tsx | 4 +- .../src/{styles => }/detail/detail-panels.css | 0 frontend/src/detail/useDetailWorkspace.ts | 2 +- .../src/documents/DocumentSummarySection.tsx | 4 +- .../src/documents/DocumentThumbnailImage.tsx | 4 +- frontend/src/documents/DocumentsView.tsx | 4 +- .../documents/components/DocumentEntry.tsx | 4 +- .../src/documents/components/DocumentTags.tsx | 2 +- .../components/DocumentsGridCard.tsx | 4 +- .../documents/components/DocumentsListRow.tsx | 4 +- .../src/documents/components/FolderEntry.tsx | 4 +- .../components/InlineRenameInput.tsx | 2 +- .../data}/useAuthManager.ts | 2 +- .../{hooks => data}/useBulkDocumentActions.ts | 2 +- .../data}/useCorrespondents.ts | 2 +- .../data}/useDocumentCorrespondentActions.ts | 2 +- .../data}/useDocumentMutations.ts | 2 +- .../data}/useDocuments.ts | 2 +- .../data}/useDocumentsWorkspace.ts | 40 +++++++++---------- .../documents => documents/data}/useTags.ts | 2 +- .../data}/useTenantManager.ts | 2 +- .../data}/useWorkspaceTaxonomies.ts | 2 +- .../folders}/useFolderItemLogic.ts | 4 +- .../features/folders}/useFolderTree.ts | 10 ++--- .../features/folders}/useFolderTreeActions.ts | 8 ++-- .../renaming}/useInlineRename.ts | 0 .../selection}/SelectionAssignmentMenu.tsx | 4 +- .../selection}/SelectionFloatingActions.tsx | 16 ++++---- .../selection}/SelectionFolderMenu.tsx | 8 ++-- .../selection}/SelectionSummary.tsx | 2 +- .../selection}/useDocumentsSelection.ts | 4 +- .../selection}/useEntryPointer.ts | 2 +- .../selection}/useWorkspaceSelectionSync.ts | 2 +- .../{ => features/tagging}/tagTransfer.ts | 4 +- .../features/tagging}/useDocumentTagging.ts | 4 +- .../upload}/useDocumentDragHandlers.ts | 6 +-- .../features/upload}/useDocumentUploads.ts | 6 +-- .../features/upload}/useFileDrop.ts | 0 .../{hooks => logic}/useDocumentItemLogic.ts | 4 +- .../{hooks => logic}/useDocumentViewLogic.ts | 2 +- .../useDocumentsNavigation.ts | 2 +- .../useDocumentsPanelProps.ts | 0 .../logic}/useWorkspaceBreadcrumbs.ts | 0 .../src/documents/panel/DocumentsPanel.tsx | 8 ++-- .../documents/panel/DocumentsPanelHeader.tsx | 4 +- .../src/documents/panel/DocumentsToolbar.tsx | 2 +- .../documents/panel/SortFieldQuickMenu.tsx | 2 +- .../styles}/controls.css | 0 .../styles}/drag-preview.css | 0 .../styles}/listing.css | 0 .../styles}/panel-sections.css | 0 .../styles}/shared-snippets.css | 0 .../styles}/tags-correspondents.css | 0 .../documents => documents/styles}/viewer.css | 0 frontend/src/index.tsx | 8 ++-- frontend/src/lib/{ => api}/api.ts | 0 frontend/src/lib/{ => api}/apiClient.ts | 0 frontend/src/lib/{ => api}/apiTypes.ts | 2 +- .../assets/AssetManager.ts} | 6 +-- .../assets/TagManager.ts} | 2 +- .../src/{app => lib/context}/ApiContext.tsx | 4 +- .../context/AppShellContext.ts} | 2 +- .../context}/DocumentOpenContext.tsx | 6 +-- .../context}/StatusToastContext.tsx | 2 +- frontend/src/{app => lib/store}/appState.tsx | 10 ++--- frontend/src/{styles/auth => login}/login.css | 0 frontend/src/preview/DocumentViewerPanel.tsx | 8 ++-- frontend/src/preview/MediaViewer.tsx | 2 +- frontend/src/settings/SettingsModal.tsx | 4 +- .../components/CapabilityDropdown.tsx | 2 +- .../sections/CapabilitySetsSection.tsx | 2 +- .../src/{styles => }/settings/settings.css | 0 frontend/src/settings/useApiTokens.ts | 2 +- frontend/src/settings/useCapabilities.ts | 2 +- frontend/src/settings/useCapabilitySets.ts | 2 +- frontend/src/settings/usePasskeys.ts | 2 +- .../components/SidebarCorrespondentList.tsx | 2 +- .../sidebar/components/SidebarFolderList.tsx | 2 +- .../sidebar/components/SidebarFolderNode.tsx | 2 +- .../src/sidebar/components/SidebarHeader.tsx | 6 +-- .../src/sidebar/components/SidebarMenu.tsx | 2 +- .../src/sidebar/components/SidebarTagList.tsx | 2 +- frontend/src/{styles => }/sidebar/sidebar.css | 0 frontend/src/styles/index.css | 22 +++++----- frontend/src/utils/ocr.ts | 4 +- 114 files changed, 199 insertions(+), 199 deletions(-) rename frontend/src/{ui => components}/BreadcrumbTrail.tsx (100%) rename frontend/src/{ui => components}/PanelHeader.tsx (100%) rename frontend/src/{ui => components}/QuickAddMenu.tsx (100%) rename frontend/src/{ui => components}/classNames.ts (100%) rename frontend/src/{ui => components}/icons.tsx (100%) rename frontend/src/{ui => components}/useFloatingMenu.ts (100%) rename frontend/src/desktop/{ => components}/DesktopDocumentCard.tsx (93%) rename frontend/src/desktop/{ => components}/DesktopPreviewCard.tsx (88%) rename frontend/src/desktop/{ => components}/DesktopWorkspace.tsx (94%) rename frontend/src/{styles/workspace => desktop/components}/workspace-cards.css (100%) rename frontend/src/{styles/workspace => desktop/components}/workspace-items.css (100%) rename frontend/src/{styles/workspace => desktop/components}/workspace-layout.css (100%) rename frontend/src/desktop/{ => interactions}/PointerTrackingContext.tsx (93%) rename frontend/src/desktop/{ => interactions}/useCardPointer.ts (99%) rename frontend/src/desktop/{ => logic}/CardDragLogic.ts (100%) rename frontend/src/desktop/{ => logic}/CardPhysics.ts (100%) rename frontend/src/desktop/{ => logic}/LayoutSystem.ts (99%) rename frontend/src/desktop/{ => logic}/db.ts (95%) rename frontend/src/{styles => }/detail/detail-panels.css (100%) rename frontend/src/{hooks/documents => documents/data}/useAuthManager.ts (98%) rename frontend/src/documents/{hooks => data}/useBulkDocumentActions.ts (99%) rename frontend/src/{hooks/documents => documents/data}/useCorrespondents.ts (98%) rename frontend/src/{hooks/documents => documents/data}/useDocumentCorrespondentActions.ts (99%) rename frontend/src/{hooks/documents => documents/data}/useDocumentMutations.ts (99%) rename frontend/src/{hooks/documents => documents/data}/useDocuments.ts (98%) rename frontend/src/{hooks/documents => documents/data}/useDocumentsWorkspace.ts (96%) rename frontend/src/{hooks/documents => documents/data}/useTags.ts (99%) rename frontend/src/{hooks/documents => documents/data}/useTenantManager.ts (97%) rename frontend/src/{hooks/documents => documents/data}/useWorkspaceTaxonomies.ts (98%) rename frontend/src/documents/{hooks => features/folders}/useFolderItemLogic.ts (95%) rename frontend/src/{hooks/documents => documents/features/folders}/useFolderTree.ts (98%) rename frontend/src/{hooks/documents => documents/features/folders}/useFolderTreeActions.ts (98%) rename frontend/src/documents/{ => features/renaming}/useInlineRename.ts (100%) rename frontend/src/documents/{ => features/selection}/SelectionAssignmentMenu.tsx (98%) rename frontend/src/documents/{ => features/selection}/SelectionFloatingActions.tsx (97%) rename frontend/src/documents/{ => features/selection}/SelectionFolderMenu.tsx (98%) rename frontend/src/documents/{ => features/selection}/SelectionSummary.tsx (95%) rename frontend/src/documents/{hooks => features/selection}/useDocumentsSelection.ts (97%) rename frontend/src/documents/{ => features/selection}/useEntryPointer.ts (98%) rename frontend/src/{hooks/documents => documents/features/selection}/useWorkspaceSelectionSync.ts (96%) rename frontend/src/documents/{ => features/tagging}/tagTransfer.ts (95%) rename frontend/src/{hooks/documents => documents/features/tagging}/useDocumentTagging.ts (98%) rename frontend/src/{hooks/documents => documents/features/upload}/useDocumentDragHandlers.ts (98%) rename frontend/src/{hooks/documents => documents/features/upload}/useDocumentUploads.ts (98%) rename frontend/src/{hooks/documents => documents/features/upload}/useFileDrop.ts (100%) rename frontend/src/documents/{hooks => logic}/useDocumentItemLogic.ts (96%) rename frontend/src/documents/{hooks => logic}/useDocumentViewLogic.ts (96%) rename frontend/src/documents/{hooks => logic}/useDocumentsNavigation.ts (99%) rename frontend/src/documents/{hooks => logic}/useDocumentsPanelProps.ts (100%) rename frontend/src/{hooks/documents => documents/logic}/useWorkspaceBreadcrumbs.ts (100%) rename frontend/src/{styles/documents => documents/styles}/controls.css (100%) rename frontend/src/{styles/documents => documents/styles}/drag-preview.css (100%) rename frontend/src/{styles/documents => documents/styles}/listing.css (100%) rename frontend/src/{styles/documents => documents/styles}/panel-sections.css (100%) rename frontend/src/{styles/documents => documents/styles}/shared-snippets.css (100%) rename frontend/src/{styles/documents => documents/styles}/tags-correspondents.css (100%) rename frontend/src/{styles/documents => documents/styles}/viewer.css (100%) rename frontend/src/lib/{ => api}/api.ts (100%) rename frontend/src/lib/{ => api}/apiClient.ts (100%) rename frontend/src/lib/{ => api}/apiTypes.ts (97%) rename frontend/src/{asset_manager.ts => lib/assets/AssetManager.ts} (96%) rename frontend/src/{tag_manager.ts => lib/assets/TagManager.ts} (93%) rename frontend/src/{app => lib/context}/ApiContext.tsx (86%) rename frontend/src/{appShellContext.ts => lib/context/AppShellContext.ts} (69%) rename frontend/src/{contexts => lib/context}/DocumentOpenContext.tsx (89%) rename frontend/src/{contexts => lib/context}/StatusToastContext.tsx (97%) rename frontend/src/{app => lib/store}/appState.tsx (96%) rename frontend/src/{styles/auth => login}/login.css (100%) rename frontend/src/{styles => }/settings/settings.css (100%) rename frontend/src/{styles => }/sidebar/sidebar.css (100%) diff --git a/frontend/src/app/DocumentsRoute.tsx b/frontend/src/app/DocumentsRoute.tsx index 42af412..2f2addc 100644 --- a/frontend/src/app/DocumentsRoute.tsx +++ b/frontend/src/app/DocumentsRoute.tsx @@ -5,7 +5,7 @@ import { DocumentsFilterProvider, } from '../documents/context/DocumentsFilterContext'; import { PreviewProvider, usePreviewContext } from '../preview/PreviewContext'; -import { DocumentOpenProvider } from '../contexts/DocumentOpenContext'; +import { DocumentOpenProvider } from '../lib/context/DocumentOpenContext'; import { useWorkspaceSurface } from './useWorkspaceSurface'; import { DocumentsHeaderBreadcrumb } from '../documents/panel/DocumentsPanelHeader'; import { SidebarProvider, useSidebarContext } from '../sidebar/SidebarContext'; diff --git a/frontend/src/app/LoginRoute.tsx b/frontend/src/app/LoginRoute.tsx index 7f63101..3347532 100644 --- a/frontend/src/app/LoginRoute.tsx +++ b/frontend/src/app/LoginRoute.tsx @@ -10,7 +10,7 @@ import { serializeAuthenticationCredential, serializeRegistrationCredential, } from '../utils/webauthn'; -import { useAppDispatch, useAppState } from './appState'; +import { useAppDispatch, useAppState } from '../lib/store/appState'; import { finishPasskeyLogin, finishSignup, @@ -18,7 +18,7 @@ import { selectTenant, startPasskeyLogin, startSignup, -} from '../lib/apiClient'; +} from '../lib/api/apiClient'; type StatusVariant = 'info' | 'success' | 'error'; diff --git a/frontend/src/app/SettingsRoute.tsx b/frontend/src/app/SettingsRoute.tsx index 6e85bae..ee15126 100644 --- a/frontend/src/app/SettingsRoute.tsx +++ b/frontend/src/app/SettingsRoute.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useCallback } from 'react'; import SettingsModal from '../settings/SettingsModal'; -import { useAppShell } from '../appShellContext'; +import { useAppShell } from '../lib/context/AppShellContext'; import useApiTokens from '../settings/useApiTokens'; import useCapabilitySets from '../settings/useCapabilitySets'; import useCapabilities from '../settings/useCapabilities'; diff --git a/frontend/src/app/UploadQueueOverlay.tsx b/frontend/src/app/UploadQueueOverlay.tsx index 180f253..be9704b 100644 --- a/frontend/src/app/UploadQueueOverlay.tsx +++ b/frontend/src/app/UploadQueueOverlay.tsx @@ -9,8 +9,8 @@ import { WarningIcon, BottombarCollapseIcon, BottombarExpandIcon, -} from '../ui/icons'; -import PanelHeader from '../ui/PanelHeader'; +} from '../components/icons'; +import PanelHeader from '../components/PanelHeader'; type UploadStatus = 'pending' | 'uploading' | 'success' | 'duplicate' | 'error' | (string & {}); diff --git a/frontend/src/app/useDocumentsSearch.ts b/frontend/src/app/useDocumentsSearch.ts index e4f9718..f1c5794 100644 --- a/frontend/src/app/useDocumentsSearch.ts +++ b/frontend/src/app/useDocumentsSearch.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import type { Dispatch, SetStateAction } from 'react'; import { TAG_FILTER_UNTAGGED } from './workspaceUtils'; -import { listDocuments } from '../lib/apiClient'; +import { listDocuments } from '../lib/api/apiClient'; import type { Identifier } from '../types/identifiers'; import type { Document } from '../types/documents'; diff --git a/frontend/src/app/useDocumentsShell.ts b/frontend/src/app/useDocumentsShell.ts index 509f1a8..6c9ffe1 100644 --- a/frontend/src/app/useDocumentsShell.ts +++ b/frontend/src/app/useDocumentsShell.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; import type { ComponentProps } from 'react'; -import { useAppShell } from '../appShellContext'; +import { useAppShell } from '../lib/context/AppShellContext'; import type { DocumentsFilterValue } from '../documents/context/DocumentsFilterContext'; import type Sidebar from '../sidebar/Sidebar'; import type { UseWorkspaceSurfaceArgs } from './useWorkspaceSurface'; diff --git a/frontend/src/app/useManagementModals.tsx b/frontend/src/app/useManagementModals.tsx index 4b42179..78d85d2 100644 --- a/frontend/src/app/useManagementModals.tsx +++ b/frontend/src/app/useManagementModals.tsx @@ -2,8 +2,8 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import type { ReactNode } from 'react'; import TagsPanel from '../tags/TagsPanel'; import CorrespondentsPanel, { CorrespondentsPanelProps } from '../correspondents/CorrespondentsPanel'; -import PanelHeader from '../ui/PanelHeader'; -import { CloseIcon } from '../ui/icons'; +import PanelHeader from '../components/PanelHeader'; +import { CloseIcon } from '../components/icons'; import { CORRESPONDENTS_MODAL, TAGS_MODAL } from '../constants/app'; interface TagRecord { diff --git a/frontend/src/app/useWorkspaceSurface.tsx b/frontend/src/app/useWorkspaceSurface.tsx index 0e28d4b..e9d8eec 100644 --- a/frontend/src/app/useWorkspaceSurface.tsx +++ b/frontend/src/app/useWorkspaceSurface.tsx @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo } from 'react'; import type { ComponentProps, ReactNode } from 'react'; -import { SidebarExpandIcon } from '../ui/icons'; +import { SidebarExpandIcon } from '../components/icons'; import DocumentsPanel from '../documents/panel/DocumentsPanel'; import DocumentViewerPanel from '../preview/DocumentViewerPanel'; import { usePanelManager } from './PanelManagerContext'; diff --git a/frontend/src/ui/BreadcrumbTrail.tsx b/frontend/src/components/BreadcrumbTrail.tsx similarity index 100% rename from frontend/src/ui/BreadcrumbTrail.tsx rename to frontend/src/components/BreadcrumbTrail.tsx diff --git a/frontend/src/ui/PanelHeader.tsx b/frontend/src/components/PanelHeader.tsx similarity index 100% rename from frontend/src/ui/PanelHeader.tsx rename to frontend/src/components/PanelHeader.tsx diff --git a/frontend/src/ui/QuickAddMenu.tsx b/frontend/src/components/QuickAddMenu.tsx similarity index 100% rename from frontend/src/ui/QuickAddMenu.tsx rename to frontend/src/components/QuickAddMenu.tsx diff --git a/frontend/src/components/StatusToastOverlay.tsx b/frontend/src/components/StatusToastOverlay.tsx index 32cdaea..2aaef07 100644 --- a/frontend/src/components/StatusToastOverlay.tsx +++ b/frontend/src/components/StatusToastOverlay.tsx @@ -1,5 +1,5 @@ import React, { useState, useCallback, useEffect, useRef } from 'react'; -import { useStatusToast } from '../contexts/StatusToastContext'; +import { useStatusToast } from '../lib/context/StatusToastContext'; import '../styles/status-toast.css'; const FADE_OUT_DURATION = 300; // Match CSS animation duration diff --git a/frontend/src/ui/classNames.ts b/frontend/src/components/classNames.ts similarity index 100% rename from frontend/src/ui/classNames.ts rename to frontend/src/components/classNames.ts diff --git a/frontend/src/ui/icons.tsx b/frontend/src/components/icons.tsx similarity index 100% rename from frontend/src/ui/icons.tsx rename to frontend/src/components/icons.tsx diff --git a/frontend/src/ui/useFloatingMenu.ts b/frontend/src/components/useFloatingMenu.ts similarity index 100% rename from frontend/src/ui/useFloatingMenu.ts rename to frontend/src/components/useFloatingMenu.ts diff --git a/frontend/src/desktop/DesktopDocumentCard.tsx b/frontend/src/desktop/components/DesktopDocumentCard.tsx similarity index 93% rename from frontend/src/desktop/DesktopDocumentCard.tsx rename to frontend/src/desktop/components/DesktopDocumentCard.tsx index c70b7de..526b33c 100644 --- a/frontend/src/desktop/DesktopDocumentCard.tsx +++ b/frontend/src/desktop/components/DesktopDocumentCard.tsx @@ -1,11 +1,11 @@ import React, { useMemo } from 'react'; import DesktopPreviewCard from './DesktopPreviewCard'; -import { resolveCorrespondents } from '../documents/correspondents'; -import { getTagColorStyle } from '../utils/colors'; -import type { DocumentId } from '../types/identifiers'; -import type { Document } from '../types/documents'; -import { LayoutCard } from './LayoutSystem'; -import { useCardPointer } from './useCardPointer'; +import { resolveCorrespondents } from '../../documents/correspondents'; +import { getTagColorStyle } from '../../utils/colors'; +import type { DocumentId } from '../../types/identifiers'; +import type { Document } from '../../types/documents'; +import { LayoutCard } from '../logic/LayoutSystem'; +import { useCardPointer } from '../interactions/useCardPointer'; const preventAll = (event?: React.SyntheticEvent | Event | null) => { if (!event) return; diff --git a/frontend/src/desktop/DesktopPreviewCard.tsx b/frontend/src/desktop/components/DesktopPreviewCard.tsx similarity index 88% rename from frontend/src/desktop/DesktopPreviewCard.tsx rename to frontend/src/desktop/components/DesktopPreviewCard.tsx index fa78a57..53b29c8 100644 --- a/frontend/src/desktop/DesktopPreviewCard.tsx +++ b/frontend/src/desktop/components/DesktopPreviewCard.tsx @@ -1,10 +1,10 @@ import { useMemo } from 'react'; import type { JSX } from 'react'; -import { resolveDocumentAssetUrl } from '../asset_manager'; -import type { Identifier } from '../types/identifiers'; -import type { Document } from '../types/documents'; +import { resolveDocumentAssetUrl } from '../../lib/assets/AssetManager'; +import type { Identifier } from '../../types/identifiers'; +import type { Document } from '../../types/documents'; -import type { Asset } from '../types/assets'; +import type { Asset } from '../../types/assets'; type EnsureAssetUrl = ( documentId: Identifier, diff --git a/frontend/src/desktop/DesktopWorkspace.tsx b/frontend/src/desktop/components/DesktopWorkspace.tsx similarity index 94% rename from frontend/src/desktop/DesktopWorkspace.tsx rename to frontend/src/desktop/components/DesktopWorkspace.tsx index b33665d..6b1604e 100644 --- a/frontend/src/desktop/DesktopWorkspace.tsx +++ b/frontend/src/desktop/components/DesktopWorkspace.tsx @@ -5,20 +5,20 @@ import React, { useRef, useState, } from 'react'; -import { LayoutStore, LayoutCard } from './LayoutSystem'; +import { LayoutStore, LayoutCard } from '../logic/LayoutSystem'; import DesktopDocumentCard from './DesktopDocumentCard'; -import usePreviewMetadata from './hooks/usePreviewMetadata'; -import { useDeskTagInteractions } from './tags/useDeskTagInteractions'; -import '../styles/workspace/workspace-layout.css'; -import '../styles/workspace/workspace-items.css'; -import '../styles/workspace/workspace-cards.css'; -import { useWorkspaceSelectionContext } from '../app/WorkspaceSelectionContext'; -import { createDocumentEntryKey } from '../app/entryKey'; -import { PointerTrackingProvider, usePointerTracking } from './PointerTrackingContext'; -import type { Identifier } from '../types/identifiers'; -import type { DocumentsListEntry, Document } from '../types/documents'; -import { useAppState } from '../app/appState'; -import { useDocumentOpen } from '../contexts/DocumentOpenContext'; +import usePreviewMetadata from '../hooks/usePreviewMetadata'; +import { useDeskTagInteractions } from '../tags/useDeskTagInteractions'; +import './workspace-layout.css'; +import './workspace-items.css'; +import './workspace-cards.css'; +import { useWorkspaceSelectionContext } from '../../app/WorkspaceSelectionContext'; +import { createDocumentEntryKey } from '../../app/entryKey'; +import { PointerTrackingProvider, usePointerTracking } from '../interactions/PointerTrackingContext'; +import type { Identifier } from '../../types/identifiers'; +import type { DocumentsListEntry, Document } from '../../types/documents'; +import { useAppState } from '../../lib/store/appState'; +import { useDocumentOpen } from '../../lib/context/DocumentOpenContext'; interface DocumentSizeInfo { width: number; diff --git a/frontend/src/styles/workspace/workspace-cards.css b/frontend/src/desktop/components/workspace-cards.css similarity index 100% rename from frontend/src/styles/workspace/workspace-cards.css rename to frontend/src/desktop/components/workspace-cards.css diff --git a/frontend/src/styles/workspace/workspace-items.css b/frontend/src/desktop/components/workspace-items.css similarity index 100% rename from frontend/src/styles/workspace/workspace-items.css rename to frontend/src/desktop/components/workspace-items.css diff --git a/frontend/src/styles/workspace/workspace-layout.css b/frontend/src/desktop/components/workspace-layout.css similarity index 100% rename from frontend/src/styles/workspace/workspace-layout.css rename to frontend/src/desktop/components/workspace-layout.css diff --git a/frontend/src/desktop/PointerTrackingContext.tsx b/frontend/src/desktop/interactions/PointerTrackingContext.tsx similarity index 93% rename from frontend/src/desktop/PointerTrackingContext.tsx rename to frontend/src/desktop/interactions/PointerTrackingContext.tsx index 2bafd2b..31f9a87 100644 --- a/frontend/src/desktop/PointerTrackingContext.tsx +++ b/frontend/src/desktop/interactions/PointerTrackingContext.tsx @@ -1,5 +1,5 @@ import React, { useRef, useCallback } from 'react'; -import { createSafeContext } from '../utils/createSafeContext'; +import { createSafeContext } from '../../utils/createSafeContext'; interface PointerTrackingContextType { activePointersRef: React.MutableRefObject>; diff --git a/frontend/src/desktop/useCardPointer.ts b/frontend/src/desktop/interactions/useCardPointer.ts similarity index 99% rename from frontend/src/desktop/useCardPointer.ts rename to frontend/src/desktop/interactions/useCardPointer.ts index 9d342b8..c281580 100644 --- a/frontend/src/desktop/useCardPointer.ts +++ b/frontend/src/desktop/interactions/useCardPointer.ts @@ -1,8 +1,8 @@ import React, { useCallback, useRef } from 'react'; import { usePointerTracking } from './PointerTrackingContext'; -import { LayoutCard } from './LayoutSystem'; -import { handleDragMove, handleDragEnd, handleDragStart, attachToDragGroup } from './CardDragLogic'; +import { LayoutCard } from '../logic/LayoutSystem'; +import { handleDragMove, handleDragEnd, handleDragStart, attachToDragGroup } from '../logic/CardDragLogic'; const DRAG_THRESHOLD = 3; diff --git a/frontend/src/desktop/CardDragLogic.ts b/frontend/src/desktop/logic/CardDragLogic.ts similarity index 100% rename from frontend/src/desktop/CardDragLogic.ts rename to frontend/src/desktop/logic/CardDragLogic.ts diff --git a/frontend/src/desktop/CardPhysics.ts b/frontend/src/desktop/logic/CardPhysics.ts similarity index 100% rename from frontend/src/desktop/CardPhysics.ts rename to frontend/src/desktop/logic/CardPhysics.ts diff --git a/frontend/src/desktop/LayoutSystem.ts b/frontend/src/desktop/logic/LayoutSystem.ts similarity index 99% rename from frontend/src/desktop/LayoutSystem.ts rename to frontend/src/desktop/logic/LayoutSystem.ts index 0e14fa9..16d56cd 100644 --- a/frontend/src/desktop/LayoutSystem.ts +++ b/frontend/src/desktop/logic/LayoutSystem.ts @@ -1,4 +1,4 @@ -import { constrainDimensions, getInitialPosition, CONTAINER_PADDING } from './utils/layoutUtils'; +import { constrainDimensions, getInitialPosition, CONTAINER_PADDING } from '../utils/layoutUtils'; import { fetchLayoutRecords, upsertLayoutRecords } from './db'; import { CardPhysics } from './CardPhysics'; diff --git a/frontend/src/desktop/db.ts b/frontend/src/desktop/logic/db.ts similarity index 95% rename from frontend/src/desktop/db.ts rename to frontend/src/desktop/logic/db.ts index d84cc9a..f258a42 100644 --- a/frontend/src/desktop/db.ts +++ b/frontend/src/desktop/logic/db.ts @@ -1,6 +1,6 @@ -import type { DocumentId } from '../types/identifiers'; -import { DB_NAME, DB_VERSION, LAYOUT_STORE } from '../constants/desktop'; -type TenantId = import('../types/identifiers').TenantId; +import type { DocumentId } from '../../types/identifiers'; +import { DB_NAME, DB_VERSION, LAYOUT_STORE } from '../../constants/desktop'; +type TenantId = import('../../types/identifiers').TenantId; const currentDbPromise: { value: Promise | null } = { value: null }; diff --git a/frontend/src/desktop/tags/useDeskTagInteractions.ts b/frontend/src/desktop/tags/useDeskTagInteractions.ts index 539254f..197bf32 100644 --- a/frontend/src/desktop/tags/useDeskTagInteractions.ts +++ b/frontend/src/desktop/tags/useDeskTagInteractions.ts @@ -8,7 +8,7 @@ import { isTagTransferEvent, parseTagTransferPayload, writeTagTransferData, -} from '../../documents/tagTransfer'; +} from '../../documents/features/tagging/tagTransfer'; import type { Identifier } from '../../types/identifiers'; import type { Document, DocumentTag } from '../../types/documents'; diff --git a/frontend/src/desktop/utils/layoutUtils.ts b/frontend/src/desktop/utils/layoutUtils.ts index d51e4a2..f86c602 100644 --- a/frontend/src/desktop/utils/layoutUtils.ts +++ b/frontend/src/desktop/utils/layoutUtils.ts @@ -1,4 +1,4 @@ -import type { LayoutCard } from '../LayoutSystem'; +import type { LayoutCard } from '../logic/LayoutSystem'; export const CONTAINER_PADDING = 18; diff --git a/frontend/src/detail/PreviewZoomOverlay.tsx b/frontend/src/detail/PreviewZoomOverlay.tsx index e61293c..2934b98 100644 --- a/frontend/src/detail/PreviewZoomOverlay.tsx +++ b/frontend/src/detail/PreviewZoomOverlay.tsx @@ -1,8 +1,8 @@ import React, { useEffect, useRef, useState } from 'react'; import { createPortal } from 'react-dom'; import UnifiedDocumentViewer from '../preview/UnifiedDocumentViewer'; -import PanelHeader from '../ui/PanelHeader'; -import { IconX, DownloadIcon, FileInfoIcon } from '../ui/icons'; +import PanelHeader from '../components/PanelHeader'; +import { IconX, DownloadIcon, FileInfoIcon } from '../components/icons'; import type { Document } from '../types/documents'; diff --git a/frontend/src/styles/detail/detail-panels.css b/frontend/src/detail/detail-panels.css similarity index 100% rename from frontend/src/styles/detail/detail-panels.css rename to frontend/src/detail/detail-panels.css diff --git a/frontend/src/detail/useDetailWorkspace.ts b/frontend/src/detail/useDetailWorkspace.ts index 5df41d9..9786101 100644 --- a/frontend/src/detail/useDetailWorkspace.ts +++ b/frontend/src/detail/useDetailWorkspace.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useMemo } from 'react'; import type { MutableRefObject } from 'react'; -import { resolveDocumentAssetUrl } from '../asset_manager'; +import { resolveDocumentAssetUrl } from '../lib/assets/AssetManager'; import { useDetailPanel } from '../app/useDetailPanel'; import { DEFAULT_FOLDER_NAME } from '../app/workspaceUtils'; import type { DocumentInfoPanelProps } from '../documents/DocumentInfoPanel'; diff --git a/frontend/src/documents/DocumentSummarySection.tsx b/frontend/src/documents/DocumentSummarySection.tsx index 5be4b25..6e25d6d 100644 --- a/frontend/src/documents/DocumentSummarySection.tsx +++ b/frontend/src/documents/DocumentSummarySection.tsx @@ -1,11 +1,11 @@ import React, { useCallback, useEffect, useMemo, useState, type FormEvent } from 'react'; import { Link } from 'react-router-dom'; -import { EditIcon, IconX, PlusIcon } from '../ui/icons'; +import { EditIcon, IconX, PlusIcon } from '../components/icons'; import InlineRenameInput from './components/InlineRenameInput'; import SelectionAssignmentMenu, { SelectionAssignmentMenuItem, type NormalizedSelectionAssignmentItem, -} from './SelectionAssignmentMenu'; +} from './features/selection/SelectionAssignmentMenu'; import { getTagColorStyle } from '../utils/colors'; import { formatDate, diff --git a/frontend/src/documents/DocumentThumbnailImage.tsx b/frontend/src/documents/DocumentThumbnailImage.tsx index fdaa282..e8c4813 100644 --- a/frontend/src/documents/DocumentThumbnailImage.tsx +++ b/frontend/src/documents/DocumentThumbnailImage.tsx @@ -5,13 +5,13 @@ import { getAssetFromVersion, resolveDocumentAssetUrl, resolveAssetUrl, -} from '../asset_manager'; +} from '../lib/assets/AssetManager'; import { DEFAULT_THUMBNAIL_SIZE } from '../constants/documents'; import type { Asset as AssetManagerAsset, EnsureAssetUrl as AssetManagerEnsureAssetUrl, GetAsset as AssetManagerGetAsset, -} from '../asset_manager'; +} from '../lib/assets/AssetManager'; // Detect when an element becomes visible within a scroll container so we can delay loading. const useLazyVisibility = ( diff --git a/frontend/src/documents/DocumentsView.tsx b/frontend/src/documents/DocumentsView.tsx index ad219c4..5743ea5 100644 --- a/frontend/src/documents/DocumentsView.tsx +++ b/frontend/src/documents/DocumentsView.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useCallback } from 'react'; -import { useDocumentViewLogic, DocumentViewLogic } from './hooks/useDocumentViewLogic'; -import { useDocumentsNavigation } from './hooks/useDocumentsNavigation'; +import { useDocumentViewLogic, DocumentViewLogic } from './logic/useDocumentViewLogic'; +import { useDocumentsNavigation } from './logic/useDocumentsNavigation'; import { useWorkspaceSelectionContext } from '../app/WorkspaceSelectionContext'; import { usePanelManager } from '../app/PanelManagerContext'; import DocumentsListRow from './components/DocumentsListRow'; diff --git a/frontend/src/documents/components/DocumentEntry.tsx b/frontend/src/documents/components/DocumentEntry.tsx index 82214f6..cfb1d15 100644 --- a/frontend/src/documents/components/DocumentEntry.tsx +++ b/frontend/src/documents/components/DocumentEntry.tsx @@ -1,7 +1,7 @@ import React from 'react'; import type { DocumentsViewProps } from '../panel/DocumentsPanel'; -import type { DocumentViewLogic } from '../hooks/useDocumentViewLogic'; -import { useDocumentItemLogic } from '../hooks/useDocumentItemLogic'; +import type { DocumentViewLogic } from '../logic/useDocumentViewLogic'; +import { useDocumentItemLogic } from '../logic/useDocumentItemLogic'; import EntryShell from './EntryShell'; interface DocumentEntryProps extends DocumentsViewProps { diff --git a/frontend/src/documents/components/DocumentTags.tsx b/frontend/src/documents/components/DocumentTags.tsx index b6425e6..2b8fbea 100644 --- a/frontend/src/documents/components/DocumentTags.tsx +++ b/frontend/src/documents/components/DocumentTags.tsx @@ -1,6 +1,6 @@ import React, { useMemo } from 'react'; import { getTagColorStyle } from '../../utils/colors'; -import { writeTagTransferData } from '../tagTransfer'; +import { writeTagTransferData } from '../features/tagging/tagTransfer'; import type { DocumentTag } from '../../types/documents'; import type { Identifier } from '../../types/identifiers'; diff --git a/frontend/src/documents/components/DocumentsGridCard.tsx b/frontend/src/documents/components/DocumentsGridCard.tsx index 4d9259f..cb4771d 100644 --- a/frontend/src/documents/components/DocumentsGridCard.tsx +++ b/frontend/src/documents/components/DocumentsGridCard.tsx @@ -1,10 +1,10 @@ import React from 'react'; -import { FolderIcon } from '../../ui/icons'; +import { FolderIcon } from '../../components/icons'; import DocumentThumbnailImage from '../DocumentThumbnailImage'; import { resolveCorrespondents } from '../correspondents'; import type { DocumentsListEntry } from '../../types/documents'; import type { DocumentsViewProps } from '../panel/DocumentsPanel'; -import type { DocumentViewLogic } from '../hooks/useDocumentViewLogic'; +import type { DocumentViewLogic } from '../logic/useDocumentViewLogic'; import EditableEntryTitle from './EditableEntryTitle'; import EntryCorrespondents from './EntryCorrespondents'; import EntryTags from './EntryTags'; diff --git a/frontend/src/documents/components/DocumentsListRow.tsx b/frontend/src/documents/components/DocumentsListRow.tsx index 47f8436..723a835 100644 --- a/frontend/src/documents/components/DocumentsListRow.tsx +++ b/frontend/src/documents/components/DocumentsListRow.tsx @@ -1,11 +1,11 @@ import React from 'react'; -import { FolderIcon } from '../../ui/icons'; +import { FolderIcon } from '../../components/icons'; import { formatDate } from '../../utils/date'; import DocumentThumbnailImage from '../DocumentThumbnailImage'; import { resolveCorrespondents } from '../correspondents'; import type { DocumentsListEntry } from '../../types/documents'; import type { DocumentsViewProps } from '../panel/DocumentsPanel'; -import type { DocumentViewLogic } from '../hooks/useDocumentViewLogic'; +import type { DocumentViewLogic } from '../logic/useDocumentViewLogic'; import EditableEntryTitle from './EditableEntryTitle'; import EntryCorrespondents from './EntryCorrespondents'; import EntryTags from './EntryTags'; diff --git a/frontend/src/documents/components/FolderEntry.tsx b/frontend/src/documents/components/FolderEntry.tsx index 9353c5f..a963b89 100644 --- a/frontend/src/documents/components/FolderEntry.tsx +++ b/frontend/src/documents/components/FolderEntry.tsx @@ -1,7 +1,7 @@ import React from 'react'; import type { DocumentsViewProps } from '../panel/DocumentsPanel'; -import type { DocumentViewLogic } from '../hooks/useDocumentViewLogic'; -import { useFolderItemLogic } from '../hooks/useFolderItemLogic'; +import type { DocumentViewLogic } from '../logic/useDocumentViewLogic'; +import { useFolderItemLogic } from '../features/folders/useFolderItemLogic'; import EntryShell from './EntryShell'; interface FolderEntryProps extends DocumentsViewProps { diff --git a/frontend/src/documents/components/InlineRenameInput.tsx b/frontend/src/documents/components/InlineRenameInput.tsx index 07f40c7..3ca74e2 100644 --- a/frontend/src/documents/components/InlineRenameInput.tsx +++ b/frontend/src/documents/components/InlineRenameInput.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { CheckIcon, CloseIcon } from '../../ui/icons'; +import { CheckIcon, CloseIcon } from '../../components/icons'; interface InlineRenameInputProps extends Omit, 'onChange' | 'onSubmit' | 'value'> { value: string; diff --git a/frontend/src/hooks/documents/useAuthManager.ts b/frontend/src/documents/data/useAuthManager.ts similarity index 98% rename from frontend/src/hooks/documents/useAuthManager.ts rename to frontend/src/documents/data/useAuthManager.ts index 0f46ec8..1ee2a00 100644 --- a/frontend/src/hooks/documents/useAuthManager.ts +++ b/frontend/src/documents/data/useAuthManager.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useRef } from 'react'; import type { MutableRefObject } from 'react'; -import { clearAuthToken, logoutSession, refreshSession, setAuthToken } from '../../lib/apiClient'; +import { clearAuthToken, logoutSession, refreshSession, setAuthToken } from '../../lib/api/apiClient'; type AppStatus = string; diff --git a/frontend/src/documents/hooks/useBulkDocumentActions.ts b/frontend/src/documents/data/useBulkDocumentActions.ts similarity index 99% rename from frontend/src/documents/hooks/useBulkDocumentActions.ts rename to frontend/src/documents/data/useBulkDocumentActions.ts index c9c3a17..0715741 100644 --- a/frontend/src/documents/hooks/useBulkDocumentActions.ts +++ b/frontend/src/documents/data/useBulkDocumentActions.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import { assignCorrespondentsBulk } from '../../lib/apiClient'; +import { assignCorrespondentsBulk } from '../../lib/api/apiClient'; import type { Identifier } from '../../types/identifiers'; import type { MessageOptions } from '../../types/documents'; diff --git a/frontend/src/hooks/documents/useCorrespondents.ts b/frontend/src/documents/data/useCorrespondents.ts similarity index 98% rename from frontend/src/hooks/documents/useCorrespondents.ts rename to frontend/src/documents/data/useCorrespondents.ts index c7fd447..b4246d1 100644 --- a/frontend/src/hooks/documents/useCorrespondents.ts +++ b/frontend/src/documents/data/useCorrespondents.ts @@ -1,7 +1,7 @@ import { MutableRefObject, useCallback, useState } from 'react'; import type { Correspondent } from '../../types/documents'; -import { listCorrespondents, createCorrespondent, updateCorrespondent, deleteCorrespondent } from '../../lib/apiClient'; +import { listCorrespondents, createCorrespondent, updateCorrespondent, deleteCorrespondent } from '../../lib/api/apiClient'; interface UseCorrespondentsOptions { notifyApiError: (error: unknown, fallback: string) => void; diff --git a/frontend/src/hooks/documents/useDocumentCorrespondentActions.ts b/frontend/src/documents/data/useDocumentCorrespondentActions.ts similarity index 99% rename from frontend/src/hooks/documents/useDocumentCorrespondentActions.ts rename to frontend/src/documents/data/useDocumentCorrespondentActions.ts index 76d3a06..e9526ca 100644 --- a/frontend/src/hooks/documents/useDocumentCorrespondentActions.ts +++ b/frontend/src/documents/data/useDocumentCorrespondentActions.ts @@ -2,7 +2,7 @@ import { useCallback, useMemo } from 'react'; import type { Identifier } from '../../types/identifiers'; -import { addDocumentCorrespondent, removeDocumentCorrespondent } from '../../lib/apiClient'; +import { addDocumentCorrespondent, removeDocumentCorrespondent } from '../../lib/api/apiClient'; interface CorrespondentOption { id?: string; diff --git a/frontend/src/hooks/documents/useDocumentMutations.ts b/frontend/src/documents/data/useDocumentMutations.ts similarity index 99% rename from frontend/src/hooks/documents/useDocumentMutations.ts rename to frontend/src/documents/data/useDocumentMutations.ts index 5b95738..6c72473 100644 --- a/frontend/src/hooks/documents/useDocumentMutations.ts +++ b/frontend/src/documents/data/useDocumentMutations.ts @@ -12,7 +12,7 @@ import { queueDocumentReanalysis, trashDocument, updateDocument, -} from '../../lib/apiClient'; +} from '../../lib/api/apiClient'; import type { DocumentId, FolderId as FolderIdentifier } from '../../types/identifiers'; import type { Document, MessageOptions } from '../../types/documents'; diff --git a/frontend/src/hooks/documents/useDocuments.ts b/frontend/src/documents/data/useDocuments.ts similarity index 98% rename from frontend/src/hooks/documents/useDocuments.ts rename to frontend/src/documents/data/useDocuments.ts index 1058315..fd0078b 100644 --- a/frontend/src/hooks/documents/useDocuments.ts +++ b/frontend/src/documents/data/useDocuments.ts @@ -6,7 +6,7 @@ import { useRef, useState, } from 'react'; -import DocumentsManager from '../../documents/DocumentsManager'; +import DocumentsManager from '../DocumentsManager'; import type { DocumentId } from '../../types/identifiers'; import type { Document } from '../../types/documents'; diff --git a/frontend/src/hooks/documents/useDocumentsWorkspace.ts b/frontend/src/documents/data/useDocumentsWorkspace.ts similarity index 96% rename from frontend/src/hooks/documents/useDocumentsWorkspace.ts rename to frontend/src/documents/data/useDocumentsWorkspace.ts index b881326..917d116 100644 --- a/frontend/src/hooks/documents/useDocumentsWorkspace.ts +++ b/frontend/src/documents/data/useDocumentsWorkspace.ts @@ -13,19 +13,19 @@ import { useMatch, useNavigate, } from 'react-router-dom'; -import AssetManager, { getAssetFromVersion } from '../../asset_manager'; -import useApiError from '../useApiError'; -import TagManager from '../../tag_manager'; +import AssetManager, { getAssetFromVersion } from '../../lib/assets/AssetManager'; +import useApiError from '../../hooks/useApiError'; +import TagManager from '../../lib/assets/TagManager'; import { useManagementModals } from '../../app/useManagementModals'; -import { useAppDispatch, useAppState } from '../../app/appState'; -import { fetchAsset } from '../../lib/apiClient'; -import { useApi } from '../../app/ApiContext'; +import { useAppDispatch, useAppState } from '../../lib/store/appState'; +import { fetchAsset } from '../../lib/api/apiClient'; +import { useApi } from '../../lib/context/ApiContext'; import { useWorkspaceSelection } from '../../app/useWorkspaceSelection'; -import { useEntryPointer as useEntryPointerCore } from '../../documents/useEntryPointer'; -import { isTagTransferEvent } from '../../documents/tagTransfer'; -import useDocumentsSelection from '../../documents/hooks/useDocumentsSelection'; -import useBulkDocumentActions from '../../documents/hooks/useBulkDocumentActions'; -import useDocumentsPanelProps from '../../documents/hooks/useDocumentsPanelProps'; +import { useEntryPointer as useEntryPointerCore } from '../features/selection/useEntryPointer'; +import { isTagTransferEvent } from '../features/tagging/tagTransfer'; +import useDocumentsSelection from '../features/selection/useDocumentsSelection'; +import useBulkDocumentActions from './useBulkDocumentActions'; +import useDocumentsPanelProps from '../logic/useDocumentsPanelProps'; import useDocumentPreview from '../../app/useDocumentPreview'; import useSidebarProps from '../../sidebar/useSidebarProps'; import { @@ -36,21 +36,21 @@ import { } from '../../app/workspaceUtils'; import { createDocumentEntryKey, createFolderEntryKey } from '../../app/entryKey'; import useDocumentsSearch from '../../app/useDocumentsSearch'; -import { useStatusToast, type ToastVariant } from '../../contexts/StatusToastContext'; +import { useStatusToast, type ToastVariant } from '../../lib/context/StatusToastContext'; import useAuthManager from './useAuthManager'; import useTenantManager from './useTenantManager'; import useDocuments from './useDocuments'; -import { fetchDocument } from '../../lib/apiClient'; -import useFolderTree from './useFolderTree'; -import useFolderTreeActions from './useFolderTreeActions'; -import useDocumentTagging from './useDocumentTagging'; -import useDocumentUploads from './useDocumentUploads'; -import useDocumentDragHandlers from './useDocumentDragHandlers'; +import { fetchDocument } from '../../lib/api/apiClient'; +import useFolderTree from '../features/folders/useFolderTree'; +import useFolderTreeActions from '../features/folders/useFolderTreeActions'; +import useDocumentTagging from '../features/tagging/useDocumentTagging'; +import useDocumentUploads from '../features/upload/useDocumentUploads'; +import useDocumentDragHandlers from '../features/upload/useDocumentDragHandlers'; import useDocumentMutations from './useDocumentMutations'; import useDetailWorkspace from '../../detail/useDetailWorkspace'; import useWorkspaceTaxonomies from './useWorkspaceTaxonomies'; -import useWorkspaceBreadcrumbs from './useWorkspaceBreadcrumbs'; -import useWorkspaceSelectionSync from './useWorkspaceSelectionSync'; +import useWorkspaceBreadcrumbs from '../logic/useWorkspaceBreadcrumbs'; +import useWorkspaceSelectionSync from '../features/selection/useWorkspaceSelectionSync'; import type { DocumentId, FolderId as FolderIdentifier, Identifier } from '../../types/identifiers'; const EntryType = Object.freeze({ diff --git a/frontend/src/hooks/documents/useTags.ts b/frontend/src/documents/data/useTags.ts similarity index 99% rename from frontend/src/hooks/documents/useTags.ts rename to frontend/src/documents/data/useTags.ts index c14c145..5c6cd88 100644 --- a/frontend/src/hooks/documents/useTags.ts +++ b/frontend/src/documents/data/useTags.ts @@ -2,7 +2,7 @@ import { MutableRefObject, useCallback, useState } from 'react'; import type { TagId, TenantId } from '../../types/identifiers'; import type { Tag } from '../../types/documents'; -import { listTags, updateTag, createTag, deleteTag } from '../../lib/apiClient'; +import { listTags, updateTag, createTag, deleteTag } from '../../lib/api/apiClient'; interface TagManagerInterface { buildPayload: (input: { label?: string; color?: string | null }) => { label: string; color: string | null }; diff --git a/frontend/src/hooks/documents/useTenantManager.ts b/frontend/src/documents/data/useTenantManager.ts similarity index 97% rename from frontend/src/hooks/documents/useTenantManager.ts rename to frontend/src/documents/data/useTenantManager.ts index d73135c..0a6b3c9 100644 --- a/frontend/src/hooks/documents/useTenantManager.ts +++ b/frontend/src/documents/data/useTenantManager.ts @@ -2,7 +2,7 @@ import { MutableRefObject, useCallback } from 'react'; import type { NavigateFunction } from 'react-router-dom'; import type { FolderId, TenantId } from '../../types/identifiers'; -import { api, listTenants, switchTenant } from '../../lib/apiClient'; +import { api, listTenants, switchTenant } from '../../lib/api/apiClient'; interface TenantOption { id?: TenantId; diff --git a/frontend/src/hooks/documents/useWorkspaceTaxonomies.ts b/frontend/src/documents/data/useWorkspaceTaxonomies.ts similarity index 98% rename from frontend/src/hooks/documents/useWorkspaceTaxonomies.ts rename to frontend/src/documents/data/useWorkspaceTaxonomies.ts index c2c9e7f..889943b 100644 --- a/frontend/src/hooks/documents/useWorkspaceTaxonomies.ts +++ b/frontend/src/documents/data/useWorkspaceTaxonomies.ts @@ -1,7 +1,7 @@ import { useEffect, useMemo } from 'react'; import type { Dispatch, MutableRefObject, SetStateAction } from 'react'; import usePasskeys from '../../settings/usePasskeys'; -import TagManager from '../../tag_manager'; +import TagManager from '../../lib/assets/TagManager'; import useCorrespondents from './useCorrespondents'; import useDocumentCorrespondentActions from './useDocumentCorrespondentActions'; import useTags from './useTags'; diff --git a/frontend/src/documents/hooks/useFolderItemLogic.ts b/frontend/src/documents/features/folders/useFolderItemLogic.ts similarity index 95% rename from frontend/src/documents/hooks/useFolderItemLogic.ts rename to frontend/src/documents/features/folders/useFolderItemLogic.ts index 5563992..053192f 100644 --- a/frontend/src/documents/hooks/useFolderItemLogic.ts +++ b/frontend/src/documents/features/folders/useFolderItemLogic.ts @@ -1,6 +1,6 @@ import React, { type DragEvent } from 'react'; -import type { DocumentsViewProps } from '../panel/DocumentsPanel'; -import type { DocumentViewLogic } from './useDocumentViewLogic'; +import type { DocumentsViewProps } from '../../panel/DocumentsPanel'; +import type { DocumentViewLogic } from '../../logic/useDocumentViewLogic'; interface UseFolderItemLogicProps extends DocumentsViewProps { folder: any; diff --git a/frontend/src/hooks/documents/useFolderTree.ts b/frontend/src/documents/features/folders/useFolderTree.ts similarity index 98% rename from frontend/src/hooks/documents/useFolderTree.ts rename to frontend/src/documents/features/folders/useFolderTree.ts index 76b300c..179a90b 100644 --- a/frontend/src/hooks/documents/useFolderTree.ts +++ b/frontend/src/documents/features/folders/useFolderTree.ts @@ -1,16 +1,16 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { getFolderTree, listFolderContents } from '../../lib/apiClient'; +import { getFolderTree, listFolderContents } from '../../../lib/api/apiClient'; import type { Dispatch, MutableRefObject, SetStateAction } from 'react'; -import { createRootNode, DEFAULT_FOLDER_NAME } from '../../app/workspaceUtils'; +import { createRootNode, DEFAULT_FOLDER_NAME } from '../../../app/workspaceUtils'; import { getEntryId, isDocumentEntry, isFolderEntry, createDocumentEntryKey, createFolderEntryKey, -} from '../../app/entryKey'; -import type { FolderId as FolderIdentifier, Identifier } from '../../types/identifiers'; -import type { Document } from '../../types/documents'; +} from '../../../app/entryKey'; +import type { FolderId as FolderIdentifier, Identifier } from '../../../types/identifiers'; +import type { Document } from '../../../types/documents'; type FolderId = FolderIdentifier | 'root'; diff --git a/frontend/src/hooks/documents/useFolderTreeActions.ts b/frontend/src/documents/features/folders/useFolderTreeActions.ts similarity index 98% rename from frontend/src/hooks/documents/useFolderTreeActions.ts rename to frontend/src/documents/features/folders/useFolderTreeActions.ts index ad5adf7..46e9a2a 100644 --- a/frontend/src/hooks/documents/useFolderTreeActions.ts +++ b/frontend/src/documents/features/folders/useFolderTreeActions.ts @@ -1,14 +1,14 @@ import { useCallback, useMemo } from 'react'; import type { DragEvent } from 'react'; -import { DEFAULT_FOLDER_NAME, hasFiles } from '../../app/workspaceUtils'; +import { DEFAULT_FOLDER_NAME, hasFiles } from '../../../app/workspaceUtils'; import { createFolder, deleteFolder, moveFolder as moveFolderRequest, renameFolder as renameFolderRequest, -} from '../../lib/apiClient'; -import type { FolderId } from '../../types/identifiers'; -import type { MessageOptions } from '../../types/documents'; +} from '../../../lib/api/apiClient'; +import type { FolderId } from '../../../types/identifiers'; +import type { MessageOptions } from '../../../types/documents'; type FolderKey = FolderId | 'root'; diff --git a/frontend/src/documents/useInlineRename.ts b/frontend/src/documents/features/renaming/useInlineRename.ts similarity index 100% rename from frontend/src/documents/useInlineRename.ts rename to frontend/src/documents/features/renaming/useInlineRename.ts diff --git a/frontend/src/documents/SelectionAssignmentMenu.tsx b/frontend/src/documents/features/selection/SelectionAssignmentMenu.tsx similarity index 98% rename from frontend/src/documents/SelectionAssignmentMenu.tsx rename to frontend/src/documents/features/selection/SelectionAssignmentMenu.tsx index edec50f..c6843ed 100644 --- a/frontend/src/documents/SelectionAssignmentMenu.tsx +++ b/frontend/src/documents/features/selection/SelectionAssignmentMenu.tsx @@ -1,6 +1,6 @@ import React, { CSSProperties, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import useFloatingMenu from '../ui/useFloatingMenu'; -import { CheckIcon, CircleDashedCheckIcon, PlusIcon } from '../ui/icons'; +import useFloatingMenu from '../../../components/useFloatingMenu'; +import { CheckIcon, CircleDashedCheckIcon, PlusIcon } from '../../../components/icons'; type AssignmentState = 'all' | 'partial' | 'none'; diff --git a/frontend/src/documents/SelectionFloatingActions.tsx b/frontend/src/documents/features/selection/SelectionFloatingActions.tsx similarity index 97% rename from frontend/src/documents/SelectionFloatingActions.tsx rename to frontend/src/documents/features/selection/SelectionFloatingActions.tsx index 5707980..9521865 100644 --- a/frontend/src/documents/SelectionFloatingActions.tsx +++ b/frontend/src/documents/features/selection/SelectionFloatingActions.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { DEFAULT_FOLDER_NAME } from '../constants/workspace'; -import { getFolderTree } from '../lib/apiClient'; +import { DEFAULT_FOLDER_NAME } from '../../../constants/workspace'; +import { getFolderTree } from '../../../lib/api/apiClient'; import { TrashIcon, AnalyzeIcon, @@ -8,14 +8,14 @@ import { FolderOutlineIcon, TagIcon, CorrespondentIcon, -} from '../ui/icons'; +} from '../../../components/icons'; import SelectionAssignmentMenu, { SelectionAssignmentMenuItem } from './SelectionAssignmentMenu'; import SelectionFolderMenu from './SelectionFolderMenu'; import SelectionSummary from './SelectionSummary'; -import { useAppState } from '../app/appState'; -import { useWorkspaceSelectionContext } from '../app/WorkspaceSelectionContext'; -import type { DocumentId } from '../types/identifiers'; -import type { FolderTreeNode } from '../lib/apiTypes'; +import { useAppState } from '../../../lib/store/appState'; +import { useWorkspaceSelectionContext } from '../../../app/WorkspaceSelectionContext'; +import type { DocumentId } from '../../../types/identifiers'; +import type { FolderTreeNode } from '../../../lib/api/apiTypes'; type NullableDocumentId = DocumentId | null; @@ -34,7 +34,7 @@ interface CorrespondentOption { label?: string; } -import type { Document } from '../types/documents'; +import type { Document } from '../../../types/documents'; interface BulkTagMutationArgs { label: string; diff --git a/frontend/src/documents/SelectionFolderMenu.tsx b/frontend/src/documents/features/selection/SelectionFolderMenu.tsx similarity index 98% rename from frontend/src/documents/SelectionFolderMenu.tsx rename to frontend/src/documents/features/selection/SelectionFolderMenu.tsx index d2acf6e..f607888 100644 --- a/frontend/src/documents/SelectionFolderMenu.tsx +++ b/frontend/src/documents/features/selection/SelectionFolderMenu.tsx @@ -1,12 +1,12 @@ import React, { CSSProperties, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import useFloatingMenu from '../ui/useFloatingMenu'; +import useFloatingMenu from '../../../components/useFloatingMenu'; import { ArrowLeftIcon, FolderIcon, FolderMoveIcon, -} from '../ui/icons'; -import type { FolderTreeNode } from '../lib/apiTypes'; -import type { DocumentId } from '../types/identifiers'; +} from '../../../components/icons'; +import type { FolderTreeNode } from '../../../lib/api/apiTypes'; +import type { DocumentId } from '../../../types/identifiers'; interface SelectionFolderMenuProps { label: React.ReactNode; diff --git a/frontend/src/documents/SelectionSummary.tsx b/frontend/src/documents/features/selection/SelectionSummary.tsx similarity index 95% rename from frontend/src/documents/SelectionSummary.tsx rename to frontend/src/documents/features/selection/SelectionSummary.tsx index 879680b..40902f7 100644 --- a/frontend/src/documents/SelectionSummary.tsx +++ b/frontend/src/documents/features/selection/SelectionSummary.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { FileIcon, FolderOutlineIcon } from '../ui/icons'; +import { FileIcon, FolderOutlineIcon } from '../../../components/icons'; interface SelectionSummaryProps { documentCount?: number; diff --git a/frontend/src/documents/hooks/useDocumentsSelection.ts b/frontend/src/documents/features/selection/useDocumentsSelection.ts similarity index 97% rename from frontend/src/documents/hooks/useDocumentsSelection.ts rename to frontend/src/documents/features/selection/useDocumentsSelection.ts index 04129df..44f66cf 100644 --- a/frontend/src/documents/hooks/useDocumentsSelection.ts +++ b/frontend/src/documents/features/selection/useDocumentsSelection.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useRef } from 'react'; import type { Dispatch, SetStateAction } from 'react'; -import { createDocumentEntryKey, createFolderEntryKey, isFolderEntry } from '../../app/entryKey'; -import type { DocumentId, FolderId } from '../../types/identifiers'; +import { createDocumentEntryKey, createFolderEntryKey, isFolderEntry } from '../../../app/entryKey'; +import type { DocumentId, FolderId } from '../../../types/identifiers'; interface FolderEntry { id: FolderId; diff --git a/frontend/src/documents/useEntryPointer.ts b/frontend/src/documents/features/selection/useEntryPointer.ts similarity index 98% rename from frontend/src/documents/useEntryPointer.ts rename to frontend/src/documents/features/selection/useEntryPointer.ts index df44bca..b43f5ab 100644 --- a/frontend/src/documents/useEntryPointer.ts +++ b/frontend/src/documents/features/selection/useEntryPointer.ts @@ -1,5 +1,5 @@ import { useCallback } from 'react'; -import { createDocumentEntryKey, createFolderEntryKey } from '../app/entryKey'; +import { createDocumentEntryKey, createFolderEntryKey } from '../../../app/entryKey'; type PointerEventLike = MouseEvent | PointerEvent; diff --git a/frontend/src/hooks/documents/useWorkspaceSelectionSync.ts b/frontend/src/documents/features/selection/useWorkspaceSelectionSync.ts similarity index 96% rename from frontend/src/hooks/documents/useWorkspaceSelectionSync.ts rename to frontend/src/documents/features/selection/useWorkspaceSelectionSync.ts index b3e2b15..e67f5b5 100644 --- a/frontend/src/hooks/documents/useWorkspaceSelectionSync.ts +++ b/frontend/src/documents/features/selection/useWorkspaceSelectionSync.ts @@ -1,6 +1,6 @@ import { useEffect } from 'react'; import type { MutableRefObject } from 'react'; -import type { Identifier } from '../../types/identifiers'; +import type { Identifier } from '../../../types/identifiers'; interface UseWorkspaceSelectionSyncArgs { showingSearchResults: boolean; diff --git a/frontend/src/documents/tagTransfer.ts b/frontend/src/documents/features/tagging/tagTransfer.ts similarity index 95% rename from frontend/src/documents/tagTransfer.ts rename to frontend/src/documents/features/tagging/tagTransfer.ts index a8e82fc..9f43a56 100644 --- a/frontend/src/documents/tagTransfer.ts +++ b/frontend/src/documents/features/tagging/tagTransfer.ts @@ -1,5 +1,5 @@ -import type { DocumentId, TagId } from '../types/identifiers'; -import { TAG_MIME_TYPES, TAG_TEXT_MIME_TYPE } from '../constants/documents'; +import type { DocumentId, TagId } from '../../../types/identifiers'; +import { TAG_MIME_TYPES, TAG_TEXT_MIME_TYPE } from '../../../constants/documents'; interface TagPayload { id: TagId; diff --git a/frontend/src/hooks/documents/useDocumentTagging.ts b/frontend/src/documents/features/tagging/useDocumentTagging.ts similarity index 98% rename from frontend/src/hooks/documents/useDocumentTagging.ts rename to frontend/src/documents/features/tagging/useDocumentTagging.ts index fb64b65..c6d2baf 100644 --- a/frontend/src/hooks/documents/useDocumentTagging.ts +++ b/frontend/src/documents/features/tagging/useDocumentTagging.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react'; -import type { Identifier } from '../../types/identifiers'; +import type { Identifier } from '../../../types/identifiers'; interface TagRecord { id?: Identifier; @@ -8,7 +8,7 @@ interface TagRecord { [key: string]: unknown; } -import { createTag, bulkTagDocuments, bulkReanalyzeDocuments } from '../../lib/apiClient'; +import { createTag, bulkTagDocuments, bulkReanalyzeDocuments } from '../../../lib/api/apiClient'; interface TagManager { buildPayload: (input: { label: string }) => Record; diff --git a/frontend/src/hooks/documents/useDocumentDragHandlers.ts b/frontend/src/documents/features/upload/useDocumentDragHandlers.ts similarity index 98% rename from frontend/src/hooks/documents/useDocumentDragHandlers.ts rename to frontend/src/documents/features/upload/useDocumentDragHandlers.ts index 32be931..3427c9c 100644 --- a/frontend/src/hooks/documents/useDocumentDragHandlers.ts +++ b/frontend/src/documents/features/upload/useDocumentDragHandlers.ts @@ -1,12 +1,12 @@ import { useCallback, useEffect, useMemo, useRef } from 'react'; import type { DragEvent } from 'react'; -import { createDocumentEntryKey, createFolderEntryKey } from '../../app/entryKey'; -import type { FolderId, Identifier } from '../../types/identifiers'; +import { createDocumentEntryKey, createFolderEntryKey } from '../../../app/entryKey'; +import type { FolderId, Identifier } from '../../../types/identifiers'; type FolderIdentifier = FolderId | 'root'; type FolderInput = FolderIdentifier | number; -import type { Document } from '../../types/documents'; +import type { Document } from '../../../types/documents'; type ApplySelectionFn = ( keys: string[], diff --git a/frontend/src/hooks/documents/useDocumentUploads.ts b/frontend/src/documents/features/upload/useDocumentUploads.ts similarity index 98% rename from frontend/src/hooks/documents/useDocumentUploads.ts rename to frontend/src/documents/features/upload/useDocumentUploads.ts index 617db5a..8036249 100644 --- a/frontend/src/hooks/documents/useDocumentUploads.ts +++ b/frontend/src/documents/features/upload/useDocumentUploads.ts @@ -1,9 +1,9 @@ import { useCallback, useRef, useState } from 'react'; import type { Dispatch, MutableRefObject, SetStateAction } from 'react'; import useFileDrop from './useFileDrop'; -import { DEFAULT_FOLDER_NAME, hasFiles } from '../../app/workspaceUtils'; -import { fetchDocument, uploadDocument, resolveFolderPath } from '../../lib/apiClient'; -import type { Identifier } from '../../types/identifiers'; +import { DEFAULT_FOLDER_NAME, hasFiles } from '../../../app/workspaceUtils'; +import { fetchDocument, uploadDocument, resolveFolderPath } from '../../../lib/api/apiClient'; +import type { Identifier } from '../../../types/identifiers'; type FolderId = Identifier | 'root' | null; diff --git a/frontend/src/hooks/documents/useFileDrop.ts b/frontend/src/documents/features/upload/useFileDrop.ts similarity index 100% rename from frontend/src/hooks/documents/useFileDrop.ts rename to frontend/src/documents/features/upload/useFileDrop.ts diff --git a/frontend/src/documents/hooks/useDocumentItemLogic.ts b/frontend/src/documents/logic/useDocumentItemLogic.ts similarity index 96% rename from frontend/src/documents/hooks/useDocumentItemLogic.ts rename to frontend/src/documents/logic/useDocumentItemLogic.ts index 2602809..373714b 100644 --- a/frontend/src/documents/hooks/useDocumentItemLogic.ts +++ b/frontend/src/documents/logic/useDocumentItemLogic.ts @@ -1,7 +1,7 @@ import React, { type DragEvent } from 'react'; -import { parseTagTransferPayload } from '../tagTransfer'; +import { parseTagTransferPayload } from '../features/tagging/tagTransfer'; import { createDocumentEntryKey } from '../../app/entryKey'; -import { useDocumentOpen } from '../../contexts/DocumentOpenContext'; +import { useDocumentOpen } from '../../lib/context/DocumentOpenContext'; import type { Document } from '../../types/documents'; import type { DocumentsViewProps } from '../panel/DocumentsPanel'; import type { DocumentViewLogic } from './useDocumentViewLogic'; diff --git a/frontend/src/documents/hooks/useDocumentViewLogic.ts b/frontend/src/documents/logic/useDocumentViewLogic.ts similarity index 96% rename from frontend/src/documents/hooks/useDocumentViewLogic.ts rename to frontend/src/documents/logic/useDocumentViewLogic.ts index 9ea765c..8fecc7b 100644 --- a/frontend/src/documents/hooks/useDocumentViewLogic.ts +++ b/frontend/src/documents/logic/useDocumentViewLogic.ts @@ -1,6 +1,6 @@ import { useMemo } from 'react'; import { useWorkspaceSelectionContext } from '../../app/WorkspaceSelectionContext'; -import useInlineRename from '../useInlineRename'; +import useInlineRename from '../features/renaming/useInlineRename'; import type { Document, Folder } from '../../types/documents'; interface UseDocumentViewLogicProps { diff --git a/frontend/src/documents/hooks/useDocumentsNavigation.ts b/frontend/src/documents/logic/useDocumentsNavigation.ts similarity index 99% rename from frontend/src/documents/hooks/useDocumentsNavigation.ts rename to frontend/src/documents/logic/useDocumentsNavigation.ts index f0e38f7..988c861 100644 --- a/frontend/src/documents/hooks/useDocumentsNavigation.ts +++ b/frontend/src/documents/logic/useDocumentsNavigation.ts @@ -1,7 +1,7 @@ import React, { useCallback, useMemo } from 'react'; import type { DocumentsListEntry } from '../../types/documents'; import { useWorkspaceSelectionContext } from '../../app/WorkspaceSelectionContext'; -import { useDocumentOpen } from '../../contexts/DocumentOpenContext'; +import { useDocumentOpen } from '../../lib/context/DocumentOpenContext'; interface UseDocumentsNavigationProps { entries: DocumentsListEntry[]; diff --git a/frontend/src/documents/hooks/useDocumentsPanelProps.ts b/frontend/src/documents/logic/useDocumentsPanelProps.ts similarity index 100% rename from frontend/src/documents/hooks/useDocumentsPanelProps.ts rename to frontend/src/documents/logic/useDocumentsPanelProps.ts diff --git a/frontend/src/hooks/documents/useWorkspaceBreadcrumbs.ts b/frontend/src/documents/logic/useWorkspaceBreadcrumbs.ts similarity index 100% rename from frontend/src/hooks/documents/useWorkspaceBreadcrumbs.ts rename to frontend/src/documents/logic/useWorkspaceBreadcrumbs.ts diff --git a/frontend/src/documents/panel/DocumentsPanel.tsx b/frontend/src/documents/panel/DocumentsPanel.tsx index 2fd501a..a6688ab 100644 --- a/frontend/src/documents/panel/DocumentsPanel.tsx +++ b/frontend/src/documents/panel/DocumentsPanel.tsx @@ -13,9 +13,9 @@ import type { Document, DocumentTag, } from '../../types/documents'; -import DesktopWorkspace from '../../desktop/DesktopWorkspace'; -import { isTagTransferEvent } from '../tagTransfer'; -import { isPointerModifierEvent, isPrimaryPointerEvent } from '../useEntryPointer'; +import DesktopWorkspace from '../../desktop/components/DesktopWorkspace'; +import { isTagTransferEvent } from '../features/tagging/tagTransfer'; +import { isPointerModifierEvent, isPrimaryPointerEvent } from '../features/selection/useEntryPointer'; import { WorkspaceSelectionProvider, useWorkspaceSelectionContext, @@ -25,7 +25,7 @@ import DocumentsPanelHeader, { DocumentsPanelHeaderConfig, DocumentsHeaderBreadcrumb, } from './DocumentsPanelHeader'; -import { SelectionFloatingPanel } from '../SelectionFloatingActions'; +import { SelectionFloatingPanel } from '../features/selection/SelectionFloatingActions'; import { createDocumentsTableHeaderActions } from './DocumentsToolbar'; import { useDocumentsFilter } from '../context/DocumentsFilterContext'; import { diff --git a/frontend/src/documents/panel/DocumentsPanelHeader.tsx b/frontend/src/documents/panel/DocumentsPanelHeader.tsx index cae6b80..a56def3 100644 --- a/frontend/src/documents/panel/DocumentsPanelHeader.tsx +++ b/frontend/src/documents/panel/DocumentsPanelHeader.tsx @@ -1,7 +1,7 @@ import React from 'react'; import type { ReactNode } from 'react'; -import PanelHeader from '../../ui/PanelHeader'; -import BreadcrumbTrail from '../../ui/BreadcrumbTrail'; +import PanelHeader from '../../components/PanelHeader'; +import BreadcrumbTrail from '../../components/BreadcrumbTrail'; import type { Identifier } from '../../types/identifiers'; export interface DocumentsHeaderBreadcrumb { diff --git a/frontend/src/documents/panel/DocumentsToolbar.tsx b/frontend/src/documents/panel/DocumentsToolbar.tsx index 45c18a6..0300834 100644 --- a/frontend/src/documents/panel/DocumentsToolbar.tsx +++ b/frontend/src/documents/panel/DocumentsToolbar.tsx @@ -9,7 +9,7 @@ import { FoldersOffIcon, SortAscendingLettersIcon, SortDescendingLettersIcon, -} from '../../ui/icons'; +} from '../../components/icons'; import SortFieldQuickMenu from './SortFieldQuickMenu'; type ViewMode = 'list' | 'grid' | 'desk' | (string & {}); diff --git a/frontend/src/documents/panel/SortFieldQuickMenu.tsx b/frontend/src/documents/panel/SortFieldQuickMenu.tsx index d603e78..9e20392 100644 --- a/frontend/src/documents/panel/SortFieldQuickMenu.tsx +++ b/frontend/src/documents/panel/SortFieldQuickMenu.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useMemo } from 'react'; import { SORT_LABEL_LOOKUP, SORT_OPTIONS } from '../../constants/documents'; -import QuickAddMenu from '../../ui/QuickAddMenu'; +import QuickAddMenu from '../../components/QuickAddMenu'; interface SortFieldQuickMenuProps { sortField: string; diff --git a/frontend/src/styles/documents/controls.css b/frontend/src/documents/styles/controls.css similarity index 100% rename from frontend/src/styles/documents/controls.css rename to frontend/src/documents/styles/controls.css diff --git a/frontend/src/styles/documents/drag-preview.css b/frontend/src/documents/styles/drag-preview.css similarity index 100% rename from frontend/src/styles/documents/drag-preview.css rename to frontend/src/documents/styles/drag-preview.css diff --git a/frontend/src/styles/documents/listing.css b/frontend/src/documents/styles/listing.css similarity index 100% rename from frontend/src/styles/documents/listing.css rename to frontend/src/documents/styles/listing.css diff --git a/frontend/src/styles/documents/panel-sections.css b/frontend/src/documents/styles/panel-sections.css similarity index 100% rename from frontend/src/styles/documents/panel-sections.css rename to frontend/src/documents/styles/panel-sections.css diff --git a/frontend/src/styles/documents/shared-snippets.css b/frontend/src/documents/styles/shared-snippets.css similarity index 100% rename from frontend/src/styles/documents/shared-snippets.css rename to frontend/src/documents/styles/shared-snippets.css diff --git a/frontend/src/styles/documents/tags-correspondents.css b/frontend/src/documents/styles/tags-correspondents.css similarity index 100% rename from frontend/src/styles/documents/tags-correspondents.css rename to frontend/src/documents/styles/tags-correspondents.css diff --git a/frontend/src/styles/documents/viewer.css b/frontend/src/documents/styles/viewer.css similarity index 100% rename from frontend/src/styles/documents/viewer.css rename to frontend/src/documents/styles/viewer.css diff --git a/frontend/src/index.tsx b/frontend/src/index.tsx index 9fe1b2c..31e2b4c 100644 --- a/frontend/src/index.tsx +++ b/frontend/src/index.tsx @@ -14,12 +14,12 @@ import DocumentsRoute from './app/DocumentsRoute'; import DropOverlay from './app/DropOverlay'; import LoginRoute from './app/LoginRoute'; import SettingsRoute from './app/SettingsRoute'; -import { AppStateProvider } from './app/appState'; +import { AppStateProvider } from './lib/store/appState'; import { useDocumentsPreferences } from './app/useDocumentsPreferences'; -import { AppShellContext } from './appShellContext'; -import useDocumentsWorkspace from './hooks/documents/useDocumentsWorkspace'; +import { AppShellContext } from './lib/context/AppShellContext'; +import useDocumentsWorkspace from './documents/data/useDocumentsWorkspace'; import UploadQueueOverlay from './app/UploadQueueOverlay'; -import { StatusToastProvider } from './contexts/StatusToastContext'; +import { StatusToastProvider } from './lib/context/StatusToastContext'; import StatusToastOverlay from './components/StatusToastOverlay'; const AppLayout: React.FC = () => { diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api/api.ts similarity index 100% rename from frontend/src/lib/api.ts rename to frontend/src/lib/api/api.ts diff --git a/frontend/src/lib/apiClient.ts b/frontend/src/lib/api/apiClient.ts similarity index 100% rename from frontend/src/lib/apiClient.ts rename to frontend/src/lib/api/apiClient.ts diff --git a/frontend/src/lib/apiTypes.ts b/frontend/src/lib/api/apiTypes.ts similarity index 97% rename from frontend/src/lib/apiTypes.ts rename to frontend/src/lib/api/apiTypes.ts index 7fd1acf..c021103 100644 --- a/frontend/src/lib/apiTypes.ts +++ b/frontend/src/lib/api/apiTypes.ts @@ -1,5 +1,5 @@ // Types aligned with OpenAPI schemas for common endpoints. -import type { Identifier } from '../types/identifiers'; +import type { Identifier } from '../../types/identifiers'; export type { Identifier }; diff --git a/frontend/src/asset_manager.ts b/frontend/src/lib/assets/AssetManager.ts similarity index 96% rename from frontend/src/asset_manager.ts rename to frontend/src/lib/assets/AssetManager.ts index 72f5183..2ad4b32 100644 --- a/frontend/src/asset_manager.ts +++ b/frontend/src/lib/assets/AssetManager.ts @@ -1,6 +1,6 @@ -import type { Identifier } from './types/identifiers'; -import type { Asset } from './types/assets'; -import type { DocumentVersion, Document } from './types/documents'; +import type { Identifier } from '../../types/identifiers'; +import type { Asset } from '../../types/assets'; +import type { DocumentVersion, Document } from '../../types/documents'; type Nullable = T | null; diff --git a/frontend/src/tag_manager.ts b/frontend/src/lib/assets/TagManager.ts similarity index 93% rename from frontend/src/tag_manager.ts rename to frontend/src/lib/assets/TagManager.ts index 93406e5..3a84bbe 100644 --- a/frontend/src/tag_manager.ts +++ b/frontend/src/lib/assets/TagManager.ts @@ -1,4 +1,4 @@ -import { generateRandomTagColor } from './utils/colors'; +import { generateRandomTagColor } from '../../utils/colors'; type ColorGenerator = () => string; diff --git a/frontend/src/app/ApiContext.tsx b/frontend/src/lib/context/ApiContext.tsx similarity index 86% rename from frontend/src/app/ApiContext.tsx rename to frontend/src/lib/context/ApiContext.tsx index 62ee18d..d51110d 100644 --- a/frontend/src/app/ApiContext.tsx +++ b/frontend/src/lib/context/ApiContext.tsx @@ -1,7 +1,7 @@ import React, { useEffect, useMemo } from 'react'; import type { PropsWithChildren } from 'react'; -import { httpClient, setAuthToken, clearAuthToken } from '../lib/apiClient'; -import { createSafeContext } from '../utils/createSafeContext'; +import { httpClient, setAuthToken, clearAuthToken } from '../api/apiClient'; +import { createSafeContext } from '../../utils/createSafeContext'; type HttpClient = typeof httpClient; diff --git a/frontend/src/appShellContext.ts b/frontend/src/lib/context/AppShellContext.ts similarity index 69% rename from frontend/src/appShellContext.ts rename to frontend/src/lib/context/AppShellContext.ts index d869a9a..ec7e660 100644 --- a/frontend/src/appShellContext.ts +++ b/frontend/src/lib/context/AppShellContext.ts @@ -1,4 +1,4 @@ -import { createSafeContext } from './utils/createSafeContext'; +import { createSafeContext } from '../../utils/createSafeContext'; type AppShellContextValue = Record; diff --git a/frontend/src/contexts/DocumentOpenContext.tsx b/frontend/src/lib/context/DocumentOpenContext.tsx similarity index 89% rename from frontend/src/contexts/DocumentOpenContext.tsx rename to frontend/src/lib/context/DocumentOpenContext.tsx index 5889372..c84f2bb 100644 --- a/frontend/src/contexts/DocumentOpenContext.tsx +++ b/frontend/src/lib/context/DocumentOpenContext.tsx @@ -1,7 +1,7 @@ import React, { useCallback } from 'react'; -import type { Document } from '../types/documents'; -import type { Identifier } from '../types/identifiers'; -import { createSafeContext } from '../utils/createSafeContext'; +import type { Document } from '../../types/documents'; +import type { Identifier } from '../../types/identifiers'; +import { createSafeContext } from '../../utils/createSafeContext'; type DocumentOpenTarget = 'preview' | 'sidepanel' | 'viewer'; diff --git a/frontend/src/contexts/StatusToastContext.tsx b/frontend/src/lib/context/StatusToastContext.tsx similarity index 97% rename from frontend/src/contexts/StatusToastContext.tsx rename to frontend/src/lib/context/StatusToastContext.tsx index 16eae7a..ce11438 100644 --- a/frontend/src/contexts/StatusToastContext.tsx +++ b/frontend/src/lib/context/StatusToastContext.tsx @@ -1,5 +1,5 @@ import React, { useState, useCallback, useEffect, useRef } from 'react'; -import { createSafeContext } from '../utils/createSafeContext'; +import { createSafeContext } from '../../utils/createSafeContext'; export type ToastVariant = 'info' | 'success' | 'error'; diff --git a/frontend/src/app/appState.tsx b/frontend/src/lib/store/appState.tsx similarity index 96% rename from frontend/src/app/appState.tsx rename to frontend/src/lib/store/appState.tsx index fd28207..b773bef 100644 --- a/frontend/src/app/appState.tsx +++ b/frontend/src/lib/store/appState.tsx @@ -1,9 +1,9 @@ import React, { useEffect, useMemo, useReducer } from 'react'; -import { createSafeContext } from '../utils/createSafeContext'; -import { clearAuthToken, setAuthToken, setAuthRefreshHandlers } from '../lib/apiClient'; -import { ApiProvider } from './ApiContext'; -import { listTenants } from '../lib/apiClient'; -import { STORED_TOKEN_KEY } from '../constants/app'; +import { createSafeContext } from '../../utils/createSafeContext'; +import { clearAuthToken, setAuthToken, setAuthRefreshHandlers } from '../api/apiClient'; +import { ApiProvider } from '../context/ApiContext'; +import { listTenants } from '../api/apiClient'; +import { STORED_TOKEN_KEY } from '../../constants/app'; type Tenant = Record | null; diff --git a/frontend/src/styles/auth/login.css b/frontend/src/login/login.css similarity index 100% rename from frontend/src/styles/auth/login.css rename to frontend/src/login/login.css diff --git a/frontend/src/preview/DocumentViewerPanel.tsx b/frontend/src/preview/DocumentViewerPanel.tsx index 010e61d..ff68011 100644 --- a/frontend/src/preview/DocumentViewerPanel.tsx +++ b/frontend/src/preview/DocumentViewerPanel.tsx @@ -10,7 +10,7 @@ import { CloseIcon, IconZoomInArea, WindowMaximizeIcon, -} from '../ui/icons'; +} from '../components/icons'; import { buildCorrespondentOptions, sortCorrespondents, @@ -19,9 +19,9 @@ import { usePreviewContext } from '../preview/PreviewContext'; import type { DocumentSummarySectionProps } from '../documents/DocumentSummarySection'; import { extractDocumentMetadataPayload } from '../documents/documentSummary'; import { createDocumentActionState } from '../documents/documentActions'; -import { resolveDocumentAssetUrl } from '../asset_manager'; -import PanelHeader from '../ui/PanelHeader'; -import BreadcrumbTrail from '../ui/BreadcrumbTrail'; +import { resolveDocumentAssetUrl } from '../lib/assets/AssetManager'; +import PanelHeader from '../components/PanelHeader'; +import BreadcrumbTrail from '../components/BreadcrumbTrail'; import DocumentViewerLayout from './DocumentViewerLayout'; import { useViewerLayoutMode } from './useViewerLayoutMode'; import { usePanelResizeBindings } from '../app/PanelManagerContext'; diff --git a/frontend/src/preview/MediaViewer.tsx b/frontend/src/preview/MediaViewer.tsx index 305f525..2a6b9ca 100644 --- a/frontend/src/preview/MediaViewer.tsx +++ b/frontend/src/preview/MediaViewer.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { DownloadIcon } from '../ui/icons'; +import { DownloadIcon } from '../components/icons'; import { AUDIO_EXTENSIONS, VIDEO_EXTENSIONS } from '../constants/preview'; interface MediaViewerProps { diff --git a/frontend/src/settings/SettingsModal.tsx b/frontend/src/settings/SettingsModal.tsx index d22bc8d..2f2c723 100644 --- a/frontend/src/settings/SettingsModal.tsx +++ b/frontend/src/settings/SettingsModal.tsx @@ -5,8 +5,8 @@ import React, { useMemo, useState, } from 'react'; -import PanelHeader from '../ui/PanelHeader'; -import { CloseIcon } from '../ui/icons'; +import PanelHeader from '../components/PanelHeader'; +import { CloseIcon } from '../components/icons'; import { DEFAULT_SETTINGS_SECTIONS } from '../constants/settings'; export interface SettingsSectionConfig { diff --git a/frontend/src/settings/components/CapabilityDropdown.tsx b/frontend/src/settings/components/CapabilityDropdown.tsx index 29a0354..a45b5fc 100644 --- a/frontend/src/settings/components/CapabilityDropdown.tsx +++ b/frontend/src/settings/components/CapabilityDropdown.tsx @@ -6,7 +6,7 @@ import { useState, } from 'react'; import type { JSX } from 'react'; -import { CheckIcon, ChevronDownIcon } from '../../ui/icons'; +import { CheckIcon, ChevronDownIcon } from '../../components/icons'; import type { CapabilityValue } from '../../types/identifiers'; export interface CapabilityDropdownOption { diff --git a/frontend/src/settings/sections/CapabilitySetsSection.tsx b/frontend/src/settings/sections/CapabilitySetsSection.tsx index 479a4ef..db0f975 100644 --- a/frontend/src/settings/sections/CapabilitySetsSection.tsx +++ b/frontend/src/settings/sections/CapabilitySetsSection.tsx @@ -5,7 +5,7 @@ import React, { useMemo, useState, } from 'react'; -import { IconX } from '../../ui/icons'; +import { IconX } from '../../components/icons'; import CapabilityDropdown, { CapabilityDropdownOption } from '../components/CapabilityDropdown'; import type { CapabilitySetId, CapabilityValue } from '../../types/identifiers'; diff --git a/frontend/src/styles/settings/settings.css b/frontend/src/settings/settings.css similarity index 100% rename from frontend/src/styles/settings/settings.css rename to frontend/src/settings/settings.css diff --git a/frontend/src/settings/useApiTokens.ts b/frontend/src/settings/useApiTokens.ts index 5e5e511..ecd67cf 100644 --- a/frontend/src/settings/useApiTokens.ts +++ b/frontend/src/settings/useApiTokens.ts @@ -5,7 +5,7 @@ import { listApiTokens, regenerateApiToken, type ApiTokenRecord, -} from '../lib/apiClient'; +} from '../lib/api/apiClient'; import type { ApiTokenId, CapabilitySetId } from '../types/identifiers'; interface ApiTokensResponse { diff --git a/frontend/src/settings/useCapabilities.ts b/frontend/src/settings/useCapabilities.ts index 96f61b4..ab8bb08 100644 --- a/frontend/src/settings/useCapabilities.ts +++ b/frontend/src/settings/useCapabilities.ts @@ -1,5 +1,5 @@ import { useCallback, useEffect, useState } from 'react'; -import { listCapabilities } from '../lib/apiClient'; +import { listCapabilities } from '../lib/api/apiClient'; interface UseCapabilitiesOptions { notifyApiError?: (error: unknown, fallbackMessage: string) => void; diff --git a/frontend/src/settings/useCapabilitySets.ts b/frontend/src/settings/useCapabilitySets.ts index 31dc014..4857f6d 100644 --- a/frontend/src/settings/useCapabilitySets.ts +++ b/frontend/src/settings/useCapabilitySets.ts @@ -4,7 +4,7 @@ import { deleteCapabilitySet as deleteCapabilitySetRequest, listCapabilitySets, updateCapabilitySet as updateCapabilitySetRequest, -} from '../lib/apiClient'; +} from '../lib/api/apiClient'; import type { Identifier } from '../types/identifiers'; interface CapabilitySet { diff --git a/frontend/src/settings/usePasskeys.ts b/frontend/src/settings/usePasskeys.ts index 527eb8c..10c674c 100644 --- a/frontend/src/settings/usePasskeys.ts +++ b/frontend/src/settings/usePasskeys.ts @@ -11,7 +11,7 @@ import { finishPasskeyRegistration, listPasskeys, startPasskeyRegistration, -} from '../lib/apiClient'; +} from '../lib/api/apiClient'; import type { PasskeyId } from '../types/identifiers'; type StatusMessageFn = (message: string, variant?: string) => void; diff --git a/frontend/src/sidebar/components/SidebarCorrespondentList.tsx b/frontend/src/sidebar/components/SidebarCorrespondentList.tsx index b7e4a08..091fc56 100644 --- a/frontend/src/sidebar/components/SidebarCorrespondentList.tsx +++ b/frontend/src/sidebar/components/SidebarCorrespondentList.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo } from 'react'; -import { PlusIcon, SettingsIcon } from '../../ui/icons'; +import { PlusIcon, SettingsIcon } from '../../components/icons'; import type { Identifier } from '../../types/identifiers'; import { useDocumentsFilter } from '../../documents/context/DocumentsFilterContext'; diff --git a/frontend/src/sidebar/components/SidebarFolderList.tsx b/frontend/src/sidebar/components/SidebarFolderList.tsx index 8a95319..cf3046f 100644 --- a/frontend/src/sidebar/components/SidebarFolderList.tsx +++ b/frontend/src/sidebar/components/SidebarFolderList.tsx @@ -1,7 +1,7 @@ import React, { useCallback } from 'react'; import type { ReactNode } from 'react'; import type { Identifier } from '../../types/identifiers'; -import { FolderPlusIcon } from '../../ui/icons'; +import { FolderPlusIcon } from '../../components/icons'; import FolderNode, { FolderIdentifier, FolderTreeNode } from './SidebarFolderNode'; interface SidebarFolderListProps { diff --git a/frontend/src/sidebar/components/SidebarFolderNode.tsx b/frontend/src/sidebar/components/SidebarFolderNode.tsx index 125fcbf..2e78030 100644 --- a/frontend/src/sidebar/components/SidebarFolderNode.tsx +++ b/frontend/src/sidebar/components/SidebarFolderNode.tsx @@ -6,7 +6,7 @@ import { EditIcon, FolderIcon, FolderPlusIcon, -} from '../../ui/icons'; +} from '../../components/icons'; import type { Identifier } from '../../types/identifiers'; export type FolderIdentifier = Identifier | 'root'; diff --git a/frontend/src/sidebar/components/SidebarHeader.tsx b/frontend/src/sidebar/components/SidebarHeader.tsx index 00accdc..c81a27e 100644 --- a/frontend/src/sidebar/components/SidebarHeader.tsx +++ b/frontend/src/sidebar/components/SidebarHeader.tsx @@ -5,9 +5,9 @@ import { ChevronDownIcon, UploadIcon, LogoIcon, -} from '../../ui/icons'; -import PanelHeader from '../../ui/PanelHeader'; -import useFloatingMenu from '../../ui/useFloatingMenu'; +} from '../../components/icons'; +import PanelHeader from '../../components/PanelHeader'; +import useFloatingMenu from '../../components/useFloatingMenu'; import type { Identifier } from '../../types/identifiers'; import SidebarMenu, { TenantOption } from './SidebarMenu'; import { usePanelManager } from '../../app/PanelManagerContext'; diff --git a/frontend/src/sidebar/components/SidebarMenu.tsx b/frontend/src/sidebar/components/SidebarMenu.tsx index 1b3260c..a8ee6f4 100644 --- a/frontend/src/sidebar/components/SidebarMenu.tsx +++ b/frontend/src/sidebar/components/SidebarMenu.tsx @@ -12,7 +12,7 @@ import { SunIcon, MoonIcon, DesktopIcon, -} from '../../ui/icons'; +} from '../../components/icons'; import { useSidebarContext } from '../SidebarContext'; import { THEME_MODE_LABELS, THEME_MODES } from '../../constants/sidebar'; import type { Identifier } from '../../types/identifiers'; diff --git a/frontend/src/sidebar/components/SidebarTagList.tsx b/frontend/src/sidebar/components/SidebarTagList.tsx index cd92dbb..11e294f 100644 --- a/frontend/src/sidebar/components/SidebarTagList.tsx +++ b/frontend/src/sidebar/components/SidebarTagList.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo } from 'react'; -import { PlusIcon, SettingsIcon } from '../../ui/icons'; +import { PlusIcon, SettingsIcon } from '../../components/icons'; import { getTagColorStyle } from '../../utils/colors'; import type { Identifier } from '../../types/identifiers'; import { useDocumentsFilter } from '../../documents/context/DocumentsFilterContext'; diff --git a/frontend/src/styles/sidebar/sidebar.css b/frontend/src/sidebar/sidebar.css similarity index 100% rename from frontend/src/styles/sidebar/sidebar.css rename to frontend/src/sidebar/sidebar.css diff --git a/frontend/src/styles/index.css b/frontend/src/styles/index.css index 8136d04..2424525 100644 --- a/frontend/src/styles/index.css +++ b/frontend/src/styles/index.css @@ -4,21 +4,21 @@ @import './components/resize-handle.css'; @import './preview/preview-zoom.css'; @import './base/iconography.css'; -@import './documents/controls.css'; +@import '../documents/styles/controls.css'; @import './layout/structure.css'; -@import './documents/viewer.css'; -@import './documents/drag-preview.css'; -@import './documents/tags-correspondents.css'; -@import './documents/panel-sections.css'; -@import './sidebar/sidebar.css'; -@import './documents/listing.css'; -@import './detail/detail-panels.css'; +@import '../documents/styles/viewer.css'; +@import '../documents/styles/drag-preview.css'; +@import '../documents/styles/tags-correspondents.css'; +@import '../documents/styles/panel-sections.css'; +@import '../sidebar/sidebar.css'; +@import '../documents/styles/listing.css'; +@import '../detail/detail-panels.css'; @import './forms/elements.css'; @import './modals/status-drop.css'; -@import './settings/settings.css'; +@import '../settings/settings.css'; @import './modals/panel-modals.css'; @import './layout/responsive.css'; -@import './auth/login.css'; -@import './documents/shared-snippets.css'; +@import '../login/login.css'; +@import '../documents/styles/shared-snippets.css'; @import './uploads/overlay.css'; @import './base/text-button.css'; \ No newline at end of file diff --git a/frontend/src/utils/ocr.ts b/frontend/src/utils/ocr.ts index fc24fa1..4577943 100644 --- a/frontend/src/utils/ocr.ts +++ b/frontend/src/utils/ocr.ts @@ -1,7 +1,7 @@ -import { resolveDocumentAssetUrl, resolveAssetUrl } from '../asset_manager'; +import { resolveDocumentAssetUrl, resolveAssetUrl } from '../lib/assets/AssetManager'; import type { GetAsset as AssetManagerGetAsset, -} from '../asset_manager'; +} from '../lib/assets/AssetManager'; import type { Document, } from '../types/documents';