@@ -96,8 +96,6 @@ describe('MatButtonToggle with forms', () => {
96
96
innerButtons = buttonToggleDebugElements . map (
97
97
debugEl => debugEl . query ( By . css ( 'button' ) ) ! . nativeElement ,
98
98
) ;
99
-
100
- fixture . detectChanges ( ) ;
101
99
} ) ;
102
100
103
101
it ( 'should update the model before firing change event' , fakeAsync ( ( ) => {
@@ -312,6 +310,18 @@ describe('MatButtonToggle with forms', () => {
312
310
313
311
expect ( instance . toggles . map ( t => t . checked ) ) . toEqual ( [ true , false , false ] ) ;
314
312
} ) ;
313
+
314
+ it ( 'should set the initial tabindex when using ngModel with a static list of options where none match the value' , fakeAsync ( ( ) => {
315
+ const fixture = TestBed . createComponent ( ButtonToggleGroupWithNgModelAndStaticOptions ) ;
316
+ fixture . detectChanges ( ) ;
317
+ tick ( ) ;
318
+ const indexes = Array . from (
319
+ fixture . nativeElement . querySelectorAll ( 'button' ) ,
320
+ ( button : HTMLElement ) => button . getAttribute ( 'tabindex' ) ,
321
+ ) ;
322
+
323
+ expect ( indexes ) . toEqual ( [ '0' , '-1' , '-1' ] ) ;
324
+ } ) ) ;
315
325
} ) ;
316
326
317
327
describe ( 'MatButtonToggle without forms' , ( ) => {
@@ -341,7 +351,7 @@ describe('MatButtonToggle without forms', () => {
341
351
let groupNativeElement : HTMLElement ;
342
352
let buttonToggleDebugElements : DebugElement [ ] ;
343
353
let buttonToggleNativeElements : HTMLElement [ ] ;
344
- let buttonToggleLabelElements : HTMLLabelElement [ ] ;
354
+ let innerButtons : HTMLLabelElement [ ] ;
345
355
let groupInstance : MatButtonToggleGroup ;
346
356
let buttonToggleInstances : MatButtonToggle [ ] ;
347
357
let testComponent : ButtonTogglesInsideButtonToggleGroup ;
@@ -360,34 +370,28 @@ describe('MatButtonToggle without forms', () => {
360
370
361
371
buttonToggleNativeElements = buttonToggleDebugElements . map ( debugEl => debugEl . nativeElement ) ;
362
372
363
- buttonToggleLabelElements = fixture . debugElement
373
+ innerButtons = fixture . debugElement
364
374
. queryAll ( By . css ( 'button' ) )
365
375
. map ( debugEl => debugEl . nativeElement ) ;
366
376
367
377
buttonToggleInstances = buttonToggleDebugElements . map ( debugEl => debugEl . componentInstance ) ;
368
378
} ) ;
369
379
370
380
it ( 'should initialize the tab index correctly' , ( ) => {
371
- buttonToggleLabelElements . forEach ( ( buttonToggle , index ) => {
372
- if ( index === 0 ) {
373
- expect ( buttonToggle . getAttribute ( 'tabindex' ) ) . toBe ( '0' ) ;
374
- } else {
375
- expect ( buttonToggle . getAttribute ( 'tabindex' ) ) . toBe ( '-1' ) ;
376
- }
377
- } ) ;
381
+ expect ( innerButtons . map ( b => b . getAttribute ( 'tabindex' ) ) ) . toEqual ( [ '0' , '-1' , '-1' ] ) ;
378
382
} ) ;
379
383
380
384
it ( 'should update the tab index correctly' , ( ) => {
381
- buttonToggleLabelElements [ 1 ] . click ( ) ;
385
+ innerButtons [ 1 ] . click ( ) ;
382
386
fixture . detectChanges ( ) ;
383
387
384
- expect ( buttonToggleLabelElements [ 0 ] . getAttribute ( 'tabindex' ) ) . toBe ( '-1' ) ;
385
- expect ( buttonToggleLabelElements [ 1 ] . getAttribute ( 'tabindex' ) ) . toBe ( '0' ) ;
388
+ expect ( innerButtons [ 0 ] . getAttribute ( 'tabindex' ) ) . toBe ( '-1' ) ;
389
+ expect ( innerButtons [ 1 ] . getAttribute ( 'tabindex' ) ) . toBe ( '0' ) ;
386
390
} ) ;
387
391
388
392
it ( 'should set individual button toggle names based on the group name' , ( ) => {
389
393
expect ( groupInstance . name ) . toBeTruthy ( ) ;
390
- for ( let buttonToggle of buttonToggleLabelElements ) {
394
+ for ( let buttonToggle of innerButtons ) {
391
395
expect ( buttonToggle . getAttribute ( 'name' ) ) . toBe ( groupInstance . name ) ;
392
396
}
393
397
} ) ;
@@ -407,7 +411,7 @@ describe('MatButtonToggle without forms', () => {
407
411
408
412
expect ( buttonToggleInstances [ 0 ] . disabled ) . toBe ( false ) ;
409
413
410
- buttonToggleLabelElements [ 0 ] . click ( ) ;
414
+ innerButtons [ 0 ] . click ( ) ;
411
415
fixture . detectChanges ( ) ;
412
416
413
417
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
@@ -456,7 +460,7 @@ describe('MatButtonToggle without forms', () => {
456
460
457
461
it ( 'should update the group value when one of the toggles changes' , ( ) => {
458
462
expect ( groupInstance . value ) . toBeFalsy ( ) ;
459
- buttonToggleLabelElements [ 0 ] . click ( ) ;
463
+ innerButtons [ 0 ] . click ( ) ;
460
464
fixture . detectChanges ( ) ;
461
465
462
466
expect ( groupInstance . value ) . toBe ( 'test1' ) ;
@@ -465,7 +469,7 @@ describe('MatButtonToggle without forms', () => {
465
469
466
470
it ( 'should propagate the value change back up via a two-way binding' , ( ) => {
467
471
expect ( groupInstance . value ) . toBeFalsy ( ) ;
468
- buttonToggleLabelElements [ 0 ] . click ( ) ;
472
+ innerButtons [ 0 ] . click ( ) ;
469
473
fixture . detectChanges ( ) ;
470
474
471
475
expect ( groupInstance . value ) . toBe ( 'test1' ) ;
@@ -474,15 +478,15 @@ describe('MatButtonToggle without forms', () => {
474
478
475
479
it ( 'should update the group and toggles when one of the button toggles is clicked' , ( ) => {
476
480
expect ( groupInstance . value ) . toBeFalsy ( ) ;
477
- buttonToggleLabelElements [ 0 ] . click ( ) ;
481
+ innerButtons [ 0 ] . click ( ) ;
478
482
fixture . detectChanges ( ) ;
479
483
480
484
expect ( groupInstance . value ) . toBe ( 'test1' ) ;
481
485
expect ( groupInstance . selected ) . toBe ( buttonToggleInstances [ 0 ] ) ;
482
486
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
483
487
expect ( buttonToggleInstances [ 1 ] . checked ) . toBe ( false ) ;
484
488
485
- buttonToggleLabelElements [ 1 ] . click ( ) ;
489
+ innerButtons [ 1 ] . click ( ) ;
486
490
fixture . detectChanges ( ) ;
487
491
488
492
expect ( groupInstance . value ) . toBe ( 'test2' ) ;
@@ -492,7 +496,7 @@ describe('MatButtonToggle without forms', () => {
492
496
} ) ;
493
497
494
498
it ( 'should check a button toggle upon interaction with underlying native radio button' , ( ) => {
495
- buttonToggleLabelElements [ 0 ] . click ( ) ;
499
+ innerButtons [ 0 ] . click ( ) ;
496
500
fixture . detectChanges ( ) ;
497
501
498
502
expect ( buttonToggleInstances [ 0 ] . checked ) . toBe ( true ) ;
@@ -515,12 +519,12 @@ describe('MatButtonToggle without forms', () => {
515
519
const changeSpy = jasmine . createSpy ( 'button-toggle change listener' ) ;
516
520
buttonToggleInstances [ 0 ] . change . subscribe ( changeSpy ) ;
517
521
518
- buttonToggleLabelElements [ 0 ] . click ( ) ;
522
+ innerButtons [ 0 ] . click ( ) ;
519
523
fixture . detectChanges ( ) ;
520
524
tick ( ) ;
521
525
expect ( changeSpy ) . toHaveBeenCalledTimes ( 1 ) ;
522
526
523
- buttonToggleLabelElements [ 0 ] . click ( ) ;
527
+ innerButtons [ 0 ] . click ( ) ;
524
528
fixture . detectChanges ( ) ;
525
529
tick ( ) ;
526
530
@@ -534,12 +538,12 @@ describe('MatButtonToggle without forms', () => {
534
538
const changeSpy = jasmine . createSpy ( 'button-toggle-group change listener' ) ;
535
539
groupInstance . change . subscribe ( changeSpy ) ;
536
540
537
- buttonToggleLabelElements [ 0 ] . click ( ) ;
541
+ innerButtons [ 0 ] . click ( ) ;
538
542
fixture . detectChanges ( ) ;
539
543
tick ( ) ;
540
544
expect ( changeSpy ) . toHaveBeenCalled ( ) ;
541
545
542
- buttonToggleLabelElements [ 1 ] . click ( ) ;
546
+ innerButtons [ 1 ] . click ( ) ;
543
547
fixture . detectChanges ( ) ;
544
548
tick ( ) ;
545
549
expect ( changeSpy ) . toHaveBeenCalledTimes ( 2 ) ;
@@ -579,7 +583,7 @@ describe('MatButtonToggle without forms', () => {
579
583
580
584
it ( 'should update the model if a selected toggle is removed' , fakeAsync ( ( ) => {
581
585
expect ( groupInstance . value ) . toBeFalsy ( ) ;
582
- buttonToggleLabelElements [ 0 ] . click ( ) ;
586
+ innerButtons [ 0 ] . click ( ) ;
583
587
fixture . detectChanges ( ) ;
584
588
585
589
expect ( groupInstance . value ) . toBe ( 'test1' ) ;
@@ -595,7 +599,7 @@ describe('MatButtonToggle without forms', () => {
595
599
} ) ) ;
596
600
597
601
it ( 'should show checkmark indicator by default' , ( ) => {
598
- buttonToggleLabelElements [ 0 ] . click ( ) ;
602
+ innerButtons [ 0 ] . click ( ) ;
599
603
fixture . detectChanges ( ) ;
600
604
601
605
expect (
@@ -1310,3 +1314,18 @@ class ButtonToggleGroupWithFormControlAndDynamicButtons {
1310
1314
control = new FormControl ( '' ) ;
1311
1315
values = [ 'a' , 'b' , 'c' ] ;
1312
1316
}
1317
+
1318
+ @Component ( {
1319
+ template : `
1320
+ <mat-button-toggle-group [(ngModel)]="value">
1321
+ <mat-button-toggle value="1">One</mat-button-toggle>
1322
+ <mat-button-toggle value="2">Two</mat-button-toggle>
1323
+ <mat-button-toggle value="3">Three</mat-button-toggle>
1324
+ </mat-button-toggle-group>
1325
+ ` ,
1326
+ standalone : true ,
1327
+ imports : [ MatButtonToggleModule , FormsModule ] ,
1328
+ } )
1329
+ class ButtonToggleGroupWithNgModelAndStaticOptions {
1330
+ value = '' ;
1331
+ }
0 commit comments