|
@@ -1,24 +1,23 @@
|
|
|
import React, { useState, useCallback, useEffect } from 'react';
|
|
import React, { useState, useCallback, useEffect } from 'react';
|
|
|
|
|
+
|
|
|
|
|
+import { useTranslation } from 'react-i18next';
|
|
|
import {
|
|
import {
|
|
|
Dropdown, DropdownMenu, DropdownToggle, DropdownItem,
|
|
Dropdown, DropdownMenu, DropdownToggle, DropdownItem,
|
|
|
} from 'reactstrap';
|
|
} from 'reactstrap';
|
|
|
|
|
|
|
|
-import { useTranslation } from 'react-i18next';
|
|
|
|
|
-
|
|
|
|
|
-import loggerFactory from '~/utils/logger';
|
|
|
|
|
-
|
|
|
|
|
import {
|
|
import {
|
|
|
IPageInfoAll, isIPageInfoForOperation,
|
|
IPageInfoAll, isIPageInfoForOperation,
|
|
|
} from '~/interfaces/page';
|
|
} from '~/interfaces/page';
|
|
|
import { useSWRxPageInfo } from '~/stores/page';
|
|
import { useSWRxPageInfo } from '~/stores/page';
|
|
|
|
|
+import loggerFactory from '~/utils/logger';
|
|
|
|
|
|
|
|
const logger = loggerFactory('growi:cli:PageItemControl');
|
|
const logger = loggerFactory('growi:cli:PageItemControl');
|
|
|
|
|
|
|
|
|
|
|
|
|
export const MenuItemType = {
|
|
export const MenuItemType = {
|
|
|
BOOKMARK: 'bookmark',
|
|
BOOKMARK: 'bookmark',
|
|
|
- DUPLICATE: 'duplicate',
|
|
|
|
|
RENAME: 'rename',
|
|
RENAME: 'rename',
|
|
|
|
|
+ DUPLICATE: 'duplicate',
|
|
|
DELETE: 'delete',
|
|
DELETE: 'delete',
|
|
|
REVERT: 'revert',
|
|
REVERT: 'revert',
|
|
|
} as const;
|
|
} as const;
|
|
@@ -34,8 +33,8 @@ type CommonProps = {
|
|
|
forceHideMenuItems?: ForceHideMenuItems,
|
|
forceHideMenuItems?: ForceHideMenuItems,
|
|
|
|
|
|
|
|
onClickBookmarkMenuItem?: (pageId: string, newValue?: boolean) => Promise<void>,
|
|
onClickBookmarkMenuItem?: (pageId: string, newValue?: boolean) => Promise<void>,
|
|
|
- onClickDuplicateMenuItem?: (pageId: string) => Promise<void> | void,
|
|
|
|
|
onClickRenameMenuItem?: (pageId: string, pageInfo: IPageInfoAll | undefined) => Promise<void> | void,
|
|
onClickRenameMenuItem?: (pageId: string, pageInfo: IPageInfoAll | undefined) => Promise<void> | void,
|
|
|
|
|
+ onClickDuplicateMenuItem?: (pageId: string) => Promise<void> | void,
|
|
|
onClickDeleteMenuItem?: (pageId: string, pageInfo: IPageInfoAll | undefined) => Promise<void> | void,
|
|
onClickDeleteMenuItem?: (pageId: string, pageInfo: IPageInfoAll | undefined) => Promise<void> | void,
|
|
|
onClickRevertMenuItem?: (pageId: string) => Promise<void> | void,
|
|
onClickRevertMenuItem?: (pageId: string) => Promise<void> | void,
|
|
|
|
|
|
|
@@ -55,7 +54,7 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
const {
|
|
const {
|
|
|
pageId, isLoading,
|
|
pageId, isLoading,
|
|
|
pageInfo, isEnableActions, forceHideMenuItems,
|
|
pageInfo, isEnableActions, forceHideMenuItems,
|
|
|
- onClickBookmarkMenuItem, onClickDuplicateMenuItem, onClickRenameMenuItem, onClickDeleteMenuItem, onClickRevertMenuItem,
|
|
|
|
|
|
|
+ onClickBookmarkMenuItem, onClickRenameMenuItem, onClickDuplicateMenuItem, onClickDeleteMenuItem, onClickRevertMenuItem,
|
|
|
additionalMenuItemRenderer: AdditionalMenuItems, isInstantRename,
|
|
additionalMenuItemRenderer: AdditionalMenuItems, isInstantRename,
|
|
|
} = props;
|
|
} = props;
|
|
|
|
|
|
|
@@ -68,14 +67,6 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
await onClickBookmarkMenuItem(pageId, !pageInfo.isBookmarked);
|
|
await onClickBookmarkMenuItem(pageId, !pageInfo.isBookmarked);
|
|
|
}, [onClickBookmarkMenuItem, pageId, pageInfo]);
|
|
}, [onClickBookmarkMenuItem, pageId, pageInfo]);
|
|
|
|
|
|
|
|
- // eslint-disable-next-line react-hooks/rules-of-hooks
|
|
|
|
|
- const duplicateItemClickedHandler = useCallback(async() => {
|
|
|
|
|
- if (onClickDuplicateMenuItem == null) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- await onClickDuplicateMenuItem(pageId);
|
|
|
|
|
- }, [onClickDuplicateMenuItem, pageId]);
|
|
|
|
|
-
|
|
|
|
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
|
|
const renameItemClickedHandler = useCallback(async() => {
|
|
const renameItemClickedHandler = useCallback(async() => {
|
|
|
if (onClickRenameMenuItem == null) {
|
|
if (onClickRenameMenuItem == null) {
|
|
@@ -88,6 +79,14 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
await onClickRenameMenuItem(pageId, pageInfo);
|
|
await onClickRenameMenuItem(pageId, pageInfo);
|
|
|
}, [onClickRenameMenuItem, pageId, pageInfo]);
|
|
}, [onClickRenameMenuItem, pageId, pageInfo]);
|
|
|
|
|
|
|
|
|
|
+ // eslint-disable-next-line react-hooks/rules-of-hooks
|
|
|
|
|
+ const duplicateItemClickedHandler = useCallback(async() => {
|
|
|
|
|
+ if (onClickDuplicateMenuItem == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ await onClickDuplicateMenuItem(pageId);
|
|
|
|
|
+ }, [onClickDuplicateMenuItem, pageId]);
|
|
|
|
|
+
|
|
|
const revertItemClickedHandler = useCallback(async() => {
|
|
const revertItemClickedHandler = useCallback(async() => {
|
|
|
if (onClickRevertMenuItem == null) {
|
|
if (onClickRevertMenuItem == null) {
|
|
|
return;
|
|
return;
|
|
@@ -143,18 +142,6 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
</DropdownItem>
|
|
</DropdownItem>
|
|
|
) }
|
|
) }
|
|
|
|
|
|
|
|
- {/* Duplicate */}
|
|
|
|
|
- { !forceHideMenuItems?.includes(MenuItemType.DUPLICATE) && isEnableActions && (
|
|
|
|
|
- <DropdownItem
|
|
|
|
|
- onClick={duplicateItemClickedHandler}
|
|
|
|
|
- data-testid="open-page-duplicate-modal-btn"
|
|
|
|
|
- className="grw-page-control-dropdown-item"
|
|
|
|
|
- >
|
|
|
|
|
- <i className="icon-fw icon-docs grw-page-control-dropdown-icon"></i>
|
|
|
|
|
- {t('Duplicate')}
|
|
|
|
|
- </DropdownItem>
|
|
|
|
|
- ) }
|
|
|
|
|
-
|
|
|
|
|
{/* Move/Rename */}
|
|
{/* Move/Rename */}
|
|
|
{ !forceHideMenuItems?.includes(MenuItemType.RENAME) && isEnableActions && pageInfo.isMovable && (
|
|
{ !forceHideMenuItems?.includes(MenuItemType.RENAME) && isEnableActions && pageInfo.isMovable && (
|
|
|
<DropdownItem
|
|
<DropdownItem
|
|
@@ -167,6 +154,18 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
</DropdownItem>
|
|
</DropdownItem>
|
|
|
) }
|
|
) }
|
|
|
|
|
|
|
|
|
|
+ {/* Duplicate */}
|
|
|
|
|
+ { !forceHideMenuItems?.includes(MenuItemType.DUPLICATE) && isEnableActions && (
|
|
|
|
|
+ <DropdownItem
|
|
|
|
|
+ onClick={duplicateItemClickedHandler}
|
|
|
|
|
+ data-testid="open-page-duplicate-modal-btn"
|
|
|
|
|
+ className="grw-page-control-dropdown-item"
|
|
|
|
|
+ >
|
|
|
|
|
+ <i className="icon-fw icon-docs grw-page-control-dropdown-icon"></i>
|
|
|
|
|
+ {t('Duplicate')}
|
|
|
|
|
+ </DropdownItem>
|
|
|
|
|
+ ) }
|
|
|
|
|
+
|
|
|
{/* Revert */}
|
|
{/* Revert */}
|
|
|
{ !forceHideMenuItems?.includes(MenuItemType.REVERT) && isEnableActions && pageInfo.isRevertible && (
|
|
{ !forceHideMenuItems?.includes(MenuItemType.REVERT) && isEnableActions && pageInfo.isRevertible && (
|
|
|
<DropdownItem
|
|
<DropdownItem
|
|
@@ -224,7 +223,7 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
const {
|
|
const {
|
|
|
pageId, pageInfo: presetPageInfo, fetchOnInit,
|
|
pageId, pageInfo: presetPageInfo, fetchOnInit,
|
|
|
children,
|
|
children,
|
|
|
- onClickBookmarkMenuItem, onClickDuplicateMenuItem, onClickRenameMenuItem, onClickDeleteMenuItem,
|
|
|
|
|
|
|
+ onClickBookmarkMenuItem, onClickRenameMenuItem, onClickDuplicateMenuItem, onClickDeleteMenuItem,
|
|
|
} = props;
|
|
} = props;
|
|
|
|
|
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
@@ -255,13 +254,6 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
|
|
|
|
|
const isLoading = shouldFetch && fetchedPageInfo == null;
|
|
const isLoading = shouldFetch && fetchedPageInfo == null;
|
|
|
|
|
|
|
|
- const duplicateMenuItemClickHandler = useCallback(async() => {
|
|
|
|
|
- if (onClickDuplicateMenuItem == null) {
|
|
|
|
|
- return;
|
|
|
|
|
- }
|
|
|
|
|
- await onClickDuplicateMenuItem(pageId);
|
|
|
|
|
- }, [onClickDuplicateMenuItem, pageId]);
|
|
|
|
|
-
|
|
|
|
|
const renameMenuItemClickHandler = useCallback(async() => {
|
|
const renameMenuItemClickHandler = useCallback(async() => {
|
|
|
if (onClickRenameMenuItem == null) {
|
|
if (onClickRenameMenuItem == null) {
|
|
|
return;
|
|
return;
|
|
@@ -269,6 +261,13 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
await onClickRenameMenuItem(pageId, fetchedPageInfo ?? presetPageInfo);
|
|
await onClickRenameMenuItem(pageId, fetchedPageInfo ?? presetPageInfo);
|
|
|
}, [onClickRenameMenuItem, pageId, fetchedPageInfo, presetPageInfo]);
|
|
}, [onClickRenameMenuItem, pageId, fetchedPageInfo, presetPageInfo]);
|
|
|
|
|
|
|
|
|
|
+ const duplicateMenuItemClickHandler = useCallback(async() => {
|
|
|
|
|
+ if (onClickDuplicateMenuItem == null) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ await onClickDuplicateMenuItem(pageId);
|
|
|
|
|
+ }, [onClickDuplicateMenuItem, pageId]);
|
|
|
|
|
+
|
|
|
const deleteMenuItemClickHandler = useCallback(async() => {
|
|
const deleteMenuItemClickHandler = useCallback(async() => {
|
|
|
if (onClickDeleteMenuItem == null) {
|
|
if (onClickDeleteMenuItem == null) {
|
|
|
return;
|
|
return;
|
|
@@ -289,8 +288,8 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
isLoading={isLoading}
|
|
isLoading={isLoading}
|
|
|
pageInfo={fetchedPageInfo ?? presetPageInfo}
|
|
pageInfo={fetchedPageInfo ?? presetPageInfo}
|
|
|
onClickBookmarkMenuItem={bookmarkMenuItemClickHandler}
|
|
onClickBookmarkMenuItem={bookmarkMenuItemClickHandler}
|
|
|
- onClickDuplicateMenuItem={duplicateMenuItemClickHandler}
|
|
|
|
|
onClickRenameMenuItem={renameMenuItemClickHandler}
|
|
onClickRenameMenuItem={renameMenuItemClickHandler}
|
|
|
|
|
+ onClickDuplicateMenuItem={duplicateMenuItemClickHandler}
|
|
|
onClickDeleteMenuItem={deleteMenuItemClickHandler}
|
|
onClickDeleteMenuItem={deleteMenuItemClickHandler}
|
|
|
/>
|
|
/>
|
|
|
</Dropdown>
|
|
</Dropdown>
|