PageDeleteModal.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import React, { useState, FC } from 'react';
  2. import toastr from 'toastr';
  3. import {
  4. Modal, ModalHeader, ModalBody, ModalFooter,
  5. } from 'reactstrap';
  6. import { useTranslation } from 'react-i18next';
  7. // import { apiPost } from '~/client/util/apiv1-client';
  8. import ApiErrorMessageList from './PageManagement/ApiErrorMessageList';
  9. export type IPageForPageDeleteModal = {
  10. pageId: string,
  11. revisionId: string,
  12. path: string
  13. }
  14. const deleteIconAndKey = {
  15. completely: {
  16. color: 'danger',
  17. icon: 'fire',
  18. translationKey: 'completely',
  19. },
  20. temporary: {
  21. color: 'primary',
  22. icon: 'trash',
  23. translationKey: 'page',
  24. },
  25. };
  26. type Props = {
  27. isOpen: boolean,
  28. pages: IPageForPageDeleteModal[],
  29. isDeleteCompletelyModal: boolean,
  30. isAbleToDeleteCompletely: boolean,
  31. onClose?: () => void,
  32. }
  33. const PageDeleteModal: FC<Props> = (props: Props) => {
  34. const { t } = useTranslation('');
  35. const {
  36. isOpen, onClose, isDeleteCompletelyModal, pages, isAbleToDeleteCompletely,
  37. } = props;
  38. const [isDeleteRecursively, setIsDeleteRecursively] = useState(true);
  39. const [isDeleteCompletely, setIsDeleteCompletely] = useState(isDeleteCompletelyModal && isAbleToDeleteCompletely);
  40. const deleteMode = isDeleteCompletely ? 'completely' : 'temporary';
  41. const [errs, setErrs] = useState(null);
  42. function changeIsDeleteRecursivelyHandler() {
  43. setIsDeleteRecursively(!isDeleteRecursively);
  44. }
  45. function changeIsDeleteCompletelyHandler() {
  46. if (!isAbleToDeleteCompletely) {
  47. return;
  48. }
  49. setIsDeleteCompletely(!isDeleteCompletely);
  50. }
  51. async function deletePage() {
  52. toastr.warning(t('search_result.currently_not_implemented'));
  53. // Todo implement page delete function at https://redmine.weseek.co.jp/issues/82222
  54. // setErrs(null);
  55. // try {
  56. // // control flag
  57. // // If is it not true, Request value must be `null`.
  58. // const recursively = isDeleteRecursively ? true : null;
  59. // const completely = isDeleteCompletely ? true : null;
  60. // const response = await apiPost('/pages.remove', {
  61. // page_id: pageId,
  62. // revision_id: revisionId,
  63. // recursively,
  64. // completely,
  65. // });
  66. // const trashPagePath = response.page.path;
  67. // window.location.href = encodeURI(trashPagePath);
  68. // }
  69. // catch (err) {
  70. // setErrs(err);
  71. // }
  72. }
  73. async function deleteButtonHandler() {
  74. deletePage();
  75. }
  76. function renderDeleteRecursivelyForm() {
  77. return (
  78. <div className="custom-control custom-checkbox custom-checkbox-warning">
  79. <input
  80. className="custom-control-input"
  81. id="deleteRecursively"
  82. type="checkbox"
  83. // checked={isDeleteRecursively}
  84. checked={false}
  85. onChange={changeIsDeleteRecursivelyHandler}
  86. disabled // Todo: enable this at https://redmine.weseek.co.jp/issues/82222
  87. />
  88. <label className="custom-control-label" htmlFor="deleteRecursively">
  89. { t('modal_delete.delete_recursively') }
  90. </label>
  91. </div>
  92. );
  93. }
  94. // DeleteCompletely is currently disabled
  95. // TODO1 : Retrive isAbleToDeleteCompleltly state everywhere in the system via swr.
  96. // Story: https://redmine.weseek.co.jp/issues/82222
  97. // TODO2 : use toaster
  98. // TASK : https://redmine.weseek.co.jp/issues/82299
  99. function renderDeleteCompletelyForm() {
  100. return (
  101. <div className="custom-control custom-checkbox custom-checkbox-danger">
  102. <input
  103. className="custom-control-input"
  104. name="completely"
  105. id="deleteCompletely"
  106. type="checkbox"
  107. // disabled={!isAbleToDeleteCompletely}
  108. disabled // Todo: will be implemented at https://redmine.weseek.co.jp/issues/82222
  109. checked={isDeleteCompletely}
  110. onChange={changeIsDeleteCompletelyHandler}
  111. />
  112. {/* ↓↓ undo this comment out at https://redmine.weseek.co.jp/issues/82222 ↓↓ */}
  113. {/* <label className="custom-control-label text-danger" htmlFor="deleteCompletely"> */}
  114. <label className="custom-control-label" htmlFor="deleteCompletely">
  115. { t('modal_delete.delete_completely')}
  116. <p className="form-text text-muted mt-0"> { t('modal_delete.completely') }</p>
  117. </label>
  118. {!isAbleToDeleteCompletely
  119. && (
  120. <p className="alert alert-warning p-2 my-0">
  121. <i className="icon-ban icon-fw"></i>{ t('modal_delete.delete_completely_restriction') }
  122. </p>
  123. )}
  124. </div>
  125. );
  126. }
  127. return (
  128. <Modal size="lg" isOpen={isOpen} toggle={onClose} className="grw-create-page">
  129. <ModalHeader tag="h4" toggle={onClose} className={`bg-${deleteIconAndKey[deleteMode].color} text-light`}>
  130. <i className={`icon-fw icon-${deleteIconAndKey[deleteMode].icon}`}></i>
  131. { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
  132. </ModalHeader>
  133. <ModalBody>
  134. <div className="form-group">
  135. <label>{ t('modal_delete.deleting_page') }:</label><br />
  136. {/* Todo: change the way to show path on modal when too many pages are selected */}
  137. {/* https://redmine.weseek.co.jp/issues/82787 */}
  138. {pages.map((page) => {
  139. return <div><code>{ page.path }</code></div>;
  140. })}
  141. </div>
  142. {renderDeleteRecursivelyForm()}
  143. {!isDeleteCompletelyModal && renderDeleteCompletelyForm()}
  144. </ModalBody>
  145. <ModalFooter>
  146. <ApiErrorMessageList errs={errs} />
  147. <button type="button" className={`btn btn-${deleteIconAndKey[deleteMode].color}`} onClick={deleteButtonHandler}>
  148. <i className={`icon-${deleteIconAndKey[deleteMode].icon}`} aria-hidden="true"></i>
  149. { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
  150. </button>
  151. </ModalFooter>
  152. </Modal>
  153. );
  154. };
  155. export default PageDeleteModal;