|
@@ -23,6 +23,7 @@ type CommonProps = {
|
|
|
isEnableActions?: boolean,
|
|
isEnableActions?: boolean,
|
|
|
hideBookmarkMenuItem?: boolean,
|
|
hideBookmarkMenuItem?: boolean,
|
|
|
onClickBookmarkMenuItem?: (pageId: string, newValue?: boolean) => Promise<void>,
|
|
onClickBookmarkMenuItem?: (pageId: string, newValue?: boolean) => Promise<void>,
|
|
|
|
|
+ onClickDuplicateMenuItem?: (pageId: string, path: string) => void,
|
|
|
onClickRenameMenuItem?: (pageId: string) => void,
|
|
onClickRenameMenuItem?: (pageId: string) => void,
|
|
|
onClickDeleteMenuItem?: (pageId: string) => void,
|
|
onClickDeleteMenuItem?: (pageId: string) => void,
|
|
|
|
|
|
|
@@ -32,14 +33,15 @@ type CommonProps = {
|
|
|
|
|
|
|
|
type DropdownMenuProps = CommonProps & {
|
|
type DropdownMenuProps = CommonProps & {
|
|
|
pageId: string,
|
|
pageId: string,
|
|
|
|
|
+ path: string,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.Element => {
|
|
const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.Element => {
|
|
|
const { t } = useTranslation('');
|
|
const { t } = useTranslation('');
|
|
|
|
|
|
|
|
const {
|
|
const {
|
|
|
- pageId, pageInfo, isEnableActions, hideBookmarkMenuItem,
|
|
|
|
|
- onClickBookmarkMenuItem, onClickRenameMenuItem, onClickDeleteMenuItem,
|
|
|
|
|
|
|
+ pageId, path, pageInfo, isEnableActions, hideBookmarkMenuItem,
|
|
|
|
|
+ onClickBookmarkMenuItem, onClickDuplicateMenuItem, onClickRenameMenuItem, onClickDeleteMenuItem,
|
|
|
additionalMenuItemRenderer: AdditionalMenuItems,
|
|
additionalMenuItemRenderer: AdditionalMenuItems,
|
|
|
} = props;
|
|
} = props;
|
|
|
|
|
|
|
@@ -52,6 +54,14 @@ 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, path);
|
|
|
|
|
+ }, [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) {
|
|
@@ -97,7 +107,7 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
|
|
|
|
|
{/* Duplicate */}
|
|
{/* Duplicate */}
|
|
|
{ isExistPageInfo(pageInfo) && isEnableActions && (
|
|
{ isExistPageInfo(pageInfo) && isEnableActions && (
|
|
|
- <DropdownItem onClick={() => toastr.warning(t('search_result.currently_not_implemented'))}>
|
|
|
|
|
|
|
+ <DropdownItem onClick={duplicateItemClickedHandler}>
|
|
|
<i className="icon-fw icon-docs"></i>
|
|
<i className="icon-fw icon-docs"></i>
|
|
|
{t('Duplicate')}
|
|
{t('Duplicate')}
|
|
|
</DropdownItem>
|
|
</DropdownItem>
|
|
@@ -135,6 +145,7 @@ const PageItemControlDropdownMenu = React.memo((props: DropdownMenuProps): JSX.E
|
|
|
|
|
|
|
|
type PageItemControlSubstanceProps = CommonProps & {
|
|
type PageItemControlSubstanceProps = CommonProps & {
|
|
|
pageId: string,
|
|
pageId: string,
|
|
|
|
|
+ path: string,
|
|
|
fetchOnOpen?: boolean,
|
|
fetchOnOpen?: boolean,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -142,7 +153,7 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
|
|
|
|
|
const {
|
|
const {
|
|
|
pageId, pageInfo: presetPageInfo, fetchOnOpen,
|
|
pageId, pageInfo: presetPageInfo, fetchOnOpen,
|
|
|
- onClickBookmarkMenuItem,
|
|
|
|
|
|
|
+ onClickBookmarkMenuItem, onClickDuplicateMenuItem,
|
|
|
} = props;
|
|
} = props;
|
|
|
|
|
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
@@ -161,6 +172,16 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
}
|
|
}
|
|
|
}, [mutatePageInfo, onClickBookmarkMenuItem, shouldFetch]);
|
|
}, [mutatePageInfo, onClickBookmarkMenuItem, shouldFetch]);
|
|
|
|
|
|
|
|
|
|
+ const duplicateMenuItemClickHandler = useCallback(async(_pageId: string, _path: string) => {
|
|
|
|
|
+ if (onClickDuplicateMenuItem != null) {
|
|
|
|
|
+ await onClickDuplicateMenuItem(_pageId, _path);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (shouldFetch) {
|
|
|
|
|
+ mutatePageInfo();
|
|
|
|
|
+ }
|
|
|
|
|
+ }, [mutatePageInfo, onClickDuplicateMenuItem, shouldFetch]);
|
|
|
|
|
+
|
|
|
return (
|
|
return (
|
|
|
<Dropdown isOpen={isOpen} toggle={() => setIsOpen(!isOpen)}>
|
|
<Dropdown isOpen={isOpen} toggle={() => setIsOpen(!isOpen)}>
|
|
|
<DropdownToggle color="transparent" className="border-0 rounded grw-btn-page-management p-0">
|
|
<DropdownToggle color="transparent" className="border-0 rounded grw-btn-page-management p-0">
|
|
@@ -171,6 +192,7 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
{...props}
|
|
{...props}
|
|
|
pageInfo={presetPageInfo ?? fetchedPageInfo}
|
|
pageInfo={presetPageInfo ?? fetchedPageInfo}
|
|
|
onClickBookmarkMenuItem={bookmarkMenuItemClickHandler}
|
|
onClickBookmarkMenuItem={bookmarkMenuItemClickHandler}
|
|
|
|
|
+ onClickDuplicateMenuItem={duplicateMenuItemClickHandler}
|
|
|
/>
|
|
/>
|
|
|
</Dropdown>
|
|
</Dropdown>
|
|
|
);
|
|
);
|
|
@@ -180,29 +202,31 @@ export const PageItemControlSubstance = (props: PageItemControlSubstanceProps):
|
|
|
|
|
|
|
|
type PageItemControlProps = CommonProps & {
|
|
type PageItemControlProps = CommonProps & {
|
|
|
pageId?: string,
|
|
pageId?: string,
|
|
|
|
|
+ path?: string,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export const PageItemControl = (props: PageItemControlProps): JSX.Element => {
|
|
export const PageItemControl = (props: PageItemControlProps): JSX.Element => {
|
|
|
- const { pageId } = props;
|
|
|
|
|
|
|
+ const { pageId, path } = props;
|
|
|
|
|
|
|
|
- if (pageId == null) {
|
|
|
|
|
|
|
+ if (pageId == null || path == null) {
|
|
|
return <></>;
|
|
return <></>;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return <PageItemControlSubstance pageId={pageId} {...props} />;
|
|
|
|
|
|
|
+ return <PageItemControlSubstance pageId={pageId} path={path} {...props} />;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
type AsyncPageItemControlProps = CommonProps & {
|
|
type AsyncPageItemControlProps = CommonProps & {
|
|
|
pageId?: string,
|
|
pageId?: string,
|
|
|
|
|
+ path?: string,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
export const AsyncPageItemControl = (props: AsyncPageItemControlProps): JSX.Element => {
|
|
export const AsyncPageItemControl = (props: AsyncPageItemControlProps): JSX.Element => {
|
|
|
- const { pageId } = props;
|
|
|
|
|
|
|
+ const { pageId, path } = props;
|
|
|
|
|
|
|
|
- if (pageId == null) {
|
|
|
|
|
|
|
+ if (pageId == null || path == null) {
|
|
|
return <></>;
|
|
return <></>;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return <PageItemControlSubstance pageId={pageId} fetchOnOpen {...props} />;
|
|
|
|
|
|
|
+ return <PageItemControlSubstance pageId={pageId} path={path} fetchOnOpen {...props} />;
|
|
|
};
|
|
};
|