This commit is contained in:
2025-11-01 19:50:29 +01:00
parent 41c9ae30e9
commit e752361f39
4 changed files with 59 additions and 24 deletions
+7 -3
View File
@@ -1,11 +1,15 @@
import React from 'react'; import React from 'react';
import Sidebar from '../sidebar/Sidebar'; import Sidebar from '../sidebar/Sidebar';
import { useSidebarContext } from '../sidebar/SidebarContext';
const DocumentsLayout = ({ sidebarProps, children, sidebarCollapsed }) => ( const DocumentsLayout = ({ sidebarProps, children }) => {
<main className={`documents-main${sidebarCollapsed ? ' documents-main--sidebar-collapsed' : ''}`}> const { collapsed } = useSidebarContext();
{!sidebarCollapsed ? <Sidebar {...sidebarProps} /> : null} return (
<main className={`documents-main${collapsed ? ' documents-main--sidebar-collapsed' : ''}`}>
{!collapsed ? <Sidebar {...sidebarProps} /> : null}
{children} {children}
</main> </main>
); );
};
export default DocumentsLayout; export default DocumentsLayout;
+14 -15
View File
@@ -1,12 +1,13 @@
import React, { useCallback, useMemo, useState } from 'react'; import React, { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { useAppShell } from '../appShellContext'; import { useAppShell } from '../appShellContext';
import DocumentsLayout from './DocumentsLayout'; import DocumentsLayout from './DocumentsLayout';
import { useWorkspaceSurface } from './useWorkspaceSurface'; import { useWorkspaceSurface } from './useWorkspaceSurface';
import PanelHeader from '../ui/PanelHeader'; import PanelHeader from '../ui/PanelHeader';
import BreadcrumbTrail from '../ui/BreadcrumbTrail'; import BreadcrumbTrail from '../ui/BreadcrumbTrail';
import { SidebarProvider, useSidebarContext } from '../sidebar/SidebarContext';
const DocumentsRoute = () => { const DocumentsRouteContent = () => {
const { const {
sidebarProps, sidebarProps,
documentsTableProps, documentsTableProps,
@@ -28,19 +29,17 @@ const DocumentsRoute = () => {
notifyApiError, notifyApiError,
} = useAppShell(); } = useAppShell();
const navigate = useNavigate(); const navigate = useNavigate();
const { collapsed: sidebarCollapsed, setCollapsed } = useSidebarContext();
const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const expandSidebar = useCallback(() => setCollapsed(false), [setCollapsed]);
const collapseSidebar = useCallback(() => setSidebarCollapsed(true), []);
const expandSidebar = useCallback(() => setSidebarCollapsed(false), []);
const sidebarPropsWithActions = useMemo( const sidebarPropsWithActions = useMemo(
() => ({ () => ({
...sidebarProps, ...sidebarProps,
onManageTags: openTagsModal, onManageTags: openTagsModal,
onManageCorrespondents: openCorrespondentsModal, onManageCorrespondents: openCorrespondentsModal,
onCollapse: collapseSidebar,
}), }),
[sidebarProps, openTagsModal, openCorrespondentsModal, collapseSidebar], [sidebarProps, openTagsModal, openCorrespondentsModal],
); );
const breadcrumbs = documentsTableProps?.breadcrumbs || null; const breadcrumbs = documentsTableProps?.breadcrumbs || null;
@@ -93,10 +92,7 @@ const DocumentsRoute = () => {
if (!surface) { if (!surface) {
return ( return (
<DocumentsLayout <DocumentsLayout sidebarProps={sidebarPropsWithActions}>
sidebarProps={sidebarPropsWithActions}
sidebarCollapsed={sidebarCollapsed}
>
<div className="main-content main-content--documents"> <div className="main-content main-content--documents">
<div className="main-content__body main-content__body--documents" /> <div className="main-content__body main-content__body--documents" />
</div> </div>
@@ -142,10 +138,7 @@ const DocumentsRoute = () => {
} }
return ( return (
<DocumentsLayout <DocumentsLayout sidebarProps={sidebarPropsWithActions}>
sidebarProps={sidebarPropsWithActions}
sidebarCollapsed={sidebarCollapsed}
>
<div className={mainContentClass}> <div className={mainContentClass}>
{header ? ( {header ? (
<PanelHeader <PanelHeader
@@ -163,4 +156,10 @@ const DocumentsRoute = () => {
); );
}; };
const DocumentsRoute = () => (
<SidebarProvider>
<DocumentsRouteContent />
</SidebarProvider>
);
export default DocumentsRoute; export default DocumentsRoute;
+7 -3
View File
@@ -21,6 +21,7 @@ import PanelHeader from '../ui/PanelHeader';
import useFloatingMenu from '../ui/useFloatingMenu'; import useFloatingMenu from '../ui/useFloatingMenu';
import { getTagColorStyle } from '../utils/colors'; import { getTagColorStyle } from '../utils/colors';
import { useSidebarContext } from './SidebarContext';
const FolderNode = ({ const FolderNode = ({
node, node,
@@ -177,13 +178,16 @@ const Sidebar = ({
isFilterActive, isFilterActive,
onLogout, onLogout,
status, status,
onCollapse,
tenantName, tenantName,
tenants = [], tenants = [],
activeTenantId = null, activeTenantId = null,
onSelectTenant, onSelectTenant,
onOpenSettings, onOpenSettings,
}) => { }) => {
const { setCollapsed } = useSidebarContext();
const handleCollapse = useCallback(() => {
setCollapsed(true);
}, [setCollapsed]);
const neutralHueInputId = useId(); const neutralHueInputId = useId();
const sortedCorrespondents = useMemo(() => { const sortedCorrespondents = useMemo(() => {
if (!Array.isArray(correspondents)) { if (!Array.isArray(correspondents)) {
@@ -504,14 +508,14 @@ const Sidebar = ({
</> </>
)} )}
actions={ actions={
onCollapse handleCollapse
? [ ? [
( (
<button <button
key="collapse" key="collapse"
type="button" type="button"
className="icon-button" className="icon-button"
onClick={onCollapse} onClick={handleCollapse}
aria-label="Collapse sidebar" aria-label="Collapse sidebar"
title="Collapse sidebar" title="Collapse sidebar"
> >
+28
View File
@@ -0,0 +1,28 @@
import React, { createContext, useContext, useMemo, useState, useCallback } from 'react';
const SidebarContext = createContext(null);
export const SidebarProvider = ({ initialCollapsed = false, children }) => {
const [collapsed, setCollapsed] = useState(initialCollapsed);
const contextValue = useMemo(() => ({ collapsed, setCollapsed }), [collapsed]);
return <SidebarContext.Provider value={contextValue}>{children}</SidebarContext.Provider>;
};
export const useSidebarContext = () => {
const context = useContext(SidebarContext);
if (!context) {
throw new Error('useSidebarContext must be used within a SidebarProvider');
}
return context;
};
export const useSidebarControls = () => {
const { setCollapsed } = useSidebarContext();
const openSidebar = useCallback(() => setCollapsed(false), [setCollapsed]);
const closeSidebar = useCallback(() => setCollapsed(true), [setCollapsed]);
return { openSidebar, closeSidebar };
};
export default SidebarContext;