sidebar
This commit is contained in:
@@ -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 (
|
||||||
{children}
|
<main className={`documents-main${collapsed ? ' documents-main--sidebar-collapsed' : ''}`}>
|
||||||
</main>
|
{!collapsed ? <Sidebar {...sidebarProps} /> : null}
|
||||||
);
|
{children}
|
||||||
|
</main>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
export default DocumentsLayout;
|
export default DocumentsLayout;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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;
|
||||||
Reference in New Issue
Block a user