@leav/ui 1.15.0-6555bcdb → 1.15.0-9054dcc1

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.
@@ -44,16 +44,31 @@ export const useTreeNodeSelection = ({ filter, onFilterChange, flattenTreeData,
44
44
  const keptNodes = filter.userNodes
45
45
  .map(n => flattenTreeData.get(n.nodeId))
46
46
  .filter((node) => node !== undefined && node.accessRecordByDefaultPermission !== false);
47
- const hasKept = keptNodes.length > 0;
48
- const mappedKept = hasKept ? keptNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId })) : null;
49
- onFilterChange({
50
- ...filter,
51
- includeHiddenOptions: false,
52
- nodes: mappedKept,
53
- value: hasKept ? keptNodes.map(n => n.recordId) : null,
54
- userNodes: mappedKept,
55
- userFormattedValue: hasKept ? keptNodes.map(n => n.title) : null,
56
- });
47
+ if (keptNodes.length > 0) {
48
+ const mappedKept = keptNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId }));
49
+ onFilterChange({
50
+ ...filter,
51
+ includeHiddenOptions: false,
52
+ nodes: mappedKept,
53
+ value: keptNodes.map(n => n.recordId),
54
+ userNodes: mappedKept,
55
+ userFormattedValue: keptNodes.map(n => n.title),
56
+ });
57
+ }
58
+ else {
59
+ // No user-selected node survives the toggle off: fall back to the initial
60
+ // state (no user selection, network filter on default-visible nodes only).
61
+ const networkNodes = [...flattenTreeData.values()].filter(node => node.accessRecordByDefaultPermission === true);
62
+ onFilterChange({
63
+ ...filter,
64
+ includeHiddenOptions: false,
65
+ nodes: networkNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId })),
66
+ value: networkNodes.map(n => n.recordId),
67
+ formattedValue: networkNodes.map(n => n.title),
68
+ userNodes: null,
69
+ userFormattedValue: null,
70
+ });
71
+ }
57
72
  }
58
73
  else {
59
74
  onFilterChange({ ...filter, includeHiddenOptions: true });
@@ -1 +1 @@
1
- {"version":3,"file":"useTreeNodeSelection.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import {type MutableRefObject} from 'react';\nimport {type IUIFilterTree} from '_ui/components/Filters/_types';\nimport {type ITreeNode} from './useGetTreeData';\nimport {getSelectAllState} from './utils/getSelectAllState';\n\ninterface IUseTreeNodeSelectionParams {\n filter: IUIFilterTree;\n onFilterChange: (filterData: IUIFilterTree) => void;\n flattenTreeData: Map<string, ITreeNode>;\n flattenForSelectAll: Map<string, ITreeNode>;\n isAccessPermissionConfigured: boolean;\n toggleHiddenRef?: MutableRefObject<((checked: boolean) => void) | null>;\n}\n\nexport interface ITreeNodeSelection {\n selectedNodesIds: string[];\n allSelected: boolean;\n indeterminate: boolean;\n handleOnSelectEmptyValue: (selected: boolean) => void;\n handleOnSelect: (node: ITreeNode, selected: boolean) => void;\n handleOnSelectAll: (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => void;\n}\n\nexport const useTreeNodeSelection = ({\n filter,\n onFilterChange,\n flattenTreeData,\n flattenForSelectAll,\n isAccessPermissionConfigured,\n toggleHiddenRef,\n}: IUseTreeNodeSelectionParams): ITreeNodeSelection => {\n const selectedNodesIds = (filter.userNodes ?? []).map(node => node.nodeId);\n\n const {allSelected, indeterminate} = getSelectAllState(selectedNodesIds, flattenForSelectAll);\n\n const handleOnSelectEmptyValue = (selected: boolean) => {\n onFilterChange({...filter, withEmptyValues: selected});\n };\n\n const handleOnSelect = (node: ITreeNode, selected: boolean) => {\n const newSelectedIds = selected\n ? [...selectedNodesIds, node.id]\n : selectedNodesIds.filter(id => id !== node.id);\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((n): n is ITreeNode => Boolean(n));\n\n const mappedNodes = selectedNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId}));\n onFilterChange({\n ...filter,\n nodes: mappedNodes,\n value: selectedNodes.map(n => n.recordId),\n userNodes: mappedNodes,\n userFormattedValue: selectedNodes.map(n => n.title),\n });\n };\n\n const handleOnSelectAll = (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => {\n const newSelectedIds = isSelected\n ? [...new Set([...selectedNodesIds, ...treeToSelect.keys()])]\n : selectedNodesIds.filter(id => !treeToSelect.has(id));\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((n): n is ITreeNode => Boolean(n));\n\n const mappedNodes = selectedNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId}));\n onFilterChange({\n ...filter,\n nodes: mappedNodes,\n value: selectedNodes.map(n => n.recordId),\n userNodes: mappedNodes,\n userFormattedValue: selectedNodes.map(n => n.title),\n });\n };\n\n const handleToggle = (checked: boolean) => {\n if (filter.userNodes != null) {\n // Has user selection: on toggle off, drop hidden selections from user selection.\n if (!checked) {\n const keptNodes = filter.userNodes\n .map(n => flattenTreeData.get(n.nodeId))\n .filter(\n (node): node is ITreeNode =>\n node !== undefined && node.accessRecordByDefaultPermission !== false,\n );\n const hasKept = keptNodes.length > 0;\n const mappedKept = hasKept ? keptNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId})) : null;\n onFilterChange({\n ...filter,\n includeHiddenOptions: false,\n nodes: mappedKept,\n value: hasKept ? keptNodes.map(n => n.recordId) : null,\n userNodes: mappedKept,\n userFormattedValue: hasKept ? keptNodes.map(n => n.title) : null,\n });\n } else {\n onFilterChange({...filter, includeHiddenOptions: true});\n }\n } else {\n // No user selection: update the network values (value/nodes) to reflect all currently\n // visible nodes, without creating a UI selection (userNodes stays null).\n // Toggle ON → all nodes (flattenTreeData contains hidden nodes too).\n // Toggle OFF → only nodes with explicit access (accessRecordByDefaultPermission === true).\n const networkNodes = checked\n ? [...flattenTreeData.values()]\n : [...flattenTreeData.values()].filter(node => node.accessRecordByDefaultPermission === true);\n onFilterChange({\n ...filter,\n includeHiddenOptions: checked,\n nodes: networkNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId})),\n value: networkNodes.map(n => n.recordId),\n formattedValue: networkNodes.map(n => n.title),\n });\n }\n };\n\n // Expose the toggle handler to FilterDropDown via ref (updated every render to stay current)\n if (toggleHiddenRef) {\n toggleHiddenRef.current = isAccessPermissionConfigured ? handleToggle : null;\n }\n\n return {selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll};\n};\n"]}
1
+ {"version":3,"file":"useTreeNodeSelection.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import {type MutableRefObject} from 'react';\nimport {type IUIFilterTree} from '_ui/components/Filters/_types';\nimport {type ITreeNode} from './useGetTreeData';\nimport {getSelectAllState} from './utils/getSelectAllState';\n\ninterface IUseTreeNodeSelectionParams {\n filter: IUIFilterTree;\n onFilterChange: (filterData: IUIFilterTree) => void;\n flattenTreeData: Map<string, ITreeNode>;\n flattenForSelectAll: Map<string, ITreeNode>;\n isAccessPermissionConfigured: boolean;\n toggleHiddenRef?: MutableRefObject<((checked: boolean) => void) | null>;\n}\n\nexport interface ITreeNodeSelection {\n selectedNodesIds: string[];\n allSelected: boolean;\n indeterminate: boolean;\n handleOnSelectEmptyValue: (selected: boolean) => void;\n handleOnSelect: (node: ITreeNode, selected: boolean) => void;\n handleOnSelectAll: (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => void;\n}\n\nexport const useTreeNodeSelection = ({\n filter,\n onFilterChange,\n flattenTreeData,\n flattenForSelectAll,\n isAccessPermissionConfigured,\n toggleHiddenRef,\n}: IUseTreeNodeSelectionParams): ITreeNodeSelection => {\n const selectedNodesIds = (filter.userNodes ?? []).map(node => node.nodeId);\n\n const {allSelected, indeterminate} = getSelectAllState(selectedNodesIds, flattenForSelectAll);\n\n const handleOnSelectEmptyValue = (selected: boolean) => {\n onFilterChange({...filter, withEmptyValues: selected});\n };\n\n const handleOnSelect = (node: ITreeNode, selected: boolean) => {\n const newSelectedIds = selected\n ? [...selectedNodesIds, node.id]\n : selectedNodesIds.filter(id => id !== node.id);\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((n): n is ITreeNode => Boolean(n));\n\n const mappedNodes = selectedNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId}));\n onFilterChange({\n ...filter,\n nodes: mappedNodes,\n value: selectedNodes.map(n => n.recordId),\n userNodes: mappedNodes,\n userFormattedValue: selectedNodes.map(n => n.title),\n });\n };\n\n const handleOnSelectAll = (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => {\n const newSelectedIds = isSelected\n ? [...new Set([...selectedNodesIds, ...treeToSelect.keys()])]\n : selectedNodesIds.filter(id => !treeToSelect.has(id));\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((n): n is ITreeNode => Boolean(n));\n\n const mappedNodes = selectedNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId}));\n onFilterChange({\n ...filter,\n nodes: mappedNodes,\n value: selectedNodes.map(n => n.recordId),\n userNodes: mappedNodes,\n userFormattedValue: selectedNodes.map(n => n.title),\n });\n };\n\n const handleToggle = (checked: boolean) => {\n if (filter.userNodes != null) {\n // Has user selection: on toggle off, drop hidden selections from user selection.\n if (!checked) {\n const keptNodes = filter.userNodes\n .map(n => flattenTreeData.get(n.nodeId))\n .filter(\n (node): node is ITreeNode =>\n node !== undefined && node.accessRecordByDefaultPermission !== false,\n );\n if (keptNodes.length > 0) {\n const mappedKept = keptNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId}));\n onFilterChange({\n ...filter,\n includeHiddenOptions: false,\n nodes: mappedKept,\n value: keptNodes.map(n => n.recordId),\n userNodes: mappedKept,\n userFormattedValue: keptNodes.map(n => n.title),\n });\n } else {\n // No user-selected node survives the toggle off: fall back to the initial\n // state (no user selection, network filter on default-visible nodes only).\n const networkNodes = [...flattenTreeData.values()].filter(\n node => node.accessRecordByDefaultPermission === true,\n );\n onFilterChange({\n ...filter,\n includeHiddenOptions: false,\n nodes: networkNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId})),\n value: networkNodes.map(n => n.recordId),\n formattedValue: networkNodes.map(n => n.title),\n userNodes: null,\n userFormattedValue: null,\n });\n }\n } else {\n onFilterChange({...filter, includeHiddenOptions: true});\n }\n } else {\n // No user selection: update the network values (value/nodes) to reflect all currently\n // visible nodes, without creating a UI selection (userNodes stays null).\n // Toggle ON → all nodes (flattenTreeData contains hidden nodes too).\n // Toggle OFF → only nodes with explicit access (accessRecordByDefaultPermission === true).\n const networkNodes = checked\n ? [...flattenTreeData.values()]\n : [...flattenTreeData.values()].filter(node => node.accessRecordByDefaultPermission === true);\n onFilterChange({\n ...filter,\n includeHiddenOptions: checked,\n nodes: networkNodes.map(n => ({nodeId: n.id, libraryId: n.libraryId})),\n value: networkNodes.map(n => n.recordId),\n formattedValue: networkNodes.map(n => n.title),\n });\n }\n };\n\n // Expose the toggle handler to FilterDropDown via ref (updated every render to stay current)\n if (toggleHiddenRef) {\n toggleHiddenRef.current = isAccessPermissionConfigured ? handleToggle : null;\n }\n\n return {selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll};\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leav/ui",
3
- "version": "1.15.0-6555bcdb",
3
+ "version": "1.15.0-9054dcc1",
4
4
  "description": "Shared React components and hooks",
5
5
  "scripts": {
6
6
  "prepublishOnly": "yarn build",
@@ -43,7 +43,7 @@
43
43
  "@types/react-dom": "18.2.6",
44
44
  "aristid-ds": "15.3.1-2d7a4f8",
45
45
  "babel-jest": "29.7.0",
46
- "graphql": "16.14.0",
46
+ "graphql": "16.14.1",
47
47
  "i18next": "22.5.1",
48
48
  "jest": "29.7.0",
49
49
  "jest-environment-jsdom": "29.7.0",
@@ -55,7 +55,7 @@
55
55
  "ts-jest": "29.4.11",
56
56
  "tsc-alias": "1.8.17",
57
57
  "typescript": "5.9.3",
58
- "vite": "7.3.3"
58
+ "vite": "7.3.5"
59
59
  },
60
60
  "peerDependencies": {
61
61
  "@apollo/client": ">=3.8.1",
@@ -74,7 +74,7 @@
74
74
  "@leav/utils": "1.15.0",
75
75
  "@uidotdev/usehooks": "2.4.1",
76
76
  "dayjs": "^1.11.13",
77
- "dompurify": "3.4.7",
77
+ "dompurify": "3.4.8",
78
78
  "html-react-parser": "4.2.10",
79
79
  "i18next-resources-to-backend": "1.2.1",
80
80
  "react-markdown": "5.0.3",