Skip to content

Commit e086700

Browse files
fix(uiSrefActive): Support multiple active classes
Closes #198
1 parent ce80a71 commit e086700

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

src/directives/uiSrefActive.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ import { Subscription } from 'rxjs/Subscription';
8787
export class UISrefActive {
8888

8989
private _classes: string[] = [];
90-
@Input('uiSrefActive') set active(val: string) { this._classes = val.split('\s+')};
90+
@Input('uiSrefActive') set active(val: string) { this._classes = val.split(/\s+/)};
9191

9292
private _classesEq: string[] = [];
93-
@Input('uiSrefActiveEq') set activeEq(val: string) { this._classesEq = val.split('\s+')};
93+
@Input('uiSrefActiveEq') set activeEq(val: string) { this._classesEq = val.split(/\s+/)};
9494

9595
private _subscription: Subscription;
9696
constructor(uiSrefStatus: UISrefStatus, rnd: Renderer, @Host() host: ElementRef) {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { Component, DebugElement } from '@angular/core';
2+
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
3+
import { By } from '@angular/platform-browser';
4+
5+
import { UIRouter } from '@uirouter/core';
6+
import { UIRouterModule } from '../../src/uiRouterNgModule';
7+
import { UISrefActive } from '../../src';
8+
9+
describe('uiSrefActive', () => {
10+
const tick = () => new Promise(resolve => setTimeout(resolve));
11+
12+
const initialize = (Component, states) => {
13+
const fixture = TestBed.configureTestingModule({
14+
declarations: [Component],
15+
imports: [UIRouterModule.forRoot({ useHash: true, states })]
16+
}).createComponent(Component);
17+
fixture.detectChanges();
18+
19+
return fixture;
20+
};
21+
22+
describe('with a simple class', () => {
23+
@Component({ template: `<a uiSref="statea" uiSrefActive="active">State A</a>` })
24+
class TestComponent { }
25+
let fixture: ComponentFixture<TestComponent>;
26+
beforeEach(() => fixture = initialize(TestComponent, [{ name: 'statea' }]));
27+
28+
it('does not apply the class when the link is active', () => {
29+
const des = fixture.debugElement.queryAll(By.directive(UISrefActive));
30+
expect(des[0].nativeElement.classList.length).toBe(0);
31+
});
32+
33+
it('applies the class when the link is active', async(() => {
34+
const des = fixture.debugElement.queryAll(By.directive(UISrefActive));
35+
const router = fixture.debugElement.injector.get(UIRouter);
36+
router.stateService.go('statea').then(tick).then(() => {
37+
const classList = des[0].nativeElement.classList;
38+
expect(classList.length).toBe(1);
39+
expect(classList).toContain('active');
40+
});
41+
}));
42+
});
43+
44+
describe('with multiple classes', () => {
45+
const activeClasses = ['active', 'active2'];
46+
47+
@Component({ template: `<a uiSref="statea" uiSrefActive="${activeClasses.join(' ')}">State A</a>` })
48+
class TestComponent { }
49+
let fixture: ComponentFixture<TestComponent>;
50+
beforeEach(() => fixture = initialize(TestComponent, [{ name: 'statea' }]));
51+
52+
it('applies all classses when the link is active', async(() => {
53+
const des = fixture.debugElement.queryAll(By.directive(UISrefActive));
54+
const router = fixture.debugElement.injector.get(UIRouter);
55+
router.stateService.go('statea').then(tick).then(() => {
56+
let classList = des[0].nativeElement.classList;
57+
expect(classList).toContain(activeClasses[0]);
58+
expect(classList).toContain(activeClasses[1]);
59+
});
60+
}));
61+
});
62+
});
63+

0 commit comments

Comments
 (0)