Skip to content

Commit 7d02fd9

Browse files
committed
fix(button-toggle): button groups with multiple values should initialize with falsy value.
1 parent 9dadf37 commit 7d02fd9

File tree

2 files changed

+75
-2
lines changed

2 files changed

+75
-2
lines changed

src/lib/button-toggle/button-toggle.spec.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import {
88
MatButtonToggleChange,
99
MatButtonToggleGroup,
1010
MatButtonToggleGroupMultiple,
11+
MatButtonToggle,
12+
MatButtonToggleChange,
1113
MatButtonToggleModule,
1214
} from './index';
1315

@@ -19,6 +21,7 @@ describe('MatButtonToggle with forms', () => {
1921
declarations: [
2022
ButtonToggleGroupWithNgModel,
2123
ButtonToggleGroupWithFormControl,
24+
ButtonToggleGroupMultipleWithFormControl,
2225
],
2326
});
2427

@@ -71,6 +74,46 @@ describe('MatButtonToggle with forms', () => {
7174
});
7275
});
7376

77+
describe('multiple using FormControl', () => {
78+
let fixture: ComponentFixture<ButtonToggleGroupMultipleWithFormControl>;
79+
let groupDebugElement: DebugElement;
80+
let groupInstance: MatButtonToggleGroup;
81+
let testComponent: ButtonToggleGroupMultipleWithFormControl;
82+
83+
beforeEach(fakeAsync(() => {
84+
fixture = TestBed.createComponent(ButtonToggleGroupMultipleWithFormControl);
85+
fixture.detectChanges();
86+
87+
testComponent = fixture.debugElement.componentInstance;
88+
89+
groupDebugElement = fixture.debugElement.query(By.directive(MatButtonToggleGroup));
90+
groupInstance = groupDebugElement.injector.get<MatButtonToggleGroup>(MatButtonToggleGroup);
91+
}));
92+
93+
it('should initialize with falsy value', () => {
94+
expect(groupInstance.value).toEqual([0, 1, 2]);
95+
});
96+
97+
it('should set the value', () => {
98+
testComponent.control.setValue([0, 1]);
99+
100+
expect(groupInstance.value).toEqual([0, 1]);
101+
102+
testComponent.control.setValue([3, 5]);
103+
104+
expect(groupInstance.value).toEqual([3, 5]);
105+
});
106+
107+
it('should register the on change callback', () => {
108+
let spy = jasmine.createSpy('onChange callback');
109+
110+
testComponent.control.registerOnChange(spy);
111+
testComponent.control.setValue([0, 1]);
112+
113+
expect(spy).toHaveBeenCalled();
114+
});
115+
});
116+
74117
describe('button toggle group with ngModel and change event', () => {
75118
let fixture: ComponentFixture<ButtonToggleGroupWithNgModel>;
76119
let groupDebugElement: DebugElement;
@@ -748,6 +791,32 @@ class ButtonTogglesInsideButtonToggleGroupMultiple {
748791
isVertical: boolean = false;
749792
}
750793

794+
@Component({
795+
template: `
796+
<mat-button-toggle-group [formControl]="control" multiple>
797+
<mat-button-toggle *ngFor="let option of options" [value]="option.value">
798+
{{option.label}}
799+
</mat-button-toggle>
800+
</mat-button-toggle-group>
801+
`
802+
})
803+
class ButtonToggleGroupMultipleWithFormControl implements OnInit {
804+
control = new FormControl([]);
805+
options = [
806+
{value: 0, label: 'Sunday'},
807+
{value: 1, label: 'Monday'},
808+
{value: 2, label: 'Tuesday'},
809+
{value: 3, label: 'Wednesday'},
810+
{value: 4, label: 'Thursday'},
811+
{value: 5, label: 'Friday'},
812+
{value: 6, label: 'Saturday'},
813+
];
814+
815+
ngOnInit(): void {
816+
this.control.patchValue([0, 1, 2]);
817+
}
818+
}
819+
751820
@Component({
752821
template: `
753822
<mat-button-toggle>Yes</mat-button-toggle>

src/lib/button-toggle/button-toggle.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,11 @@ export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase impleme
264264
}
265265

266266
if (this.multiple && Array.isArray(this._rawValue)) {
267-
return !!this._rawValue.find(value => toggle.value != null && value === toggle.value);
267+
const correspondingOption = this._rawValue.find(value =>
268+
toggle.value != null && value === toggle.value
269+
);
270+
271+
return typeof correspondingOption !== 'undefined';
268272
}
269273

270274
return toggle.value === this._rawValue;
@@ -303,7 +307,7 @@ export class MatButtonToggleGroup extends _MatButtonToggleGroupMixinBase impleme
303307
return toggle.value != null && toggle.value === value;
304308
});
305309

306-
if (correspondingOption) {
310+
if (typeof correspondingOption !== 'undefined') {
307311
correspondingOption.checked = true;
308312
this._selectionModel.select(correspondingOption);
309313
}

0 commit comments

Comments
 (0)