@tap-payments/os-micro-frontend-shared 0.1.391-test.1 → 0.1.391-test.2
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.
- package/build/components/TreeDropdown/TreeDropdown.js +33 -14
- package/build/components/TreeDropdown/TreeNodeItem/TreeNodeItem.js +3 -3
- package/build/components/TreeDropdown/context/TreeDropdownProvider.d.ts +2 -2
- package/build/components/TreeDropdown/context/TreeDropdownProvider.js +3 -3
- package/build/components/TreeDropdown/hooks/useTreeDropdown.d.ts +1 -1
- package/build/components/TreeDropdown/type.d.ts +7 -1
- package/package.json +2 -2
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef, useCallback, useImperativeHandle, useMemo, useState } from 'react';
|
|
2
|
+
import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import { SelectedState } from './type';
|
|
4
4
|
import TreeNodeList from './TreeNodeList/TreeNodeList';
|
|
5
5
|
import { initializeTreeMapper, promoteSingleChild, TreeManager, updateSelection } from './utils';
|
|
6
6
|
import TreeDropdownProvider from './context/TreeDropdownProvider';
|
|
7
7
|
const TreeDropdown = forwardRef((props, ref) => {
|
|
8
|
-
const { anchorEl, placement = 'bottom-start', treeDefinition, sx, onChange, multiple = true, exposeOnlySelectedTree = false, IconComponent } = props;
|
|
9
|
-
const { header, footer, children:
|
|
10
|
-
|
|
8
|
+
const { anchorEl, placement = 'bottom-start', treeDefinition, sx, onChange, multiple = true, exposeOnlySelectedTree = false, IconComponent, onMounted, } = props;
|
|
9
|
+
const { header, footer, children: initialMenuItems = [], searchProps, levelKey } = treeDefinition;
|
|
10
|
+
/**
|
|
11
|
+
* Only keep the initial menu items in a ref to avoid re-rendering the component when the menu items change.
|
|
12
|
+
*/
|
|
13
|
+
const menuItems = useRef(initialMenuItems).current;
|
|
14
|
+
const [treeMapper, setTreeMapper] = useState({});
|
|
15
|
+
const initialized = useRef(false);
|
|
11
16
|
const formattedMenuItems = useMemo(() => promoteSingleChild(menuItems || []), [menuItems]);
|
|
12
|
-
const getFullTree = useCallback(() => TreeManager.denormalizeTree(menuItems,
|
|
17
|
+
const getFullTree = useCallback(() => TreeManager.denormalizeTree(menuItems, treeMapper), [menuItems, treeMapper]);
|
|
13
18
|
const getSelectedTree = useCallback(() => TreeManager.extractSelectedBranches(getFullTree()), [getFullTree]);
|
|
14
19
|
const handleSelect = useCallback((isChecked, targetNode) => {
|
|
15
|
-
const nextInternal = updateSelection(
|
|
16
|
-
|
|
20
|
+
const nextInternal = updateSelection(treeMapper, targetNode.id, isChecked, multiple);
|
|
21
|
+
setTreeMapper(nextInternal);
|
|
17
22
|
if (onChange) {
|
|
18
23
|
if (exposeOnlySelectedTree) {
|
|
19
24
|
onChange(TreeManager.extractSelectedBranches(TreeManager.denormalizeTree(menuItems, nextInternal)));
|
|
@@ -22,7 +27,7 @@ const TreeDropdown = forwardRef((props, ref) => {
|
|
|
22
27
|
onChange(TreeManager.denormalizeTree(menuItems, nextInternal));
|
|
23
28
|
}
|
|
24
29
|
}
|
|
25
|
-
}, [onChange, menuItems,
|
|
30
|
+
}, [onChange, menuItems, treeMapper, multiple, exposeOnlySelectedTree]);
|
|
26
31
|
const toggleAll = useCallback((selected) => {
|
|
27
32
|
const setStatus = (tree, isChecked) => {
|
|
28
33
|
const next = Object.assign({}, tree);
|
|
@@ -31,8 +36,8 @@ const TreeDropdown = forwardRef((props, ref) => {
|
|
|
31
36
|
});
|
|
32
37
|
return next;
|
|
33
38
|
};
|
|
34
|
-
const nextInternal = setStatus(
|
|
35
|
-
|
|
39
|
+
const nextInternal = setStatus(treeMapper, selected);
|
|
40
|
+
setTreeMapper(nextInternal);
|
|
36
41
|
if (onChange) {
|
|
37
42
|
if (exposeOnlySelectedTree) {
|
|
38
43
|
onChange(TreeManager.extractSelectedBranches(TreeManager.denormalizeTree(menuItems, nextInternal)));
|
|
@@ -41,13 +46,27 @@ const TreeDropdown = forwardRef((props, ref) => {
|
|
|
41
46
|
onChange(TreeManager.denormalizeTree(menuItems, nextInternal));
|
|
42
47
|
}
|
|
43
48
|
}
|
|
44
|
-
}, [
|
|
49
|
+
}, [treeMapper, onChange, menuItems, exposeOnlySelectedTree]);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (initialized.current)
|
|
52
|
+
return;
|
|
53
|
+
initialized.current = true;
|
|
54
|
+
const intitialMapper = initializeTreeMapper(menuItems || [], multiple);
|
|
55
|
+
setTreeMapper(intitialMapper);
|
|
56
|
+
const tree = TreeManager.denormalizeTree(menuItems, intitialMapper);
|
|
57
|
+
const selectedTree = TreeManager.extractSelectedBranches(tree);
|
|
58
|
+
onMounted === null || onMounted === void 0 ? void 0 : onMounted({
|
|
59
|
+
state: intitialMapper,
|
|
60
|
+
tree,
|
|
61
|
+
selectedTree,
|
|
62
|
+
});
|
|
63
|
+
}, [menuItems, multiple, onMounted]);
|
|
45
64
|
useImperativeHandle(ref, () => ({
|
|
46
|
-
|
|
65
|
+
treeMapper,
|
|
47
66
|
getFullTree,
|
|
48
67
|
getSelectedTree,
|
|
49
68
|
toggleAll,
|
|
50
|
-
}), [
|
|
51
|
-
return (_jsx(TreeDropdownProvider, Object.assign({
|
|
69
|
+
}), [treeMapper, getFullTree, getSelectedTree, toggleAll]);
|
|
70
|
+
return (_jsx(TreeDropdownProvider, Object.assign({ treeMapper: treeMapper, IconComponent: IconComponent, handleSelect: handleSelect, multiple: multiple }, { children: _jsx(TreeNodeList, { anchorEl: anchorEl, sx: sx, header: header, footer: footer, menuItems: formattedMenuItems, levelKey: levelKey, searchProps: searchProps, placement: placement }) })));
|
|
52
71
|
});
|
|
53
72
|
export default TreeDropdown;
|
|
@@ -22,7 +22,7 @@ import { ArrowIcon, ChildrenCount, Content, HintText, Label } from './style';
|
|
|
22
22
|
const TreeNodeItem = (props) => {
|
|
23
23
|
var _a, _b;
|
|
24
24
|
const { renderItem, header, footer } = props, nodeProps = __rest(props, ["renderItem", "header", "footer"]);
|
|
25
|
-
const {
|
|
25
|
+
const { treeMapper, handleSelect, multiple, IconComponent } = useTreeDropdown();
|
|
26
26
|
const { label, icon, iconComponent, levelIndex = 0, children, nestedMenuSx, hintText, disableHovering, itemProps, searchProps, subLevelKey, } = nodeProps;
|
|
27
27
|
const [anchorEl, setAnchorEl] = useState(null);
|
|
28
28
|
const hasChildren = !!children;
|
|
@@ -50,8 +50,8 @@ const TreeNodeItem = (props) => {
|
|
|
50
50
|
return null;
|
|
51
51
|
return IconComponent ? _jsx(IconComponent, { fileId: icon.fileId, width: (_a = icon.width) !== null && _a !== void 0 ? _a : 20, height: (_b = icon.height) !== null && _b !== void 0 ? _b : 20 }) : null;
|
|
52
52
|
}, [iconComponent, icon, IconComponent]);
|
|
53
|
-
const checked = ((_a =
|
|
54
|
-
const indeterminate = multiple ? ((_b =
|
|
53
|
+
const checked = ((_a = treeMapper[nodeProps.id]) === null || _a === void 0 ? void 0 : _a.status) === SelectedState.CHECKED;
|
|
54
|
+
const indeterminate = multiple ? ((_b = treeMapper[nodeProps.id]) === null || _b === void 0 ? void 0 : _b.status) === SelectedState.INDETERMINATE : false;
|
|
55
55
|
const showSelectionControl = multiple || !hasChildren;
|
|
56
56
|
const handleSelectInternal = useCallback((e) => {
|
|
57
57
|
e.stopPropagation();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type PropsWithChildren } from 'react';
|
|
2
2
|
import { TreeMapper, TreeNode } from '../type';
|
|
3
3
|
type TreeDropdownContextType = {
|
|
4
|
-
|
|
4
|
+
treeMapper: TreeMapper;
|
|
5
5
|
handleSelect: (isChecked: boolean, targetNode: TreeNode) => void;
|
|
6
6
|
multiple?: boolean;
|
|
7
7
|
IconComponent?: React.ComponentType<{
|
|
@@ -11,5 +11,5 @@ type TreeDropdownContextType = {
|
|
|
11
11
|
}>;
|
|
12
12
|
};
|
|
13
13
|
export declare const TreeDropdownContext: import("react").Context<TreeDropdownContextType>;
|
|
14
|
-
declare const TreeDropdownProvider: ({ children,
|
|
14
|
+
declare const TreeDropdownProvider: ({ children, treeMapper, handleSelect, multiple, IconComponent }: PropsWithChildren<TreeDropdownContextType>) => import("react/jsx-runtime").JSX.Element;
|
|
15
15
|
export default TreeDropdownProvider;
|
|
@@ -2,12 +2,12 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { useMemo, createContext } from 'react';
|
|
3
3
|
// eslint-disable-next-line react-refresh/only-export-components
|
|
4
4
|
export const TreeDropdownContext = createContext({
|
|
5
|
-
|
|
5
|
+
treeMapper: {},
|
|
6
6
|
handleSelect: () => { },
|
|
7
7
|
multiple: false,
|
|
8
8
|
});
|
|
9
|
-
const TreeDropdownProvider = ({ children,
|
|
10
|
-
const ctxValues = useMemo(() => ({
|
|
9
|
+
const TreeDropdownProvider = ({ children, treeMapper, handleSelect, multiple, IconComponent }) => {
|
|
10
|
+
const ctxValues = useMemo(() => ({ treeMapper, handleSelect, multiple, IconComponent }), [treeMapper, handleSelect, multiple, IconComponent]);
|
|
11
11
|
return _jsx(TreeDropdownContext.Provider, Object.assign({ value: ctxValues }, { children: children }));
|
|
12
12
|
};
|
|
13
13
|
export default TreeDropdownProvider;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
declare const useTreeDropdown: () => {
|
|
3
|
-
|
|
3
|
+
treeMapper: import("..").TreeMapper;
|
|
4
4
|
handleSelect: (isChecked: boolean, targetNode: import("..").TreeNode) => void;
|
|
5
5
|
multiple?: boolean | undefined;
|
|
6
6
|
IconComponent?: import("react").ComponentType<{
|
|
@@ -8,7 +8,13 @@ export type TreeNodeIcon = {
|
|
|
8
8
|
height?: number | string;
|
|
9
9
|
};
|
|
10
10
|
export type ExtendableObject<T> = T extends Record<string, any> ? T & Record<string, any> : never;
|
|
11
|
+
export type OnTreeMountedParams = {
|
|
12
|
+
state: TreeMapper;
|
|
13
|
+
tree: TreeNode[];
|
|
14
|
+
selectedTree: TreeNode[];
|
|
15
|
+
};
|
|
11
16
|
export type TreeDropdownProps = {
|
|
17
|
+
onMounted?: (params: OnTreeMountedParams) => void;
|
|
12
18
|
onChange?: (tree: TreeNode[]) => void;
|
|
13
19
|
multiple?: boolean;
|
|
14
20
|
anchorEl: HTMLElement | null;
|
|
@@ -23,7 +29,7 @@ export type TreeDropdownProps = {
|
|
|
23
29
|
}>;
|
|
24
30
|
};
|
|
25
31
|
export type TreeDropdownRef = {
|
|
26
|
-
|
|
32
|
+
treeMapper: TreeMapper;
|
|
27
33
|
getFullTree: () => TreeNode[];
|
|
28
34
|
getSelectedTree: () => TreeNode[];
|
|
29
35
|
toggleAll: (selected: boolean) => void;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tap-payments/os-micro-frontend-shared",
|
|
3
3
|
"description": "Shared components and utilities for Tap Payments micro frontends",
|
|
4
|
-
"version": "0.1.391-test.
|
|
5
|
-
"testVersion":
|
|
4
|
+
"version": "0.1.391-test.2",
|
|
5
|
+
"testVersion": 2,
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "build/index.js",
|
|
8
8
|
"module": "build/index.js",
|