@leav/ui 1.13.0-6f2d667e → 1.13.0-b8abd53d
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/dist/components/Filters/_types.d.ts +8 -0
- package/dist/components/Filters/_types.js.map +1 -1
- package/dist/components/Filters/context/filtersReducer.js +22 -4
- package/dist/components/Filters/context/filtersReducer.js.map +1 -1
- package/dist/components/Filters/filter-items/CommonFilterItem.js +4 -1
- package/dist/components/Filters/filter-items/CommonFilterItem.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/FilterDropDown.js +15 -3
- package/dist/components/Filters/filter-items/filter-type/FilterDropDown.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/FilterDropdownContent.d.ts +3 -1
- package/dist/components/Filters/filter-items/filter-type/FilterDropdownContent.js +2 -2
- package/dist/components/Filters/filter-items/filter-type/FilterDropdownContent.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/_types.d.ts +3 -1
- package/dist/components/Filters/filter-items/filter-type/_types.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.js +39 -83
- package/dist/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/useGetTreeData.d.ts +1 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useGetTreeData.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.d.ts +21 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.js +85 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreeNodeSelection.js.map +1 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.d.ts +8 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.js +40 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreePermissions.js.map +1 -0
- package/dist/components/Filters/filter-items/filter-type/tree/useTreesSearch.d.ts +2 -3
- package/dist/components/Filters/filter-items/filter-type/tree/useTreesSearch.js +2 -3
- package/dist/components/Filters/filter-items/filter-type/tree/useTreesSearch.js.map +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.d.ts +1 -1
- package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.js +3 -4
- package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.js.map +1 -1
- package/dist/components/Filters/filter-items/shared/EmptyValueCheckbox.js +1 -7
- package/dist/components/Filters/filter-items/shared/EmptyValueCheckbox.js.map +1 -1
- package/dist/components/Filters/prepareFiltersForRequest.js +37 -14
- package/dist/components/Filters/prepareFiltersForRequest.js.map +1 -1
- package/dist/components/Filters/useFilters.d.ts +6 -0
- package/dist/locales/en/shared.json +2 -1
- package/dist/locales/fr/shared.json +2 -1
- package/package.json +1 -1
|
@@ -1,104 +1,62 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
|
|
3
3
|
// This file is released under LGPL V3
|
|
4
4
|
// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
5
|
-
import {
|
|
5
|
+
import { useEffect, useState } from 'react';
|
|
6
6
|
import styled from 'styled-components';
|
|
7
|
-
import {
|
|
7
|
+
import { KitLoader, KitSpace, KitTree } from 'aristid-ds';
|
|
8
8
|
import { useGetTreeData } from './useGetTreeData';
|
|
9
9
|
import { ErrorDisplay } from '../../../../../components/ErrorDisplay';
|
|
10
|
-
import { useSharedTranslation } from '../../../../../hooks/useSharedTranslation';
|
|
11
10
|
import { useTreesSearch } from './useTreesSearch';
|
|
12
11
|
import { useFiltersContext } from '../../../../../components/Filters/useFiltersContext';
|
|
13
12
|
import { EmptyValueCheckbox } from '../../shared/EmptyValueCheckbox';
|
|
14
13
|
import { SelectAllCheckbox } from '../../shared/SelectAllCheckbox';
|
|
15
|
-
import { buildFlattenTree } from './utils/buildFlattenTreeMap';
|
|
16
|
-
import { getSelectAllState } from './utils/getSelectAllState';
|
|
17
|
-
import { filterTreeByPermission } from './utils/filterTreeByPermission';
|
|
18
14
|
import { countSelectedTreeChildren } from './utils/countSelectedTreeChildren';
|
|
19
15
|
import { FilterTreeNodeTitle } from '../../shared/FilterTreeNodeTitle';
|
|
16
|
+
import { useTreePermissions } from './useTreePermissions';
|
|
17
|
+
import { useTreeNodeSelection } from './useTreeNodeSelection';
|
|
20
18
|
const ScrollableContent = styled.div `
|
|
21
|
-
max-height:
|
|
19
|
+
max-height: 348px; /* Equal to 10.5 nodes of KitTree */
|
|
22
20
|
overflow-y: auto;
|
|
23
21
|
overflow-x: hidden;
|
|
24
22
|
width: 100%;
|
|
25
23
|
`;
|
|
26
|
-
const FilteredTreeTitle = styled(KitTypography.Text) `
|
|
27
|
-
color: var(--general-colors-neutral-grey-500);
|
|
28
|
-
`;
|
|
29
|
-
const FilteredTreeSpacer = styled(KitSpace) `
|
|
30
|
-
width: 100%;
|
|
31
|
-
`;
|
|
32
24
|
const DropdownContentWrapper = styled(KitSpace) `
|
|
33
25
|
width: 327px;
|
|
34
26
|
justify-content: center;
|
|
35
27
|
`;
|
|
36
|
-
|
|
37
|
-
|
|
28
|
+
// Applies ghosted styling to tree nodes that have data-ghosted="true" on their title wrapper.
|
|
29
|
+
// Used to visually distinguish hidden-by-default nodes when the toggle is active.
|
|
30
|
+
const StyledKitTreeWithGhostedNodes = styled(KitTree) `
|
|
31
|
+
& .ant-tree-treenode:has(div[data-ghosted='true']) {
|
|
32
|
+
.ant-typography {
|
|
33
|
+
color: var(--general-colors-neutral-grey-500);
|
|
34
|
+
font-style: italic;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
export const TreeAttributeDropDown = ({ filter, onFilterChange, toggleHiddenRef, onPermissionConfiguredChange, }) => {
|
|
38
39
|
const { filtersData } = useFiltersContext();
|
|
39
40
|
const { treeData, isLoading, error } = useGetTreeData({
|
|
40
41
|
treeId: filter.attribute.linkedTree?.id ?? '',
|
|
41
42
|
attributeId: filter.attribute.id,
|
|
42
43
|
libraryId: filtersData.libraryId,
|
|
43
44
|
});
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
|
|
45
|
+
const includeHiddenOptions = filter.includeHiddenOptions ?? false;
|
|
46
|
+
const { displayTree, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured } = useTreePermissions(treeData, includeHiddenOptions);
|
|
47
|
+
const { selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll } = useTreeNodeSelection({
|
|
48
|
+
filter,
|
|
49
|
+
onFilterChange,
|
|
50
|
+
flattenTreeData,
|
|
51
|
+
flattenForSelectAll,
|
|
52
|
+
isAccessPermissionConfigured,
|
|
53
|
+
toggleHiddenRef,
|
|
54
|
+
});
|
|
55
|
+
const { filteredTree, expandedNodeIdsFromSearch, SearchInput } = useTreesSearch(displayTree);
|
|
48
56
|
const [expandedNodeIdsFromUser, setExpandedNodeIdsFromUser] = useState([]);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);
|
|
53
|
-
const flattenVisibleByDefaultTree = useMemo(() => buildFlattenTree(visibleByDefaultTree), [visibleByDefaultTree]);
|
|
54
|
-
const flattenHiddenByDefaultTree = useMemo(() => buildFlattenTree(hiddenByDefaultTree), [hiddenByDefaultTree]);
|
|
55
|
-
const _handleOnSelectEmptyValue = (selected) => {
|
|
56
|
-
onFilterChange({
|
|
57
|
-
...filter,
|
|
58
|
-
withEmptyValues: selected,
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
const _handleOnSelect = (node, selected) => {
|
|
62
|
-
let newSelectedIds;
|
|
63
|
-
if (selected) {
|
|
64
|
-
newSelectedIds = [...selectedNodesIds, node.id];
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
newSelectedIds = selectedNodesIds.filter(selectedValue => selectedValue !== node.id);
|
|
68
|
-
}
|
|
69
|
-
const selectedNodes = newSelectedIds
|
|
70
|
-
.map(nodeId => flattenTreeData.get(nodeId))
|
|
71
|
-
.filter((selectedNode) => Boolean(selectedNode));
|
|
72
|
-
onFilterChange({
|
|
73
|
-
...filter,
|
|
74
|
-
nodes: selectedNodes.map(selectedNode => ({ nodeId: selectedNode.id, libraryId: selectedNode.libraryId })),
|
|
75
|
-
value: selectedNodes.map(selectedNode => selectedNode.recordId),
|
|
76
|
-
formattedValue: selectedNodes.map(selectedNode => selectedNode.title),
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
const _handleOnSelectAll = (treeToSelect, isSelected) => {
|
|
80
|
-
const treeNodeIds = Array.from(treeToSelect.keys());
|
|
81
|
-
// Using Set to avoid duplicates
|
|
82
|
-
const newSelectedIds = isSelected
|
|
83
|
-
? [...new Set([...selectedNodesIds, ...treeNodeIds])]
|
|
84
|
-
: selectedNodesIds.filter(id => !treeNodeIds.includes(id));
|
|
85
|
-
const selectedNodes = newSelectedIds
|
|
86
|
-
.map(nodeId => flattenTreeData.get(nodeId))
|
|
87
|
-
.filter((selectedNode) => Boolean(selectedNode));
|
|
88
|
-
onFilterChange({
|
|
89
|
-
...filter,
|
|
90
|
-
nodes: selectedNodes.map(selectedNode => ({
|
|
91
|
-
nodeId: selectedNode.id,
|
|
92
|
-
libraryId: selectedNode.libraryId,
|
|
93
|
-
})),
|
|
94
|
-
value: selectedNodes.map(selectedNode => selectedNode.recordId),
|
|
95
|
-
formattedValue: selectedNodes.map(selectedNode => selectedNode.title),
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
const _handleOnSelectAllVisibleByDefault = (isSelected) => _handleOnSelectAll(flattenVisibleByDefaultTree, isSelected);
|
|
99
|
-
const _handleOnSelectAllHiddenByDefault = (isSelected) => _handleOnSelectAll(flattenHiddenByDefaultTree, isSelected);
|
|
100
|
-
const { allSelected: allVisibleSelected, indeterminate: visibleIndeterminate } = getSelectAllState(selectedNodesIds, flattenVisibleByDefaultTree);
|
|
101
|
-
const { allSelected: allHiddenSelected, indeterminate: hiddenIndeterminate } = getSelectAllState(selectedNodesIds, flattenHiddenByDefaultTree);
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
onPermissionConfiguredChange?.(isAccessPermissionConfigured);
|
|
59
|
+
}, [isAccessPermissionConfigured, onPermissionConfiguredChange]);
|
|
102
60
|
const treeCommonProps = {
|
|
103
61
|
selectedKeys: selectedNodesIds,
|
|
104
62
|
checkedKeys: selectedNodesIds,
|
|
@@ -109,23 +67,23 @@ export const TreeAttributeDropDown = ({ filter, onFilterChange, }) => {
|
|
|
109
67
|
multiple: true,
|
|
110
68
|
titleRender(node) {
|
|
111
69
|
const nodeData = node;
|
|
112
|
-
// TODO: countSelectedTreeChildren is computed here because the tree
|
|
113
|
-
//
|
|
114
|
-
//
|
|
115
|
-
// moved closer to the data fetching (e.g. in _toTreeNode in useGetTreeData).
|
|
70
|
+
// TODO: countSelectedTreeChildren is computed here because the tree may contain
|
|
71
|
+
// disabled-checkbox parents whose children are in a different permission group.
|
|
72
|
+
// This ensures the count reflects the actual selected descendants regardless of splitting.
|
|
116
73
|
const selectedChildrenCount = countSelectedTreeChildren(nodeData, selectedNodesIds);
|
|
117
|
-
|
|
74
|
+
const isHiddenByDefault = includeHiddenOptions && nodeData.accessRecordByDefaultPermission === false;
|
|
75
|
+
return (_jsx(FilterTreeNodeTitle, { title: nodeData.title, count: selectedChildrenCount > 0 ? selectedChildrenCount : undefined, ghosted: isHiddenByDefault }));
|
|
118
76
|
},
|
|
119
77
|
onExpand: expandedKeys => {
|
|
120
78
|
setExpandedNodeIdsFromUser(expandedKeys);
|
|
121
79
|
},
|
|
122
80
|
onCheck: (_, info) => {
|
|
123
81
|
const node = info.node;
|
|
124
|
-
|
|
82
|
+
handleOnSelect(node, info.checked);
|
|
125
83
|
},
|
|
126
84
|
onSelect: (_, info) => {
|
|
127
85
|
const node = info.node;
|
|
128
|
-
|
|
86
|
+
handleOnSelect(node, info.selected);
|
|
129
87
|
},
|
|
130
88
|
};
|
|
131
89
|
if (isLoading) {
|
|
@@ -134,8 +92,6 @@ export const TreeAttributeDropDown = ({ filter, onFilterChange, }) => {
|
|
|
134
92
|
if (error) {
|
|
135
93
|
return (_jsx(DropdownContentWrapper, { children: _jsx(ErrorDisplay, { message: error.message }) }));
|
|
136
94
|
}
|
|
137
|
-
return (_jsxs(DropdownContentWrapper, { direction: "vertical", size: "xs", children: [SearchInput,
|
|
138
|
-
? _handleOnSelectAllVisibleByDefault
|
|
139
|
-
: _handleOnSelectAllHiddenByDefault }), _jsx(KitTree, { treeData: visibleByDefaultTree.length > 0 ? filteredVisibleByDefaultTree : filteredHiddenByDefaultTree, ...treeCommonProps })] }))] }));
|
|
95
|
+
return (_jsxs(DropdownContentWrapper, { direction: "vertical", size: "xs", children: [SearchInput, _jsxs(ScrollableContent, { children: [_jsx(EmptyValueCheckbox, { onSelect: handleOnSelectEmptyValue, filter: filter }), _jsx(SelectAllCheckbox, { checked: allSelected, indeterminate: indeterminate, onChange: checked => handleOnSelectAll(flattenForSelectAll, checked) }), _jsx(StyledKitTreeWithGhostedNodes, { treeData: filteredTree, ...treeCommonProps })] })] }));
|
|
140
96
|
};
|
|
141
97
|
//# sourceMappingURL=TreeAttributeDropDown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeAttributeDropDown.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type ComponentProps, type FunctionComponent, type Key, useMemo, useState} from 'react';\nimport {type IFilterChildrenTreeDropDownProps} from '../_types';\nimport styled from 'styled-components';\nimport {KitDivider, KitLoader, KitSpace, KitTree, KitTypography} from 'aristid-ds';\nimport {type EventDataNode} from 'antd/lib/tree';\nimport {type ITreeNode, useGetTreeData} from './useGetTreeData';\nimport {ErrorDisplay} from '_ui/components/ErrorDisplay';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {useTreesSearch} from './useTreesSearch';\nimport {useFiltersContext} from '_ui/components/Filters/useFiltersContext';\nimport {EmptyValueCheckbox} from '../../shared/EmptyValueCheckbox';\nimport {SelectAllCheckbox} from '../../shared/SelectAllCheckbox';\nimport {buildFlattenTree} from './utils/buildFlattenTreeMap';\nimport {getSelectAllState} from './utils/getSelectAllState';\nimport {filterTreeByPermission} from './utils/filterTreeByPermission';\nimport {countSelectedTreeChildren} from './utils/countSelectedTreeChildren';\nimport {FilterTreeNodeTitle} from '../../shared/FilterTreeNodeTitle';\n\nconst ScrollableContent = styled.div`\n max-height: 182px; /* Equal to 5.5 nodes of KitTree */\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n`;\n\nconst FilteredTreeTitle = styled(KitTypography.Text)`\n color: var(--general-colors-neutral-grey-500);\n`;\n\nconst FilteredTreeSpacer = styled(KitSpace)`\n width: 100%;\n`;\n\nconst DropdownContentWrapper = styled(KitSpace)`\n width: 327px;\n justify-content: center;\n`;\n\nexport const TreeAttributeDropDown: FunctionComponent<IFilterChildrenTreeDropDownProps> = ({\n filter,\n onFilterChange,\n}) => {\n const {t} = useSharedTranslation();\n const {filtersData} = useFiltersContext();\n const {treeData, isLoading, error} = useGetTreeData({\n treeId: filter.attribute.linkedTree?.id ?? '',\n attributeId: filter.attribute.id,\n libraryId: filtersData.libraryId,\n });\n\n // Split treeData based on accessRecordByDefaultPermission\n const visibleByDefaultTree = useMemo(() => filterTreeByPermission(treeData, true), [treeData]);\n const hiddenByDefaultTree = useMemo(() => filterTreeByPermission(treeData, false), [treeData]);\n\n const {filteredVisibleByDefaultTree, filteredHiddenByDefaultTree, expandedNodeIdsFromSearch, SearchInput} =\n useTreesSearch(visibleByDefaultTree, hiddenByDefaultTree);\n\n const [expandedNodeIdsFromUser, setExpandedNodeIdsFromUser] = useState<Key[]>([]);\n\n const selectedNodesIds = (filter.nodes ?? []).map(node => node.nodeId);\n const areBothTreesFilled = visibleByDefaultTree.length > 0 && hiddenByDefaultTree.length > 0;\n\n // Build flatten trees to optimize the search and selection of nodes in handling functions\n const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);\n const flattenVisibleByDefaultTree = useMemo(() => buildFlattenTree(visibleByDefaultTree), [visibleByDefaultTree]);\n const flattenHiddenByDefaultTree = useMemo(() => buildFlattenTree(hiddenByDefaultTree), [hiddenByDefaultTree]);\n\n const _handleOnSelectEmptyValue = (selected: boolean) => {\n onFilterChange({\n ...filter,\n withEmptyValues: selected,\n });\n };\n\n const _handleOnSelect = (node: ITreeNode, selected: boolean) => {\n let newSelectedIds: string[];\n\n if (selected) {\n newSelectedIds = [...selectedNodesIds, node.id];\n } else {\n newSelectedIds = selectedNodesIds.filter(selectedValue => selectedValue !== node.id);\n }\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((selectedNode): selectedNode is ITreeNode => Boolean(selectedNode));\n\n onFilterChange({\n ...filter,\n nodes: selectedNodes.map(selectedNode => ({nodeId: selectedNode.id, libraryId: selectedNode.libraryId})),\n value: selectedNodes.map(selectedNode => selectedNode.recordId),\n formattedValue: selectedNodes.map(selectedNode => selectedNode.title),\n });\n };\n\n const _handleOnSelectAll = (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => {\n const treeNodeIds = Array.from(treeToSelect.keys());\n\n // Using Set to avoid duplicates\n const newSelectedIds = isSelected\n ? [...new Set([...selectedNodesIds, ...treeNodeIds])]\n : selectedNodesIds.filter(id => !treeNodeIds.includes(id));\n\n const selectedNodes = newSelectedIds\n .map(nodeId => flattenTreeData.get(nodeId))\n .filter((selectedNode): selectedNode is ITreeNode => Boolean(selectedNode));\n\n onFilterChange({\n ...filter,\n nodes: selectedNodes.map(selectedNode => ({\n nodeId: selectedNode.id,\n libraryId: selectedNode.libraryId,\n })),\n value: selectedNodes.map(selectedNode => selectedNode.recordId),\n formattedValue: selectedNodes.map(selectedNode => selectedNode.title),\n });\n };\n\n const _handleOnSelectAllVisibleByDefault = (isSelected: boolean) =>\n _handleOnSelectAll(flattenVisibleByDefaultTree, isSelected);\n\n const _handleOnSelectAllHiddenByDefault = (isSelected: boolean) =>\n _handleOnSelectAll(flattenHiddenByDefaultTree, isSelected);\n\n const {allSelected: allVisibleSelected, indeterminate: visibleIndeterminate} = getSelectAllState(\n selectedNodesIds,\n flattenVisibleByDefaultTree,\n );\n\n const {allSelected: allHiddenSelected, indeterminate: hiddenIndeterminate} = getSelectAllState(\n selectedNodesIds,\n flattenHiddenByDefaultTree,\n );\n\n const treeCommonProps: ComponentProps<typeof KitTree> = {\n selectedKeys: selectedNodesIds,\n checkedKeys: selectedNodesIds,\n defaultExpandedKeys: selectedNodesIds,\n expandedKeys: [...expandedNodeIdsFromUser, ...expandedNodeIdsFromSearch],\n checkable: true,\n checkStrictly: true,\n multiple: true,\n titleRender(node) {\n const nodeData = node as EventDataNode<ITreeNode>;\n\n // TODO: countSelectedTreeChildren is computed here because the tree is split into two sub-trees\n // (visibleByDefaultTree / hiddenByDefaultTree) which reshapes the `children` field.\n // Once the dual-tree is removed and a single tree is used, this calculation can be\n // moved closer to the data fetching (e.g. in _toTreeNode in useGetTreeData).\n const selectedChildrenCount = countSelectedTreeChildren(nodeData, selectedNodesIds);\n\n return (\n <FilterTreeNodeTitle\n title={nodeData.title}\n count={selectedChildrenCount > 0 ? selectedChildrenCount : undefined}\n />\n );\n },\n onExpand: expandedKeys => {\n setExpandedNodeIdsFromUser(expandedKeys);\n },\n onCheck: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n _handleOnSelect(node, info.checked);\n },\n onSelect: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n _handleOnSelect(node, info.selected);\n },\n };\n\n if (isLoading) {\n return (\n <DropdownContentWrapper>\n <KitLoader />\n </DropdownContentWrapper>\n );\n }\n\n if (error) {\n return (\n <DropdownContentWrapper>\n <ErrorDisplay message={error.message} />\n </DropdownContentWrapper>\n );\n }\n\n return (\n <DropdownContentWrapper direction=\"vertical\" size=\"xs\">\n {SearchInput}\n {areBothTreesFilled ? (\n <>\n <EmptyValueCheckbox onSelect={_handleOnSelectEmptyValue} filter={filter} />\n <FilteredTreeSpacer direction=\"vertical\" size=\"xxs\">\n <FilteredTreeTitle size=\"fontSize5\" weight=\"medium\">\n {t('filters.visible-by-default')}\n </FilteredTreeTitle>\n <ScrollableContent>\n <SelectAllCheckbox\n checked={allVisibleSelected}\n indeterminate={visibleIndeterminate}\n onChange={_handleOnSelectAllVisibleByDefault}\n />\n <KitTree treeData={filteredVisibleByDefaultTree} {...treeCommonProps} />\n </ScrollableContent>\n </FilteredTreeSpacer>\n <KitDivider noMargin />\n <FilteredTreeSpacer direction=\"vertical\" size=\"xxs\">\n <FilteredTreeTitle size=\"fontSize5\" weight=\"medium\">\n {t('filters.hidden-by-default')}\n </FilteredTreeTitle>\n <ScrollableContent>\n <SelectAllCheckbox\n checked={allHiddenSelected}\n indeterminate={hiddenIndeterminate}\n onChange={_handleOnSelectAllHiddenByDefault}\n />\n <KitTree treeData={filteredHiddenByDefaultTree} {...treeCommonProps} />\n </ScrollableContent>\n </FilteredTreeSpacer>\n </>\n ) : (\n <ScrollableContent>\n <EmptyValueCheckbox onSelect={_handleOnSelectEmptyValue} filter={filter} />\n <SelectAllCheckbox\n checked={visibleByDefaultTree.length > 0 ? allVisibleSelected : allHiddenSelected}\n indeterminate={visibleByDefaultTree.length > 0 ? visibleIndeterminate : hiddenIndeterminate}\n onChange={\n visibleByDefaultTree.length > 0\n ? _handleOnSelectAllVisibleByDefault\n : _handleOnSelectAllHiddenByDefault\n }\n />\n <KitTree\n treeData={\n visibleByDefaultTree.length > 0 ? filteredVisibleByDefaultTree : filteredHiddenByDefaultTree\n }\n {...treeCommonProps}\n />\n </ScrollableContent>\n )}\n </DropdownContentWrapper>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"TreeAttributeDropDown.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/TreeAttributeDropDown.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type ComponentProps, type FunctionComponent, type Key, useEffect, useState} from 'react';\nimport {type IFilterChildrenTreeDropDownProps} from '../_types';\nimport styled from 'styled-components';\nimport {KitLoader, KitSpace, KitTree} from 'aristid-ds';\nimport {type EventDataNode} from 'antd/lib/tree';\nimport {type ITreeNode, useGetTreeData} from './useGetTreeData';\nimport {ErrorDisplay} from '_ui/components/ErrorDisplay';\nimport {useTreesSearch} from './useTreesSearch';\nimport {useFiltersContext} from '_ui/components/Filters/useFiltersContext';\nimport {EmptyValueCheckbox} from '../../shared/EmptyValueCheckbox';\nimport {SelectAllCheckbox} from '../../shared/SelectAllCheckbox';\nimport {countSelectedTreeChildren} from './utils/countSelectedTreeChildren';\nimport {FilterTreeNodeTitle} from '../../shared/FilterTreeNodeTitle';\nimport {useTreePermissions} from './useTreePermissions';\nimport {useTreeNodeSelection} from './useTreeNodeSelection';\n\nconst ScrollableContent = styled.div`\n max-height: 348px; /* Equal to 10.5 nodes of KitTree */\n overflow-y: auto;\n overflow-x: hidden;\n width: 100%;\n`;\n\nconst DropdownContentWrapper = styled(KitSpace)`\n width: 327px;\n justify-content: center;\n`;\n\n// Applies ghosted styling to tree nodes that have data-ghosted=\"true\" on their title wrapper.\n// Used to visually distinguish hidden-by-default nodes when the toggle is active.\nconst StyledKitTreeWithGhostedNodes = styled(KitTree)`\n & .ant-tree-treenode:has(div[data-ghosted='true']) {\n .ant-typography {\n color: var(--general-colors-neutral-grey-500);\n font-style: italic;\n }\n }\n`;\n\nexport const TreeAttributeDropDown: FunctionComponent<IFilterChildrenTreeDropDownProps> = ({\n filter,\n onFilterChange,\n toggleHiddenRef,\n onPermissionConfiguredChange,\n}) => {\n const {filtersData} = useFiltersContext();\n\n const {treeData, isLoading, error} = useGetTreeData({\n treeId: filter.attribute.linkedTree?.id ?? '',\n attributeId: filter.attribute.id,\n libraryId: filtersData.libraryId,\n });\n\n const includeHiddenOptions = filter.includeHiddenOptions ?? false;\n\n const {displayTree, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured} = useTreePermissions(\n treeData,\n includeHiddenOptions,\n );\n\n const {selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll} =\n useTreeNodeSelection({\n filter,\n onFilterChange,\n flattenTreeData,\n flattenForSelectAll,\n isAccessPermissionConfigured,\n toggleHiddenRef,\n });\n\n const {filteredTree, expandedNodeIdsFromSearch, SearchInput} = useTreesSearch(displayTree);\n\n const [expandedNodeIdsFromUser, setExpandedNodeIdsFromUser] = useState<Key[]>([]);\n\n useEffect(() => {\n onPermissionConfiguredChange?.(isAccessPermissionConfigured);\n }, [isAccessPermissionConfigured, onPermissionConfiguredChange]);\n\n const treeCommonProps: ComponentProps<typeof StyledKitTreeWithGhostedNodes> = {\n selectedKeys: selectedNodesIds,\n checkedKeys: selectedNodesIds,\n defaultExpandedKeys: selectedNodesIds,\n expandedKeys: [...expandedNodeIdsFromUser, ...expandedNodeIdsFromSearch],\n checkable: true,\n checkStrictly: true,\n multiple: true,\n titleRender(node) {\n const nodeData = node as EventDataNode<ITreeNode>;\n\n // TODO: countSelectedTreeChildren is computed here because the tree may contain\n // disabled-checkbox parents whose children are in a different permission group.\n // This ensures the count reflects the actual selected descendants regardless of splitting.\n const selectedChildrenCount = countSelectedTreeChildren(nodeData, selectedNodesIds);\n const isHiddenByDefault = includeHiddenOptions && nodeData.accessRecordByDefaultPermission === false;\n\n return (\n <FilterTreeNodeTitle\n title={nodeData.title}\n count={selectedChildrenCount > 0 ? selectedChildrenCount : undefined}\n ghosted={isHiddenByDefault}\n />\n );\n },\n onExpand: expandedKeys => {\n setExpandedNodeIdsFromUser(expandedKeys);\n },\n onCheck: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n handleOnSelect(node, info.checked);\n },\n onSelect: (_, info) => {\n const node = info.node as EventDataNode<ITreeNode>;\n handleOnSelect(node, info.selected);\n },\n };\n\n if (isLoading) {\n return (\n <DropdownContentWrapper>\n <KitLoader />\n </DropdownContentWrapper>\n );\n }\n\n if (error) {\n return (\n <DropdownContentWrapper>\n <ErrorDisplay message={error.message} />\n </DropdownContentWrapper>\n );\n }\n\n return (\n <DropdownContentWrapper direction=\"vertical\" size=\"xs\">\n {SearchInput}\n <ScrollableContent>\n <EmptyValueCheckbox onSelect={handleOnSelectEmptyValue} filter={filter} />\n <SelectAllCheckbox\n checked={allSelected}\n indeterminate={indeterminate}\n onChange={checked => handleOnSelectAll(flattenForSelectAll, checked)}\n />\n <StyledKitTreeWithGhostedNodes treeData={filteredTree} {...treeCommonProps} />\n </ScrollableContent>\n </DropdownContentWrapper>\n );\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetTreeData.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useGetTreeData.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"useGetTreeData.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useGetTreeData.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAC,mBAAmB,EAAC,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAmB5C,MAAM,WAAW,GAAG,CAChB,IAEC,EACQ,EAAE,CAAC,CAAC;IACb,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;IACxD,EAAE,EAAE,IAAI,CAAC,EAAE;IACX,GAAG,EAAE,IAAI,CAAC,EAAE;IACZ,QAAQ,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC;IAChD,+BAA+B,EAAE,IAAI,CAAC,+BAA+B,IAAI,SAAS;IAClF,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;IACxC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAuB,EAAE,EAAE;IACrF,MAAM,CAAC,kBAAkB,CAAC,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAEjE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAc,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,WAAW,CAAC,EAAE,CAAC,CAAC;YAChB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YACxB,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,CAAC;gBACD,MAAM,EAAC,IAAI,EAAC,GAAG,MAAM,kBAAkB,CAAC;oBACpC,SAAS,EAAE;wBACP,MAAM;wBACN,+BAA+B,EAAE;4BAC7B,WAAW;4BACX,SAAS;yBACZ;qBACJ;iBACJ,CAAC,CAAC;gBAEH,WAAW,CAAC,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC5E,CAAC;oBAAS,CAAC;gBACP,YAAY,CAAC,KAAK,CAAC,CAAC;YACxB,CAAC;QACL,CAAC,CAAC;QAEF,QAAQ,EAAE,CAAC;IACf,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;IAErC,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC;AACxC,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {useEffect, useState} from 'react';\nimport {type FilterTreeDataQueryQuery} from '_ui/_gqlTypes';\nimport {filterTreeDataQuery} from './_queries/filterTreeDataQuery';\nimport {useLazyQuery} from '@apollo/client';\n\nexport interface ITreeNode {\n title: string;\n id: string;\n key: string;\n children: ITreeNode[];\n accessRecordByDefaultPermission?: boolean;\n libraryId: string;\n recordId: string;\n disableCheckbox?: boolean;\n}\n\ninterface IUseGetTreeDataProps {\n treeId: string;\n attributeId: string;\n libraryId: string;\n}\n\nconst _toTreeNode = (\n node: FilterTreeDataQueryQuery['treeContent'][number] & {\n children?: Array<FilterTreeDataQueryQuery['treeContent'][number]>;\n },\n): ITreeNode => ({\n title: node.record.whoAmI.label ?? node.record.whoAmI.id,\n id: node.id,\n key: node.id,\n children: (node.children ?? []).map(_toTreeNode),\n accessRecordByDefaultPermission: node.accessRecordByDefaultPermission ?? undefined,\n libraryId: node.record.whoAmI.library.id,\n recordId: node.record.id,\n});\n\nexport const useGetTreeData = ({treeId, attributeId, libraryId}: IUseGetTreeDataProps) => {\n const [loadFilterTreeData] = useLazyQuery(filterTreeDataQuery());\n\n const [treeData, setTreeData] = useState<ITreeNode[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n if (!treeId) {\n setTreeData([]);\n setIsLoading(false);\n return;\n }\n\n const loadTree = async () => {\n setIsLoading(true);\n setError(null);\n try {\n const {data} = await loadFilterTreeData({\n variables: {\n treeId,\n accessRecordByDefaultPermission: {\n attributeId,\n libraryId,\n },\n },\n });\n\n setTreeData((data?.treeContent ?? []).map(node => _toTreeNode(node)));\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Failed to load tree'));\n } finally {\n setIsLoading(false);\n }\n };\n\n loadTree();\n }, [treeId, attributeId, libraryId]);\n\n return {treeData, isLoading, error};\n};\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type MutableRefObject } from 'react';
|
|
2
|
+
import { type IUIFilterTree } from '../../../../../components/Filters/_types';
|
|
3
|
+
import { type ITreeNode } from './useGetTreeData';
|
|
4
|
+
interface IUseTreeNodeSelectionParams {
|
|
5
|
+
filter: IUIFilterTree;
|
|
6
|
+
onFilterChange: (filterData: IUIFilterTree) => void;
|
|
7
|
+
flattenTreeData: Map<string, ITreeNode>;
|
|
8
|
+
flattenForSelectAll: Map<string, ITreeNode>;
|
|
9
|
+
isAccessPermissionConfigured: boolean;
|
|
10
|
+
toggleHiddenRef?: MutableRefObject<((checked: boolean) => void) | null>;
|
|
11
|
+
}
|
|
12
|
+
export interface ITreeNodeSelection {
|
|
13
|
+
selectedNodesIds: string[];
|
|
14
|
+
allSelected: boolean;
|
|
15
|
+
indeterminate: boolean;
|
|
16
|
+
handleOnSelectEmptyValue: (selected: boolean) => void;
|
|
17
|
+
handleOnSelect: (node: ITreeNode, selected: boolean) => void;
|
|
18
|
+
handleOnSelectAll: (treeToSelect: Map<string, ITreeNode>, isSelected: boolean) => void;
|
|
19
|
+
}
|
|
20
|
+
export declare const useTreeNodeSelection: ({ filter, onFilterChange, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured, toggleHiddenRef, }: IUseTreeNodeSelectionParams) => ITreeNodeSelection;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { getSelectAllState } from './utils/getSelectAllState';
|
|
2
|
+
export const useTreeNodeSelection = ({ filter, onFilterChange, flattenTreeData, flattenForSelectAll, isAccessPermissionConfigured, toggleHiddenRef, }) => {
|
|
3
|
+
const selectedNodesIds = (filter.userNodes ?? []).map(node => node.nodeId);
|
|
4
|
+
const { allSelected, indeterminate } = getSelectAllState(selectedNodesIds, flattenForSelectAll);
|
|
5
|
+
const handleOnSelectEmptyValue = (selected) => {
|
|
6
|
+
onFilterChange({ ...filter, withEmptyValues: selected });
|
|
7
|
+
};
|
|
8
|
+
const handleOnSelect = (node, selected) => {
|
|
9
|
+
const newSelectedIds = selected
|
|
10
|
+
? [...selectedNodesIds, node.id]
|
|
11
|
+
: selectedNodesIds.filter(id => id !== node.id);
|
|
12
|
+
const selectedNodes = newSelectedIds
|
|
13
|
+
.map(nodeId => flattenTreeData.get(nodeId))
|
|
14
|
+
.filter((n) => Boolean(n));
|
|
15
|
+
const mappedNodes = selectedNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId }));
|
|
16
|
+
onFilterChange({
|
|
17
|
+
...filter,
|
|
18
|
+
nodes: mappedNodes,
|
|
19
|
+
value: selectedNodes.map(n => n.recordId),
|
|
20
|
+
userNodes: mappedNodes,
|
|
21
|
+
userFormattedValue: selectedNodes.map(n => n.title),
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
const handleOnSelectAll = (treeToSelect, isSelected) => {
|
|
25
|
+
const newSelectedIds = isSelected
|
|
26
|
+
? [...new Set([...selectedNodesIds, ...treeToSelect.keys()])]
|
|
27
|
+
: selectedNodesIds.filter(id => !treeToSelect.has(id));
|
|
28
|
+
const selectedNodes = newSelectedIds
|
|
29
|
+
.map(nodeId => flattenTreeData.get(nodeId))
|
|
30
|
+
.filter((n) => Boolean(n));
|
|
31
|
+
const mappedNodes = selectedNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId }));
|
|
32
|
+
onFilterChange({
|
|
33
|
+
...filter,
|
|
34
|
+
nodes: mappedNodes,
|
|
35
|
+
value: selectedNodes.map(n => n.recordId),
|
|
36
|
+
userNodes: mappedNodes,
|
|
37
|
+
userFormattedValue: selectedNodes.map(n => n.title),
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const handleToggle = (checked) => {
|
|
41
|
+
if (filter.userNodes != null) {
|
|
42
|
+
// Has user selection: on toggle off, drop hidden selections from user selection.
|
|
43
|
+
if (!checked) {
|
|
44
|
+
const keptNodes = filter.userNodes
|
|
45
|
+
.map(n => flattenTreeData.get(n.nodeId))
|
|
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
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
onFilterChange({ ...filter, includeHiddenOptions: true });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// No user selection: update the network values (value/nodes) to reflect all currently
|
|
64
|
+
// visible nodes, without creating a UI selection (userNodes stays null).
|
|
65
|
+
// Toggle ON → all nodes (flattenTreeData contains hidden nodes too).
|
|
66
|
+
// Toggle OFF → only nodes with explicit access (accessRecordByDefaultPermission === true).
|
|
67
|
+
const networkNodes = checked
|
|
68
|
+
? [...flattenTreeData.values()]
|
|
69
|
+
: [...flattenTreeData.values()].filter(node => node.accessRecordByDefaultPermission === true);
|
|
70
|
+
onFilterChange({
|
|
71
|
+
...filter,
|
|
72
|
+
includeHiddenOptions: checked,
|
|
73
|
+
nodes: networkNodes.map(n => ({ nodeId: n.id, libraryId: n.libraryId })),
|
|
74
|
+
value: networkNodes.map(n => n.recordId),
|
|
75
|
+
formattedValue: networkNodes.map(n => n.title),
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
// Expose the toggle handler to FilterDropDown via ref (updated every render to stay current)
|
|
80
|
+
if (toggleHiddenRef) {
|
|
81
|
+
toggleHiddenRef.current = isAccessPermissionConfigured ? handleToggle : null;
|
|
82
|
+
}
|
|
83
|
+
return { selectedNodesIds, allSelected, indeterminate, handleOnSelectEmptyValue, handleOnSelect, handleOnSelectAll };
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=useTreeNodeSelection.js.map
|
|
@@ -0,0 +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":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {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"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type ITreeNode } from './useGetTreeData';
|
|
2
|
+
export interface ITreePermissions {
|
|
3
|
+
displayTree: ITreeNode[];
|
|
4
|
+
flattenTreeData: Map<string, ITreeNode>;
|
|
5
|
+
flattenForSelectAll: Map<string, ITreeNode>;
|
|
6
|
+
isAccessPermissionConfigured: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare const useTreePermissions: (treeData: ITreeNode[], includeHiddenOptions: boolean) => ITreePermissions;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06
|
|
2
|
+
// This file is released under LGPL V3
|
|
3
|
+
// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
4
|
+
import { useMemo } from 'react';
|
|
5
|
+
import { buildFlattenTree } from './utils/buildFlattenTreeMap';
|
|
6
|
+
import { filterTreeByPermission } from './utils/filterTreeByPermission';
|
|
7
|
+
const markDisabledParents = (nodes) => nodes.map(node => ({
|
|
8
|
+
...node,
|
|
9
|
+
disableCheckbox: node.accessRecordByDefaultPermission === false,
|
|
10
|
+
children: markDisabledParents(node.children),
|
|
11
|
+
}));
|
|
12
|
+
export const useTreePermissions = (treeData, includeHiddenOptions) => {
|
|
13
|
+
// visibleOnlyTree: nodes with accessRecordByDefaultPermission === true,
|
|
14
|
+
// plus structural parents (=== false or undefined) that have === true descendants.
|
|
15
|
+
const visibleOnlyTree = useMemo(() => filterTreeByPermission(treeData), [treeData]);
|
|
16
|
+
const visibleOnlyTreeWithDisabledParents = useMemo(() => markDisabledParents(visibleOnlyTree), [visibleOnlyTree]);
|
|
17
|
+
const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);
|
|
18
|
+
// Only === true nodes are selectable; other are excluded.
|
|
19
|
+
const flattenSelectableVisibleTree = useMemo(() => {
|
|
20
|
+
const map = buildFlattenTree(visibleOnlyTree);
|
|
21
|
+
map.forEach((node, id) => {
|
|
22
|
+
if (!node.accessRecordByDefaultPermission) {
|
|
23
|
+
map.delete(id);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return map;
|
|
27
|
+
}, [visibleOnlyTree]);
|
|
28
|
+
// Active only when at least one node is explicitly visible (=== true).
|
|
29
|
+
// When all permissions are undefined, the feature is inactive and the full tree is shown.
|
|
30
|
+
const isAccessPermissionConfigured = useMemo(() => Array.from(flattenTreeData.values()).some(node => node.accessRecordByDefaultPermission === true), [flattenTreeData]);
|
|
31
|
+
const displayTree = isAccessPermissionConfigured && !includeHiddenOptions ? visibleOnlyTreeWithDisabledParents : treeData;
|
|
32
|
+
const flattenForSelectAll = isAccessPermissionConfigured && !includeHiddenOptions ? flattenSelectableVisibleTree : flattenTreeData;
|
|
33
|
+
return {
|
|
34
|
+
displayTree,
|
|
35
|
+
flattenTreeData,
|
|
36
|
+
flattenForSelectAll,
|
|
37
|
+
isAccessPermissionConfigured,
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=useTreePermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreePermissions.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useTreePermissions.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAC,sBAAsB,EAAC,MAAM,gCAAgC,CAAC;AAEtE,MAAM,mBAAmB,GAAG,CAAC,KAAkB,EAAe,EAAE,CAC5D,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,GAAG,IAAI;IACP,eAAe,EAAE,IAAI,CAAC,+BAA+B,KAAK,KAAK;IAC/D,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC;CAC/C,CAAC,CAAC,CAAC;AASR,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAqB,EAAE,oBAA6B,EAAoB,EAAE;IACzG,wEAAwE;IACxE,mFAAmF;IACnF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpF,MAAM,kCAAkC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAElH,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE9E,0DAA0D;IAC1D,MAAM,4BAA4B,GAAG,OAAO,CAAC,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;QAC9C,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC;gBACxC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnB,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACf,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,uEAAuE;IACvE,0FAA0F;IAC1F,MAAM,4BAA4B,GAAG,OAAO,CACxC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,+BAA+B,KAAK,IAAI,CAAC,EACtG,CAAC,eAAe,CAAC,CACpB,CAAC;IAEF,MAAM,WAAW,GACb,4BAA4B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE1G,MAAM,mBAAmB,GACrB,4BAA4B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,eAAe,CAAC;IAE3G,OAAO;QACH,WAAW;QACX,eAAe;QACf,mBAAmB;QACnB,4BAA4B;KAC/B,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {useMemo} from 'react';\nimport {type ITreeNode} from './useGetTreeData';\nimport {buildFlattenTree} from './utils/buildFlattenTreeMap';\nimport {filterTreeByPermission} from './utils/filterTreeByPermission';\n\nconst markDisabledParents = (nodes: ITreeNode[]): ITreeNode[] =>\n nodes.map(node => ({\n ...node,\n disableCheckbox: node.accessRecordByDefaultPermission === false,\n children: markDisabledParents(node.children),\n }));\n\nexport interface ITreePermissions {\n displayTree: ITreeNode[];\n flattenTreeData: Map<string, ITreeNode>;\n flattenForSelectAll: Map<string, ITreeNode>;\n isAccessPermissionConfigured: boolean;\n}\n\nexport const useTreePermissions = (treeData: ITreeNode[], includeHiddenOptions: boolean): ITreePermissions => {\n // visibleOnlyTree: nodes with accessRecordByDefaultPermission === true,\n // plus structural parents (=== false or undefined) that have === true descendants.\n const visibleOnlyTree = useMemo(() => filterTreeByPermission(treeData), [treeData]);\n\n const visibleOnlyTreeWithDisabledParents = useMemo(() => markDisabledParents(visibleOnlyTree), [visibleOnlyTree]);\n\n const flattenTreeData = useMemo(() => buildFlattenTree(treeData), [treeData]);\n\n // Only === true nodes are selectable; other are excluded.\n const flattenSelectableVisibleTree = useMemo(() => {\n const map = buildFlattenTree(visibleOnlyTree);\n map.forEach((node, id) => {\n if (!node.accessRecordByDefaultPermission) {\n map.delete(id);\n }\n });\n return map;\n }, [visibleOnlyTree]);\n\n // Active only when at least one node is explicitly visible (=== true).\n // When all permissions are undefined, the feature is inactive and the full tree is shown.\n const isAccessPermissionConfigured = useMemo(\n () => Array.from(flattenTreeData.values()).some(node => node.accessRecordByDefaultPermission === true),\n [flattenTreeData],\n );\n\n const displayTree =\n isAccessPermissionConfigured && !includeHiddenOptions ? visibleOnlyTreeWithDisabledParents : treeData;\n\n const flattenForSelectAll =\n isAccessPermissionConfigured && !includeHiddenOptions ? flattenSelectableVisibleTree : flattenTreeData;\n\n return {\n displayTree,\n flattenTreeData,\n flattenForSelectAll,\n isAccessPermissionConfigured,\n };\n};\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type ITreeNode } from './useGetTreeData';
|
|
2
|
-
export declare const useTreesSearch: (
|
|
3
|
-
|
|
4
|
-
filteredHiddenByDefaultTree: ITreeNode[];
|
|
2
|
+
export declare const useTreesSearch: (tree: ITreeNode[]) => {
|
|
3
|
+
filteredTree: ITreeNode[];
|
|
5
4
|
expandedNodeIdsFromSearch: string[];
|
|
6
5
|
SearchInput: JSX.Element;
|
|
7
6
|
};
|
|
@@ -7,7 +7,7 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
|
7
7
|
import { faSearch } from '@fortawesome/free-solid-svg-icons';
|
|
8
8
|
import { useSharedTranslation } from '../../../../../hooks/useSharedTranslation';
|
|
9
9
|
import { useState } from 'react';
|
|
10
|
-
export const useTreesSearch = (
|
|
10
|
+
export const useTreesSearch = (tree) => {
|
|
11
11
|
const { t } = useSharedTranslation();
|
|
12
12
|
const [searchValue, setSearchValue] = useState('');
|
|
13
13
|
const normalizedSearch = searchValue.trim().toLowerCase();
|
|
@@ -27,8 +27,7 @@ export const useTreesSearch = (visibleByDefaultTree, hiddenByDefaultTree) => {
|
|
|
27
27
|
})
|
|
28
28
|
.filter((node) => node !== null);
|
|
29
29
|
return {
|
|
30
|
-
|
|
31
|
-
filteredHiddenByDefaultTree: !normalizedSearch ? hiddenByDefaultTree : _filterNodes(hiddenByDefaultTree),
|
|
30
|
+
filteredTree: !normalizedSearch ? tree : _filterNodes(tree),
|
|
32
31
|
expandedNodeIdsFromSearch: !normalizedSearch ? [] : nodeIds,
|
|
33
32
|
SearchInput: (_jsx(KitInput, { prefix: _jsx(FontAwesomeIcon, { icon: faSearch }), placeholder: t('global.search'), value: searchValue, onChange: e => setSearchValue(e.target.value), allowClear: true })),
|
|
34
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTreesSearch.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useTreesSearch.tsx"],"names":[],"mappings":";AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,QAAQ,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"useTreesSearch.js","sourceRoot":"","sources":["../../../../../../src/components/Filters/filter-items/filter-type/tree/useTreesSearch.tsx"],"names":[],"mappings":";AAAA,oFAAoF;AACpF,sCAAsC;AACtC,sEAAsE;AACtE,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,QAAQ,EAAC,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAC,QAAQ,EAAC,MAAM,OAAO,CAAC;AAE/B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAiB,EAAE,EAAE;IAChD,MAAM,EAAC,CAAC,EAAC,GAAG,oBAAoB,EAAE,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEnD,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,YAAY,GAAG,CAAC,KAAkB,EAAe,EAAE,CACrD,KAAK;SACA,GAAG,CAAC,IAAI,CAAC,EAAE;QACR,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAExE,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEtB,OAAO;YACH,GAAG,IAAI;YACP,QAAQ,EAAE,gBAAgB;SAC7B,CAAC;IACN,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,IAAI,EAAqB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAE5D,OAAO;QACH,YAAY,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;QAC3D,yBAAyB,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;QAC3D,WAAW,EAAE,CACT,KAAC,QAAQ,IACL,MAAM,EAAE,KAAC,eAAe,IAAC,IAAI,EAAE,QAAQ,GAAI,EAC3C,WAAW,EAAE,CAAC,CAAC,eAAe,CAAC,EAC/B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,UAAU,SACZ,CACL;KACJ,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {KitInput} from 'aristid-ds';\nimport {type ITreeNode} from './useGetTreeData';\nimport {FontAwesomeIcon} from '@fortawesome/react-fontawesome';\nimport {faSearch} from '@fortawesome/free-solid-svg-icons';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {useState} from 'react';\n\nexport const useTreesSearch = (tree: ITreeNode[]) => {\n const {t} = useSharedTranslation();\n const [searchValue, setSearchValue] = useState('');\n\n const normalizedSearch = searchValue.trim().toLowerCase();\n const nodeIds: string[] = [];\n\n const _filterNodes = (nodes: ITreeNode[]): ITreeNode[] =>\n nodes\n .map(node => {\n const filteredChildren = node.children ? _filterNodes(node.children) : [];\n const matchesSelf = node.title.toLowerCase().includes(normalizedSearch);\n\n if (!matchesSelf && filteredChildren.length === 0) {\n return null;\n }\n\n nodeIds.push(node.id);\n\n return {\n ...node,\n children: filteredChildren,\n };\n })\n .filter((node): node is ITreeNode => node !== null);\n\n return {\n filteredTree: !normalizedSearch ? tree : _filterNodes(tree),\n expandedNodeIdsFromSearch: !normalizedSearch ? [] : nodeIds,\n SearchInput: (\n <KitInput\n prefix={<FontAwesomeIcon icon={faSearch} />}\n placeholder={t('global.search')}\n value={searchValue}\n onChange={e => setSearchValue(e.target.value)}\n allowClear\n />\n ),\n };\n};\n"]}
|
package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { type ITreeNode } from '../useGetTreeData';
|
|
2
|
-
export declare const filterTreeByPermission: (nodes: ITreeNode[]
|
|
2
|
+
export declare const filterTreeByPermission: (nodes: ITreeNode[]) => ITreeNode[];
|
package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
export const filterTreeByPermission = (nodes
|
|
1
|
+
export const filterTreeByPermission = (nodes) => {
|
|
2
2
|
const result = [];
|
|
3
3
|
for (const node of nodes) {
|
|
4
|
-
const filteredChildren = filterTreeByPermission(node.children
|
|
5
|
-
|
|
6
|
-
if (nodeMatchesPermission || filteredChildren.length > 0) {
|
|
4
|
+
const filteredChildren = filterTreeByPermission(node.children);
|
|
5
|
+
if (node.accessRecordByDefaultPermission || filteredChildren.length > 0) {
|
|
7
6
|
result.push({
|
|
8
7
|
...node,
|
|
9
8
|
children: filteredChildren,
|
package/dist/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterTreeByPermission.js","sourceRoot":"","sources":["../../../../../../../src/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAkB,
|
|
1
|
+
{"version":3,"file":"filterTreeByPermission.js","sourceRoot":"","sources":["../../../../../../../src/components/Filters/filter-items/filter-type/tree/utils/filterTreeByPermission.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,KAAkB,EAAe,EAAE;IACtE,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE/D,IAAI,IAAI,CAAC,+BAA+B,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC;gBACR,GAAG,IAAI;gBACP,QAAQ,EAAE,gBAAgB;aAC7B,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type ITreeNode} from '../useGetTreeData';\n\nexport const filterTreeByPermission = (nodes: ITreeNode[]): ITreeNode[] => {\n const result: ITreeNode[] = [];\n\n for (const node of nodes) {\n const filteredChildren = filterTreeByPermission(node.children);\n\n if (node.accessRecordByDefaultPermission || filteredChildren.length > 0) {\n result.push({\n ...node,\n children: filteredChildren,\n });\n }\n }\n\n return result;\n};\n"]}
|
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import styled from 'styled-components';
|
|
3
2
|
import { KitTree } from 'aristid-ds';
|
|
4
3
|
import { useSharedTranslation } from '../../../../hooks/useSharedTranslation';
|
|
5
4
|
import { FilterTreeNodeTitle } from './FilterTreeNodeTitle';
|
|
6
|
-
const TreeStyled = styled(KitTree) `
|
|
7
|
-
span.ant-typography {
|
|
8
|
-
font-style: italic;
|
|
9
|
-
}
|
|
10
|
-
`;
|
|
11
5
|
const EMPTY_VALUE_KEY = '0';
|
|
12
6
|
export const EmptyValueCheckbox = ({ filter, onSelect, count }) => {
|
|
13
7
|
const { t } = useSharedTranslation();
|
|
14
8
|
const onChange = () => {
|
|
15
9
|
onSelect(!filter.withEmptyValues);
|
|
16
10
|
};
|
|
17
|
-
return (_jsx(
|
|
11
|
+
return (_jsx(KitTree, { checkable: true, treeData: [{ title: t('filters.empty-value'), key: EMPTY_VALUE_KEY, isLeaf: true }], titleRender: () => _jsx(FilterTreeNodeTitle, { title: t('filters.empty-value'), count: count }) // We don't need to use node from props as it's a static tree of one node
|
|
18
12
|
, checkedKeys: filter.withEmptyValues ? [EMPTY_VALUE_KEY] : [], selectedKeys: filter.withEmptyValues ? [EMPTY_VALUE_KEY] : [], onSelect: onChange, onCheck: onChange }));
|
|
19
13
|
};
|
|
20
14
|
//# sourceMappingURL=EmptyValueCheckbox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyValueCheckbox.js","sourceRoot":"","sources":["../../../../../src/components/Filters/filter-items/shared/EmptyValueCheckbox.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"EmptyValueCheckbox.js","sourceRoot":"","sources":["../../../../../src/components/Filters/filter-items/shared/EmptyValueCheckbox.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAC;AACnC,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAQ1D,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,MAAM,CAAC,MAAM,kBAAkB,GAAgD,CAAC,EAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAC,EAAE,EAAE;IACzG,MAAM,EAAC,CAAC,EAAC,GAAG,oBAAoB,EAAE,CAAC;IAEnC,MAAM,QAAQ,GAAG,GAAG,EAAE;QAClB,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,OAAO,CACH,KAAC,OAAO,IACJ,SAAS,QACT,QAAQ,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,EACjF,WAAW,EACP,GAAG,EAAE,CAAC,KAAC,mBAAmB,IAAC,KAAK,EAAE,CAAC,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,KAAK,GAAI,CAAC,yEAAyE;UAE1J,WAAW,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,EAC5D,YAAY,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,EAC7D,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,QAAQ,GACnB,CACL,CAAC;AACN,CAAC,CAAC","sourcesContent":["// Copyright LEAV Solutions 2017 until 2023/11/05, Copyright Aristid from 2023/11/06\n// This file is released under LGPL V3\n// License text available at https://www.gnu.org/licenses/lgpl-3.0.txt\nimport {type FunctionComponent} from 'react';\nimport styled from 'styled-components';\nimport {KitTree} from 'aristid-ds';\nimport {useSharedTranslation} from '_ui/hooks/useSharedTranslation';\nimport {type UIFilter} from '../../_types';\nimport {FilterTreeNodeTitle} from './FilterTreeNodeTitle';\n\ninterface IEmptyValueCheckboxProps {\n filter: UIFilter;\n onSelect: (selected: boolean) => void;\n count?: number;\n}\n\nconst EMPTY_VALUE_KEY = '0';\n\nexport const EmptyValueCheckbox: FunctionComponent<IEmptyValueCheckboxProps> = ({filter, onSelect, count}) => {\n const {t} = useSharedTranslation();\n\n const onChange = () => {\n onSelect(!filter.withEmptyValues);\n };\n\n return (\n <KitTree\n checkable\n treeData={[{title: t('filters.empty-value'), key: EMPTY_VALUE_KEY, isLeaf: true}]}\n titleRender={\n () => <FilterTreeNodeTitle title={t('filters.empty-value')} count={count} /> // We don't need to use node from props as it's a static tree of one node\n }\n checkedKeys={filter.withEmptyValues ? [EMPTY_VALUE_KEY] : []}\n selectedKeys={filter.withEmptyValues ? [EMPTY_VALUE_KEY] : []}\n onSelect={onChange}\n onCheck={onChange}\n />\n );\n};\n"]}
|