Skip to content

Commit ee5251a

Browse files
williamsyang-workmarcdumais-work
authored andcommitted
Implement autoExpandLevel for EntryModel trees
Add support for the autoExpandLevel flag to automatically collapse tree nodes beyond the specified depth level. When autoExpandLevel is set, nodes at depths greater than the specified level are automatically collapsed in the tree view. Related to eclipse-cdt-cloud/tsp-typescript-client#130 Signed-off-by: Will Yang <[email protected]>
1 parent 02fc339 commit ee5251a

File tree

6 files changed

+47
-4
lines changed

6 files changed

+47
-4
lines changed

base/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"src"
1717
],
1818
"dependencies": {
19-
"tsp-typescript-client": "^0.6.0"
19+
"tsp-typescript-client": "^0.7.0"
2020
},
2121
"devDependencies": {
2222
"@typescript-eslint/eslint-plugin": "^3.4.0",

react-components/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
"react-virtualized": "^9.21.0",
3737
"timeline-chart": "^0.4.1",
3838
"traceviewer-base": "0.8.0",
39-
"tsp-typescript-client": "^0.6.0"
39+
"tsp-typescript-client": "^0.7.0"
4040
},
4141
"devDependencies": {
4242
"@testing-library/react": "^15.0.6",

react-components/src/components/abstract-xy-output-component.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { ChartOptions } from 'chart.js';
2424
import { Line, Scatter } from 'react-chartjs-2';
2525
import { debounce } from 'lodash';
2626
import { isEqual } from 'lodash';
27+
import { getCollapsedNodesFromAutoExpandLevel, listToTree } from './utils/filter-tree/utils';
2728

2829
export const ZOOM_IN_RATE = 0.8;
2930
export const ZOOM_OUT_RATE = 1.25;
@@ -303,11 +304,16 @@ export abstract class AbstractXYOutputComponent<
303304
columns.push({ title: 'Name', sortable: true });
304305
}
305306
const checkedSeries = this.getAllCheckedIds(treeResponse.model.entries);
307+
const autoCollapsedNodes = getCollapsedNodesFromAutoExpandLevel(
308+
listToTree(treeResponse.model.entries, columns),
309+
treeResponse.model.autoExpandLevel
310+
);
306311
this.setState(
307312
{
308313
outputStatus: treeResponse.status,
309314
xyTree: treeResponse.model.entries,
310315
defaultOrderedIds: treeResponse.model.entries.map(entry => entry.id),
316+
collapsedNodes: autoCollapsedNodes,
311317
checkedSeries,
312318
columns
313319
},

react-components/src/components/datatree-output-component.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Entry } from 'tsp-typescript-client/lib/models/entry';
77
import { DataType } from 'tsp-typescript-client/lib/models/data-type';
88
import { ResponseStatus } from 'tsp-typescript-client/lib/models/response/responses';
99
import { EntryTree } from './utils/filter-tree/entry-tree';
10-
import { getAllExpandedNodeIds } from './utils/filter-tree/utils';
10+
import { getAllExpandedNodeIds, getCollapsedNodesFromAutoExpandLevel, listToTree } from './utils/filter-tree/utils';
1111
import { TreeNode } from './utils/filter-tree/tree-node';
1212
import ColumnHeader from './utils/filter-tree/column-header';
1313
import debounce from 'lodash.debounce';
@@ -73,10 +73,15 @@ export class DataTreeOutputComponent extends AbstractOutputComponent<AbstractOut
7373
} else {
7474
columns.push({ title: 'Name', sortable: true });
7575
}
76+
const autoCollapsedNodes = getCollapsedNodesFromAutoExpandLevel(
77+
listToTree(treeResponse.model.entries, columns),
78+
treeResponse.model.autoExpandLevel
79+
);
7680
this.setState({
7781
outputStatus: treeResponse.status,
7882
xyTree: treeResponse.model.entries,
7983
defaultOrderedIds: treeResponse.model.entries.map(entry => entry.id),
84+
collapsedNodes: autoCollapsedNodes,
8085
columns
8186
});
8287
} else {

react-components/src/components/timegraph-output-component.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@ import { TspDataProvider } from './data-providers/tsp-data-provider';
2323
import { ReactTimeGraphContainer } from './utils/timegraph-container-component';
2424
import { OutputElementStyle } from 'tsp-typescript-client/lib/models/styles';
2525
import { EntryTree } from './utils/filter-tree/entry-tree';
26-
import { listToTree, getAllExpandedNodeIds, getIndexOfNode, validateNumArray } from './utils/filter-tree/utils';
26+
import {
27+
listToTree,
28+
getAllExpandedNodeIds,
29+
getIndexOfNode,
30+
validateNumArray,
31+
getCollapsedNodesFromAutoExpandLevel
32+
} from './utils/filter-tree/utils';
2733
import hash from 'traceviewer-base/lib/utils/value-hash';
2834
import ColumnHeader from './utils/filter-tree/column-header';
2935
import { TimeGraphAnnotationComponent } from 'timeline-chart/lib/components/time-graph-annotation';
@@ -316,11 +322,16 @@ export class TimegraphOutputComponent extends AbstractTreeOutputComponent<Timegr
316322
} else {
317323
columns.push({ title: '', sortable: true, resizable: true });
318324
}
325+
const autoCollapsedNodes = getCollapsedNodesFromAutoExpandLevel(
326+
listToTree(treeResponse.model.entries, columns),
327+
treeResponse.model.autoExpandLevel
328+
);
319329
this.setState(
320330
{
321331
outputStatus: treeResponse.status,
322332
timegraphTree: treeResponse.model.entries,
323333
defaultOrderedIds: treeResponse.model.entries.map(entry => entry.id),
334+
collapsedNodes: autoCollapsedNodes,
324335
columns
325336
},
326337
this.updateTotalHeight

react-components/src/components/utils/filter-tree/utils.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,27 @@ export const listToTree = (list: Entry[], headers: ColumnHeader[]): TreeNode[] =
4747
return rootNodes;
4848
};
4949

50+
/**
51+
* Returns an array of node IDs that should be collapsed based on the auto-expand level.
52+
* Nodes at depths greater than or equal to the autoExpandLevel will be collapsed.
53+
* If autoExpandLevel is -1, no nodes are collapsed (all remain expanded).
54+
*/
55+
export const getCollapsedNodesFromAutoExpandLevel = (nodes: TreeNode[], autoExpandLevel = -1, depth = 0): number[] => {
56+
if (autoExpandLevel === -1) {
57+
return [];
58+
}
59+
const collapsedNodes: number[] = [];
60+
for (const node of nodes) {
61+
if (autoExpandLevel <= depth) {
62+
collapsedNodes.push(node.id);
63+
}
64+
if (node.children && node.children.length > 0) {
65+
collapsedNodes.push(...getCollapsedNodesFromAutoExpandLevel(node.children, autoExpandLevel, depth + 1));
66+
}
67+
}
68+
return collapsedNodes;
69+
};
70+
5071
export const getAllExpandedNodeIds = (nodes: TreeNode[], collapsedNodes: number[], emptyNodes?: number[]): number[] => {
5172
const visibleIds: number[] = [];
5273
nodes.forEach((node: TreeNode) => {

0 commit comments

Comments
 (0)