@topconsultnpm/sdkui-react 6.20.0-dev1.110 → 6.20.0-dev1.111
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.
|
@@ -22,10 +22,11 @@ interface ITMTreeViewProps<T extends ITMTreeItem> {
|
|
|
22
22
|
onNodeUpdate?: (updatedNode: T) => void;
|
|
23
23
|
onDataChanged?: (items: T[]) => void;
|
|
24
24
|
shouldDelayFocusOnEvent?: (node: T, event: React.MouseEvent) => boolean;
|
|
25
|
+
autoSelectChildren?: boolean;
|
|
25
26
|
itemsPerPage?: number;
|
|
26
27
|
showLoadMoreButton?: boolean;
|
|
27
28
|
}
|
|
28
|
-
declare const TMTreeView: <T extends ITMTreeItem>({ dataSource, focusedItem, selectedItems, allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, itemsPerPage, showLoadMoreButton }: ITMTreeViewProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
declare const TMTreeView: <T extends ITMTreeItem>({ dataSource, focusedItem, selectedItems, allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, autoSelectChildren, itemsPerPage, showLoadMoreButton }: ITMTreeViewProps<T>) => import("react/jsx-runtime").JSX.Element;
|
|
29
30
|
export default TMTreeView;
|
|
30
31
|
export declare const StyledTreeNode: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
|
|
31
32
|
$isSelected?: boolean;
|
|
@@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef } from 'react';
|
|
|
3
3
|
import styled from 'styled-components';
|
|
4
4
|
import { IconChevronDown, IconChevronRight } from '../../helper';
|
|
5
5
|
import TMButton from './TMButton';
|
|
6
|
-
const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, itemsPerPage = 100, showLoadMoreButton = true }) => {
|
|
6
|
+
const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMultipleSelection, onDataChanged, calculateItemsForNode, itemRender, onNodeUpdate, onFocusedItemChanged, onSelectionChanged, shouldDelayFocusOnEvent, autoSelectChildren = true, itemsPerPage = 100, showLoadMoreButton = true }) => {
|
|
7
7
|
useEffect(() => {
|
|
8
8
|
const handleKeyDown = (event) => {
|
|
9
9
|
if (!focusedItem)
|
|
@@ -187,47 +187,51 @@ const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMul
|
|
|
187
187
|
};
|
|
188
188
|
let newSelectedItems;
|
|
189
189
|
if (checked) {
|
|
190
|
-
if (node.isContainer) {
|
|
191
|
-
// Quando selezioni un container, aggiungi il container stesso + tutti i figli
|
|
190
|
+
if (node.isContainer && autoSelectChildren) {
|
|
191
|
+
// Quando selezioni un container, aggiungi il container stesso + tutti i figli (se autoSelectChildren è true)
|
|
192
192
|
const allChildren = flattenTree(node.items || []);
|
|
193
193
|
newSelectedItems = [...selectedItems, node, ...allChildren];
|
|
194
194
|
}
|
|
195
195
|
else if (!selectedItems.some(item => item.key === node.key)) {
|
|
196
|
-
// Quando selezioni un figlio, aggiungi il
|
|
196
|
+
// Quando selezioni un figlio o un container con autoSelectChildren=false, aggiungi solo il nodo
|
|
197
197
|
newSelectedItems = [...selectedItems, node];
|
|
198
|
-
// Verifica se selezionando questo figlio sono ora selezionati tutti i figli del parent
|
|
199
|
-
|
|
200
|
-
|
|
198
|
+
// Verifica se selezionando questo figlio sono ora selezionati tutti i figli del parent (solo se autoSelectChildren è true)
|
|
199
|
+
if (autoSelectChildren) {
|
|
200
|
+
const parentsToAdd = findAndCheckParents(dataSource, node, newSelectedItems);
|
|
201
|
+
newSelectedItems = [...newSelectedItems, ...parentsToAdd];
|
|
202
|
+
}
|
|
201
203
|
}
|
|
202
204
|
else {
|
|
203
205
|
newSelectedItems = selectedItems;
|
|
204
206
|
}
|
|
205
207
|
}
|
|
206
|
-
else if (node.isContainer) {
|
|
207
|
-
// Quando deselezioni un container, rimuovi il container stesso + tutti i figli
|
|
208
|
+
else if (node.isContainer && autoSelectChildren) {
|
|
209
|
+
// Quando deselezioni un container, rimuovi il container stesso + tutti i figli (solo se autoSelectChildren è true)
|
|
208
210
|
const childKeys = flattenTree(node.items || []).map(item => item.key);
|
|
209
211
|
newSelectedItems = selectedItems.filter(item => item.key !== node.key && !childKeys.includes(item.key));
|
|
210
212
|
}
|
|
211
213
|
else {
|
|
212
|
-
// Quando deselezioni un figlio, rimuovi il
|
|
214
|
+
// Quando deselezioni un figlio o un container con autoSelectChildren=false, rimuovi solo il nodo
|
|
213
215
|
newSelectedItems = selectedItems.filter(item => item.key !== node.key);
|
|
214
|
-
// Se il figlio apparteneva a un parent che era selezionato, rimuovi anche il parent
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
216
|
+
// Se il figlio apparteneva a un parent che era selezionato, rimuovi anche il parent (solo se autoSelectChildren è true)
|
|
217
|
+
if (autoSelectChildren && !node.isContainer) {
|
|
218
|
+
const removeParentContainers = (items) => {
|
|
219
|
+
const parentsToRemove = [];
|
|
220
|
+
items.forEach(item => {
|
|
221
|
+
if (item.isContainer && item.items) {
|
|
222
|
+
const childKeys = flattenTree(item.items).map(child => child.key);
|
|
223
|
+
if (childKeys.includes(node.key)) {
|
|
224
|
+
parentsToRemove.push(item.key);
|
|
225
|
+
}
|
|
226
|
+
// Ricorsione per parent annidati
|
|
227
|
+
parentsToRemove.push(...removeParentContainers(item.items));
|
|
222
228
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
229
|
-
const parentsToRemove = removeParentContainers(dataSource);
|
|
230
|
-
newSelectedItems = newSelectedItems.filter(item => !parentsToRemove.includes(item.key));
|
|
229
|
+
});
|
|
230
|
+
return parentsToRemove;
|
|
231
|
+
};
|
|
232
|
+
const parentsToRemove = removeParentContainers(dataSource);
|
|
233
|
+
newSelectedItems = newSelectedItems.filter(item => !parentsToRemove.includes(item.key));
|
|
234
|
+
}
|
|
231
235
|
}
|
|
232
236
|
onSelectionChanged?.(newSelectedItems);
|
|
233
237
|
};
|
|
@@ -252,6 +256,9 @@ const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMul
|
|
|
252
256
|
// setTreeData(prevData => collapseAll(prevData));
|
|
253
257
|
// };
|
|
254
258
|
const isIndeterminate = (node) => {
|
|
259
|
+
// Lo stato indeterminate ha senso solo quando autoSelectChildren è true
|
|
260
|
+
if (!autoSelectChildren)
|
|
261
|
+
return false;
|
|
255
262
|
if (!node.isContainer || !node.items)
|
|
256
263
|
return false;
|
|
257
264
|
const childKeys = flattenTree(node.items).map(item => item.key);
|