From 67dbb2bb64cf759194647d2e84863c9c6da874a7 Mon Sep 17 00:00:00 2001 From: Vincent Liadouze Date: Fri, 14 Jul 2023 22:15:38 +0200 Subject: [PATCH] fix(cdk/collections): SelectionModel setSelection method inconsistent with compareWith Fix bug in SelectionModel where compareWith function was not consistently respected in setSelection method. Fixes #27425 --- src/cdk/collections/selection-model.ts | 2 +- src/cdk/collections/selection.spec.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/cdk/collections/selection-model.ts b/src/cdk/collections/selection-model.ts index 8ad03692bcff..cf9ca587d959 100644 --- a/src/cdk/collections/selection-model.ts +++ b/src/cdk/collections/selection-model.ts @@ -91,7 +91,7 @@ export class SelectionModel { setSelection(...values: T[]): boolean | void { this._verifyValueAssignment(values); const oldValues = this.selected; - const newSelectedSet = new Set(values); + const newSelectedSet = new Set(values.map(value => this._getConcreteValue(value))); values.forEach(value => this._markSelected(value)); oldValues .filter(value => !newSelectedSet.has(this._getConcreteValue(value, newSelectedSet))) diff --git a/src/cdk/collections/selection.spec.ts b/src/cdk/collections/selection.spec.ts index 85cecb4d5614..be902b68a478 100644 --- a/src/cdk/collections/selection.spec.ts +++ b/src/cdk/collections/selection.spec.ts @@ -300,6 +300,17 @@ describe('SelectionModel', () => { expect(model.selected.length).toBe(1); }); + it('should not empty selection when caling setSelection twice with comparable', () => { + type Item = {id: number}; + const compareFn = (x: Item, y: Item) => x.id === y.id; + const model = new SelectionModel(false, [], false, compareFn); + model.setSelection({id: 1}); + expect(model.selected).toEqual([{id: 1}]); + + model.setSelection({id: 1}); + expect(model.selected).toEqual([{id: 1}]); + }); + describe('setSelection', () => { it('should not deselect an already selected value', () => { type Item = {key: number; value: string};