Skip to content

Commit 7bb3450

Browse files
ComboBoxListItemPicker defaultSelectedItems fix
1 parent 30e53c1 commit 7bb3450

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

src/controls/listItemPicker/ComboBoxListItemPicker.tsx

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ 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';
1011

1112

1213
export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPickerProps, IComboBoxListItemPickerState> {
1314
private _listItemRepo: ListItemRepository;
14-
public selectedItems: any[];
1515

1616
constructor(props: IComboBoxListItemPickerProps) {
1717
super(props);
@@ -23,13 +23,13 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
2323
noresultsFoundText: !this.props.noResultsFoundText ? strings.genericNoResultsFoundText : this.props.noResultsFoundText,
2424
showError: false,
2525
errorMessage: "",
26-
suggestionsHeaderText: !this.props.suggestionsHeaderText ? strings.ListItemPickerSelectValue : this.props.suggestionsHeaderText
26+
suggestionsHeaderText: !this.props.suggestionsHeaderText ? strings.ListItemPickerSelectValue : this.props.suggestionsHeaderText,
27+
selectedItems: this.props.defaultSelectedItems || [],
2728
};
2829

2930
// Get SPService Factory
3031
this._listItemRepo = new ListItemRepository(this.props.webUrl, this.props.spHttpClient);
3132

32-
this.selectedItems = [];
3333
}
3434

3535
public componentDidMount(): void {
@@ -47,6 +47,7 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
4747
defaultSelectedItems,
4848
onInitialized
4949
} = props;
50+
let selectedItems: any[] = [];
5051
let query = filter || "";
5152
//query += filter;
5253
let keyColumnName = keyColumnInternalName || "Id";
@@ -66,14 +67,23 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
6667
if (defaultSelectedItems) {
6768
//if passed only ids
6869
if (!isNaN(defaultSelectedItems[0])) {
69-
this.selectedItems = options.filter(opt => defaultSelectedItems.indexOf(opt.key) >= 0);
70+
selectedItems = options.filter(opt => defaultSelectedItems.indexOf(opt.key) >= 0);
7071
}
7172
else {
72-
this.selectedItems = options.filter(opt => defaultSelectedItems.map(selected => selected[keyColumnName]).indexOf(opt.key) >= 0);
73+
selectedItems = options.filter(opt => defaultSelectedItems.map(selected => selected[keyColumnName]).indexOf(opt.key) >= 0);
7374
}
7475
}
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+
})
83+
}
7584
this.setState({
76-
availableOptions: options
85+
availableOptions: options,
86+
selectedItems: selectedItems,
7787
});
7888
if (onInitialized && isInitialLoad !== false) {
7989
onInitialized();
@@ -83,7 +93,9 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
8393
public async componentWillReceiveProps(nextProps: IComboBoxListItemPickerProps): Promise<void> {
8494
if (nextProps.listId !== this.props.listId) {
8595
await this.loadOptions(nextProps, false);
86-
this.selectedItems = [];
96+
this.setState({
97+
selectedItems: [],
98+
});
8799
}
88100
}
89101

@@ -98,6 +110,7 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
98110
*/
99111
public render(): React.ReactElement<IComboBoxListItemPickerProps> {
100112
const { className, disabled } = this.props;
113+
const selectedKeys = this.state.selectedItems?.map(item => item[this.props.keyColumnInternalName || "Id"]) || [];
101114

102115
return (
103116
<div className={styles.comboBoxListItemPickerWrapper}>
@@ -112,7 +125,7 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
112125
text={this.props.text}
113126
onChange={(e, value) => this.onChanged(value)}
114127
multiSelect={this.props.multiSelect}
115-
defaultSelectedKey={this.selectedItems.map(item => item.key) || []}
128+
selectedKey={selectedKeys}
116129
className={className}
117130
disabled={disabled} />
118131
{!this.state.errorMessage && !this.state.availableOptions && (<Spinner className={styles.loading} size={SpinnerSize.small} />)}
@@ -126,25 +139,30 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
126139
* On Selected Item
127140
*/
128141
private onChanged = (option?: IComboBoxOption, index?: number, value?: string, submitPendingValueEvent?: any): void => {
142+
let selectedItems: any[] = cloneDeep(this.state.selectedItems);
129143
if (this.props.multiSelect) {
130144
if (option && option.selected) {
131-
this.selectedItems.push({
145+
selectedItems.push({
132146
[this.props.keyColumnInternalName || "Id"]: option.key,
133147
[this.props.columnInternalName]: option.text,
134148
selected: option.selected
135149
});
136150
} else {
137-
this.selectedItems = this.selectedItems.filter(o => o[this.props.keyColumnInternalName || "Id"] !== option.key);
151+
selectedItems = selectedItems.filter(o => o[this.props.keyColumnInternalName || "Id"] !== option.key);
138152
}
139153
} else {
140-
this.selectedItems.push({
154+
selectedItems.push({
141155
[this.props.keyColumnInternalName || "Id"]: option.key,
142156
[this.props.columnInternalName]: option.text
143157
});
144158

145-
this.selectedItems = this.selectedItems.filter(o => o[this.props.keyColumnInternalName || "Id"] === option.key);
159+
selectedItems = selectedItems.filter(o => o[this.props.keyColumnInternalName || "Id"] === option.key);
146160
}
147161

148-
this.props.onSelectedItem(this.selectedItems);
162+
this.setState({
163+
selectedItems: selectedItems,
164+
});
165+
166+
this.props.onSelectedItem(selectedItems);
149167
}
150168
}

0 commit comments

Comments
 (0)