|
|
@@ -9,6 +9,7 @@ import type { Nullable } from '@growi/core';
|
|
|
import { useTranslation } from 'next-i18next';
|
|
|
import { UncontrolledTooltip } from 'reactstrap';
|
|
|
|
|
|
+import type { IPageForItem } from '~/interfaces/page';
|
|
|
import { useSWRxPageChildren } from '~/stores/page-listing';
|
|
|
import { usePageTreeDescCountMap } from '~/stores/ui';
|
|
|
import { shouldRecoverPagePaths } from '~/utils/page-operation';
|
|
|
@@ -38,27 +39,15 @@ const markTarget = (children: ItemNode[], targetPathOrId?: Nullable<string>): vo
|
|
|
};
|
|
|
|
|
|
|
|
|
-const SimpleItemContent: FC<TreeItemToolProps> = (props) => {
|
|
|
+const SimpleItemContent = ({ page }: { page: IPageForItem }) => {
|
|
|
const { t } = useTranslation();
|
|
|
|
|
|
- const { onClick } = props;
|
|
|
- const { page } = props.itemNode;
|
|
|
-
|
|
|
const pageName = nodePath.basename(page.path ?? '') || '/';
|
|
|
|
|
|
const shouldShowAttentionIcon = page.processData != null ? shouldRecoverPagePaths(page.processData) : false;
|
|
|
|
|
|
- const clickHandler = (e: MouseEvent<HTMLParagraphElement>) => {
|
|
|
- if (onClick == null) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- e.preventDefault();
|
|
|
- onClick(page);
|
|
|
- };
|
|
|
-
|
|
|
return (
|
|
|
- <>
|
|
|
+ <div className="flex-grow-1 d-flex align-items-center pe-none">
|
|
|
{shouldShowAttentionIcon && (
|
|
|
<>
|
|
|
<i id="path-recovery" className="fa fa-warning mr-2 text-warning"></i>
|
|
|
@@ -69,10 +58,10 @@ const SimpleItemContent: FC<TreeItemToolProps> = (props) => {
|
|
|
)}
|
|
|
{page != null && page.path != null && page._id != null && (
|
|
|
<div className="grw-pagetree-title-anchor flex-grow-1">
|
|
|
- <p onClick={clickHandler} className={`text-truncate m-auto ${page.isEmpty && 'grw-sidebar-text-muted'}`}>{pageName}</p>
|
|
|
+ <p className={`text-truncate m-auto ${page.isEmpty && 'grw-sidebar-text-muted'}`}>{pageName}</p>
|
|
|
</div>
|
|
|
)}
|
|
|
- </>
|
|
|
+ </div>
|
|
|
);
|
|
|
};
|
|
|
|
|
|
@@ -114,11 +103,22 @@ export const SimpleItem: FC<SimpleItemProps> = (props) => {
|
|
|
|
|
|
const { data } = useSWRxPageChildren(isOpen ? page._id : null);
|
|
|
|
|
|
+
|
|
|
+ const itemClickHandler = useCallback((e: MouseEvent) => {
|
|
|
+ // DO NOT handle the event when e.currentTarget and e.target is different
|
|
|
+ if (e.target !== e.currentTarget) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ onClick?.(page);
|
|
|
+
|
|
|
+ }, [onClick, page]);
|
|
|
+
|
|
|
+
|
|
|
// descendantCount
|
|
|
const { getDescCount } = usePageTreeDescCountMap();
|
|
|
const descendantCount = getDescCount(page._id) || page.descendantCount || 0;
|
|
|
|
|
|
-
|
|
|
// hasDescendants flag
|
|
|
const isChildrenLoaded = currentChildren?.length > 0;
|
|
|
const hasDescendants = descendantCount > 0 || isChildrenLoaded;
|
|
|
@@ -127,7 +127,7 @@ export const SimpleItem: FC<SimpleItemProps> = (props) => {
|
|
|
return currentChildren != null && currentChildren.length > 0;
|
|
|
}, [currentChildren]);
|
|
|
|
|
|
- const onClickLoadChildren = useCallback(async() => {
|
|
|
+ const onClickLoadChildren = useCallback(() => {
|
|
|
setIsOpen(!isOpen);
|
|
|
}, [isOpen]);
|
|
|
|
|
|
@@ -167,7 +167,6 @@ export const SimpleItem: FC<SimpleItemProps> = (props) => {
|
|
|
isOpen: false,
|
|
|
targetPathOrId,
|
|
|
onRenamed,
|
|
|
- onClick,
|
|
|
onClickDuplicateMenuItem,
|
|
|
onClickDeleteMenuItem,
|
|
|
};
|
|
|
@@ -188,9 +187,11 @@ export const SimpleItem: FC<SimpleItemProps> = (props) => {
|
|
|
>
|
|
|
<li
|
|
|
ref={itemRef}
|
|
|
+ role="button"
|
|
|
className={`list-group-item list-group-item-action border-0 py-0 pr-3 d-flex align-items-center
|
|
|
${page.isTarget ? 'grw-pagetree-current-page-item' : ''}`}
|
|
|
id={page.isTarget ? 'grw-pagetree-current-page-item' : `grw-pagetree-list-${page._id}`}
|
|
|
+ onClick={itemClickHandler}
|
|
|
>
|
|
|
|
|
|
<div className="grw-triangle-container d-flex justify-content-center">
|
|
|
@@ -207,7 +208,7 @@ export const SimpleItem: FC<SimpleItemProps> = (props) => {
|
|
|
)}
|
|
|
</div>
|
|
|
|
|
|
- <SimpleItemContent {...toolProps} />
|
|
|
+ <SimpleItemContent page={page} />
|
|
|
|
|
|
{EndComponents.map((EndComponent, index) => (
|
|
|
// eslint-disable-next-line react/no-array-index-key
|
|
|
@@ -228,6 +229,7 @@ export const SimpleItem: FC<SimpleItemProps> = (props) => {
|
|
|
itemNode: node,
|
|
|
itemClass,
|
|
|
mainClassName,
|
|
|
+ onClick,
|
|
|
};
|
|
|
|
|
|
return (
|