Skip to content

Commit 538023d

Browse files
Fix for Enhancement #559
Fix for Enhancement #559.
1 parent 77f990f commit 538023d

File tree

5 files changed

+105
-9
lines changed

5 files changed

+105
-9
lines changed

docs/documentation/docs/controls/TreeView.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ import { TreeView, ITreeItem } from "@pnp/spfx-controls-react/lib/TreeView";
3737
selectChildrenIfParentSelected={true}
3838
showCheckboxes={true}
3939
treeItemActionsDisplayMode={TreeItemActionsDisplayMode.ContextualMenu}
40-
defaultSelectedKeys=['key1', 'key2'],
40+
defaultSelectedKeys={['key1', 'key2']},
41+
expandToSelected={true}
4142
onSelect={this.onTreeItemSelect}
4243
onExpandCollapse={this.onTreeItemExpandCollapse}
4344
onRenderItem={this.renderCustomTreeItem} />
@@ -93,6 +94,7 @@ The TreeView control can be configured with the following properties:
9394
| showCheckboxes | boolean | yes | Specify if the checkboxes should be displayed for selection. |
9495
| treeItemActionsDisplayMode | TreeItemActionsDisplayMode | no | Specify the display mode of the tree item actions. |
9596
| defaultSelectedKeys | string[] | no | Specify keys of items to be selected by default. |
97+
| expandToSelected | boolean | no | Specify if you want expand the parent nodes to see defaultSelectedKeys on render. |
9698
| onExpandCollapse | function | no | Defines a onExpandCollapse function to raise when the tree item has expanded or collapsed. |
9799
| onSelect | function | no | Captures the event of when the tree item selection has changed. |
98100
| onRenderItem | function | no | Optional callback to provide custom rendering of the item (default is simple text of item label and a checkbox for selection). |

src/controls/treeView/ITreeViewProps.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ export interface ITreeViewProps {
4646
*/
4747
defaultSelectedKeys?: string[];
4848

49+
/**
50+
* Specify if you want expand the parent nodes to see defaultSelectedKeys on render.
51+
*/
52+
expandToSelected?:boolean;
53+
4954
/**
5055
* Callback function called after a item is expanded / collapsed.
5156
* @argument item The expanded / collapsed item.

src/controls/treeView/TreeItem.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,12 @@ export interface ITreeItemProps {
5959
* Customize how item is rendered.
6060
*/
6161
onRenderItem?: (item: ITreeItem) => JSX.Element;
62+
63+
tobeExpandedParents:any[];
6264
}
6365

66+
67+
6468
/**
6569
* TreeItem state interface
6670
*/
@@ -97,9 +101,16 @@ export default class TreeItem extends React.Component<ITreeItemProps, ITreeItemS
97101
// Check if current item is selected
98102
let active = this.props.activeItems.filter(item => item.key === this.props.treeItem.key);
99103

104+
var expanded = this.props.defaultExpanded;
105+
if(this.props.tobeExpandedParents.indexOf(this.props.treeItem.key) != -1)
106+
{
107+
expanded = true;
108+
}
109+
100110
this.state = {
101111
selected: active.length > 0,
102-
expanded: this.props.defaultExpanded
112+
// expanded: this.props.defaultExpanded
113+
expanded: expanded
103114
};
104115

105116
// Bind control events
@@ -214,7 +225,7 @@ export default class TreeItem extends React.Component<ITreeItemProps, ITreeItemS
214225
return (
215226
<TreeItem
216227
treeItem={item}
217-
defaultExpanded={treeItem.key === item.key ? this.state.expanded : false}
228+
defaultExpanded={this.state.expanded}
218229
leftOffset={paddingLeft}
219230
selectionMode={selectionMode}
220231
activeItems={activeItems}
@@ -224,6 +235,7 @@ export default class TreeItem extends React.Component<ITreeItemProps, ITreeItemS
224235
onRenderItem={onRenderItem}
225236
showCheckboxes={showCheckboxes}
226237
treeItemActionsDisplayMode={treeItemActionsDisplayMode}
238+
tobeExpandedParents = {this.props.tobeExpandedParents}
227239
/>
228240
);
229241
});

src/controls/treeView/TreeView.tsx

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import * as telemetry from '../../common/telemetry';
1212
*/
1313
export class TreeView extends React.Component<ITreeViewProps, ITreeViewState> {
1414

15+
private tobeExpandedParents = [];
1516
/**
1617
* Constructor method
1718
* @param props properties interface
@@ -29,8 +30,36 @@ export class TreeView extends React.Component<ITreeViewProps, ITreeViewState> {
2930
// Bind control events
3031
this.handleTreeExpandCollapse = this.handleTreeExpandCollapse.bind(this);
3132
this.handleOnSelect = this.handleOnSelect.bind(this);
33+
34+
if(this.props.expandToSelected){
35+
this.props.defaultSelectedKeys.forEach(element => {
36+
this.pathTo(this.props.items, element)
37+
});
38+
console.log("tobeExpandedParents",this.tobeExpandedParents);
39+
}
40+
41+
3242
}
3343

44+
45+
private pathTo = (array, target) => {
46+
var result;
47+
array.some(({ key, children = [] }) => {
48+
if (key === target)
49+
{
50+
this.tobeExpandedParents.push(key);
51+
return result = key;
52+
}
53+
var temp = this.pathTo(children, target)
54+
if (temp)
55+
{
56+
this.tobeExpandedParents.push(key);
57+
return result = key + '.' + temp;
58+
}
59+
});
60+
return result;
61+
};
62+
3463
private getSelectedItems(treeItems: ITreeItem[], selectedKeys: string[], selectedChildren: boolean): ITreeItem[] {
3564
let selectedItems: ITreeItem[] = [];
3665

@@ -176,7 +205,8 @@ export class TreeView extends React.Component<ITreeViewProps, ITreeViewState> {
176205
selectionMode,
177206
onRenderItem,
178207
showCheckboxes,
179-
treeItemActionsDisplayMode
208+
treeItemActionsDisplayMode,
209+
defaultExpanded
180210
} = this.props;
181211

182212
return (
@@ -187,14 +217,15 @@ export class TreeView extends React.Component<ITreeViewProps, ITreeViewState> {
187217
treeItem={treeNodeItem}
188218
leftOffset={20}
189219
isFirstRender={true}
190-
defaultExpanded={true}
220+
defaultExpanded={defaultExpanded}
191221
selectionMode={selectionMode}
192222
activeItems={this.state.activeItems}
193223
parentCallbackExpandCollapse={this.handleTreeExpandCollapse}
194224
parentCallbackOnSelect={this.handleOnSelect}
195225
onRenderItem={onRenderItem}
196226
showCheckboxes={showCheckboxes}
197227
treeItemActionsDisplayMode={treeItemActionsDisplayMode}
228+
tobeExpandedParents = {this.tobeExpandedParents}
198229
/>
199230
))
200231
}

src/webparts/controlsTest/components/ControlsTest.tsx

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -952,9 +952,10 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
952952
selectionMode={TreeViewSelectionMode.Multiple}
953953
showCheckboxes={true}
954954
treeItemActionsDisplayMode={TreeItemActionsDisplayMode.ContextualMenu}
955-
defaultSelectedKeys={['R2', '6']}
955+
defaultSelectedKeys={['gc1', 'gc3']}
956956
onExpandCollapse={this.onExpandCollapseTree}
957957
onSelect={this.onItemSelected}
958+
expandToSelected={true}
958959
// onRenderItem={this.renderCustomTreeItem}
959960
/>
960961

@@ -1090,12 +1091,57 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
10901091
{
10911092
key: "8",
10921093
label: "Parent 5"
1094+
},
1095+
{
1096+
key: "9",
1097+
label: "Parent 6",
1098+
children: [
1099+
{
1100+
key: "granchild",
1101+
label: "Child of Parent 6"
1102+
},
1103+
]
1104+
},
1105+
{
1106+
key: "10",
1107+
label: "Parent 7"
1108+
},
1109+
{
1110+
key: "11",
1111+
label: "Parent 8"
1112+
}
1113+
]
1114+
},
1115+
{
1116+
key: "R3",
1117+
label: "Root 3",
1118+
children: [
1119+
{
1120+
key: "12",
1121+
label: "Parent 9"
1122+
},
1123+
{
1124+
key: "13",
1125+
label: "Parent 10"
1126+
},
1127+
{
1128+
key: "14",
1129+
label: "Parent 11",
1130+
children: [
1131+
{
1132+
key: "gc3",
1133+
label: "Grand Child 2"
1134+
}]
1135+
},
1136+
{
1137+
key: "15",
1138+
label: "Parent 12"
10931139
}
10941140
]
10951141
}
10961142
];
10971143

1098-
private _onFolderSelect = (folder: IFolder): void => {
1099-
console.log('selected folder', folder);
1100-
}
1144+
// private _onFolderSelect = (folder: IFolder): void => {
1145+
// console.log('selected folder', folder);
1146+
// }
11011147
}

0 commit comments

Comments
 (0)