Skip to content

Commit b7e5e6b

Browse files
committed
fix of #621 ListView Sort Fires Selection
1 parent 4d952a8 commit b7e5e6b

File tree

1 file changed

+16
-19
lines changed

1 file changed

+16
-19
lines changed

src/controls/listView/ListView.tsx

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { IGroupsItems } from './IListView';
99
import * as telemetry from '../../common/telemetry';
1010
import filter = require('lodash/filter');
1111
import { SearchBox } from 'office-ui-fabric-react/lib/SearchBox';
12+
import { Guid } from '@microsoft/sp-core-library';
1213

1314
/**
1415
* File type icon component
@@ -58,10 +59,10 @@ export class ListView extends React.Component<IListViewProps, IListViewState> {
5859
* @param prevState
5960
*/
6061
public componentDidUpdate(prevProps: IListViewProps, prevState: IListViewState): void {
61-
// select default items
62-
this._setSelectedItems();
6362

6463
if (!isEqual(prevProps, this.props)) {
64+
// select default items
65+
this._setSelectedItems();
6566
// Reset the selected items
6667
if (this._selection) {
6768
this._selection.setItems(this.props.items, true);
@@ -244,7 +245,7 @@ export class ListView extends React.Component<IListViewProps, IListViewState> {
244245
* @param item
245246
*/
246247
private _flattenItem(item: any): any {
247-
let flatItem = {};
248+
let flatItem: any = {};
248249
for (let parentPropName in item) {
249250
// Check if property already exists
250251
if (!item.hasOwnProperty(parentPropName)) continue;
@@ -261,6 +262,15 @@ export class ListView extends React.Component<IListViewProps, IListViewState> {
261262
flatItem[parentPropName] = item[parentPropName];
262263
}
263264
}
265+
266+
if (!flatItem.key) {
267+
flatItem.key = flatItem.ID || flatItem.Id;
268+
269+
if (!flatItem.key) {
270+
flatItem.key = Guid.newGuid().toString();
271+
}
272+
}
273+
264274
return flatItem;
265275
}
266276

@@ -406,20 +416,6 @@ export class ListView extends React.Component<IListViewProps, IListViewState> {
406416
const ascItems = sortBy(items, [columnName]);
407417
const sortedItems = descending ? ascItems.reverse() : ascItems;
408418

409-
// Check if selection needs to be updated
410-
if (this._selection) {
411-
const selection = this._selection.getSelection();
412-
if (selection && selection.length > 0) {
413-
// Clear selection
414-
this._selection.setItems([], true);
415-
setTimeout(() => {
416-
// Find new index
417-
let idxs: number[] = selection.map(item => findIndex(sortedItems, item));
418-
idxs.forEach(idx => this._selection.setIndexSelected(idx, true, false));
419-
}, 0);
420-
}
421-
}
422-
423419
// Return the sorted items list
424420
return sortedItems;
425421
}
@@ -430,7 +426,7 @@ export class ListView extends React.Component<IListViewProps, IListViewState> {
430426
* @param items
431427
* @param columns
432428
*/
433-
private _executeFiltering(filterValue: string, items: any[], columns: IColumn[]): any[] {
429+
private _executeFiltering(filterValue: string, items: any[], columns: IColumn[]): any[] {
434430
const filterSeparator = ":";
435431

436432
let filterColumns = [...columns];
@@ -517,14 +513,15 @@ export class ListView extends React.Component<IListViewProps, IListViewState> {
517513
return (
518514
<div>
519515
{
520-
showFilter && <SearchBox placeholder={filterPlaceHolder || strings.ListViewFilterLabel} onSearch={this._updateFilterValue} onChange={this._updateFilterValue} value={filterValue}/>
516+
showFilter && <SearchBox placeholder={filterPlaceHolder || strings.ListViewFilterLabel} onSearch={this._updateFilterValue} onChange={this._updateFilterValue} value={filterValue} />
521517
}
522518
<DetailsList
523519
key="ListViewControl"
524520
items={items}
525521
columns={this.state.columns}
526522
groups={this.state.groups}
527523
selectionMode={this.props.selectionMode || SelectionMode.none}
524+
selectionPreservedOnEmptyClick={true}
528525
selection={this._selection}
529526
layoutMode={DetailsListLayoutMode.justified}
530527
compact={this.props.compact}

0 commit comments

Comments
 (0)