@reltio/design 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import Tree from "rc-tree";
3
3
  import { memo, useCallback, useMemo, useState } from "react";
4
+ import { classNames } from "../../utils/classNames";
4
5
  import { TreeNode } from "./components/TreeNode/TreeNode";
5
6
  import { getLevelLinesData, transformTreeData } from "./helpers";
6
7
  import styles from "./TreeList.module.css";
@@ -12,18 +13,16 @@ export const TreeList = memo(({ data, LabelComponent, expandedKeys: expandedKeys
12
13
  const levelLinesMap = useMemo(() => getLevelLinesData(rcData), [rcData]);
13
14
  const expandedSet = useMemo(() => isControlled ? new Set(expandedKeysProp ?? []) : expandedKeys, [expandedKeysProp, expandedKeys, isControlled]);
14
15
  const expandedArray = useMemo(() => Array.from(expandedSet), [expandedSet]);
15
- const updateExpandedKeys = useCallback((keys) => {
16
- if (isControlled) {
17
- onExpand?.(keys);
18
- return;
16
+ const updateExpandedKeys = useCallback((keys, treeItem) => {
17
+ onExpand?.(keys, treeItem);
18
+ if (!isControlled) {
19
+ setExpandedKeys(new Set(keys));
19
20
  }
20
- setExpandedKeys(new Set(keys));
21
- onExpand?.(keys);
22
21
  }, [isControlled, onExpand]);
23
- const handleToggle = useCallback((id, isExpanded) => {
22
+ const handleToggle = useCallback((id, isExpanded, treeItem) => {
24
23
  const next = new Set(expandedSet);
25
24
  isExpanded ? next.delete(id) : next.add(id);
26
- updateExpandedKeys(Array.from(next));
25
+ updateExpandedKeys(Array.from(next), treeItem);
27
26
  }, [expandedSet, updateExpandedKeys]);
28
27
  const renderTitle = useCallback((node) => {
29
28
  const raw = node.data.raw;
@@ -32,6 +31,6 @@ export const TreeList = memo(({ data, LabelComponent, expandedKeys: expandedKeys
32
31
  const [levelLines, isLast] = levelLinesMap[node.key] ?? [[], false];
33
32
  return (_jsx(TreeNode, { id: node.key, node: raw, depth: node.data.depth, isLeaf: isLeafNode, isExpanded: isExpanded, levelLines: levelLines, isLast: isLast, onToggle: handleToggle, LabelComponent: LabelComponent }));
34
33
  }, [expandedSet, levelLinesMap, LabelComponent, handleToggle]);
35
- return (_jsx("div", { className: styles.root, children: _jsx(Tree, { treeData: rcData, expandAction: false, virtual: false, selectable: false, expandedKeys: expandedArray, onExpand: (keys) => updateExpandedKeys(keys), showIcon: false, titleRender: renderTitle }) }));
34
+ return (_jsx("div", { className: classNames(styles.root), children: _jsx(Tree, { treeData: rcData, expandAction: false, virtual: false, selectable: false, expandedKeys: expandedArray, showIcon: false, titleRender: renderTitle }) }));
36
35
  });
37
36
  TreeList.displayName = "TreeList";
@@ -13,6 +13,8 @@ export type TreeItem = {
13
13
  label: string;
14
14
  /** Optional nested children. */
15
15
  children?: TreeItem[];
16
+ /** Optional loading flag for async child fetching. */
17
+ isLoading?: boolean;
16
18
  };
17
19
  /**
18
20
  * Internal rc-tree node representation used for rendering.
@@ -54,7 +56,7 @@ export type TreeListProps = {
54
56
  expandedKeys?: TreeKey[];
55
57
  /**
56
58
  * Called when the expanded state changes (controlled mode).
57
- * Provides the resulting expanded keys list.
59
+ * Provides the resulting expanded keys list and the toggled node.
58
60
  */
59
- onExpand?: (keys: TreeKey[]) => void;
61
+ onExpand?: (keys: TreeKey[], node: TreeItem) => void;
60
62
  };
@@ -7,8 +7,8 @@ import styles from "./TreeNode.module.css";
7
7
  export const TreeNode = memo(({ id, node, depth, isLeaf, isExpanded, levelLines, isLast, onToggle, LabelComponent, }) => {
8
8
  const handleToggleClick = useCallback((event) => {
9
9
  event.stopPropagation();
10
- onToggle(id, isExpanded);
11
- }, [onToggle, id, isExpanded]);
12
- return (_jsxs("div", { className: classNames(styles.wrapper), "data-depth": depth, children: [_jsx(TreeLevelLines, { levelLines: levelLines, isLast: isLast }), _jsx("span", { className: styles.indent, style: { ["--depth"]: `${depth}` } }), isLeaf ? (_jsx("span", { className: styles.toggle, "aria-hidden": "true" })) : (_jsx("button", { type: "button", className: styles.toggle, "aria-label": isExpanded ? "Collapse" : "Expand", onClick: handleToggleClick, children: _jsx(ChevronIcon, { expanded: isExpanded }) })), LabelComponent ? _jsx(LabelComponent, { data: node }) : node.label] }));
10
+ onToggle(id, isExpanded, node);
11
+ }, [onToggle, id, isExpanded, node]);
12
+ return (_jsxs("div", { className: classNames(styles.wrapper), "data-depth": depth, children: [_jsx(TreeLevelLines, { levelLines: levelLines, isLast: isLast }), _jsx("span", { className: classNames(styles.indent), style: { ["--depth"]: `${depth}` } }), isLeaf ? (_jsx("span", { className: classNames(styles.toggle), "aria-hidden": "true" })) : node.isLoading ? (_jsx("span", { className: classNames(styles.toggle), "aria-hidden": "true", children: _jsx("span", { className: classNames(styles.spinner) }) })) : (_jsx("button", { type: "button", className: classNames(styles.toggle), "aria-label": isExpanded ? "Collapse" : "Expand", onClick: handleToggleClick, children: _jsx(ChevronIcon, { expanded: isExpanded }) })), LabelComponent ? _jsx(LabelComponent, { data: node }) : node.label] }));
13
13
  });
14
14
  TreeNode.displayName = "TreeNode";
@@ -1,7 +1,7 @@
1
1
  import styleInject from 'style-inject';
2
2
  import json from './TreeNode.module.css.json';
3
3
  styleInject(`
4
- ._wrapper_67wfw_1 {
4
+ ._wrapper_9wzlc_1 {
5
5
  display: flex;
6
6
  align-items: center;
7
7
  line-height: var(--reltio-tree-list-line-height, 1.5);
@@ -11,13 +11,13 @@ styleInject(`
11
11
  z-index: 1;
12
12
  }
13
13
 
14
- ._indent_67wfw_11 {
14
+ ._indent_9wzlc_11 {
15
15
  display: inline-block;
16
16
  width: calc(var(--depth, 1) * var(--reltio-tree-list-indent-size, 16px));
17
17
  flex: 0 0 auto;
18
18
  }
19
19
 
20
- ._toggle_67wfw_17 {
20
+ ._toggle_9wzlc_17 {
21
21
  display: inline-flex;
22
22
  align-items: center;
23
23
  justify-content: center;
@@ -29,13 +29,33 @@ styleInject(`
29
29
  cursor: pointer;
30
30
  }
31
31
 
32
- ._actions_67wfw_29 {
32
+ ._spinner_9wzlc_29 {
33
+ display: inline-block;
34
+ width: var(--reltio-tree-list-spinner-size, 10px);
35
+ height: var(--reltio-tree-list-spinner-size, 10px);
36
+ border-radius: 50%;
37
+ border: var(--reltio-tree-list-spinner-width, 2px) solid
38
+ var(--reltio-tree-list-spinner-color, currentColor);
39
+ border-top-color: transparent;
40
+ animation: _spin_9wzlc_29 0.8s linear infinite;
41
+ }
42
+
43
+ @keyframes _spin_9wzlc_29 {
44
+ from {
45
+ transform: rotate(0deg);
46
+ }
47
+ to {
48
+ transform: rotate(360deg);
49
+ }
50
+ }
51
+
52
+ ._actions_9wzlc_49 {
33
53
  margin-left: auto;
34
54
  opacity: 0;
35
55
  transition: opacity 0.12s ease;
36
56
  }
37
57
 
38
- ._wrapper_67wfw_1:hover ._actions_67wfw_29 {
58
+ ._wrapper_9wzlc_1:hover ._actions_9wzlc_49 {
39
59
  opacity: 1;
40
60
  }
41
61
  `);
@@ -1 +1 @@
1
- { "wrapper": "_wrapper_67wfw_1", "indent": "_indent_67wfw_11", "toggle": "_toggle_67wfw_17", "actions": "_actions_67wfw_29" }
1
+ { "wrapper": "_wrapper_9wzlc_1", "indent": "_indent_9wzlc_11", "toggle": "_toggle_9wzlc_17", "spinner": "_spinner_9wzlc_29", "spin": "_spin_9wzlc_29", "actions": "_actions_9wzlc_49" }
@@ -8,7 +8,7 @@ export type TreeNodeProps = {
8
8
  isExpanded: boolean;
9
9
  levelLines: boolean[];
10
10
  isLast: boolean;
11
- onToggle: (id: TreeKey, expanded: boolean) => void;
11
+ onToggle: (id: TreeKey, expanded: boolean, node: TreeItem) => void;
12
12
  LabelComponent?: ComponentType<{
13
13
  data: TreeItem;
14
14
  }>;
@@ -18,7 +18,7 @@ export const transformTreeData = (data, depth = 1, parentId) => {
18
18
  return data.map((item) => ({
19
19
  key: item.id,
20
20
  title: null,
21
- isLeaf: !item.children?.length,
21
+ isLeaf: !item.children,
22
22
  data: { raw: item, depth, parentId },
23
23
  children: item.children
24
24
  ? transformTreeData(item.children, depth + 1, item.id)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reltio/design",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "main": "packages/design/index.js",
5
5
  "description": "Reltio Design System",
6
6
  "peerDependencies": {