PageDeleteModal.jsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import React, { useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Modal, ModalHeader, ModalBody, ModalFooter,
  5. } from 'reactstrap';
  6. import { withTranslation } from 'react-i18next';
  7. import { createSubscribedElement } from './UnstatedUtils';
  8. import AppContainer from '../services/AppContainer';
  9. const PageDeleteModal = (props) => {
  10. const {
  11. t, isOpen, toggle, onClickSubmit, isDeleteCompletelyModal, path, isAbleToDeleteCompletely,
  12. } = props;
  13. const [isDeleteRecursively, setIsDeleteRecursively] = useState(true);
  14. const [isDeleteCompletely, setIsDeleteCompletely] = useState(isDeleteCompletelyModal);
  15. const deleteMode = isDeleteCompletely ? 'completely' : 'temporary';
  16. const deleteIconAndKey = {
  17. completely: {
  18. color: 'danger',
  19. icon: 'fire',
  20. translationKey: 'completely',
  21. },
  22. temporary: {
  23. color: 'primary',
  24. icon: 'trash',
  25. translationKey: 'page',
  26. },
  27. };
  28. function changeIsDeleteRecursivelyHandler() {
  29. setIsDeleteRecursively(!isDeleteRecursively);
  30. }
  31. function changeIsDeleteCompletelyHandler() {
  32. setIsDeleteCompletely(!isDeleteCompletely);
  33. }
  34. function renderDeleteRecursivelyForm() {
  35. return (
  36. <div className="custom-control custom-checkbox custom-checkbox-warning">
  37. <input
  38. className="custom-control-input"
  39. id="deleteRecursively"
  40. type="checkbox"
  41. checked={isDeleteRecursively}
  42. onChange={changeIsDeleteRecursivelyHandler}
  43. />
  44. <label className="custom-control-label" htmlFor="deleteRecursively">
  45. { t('modal_delete.delete_recursively') }
  46. <p className="form-text text-muted mt-0"><code>{path}</code> { t('modal_delete.recursively') }</p>
  47. </label>
  48. </div>
  49. );
  50. }
  51. function renderDeleteCompletelyForm() {
  52. return (
  53. <div className="custom-control custom-checkbox custom-checkbox-danger">
  54. <input
  55. className="custom-control-input"
  56. name="completely"
  57. id="deleteCompletely"
  58. type="checkbox"
  59. disabled={!isAbleToDeleteCompletely}
  60. checked={isDeleteCompletely}
  61. onChange={changeIsDeleteCompletelyHandler}
  62. />
  63. <label className="custom-control-label text-danger" htmlFor="deleteCompletely">
  64. { t('modal_delete.delete_completely') }
  65. <p className="form-text text-muted mt-0"> { t('modal_delete.completely') }</p>
  66. </label>
  67. {!isAbleToDeleteCompletely
  68. && <p className="alert alert-warning p-2 my-0"><i className="icon-ban icon-fw"></i>{ t('modal_delete.delete_completely_restriction') }</p>}
  69. </div>
  70. );
  71. }
  72. return (
  73. <Modal isOpen={isOpen} toggle={toggle} className="grw-create-page">
  74. <ModalHeader tag="h4" toggle={toggle} className={`bg-${deleteIconAndKey[deleteMode].color} text-light`}>
  75. <i className={`icon-fw icon-${deleteIconAndKey[deleteMode].icon}`}></i>
  76. { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
  77. </ModalHeader>
  78. <ModalBody>
  79. <div className="form-group">
  80. <label>{ t('modal_delete.deleting_page') }:</label><br />
  81. <code>{ path }</code>
  82. </div>
  83. {renderDeleteRecursivelyForm()}
  84. {!isDeleteCompletelyModal && renderDeleteCompletelyForm()}
  85. </ModalBody>
  86. <ModalFooter>
  87. <button type="button" className={`m-l-10 btn btn-${deleteIconAndKey[deleteMode].color}`} onClick={onClickSubmit}>
  88. <i className={`icon-${deleteIconAndKey[deleteMode].icon}`} aria-hidden="true"></i>
  89. { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
  90. </button>
  91. </ModalFooter>
  92. </Modal>
  93. );
  94. };
  95. /**
  96. * Wrapper component for using unstated
  97. */
  98. const PageDeleteModalWrapper = (props) => {
  99. return createSubscribedElement(PageDeleteModal, props, [AppContainer]);
  100. };
  101. PageDeleteModal.propTypes = {
  102. t: PropTypes.func.isRequired, // i18next
  103. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  104. isOpen: PropTypes.bool.isRequired,
  105. toggle: PropTypes.func.isRequired,
  106. onClickSubmit: PropTypes.func.isRequired,
  107. path: PropTypes.string.isRequired,
  108. isDeleteCompletelyModal: PropTypes.bool,
  109. isAbleToDeleteCompletely: PropTypes.bool,
  110. };
  111. PageDeleteModal.defaultProps = {
  112. isDeleteCompletelyModal: false,
  113. };
  114. export default withTranslation()(PageDeleteModalWrapper);