Skip to content

Commit 8cdbbea

Browse files
Expand All and Collapse All functionality.
1 parent 3698f0a commit 8cdbbea

File tree

3 files changed

+59
-6
lines changed

3 files changed

+59
-6
lines changed
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import React, { useMemo } from 'react';
22
import buildTableRowsData from '../render/buildTableRowsData';
3+
import LinkButton from '../LinkButton/LinkButton';
34
import renderRow from '../render/renderRow';
45
import renderTable from '../render/renderTable';
56
import useCollapse from './useCollapse';
67
import classes from './TreeView.module.less';
78

89
const TreeView = ({ coverage, linkSelector }) => {
9-
const collapseContainer = useCollapse();
10+
const [collapseContainer, onCollapseAll, onExpandAll] = useCollapse();
1011
const tableHTML = useMemo(() => {
1112
const rows = buildTableRowsData(coverage);
1213
const bodyContent = rows.map(row => renderRow(row, { linkSelector }));
@@ -15,7 +16,15 @@ const TreeView = ({ coverage, linkSelector }) => {
1516
}, [coverage, linkSelector]);
1617

1718

18-
return <div className={classes.root} dangerouslySetInnerHTML={tableHTML} ref={collapseContainer}/>;
19+
return (
20+
<div className={classes.root}>
21+
<div className={classes.controls}>
22+
<LinkButton onClick={onCollapseAll}>Collapse All</LinkButton>
23+
<LinkButton onClick={onExpandAll}>Expand All</LinkButton>
24+
</div>
25+
<div dangerouslySetInnerHTML={tableHTML} ref={collapseContainer}/>
26+
</div>
27+
);
1928
};
2029

2130
export default TreeView;
Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
11
.root {
22
display: flex;
33
flex-direction: column;
4-
}
4+
}
5+
6+
.controls {
7+
display: flex;
8+
flex-direction: row;
9+
margin-bottom: 0.5rem;
10+
11+
& > * + * {
12+
margin-left: 1rem;
13+
}
14+
}

packages/components/TreeView/useCollapse.js

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BRANCH_NODE } from '@lcov-viewer/core';
2-
import { useEffect, useRef } from 'react';
2+
import { useCallback, useEffect, useRef } from 'react';
33
import { collapseRow, expandRow, hideRow, showRow } from '../render/collapse';
44

55
const findRow = (element) => {
@@ -25,7 +25,8 @@ const useCollapse = () => {
2525

2626
Array.prototype.forEach.call(ref.current.querySelectorAll('tbody tr'), row => {
2727
const path = row.getAttribute('data-node');
28-
state.current[path] = { path, row, collapsed: false, visible: true };
28+
const type = row.getAttribute('data-node-type');
29+
state.current[path] = { path, type, row, collapsed: false, visible: true };
2930
});
3031

3132
const handleClick = (event) => {
@@ -53,8 +54,10 @@ const useCollapse = () => {
5354
affectedChildrenPaths.forEach(path => {
5455
if (rowState.collapsed) {
5556
showRow(state.current[path].row);
57+
state.current[path].visible = true;
5658
} else {
5759
hideRow(state.current[path].row);
60+
state.current[path].visible = false;
5861
}
5962
});
6063

@@ -69,7 +72,38 @@ const useCollapse = () => {
6972
};
7073
}, []);
7174

72-
return ref;
75+
const onCollapseAll = useCallback(() => {
76+
Object.values(state.current).forEach(rowState => {
77+
if (rowState.type === BRANCH_NODE) {
78+
if (!rowState.collapsed) {
79+
collapseRow(rowState.row);
80+
rowState.collapsed = true;
81+
}
82+
}
83+
84+
if (rowState.path !== '') {
85+
hideRow(rowState.row);
86+
rowState.visible = false;
87+
}
88+
});
89+
90+
}, []);
91+
92+
const onExpandAll = useCallback(() => {
93+
Object.values(state.current).forEach(rowState => {
94+
if (rowState.collapsed) {
95+
expandRow(rowState.row);
96+
rowState.collapsed = false;
97+
}
98+
99+
if (!rowState.visible) {
100+
showRow(rowState.row);
101+
rowState.visible = true;
102+
}
103+
});
104+
}, []);
105+
106+
return [ref, onCollapseAll, onExpandAll];
73107
};
74108

75109
export default useCollapse;

0 commit comments

Comments
 (0)