@genesislcap/blank-app-seed 3.39.4 → 3.40.0-prerelease.10
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.
- package/.genx/package.json +1 -1
- package/.genx/versions.json +3 -3
- package/.github/CODEOWNERS +1 -1
- package/CHANGELOG.md +63 -0
- package/client-tmp/angular/angular.json +3 -0
- package/client-tmp/angular/src/app/app.component.ts +12 -6
- package/client-tmp/angular/src/app/guards/auth.guard.ts +1 -1
- package/client-tmp/angular/src/app/layouts/default/default.layout.html +1 -0
- package/client-tmp/angular/src/app/layouts/default/default.layout.ts +6 -2
- package/client-tmp/angular/src/app/services/route.service.ts +2 -2
- package/client-tmp/angular/src/app/share/foundation-auth.ts +29 -15
- package/client-tmp/angular/src/proxy.conf.json +12 -0
- package/client-tmp/react/package.json +2 -2
- package/client-tmp/react/src/App.tsx +4 -9
- package/client-tmp/react/src/config.ts +2 -2
- package/client-tmp/react/src/guards/ProtectedGuard.tsx +7 -4
- package/client-tmp/react/src/layouts/default/DefaultLayout.tsx +12 -17
- package/client-tmp/react/src/pages/AuthPage/AuthPage.tsx +15 -7
- package/client-tmp/react/src/pbc/container.tsx +2 -2
- package/client-tmp/react/src/share/foundation-login.ts +28 -19
- package/client-tmp/react/src/store/RoutesContext.tsx +2 -2
- package/client-tmp/react/src/utils/index.ts +1 -2
- package/client-tmp/react/webpack.config.js +16 -2
- package/client-tmp/web-components/package.json +4 -1
- package/client-tmp/web-components/public/initSSO.js +1 -1
- package/client-tmp/web-components/src/routes/config.ts +38 -80
- package/package.json +1 -1
- package/server/{{appName}}-app/src/main/genesis/scripts/genesis-router.kts +13 -0
- package/client-tmp/angular/src/app/share/foundation-login.ts +0 -47
- package/client-tmp/react/src/utils/history.ts +0 -5
package/.genx/package.json
CHANGED
package/.genx/versions.json
CHANGED
package/.github/CODEOWNERS
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
# for reference see https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-code-owners#example-of-a-codeowners-file
|
|
2
2
|
|
|
3
|
-
* @
|
|
3
|
+
* @MrBrunoWolff @skawian @kievitsp @jacinpoz @khouari1 @rafaelnferreira @matteematt @SzymonZur @ArturKrasinski @jay-taylerson
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,68 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.40.0-prerelease.10](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.9...v3.40.0-prerelease.10) (2025-03-03)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* update versions build trigger f8783d3
|
|
9
|
+
|
|
10
|
+
## [3.40.0-prerelease.9](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.8...v3.40.0-prerelease.9) (2025-02-20)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* updating server version information for Auth [PSD-0](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/0) d5fd0da
|
|
16
|
+
|
|
17
|
+
## [3.40.0-prerelease.8](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.7...v3.40.0-prerelease.8) (2025-02-20)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Bug Fixes
|
|
21
|
+
|
|
22
|
+
* updating server version information for GSF [PSD-0](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/0) 0772186
|
|
23
|
+
|
|
24
|
+
## [3.40.0-prerelease.7](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.6...v3.40.0-prerelease.7) (2025-02-20)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Bug Fixes
|
|
28
|
+
|
|
29
|
+
* updating server version information for Auth [PSD-0](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/0) eb67c93
|
|
30
|
+
|
|
31
|
+
## [3.40.0-prerelease.6](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.5...v3.40.0-prerelease.6) (2025-02-20)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
### Bug Fixes
|
|
35
|
+
|
|
36
|
+
* updating server version information for GSF [PSD-0](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/0) ff4366b
|
|
37
|
+
|
|
38
|
+
## [3.40.0-prerelease.5](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.4...v3.40.0-prerelease.5) (2025-02-14)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
### Bug Fixes
|
|
42
|
+
|
|
43
|
+
* automated dependency version update [skip-ci] [PSD-9](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/9) (#431) c2eb359
|
|
44
|
+
|
|
45
|
+
## [3.40.0-prerelease.4](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.3...v3.40.0-prerelease.4) (2025-02-14)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
### Bug Fixes
|
|
49
|
+
|
|
50
|
+
* include auth in config [FUI-2196](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/2196) 1c549d5
|
|
51
|
+
|
|
52
|
+
## [3.40.0-prerelease.3](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.2...v3.40.0-prerelease.3) (2025-02-14)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
### Features
|
|
56
|
+
|
|
57
|
+
* use foundation-auth as default login [FUI-2196](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/2196) (#427) abd0c48
|
|
58
|
+
|
|
59
|
+
## [3.40.0-prerelease.2](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.40.0-prerelease.1...v3.40.0-prerelease.2) (2025-02-07)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
### Bug Fixes
|
|
63
|
+
|
|
64
|
+
* revert changes 65040e4
|
|
65
|
+
|
|
3
66
|
## [3.39.4](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.39.3...v3.39.4) (2025-01-16)
|
|
4
67
|
|
|
5
68
|
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { AfterViewInit, Component, ElementRef, OnDestroy, OnInit } from '@angular/core';
|
|
2
2
|
import { Router, NavigationEnd } from '@angular/router';
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
3
|
+
import { Connect } from '@genesislcap/foundation-comms';
|
|
4
|
+
import { customEventFactory, registerStylesTarget } from '../pbc/utils';
|
|
5
|
+
import { configureFoundationAuth } from './share/foundation-auth';
|
|
6
6
|
import { registerComponents } from './share/genesis-components';
|
|
7
7
|
import { getStore } from './store';
|
|
8
|
-
import {
|
|
8
|
+
import type { LayoutComponentName } from './types/layout';
|
|
9
|
+
import getLayoutNameByRoute from './utils/getLayoutNameByRoute';
|
|
9
10
|
{{#if FDC3.channels.length}}
|
|
10
11
|
import { listenToChannel, onFDC3Ready } from './utils';
|
|
11
12
|
{{/if}}
|
|
@@ -20,12 +21,17 @@ export class AppComponent implements OnInit, OnDestroy, AfterViewInit {
|
|
|
20
21
|
title = '{{capitalCase appName}}';
|
|
21
22
|
store = getStore();
|
|
22
23
|
|
|
24
|
+
// @ts-ignore
|
|
25
|
+
@Connect connect: Connect;
|
|
26
|
+
|
|
23
27
|
constructor(
|
|
24
28
|
private el: ElementRef,
|
|
25
29
|
router: Router,
|
|
26
30
|
) {
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
configureFoundationAuth({ router, connectService: this.connect });
|
|
33
|
+
|
|
34
|
+
|
|
29
35
|
// Set layout componet based on route
|
|
30
36
|
router.events.subscribe((event: any) => {
|
|
31
37
|
if (event instanceof NavigationEnd) {
|
|
@@ -9,7 +9,7 @@ export class AuthGuard extends PermissionsGuard {
|
|
|
9
9
|
override async canActivate(): Promise<boolean> {
|
|
10
10
|
if (!this.user.isAuthenticated) {
|
|
11
11
|
this.user.trackPath();
|
|
12
|
-
this.router.navigate([`/${AUTH_PATH}`]);
|
|
12
|
+
await this.router.navigate([`/${AUTH_PATH}`]);
|
|
13
13
|
return false;
|
|
14
14
|
}
|
|
15
15
|
return true;
|
|
@@ -29,11 +29,15 @@ export class DefaultLayoutComponent extends BaseLayout implements AfterViewInit
|
|
|
29
29
|
configureDesignSystem(this.designSystemProviderElement.nativeElement, designTokens);
|
|
30
30
|
registerStylesTarget(this.el.nativeElement, 'layout');
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
|
|
33
33
|
navigateAngular = (path: string) => {
|
|
34
34
|
this.router.navigate([path]);
|
|
35
35
|
};
|
|
36
|
-
|
|
36
|
+
|
|
37
|
+
onLogout = () => {
|
|
38
|
+
this.router.navigate(['/login']);
|
|
39
|
+
};
|
|
40
|
+
|
|
37
41
|
onLuminanceToogle = (): void => {
|
|
38
42
|
baseLayerLuminance.setValueFor(
|
|
39
43
|
this.designSystemProviderElement.nativeElement,
|
|
@@ -39,7 +39,7 @@ export class RouteService {
|
|
|
39
39
|
navItems: [
|
|
40
40
|
{
|
|
41
41
|
navId: 'header',
|
|
42
|
-
title: '{{#if this.title}}{{this.title}}{{else}}{{this.name}}{{/if}}',
|
|
42
|
+
title: '{{#if this.title}}{{capitalCase this.title}}{{else}}{{this.name}}{{/if}}',
|
|
43
43
|
icon: {
|
|
44
44
|
name: '{{this.icon}}',
|
|
45
45
|
variant: 'solid',
|
|
@@ -53,7 +53,7 @@ export class RouteService {
|
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
55
|
* @privateRemarks
|
|
56
|
-
* The shell has access to context, so it's possible for it to return a pre-mapped framework variant of routes.
|
|
56
|
+
* The shell has access to context, so it's possible for it to return a pre-mapped framework variant of routes.
|
|
57
57
|
* In this iteration we're doing it inline, given the angular version may move and here we know the shape we need.
|
|
58
58
|
*/
|
|
59
59
|
pbcRoutes(): Routes {
|
|
@@ -1,20 +1,34 @@
|
|
|
1
|
-
// import { configure } from '@genesislcap/foundation-auth/config';
|
|
2
1
|
import type { Router } from '@angular/router';
|
|
2
|
+
import { configure, defaultAuthConfig } from '@genesislcap/foundation-auth/config';
|
|
3
|
+
import type { Connect } from '@genesislcap/foundation-comms';
|
|
4
|
+
import { getUser } from '@genesislcap/foundation-user';
|
|
5
|
+
import { GENESIS_SOCKET_URL } from '@genesislcap/foundation-utils';
|
|
6
|
+
import { AUTH_PATH } from '../app.config';
|
|
3
7
|
|
|
4
8
|
/**
|
|
5
9
|
* Configure the micro frontend
|
|
6
10
|
*/
|
|
7
|
-
export const configureFoundationAuth = ({
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
export const configureFoundationAuth = ({ router, connectService,}: { router: Router; connectService: Connect; }) => {
|
|
12
|
+
const baseElement = document.querySelector('base');
|
|
13
|
+
const basePath = baseElement?.getAttribute('href') || '';
|
|
14
|
+
|
|
15
|
+
configure({
|
|
16
|
+
name: 'client-app-login',
|
|
17
|
+
omitRoutes: ['request-account', 'forgot-password'],
|
|
18
|
+
fields: {
|
|
19
|
+
...defaultAuthConfig.fields,
|
|
20
|
+
username: {
|
|
21
|
+
...defaultAuthConfig.fields.username,
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
hostPath: basePath + AUTH_PATH,
|
|
25
|
+
postLoginRedirect: async () => {
|
|
26
|
+
const url = GENESIS_SOCKET_URL;
|
|
27
|
+
await connectService.connect(url);
|
|
28
|
+
|
|
29
|
+
const lastPath = getUser().lastPath()?.replace(basePath, '');
|
|
30
|
+
|
|
31
|
+
router.navigate([lastPath ?? '{{kebabCase routes.[0].name}}']);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
};
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"history": "^5.3.0",
|
|
59
59
|
"react": "^19.0.0",
|
|
60
60
|
"react-dom": "^19.0.0",
|
|
61
|
-
"react-router
|
|
61
|
+
"react-router": "^7.1.3",
|
|
62
62
|
"web-vitals": "^2.1.4"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"@types/css-modules": "^1.0.5",
|
|
78
78
|
"@types/jest": "^29.5.12",
|
|
79
79
|
"@types/node": "^20.14.10",
|
|
80
|
-
"@types/react": "^19.0.1",
|
|
80
|
+
"@types/react": "^19.0.1",
|
|
81
81
|
"@types/react-dom": "^19.0.2",
|
|
82
82
|
"@typescript-eslint/eslint-plugin": "^7.13.1",
|
|
83
83
|
"@typescript-eslint/parser": "^7.13.1",
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { useEffect, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import {Routes, Route, useLocation, BrowserRouter} from 'react-router';
|
|
3
3
|
import {
|
|
4
|
-
history,
|
|
5
4
|
setApiHost,
|
|
6
5
|
getLayoutNameByRoute,
|
|
7
6
|
{{#if FDC3.channels.length~}}
|
|
@@ -17,7 +16,6 @@ import { AuthProvider } from './store/AuthContext';
|
|
|
17
16
|
import { RoutesProvider, useRoutesContext } from './store/RoutesContext';
|
|
18
17
|
import AuthPage from './pages/AuthPage/AuthPage';
|
|
19
18
|
import { registerComponents as genesisRegisterComponents } from './share/genesis-components';
|
|
20
|
-
import { configureFoundationLogin } from './share/foundation-login';
|
|
21
19
|
import ProtectedGuard from './guards/ProtectedGuard';
|
|
22
20
|
import { storeService } from '@/services/store.service';
|
|
23
21
|
|
|
@@ -33,10 +31,8 @@ const DynamicLayout = () => {
|
|
|
33
31
|
|
|
34
32
|
useEffect(() => {
|
|
35
33
|
handleRouteChange(location);
|
|
36
|
-
const unlisten = history.listen(handleRouteChange);
|
|
37
34
|
|
|
38
35
|
return () => {
|
|
39
|
-
unlisten();
|
|
40
36
|
}
|
|
41
37
|
}, [location]);
|
|
42
38
|
|
|
@@ -82,7 +78,6 @@ const App: React.FC<AppProps> = ({ rootElement }) => {
|
|
|
82
78
|
|
|
83
79
|
setApiHost();
|
|
84
80
|
genesisRegisterComponents();
|
|
85
|
-
configureFoundationLogin({ router: history });
|
|
86
81
|
|
|
87
82
|
useEffect(() => {
|
|
88
83
|
registerStylesTarget(document.body, 'main');
|
|
@@ -107,14 +102,14 @@ const App: React.FC<AppProps> = ({ rootElement }) => {
|
|
|
107
102
|
return (
|
|
108
103
|
<AuthProvider>
|
|
109
104
|
<RoutesProvider>
|
|
110
|
-
<
|
|
105
|
+
<BrowserRouter>
|
|
111
106
|
<Routes>
|
|
112
107
|
<Route path="*" element={<DynamicLayout />} />
|
|
113
108
|
</Routes>
|
|
114
|
-
</
|
|
109
|
+
</BrowserRouter>
|
|
115
110
|
</RoutesProvider>
|
|
116
111
|
</AuthProvider>
|
|
117
112
|
);
|
|
118
113
|
};
|
|
119
114
|
|
|
120
|
-
export default App;
|
|
115
|
+
export default App;
|
|
@@ -2,11 +2,11 @@ import { RouteLayouts } from './types/RouteLayouts';
|
|
|
2
2
|
import { environment } from '@environment';
|
|
3
3
|
|
|
4
4
|
export const routeLayouts: RouteLayouts = {
|
|
5
|
-
'/
|
|
5
|
+
'/login': 'blank',
|
|
6
6
|
'/': 'blank',
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
-
export const AUTH_PATH = '
|
|
9
|
+
export const AUTH_PATH = 'login';
|
|
10
10
|
export const NOT_PERMITTED_PATH = 'not-permitted';
|
|
11
11
|
|
|
12
12
|
export const API_DATA = {
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { useState, useEffect, ReactNode } from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { useNavigate } from 'react-router-dom';
|
|
2
|
+
import {RouteObject, useNavigate} from 'react-router';
|
|
4
3
|
import isConnectedHelper from '@/helpers/isConnectedHelper';
|
|
5
4
|
import isAuthenticatedHelper from '@/helpers/isAuthenticatedHelper';
|
|
6
5
|
import hasPermissionHelper from '@/helpers/hasPermissionHelper';
|
|
@@ -56,11 +55,15 @@ const ProtectedGuard: React.FC<{ children: ReactNode }> = ({ children }: { child
|
|
|
56
55
|
}
|
|
57
56
|
|
|
58
57
|
if (permissionState) {
|
|
59
|
-
|
|
58
|
+
const baseElement = document.querySelector('base');
|
|
59
|
+
const basePath = baseElement?.getAttribute('href') || '';
|
|
60
|
+
|
|
61
|
+
const redirect = `${basePath}${redirectUrlByPermissionState[permissionState]}`;
|
|
62
|
+
navigate(`/${redirect}`);
|
|
60
63
|
}
|
|
61
64
|
}, [routes, isConnected, isAuthenticated, hasPermission]);
|
|
62
65
|
|
|
63
66
|
return children;
|
|
64
67
|
};
|
|
65
68
|
|
|
66
|
-
export default ProtectedGuard;
|
|
69
|
+
export default ProtectedGuard;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React, { ReactNode, useEffect, useRef } from 'react';
|
|
2
|
-
import { RouteObject } from 'react-router';
|
|
2
|
+
import { RouteObject, useNavigate } from 'react-router';
|
|
3
3
|
import { configureDesignSystem, getNavItems } from '@genesislcap/foundation-ui';
|
|
4
|
-
import { useNavigate } from 'react-router-dom';
|
|
5
4
|
import {
|
|
6
5
|
baseLayerLuminance,
|
|
7
6
|
StandardLuminance,
|
|
@@ -10,6 +9,9 @@ import styles from './DefaultLayout.module.css';
|
|
|
10
9
|
import PBCElementsRenderer from '@/pbc/elementsRenderer';
|
|
11
10
|
import * as designTokens from '@/styles/design-tokens.json';
|
|
12
11
|
import { useRoutesContext } from '@/store/RoutesContext';
|
|
12
|
+
import { connectService } from '@/services/connect.service.ts';
|
|
13
|
+
import { getUser } from '@genesislcap/foundation-user';
|
|
14
|
+
import { AUTH_PATH } from '@/config';
|
|
13
15
|
|
|
14
16
|
interface DefaultLayoutProps {
|
|
15
17
|
children: ReactNode;
|
|
@@ -25,7 +27,6 @@ type ExtendedRouteObject = RouteObject & {
|
|
|
25
27
|
const DefaultLayout: React.FC<DefaultLayoutProps> = ({ children }) => {
|
|
26
28
|
const navigate = useNavigate();
|
|
27
29
|
const designSystemProviderRef = useRef<HTMLElement>(null);
|
|
28
|
-
const foundationHeaderRef = useRef<HTMLElement>(null);
|
|
29
30
|
const routes = useRoutesContext() as ExtendedRouteObject[];
|
|
30
31
|
const navItems = getNavItems(routes.flatMap((route) => ({
|
|
31
32
|
path: route.path || '',
|
|
@@ -43,25 +44,18 @@ const DefaultLayout: React.FC<DefaultLayoutProps> = ({ children }) => {
|
|
|
43
44
|
);
|
|
44
45
|
}
|
|
45
46
|
};
|
|
46
|
-
|
|
47
|
+
|
|
48
|
+
if (!connectService.isConnected()) {
|
|
49
|
+
getUser().trackPath();
|
|
50
|
+
navigate(`/${AUTH_PATH}`)
|
|
51
|
+
}
|
|
52
|
+
|
|
47
53
|
useEffect(() => {
|
|
48
54
|
if (designSystemProviderRef.current) {
|
|
49
55
|
configureDesignSystem(designSystemProviderRef.current, designTokens);
|
|
50
56
|
}
|
|
51
57
|
|
|
52
|
-
const handleLuminanceIconClicked = () => {
|
|
53
|
-
onLuminanceToggle();
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const foundationHeader = foundationHeaderRef.current;
|
|
57
|
-
if (foundationHeader) {
|
|
58
|
-
foundationHeader.addEventListener('luminance-icon-clicked', handleLuminanceIconClicked);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
58
|
return () => {
|
|
62
|
-
if (foundationHeader) {
|
|
63
|
-
foundationHeader.removeEventListener('luminance-icon-clicked', handleLuminanceIconClicked);
|
|
64
|
-
}
|
|
65
59
|
};
|
|
66
60
|
}, []);
|
|
67
61
|
|
|
@@ -71,7 +65,8 @@ const DefaultLayout: React.FC<DefaultLayoutProps> = ({ children }) => {
|
|
|
71
65
|
<rapid-design-system-provider ref={designSystemProviderRef} class={className}>
|
|
72
66
|
<PBCElementsRenderer target={['layout-start']} />
|
|
73
67
|
<foundation-header
|
|
74
|
-
|
|
68
|
+
onluminance-icon-clicked={onLuminanceToggle}
|
|
69
|
+
onlogout-clicked={() => navigate(`/${AUTH_PATH}`)}
|
|
75
70
|
show-luminance-toggle-button
|
|
76
71
|
show-misc-toggle-button
|
|
77
72
|
routeNavItems={navItems}
|
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, {useEffect} from 'react';
|
|
2
2
|
import './AuthPage.css';
|
|
3
|
+
import { configureFoundationLogin } from "@/share/foundation-login.ts";
|
|
4
|
+
import { useNavigate } from "react-router";
|
|
3
5
|
|
|
4
6
|
const AuthPage: React.FC = () => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const navigate = useNavigate();
|
|
8
|
+
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
configureFoundationLogin({ navigate });
|
|
11
|
+
}, []);
|
|
12
|
+
|
|
13
|
+
return (
|
|
14
|
+
<section className="auth-page">
|
|
15
|
+
<client-app-login></client-app-login>
|
|
16
|
+
</section>
|
|
17
|
+
);
|
|
10
18
|
};
|
|
11
19
|
|
|
12
|
-
export default AuthPage;
|
|
20
|
+
export default AuthPage;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { useEffect, useRef, RouteObject } from 'react';
|
|
2
2
|
import { deriveElementTag } from './utils';
|
|
3
3
|
import { useRoutesContext } from '@/store/RoutesContext';
|
|
4
|
-
import { useLocation } from 'react-router
|
|
4
|
+
import { useLocation } from 'react-router';
|
|
5
5
|
|
|
6
6
|
type ExtendedRouteObject = RouteObject & {
|
|
7
7
|
data?: {
|
|
@@ -41,4 +41,4 @@ const PBCContainer: React.FC = () => {
|
|
|
41
41
|
return <div ref={containerRef} className="container" style=\{{ width: '100%', height: '100%' }}></div>;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
export default PBCContainer;
|
|
44
|
+
export default PBCContainer;
|
|
@@ -1,28 +1,37 @@
|
|
|
1
|
-
import {configure,
|
|
1
|
+
import { configure, defaultAuthConfig } from '@genesislcap/foundation-auth/config';
|
|
2
2
|
import { getUser } from '@genesislcap/foundation-user';
|
|
3
|
-
import { DI } from '@genesislcap/web-core';
|
|
4
3
|
import { AUTH_PATH } from '@/config';
|
|
5
|
-
import
|
|
4
|
+
import { GENESIS_SOCKET_URL } from '@genesislcap/foundation-utils';
|
|
5
|
+
import { Connect } from '@genesislcap/foundation-comms';
|
|
6
|
+
import { DI } from '@genesislcap/web-core';
|
|
7
|
+
import type { NavigateFunction } from 'react-router';
|
|
6
8
|
|
|
7
9
|
/**
|
|
8
10
|
* Configure the micro frontend
|
|
9
11
|
*/
|
|
10
|
-
export const configureFoundationLogin = ({
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
12
|
+
export const configureFoundationLogin = ({navigate}: { navigate: NavigateFunction}) => {
|
|
13
|
+
const baseElement = document.querySelector('base');
|
|
14
|
+
const basePath = baseElement?.getAttribute('href') || '';
|
|
15
|
+
const connect = DI.getOrCreateDOMContainer().get(Connect);
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
configure({
|
|
19
|
+
name: 'client-app-login',
|
|
20
|
+
omitRoutes: ['request-account', 'forgot-password'],
|
|
21
|
+
fields: {
|
|
22
|
+
...defaultAuthConfig.fields,
|
|
23
|
+
username: {
|
|
24
|
+
...defaultAuthConfig.fields.username,
|
|
25
|
+
},
|
|
22
26
|
},
|
|
23
|
-
|
|
27
|
+
hostPath: basePath + AUTH_PATH,
|
|
28
|
+
postLoginRedirect: async () => {
|
|
29
|
+
const url = GENESIS_SOCKET_URL;
|
|
30
|
+
await connect.connect(url);
|
|
24
31
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
const redirectUrl = '/{{kebabCase routes.[0].name}}';
|
|
33
|
+
navigate(redirectUrl);
|
|
34
|
+
},
|
|
35
|
+
})
|
|
28
36
|
}
|
|
37
|
+
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { createContext, useContext, ReactNode } from 'react';
|
|
2
|
-
import { RouteObject, Navigate } from 'react-router
|
|
2
|
+
import { RouteObject, Navigate } from 'react-router';
|
|
3
3
|
import { getApp } from '@genesislcap/foundation-shell/app';
|
|
4
4
|
import AuthPage from '@/pages/AuthPage/AuthPage';
|
|
5
5
|
import NotFoundPage from '@/pages/NotFoundPage/NotFoundPage';
|
|
@@ -71,4 +71,4 @@ export const RoutesProvider: React.FC<{ children: ReactNode }> = ({ children })
|
|
|
71
71
|
|
|
72
72
|
export const useRoutesContext = () => {
|
|
73
73
|
return useContext(RoutesContext);
|
|
74
|
-
};
|
|
74
|
+
};
|
|
@@ -7,7 +7,7 @@ module.exports = (env, argv) => {
|
|
|
7
7
|
const https = process.env.HTTPS === 'true';
|
|
8
8
|
const open = !(process.env.NO_OPEN === 'true');
|
|
9
9
|
const environmentFile = mode === 'production'
|
|
10
|
-
? 'environment.prod.ts'
|
|
10
|
+
? 'environment.prod.ts'
|
|
11
11
|
: 'environment.ts';
|
|
12
12
|
const environmentPath = resolve(__dirname, 'src/environments', environmentFile);
|
|
13
13
|
|
|
@@ -76,6 +76,20 @@ module.exports = (env, argv) => {
|
|
|
76
76
|
],
|
|
77
77
|
devServer: {
|
|
78
78
|
server: https ? 'https' : 'http',
|
|
79
|
+
proxy: [
|
|
80
|
+
{
|
|
81
|
+
context: "/sm",
|
|
82
|
+
"target": "{{apiHost}}",
|
|
83
|
+
"secure": false,
|
|
84
|
+
"pathRewrite": {"^/sm": ""},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
context: "/gwf",
|
|
88
|
+
"target": "{{apiHost}}",
|
|
89
|
+
"secure": false,
|
|
90
|
+
"ws": true
|
|
91
|
+
}
|
|
92
|
+
],
|
|
79
93
|
open,
|
|
80
94
|
static: {
|
|
81
95
|
directory: join(__dirname, 'public'),
|
|
@@ -100,4 +114,4 @@ module.exports = (env, argv) => {
|
|
|
100
114
|
modules: false,
|
|
101
115
|
},
|
|
102
116
|
};
|
|
103
|
-
};
|
|
117
|
+
};
|
|
@@ -89,6 +89,7 @@
|
|
|
89
89
|
"lint-staged": "^12.4.1"
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {
|
|
92
|
+
"@genesislcap/foundation-auth": "{{versions.UI}}",
|
|
92
93
|
"@genesislcap/foundation-comms": "{{versions.UI}}",
|
|
93
94
|
"@genesislcap/foundation-entity-management": "{{versions.UI}}",
|
|
94
95
|
"@genesislcap/foundation-events": "{{versions.UI}}",
|
|
@@ -117,6 +118,7 @@
|
|
|
117
118
|
"tslib": "^2.3.1"
|
|
118
119
|
},
|
|
119
120
|
"overrides": {
|
|
121
|
+
"@genesislcap/foundation-auth": "{{versions.UI}}",
|
|
120
122
|
"@genesislcap/foundation-comms": "{{versions.UI}}",
|
|
121
123
|
"@genesislcap/foundation-entity-management": "{{versions.UI}}",
|
|
122
124
|
"@genesislcap/foundation-events": "{{versions.UI}}",
|
|
@@ -139,6 +141,7 @@
|
|
|
139
141
|
"@genesislcap/g2plot-chart": "{{versions.UI}}",
|
|
140
142
|
"@genesislcap/rapid-design-system": "{{versions.UI}}",
|
|
141
143
|
"@genesislcap/rapid-grid-pro": "{{versions.UI}}",
|
|
142
|
-
"@genesislcap/web-core": "{{versions.UI}}"
|
|
144
|
+
"@genesislcap/web-core": "{{versions.UI}}",
|
|
145
|
+
"typescript": "5.6.3"
|
|
143
146
|
}
|
|
144
147
|
}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { getUser, navigateTo } from '@genesislcap/foundation-auth';
|
|
2
|
+
import { Auth, Connect } from '@genesislcap/foundation-comms';
|
|
3
3
|
import { FoundationRouterConfiguration } from '@genesislcap/foundation-ui';
|
|
4
|
-
import {
|
|
4
|
+
import { GENESIS_SOCKET_URL, PUBLIC_PATH } from '@genesislcap/foundation-utils';
|
|
5
5
|
import { defaultLayout, loginLayout } from '../layouts';
|
|
6
|
-
import { logger } from '../utils';
|
|
7
|
-
{{#each routes}}
|
|
8
|
-
import { {{pascalCase this.name}} } from './{{kebabCase this.name}}/{{kebabCase this.name}}';
|
|
9
|
-
{{/each}}
|
|
10
6
|
import { NotFound } from './not-found/not-found';
|
|
11
7
|
import { defaultNotPermittedRoute, NotPermitted } from './not-permitted/not-permitted';
|
|
12
8
|
import { LoginSettings } from './types';
|
|
9
|
+
{{#each routes}}
|
|
10
|
+
import { {{pascalCase this.name}} } from './{{kebabCase this.name}}/{{kebabCase this.name}}';
|
|
11
|
+
{{/each}}
|
|
13
12
|
|
|
14
13
|
// eslint-disable-next-line
|
|
15
14
|
declare var ENABLE_SSO: string;
|
|
@@ -25,18 +24,16 @@ const ssoSettings =
|
|
|
25
24
|
}
|
|
26
25
|
: {};
|
|
27
26
|
|
|
27
|
+
const publicPath = typeof PUBLIC_PATH !== 'undefined' ? PUBLIC_PATH : '';
|
|
28
|
+
|
|
28
29
|
export class MainRouterConfig extends FoundationRouterConfiguration<LoginSettings> {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
@Session private session: Session,
|
|
32
|
-
@optional(LoginConfig)
|
|
33
|
-
private loginConfig: LoginConfig = { ...defaultLoginConfig, autoAuth: true, autoConnect: true },
|
|
34
|
-
) {
|
|
35
|
-
super();
|
|
36
|
-
}
|
|
30
|
+
@Connect private connect: Connect;
|
|
31
|
+
@Auth private auth: Auth;
|
|
37
32
|
|
|
38
33
|
async configure() {
|
|
39
34
|
this.configureAnalytics();
|
|
35
|
+
this.configureRoutePermittedChecks();
|
|
36
|
+
this.configureFallbackRouteDefinition();
|
|
40
37
|
this.title = '{{capitalCase appName}}';
|
|
41
38
|
this.defaultLayout = defaultLayout;
|
|
42
39
|
|
|
@@ -49,22 +46,31 @@ export class MainRouterConfig extends FoundationRouterConfiguration<LoginSetting
|
|
|
49
46
|
name: 'login',
|
|
50
47
|
title: 'Login',
|
|
51
48
|
element: async () => {
|
|
52
|
-
const { configure,
|
|
53
|
-
|
|
54
|
-
'@genesislcap/foundation-login'
|
|
49
|
+
const { configure, defaultAuthConfig } = await import(
|
|
50
|
+
'@genesislcap/foundation-auth/config'
|
|
55
51
|
);
|
|
56
|
-
configure(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
return configure({
|
|
53
|
+
omitRoutes: ['request-account', 'forgot-password'],
|
|
54
|
+
fields: {
|
|
55
|
+
...defaultAuthConfig.fields,
|
|
56
|
+
username: {
|
|
57
|
+
...defaultAuthConfig.fields.username,
|
|
58
|
+
pattern: '^[a-zA-Z0-9.@_:-]*$',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
hostPath: this.loginPath,
|
|
62
|
+
postLoginRedirect: async () => {
|
|
63
|
+
await this.connect.connect(GENESIS_SOCKET_URL);
|
|
64
|
+
navigateTo(getUser().lastPath() ?? publicPath + '{{kebabCase routes.[0].name}}');
|
|
65
|
+
},
|
|
66
|
+
postLogoutRedirect: () => {
|
|
67
|
+
if (this.connect.isConnected) {
|
|
68
|
+
this.connect.disconnect();
|
|
69
|
+
}
|
|
70
|
+
defaultAuthConfig.postLogoutRedirect();
|
|
71
|
+
},
|
|
60
72
|
...ssoSettings,
|
|
61
73
|
});
|
|
62
|
-
return define({
|
|
63
|
-
name: `{{rootElement}}-login`,
|
|
64
|
-
/**
|
|
65
|
-
* You can augment the template and styles here when needed.
|
|
66
|
-
*/
|
|
67
|
-
});
|
|
68
74
|
},
|
|
69
75
|
layout: loginLayout,
|
|
70
76
|
settings: { public: true },
|
|
@@ -100,70 +106,22 @@ export class MainRouterConfig extends FoundationRouterConfiguration<LoginSetting
|
|
|
100
106
|
{{/each}}
|
|
101
107
|
);
|
|
102
108
|
|
|
103
|
-
/**
|
|
104
|
-
* Example of a FallbackRouteDefinition
|
|
105
|
-
*/
|
|
106
|
-
this.routes.fallback(() =>
|
|
107
|
-
this.auth.isLoggedIn ? { redirect: 'not-found' } : { redirect: authPath },
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Example of a NavigationContributor
|
|
112
|
-
*/
|
|
113
109
|
this.contributors.push({
|
|
114
110
|
navigate: async (phase) => {
|
|
115
111
|
const settings = phase.route.settings;
|
|
116
112
|
|
|
117
113
|
/**
|
|
118
|
-
* If
|
|
119
|
-
*/
|
|
120
|
-
if (settings && settings.public) {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* If logged in don't block
|
|
114
|
+
* If the route is public or the user is authenticated don't block
|
|
126
115
|
*/
|
|
127
|
-
if (this.
|
|
128
|
-
this.redirectIfNotPermitted(settings, phase);
|
|
116
|
+
if (settings?.public || this.user.isAuthenticated) {
|
|
129
117
|
return;
|
|
130
118
|
}
|
|
131
119
|
|
|
132
120
|
/**
|
|
133
|
-
*
|
|
121
|
+
* Otherwise route them to login
|
|
134
122
|
*/
|
|
135
|
-
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
/**
|
|
140
|
-
* Otherwise route them somewhere, like to a login
|
|
141
|
-
*/
|
|
142
|
-
phase.cancel(() => {
|
|
143
|
-
this.session.captureReturnUrl();
|
|
144
|
-
Route.name.replace(phase.router, authPath);
|
|
145
|
-
});
|
|
123
|
+
this.navigationPhaseLoginRedirect(phase);
|
|
146
124
|
},
|
|
147
125
|
});
|
|
148
126
|
}
|
|
149
|
-
|
|
150
|
-
private async reAuthFromSession(settings: LoginSettings, phase: NavigationPhase) {
|
|
151
|
-
return this.auth.reAuthFromSession().then((authenticated) => {
|
|
152
|
-
logger.info(`reAuthFromSession. authenticated: ${authenticated}`);
|
|
153
|
-
if (authenticated) {
|
|
154
|
-
this.redirectIfNotPermitted(settings, phase);
|
|
155
|
-
}
|
|
156
|
-
return authenticated;
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
private redirectIfNotPermitted(settings: LoginSettings, phase: NavigationPhase) {
|
|
161
|
-
const { path } = phase.route.endpoint;
|
|
162
|
-
if (settings?.isPermitted && !settings.isPermitted()) {
|
|
163
|
-
logger.warn(`Not permitted - Redirecting URL from ${path} to ${defaultNotPermittedRoute}.`);
|
|
164
|
-
phase.cancel(() => {
|
|
165
|
-
Route.name.replace(phase.router, defaultNotPermittedRoute);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
127
|
}
|
package/package.json
CHANGED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import {configure, define} from '@genesislcap/foundation-login';
|
|
2
|
-
import type { Router } from '@angular/router';
|
|
3
|
-
import { getUser } from '@genesislcap/foundation-user';
|
|
4
|
-
import { css, DI } from '@genesislcap/web-core';
|
|
5
|
-
import { AUTH_PATH } from '../app.config';
|
|
6
|
-
import logo from '../../assets/logo.svg';
|
|
7
|
-
|
|
8
|
-
// eslint-disable-next-line
|
|
9
|
-
declare var ENABLE_SSO: boolean;
|
|
10
|
-
|
|
11
|
-
const ssoSettings =
|
|
12
|
-
typeof ENABLE_SSO !== 'undefined' && ENABLE_SSO === true
|
|
13
|
-
? {
|
|
14
|
-
autoAuth: true,
|
|
15
|
-
sso: {
|
|
16
|
-
toggled: true,
|
|
17
|
-
identityProvidersPath: 'sso/list',
|
|
18
|
-
},
|
|
19
|
-
}
|
|
20
|
-
: {};
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Configure the micro frontend
|
|
24
|
-
*/
|
|
25
|
-
export const configureFoundationLogin = ({
|
|
26
|
-
router,
|
|
27
|
-
}: {
|
|
28
|
-
router: Router;
|
|
29
|
-
}) => {
|
|
30
|
-
configure(DI.getOrCreateDOMContainer(), {
|
|
31
|
-
// autoConnect: true, // < Guard in place to ensure connection. Keeping the connect form in place for now.
|
|
32
|
-
autoAuth: true, // < Allow users to skip login
|
|
33
|
-
showConnectionIndicator: true,
|
|
34
|
-
hostPath: AUTH_PATH,
|
|
35
|
-
redirectHandler: () => {
|
|
36
|
-
router.navigate([getUser().lastPath() ?? '{{kebabCase routes.[0].name}}'])
|
|
37
|
-
},
|
|
38
|
-
...ssoSettings,
|
|
39
|
-
logo: css `
|
|
40
|
-
content: url("${logo}");
|
|
41
|
-
`,
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
return define({
|
|
45
|
-
name: `client-app-login`,
|
|
46
|
-
});
|
|
47
|
-
}
|