Skip to content
This repository was archived by the owner on Oct 1, 2018. It is now read-only.

Commit 8efcfe3

Browse files
authored
Merge branch 'master' into master
2 parents 83b5b00 + 512689e commit 8efcfe3

File tree

7 files changed

+84
-28
lines changed

7 files changed

+84
-28
lines changed

src/app/app.component.html

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@
44
</header>
55
<main>
66
<mat-sidenav-container>
7-
<mat-sidenav #sidenav role="navigation">
7+
<mat-sidenav #sidenav
8+
role="navigation">
89
<mat-nav-list (click)="sidenav.toggle()">
9-
<a *ngFor="let menu of menus" mat-list-item routerLinkActive="active" [routerLinkActiveOptions]="menu.options" [routerLink]="menu.link">
10+
<a *ngFor="let menu of menus"
11+
mat-list-item
12+
routerLinkActive="active"
13+
[routerLinkActiveOptions]="menu.options"
14+
[routerLink]="menu.link"
15+
(click)="shouldOpenChildMenu(menu.title)">
1016
{{menu.title}}
1117
</a>
1218
</mat-nav-list>

src/app/app.component.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
} from '@angular/router';
88
import { filter, map, mergeMap } from 'rxjs/operators';
99
import { SeoService, SeoData } from './core/services/seo.service';
10+
import { OperatorMenuService } from './core/services/operator-menu.service';
1011

1112
interface Menu {
1213
title: string;
@@ -46,7 +47,8 @@ export class AppComponent implements OnInit {
4647
constructor(
4748
private _router: Router,
4849
private _activatedRoute: ActivatedRoute,
49-
private _seo: SeoService
50+
private _seo: SeoService,
51+
private _operatorMenuService: OperatorMenuService
5052
) {}
5153

5254
ngOnInit() {
@@ -66,4 +68,11 @@ export class AppComponent implements OnInit {
6668
)
6769
.subscribe((data: SeoData) => this._seo.setHeaders(data));
6870
}
71+
72+
shouldOpenChildMenu(title: string) {
73+
// for accessibility we need to ensure child menu is open when clicked
74+
if (title === 'Operators') {
75+
this._operatorMenuService.openOperatorMenu();
76+
}
77+
}
6978
}

src/app/core/core.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { FlexLayoutModule } from '@angular/flex-layout';
55

66
import { CopierService } from './services/copier.service';
77
import { SeoService } from './services/seo.service';
8+
import { OperatorMenuService } from './services/operator-menu.service';
89
import { ToolbarComponent } from './components/toolbar/toolbar.component';
910
import { MaterialModule } from '../material/material.module';
1011

@@ -17,7 +18,7 @@ export class CoreModule {
1718
static forRoot() {
1819
return {
1920
ngModule: CoreModule,
20-
providers: [CopierService, SeoService]
21+
providers: [CopierService, SeoService, OperatorMenuService]
2122
};
2223
}
2324
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Injectable } from '@angular/core';
2+
import { Subject } from 'rxjs/Subject';
3+
4+
@Injectable()
5+
export class OperatorMenuService {
6+
private _operatorMenuStatus = new Subject<boolean>();
7+
8+
openOperatorMenu() {
9+
this._operatorMenuStatus.next(true);
10+
}
11+
12+
closeOperatorMenu() {
13+
this._operatorMenuStatus.next(false);
14+
}
15+
16+
menuStatus() {
17+
return this._operatorMenuStatus.asObservable();
18+
}
19+
}
Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,29 @@
1-
<mat-sidenav-container
2-
class="operator-container">
3-
<mat-sidenav
4-
[mode]="sidenavMode"
5-
[opened]="!smallScreen"
6-
[fixedTopGap]="operatorMenuGap"
7-
[fixedInViewport]="true"
8-
class="operator-list-sidenav"
9-
#operatorSidenav>
10-
<mat-nav-list *ngFor="let category of categories" class="operator-list">
11-
<h3 mat-subheader class="category-subheader">{{ category }}</h3>
1+
<mat-sidenav-container class="operator-container">
2+
<mat-sidenav [mode]="sidenavMode"
3+
[opened]="!smallScreen"
4+
[fixedTopGap]="operatorMenuGap"
5+
[fixedInViewport]="true"
6+
class="operator-list-sidenav"
7+
#operatorSidenav>
8+
<mat-nav-list *ngFor="let category of categories"
9+
class="operator-list">
10+
<h3 mat-subheader
11+
class="category-subheader">{{ category }}</h3>
1212
<a mat-list-item
13-
*ngFor="let operator of groupedOperators[category]"
14-
[routerLink]="['/operators', operator.name]"
15-
routerLinkActive="active">
13+
*ngFor="let operator of groupedOperators[category]"
14+
[routerLink]="['/operators', operator.name]"
15+
routerLinkActive="active">
1616
{{ operator.name }}
1717
</a>
1818
</mat-nav-list>
1919
</mat-sidenav>
2020
<router-outlet></router-outlet>
2121
</mat-sidenav-container>
22-
<button
23-
*ngIf="smallScreen"
24-
mat-mini-fab
25-
color="primary"
26-
class="sidenav-toggle"
27-
[@growInOut]="'in'"
28-
(click)="operatorSidenav.toggle()">
22+
<button *ngIf="smallScreen"
23+
mat-mini-fab
24+
color="primary"
25+
class="sidenav-toggle"
26+
[@growInOut]="'in'"
27+
(click)="operatorSidenav.toggle()">
2928
<mat-icon>view_list</mat-icon>
3029
</button>
31-

src/app/operators/operators.component.ts

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ import {
33
Inject,
44
InjectionToken,
55
OnInit,
6-
ChangeDetectionStrategy
6+
OnDestroy,
7+
AfterContentInit,
8+
ChangeDetectionStrategy,
9+
ViewChild
710
} from '@angular/core';
811
import {
912
trigger,
@@ -14,9 +17,13 @@ import {
1417
} from '@angular/animations';
1518
import { Router, ActivatedRoute } from '@angular/router';
1619
import { BreakpointObserver } from '@angular/cdk/layout';
20+
import { MatSidenav } from '@angular/material';
1721
import { Subscription } from 'rxjs/Subscription';
22+
import { Subject } from 'rxjs/Subject';
1823
import { Observable } from 'rxjs/Observable';
24+
import { filter, takeUntil } from 'rxjs/operators';
1925
import { OperatorDoc } from '../../operator-docs/operator.model';
26+
import { OperatorMenuService } from '../core/services/operator-menu.service';
2027

2128
const OPERATOR_MENU_GAP_LARGE = 64;
2229
const OPERATOR_MENU_GAP_SMALL = 54;
@@ -53,12 +60,15 @@ interface OperatorDocMap {
5360
])
5461
]
5562
})
56-
export class OperatorsComponent implements OnInit {
63+
export class OperatorsComponent implements OnInit, AfterContentInit, OnDestroy {
64+
@ViewChild(MatSidenav) _sidenav: MatSidenav;
5765
public groupedOperators: OperatorDocMap;
5866
public categories: string[];
67+
private _onDestroy = new Subject();
5968

6069
constructor(
6170
private _breakpointObserver: BreakpointObserver,
71+
private _operatorMenuService: OperatorMenuService,
6272
@Inject(OPERATORS_TOKEN) public operators: OperatorDoc[]
6373
) {}
6474

@@ -67,6 +77,13 @@ export class OperatorsComponent implements OnInit {
6777
this.categories = Object.keys(this.groupedOperators);
6878
}
6979

80+
ngAfterContentInit() {
81+
this._operatorMenuService
82+
.menuStatus()
83+
.pipe(filter(s => !!s), takeUntil(this._onDestroy))
84+
.subscribe(_ => this._sidenav.open());
85+
}
86+
7087
get extraSmallScreen() {
7188
return this._breakpointObserver.isMatched('(max-width: 601px)');
7289
}
@@ -84,6 +101,10 @@ export class OperatorsComponent implements OnInit {
84101
get sidenavMode() {
85102
return this.smallScreen ? 'over' : 'side';
86103
}
104+
105+
ngOnDestroy() {
106+
this._onDestroy.next();
107+
}
87108
}
88109

89110
export function groupOperatorsByType(operators: OperatorDoc[]): OperatorDocMap {

src/app/operators/specs/operators.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
groupOperatorsByType
1111
} from '../operators.component';
1212
import { OperatorDoc } from '../../../operator-docs';
13+
import { OperatorMenuService } from '../../core/services/operator-menu.service';
1314

1415
const mockActivatedRoute = {
1516
snapshot: {},
@@ -41,6 +42,7 @@ describe('Operators', () => {
4142
imports: [RouterTestingModule, LayoutModule],
4243
declarations: [OperatorsComponent],
4344
providers: [
45+
OperatorMenuService,
4446
{ provide: OPERATORS_TOKEN, useValue: mockOperators },
4547
{ provide: ActivatedRoute, useValue: mockActivatedRoute }
4648
],

0 commit comments

Comments
 (0)