BasicLayout.tsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import React, { ReactNode } from 'react';
  2. import dynamic from 'next/dynamic';
  3. import { DndProvider } from 'react-dnd';
  4. import { HTML5Backend } from 'react-dnd-html5-backend';
  5. import { GrowiNavbar } from '../Navbar/GrowiNavbar';
  6. import Sidebar from '../Sidebar';
  7. import { RawLayout } from './RawLayout';
  8. const AlertSiteUrlUndefined = dynamic(() => import('../AlertSiteUrlUndefined').then(mod => mod.AlertSiteUrlUndefined), { ssr: false });
  9. const HotkeysManager = dynamic(() => import('../Hotkeys/HotkeysManager'), { ssr: false });
  10. // const PageCreateModal = dynamic(() => import('../client/js/components/PageCreateModal'), { ssr: false });
  11. const GrowiNavbarBottom = dynamic(() => import('../Navbar/GrowiNavbarBottom').then(mod => mod.GrowiNavbarBottom), { ssr: false });
  12. const ShortcutsModal = dynamic(() => import('../ShortcutsModal'), { ssr: false });
  13. const SystemVersion = dynamic(() => import('../SystemVersion'), { ssr: false });
  14. // Page modals
  15. const PageCreateModal = dynamic(() => import('../PageCreateModal'), { ssr: false });
  16. const PageDuplicateModal = dynamic(() => import('../PageDuplicateModal'), { ssr: false });
  17. const PageDeleteModal = dynamic(() => import('../PageDeleteModal'), { ssr: false });
  18. const PageRenameModal = dynamic(() => import('../PageRenameModal'), { ssr: false });
  19. const PagePresentationModal = dynamic(() => import('../PagePresentationModal'), { ssr: false });
  20. const PageAccessoriesModal = dynamic(() => import('../PageAccessoriesModal'), { ssr: false });
  21. const DrawioModal = dynamic(() => import('../PageEditor/DrawioModal').then(mod => mod.DrawioModal), { ssr: false });
  22. // Fab
  23. const Fab = dynamic(() => import('../Fab').then(mod => mod.Fab), { ssr: false });
  24. type Props = {
  25. title: string
  26. className?: string,
  27. expandContainer?: boolean,
  28. children?: ReactNode
  29. }
  30. export const BasicLayout = ({
  31. children, title, className, expandContainer,
  32. }: Props): JSX.Element => {
  33. const myClassName = `${className ?? ''} ${expandContainer ? 'growi-layout-fluid' : ''}`;
  34. return (
  35. <RawLayout title={title} className={myClassName}>
  36. <DndProvider backend={HTML5Backend}>
  37. <GrowiNavbar />
  38. <div className="page-wrapper d-flex d-print-block">
  39. <div className="grw-sidebar-wrapper">
  40. <Sidebar />
  41. </div>
  42. <div className="flex-fill mw-0" style={{ position: 'relative' }}>
  43. <AlertSiteUrlUndefined />
  44. {children}
  45. </div>
  46. </div>
  47. <GrowiNavbarBottom />
  48. <PageCreateModal />
  49. <PageDuplicateModal />
  50. <PageDeleteModal />
  51. <PageRenameModal />
  52. <PageAccessoriesModal />
  53. <DrawioModal />
  54. </DndProvider>
  55. <PagePresentationModal />
  56. <HotkeysManager />
  57. <Fab />
  58. <ShortcutsModal />
  59. <SystemVersion showShortcutsButton />
  60. </RawLayout>
  61. );
  62. };