Skip to content

Commit b84ea9c

Browse files
committed
fix: inform parent treenode if there are no child loaded
1 parent 9bb1918 commit b84ea9c

File tree

3 files changed

+34
-28
lines changed

3 files changed

+34
-28
lines changed

packages/pluggableWidgets/tree-node-web/src/TreeNode.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { ReactElement, useEffect, useState } from "react";
21
import { ObjectItem, ValueStatus } from "mendix";
2+
import { ReactElement, useEffect, useState } from "react";
33
import { TreeNodeContainerProps } from "../typings/TreeNodeProps";
4-
import { TreeNode as TreeNodeComponent, TreeNodeItem } from "./components/TreeNode";
4+
import { InfoTreeNodeItem, TreeNode as TreeNodeComponent, TreeNodeItem } from "./components/TreeNode";
55

66
function mapDataSourceItemToTreeNodeItem(item: ObjectItem, props: TreeNodeContainerProps): TreeNodeItem {
77
return {
@@ -15,8 +15,7 @@ function mapDataSourceItemToTreeNodeItem(item: ObjectItem, props: TreeNodeContai
1515

1616
export function TreeNode(props: TreeNodeContainerProps): ReactElement {
1717
const { datasource } = props;
18-
19-
const [treeNodeItems, setTreeNodeItems] = useState<TreeNodeItem[] | null>([]);
18+
const [treeNodeItems, setTreeNodeItems] = useState<TreeNodeItem[] | InfoTreeNodeItem | null>([]);
2019

2120
useEffect(() => {
2221
// only get the items when datasource is actually available
@@ -25,7 +24,9 @@ export function TreeNode(props: TreeNodeContainerProps): ReactElement {
2524
if (datasource.items && datasource.items.length) {
2625
setTreeNodeItems(datasource.items.map(item => mapDataSourceItemToTreeNodeItem(item, props)));
2726
} else {
28-
setTreeNodeItems([]);
27+
setTreeNodeItems({
28+
Message: "No data available"
29+
});
2930
}
3031
}
3132
}, [datasource.status, datasource.items]);

packages/pluggableWidgets/tree-node-web/src/components/TreeNode.tsx

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@ export interface TreeNodeItem extends ObjectItem {
1616
isUserDefinedLeafNode: boolean;
1717
}
1818

19+
export interface InfoTreeNodeItem {
20+
Message: string;
21+
}
22+
1923
export interface TreeNodeProps extends Pick<TreeNodeContainerProps, "tabIndex"> {
2024
class: string;
2125
style?: CSSProperties;
22-
items: TreeNodeItem[] | null;
26+
items: TreeNodeItem[] | InfoTreeNodeItem | null;
2327
startExpanded: TreeNodeBranchProps["startExpanded"];
2428
showCustomIcon: boolean;
2529
iconPlacement: TreeNodeBranchProps["iconPlacement"];
@@ -62,11 +66,11 @@ export function TreeNode({
6266
return treeNodeElement?.parentElement?.className.includes(treeNodeBranchUtils.bodyClassName) ?? false;
6367
}, [treeNodeElement]);
6468

65-
useInformParentContextOfChildNodes(items?.length ?? 0, isInsideAnotherTreeNode);
69+
useInformParentContextOfChildNodes(Array.isArray(items) ? items.length : 0, isInsideAnotherTreeNode);
6670

6771
const changeTreeNodeBranchHeaderFocus = useTreeNodeFocusChangeHandler();
6872

69-
if (items === null || items.length === 0) {
73+
if (items === null || (Array.isArray(items) && items.length === 0)) {
7074
return null;
7175
}
7276

@@ -78,25 +82,26 @@ export function TreeNode({
7882
data-focusindex={tabIndex || 0}
7983
role={level === 0 ? "tree" : "group"}
8084
>
81-
{items.map(item => {
82-
const { id, headerContent, bodyContent, isUserDefinedLeafNode } = item;
83-
return (
84-
<TreeNodeBranch
85-
key={id}
86-
id={id}
87-
headerContent={headerContent}
88-
isUserDefinedLeafNode={isUserDefinedLeafNode}
89-
startExpanded={startExpanded}
90-
iconPlacement={iconPlacement}
91-
renderHeaderIcon={renderHeaderIconCallback}
92-
changeFocus={changeTreeNodeBranchHeaderFocus}
93-
animateTreeNodeContent={animateTreeNodeContent}
94-
openNodeOn={openNodeOn}
95-
>
96-
{bodyContent}
97-
</TreeNodeBranch>
98-
);
99-
})}
85+
{Array.isArray(items) &&
86+
items.map(item => {
87+
const { id, headerContent, bodyContent, isUserDefinedLeafNode } = item;
88+
return (
89+
<TreeNodeBranch
90+
key={id}
91+
id={id}
92+
headerContent={headerContent}
93+
isUserDefinedLeafNode={isUserDefinedLeafNode}
94+
startExpanded={startExpanded}
95+
iconPlacement={iconPlacement}
96+
renderHeaderIcon={renderHeaderIconCallback}
97+
changeFocus={changeTreeNodeBranchHeaderFocus}
98+
animateTreeNodeContent={animateTreeNodeContent}
99+
openNodeOn={openNodeOn}
100+
>
101+
{bodyContent}
102+
</TreeNodeBranch>
103+
);
104+
})}
100105
</ul>
101106
);
102107
}

packages/pluggableWidgets/tree-node-web/src/components/hooks/lazyLoading.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const useTreeNodeLazyLoading = (
1010
hasNestedTreeNode: () => boolean;
1111
} => {
1212
const hasNestedTreeNode = useCallback(
13-
() => treeNodeBranchBody.current?.lastElementChild?.className.includes("widget-tree-node") ?? false,
13+
() => treeNodeBranchBody.current?.lastElementChild?.className.includes("widget-tree-node") ?? true,
1414
[]
1515
);
1616

0 commit comments

Comments
 (0)