|
@@ -3,16 +3,19 @@ import React, { useCallback, useState } from 'react';
|
|
|
import nodePath from 'path';
|
|
import nodePath from 'path';
|
|
|
|
|
|
|
|
import { DevidedPagePath, pathUtils } from '@growi/core';
|
|
import { DevidedPagePath, pathUtils } from '@growi/core';
|
|
|
|
|
+import { useRouter } from 'next/router';
|
|
|
import { useTranslation } from 'react-i18next';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
import { UncontrolledTooltip, DropdownToggle } from 'reactstrap';
|
|
import { UncontrolledTooltip, DropdownToggle } from 'reactstrap';
|
|
|
|
|
|
|
|
-import { bookmark, unbookmark } from '~/client/services/page-operation';
|
|
|
|
|
|
|
+
|
|
|
|
|
+import { bookmark, unbookmark, unlink } from '~/client/services/page-operation';
|
|
|
import { addBookmarkToFolder, renamePage } from '~/client/util/bookmark-utils';
|
|
import { addBookmarkToFolder, renamePage } from '~/client/util/bookmark-utils';
|
|
|
import { ValidationTarget } from '~/client/util/input-validator';
|
|
import { ValidationTarget } from '~/client/util/input-validator';
|
|
|
-import { toastError } from '~/client/util/toastr';
|
|
|
|
|
|
|
+import { toastError, toastSuccess } from '~/client/util/toastr';
|
|
|
import { BookmarkFolderItems, DragItemDataType, DRAG_ITEM_TYPE } from '~/interfaces/bookmark-info';
|
|
import { BookmarkFolderItems, DragItemDataType, DRAG_ITEM_TYPE } from '~/interfaces/bookmark-info';
|
|
|
import { IPageHasId, IPageInfoAll, IPageToDeleteWithMeta } from '~/interfaces/page';
|
|
import { IPageHasId, IPageInfoAll, IPageToDeleteWithMeta } from '~/interfaces/page';
|
|
|
-import { useSWRxPageInfo } from '~/stores/page';
|
|
|
|
|
|
|
+import { usePutBackPageModal } from '~/stores/modal';
|
|
|
|
|
+import { mutateAllPageInfo, useSWRMUTxCurrentPage, useSWRxPageInfo } from '~/stores/page';
|
|
|
|
|
|
|
|
import ClosableTextInput from '../Common/ClosableTextInput';
|
|
import ClosableTextInput from '../Common/ClosableTextInput';
|
|
|
import { MenuItemType, PageItemControl } from '../Common/Dropdown/PageItemControl';
|
|
import { MenuItemType, PageItemControl } from '../Common/Dropdown/PageItemControl';
|
|
@@ -29,7 +32,7 @@ type Props = {
|
|
|
parentFolder: BookmarkFolderItems | null,
|
|
parentFolder: BookmarkFolderItems | null,
|
|
|
canMoveToRoot: boolean,
|
|
canMoveToRoot: boolean,
|
|
|
onClickDeleteMenuItemHandler: (pageToDelete: IPageToDeleteWithMeta) => void,
|
|
onClickDeleteMenuItemHandler: (pageToDelete: IPageToDeleteWithMeta) => void,
|
|
|
- bookmarkFolderTreeMutation: () => void
|
|
|
|
|
|
|
+ bookmarkFolderTreeMutation: () => void,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export const BookmarkItem = (props: Props): JSX.Element => {
|
|
export const BookmarkItem = (props: Props): JSX.Element => {
|
|
@@ -37,15 +40,17 @@ export const BookmarkItem = (props: Props): JSX.Element => {
|
|
|
const BASE_BOOKMARK_PADDING = 20;
|
|
const BASE_BOOKMARK_PADDING = 20;
|
|
|
|
|
|
|
|
const { t } = useTranslation();
|
|
const { t } = useTranslation();
|
|
|
|
|
+ const router = useRouter();
|
|
|
|
|
|
|
|
const {
|
|
const {
|
|
|
isReadOnlyUser, isOperable, bookmarkedPage, onClickDeleteMenuItemHandler,
|
|
isReadOnlyUser, isOperable, bookmarkedPage, onClickDeleteMenuItemHandler,
|
|
|
parentFolder, level, canMoveToRoot, bookmarkFolderTreeMutation,
|
|
parentFolder, level, canMoveToRoot, bookmarkFolderTreeMutation,
|
|
|
} = props;
|
|
} = props;
|
|
|
-
|
|
|
|
|
|
|
+ const { open: openPutBackPageModal } = usePutBackPageModal();
|
|
|
const [isRenameInputShown, setRenameInputShown] = useState(false);
|
|
const [isRenameInputShown, setRenameInputShown] = useState(false);
|
|
|
|
|
|
|
|
const { data: pageInfo, mutate: mutatePageInfo } = useSWRxPageInfo(bookmarkedPage._id);
|
|
const { data: pageInfo, mutate: mutatePageInfo } = useSWRxPageInfo(bookmarkedPage._id);
|
|
|
|
|
+ const { trigger: mutateCurrentPage } = useSWRMUTxCurrentPage();
|
|
|
const dPagePath = new DevidedPagePath(bookmarkedPage.path, false, true);
|
|
const dPagePath = new DevidedPagePath(bookmarkedPage.path, false, true);
|
|
|
const { latter: pageTitle, former: formerPagePath } = dPagePath;
|
|
const { latter: pageTitle, former: formerPagePath } = dPagePath;
|
|
|
const bookmarkItemId = `bookmark-item-${bookmarkedPage._id}`;
|
|
const bookmarkItemId = `bookmark-item-${bookmarkedPage._id}`;
|
|
@@ -116,6 +121,24 @@ export const BookmarkItem = (props: Props): JSX.Element => {
|
|
|
onClickDeleteMenuItemHandler(pageToDelete);
|
|
onClickDeleteMenuItemHandler(pageToDelete);
|
|
|
}, [bookmarkedPage._id, bookmarkedPage.path, bookmarkedPage.revision, onClickDeleteMenuItemHandler]);
|
|
}, [bookmarkedPage._id, bookmarkedPage.path, bookmarkedPage.revision, onClickDeleteMenuItemHandler]);
|
|
|
|
|
|
|
|
|
|
+ const putBackClickHandler = useCallback(() => {
|
|
|
|
|
+ const { _id: pageId, path } = bookmarkedPage;
|
|
|
|
|
+ const putBackedHandler = async() => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await unlink(path);
|
|
|
|
|
+ mutateAllPageInfo();
|
|
|
|
|
+ bookmarkFolderTreeMutation();
|
|
|
|
|
+ router.push(`/${pageId}`);
|
|
|
|
|
+ mutateCurrentPage();
|
|
|
|
|
+ toastSuccess(t('page_has_been_reverted', { path }));
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (err) {
|
|
|
|
|
+ toastError(err);
|
|
|
|
|
+ }
|
|
|
|
|
+ };
|
|
|
|
|
+ openPutBackPageModal({ pageId, path }, { onPutBacked: putBackedHandler });
|
|
|
|
|
+ }, [bookmarkedPage, openPutBackPageModal, bookmarkFolderTreeMutation, router, mutateCurrentPage, t]);
|
|
|
|
|
+
|
|
|
return (
|
|
return (
|
|
|
<DragAndDropWrapper
|
|
<DragAndDropWrapper
|
|
|
item={dragItem}
|
|
item={dragItem}
|
|
@@ -128,7 +151,7 @@ export const BookmarkItem = (props: Props): JSX.Element => {
|
|
|
id={bookmarkItemId}
|
|
id={bookmarkItemId}
|
|
|
style={{ paddingLeft }}
|
|
style={{ paddingLeft }}
|
|
|
>
|
|
>
|
|
|
- { isRenameInputShown ? (
|
|
|
|
|
|
|
+ {isRenameInputShown ? (
|
|
|
<ClosableTextInput
|
|
<ClosableTextInput
|
|
|
value={nodePath.basename(bookmarkedPage.path ?? '')}
|
|
value={nodePath.basename(bookmarkedPage.path ?? '')}
|
|
|
placeholder={t('Input page name')}
|
|
placeholder={t('Input page name')}
|
|
@@ -136,7 +159,7 @@ export const BookmarkItem = (props: Props): JSX.Element => {
|
|
|
onPressEnter={pressEnterForRenameHandler}
|
|
onPressEnter={pressEnterForRenameHandler}
|
|
|
validationTarget={ValidationTarget.PAGE}
|
|
validationTarget={ValidationTarget.PAGE}
|
|
|
/>
|
|
/>
|
|
|
- ) : <PageListItemS page={bookmarkedPage} pageTitle={pageTitle}/>}
|
|
|
|
|
|
|
+ ) : <PageListItemS page={bookmarkedPage} pageTitle={pageTitle} />}
|
|
|
|
|
|
|
|
<div className='grw-foldertree-control'>
|
|
<div className='grw-foldertree-control'>
|
|
|
<PageItemControl
|
|
<PageItemControl
|
|
@@ -148,8 +171,9 @@ export const BookmarkItem = (props: Props): JSX.Element => {
|
|
|
onClickBookmarkMenuItem={bookmarkMenuItemClickHandler}
|
|
onClickBookmarkMenuItem={bookmarkMenuItemClickHandler}
|
|
|
onClickRenameMenuItem={renameMenuItemClickHandler}
|
|
onClickRenameMenuItem={renameMenuItemClickHandler}
|
|
|
onClickDeleteMenuItem={deleteMenuItemClickHandler}
|
|
onClickDeleteMenuItem={deleteMenuItemClickHandler}
|
|
|
- additionalMenuItemOnTopRenderer={canMoveToRoot && isOperable
|
|
|
|
|
- ? () => <BookmarkMoveToRootBtn pageId={bookmarkedPage._id} onClickMoveToRootHandler={onClickMoveToRootHandler}/>
|
|
|
|
|
|
|
+ onClickRevertMenuItem={putBackClickHandler}
|
|
|
|
|
+ additionalMenuItemOnTopRenderer={canMoveToRoot
|
|
|
|
|
+ ? () => <BookmarkMoveToRootBtn pageId={bookmarkedPage._id} onClickMoveToRootHandler={onClickMoveToRootHandler} />
|
|
|
: undefined}
|
|
: undefined}
|
|
|
>
|
|
>
|
|
|
<DropdownToggle color="transparent" className="border-0 rounded btn-page-item-control p-0 grw-visible-on-hover mr-1">
|
|
<DropdownToggle color="transparent" className="border-0 rounded btn-page-item-control p-0 grw-visible-on-hover mr-1">
|