AdminLayout.tsx 1.6 KB

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