From f4dd809a9314896ac5d7c0b28d78f6cc55fcc3db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Farkas=20J=C3=B3zsef?= Date: Thu, 15 Dec 2016 23:17:09 +0100 Subject: [PATCH] Keymap and macro redirection handling Closes #174 --- src/app.module.ts | 7 ++++- src/components/keymap/edit/index.ts | 2 ++ .../keymap/edit/keymap-edit-guard.service.ts | 30 +++++++++++++++++++ src/components/keymap/keymap.routes.ts | 5 ++-- src/components/macro/macro.routes.ts | 5 ++-- src/components/macro/not-found/index.ts | 3 +- .../macro-not-found-guard.service.ts | 30 +++++++++++++++++++ 7 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 src/components/keymap/edit/index.ts create mode 100644 src/components/keymap/edit/keymap-edit-guard.service.ts create mode 100644 src/components/macro/not-found/macro-not-found-guard.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index ea2ed124..d7e404aa 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -68,6 +68,9 @@ import { KeymapEffects, MacroEffects } from './store/effects'; import { keymapReducer, macroReducer, presetReducer } from './store/reducers'; import { DataStorage } from './store/storage'; +import { KeymapEditGuard } from './components/keymap/edit'; +import { MacroNotFoundGuard } from './components/macro/not-found'; + // Create DataStorage dependency injection const storageProvider = ReflectiveInjector.resolve([DataStorage]); const storageInjector = ReflectiveInjector.fromResolvedProviders(storageProvider); @@ -149,7 +152,9 @@ const storeConfig = { ], providers: [ MapperService, - appRoutingProviders + appRoutingProviders, + KeymapEditGuard, + MacroNotFoundGuard ], bootstrap: [MainAppComponent] }) diff --git a/src/components/keymap/edit/index.ts b/src/components/keymap/edit/index.ts new file mode 100644 index 00000000..3eefad50 --- /dev/null +++ b/src/components/keymap/edit/index.ts @@ -0,0 +1,2 @@ +export { KeymapEditComponent } from './keymap-edit.component'; +export { KeymapEditGuard } from './keymap-edit-guard.service'; diff --git a/src/components/keymap/edit/keymap-edit-guard.service.ts b/src/components/keymap/edit/keymap-edit-guard.service.ts new file mode 100644 index 00000000..a16e5857 --- /dev/null +++ b/src/components/keymap/edit/keymap-edit-guard.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, Router } from '@angular/router'; + +import { Observable } from 'rxjs/Observable'; + +import 'rxjs/add/observable/of'; +import 'rxjs/add/operator/do'; +import 'rxjs/add/operator/let'; +import 'rxjs/add/operator/switchMap'; + +import { Store } from '@ngrx/store'; + +import { AppState } from '../../../store/index'; +import { getKeymapEntities } from '../../../store/reducers'; + +@Injectable() +export class KeymapEditGuard implements CanActivate { + + constructor(private store: Store, private router: Router) { } + + canActivate(): Observable { + return this.store + .let(getKeymapEntities()) + .do(keymaps => { + const defaultKeymap = keymaps.find(keymap => keymap.isDefault); + this.router.navigate(['/keymap', defaultKeymap.abbreviation]); + }) + .switchMap(() => Observable.of(false)); + } +} diff --git a/src/components/keymap/keymap.routes.ts b/src/components/keymap/keymap.routes.ts index 396a63e9..ae341834 100644 --- a/src/components/keymap/keymap.routes.ts +++ b/src/components/keymap/keymap.routes.ts @@ -1,7 +1,7 @@ import { Routes } from '@angular/router'; import { KeymapAddComponent } from './add/keymap-add.component'; -import { KeymapEditComponent } from './edit/keymap-edit.component'; +import { KeymapEditComponent, KeymapEditGuard } from './edit'; export const keymapRoutes: Routes = [ { @@ -11,7 +11,8 @@ export const keymapRoutes: Routes = [ }, { path: 'keymap', - component: KeymapEditComponent + component: KeymapEditComponent, + canActivate: [KeymapEditGuard] }, { path: 'keymap/add', diff --git a/src/components/macro/macro.routes.ts b/src/components/macro/macro.routes.ts index fb724044..fe36d850 100644 --- a/src/components/macro/macro.routes.ts +++ b/src/components/macro/macro.routes.ts @@ -1,12 +1,13 @@ import { Routes } from '@angular/router'; import { MacroEditComponent } from './edit/macro-edit.component'; -import { MacroNotFoundComponent } from './not-found'; +import { MacroNotFoundComponent, MacroNotFoundGuard } from './not-found'; export const macroRoutes: Routes = [ { path: 'macro', - component: MacroNotFoundComponent + component: MacroNotFoundComponent, + canActivate: [MacroNotFoundGuard] }, { path: 'macro/:id', diff --git a/src/components/macro/not-found/index.ts b/src/components/macro/not-found/index.ts index 94b462df..3b75e8a3 100644 --- a/src/components/macro/not-found/index.ts +++ b/src/components/macro/not-found/index.ts @@ -1 +1,2 @@ -export { MacroNotFoundComponent} from './macro-not-found.component'; +export { MacroNotFoundComponent } from './macro-not-found.component'; +export { MacroNotFoundGuard } from './macro-not-found-guard.service'; diff --git a/src/components/macro/not-found/macro-not-found-guard.service.ts b/src/components/macro/not-found/macro-not-found-guard.service.ts new file mode 100644 index 00000000..cf365a7c --- /dev/null +++ b/src/components/macro/not-found/macro-not-found-guard.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { CanActivate, Router } from '@angular/router'; + +import { Observable } from 'rxjs/Observable'; + +import 'rxjs/add/operator/let'; +import 'rxjs/add/operator/map'; + +import { Store } from '@ngrx/store'; + +import { AppState } from '../../../store/index'; +import { getMacroEntities } from '../../../store/reducers'; + +@Injectable() +export class MacroNotFoundGuard implements CanActivate { + + constructor(private store: Store, private router: Router) { } + + canActivate(): Observable { + return this.store + .let(getMacroEntities()) + .map(macros => { + const hasMacros = macros.length > 0; + if (hasMacros) { + this.router.navigate(['/macro', macros[0].id]); + } + return !hasMacros; + }); + } +}