Skip to content

Commit 2fc3d2e

Browse files
ComboBoxListItemPicker support for changing defaultSelectedItems
1 parent 6aacf06 commit 2fc3d2e

File tree

4 files changed

+60
-33
lines changed

4 files changed

+60
-33
lines changed

src/controls/listItemPicker/ComboBoxListItemPicker.tsx

Lines changed: 51 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ import { ComboBox, IComboBoxOption } from "office-ui-fabric-react/lib/ComboBox";
77
import { ListItemRepository } from '../../common/dal/ListItemRepository';
88
import styles from './ComboBoxListItemPicker.module.scss';
99
import { Spinner, SpinnerSize } from 'office-ui-fabric-react';
10-
import { cloneDeep } from 'lodash';
10+
import { cloneDeep, isEqual } from 'lodash';
1111

1212

1313
export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPickerProps, IComboBoxListItemPickerState> {
1414
private _listItemRepo: ListItemRepository;
15+
private _options: any[] = null;
1516

1617
constructor(props: IComboBoxListItemPickerProps) {
1718
super(props);
@@ -44,45 +45,32 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
4445
columnInternalName,
4546
webUrl,
4647
itemLimit,
47-
defaultSelectedItems,
4848
onInitialized
4949
} = props;
50-
let selectedItems: any[] = [];
5150
let query = filter || "";
5251
//query += filter;
5352
let keyColumnName = keyColumnInternalName || "Id";
54-
let listItems = await this._listItemRepo.getListItemsByFilterClause(query,
55-
listId,
56-
columnInternalName,
57-
keyColumnInternalName,
58-
webUrl,
59-
itemLimit || 100);
6053

61-
let options = listItems.map(option => {
62-
return {
63-
key: option[keyColumnName],
64-
text: option[columnInternalName || "Id"]
65-
};
66-
});
67-
if (defaultSelectedItems) {
68-
//if passed only ids
69-
if (!isNaN(defaultSelectedItems[0])) {
70-
selectedItems = options.filter(opt => defaultSelectedItems.indexOf(opt.key) >= 0);
71-
}
72-
else {
73-
selectedItems = options.filter(opt => defaultSelectedItems.map(selected => selected[keyColumnName]).indexOf(opt.key) >= 0);
74-
}
75-
}
76-
if (selectedItems?.length > 0) {
77-
selectedItems = selectedItems.map(item => {
78-
return {
79-
[this.props.keyColumnInternalName || "Id"]: item.key,
80-
[this.props.columnInternalName]: item.text
81-
}
82-
})
54+
if (!this._options || listId !== this.props.listId) {
55+
const listItems = await this._listItemRepo.getListItemsByFilterClause(query,
56+
listId,
57+
columnInternalName,
58+
keyColumnInternalName,
59+
webUrl,
60+
itemLimit || 100);
61+
62+
this._options = listItems.map(option => {
63+
return {
64+
key: option[keyColumnName],
65+
text: option[columnInternalName || "Id"]
66+
};
67+
});
8368
}
69+
70+
const selectedItems = this._getSelectedItems(props);
71+
8472
this.setState({
85-
availableOptions: options,
73+
availableOptions: this._options,
8674
selectedItems: selectedItems,
8775
});
8876
if (onInitialized && isInitialLoad !== false) {
@@ -92,13 +80,43 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
9280

9381
public async componentWillReceiveProps(nextProps: IComboBoxListItemPickerProps): Promise<void> {
9482
if (nextProps.listId !== this.props.listId) {
95-
await this.loadOptions(nextProps, false);
9683
this.setState({
9784
selectedItems: [],
9885
});
86+
await this.loadOptions(nextProps, false);
87+
}
88+
if (!isEqual(nextProps.defaultSelectedItems, this.props.defaultSelectedItems)) {
89+
const selectedItems = this._getSelectedItems(nextProps);
90+
this.setState({
91+
selectedItems: selectedItems,
92+
});
9993
}
10094
}
10195

96+
private _getSelectedItems(props: IComboBoxListItemPickerProps): any[] {
97+
let selectedItems: any[] = [];
98+
let keyColumnName = props.keyColumnInternalName || "Id";
99+
if (props.defaultSelectedItems) {
100+
//if passed only ids
101+
if (!isNaN(props.defaultSelectedItems[0])) {
102+
selectedItems = this._options.filter(opt => props.defaultSelectedItems.indexOf(opt.key) >= 0);
103+
}
104+
else {
105+
selectedItems = this._options.filter(opt => props.defaultSelectedItems.map(selected => selected[keyColumnName]).indexOf(opt.key) >= 0);
106+
}
107+
}
108+
if (selectedItems?.length > 0) {
109+
selectedItems = selectedItems.map(item => {
110+
return {
111+
[this.props.keyColumnInternalName || "Id"]: item.key,
112+
[this.props.columnInternalName]: item.text
113+
}
114+
})
115+
}
116+
117+
return selectedItems;
118+
}
119+
102120
/*public componentDidUpdate(prevProps: IComboBoxListItemPickerProps, prevState: IComboBoxListItemPickerState): void {
103121
if (this.props.listId !== prevProps.listId) {
104122

src/webparts/controlsTest/components/ControlsTest.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
437437
canMoveNext: true,
438438
currentCarouselElement: this.carouselElements[0],
439439
comboBoxListItemPickerListId: '0ffa51d7-4ad1-4f04-8cfe-98209905d6da',
440+
comboBoxListItemPickerIds: [{Id: 1, Title: '111'}],
440441
treeViewSelectedKeys: ['gc1', 'gc3'],
441442
showAnimatedDialog: false,
442443
showCustomisedAnimatedDialog: false,
@@ -1442,6 +1443,7 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
14421443
onSelectedItem={(data) => {
14431444
console.log(`Item(s):`, data);
14441445
}}
1446+
defaultSelectedItems={this.state.comboBoxListItemPickerIds}
14451447
webUrl={this.props.context.pageContext.web.absoluteUrl}
14461448
spHttpClient={this.props.context.spHttpClient} />
14471449

@@ -1450,6 +1452,11 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
14501452
comboBoxListItemPickerListId: '71210430-8436-4962-a14d-5525475abd6b'
14511453
});
14521454
}} />
1455+
<PrimaryButton text="Change default items" onClick={() => {
1456+
this.setState({
1457+
comboBoxListItemPickerIds: [{Id: 2, Title: '222'}]
1458+
});
1459+
}} />
14531460

14541461
</div>
14551462

src/webparts/controlsTest/components/ControlsTest_SingleComponent.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export default class ControlsTest extends React.Component<IControlsTestProps, IC
134134
canMoveNext: true,
135135
currentCarouselElement: this.carouselElements[0],
136136
comboBoxListItemPickerListId: '0ffa51d7-4ad1-4f04-8cfe-98209905d6da',
137+
comboBoxListItemPickerIds: [],
137138
selectedTeam: [],
138139
selectedTeamChannels: []
139140

src/webparts/controlsTest/components/IControlsTestProps.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export interface IControlsTestState {
3434
canMovePrev: boolean;
3535
canMoveNext: boolean;
3636
comboBoxListItemPickerListId: string;
37+
comboBoxListItemPickerIds: any[];
3738
filePickerResult?: IFilePickerResult[];
3839
treeViewSelectedKeys?: string[];
3940
showAnimatedDialog?: boolean;

0 commit comments

Comments
 (0)