PageManagement.jsx 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React, { useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { isTopPage } from '@commons/util/path-utils';
  5. import { createSubscribedElement } from '../UnstatedUtils';
  6. import AppContainer from '../../services/AppContainer';
  7. import PageContainer from '../../services/PageContainer';
  8. import PageDeleteModal from '../PageDeleteModal';
  9. const PageManagement = (props) => {
  10. const { t, appContainer, pageContainer } = props;
  11. const { path, isDeletable, isAbleToDeleteCompletely } = pageContainer.state;
  12. const { currentUser } = appContainer;
  13. const isTopPagePath = isTopPage(path);
  14. const [isPageDeleteModalShown, setIsPageDeleteModalShown] = useState(false);
  15. function openPageDeleteModal() {
  16. setIsPageDeleteModalShown(true);
  17. }
  18. function closePageDeleteModal() {
  19. setIsPageDeleteModalShown(false);
  20. }
  21. function renderDropdownItemForNotTopPage() {
  22. return (
  23. <>
  24. <a className="dropdown-item" href="#" data-target="#renamePage" data-toggle="modal">
  25. <i className="icon-fw icon-action-redo"></i> { t('Move/Rename') }
  26. </a>
  27. <a className="dropdown-item" type="button" onClick={pageContainer.openPageDuplicateModal}>
  28. <i className="icon-fw icon-docs"></i> { t('Duplicate') }
  29. </a>
  30. <div className="dropdown-divider"></div>
  31. </>
  32. );
  33. }
  34. function renderDropdownItemForDeletablePage() {
  35. return (
  36. <>
  37. <div className="dropdown-divider"></div>
  38. <a className="dropdown-item" type="button" onClick={openPageDeleteModal}>
  39. <i className="icon-fw icon-fire text-danger"></i> { t('Delete') }
  40. </a>
  41. </>
  42. );
  43. }
  44. return (
  45. <>
  46. <a
  47. role="button"
  48. className={`nav-link dropdown-toggle dropdown-toggle-no-caret ${currentUser == null && 'dropdown-toggle-disabled'}`}
  49. href="#"
  50. data-toggle={`${currentUser == null ? 'tooltip' : 'dropdown'}`}
  51. data-placement="top"
  52. data-container="body"
  53. title={t('Not available for guest')}
  54. >
  55. <i className="icon-options-vertical"></i>
  56. </a>
  57. <div className="dropdown-menu dropdown-menu-right">
  58. {!isTopPagePath && renderDropdownItemForNotTopPage()}
  59. <a className="dropdown-item" href="#" data-target="#create-template" data-toggle="modal">
  60. <i className="icon-fw icon-magic-wand"></i> { t('template.option_label.create/edit') }
  61. </a>
  62. {(!isTopPagePath && isDeletable) && renderDropdownItemForDeletablePage()}
  63. </div>
  64. <PageDeleteModal
  65. isOpen={isPageDeleteModalShown}
  66. toggle={closePageDeleteModal}
  67. path={path}
  68. isAbleToDeleteCompletely={isAbleToDeleteCompletely}
  69. />
  70. </>
  71. );
  72. };
  73. /**
  74. * Wrapper component for using unstated
  75. */
  76. const PageManagementWrapper = (props) => {
  77. return createSubscribedElement(PageManagement, props, [AppContainer, PageContainer]);
  78. };
  79. PageManagement.propTypes = {
  80. t: PropTypes.func.isRequired, // i18next
  81. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  82. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  83. };
  84. export default withTranslation()(PageManagementWrapper);