ShareLinkList.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import React from 'react';
  2. import dateFnsFormat from 'date-fns/format';
  3. import { useTranslation } from 'next-i18next';
  4. import CopyDropdown from '../Page/CopyDropdown';
  5. type ShareLinkTrProps = {
  6. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  7. shareLink: any,
  8. isAdmin?: boolean,
  9. onDelete?: () => void,
  10. }
  11. const ShareLinkTr = (props: ShareLinkTrProps): JSX.Element => {
  12. const { t } = useTranslation();
  13. const { isAdmin, shareLink, onDelete } = props;
  14. const { _id: shareLinkId, relatedPage } = shareLink;
  15. const isRelatedPageExists = relatedPage != null;
  16. return (
  17. <tr key={shareLinkId}>
  18. <td>
  19. <div className="d-flex">
  20. <span className="mr-auto my-auto">{shareLinkId}</span>
  21. { isRelatedPageExists && (
  22. <CopyDropdown
  23. pagePath={relatedPage.path}
  24. dropdownToggleId={`copydropdown-${shareLinkId}`}
  25. pageId={shareLinkId}
  26. isShareLinkMode
  27. >
  28. Copy Link
  29. </CopyDropdown>
  30. ) }
  31. </div>
  32. </td>
  33. { isAdmin && (
  34. <td>
  35. { isRelatedPageExists
  36. ? <a href={relatedPage.path}>{relatedPage.path}</a>
  37. : '(Page is not found)'
  38. }
  39. </td>
  40. ) }
  41. <td>{shareLink.expiredAt && <span>{dateFnsFormat(new Date(shareLink.expiredAt), 'yyyy-MM-dd HH:mm')}</span>}</td>
  42. <td>{shareLink.description}</td>
  43. <td>
  44. <button className="btn btn-outline-warning" type="button" onClick={onDelete}>
  45. <i className="icon-trash"></i>{t('Delete')}
  46. </button>
  47. </td>
  48. </tr>
  49. );
  50. };
  51. type Props = {
  52. // eslint-disable-next-line @typescript-eslint/no-explicit-any
  53. shareLinks: any[],
  54. onClickDeleteButton?: (shareLinkId: string) => void,
  55. isAdmin?: boolean,
  56. }
  57. const ShareLinkList = (props: Props): JSX.Element => {
  58. const { t } = useTranslation('commons');
  59. function renderShareLinks() {
  60. return (
  61. <>
  62. {props.shareLinks.map(shareLink => (
  63. <ShareLinkTr
  64. key={shareLink._id}
  65. isAdmin={props.isAdmin}
  66. shareLink={shareLink}
  67. onDelete={() => {
  68. if (props.onClickDeleteButton == null) {
  69. return;
  70. }
  71. props.onClickDeleteButton(shareLink._id);
  72. }}
  73. />
  74. ))}
  75. </>
  76. );
  77. }
  78. return (
  79. <div className="table-responsive">
  80. <table className="table table-bordered">
  81. <thead>
  82. <tr>
  83. <th>{t('share_links.Share Link', { ns: 'commons' })}</th>
  84. {props.isAdmin && <th>{t('share_links.Page Path', { ns: 'commons' })}</th>}
  85. <th>{t('share_links.expire', { ns: 'commons' })}</th>
  86. <th>{t('share_links.description', { ns: 'commons' })}</th>
  87. <th></th>
  88. </tr>
  89. </thead>
  90. <tbody>
  91. {renderShareLinks()}
  92. </tbody>
  93. </table>
  94. </div>
  95. );
  96. };
  97. export default ShareLinkList;