Skip to content

Commit 0b5806b

Browse files
josephperrottjelbourn
authored andcommitted
fix(tab-link): preventDefault action when disabled tab link is clicked. (#9357)
1 parent 0d233b2 commit 0b5806b

File tree

4 files changed

+34
-3
lines changed

4 files changed

+34
-3
lines changed

src/lib/tabs/_tabs-common.scss

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ $mat-tab-animation-duration: 500ms !default;
1919

2020
&:focus {
2121
outline: none;
22-
opacity: 1;
22+
23+
&:not(.mat-tab-disabled) {
24+
opacity: 1;
25+
}
2326
}
2427

2528
&.mat-tab-disabled {

src/lib/tabs/_tabs-theme.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@
8383
}
8484

8585
@mixin _mat-tab-label-focus($tab-focus-color) {
86-
.mat-tab-label:focus, .mat-tab-link:focus {
86+
.mat-tab-label:not(.mat-tab-disabled):focus,
87+
.mat-tab-link:not(.mat-tab-disabled):focus {
8788
background-color: mat-color($tab-focus-color, lighter, 0.3);
8889
}
8990
}

src/lib/tabs/tab-nav-bar/tab-nav-bar.spec.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {async, ComponentFixture, fakeAsync, TestBed, tick} from '@angular/core/testing';
22
import {Component, ViewChild} from '@angular/core';
33
import {By} from '@angular/platform-browser';
4-
import {dispatchFakeEvent, dispatchMouseEvent} from '@angular/cdk/testing';
4+
import {dispatchFakeEvent, dispatchMouseEvent, createMouseEvent} from '@angular/cdk/testing';
55
import {Direction, Directionality} from '@angular/cdk/bidi';
66
import {Subject} from 'rxjs/Subject';
77
import {MatTabLink, MatTabNav, MatTabsModule} from '../index';
@@ -125,6 +125,23 @@ describe('MatTabNavBar', () => {
125125
.toBe(true, 'Expected element to no longer be keyboard focusable if disabled.');
126126
});
127127

128+
it('should prevent default action for clicks if links are disabled', () => {
129+
const tabLinkElement = fixture.debugElement.query(By.css('a')).nativeElement;
130+
131+
const mouseEvent = createMouseEvent('click');
132+
spyOn(mouseEvent, 'preventDefault');
133+
tabLinkElement.dispatchEvent(mouseEvent);
134+
expect(mouseEvent.preventDefault).not.toHaveBeenCalled();
135+
136+
fixture.componentInstance.disabled = true;
137+
fixture.detectChanges();
138+
139+
const mouseEventWhileDisabled = createMouseEvent('click');
140+
spyOn(mouseEventWhileDisabled, 'preventDefault');
141+
tabLinkElement.dispatchEvent(mouseEventWhileDisabled);
142+
expect(mouseEventWhileDisabled.preventDefault).toHaveBeenCalled();
143+
});
144+
128145
it('should show ripples for tab links', () => {
129146
const tabLink = fixture.debugElement.nativeElement.querySelector('.mat-tab-link');
130147

src/lib/tabs/tab-nav-bar/tab-nav-bar.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ export const _MatTabLinkMixinBase =
189189
'[attr.tabIndex]': 'tabIndex',
190190
'[class.mat-tab-disabled]': 'disabled',
191191
'[class.mat-tab-label-active]': 'active',
192+
'(click)': '_handleClick($event)'
192193
}
193194
})
194195
export class MatTabLink extends _MatTabLinkMixinBase
@@ -245,4 +246,13 @@ export class MatTabLink extends _MatTabLinkMixinBase
245246
ngOnDestroy() {
246247
this._tabLinkRipple._removeTriggerEvents();
247248
}
249+
250+
/**
251+
* Handles the click event, preventing default navigation if the tab link is disabled.
252+
*/
253+
_handleClick(event: MouseEvent) {
254+
if (this.disabled) {
255+
event.preventDefault();
256+
}
257+
}
248258
}

0 commit comments

Comments
 (0)