AdminLayout.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React, { ReactNode } from 'react';
  2. import dynamic from 'next/dynamic';
  3. import { GrowiNavbar } from '../Navbar/GrowiNavbar';
  4. import { RawLayout } from './RawLayout';
  5. import styles from './Admin.module.scss';
  6. const HotkeysManager = dynamic(() => import('../Hotkeys/HotkeysManager'), { ssr: false });
  7. const AdminNotFoundPage = dynamic(() => import('../Admin/NotFoundPage').then(mod => mod.AdminNotFoundPage), { ssr: false });
  8. type Props = {
  9. title: string
  10. componentTitle: string
  11. /**
  12. * Set the current option of AdminNavigation
  13. * Expected it is in ["home", "app", "security", "markdown", "customize", "importer", "export",
  14. * "notification", 'global-notification', "users", "user-groups", "search"]
  15. */
  16. selectedNavOpt: string
  17. children?: ReactNode
  18. }
  19. const AdminLayout = ({
  20. children, title, selectedNavOpt, componentTitle,
  21. }: Props): JSX.Element => {
  22. const AdminNavigation = dynamic(() => import('~/components/Admin/Common/AdminNavigation'), { ssr: false });
  23. const SystemVersion = dynamic(() => import('../SystemVersion'), { ssr: false });
  24. return (
  25. <RawLayout title={title}>
  26. <div className={`admin-page ${styles['admin-page']}`}>
  27. <GrowiNavbar />
  28. <header className="py-0 container-fluid">
  29. <h1 className="title px-3">{componentTitle}</h1>
  30. </header>
  31. <div id="main" className="main">
  32. <div className="container-fluid">
  33. <div className="row">
  34. <div className="col-lg-3">
  35. <AdminNavigation selected={selectedNavOpt} />
  36. </div>
  37. <div className="col-lg-9">
  38. {children || <AdminNotFoundPage />}
  39. </div>
  40. </div>
  41. </div>
  42. </div>
  43. <SystemVersion />
  44. </div>
  45. <HotkeysManager />
  46. </RawLayout>
  47. );
  48. };
  49. export default AdminLayout;