PageAccessoriesModal.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Modal, ModalBody, Nav, NavItem, NavLink, TabContent, TabPane,
  5. } from 'reactstrap';
  6. import { withTranslation } from 'react-i18next';
  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 { withUnstatedContainers } from './UnstatedUtils';
  13. import PageAccessoriesContainer from '../services/PageAccessoriesContainer';
  14. import PageAttachment from './PageAttachment';
  15. import PageTimeline from './PageTimeline';
  16. import PageList from './PageList';
  17. import PageHistory from './PageHistory';
  18. import ShareLink from './ShareLink/ShareLink';
  19. const PageAccessoriesModal = (props) => {
  20. const { t, pageAccessoriesContainer } = props;
  21. const { switchActiveTab } = pageAccessoriesContainer;
  22. const { activeTab } = pageAccessoriesContainer.state;
  23. function closeModalHandler() {
  24. if (props.onClose == null) {
  25. return;
  26. }
  27. props.onClose();
  28. }
  29. return (
  30. <React.Fragment>
  31. <Modal size="xl" isOpen={props.isOpen} toggle={closeModalHandler} className="grw-page-accessories-modal">
  32. <ModalBody>
  33. <Nav className="nav-title border-bottom">
  34. <NavItem type="button" className={`nav-link ${activeTab === 'pagelist' && 'active active-border'}`}>
  35. <NavLink
  36. onClick={() => {
  37. switchActiveTab('pagelist');
  38. }}
  39. >
  40. <PageListIcon />
  41. {t('page_list')}
  42. </NavLink>
  43. </NavItem>
  44. <NavItem type="button" className={`nav-link ${activeTab === 'timeline' && 'active active-border'}`}>
  45. <NavLink
  46. onClick={() => {
  47. switchActiveTab('timeline');
  48. }}
  49. >
  50. <TimeLineIcon />
  51. {t('Timeline View')}
  52. </NavLink>
  53. </NavItem>
  54. <NavItem type="button" className={`nav-link ${activeTab === 'page-history' && 'active active-border'}`}>
  55. <NavLink
  56. onClick={() => {
  57. switchActiveTab('page-history');
  58. }}
  59. >
  60. <RecentChangesIcon />
  61. {t('History')}
  62. </NavLink>
  63. </NavItem>
  64. <NavItem type="button" className={`nav-link ${activeTab === 'attachment' && 'active active-border'}`}>
  65. <NavLink
  66. onClick={() => {
  67. switchActiveTab('attachment');
  68. }}
  69. >
  70. <AttachmentIcon />
  71. {t('attachment_data')}
  72. </NavLink>
  73. </NavItem>
  74. <NavItem type="button" className={`nav-link ${activeTab === 'share-link' && 'active active-border'}`}>
  75. <NavLink
  76. onClick={() => {
  77. switchActiveTab('share-link');
  78. }}
  79. >
  80. <ShareLinkIcon />
  81. {t('share_links.share_link_management')}
  82. </NavLink>
  83. </NavItem>
  84. </Nav>
  85. <TabContent activeTab={activeTab}>
  86. <TabPane tabId="pagelist">
  87. {pageAccessoriesContainer.state.activeComponents.has('pagelist') && <PageList />}
  88. </TabPane>
  89. <TabPane tabId="timeline" className="p-4">
  90. {pageAccessoriesContainer.state.activeComponents.has('timeline') && <PageTimeline /> }
  91. </TabPane>
  92. <TabPane tabId="page-history">
  93. <div className="overflow-auto">
  94. {pageAccessoriesContainer.state.activeComponents.has('page-history') && <PageHistory /> }
  95. </div>
  96. </TabPane>
  97. <TabPane tabId="attachment" className="p-4">
  98. {pageAccessoriesContainer.state.activeComponents.has('attachment') && <PageAttachment />}
  99. </TabPane>
  100. <TabPane tabId="share-link" className="p-4">
  101. {pageAccessoriesContainer.state.activeComponents.has('share-link') && <ShareLink />}
  102. </TabPane>
  103. </TabContent>
  104. </ModalBody>
  105. </Modal>
  106. </React.Fragment>
  107. );
  108. };
  109. /**
  110. * Wrapper component for using unstated
  111. */
  112. const PageAccessoriesModalWrapper = withUnstatedContainers(PageAccessoriesModal, [PageAccessoriesContainer]);
  113. PageAccessoriesModal.propTypes = {
  114. t: PropTypes.func.isRequired, // i18next
  115. // pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  116. pageAccessoriesContainer: PropTypes.instanceOf(PageAccessoriesContainer).isRequired,
  117. isOpen: PropTypes.bool.isRequired,
  118. onClose: PropTypes.func,
  119. };
  120. export default withTranslation()(PageAccessoriesModalWrapper);