PageList.tsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import React from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { IPageInfoForEntity, IPageWithMeta } from '~/interfaces/page';
  4. import { OnDeletedFunction, OnPutBackedFunction } from '~/interfaces/ui';
  5. import { ForceHideMenuItems } from '../Common/Dropdown/PageItemControl';
  6. import { PageListItemL } from './PageListItemL';
  7. import styles from './PageList.module.scss';
  8. type Props<M extends IPageInfoForEntity> = {
  9. pages: IPageWithMeta<M>[],
  10. isEnableActions?: boolean,
  11. forceHideMenuItems?: ForceHideMenuItems,
  12. onPagesDeleted?: OnDeletedFunction,
  13. onPagePutBacked?: OnPutBackedFunction,
  14. }
  15. const PageList = (props: Props<IPageInfoForEntity>): JSX.Element => {
  16. const { t } = useTranslation();
  17. const {
  18. pages, isEnableActions, forceHideMenuItems, onPagesDeleted, onPagePutBacked,
  19. } = props;
  20. if (pages == null) {
  21. return (
  22. <div className="wiki">
  23. <div className="text-muted text-center">
  24. <i className="fa fa-2x fa-spinner fa-pulse mr-1"></i>
  25. </div>
  26. </div>
  27. );
  28. }
  29. const pageList = pages.map(page => (
  30. <PageListItemL
  31. key={page.data._id}
  32. page={page}
  33. isEnableActions={isEnableActions}
  34. forceHideMenuItems={forceHideMenuItems}
  35. onPageDeleted={onPagesDeleted}
  36. onPagePutBacked={onPagePutBacked}
  37. />
  38. ));
  39. if (pageList.length === 0) {
  40. return (
  41. <div className="mt-2">
  42. <p>{t('custom_navigation.no_page_list')}</p>
  43. </div>
  44. );
  45. }
  46. return (
  47. <div className={`page-list ${styles['page-list']}`}>
  48. <ul className="page-list-ul list-group list-group-flush">
  49. {pageList}
  50. </ul>
  51. </div>
  52. );
  53. };
  54. export default PageList;