@genesislcap/blank-app-seed 3.27.2 → 3.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/.genx/configure.js +7 -2
  2. package/.genx/package.json +1 -1
  3. package/.genx/templates/angular/chart.hbs +15 -20
  4. package/.genx/templates/angular/component/component.hbs +4 -2
  5. package/.genx/templates/angular/route.template.hbs +9 -3
  6. package/.genx/templates/angular/tabsPanel.hbs +5 -0
  7. package/.genx/utils/formatRouteData.js +6 -3
  8. package/.genx/utils/registerPartials.js +10 -1
  9. package/.genx/versions.json +2 -2
  10. package/.gitignore +4 -0
  11. package/CHANGELOG.md +14 -0
  12. package/client-tmp/angular/angular.json +2 -1
  13. package/client-tmp/angular/globals.d.ts +1 -0
  14. package/client-tmp/angular/package.json +26 -8
  15. package/client-tmp/angular/src/app/app.component.ts +45 -6
  16. package/client-tmp/angular/src/app/app.config.ts +0 -13
  17. package/client-tmp/angular/src/app/app.module.ts +17 -4
  18. package/client-tmp/angular/src/app/guards/auth.guard.ts +5 -12
  19. package/client-tmp/angular/src/app/guards/chained.guard.ts +33 -0
  20. package/client-tmp/angular/src/app/guards/connection.guard.ts +21 -0
  21. package/client-tmp/angular/src/app/guards/permissions.guard.ts +6 -8
  22. package/client-tmp/angular/src/app/layouts/base.layout.ts +1 -5
  23. package/client-tmp/angular/src/app/layouts/default/default.layout.css +1 -0
  24. package/client-tmp/angular/src/app/layouts/default/default.layout.html +5 -6
  25. package/client-tmp/angular/src/app/layouts/default/default.layout.ts +9 -4
  26. package/client-tmp/angular/src/app/services/route.service.ts +95 -0
  27. package/client-tmp/angular/src/app/share/foundation-login.ts +5 -3
  28. package/client-tmp/angular/src/app/share/genesis-components.ts +48 -21
  29. package/client-tmp/angular/src/app/store/index.ts +1 -0
  30. package/client-tmp/angular/src/app/store/store.ts +34 -0
  31. package/client-tmp/angular/src/declaration.d.ts +7 -1
  32. package/client-tmp/angular/src/environments/environment.prod.ts +1 -0
  33. package/client-tmp/angular/src/environments/environment.ts +2 -1
  34. package/client-tmp/angular/src/main.ts +14 -3
  35. package/client-tmp/angular/src/pbc/README.md +7 -0
  36. package/client-tmp/angular/src/pbc/container.ts +40 -0
  37. package/client-tmp/angular/src/pbc/elementsRenderer.ts +57 -0
  38. package/client-tmp/angular/src/pbc/utils.ts +121 -0
  39. package/client-tmp/angular/tsconfig.app.json +2 -1
  40. package/client-tmp/angular/tsconfig.spec.json +3 -2
  41. package/client-tmp/angular/webpack.shared.config.js +17 -4
  42. package/package.json +1 -1
  43. package/client-tmp/angular/src/app/app-routing.module.ts +0 -40
  44. package/client-tmp/angular/src/app/services/auth.service.ts +0 -22
  45. package/client-tmp/angular/src/app/types/menu.ts +0 -8
@@ -21,8 +21,13 @@ module.exports = async (data, utils) => {
21
21
  data.versions = versions;
22
22
 
23
23
  registerPartials(utils, data.framework);
24
-
25
- data.routes = data.routes.filter(validateRoute).map(formatRouteData);
24
+ const formatRouteDataForFramework = formatRouteData.bind(
25
+ this,
26
+ data.framework,
27
+ );
28
+ data.routes = data.routes
29
+ .filter(validateRoute)
30
+ .map(formatRouteDataForFramework);
26
31
 
27
32
  const FDC3EventHandlersEnabled = data.routes.find(
28
33
  (route) => route.FDC3EventHandlersEnabled,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/blank-app-seed-config",
3
3
  "description": "Genesis Blank App Seed Configuration",
4
- "version": "3.27.2",
4
+ "version": "3.28.0",
5
5
  "license": "Apache-2.0",
6
6
  "scripts": {
7
7
  "lint": "eslint .",
@@ -1,21 +1,16 @@
1
- <section style="height: 100%; width: 100%;">
2
- <ng-container *ngIf="hasUserPermission('{{config.permissions.viewRight}}'); else notPermitted{{ config.index }}">
3
- <rapid-g2plot-chart
4
- type="{{ config.type }}"
5
- [config]="chartConfig"
6
- >
7
- <chart-datasource
8
- resourceName="{{ config.resourceName }}"
9
- server-fields="{{ config.xField }} {{ config.yField }}"
10
- ></chart-datasource>
11
- </rapid-g2plot-chart>
12
- </ng-container>
1
+ <rapid-g2plot-chart
2
+ type="{{ config.type }}"
3
+ [config]="chartConfig"
4
+ [ngStyle]="hasUserPermission('{{config.permissions.viewRight}}') ? { width: '100%', height: '100%' } : { display: 'none' }"
5
+ >
6
+ <chart-datasource
7
+ resourceName="{{ config.resourceName }}"
8
+ server-fields="{{ config.xField }} {{ config.yField }}"
9
+ ></chart-datasource>
10
+ </rapid-g2plot-chart>
13
11
 
14
- <ng-template #notPermitted{{ config.index }}>
15
- <app-error-message
16
- style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;"
17
- elementType="h3"
18
- message="You do not have access to view this component.">
19
- </app-error-message>
20
- </ng-template>
21
- </section>
12
+ <app-error-message
13
+ [ngStyle]="!hasUserPermission('{{config.permissions.viewRight}}') ? { width: '100%', height: '100%', display: 'flex', 'justify-content': 'center', 'align-items': 'center' } : { display: 'none' }"
14
+ elementType="h3"
15
+ message="You do not have access to view this component.">
16
+ </app-error-message>
@@ -1,8 +1,10 @@
1
1
  import { Component, Input, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { getUser } from '@genesislcap/foundation-user';
4
- import { GridOptionsConfig } from "@genesislcap/rapid-grid-pro";
5
4
  import { getViewUpdateRightComponent } from '../../../utils';
5
+ {{#if tile.config.gridOptions}}
6
+ import { GridOptionsConfig } from "@genesislcap/rapid-grid-pro";
7
+ {{/if}}
6
8
  {{#if tile.config.createFormUiSchema}}
7
9
  import { createFormSchema } from './{{kebabCase tile.title}}.create.form.schema';
8
10
  {{/if}}
@@ -37,7 +39,7 @@ export class {{pascalCase tile.componentName}} {
37
39
  columnDefs = columnDefs;{{/if}}{{#if tile.config.gridOptions}}
38
40
  gridOptions = gridOptions as GridOptionsConfig;{{/if}}{{#if tile.config.reqrep}}
39
41
  reqrep = { pollingInterval: 5000 };{{/if}}{{#if tile.config.type}}
40
- chartConfig = { {{#ifEquals this.config.type 'pie'}}
42
+ chartConfig = { {{#ifEquals tile.config.type 'pie'}}
41
43
  "radius": 0.75,
42
44
  "angleField": "value",
43
45
  "colorField": "groupBy",{{else}}
@@ -1,7 +1,13 @@
1
1
  {{#if route.tiles}}
2
- <rapid-layout [auto-save-key]="environment.production ? '{{route.layoutKey}}' : null">
3
- {{> (lookup ./route 'layoutType') }}
4
- </rapid-layout>
2
+ <rapid-flex-layout>
3
+ <rapid-tabs>
4
+ {{#each route.tiles}}
5
+ <rapid-tab slot="tab">{{this.title}}</rapid-tab>
6
+ {{/each}}
7
+
8
+ {{> (lookup ./route 'layoutType') }}
9
+ </rapid-tabs>
10
+ </rapid-flex-layout>
5
11
  {{else}}
6
12
  <!-- insert template code here -->
7
13
  Welcome to {{sentenceCase route.name}}
@@ -0,0 +1,5 @@
1
+ {{#each route.tiles}}
2
+ <rapid-tab-panel slot="tabpanel">
3
+ <app-{{kebabCase this.componentName}}></app-{{kebabCase this.componentName}}>
4
+ </rapid-tab-panel>
5
+ {{/each}}
@@ -4,11 +4,14 @@ const {
4
4
  } = require('./gridSerializers');
5
5
  const formatJSONValue = require('./formatJSONValue');
6
6
  const getLayoutType = require('./getLayoutType');
7
- const { COMPONENT_TYPE } = require('../static');
7
+ const { COMPONENT_TYPE, FRAMEWORK_ANGULAR_ALIAS } = require('../static');
8
8
 
9
- const formatRouteData = (route) => {
9
+ const formatRouteData = (framework, route) => {
10
10
  const layoutKey = route?.layoutKey || `${route.name}_${Date.now()}`;
11
- const layoutType = route?.layoutType || getLayoutType(route);
11
+ const layoutType =
12
+ framework === FRAMEWORK_ANGULAR_ALIAS
13
+ ? 'tabs-panel'
14
+ : route?.layoutType || getLayoutType(route);
12
15
 
13
16
  const FDC3ClickCategory = 'fdc3';
14
17
  const FDC3EventHandlersEnabled = !!route.tiles?.find(
@@ -1,10 +1,19 @@
1
1
  const { resolve } = require('node:path');
2
- const { DIR_TEMPLATE_BY_FRAMEWORK } = require('../static');
2
+ const {
3
+ DIR_TEMPLATE_BY_FRAMEWORK,
4
+ FRAMEWORK_ANGULAR_ALIAS,
5
+ } = require('../static');
3
6
 
4
7
  const registerPartials = ({ registerPartial }, framework) => {
5
8
  // It can be reverted after adding changes for angular
6
9
  const sourceTemplateDir = `../${DIR_TEMPLATE_BY_FRAMEWORK[framework]}`;
7
10
 
11
+ if (framework === FRAMEWORK_ANGULAR_ALIAS) {
12
+ registerPartial(
13
+ 'tabs-panel',
14
+ resolve(__dirname, `${sourceTemplateDir}/tabsPanel.hbs`),
15
+ );
16
+ }
8
17
  registerPartial(
9
18
  'grid-layout',
10
19
  resolve(__dirname, `${sourceTemplateDir}/gridLayout.hbs`),
@@ -1,5 +1,5 @@
1
1
  {
2
- "UI": "14.198.0",
3
- "GSF": "8.1.4",
2
+ "UI": "14.199.0",
3
+ "GSF": "8.1.5",
4
4
  "Auth": "8.1.1"
5
5
  }
package/.gitignore CHANGED
@@ -26,6 +26,9 @@ pids
26
26
  *.sln
27
27
  *.sw?
28
28
  .DS_Store
29
+ .idea/gradle.xml
30
+ .idea/misc.xml
31
+ .idea/vcs.xml
29
32
 
30
33
  # Development
31
34
  target/
@@ -36,6 +39,7 @@ build/
36
39
  *.ignore
37
40
  *~
38
41
  .gradle
42
+ client/.angular
39
43
  client/bootstrapDone
40
44
  .husky/.gitignore
41
45
  build-cache/
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.28.0](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.27.3...v3.28.0) (2024-07-29)
4
+
5
+
6
+ ### Features
7
+
8
+ * pbc support in angular [FUI-2065](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/2065) (#289) 7662cde
9
+
10
+ ## [3.27.3](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.27.2...v3.27.3) (2024-07-29)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * automated dependency version update [skip-ci] [PSD-9](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/9) (#295) a4bf7fa
16
+
3
17
  ## [3.27.2](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.27.1...v3.27.2) (2024-07-26)
4
18
 
5
19
 
@@ -66,7 +66,8 @@
66
66
  "vendorChunk": true,
67
67
  "extractLicenses": false,
68
68
  "sourceMap": true,
69
- "namedChunks": true
69
+ "namedChunks": true,
70
+ "preserveSymlinks": true
70
71
  }
71
72
  },
72
73
  "defaultConfiguration": "production"
@@ -1,6 +1,7 @@
1
1
  declare global {
2
2
  const API_HOST: string;
3
3
  const ENABLE_SSO: boolean;
4
+ const BUILDER: string;
4
5
  }
5
6
 
6
7
  export {};
@@ -77,20 +77,27 @@
77
77
  "@angular/platform-browser": "^18.0.4",
78
78
  "@angular/platform-browser-dynamic": "^18.0.4",
79
79
  "@angular/router": "^18.0.4",
80
+ "@genesislcap/foundation-comms": "{{versions.UI}}",
81
+ "@genesislcap/foundation-entity-management": "{{versions.UI}}",
82
+ "@genesislcap/foundation-events": "{{versions.UI}}",
80
83
  {{#if FDC3.includeDependencies}}
81
84
  "@genesislcap/foundation-fdc3": "{{versions.UI}}",
82
85
  {{/if}}
83
- "@genesislcap/foundation-comms": "{{versions.UI}}",
84
- "@genesislcap/foundation-login": "{{versions.UI}}",
85
- "@genesislcap/foundation-entity-management": "{{versions.UI}}",
86
+ "@genesislcap/foundation-forms": "{{versions.UI}}",
86
87
  "@genesislcap/foundation-header": "{{versions.UI}}",
88
+ "@genesislcap/foundation-layout": "{{versions.UI}}",
89
+ "@genesislcap/foundation-logger": "{{versions.UI}}",
90
+ "@genesislcap/foundation-login": "{{versions.UI}}",
91
+ "@genesislcap/foundation-shell": "{{versions.UI}}",
92
+ "@genesislcap/foundation-store": "{{versions.UI}}",
87
93
  "@genesislcap/foundation-ui": "{{versions.UI}}",
88
94
  "@genesislcap/foundation-utils": "{{versions.UI}}",
89
95
  "@genesislcap/foundation-user": "{{versions.UI}}",
96
+ "@genesislcap/foundation-zero": "{{versions.UI}}",
97
+ "@genesislcap/g2plot-chart": "{{versions.UI}}",
90
98
  "@genesislcap/rapid-design-system": "{{versions.UI}}",
91
99
  "@genesislcap/rapid-grid-pro": "{{versions.UI}}",
92
- "@genesislcap/foundation-layout": "{{versions.UI}}",
93
- "@genesislcap/g2plot-chart": "{{versions.UI}}",
100
+ "@genesislcap/web-core": "{{versions.UI}}",
94
101
  "numeral": "2.0.6",
95
102
  "tslib": "^2.3.0",
96
103
  "zone.js": "~0.14.3"
@@ -105,15 +112,26 @@
105
112
  "@angular/platform-browser-dynamic": "^18.0.4",
106
113
  "@angular/router": "^18.0.4",
107
114
  "@genesislcap/foundation-comms": "{{versions.UI}}",
108
- "@genesislcap/foundation-login": "{{versions.UI}}",
109
115
  "@genesislcap/foundation-entity-management": "{{versions.UI}}",
116
+ "@genesislcap/foundation-events": "{{versions.UI}}",
117
+ {{#if FDC3.includeDependencies}}
118
+ "@genesislcap/foundation-fdc3": "{{versions.UI}}",
119
+ {{/if}}
120
+ "@genesislcap/foundation-forms": "{{versions.UI}}",
110
121
  "@genesislcap/foundation-header": "{{versions.UI}}",
122
+ "@genesislcap/foundation-layout": "{{versions.UI}}",
123
+ "@genesislcap/foundation-logger": "{{versions.UI}}",
124
+ "@genesislcap/foundation-login": "{{versions.UI}}",
125
+ "@genesislcap/foundation-shell": "{{versions.UI}}",
126
+ "@genesislcap/foundation-store": "{{versions.UI}}",
111
127
  "@genesislcap/foundation-ui": "{{versions.UI}}",
128
+ "@genesislcap/foundation-utils": "{{versions.UI}}",
112
129
  "@genesislcap/foundation-user": "{{versions.UI}}",
130
+ "@genesislcap/foundation-zero": "{{versions.UI}}",
131
+ "@genesislcap/g2plot-chart": "{{versions.UI}}",
113
132
  "@genesislcap/rapid-design-system": "{{versions.UI}}",
114
133
  "@genesislcap/rapid-grid-pro": "{{versions.UI}}",
115
- "@genesislcap/foundation-layout": "{{versions.UI}}",
116
- "@genesislcap/g2plot-chart": "{{versions.UI}}",
134
+ "@genesislcap/web-core": "{{versions.UI}}",
117
135
  "numeral": "2.0.6",
118
136
  "tslib": "^2.3.0",
119
137
  "zone.js": "~0.14.3"
@@ -1,26 +1,28 @@
1
- import { Component, AfterViewInit } from '@angular/core';
1
+ import { AfterViewInit, Component, ElementRef, OnDestroy, OnInit } from '@angular/core';
2
2
  import { Router, NavigationEnd } from '@angular/router';
3
3
  import getLayoutNameByRoute from './utils/getLayoutNameByRoute';
4
4
  import type { LayoutComponentName } from './types/layout';
5
5
  import { configureFoundationLogin } from './share/foundation-login';
6
+ import { registerComponents } from './share/genesis-components';
7
+ import { getStore } from './store';
8
+ import { customEventFactory, registerStylesTarget } from '../pbc/utils';
6
9
  {{#if FDC3.channels.length}}
7
10
  import { listenToChannel, onFDC3Ready } from './utils';
8
11
  {{/if}}
9
12
 
10
- // Genesis Components
11
- import './share/genesis-components';
12
-
13
13
  @Component({
14
14
  selector: '{{rootElement}}',
15
15
  templateUrl: './app.component.html',
16
16
  styleUrl: './app.component.css',
17
17
  })
18
- export class AppComponent implements AfterViewInit {
18
+ export class AppComponent implements OnInit, OnDestroy, AfterViewInit {
19
19
  layoutName?: LayoutComponentName;
20
20
  title = '{{capitalCase appName}}';
21
+ store = getStore();
21
22
 
22
23
  constructor(
23
- private router: Router,
24
+ private el: ElementRef,
25
+ router: Router,
24
26
  ) {
25
27
  configureFoundationLogin({ router });
26
28
 
@@ -32,6 +34,43 @@ export class AppComponent implements AfterViewInit {
32
34
  });
33
35
  }
34
36
 
37
+ ngOnInit() {
38
+ this.addEventListeners();
39
+ this.readyStore();
40
+ registerStylesTarget(this.el.nativeElement, 'main');
41
+ this.loadRemotes();
42
+ }
43
+
44
+ ngOnDestroy() {
45
+ this.removeEventListeners();
46
+ this.disconnectStore();
47
+ }
48
+
49
+ async loadRemotes() {
50
+ await registerComponents();
51
+ }
52
+
53
+ addEventListeners() {
54
+ this.el.nativeElement.addEventListener('store-connected', this.store.onConnected);
55
+ }
56
+
57
+ removeEventListeners() {
58
+ this.el.nativeElement.removeEventListener('store-connected', this.store.onConnected);
59
+ }
60
+
61
+ readyStore() {
62
+ this.dispatchCustomEvent('store-connected', this.el.nativeElement);
63
+ this.dispatchCustomEvent('store-ready', true);
64
+ }
65
+
66
+ disconnectStore() {
67
+ this.dispatchCustomEvent('store-disconnected');
68
+ }
69
+
70
+ dispatchCustomEvent(type: string, detail?: any) {
71
+ this.el.nativeElement.dispatchEvent(customEventFactory(type, detail));
72
+ }
73
+
35
74
  ngAfterViewInit() {
36
75
  {{#if FDC3.channels.length}}
37
76
  onFDC3Ready(this.FDC3ReadyHandler);
@@ -1,4 +1,3 @@
1
- import type { MainMenu } from './types/menu'
2
1
  import type { LayoutComponentName } from './types/layout';
3
2
 
4
3
  export const AUTH_PATH = 'login'
@@ -19,15 +18,3 @@ export const layoutComponentImportsByName = {
19
18
  export const layoutNameByRouteMap: Map<string, LayoutComponentName> = new Map([
20
19
  [`/${AUTH_PATH}`, layoutComponentName.blank],
21
20
  ]);
22
-
23
- export const mainMenu: MainMenu = [
24
- {{#each routes}}
25
- {
26
- index: {{@index}},
27
- path: '{{kebabCase this.name}}',
28
- title: '{{#if this.title}}{{this.title}}{{else}}{{this.name}}{{/if}}',
29
- icon: '{{this.icon}}',
30
- variant: 'solid'
31
- }{{#unless @last}},{{/unless}}
32
- {{/each}}
33
- ];
@@ -1,11 +1,14 @@
1
- import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
1
+ import { NgModule, CUSTOM_ELEMENTS_SCHEMA, APP_INITIALIZER } from '@angular/core';
2
2
  import { BrowserModule } from '@angular/platform-browser';
3
3
  import { FormsModule } from '@angular/forms';
4
- import { AppRoutingModule } from './app-routing.module';
4
+ import { Router, RouterModule } from '@angular/router';
5
+ import { PBCContainer } from '../pbc/container';
6
+ import { PBCElementsRenderer } from '../pbc/elementsRenderer';
5
7
  import { AppComponent } from './app.component';
6
8
  import { DefaultLayoutComponent } from './layouts/default/default.layout';
7
9
  import { BlankLayoutComponent } from './layouts/blank/blank.layout';
8
10
  import { LayoutLazyLoadDirective } from './directive/app-lazy-load.directive';
11
+ import { RouteService } from './services/route.service';
9
12
 
10
13
  @NgModule({
11
14
  declarations: [
@@ -15,11 +18,21 @@ import { LayoutLazyLoadDirective } from './directive/app-lazy-load.directive';
15
18
  BlankLayoutComponent,
16
19
  ],
17
20
  imports: [
18
- AppRoutingModule,
19
21
  BrowserModule,
20
22
  FormsModule,
23
+ RouterModule.forRoot(RouteService.routes),
24
+ PBCContainer,
25
+ PBCElementsRenderer,
26
+ ],
27
+ providers: [
28
+ RouteService,
29
+ {
30
+ provide: APP_INITIALIZER,
31
+ useFactory: (service: RouteService, router: Router) => () => router.resetConfig(service.allRoutes()),
32
+ deps: [RouteService, Router],
33
+ multi: true,
34
+ },
21
35
  ],
22
- providers: [],
23
36
  bootstrap: [AppComponent],
24
37
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
25
38
  })
@@ -1,21 +1,14 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { CanActivate, Router } from '@angular/router';
3
- import { AuthService } from '../services/auth.service';
4
2
  import { AUTH_PATH } from '../app.config';
3
+ import { PermissionsGuard } from './permissions.guard';
5
4
 
6
5
  @Injectable({
7
6
  providedIn: 'root',
8
7
  })
9
- export class AuthGuard implements CanActivate {
10
- constructor(
11
- private authService: AuthService,
12
- private router: Router,
13
- ) {}
14
-
15
- canActivate(): boolean {
16
- const isUserAuthenticated = this.authService.isUserAuthenticated();
17
-
18
- if (!isUserAuthenticated) {
8
+ export class AuthGuard extends PermissionsGuard {
9
+ override async canActivate(): Promise<boolean> {
10
+ if (!this.user.isAuthenticated) {
11
+ this.user.trackPath();
19
12
  this.router.navigate([`/${AUTH_PATH}`]);
20
13
  return false;
21
14
  }
@@ -0,0 +1,33 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { ActivatedRouteSnapshot, CanActivate, Router } from '@angular/router';
3
+ import { getUser } from '@genesislcap/foundation-user';
4
+ import { AuthGuard } from './auth.guard';
5
+ import { ConnectionGuard } from './connection.guard';
6
+ import { PermissionsGuard } from './permissions.guard';
7
+
8
+ @Injectable({
9
+ providedIn: 'root',
10
+ })
11
+ export class ChainedGuard implements CanActivate {
12
+ protected user = getUser();
13
+
14
+ constructor(
15
+ protected router: Router,
16
+ protected connectionGuard: ConnectionGuard,
17
+ protected authGuard: AuthGuard,
18
+ protected permissionsGuard: PermissionsGuard
19
+ ) {}
20
+
21
+ async canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {
22
+ let result = await this.connectionGuard.canActivate();
23
+ if (!result) {
24
+ return false;
25
+ }
26
+ result = await this.authGuard.canActivate();
27
+ if (!result) {
28
+ return false;
29
+ }
30
+ result = await this.permissionsGuard.canActivate(route);
31
+ return result;
32
+ }
33
+ }
@@ -0,0 +1,21 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { CanActivate} from '@angular/router';
3
+ import { getConnect } from '@genesislcap/foundation-comms';
4
+
5
+ @Injectable({
6
+ providedIn: 'root'
7
+ })
8
+ export class ConnectionGuard implements CanActivate {
9
+ protected connect = getConnect();
10
+
11
+ async canActivate(): Promise<boolean> {
12
+ if (this.connect.isConnected) {
13
+ return true;
14
+ }
15
+ const hostUrl = sessionStorage.getItem('hostUrl');
16
+ if (!hostUrl) {
17
+ return false;
18
+ }
19
+ return this.connect.connect(hostUrl);
20
+ }
21
+ }
@@ -1,21 +1,19 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { CanActivate, Router, ActivatedRouteSnapshot } from '@angular/router';
3
- import { AuthService } from '../services/auth.service';
3
+ import { getUser } from '@genesislcap/foundation-user';
4
4
  import { NOT_PERMITTED_PATH } from '../app.config';
5
5
 
6
6
  @Injectable({
7
7
  providedIn: 'root',
8
8
  })
9
9
  export class PermissionsGuard implements CanActivate {
10
- constructor(
11
- private authService: AuthService,
12
- private router: Router,
13
- ) {}
10
+ protected user = getUser();
14
11
 
15
- async canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {
16
- const isPermitted = await this.authService.hasUserPermission(route.data['permissionCode']);
12
+ constructor(protected router: Router) {}
17
13
 
18
- if (!isPermitted) {
14
+ async canActivate(route: ActivatedRouteSnapshot): Promise<boolean> {
15
+ const { permissionCode } = route.data;
16
+ if (permissionCode && !this.user.hasPermission(permissionCode)) {
19
17
  await this.router.navigate([`/${NOT_PERMITTED_PATH}`]);
20
18
  return false;
21
19
  }
@@ -1,11 +1,7 @@
1
1
  import { Router } from '@angular/router';
2
2
 
3
3
  export default class BaseLayout {
4
- router: Router;
5
-
6
- constructor(router: Router) {
7
- this.router = router;
8
- }
4
+ constructor(protected router: Router) {}
9
5
 
10
6
  navigate(path: string) {
11
7
  this.router.navigate([path]);
@@ -2,6 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  height: 100%;
5
+ contain: content;
5
6
  }
6
7
 
7
8
  .container {
@@ -1,19 +1,18 @@
1
1
  <rapid-design-system-provider #designSystemProvider>
2
+ <pbc-elements-renderer [target]="['layout-start']"></pbc-elements-renderer>
2
3
  <foundation-header
3
4
  #foundationHeader
4
5
  show-luminance-toggle-button
5
6
  show-misc-toggle-button
6
7
  (luminance-icon-clicked)="onLuminanceToogle()"
7
8
  [navigateTo]="navigateAngular"
9
+ [routeNavItems]="navItems"
8
10
  >
9
- <section class="routes-wrapper" slot="routes">
10
- <rapid-button *ngFor="let menuLink of allRoutes" (click)="navigate(menuLink.path)" >
11
- <rapid-icon name="\{{ menuLink.icon }}"></rapid-icon>
12
- \{{ menuLink.title }}
13
- </rapid-button>
14
- </section>
15
11
  </foundation-header>
16
12
  <section class="content">
13
+ <pbc-elements-renderer [target]="['content-start']"></pbc-elements-renderer>
17
14
  <router-outlet></router-outlet>
15
+ <pbc-elements-renderer [target]="['content', 'content-end']"></pbc-elements-renderer>
18
16
  </section>
17
+ <pbc-elements-renderer [target]="['layout', 'layout-end']"></pbc-elements-renderer>
19
18
  </rapid-design-system-provider>
@@ -1,10 +1,11 @@
1
1
  import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
2
2
  import { Router } from '@angular/router';
3
- import { baseLayerLuminance, StandardLuminance } from '@microsoft/fast-components';
4
- import { configureDesignSystem } from '@genesislcap/foundation-ui';
3
+ import { configureDesignSystem, FoundationRouteNavItem } from '@genesislcap/foundation-ui';
4
+ import { baseLayerLuminance, StandardLuminance } from '@genesislcap/web-core';
5
5
  import * as designTokens from '../../../styles/design-tokens.json';
6
+ import { RouteService } from '../../services/route.service';
6
7
  import BaseLayout from '../base.layout';
7
- import { mainMenu } from '../../app.config';
8
+ import { registerStylesTarget } from '../../../pbc/utils';
8
9
 
9
10
  @Component({
10
11
  selector: 'app-default-layout',
@@ -13,16 +14,20 @@ import { mainMenu } from '../../app.config';
13
14
  })
14
15
  export class DefaultLayoutComponent extends BaseLayout implements AfterViewInit {
15
16
  @ViewChild('designSystemProvider') designSystemProviderElement!: ElementRef;
16
- allRoutes = mainMenu;
17
+ navItems: FoundationRouteNavItem[] = [];
17
18
 
18
19
  constructor(
20
+ private el: ElementRef,
19
21
  router: Router,
22
+ routeService: RouteService,
20
23
  ) {
21
24
  super(router);
25
+ this.navItems = routeService.getNavItems();
22
26
  }
23
27
 
24
28
  ngAfterViewInit() {
25
29
  configureDesignSystem(this.designSystemProviderElement.nativeElement, designTokens);
30
+ registerStylesTarget(this.el.nativeElement, 'layout');
26
31
  }
27
32
 
28
33
  navigateAngular = (path: string) => {