@@ -7,11 +7,12 @@ import { ComboBox, IComboBoxOption } from "office-ui-fabric-react/lib/ComboBox";
7
7
import { ListItemRepository } from '../../common/dal/ListItemRepository' ;
8
8
import styles from './ComboBoxListItemPicker.module.scss' ;
9
9
import { Spinner , SpinnerSize } from 'office-ui-fabric-react' ;
10
- import { cloneDeep } from 'lodash' ;
10
+ import { cloneDeep , isEqual } from 'lodash' ;
11
11
12
12
13
13
export class ComboBoxListItemPicker extends React . Component < IComboBoxListItemPickerProps , IComboBoxListItemPickerState > {
14
14
private _listItemRepo : ListItemRepository ;
15
+ private _options : any [ ] = null ;
15
16
16
17
constructor ( props : IComboBoxListItemPickerProps ) {
17
18
super ( props ) ;
@@ -44,45 +45,32 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
44
45
columnInternalName,
45
46
webUrl,
46
47
itemLimit,
47
- defaultSelectedItems,
48
48
onInitialized
49
49
} = props ;
50
- let selectedItems : any [ ] = [ ] ;
51
50
let query = filter || "" ;
52
51
//query += filter;
53
52
let keyColumnName = keyColumnInternalName || "Id" ;
54
- let listItems = await this . _listItemRepo . getListItemsByFilterClause ( query ,
55
- listId ,
56
- columnInternalName ,
57
- keyColumnInternalName ,
58
- webUrl ,
59
- itemLimit || 100 ) ;
60
53
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
+ } ) ;
83
68
}
69
+
70
+ const selectedItems = this . _getSelectedItems ( props ) ;
71
+
84
72
this . setState ( {
85
- availableOptions : options ,
73
+ availableOptions : this . _options ,
86
74
selectedItems : selectedItems ,
87
75
} ) ;
88
76
if ( onInitialized && isInitialLoad !== false ) {
@@ -92,13 +80,43 @@ export class ComboBoxListItemPicker extends React.Component<IComboBoxListItemPic
92
80
93
81
public async componentWillReceiveProps ( nextProps : IComboBoxListItemPickerProps ) : Promise < void > {
94
82
if ( nextProps . listId !== this . props . listId ) {
95
- await this . loadOptions ( nextProps , false ) ;
96
83
this . setState ( {
97
84
selectedItems : [ ] ,
98
85
} ) ;
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
+ } ) ;
99
93
}
100
94
}
101
95
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
+
102
120
/*public componentDidUpdate(prevProps: IComboBoxListItemPickerProps, prevState: IComboBoxListItemPickerState): void {
103
121
if (this.props.listId !== prevProps.listId) {
104
122
0 commit comments