|
@@ -1,22 +1,24 @@
|
|
|
import React, { useState, FC, useMemo } from 'react';
|
|
import React, { useState, FC, useMemo } from 'react';
|
|
|
|
|
+
|
|
|
|
|
+import { useTranslation } from 'react-i18next';
|
|
|
import {
|
|
import {
|
|
|
Modal, ModalHeader, ModalBody, ModalFooter,
|
|
Modal, ModalHeader, ModalBody, ModalFooter,
|
|
|
} from 'reactstrap';
|
|
} from 'reactstrap';
|
|
|
-import { useTranslation } from 'react-i18next';
|
|
|
|
|
|
|
|
|
|
import { apiPost } from '~/client/util/apiv1-client';
|
|
import { apiPost } from '~/client/util/apiv1-client';
|
|
|
import { apiv3Post } from '~/client/util/apiv3-client';
|
|
import { apiv3Post } from '~/client/util/apiv3-client';
|
|
|
-import { usePageDeleteModal } from '~/stores/modal';
|
|
|
|
|
-import loggerFactory from '~/utils/logger';
|
|
|
|
|
-
|
|
|
|
|
|
|
+import { HasObjectId } from '~/interfaces/has-object-id';
|
|
|
import {
|
|
import {
|
|
|
IDeleteSinglePageApiv1Result, IDeleteManyPageApiv3Result, IPageToDeleteWithMeta, IDataWithMeta, isIPageInfoForEntity, IPageInfoForEntity,
|
|
IDeleteSinglePageApiv1Result, IDeleteManyPageApiv3Result, IPageToDeleteWithMeta, IDataWithMeta, isIPageInfoForEntity, IPageInfoForEntity,
|
|
|
} from '~/interfaces/page';
|
|
} from '~/interfaces/page';
|
|
|
-import { HasObjectId } from '~/interfaces/has-object-id';
|
|
|
|
|
|
|
+import { usePageDeleteModal } from '~/stores/modal';
|
|
|
|
|
+import { useSWRxPageInfoForList } from '~/stores/page';
|
|
|
|
|
+import loggerFactory from '~/utils/logger';
|
|
|
|
|
+
|
|
|
|
|
|
|
|
import ApiErrorMessageList from './PageManagement/ApiErrorMessageList';
|
|
import ApiErrorMessageList from './PageManagement/ApiErrorMessageList';
|
|
|
|
|
+
|
|
|
import { isTrashPage } from '^/../core/src/utils/page-path-utils';
|
|
import { isTrashPage } from '^/../core/src/utils/page-path-utils';
|
|
|
-import { useSWRxPageInfoForList } from '~/stores/page';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const logger = loggerFactory('growi:cli:PageDeleteModal');
|
|
const logger = loggerFactory('growi:cli:PageDeleteModal');
|
|
@@ -41,6 +43,7 @@ const PageDeleteModal: FC = () => {
|
|
|
const { data: deleteModalData, close: closeDeleteModal } = usePageDeleteModal();
|
|
const { data: deleteModalData, close: closeDeleteModal } = usePageDeleteModal();
|
|
|
|
|
|
|
|
const isOpened = deleteModalData?.isOpened ?? false;
|
|
const isOpened = deleteModalData?.isOpened ?? false;
|
|
|
|
|
+ const emptyTrash = deleteModalData?.opts?.emptyTrash ?? false;
|
|
|
|
|
|
|
|
const notOperatablePages: IPageToDeleteWithMeta[] = (deleteModalData?.pages ?? [])
|
|
const notOperatablePages: IPageToDeleteWithMeta[] = (deleteModalData?.pages ?? [])
|
|
|
.filter(p => !isIPageInfoForEntity(p.meta));
|
|
.filter(p => !isIPageInfoForEntity(p.meta));
|
|
@@ -207,6 +210,12 @@ const PageDeleteModal: FC = () => {
|
|
|
);
|
|
);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ const renderCompletelyDeleteAlert = () => {
|
|
|
|
|
+ return (
|
|
|
|
|
+ <p className="form-text mt-0">{t('modal_delete.empty_trash_alert')}</p>
|
|
|
|
|
+ );
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
const renderPagePathsToDelete = () => {
|
|
const renderPagePathsToDelete = () => {
|
|
|
const pages = injectedPages != null && injectedPages.length > 0 ? injectedPages : deleteModalData?.pages;
|
|
const pages = injectedPages != null && injectedPages.length > 0 ? injectedPages : deleteModalData?.pages;
|
|
|
|
|
|
|
@@ -225,7 +234,7 @@ const PageDeleteModal: FC = () => {
|
|
|
<Modal size="lg" isOpen={isOpened} toggle={closeDeleteModal} data-testid="page-delete-modal" className="grw-create-page">
|
|
<Modal size="lg" isOpen={isOpened} toggle={closeDeleteModal} data-testid="page-delete-modal" className="grw-create-page">
|
|
|
<ModalHeader tag="h4" toggle={closeDeleteModal} className={`bg-${deleteIconAndKey[deleteMode].color} text-light`}>
|
|
<ModalHeader tag="h4" toggle={closeDeleteModal} className={`bg-${deleteIconAndKey[deleteMode].color} text-light`}>
|
|
|
<i className={`icon-fw icon-${deleteIconAndKey[deleteMode].icon}`}></i>
|
|
<i className={`icon-fw icon-${deleteIconAndKey[deleteMode].icon}`}></i>
|
|
|
- { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
|
|
|
|
|
|
|
+ { emptyTrash ? t('modal_delete.empty_trash') : t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
|
|
|
</ModalHeader>
|
|
</ModalHeader>
|
|
|
<ModalBody>
|
|
<ModalBody>
|
|
|
<div className="form-group grw-scrollable-modal-body pb-1">
|
|
<div className="form-group grw-scrollable-modal-body pb-1">
|
|
@@ -234,8 +243,9 @@ const PageDeleteModal: FC = () => {
|
|
|
{/* https://redmine.weseek.co.jp/issues/82787 */}
|
|
{/* https://redmine.weseek.co.jp/issues/82787 */}
|
|
|
{renderPagePathsToDelete()}
|
|
{renderPagePathsToDelete()}
|
|
|
</div>
|
|
</div>
|
|
|
- { isDeletable && renderDeleteRecursivelyForm()}
|
|
|
|
|
- { isDeletable && !forceDeleteCompletelyMode && renderDeleteCompletelyForm() }
|
|
|
|
|
|
|
+ { isDeletable && !emptyTrash && renderDeleteRecursivelyForm()}
|
|
|
|
|
+ { isDeletable && !forceDeleteCompletelyMode && !emptyTrash && renderDeleteCompletelyForm() }
|
|
|
|
|
+ { emptyTrash && renderCompletelyDeleteAlert() }
|
|
|
</ModalBody>
|
|
</ModalBody>
|
|
|
<ModalFooter>
|
|
<ModalFooter>
|
|
|
<ApiErrorMessageList errs={errs} />
|
|
<ApiErrorMessageList errs={errs} />
|
|
@@ -245,8 +255,8 @@ const PageDeleteModal: FC = () => {
|
|
|
disabled={!isDeletable}
|
|
disabled={!isDeletable}
|
|
|
onClick={deleteButtonHandler}
|
|
onClick={deleteButtonHandler}
|
|
|
>
|
|
>
|
|
|
- <i className={`icon-${deleteIconAndKey[deleteMode].icon}`} aria-hidden="true"></i>
|
|
|
|
|
- { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
|
|
|
|
|
|
|
+ <i className={`mr-1 icon-${deleteIconAndKey[deleteMode].icon}`} aria-hidden="true"></i>
|
|
|
|
|
+ { emptyTrash ? t('modal_delete.empty_trash_button') : t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }
|
|
|
</button>
|
|
</button>
|
|
|
</ModalFooter>
|
|
</ModalFooter>
|
|
|
</Modal>
|
|
</Modal>
|