diff --git a/frontend/src/DesktopWorkspace.jsx b/frontend/src/DesktopWorkspace.jsx index 994e8ec..48cd313 100644 --- a/frontend/src/DesktopWorkspace.jsx +++ b/frontend/src/DesktopWorkspace.jsx @@ -10,6 +10,7 @@ import { resolveDocumentAssetUrl, createAssetView } from './asset_manager'; import { useAssetNavigator } from './hooks/useAssetNavigator'; import { ArrowLeftIcon, ArrowRightIcon } from './ui/icons'; import { createDocumentsTableHeaderActions } from './documents/DocumentsTable'; +import createWorkspaceSurfaceConfig from './documents/workspaceHeader'; import { clamp, formatTransform } from './desktop/math'; import { preventAll } from './desktop/events'; import useDocumentDrag from './desktop/useDocumentDrag'; @@ -2017,7 +2018,12 @@ const DesktopWorkspaceView = () => { export default DesktopWorkspace; -export const createDesktopSurface = ({ workspaceProps, renderSidebarToggle }) => { +export const createDesktopSurface = ({ + workspaceProps, + renderSidebarToggle, + parentBreadcrumb, + onNavigateParent, +}) => { if (!workspaceProps) { return null; } @@ -2034,26 +2040,28 @@ export const createDesktopSurface = ({ workspaceProps, renderSidebarToggle }) => ? `${searchResults.length} matching document${searchResults.length === 1 ? '' : 's'}` : null; - const sidebarToggle = renderSidebarToggle ? renderSidebarToggle() : null; - const leading = sidebarToggle ? <>{sidebarToggle} : null; - const actions = createDocumentsTableHeaderActions({ viewMode: viewMode || 'desk', onViewModeChange, onRefresh, }); - return { + const sidebarToggle = renderSidebarToggle ? renderSidebarToggle() : null; + const surfaceConfig = createWorkspaceSurfaceConfig({ key: 'workspace', variant: 'workspace', - header: { - title, - subtitle, - leading, - actions, - breadcrumbs: workspaceProps?.breadcrumbs || null, - }, + title, + subtitle, + sidebarToggle, + parentBreadcrumb, + onNavigateParent, + actions, + breadcrumbs: workspaceProps?.breadcrumbs || null, content: , + }); + + return { + ...surfaceConfig, supportsDetail: false, }; }; diff --git a/frontend/src/app/useWorkspaceSurface.js b/frontend/src/app/useWorkspaceSurface.js index 02ba3d0..2099103 100644 --- a/frontend/src/app/useWorkspaceSurface.js +++ b/frontend/src/app/useWorkspaceSurface.js @@ -101,8 +101,10 @@ export const useWorkspaceSurface = ({ return createDesktopSurface({ workspaceProps: deskWorkspaceProps, renderSidebarToggle, + parentBreadcrumb, + onNavigateParent: parentBreadcrumb ? onNavigateParent : null, }); - }, [viewMode, deskWorkspaceProps, renderSidebarToggle]); + }, [viewMode, deskWorkspaceProps, renderSidebarToggle, parentBreadcrumb, onNavigateParent]); const surface = useMemo(() => { if (showPreviewWorkspace) { diff --git a/frontend/src/documents/DocumentsTable.jsx b/frontend/src/documents/DocumentsTable.jsx index ee1d8ae..57be1e3 100644 --- a/frontend/src/documents/DocumentsTable.jsx +++ b/frontend/src/documents/DocumentsTable.jsx @@ -1,7 +1,6 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { getAssetFromVersion, resolveDocumentAssetUrl, createAssetView } from '../asset_manager'; import { getTagColorStyle } from '../utils/colors'; -import DetailPanel from '../detail/DetailPanel'; import { DownloadIcon, EditIcon, @@ -12,9 +11,10 @@ import { TrashIcon, RefreshIcon, MinusVerticalIcon, - ArrowUpIcon, } from '../ui/icons'; import BreadcrumbTrail from '../ui/BreadcrumbTrail'; +import createWorkspaceSurfaceConfig from './workspaceHeader'; +import DetailPanel from '../detail/DetailPanel'; const TAG_MIME_TYPES = ['application/x-papercrate-tag', 'text/papercrate-tag']; const DEFAULT_GRID_ICON_SIZE = 144; @@ -1161,35 +1161,21 @@ export const createDocumentsSurface = ({ }); const sidebarToggle = renderSidebarToggle ? renderSidebarToggle() : null; - const parentControl = parentBreadcrumb - ? ( - - ) - : null; - const leading = sidebarToggle || parentControl - ? ( - <> - {sidebarToggle} - {parentControl} - - ) - : null; - const detail = detailOpen && detailProps ? : null; - return { + const surfaceConfig = createWorkspaceSurfaceConfig({ key: 'documents', variant: 'documents', - header: { title, subtitle, leading, actions, breadcrumbs }, + title, + subtitle, + sidebarToggle, + parentBreadcrumb, + onNavigateParent, + actions, + breadcrumbs, content: , detail, - }; + }); + + return surfaceConfig; }; diff --git a/frontend/src/documents/workspaceHeader.js b/frontend/src/documents/workspaceHeader.js new file mode 100644 index 0000000..43a4654 --- /dev/null +++ b/frontend/src/documents/workspaceHeader.js @@ -0,0 +1,55 @@ +import React from 'react'; +import { ArrowUpIcon } from '../ui/icons'; + +export const createWorkspaceSurfaceConfig = ({ + title, + subtitle = null, + sidebarToggle = null, + parentBreadcrumb = null, + onNavigateParent = null, + actions = null, + breadcrumbs = null, + content = null, + detail = null, + variant = 'documents', + key = 'documents', +}) => { + const showParent = parentBreadcrumb && typeof onNavigateParent === 'function'; + + const parentControl = showParent ? ( + + ) : null; + + const leading = sidebarToggle || parentControl + ? ( + <> + {sidebarToggle} + {parentControl} + + ) + : null; + + return { + key, + variant, + header: { + title, + subtitle, + leading, + actions, + breadcrumbs, + }, + content, + detail, + }; +}; + +export default createWorkspaceSurfaceConfig; diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 4280b69..98fe922 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -2395,7 +2395,7 @@ button.danger:hover:not([disabled]) { .panel-header { display: flex; align-items: center; - gap: 0.75rem; + gap: 0.5rem; padding: 0.5rem; min-width: 0; } @@ -2404,7 +2404,7 @@ button.danger:hover:not([disabled]) { .panel-header__actions { display: flex; align-items: center; - gap: 0.5rem; + gap: 0.25rem; } .panel-header__title {