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 {