TopOfTableContents.jsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { UncontrolledTooltip } from 'reactstrap';
  5. import AppContainer from '../services/AppContainer';
  6. import PageAccessoriesContainer from '../services/PageAccessoriesContainer';
  7. import PageListIcon from './Icons/PageListIcon';
  8. import TimeLineIcon from './Icons/TimeLineIcon';
  9. import RecentChangesIcon from './Icons/RecentChangesIcon';
  10. import AttachmentIcon from './Icons/AttachmentIcon';
  11. import ShareLinkIcon from './Icons/ShareLinkIcon';
  12. import PageAccessoriesModal from './PageAccessoriesModal';
  13. import { withUnstatedContainers } from './UnstatedUtils';
  14. const TopOfTableContents = (props) => {
  15. const { t, appContainer, pageAccessoriesContainer } = props;
  16. const isGuestUserMode = (appContainer.currentUser == null);
  17. function renderModal() {
  18. return (
  19. <>
  20. <PageAccessoriesModal
  21. isOpen={pageAccessoriesContainer.state.isPageAccessoriesModalShown}
  22. onClose={pageAccessoriesContainer.closePageAccessoriesModal}
  23. />
  24. </>
  25. );
  26. }
  27. return (
  28. <>
  29. <div className="top-of-table-contents d-flex align-items-end pb-1">
  30. <button
  31. type="button"
  32. className="btn btn-link grw-btn-top-of-table"
  33. onClick={() => pageAccessoriesContainer.openPageAccessoriesModal('pagelist')}
  34. >
  35. <PageListIcon />
  36. </button>
  37. <button
  38. type="button"
  39. className="btn btn-link grw-btn-top-of-table"
  40. onClick={() => pageAccessoriesContainer.openPageAccessoriesModal('timeline')}
  41. >
  42. <TimeLineIcon />
  43. </button>
  44. <button
  45. type="button"
  46. className="btn btn-link grw-btn-top-of-table"
  47. onClick={() => pageAccessoriesContainer.openPageAccessoriesModal('pageHistory')}
  48. >
  49. <RecentChangesIcon />
  50. </button>
  51. <button
  52. type="button"
  53. className="btn btn-link grw-btn-top-of-table"
  54. onClick={() => pageAccessoriesContainer.openPageAccessoriesModal('attachment')}
  55. >
  56. <AttachmentIcon />
  57. </button>
  58. <div id="shareLink-btn-wrapper-for-tooltip">
  59. <button
  60. type="button"
  61. className={`btn btn-link grw-btn-top-of-table ${isGuestUserMode && 'disabled'}`}
  62. onClick={() => pageAccessoriesContainer.openPageAccessoriesModal('shareLink')}
  63. >
  64. <ShareLinkIcon />
  65. </button>
  66. </div>
  67. {isGuestUserMode && (
  68. <UncontrolledTooltip placement="top" target="shareLink-btn-wrapper-for-tooltip" fade={false}>
  69. {t('Not available for guest')}
  70. </UncontrolledTooltip>
  71. )}
  72. <div
  73. id="seen-user-list"
  74. data-user-ids-str="{{ page.seenUsers|slice(-15)|default([])|reverse|join(',') }}"
  75. data-sum-of-seen-users="{{ page.seenUsers.length|default(0) }}"
  76. className="grw-seen-user-list ml-1 pl-1"
  77. >
  78. </div>
  79. </div>
  80. {renderModal()}
  81. </>
  82. );
  83. };
  84. /**
  85. * Wrapper component for using unstated
  86. */
  87. const TopOfTableContentsWrapper = withUnstatedContainers(TopOfTableContents, [AppContainer, PageAccessoriesContainer]);
  88. TopOfTableContents.propTypes = {
  89. t: PropTypes.func.isRequired, // i18next
  90. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  91. pageAccessoriesContainer: PropTypes.instanceOf(PageAccessoriesContainer).isRequired,
  92. };
  93. export default withTranslation()(TopOfTableContentsWrapper);