@acorex/modules 1.0.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.
- package/README.md +7 -0
- package/auth/README.md +3 -0
- package/auth/index.d.ts +3 -0
- package/auth/lib/account/account.module.d.ts +8 -0
- package/auth/lib/account/app-chooser/app-chooser-list.component.d.ts +11 -0
- package/auth/lib/account/app-chooser/app-chooser-slot.component.d.ts +12 -0
- package/auth/lib/account/app-chooser/app-chooser.component.d.ts +13 -0
- package/auth/lib/account/profile/profile-slot.component.d.ts +16 -0
- package/auth/lib/account/tenant-chooser/tenant-chooser-dropdown.component.d.ts +10 -0
- package/auth/lib/account/tenant-chooser/tenant-chooser.component.d.ts +21 -0
- package/auth/lib/auth.config.d.ts +23 -0
- package/auth/lib/auth.module.d.ts +14 -0
- package/auth/lib/auth.routes.d.ts +2 -0
- package/auth/lib/error-handler.d.ts +10 -0
- package/auth/lib/forgot/password/password.component.d.ts +11 -0
- package/auth/lib/forgot/routes.d.ts +3 -0
- package/auth/lib/login/login.module.d.ts +7 -0
- package/auth/lib/login/password/password.component.d.ts +22 -0
- package/auth/lib/register/email/email.component.d.ts +5 -0
- package/auth/lib/register/register.module.d.ts +7 -0
- package/auth/lib/register/result/result.component.d.ts +5 -0
- package/auth/lib/shared/layouts/blank/blank.layout.d.ts +8 -0
- package/auth/lib/shared/layouts/master/master.layout.d.ts +7 -0
- package/auth/lib/shared/services/idle.service.d.ts +17 -0
- package/auth/lib/shared/services/index.d.ts +1 -0
- package/auth/lib/store/auth.effects.d.ts +18 -0
- package/auth/lib/store/index.d.ts +1 -0
- package/auth/lib/two-factor/two-factor-code/two-factor-code.component.d.ts +8 -0
- package/auth/lib/two-factor/two-factor.module.d.ts +7 -0
- package/backend/README.md +4 -0
- package/backend/index.d.ts +2 -0
- package/backend/lib/auth/oidc/application.loader.d.ts +16 -0
- package/backend/lib/auth/oidc/feature.loader.d.ts +5 -0
- package/backend/lib/auth/oidc/index.d.ts +5 -0
- package/backend/lib/auth/oidc/oidc.strategy.d.ts +19 -0
- package/backend/lib/auth/oidc/permission.loader.d.ts +5 -0
- package/backend/lib/auth/oidc/signincallback.component.d.ts +13 -0
- package/backend/lib/auth/oidc/tenant.loader.d.ts +16 -0
- package/backend/lib/auth/oidc/usermanager.service.d.ts +12 -0
- package/backend/lib/auth/userpass/application.loader.d.ts +6 -0
- package/backend/lib/auth/userpass/index.d.ts +4 -0
- package/backend/lib/auth/userpass/permission.loader.d.ts +5 -0
- package/backend/lib/auth/userpass/tenant.loader.d.ts +6 -0
- package/backend/lib/auth/userpass/userpass.strategy.d.ts +12 -0
- package/backend/lib/backend.configs.d.ts +99 -0
- package/backend/lib/backend.module.d.ts +8 -0
- package/backend/lib/data/api/data-provider.d.ts +21 -0
- package/esm2022/acorex-modules.mjs +5 -0
- package/esm2022/auth/acorex-modules-auth.mjs +5 -0
- package/esm2022/auth/index.mjs +4 -0
- package/esm2022/auth/lib/account/account.module.mjs +106 -0
- package/esm2022/auth/lib/account/app-chooser/app-chooser-list.component.mjs +31 -0
- package/esm2022/auth/lib/account/app-chooser/app-chooser-slot.component.mjs +41 -0
- package/esm2022/auth/lib/account/app-chooser/app-chooser.component.mjs +62 -0
- package/esm2022/auth/lib/account/profile/profile-slot.component.mjs +56 -0
- package/esm2022/auth/lib/account/tenant-chooser/tenant-chooser-dropdown.component.mjs +26 -0
- package/esm2022/auth/lib/account/tenant-chooser/tenant-chooser.component.mjs +81 -0
- package/esm2022/auth/lib/auth.config.mjs +22 -0
- package/esm2022/auth/lib/auth.module.mjs +45 -0
- package/esm2022/auth/lib/auth.routes.mjs +38 -0
- package/esm2022/auth/lib/error-handler.mjs +41 -0
- package/esm2022/auth/lib/forgot/password/password.component.mjs +56 -0
- package/esm2022/auth/lib/forgot/routes.mjs +7 -0
- package/esm2022/auth/lib/login/login.module.mjs +53 -0
- package/esm2022/auth/lib/login/password/password.component.mjs +99 -0
- package/esm2022/auth/lib/register/email/email.component.mjs +42 -0
- package/esm2022/auth/lib/register/register.module.mjs +59 -0
- package/esm2022/auth/lib/register/result/result.component.mjs +33 -0
- package/esm2022/auth/lib/shared/layouts/blank/blank.layout.mjs +15 -0
- package/esm2022/auth/lib/shared/layouts/master/master.layout.mjs +21 -0
- package/esm2022/auth/lib/shared/services/idle.service.mjs +42 -0
- package/esm2022/auth/lib/shared/services/index.mjs +2 -0
- package/esm2022/auth/lib/store/auth.effects.mjs +90 -0
- package/esm2022/auth/lib/store/index.mjs +3 -0
- package/esm2022/auth/lib/two-factor/two-factor-code/two-factor-code.component.mjs +37 -0
- package/esm2022/auth/lib/two-factor/two-factor.module.mjs +42 -0
- package/esm2022/backend/acorex-modules-backend.mjs +5 -0
- package/esm2022/backend/index.mjs +3 -0
- package/esm2022/backend/lib/auth/oidc/application.loader.mjs +47 -0
- package/esm2022/backend/lib/auth/oidc/feature.loader.mjs +7 -0
- package/esm2022/backend/lib/auth/oidc/index.mjs +6 -0
- package/esm2022/backend/lib/auth/oidc/oidc.strategy.mjs +77 -0
- package/esm2022/backend/lib/auth/oidc/permission.loader.mjs +7 -0
- package/esm2022/backend/lib/auth/oidc/signincallback.component.mjs +26 -0
- package/esm2022/backend/lib/auth/oidc/tenant.loader.mjs +41 -0
- package/esm2022/backend/lib/auth/oidc/usermanager.service.mjs +35 -0
- package/esm2022/backend/lib/auth/userpass/application.loader.mjs +30 -0
- package/esm2022/backend/lib/auth/userpass/index.mjs +5 -0
- package/esm2022/backend/lib/auth/userpass/permission.loader.mjs +12 -0
- package/esm2022/backend/lib/auth/userpass/tenant.loader.mjs +26 -0
- package/esm2022/backend/lib/auth/userpass/userpass.strategy.mjs +40 -0
- package/esm2022/backend/lib/backend.configs.mjs +3 -0
- package/esm2022/backend/lib/backend.module.mjs +106 -0
- package/esm2022/backend/lib/data/api/data-provider.mjs +67 -0
- package/esm2022/index.mjs +2 -0
- package/esm2022/notification/acorex-modules-notification.mjs +5 -0
- package/esm2022/notification/index.mjs +2 -0
- package/esm2022/notification/lib/notification.module.mjs +16 -0
- package/fesm2022/acorex-modules-auth-acorex-modules-auth-3tiGzryz.mjs +484 -0
- package/fesm2022/acorex-modules-auth-acorex-modules-auth-3tiGzryz.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-app-chooser.component-Hh2T5orM.mjs +70 -0
- package/fesm2022/acorex-modules-auth-app-chooser.component-Hh2T5orM.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-blank.layout-0xNRyD5z.mjs +18 -0
- package/fesm2022/acorex-modules-auth-blank.layout-0xNRyD5z.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-email.component-ZbTwT8iu.mjs +45 -0
- package/fesm2022/acorex-modules-auth-email.component-ZbTwT8iu.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-login.module-lGs54nBU.mjs +71 -0
- package/fesm2022/acorex-modules-auth-login.module-lGs54nBU.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-master.layout-ytopPv2z.mjs +37 -0
- package/fesm2022/acorex-modules-auth-master.layout-ytopPv2z.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-password.component-Q9Me4kkK.mjs +72 -0
- package/fesm2022/acorex-modules-auth-password.component-Q9Me4kkK.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-password.component-p1Ks9S5q.mjs +110 -0
- package/fesm2022/acorex-modules-auth-password.component-p1Ks9S5q.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-register.module-ckbVm-yf.mjs +77 -0
- package/fesm2022/acorex-modules-auth-register.module-ckbVm-yf.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-result.component-ORUU7lkV.mjs +36 -0
- package/fesm2022/acorex-modules-auth-result.component-ORUU7lkV.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-routes-jgo2XGe0.mjs +9 -0
- package/fesm2022/acorex-modules-auth-routes-jgo2XGe0.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-tenant-chooser.component-PeGg21Im.mjs +84 -0
- package/fesm2022/acorex-modules-auth-tenant-chooser.component-PeGg21Im.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-two-factor-code.component-fP6CLq9T.mjs +40 -0
- package/fesm2022/acorex-modules-auth-two-factor-code.component-fP6CLq9T.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth-two-factor.module--fcoNW-s.mjs +60 -0
- package/fesm2022/acorex-modules-auth-two-factor.module--fcoNW-s.mjs.map +1 -0
- package/fesm2022/acorex-modules-auth.mjs +19 -0
- package/fesm2022/acorex-modules-auth.mjs.map +1 -0
- package/fesm2022/acorex-modules-backend.mjs +488 -0
- package/fesm2022/acorex-modules-backend.mjs.map +1 -0
- package/fesm2022/acorex-modules-notification.mjs +23 -0
- package/fesm2022/acorex-modules-notification.mjs.map +1 -0
- package/fesm2022/acorex-modules.mjs +6 -0
- package/fesm2022/acorex-modules.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/notification/README.md +4 -0
- package/notification/index.d.ts +1 -0
- package/notification/lib/notification.module.d.ts +6 -0
- package/package.json +44 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, NgZone, isDevMode, Injectable, Component, ViewChild, NgModule } from '@angular/core';
|
|
3
|
+
import * as i1$2 from '@acorex/platform/common';
|
|
4
|
+
import { AXPSignOutAction, AXPSignInAction, AXPComponentSlotModule, AXPCommonModule } from '@acorex/platform/common';
|
|
5
|
+
import * as i1$1 from '@angular/common';
|
|
6
|
+
import { CommonModule } from '@angular/common';
|
|
7
|
+
import { HttpErrorResponse, HttpClientModule } from '@angular/common/http';
|
|
8
|
+
import * as i2 from '@angular/router';
|
|
9
|
+
import { Router, RouterModule, ROUTES } from '@angular/router';
|
|
10
|
+
import * as i1 from '@ngrx/effects';
|
|
11
|
+
import { createEffect, ofType, EffectsModule } from '@ngrx/effects';
|
|
12
|
+
import { AXPUnauthorizedError, AXPUnauthenticatedError, AXPSessionService, AXPAuthGuard } from '@acorex/platform/auth';
|
|
13
|
+
import { AXDialogService } from '@acorex/components/dialog';
|
|
14
|
+
import { Subject, timer, switchMap as switchMap$1, of, tap as tap$1, firstValueFrom } from 'rxjs';
|
|
15
|
+
import { startWith, switchMap, tap } from 'rxjs/operators';
|
|
16
|
+
import * as i5 from '@acorex/components/button';
|
|
17
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
18
|
+
import * as i7 from '@acorex/components/decorators';
|
|
19
|
+
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
20
|
+
import * as i3$1 from '@acorex/components/popover';
|
|
21
|
+
import { AXPopoverModule } from '@acorex/components/popover';
|
|
22
|
+
import { AXPLogoComponent } from '@acorex/platform/layouts';
|
|
23
|
+
import * as i3 from '@acorex/components/loading';
|
|
24
|
+
import { AXLoadingModule } from '@acorex/components/loading';
|
|
25
|
+
import * as i3$2 from '@acorex/components/avatar';
|
|
26
|
+
import { AXAvatarModule } from '@acorex/components/avatar';
|
|
27
|
+
import * as i2$1 from '@acorex/components/image';
|
|
28
|
+
import { AXImageModule } from '@acorex/components/image';
|
|
29
|
+
|
|
30
|
+
var AXMAuthenticationTypes;
|
|
31
|
+
(function (AXMAuthenticationTypes) {
|
|
32
|
+
AXMAuthenticationTypes[AXMAuthenticationTypes["UsernamePassword"] = 0] = "UsernamePassword";
|
|
33
|
+
AXMAuthenticationTypes[AXMAuthenticationTypes["EmailPassword"] = 1] = "EmailPassword";
|
|
34
|
+
AXMAuthenticationTypes[AXMAuthenticationTypes["MobilePassword"] = 2] = "MobilePassword";
|
|
35
|
+
AXMAuthenticationTypes[AXMAuthenticationTypes["EmailCode"] = 3] = "EmailCode";
|
|
36
|
+
AXMAuthenticationTypes[AXMAuthenticationTypes["MobileCode"] = 4] = "MobileCode";
|
|
37
|
+
})(AXMAuthenticationTypes || (AXMAuthenticationTypes = {}));
|
|
38
|
+
const AXM_AUTH_CONFIG_TOKEN = new InjectionToken('app-module-auth-config', {
|
|
39
|
+
providedIn: 'root',
|
|
40
|
+
factory: () => {
|
|
41
|
+
return AXMDefaultAuthConfigs;
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
const AXMDefaultAuthConfigs = {
|
|
45
|
+
type: AXMAuthenticationTypes.EmailPassword,
|
|
46
|
+
};
|
|
47
|
+
function configAuthModule(config = AXMDefaultAuthConfigs) {
|
|
48
|
+
return { ...AXMDefaultAuthConfigs, ...config };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const routes = [
|
|
52
|
+
{
|
|
53
|
+
path: 'auth',
|
|
54
|
+
children: [
|
|
55
|
+
{
|
|
56
|
+
path: '',
|
|
57
|
+
pathMatch: 'full',
|
|
58
|
+
redirectTo: 'login',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
path: '',
|
|
62
|
+
loadComponent: () => import('./acorex-modules-auth-master.layout-ytopPv2z.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
63
|
+
loadChildren: () => import('./acorex-modules-auth-login.module-lGs54nBU.mjs').then((c) => c.AXPSignInModule),
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
path: '',
|
|
67
|
+
loadComponent: () => import('./acorex-modules-auth-master.layout-ytopPv2z.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
68
|
+
loadChildren: () => import('./acorex-modules-auth-two-factor.module--fcoNW-s.mjs').then((c) => c.AXPTwoFactorModule),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
path: '',
|
|
72
|
+
loadComponent: () => import('./acorex-modules-auth-master.layout-ytopPv2z.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
73
|
+
loadChildren: () => import('./acorex-modules-auth-routes-jgo2XGe0.mjs').then((c) => c),
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
path: 'account',
|
|
77
|
+
loadComponent: () => import('./acorex-modules-auth-blank.layout-0xNRyD5z.mjs').then((c) => c.AXPAuthBlankLayoutComponent),
|
|
78
|
+
loadChildren: () => Promise.resolve().then(function () { return account_module; }).then((c) => c.AXPAccountModule),
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
path: '',
|
|
82
|
+
loadComponent: () => import('./acorex-modules-auth-master.layout-ytopPv2z.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
83
|
+
loadChildren: () => import('./acorex-modules-auth-register.module-ckbVm-yf.mjs').then((c) => c.AXPRegisterModule),
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
class AXMAuthErrorHandler {
|
|
90
|
+
constructor() {
|
|
91
|
+
this.router = inject(Router);
|
|
92
|
+
this.zone = inject(NgZone);
|
|
93
|
+
}
|
|
94
|
+
handleError(error, next) {
|
|
95
|
+
if (error instanceof HttpErrorResponse) {
|
|
96
|
+
if (error.status == 401) {
|
|
97
|
+
this.router.navigate(['/auth/login']);
|
|
98
|
+
}
|
|
99
|
+
else if (error.status == 404) {
|
|
100
|
+
this.router.navigate(['/404']);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else if (error instanceof AXPUnauthorizedError) {
|
|
104
|
+
this.router.navigate(['/401']);
|
|
105
|
+
}
|
|
106
|
+
else if (error instanceof AXPUnauthenticatedError) {
|
|
107
|
+
this.router.navigate(['/auth/login']);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
if (isDevMode()) {
|
|
111
|
+
next(error); // Pass the error to the next handler
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
next(error); // maybe we need a error page
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthErrorHandler, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
119
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthErrorHandler }); }
|
|
120
|
+
}
|
|
121
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthErrorHandler, decorators: [{
|
|
122
|
+
type: Injectable
|
|
123
|
+
}], ctorParameters: () => [] });
|
|
124
|
+
|
|
125
|
+
class AXPIdleService {
|
|
126
|
+
constructor() {
|
|
127
|
+
this.configs = inject(AXM_AUTH_CONFIG_TOKEN);
|
|
128
|
+
this.idle$ = new Subject();
|
|
129
|
+
this.timeoutDuration = this.configs.idleTimeout ?? 10 * 60 * 1000;
|
|
130
|
+
this.userActivity$ = new Subject();
|
|
131
|
+
this.idleSubscription = null;
|
|
132
|
+
this.setupActivityListeners();
|
|
133
|
+
}
|
|
134
|
+
get idleState$() {
|
|
135
|
+
return this.idle$.asObservable();
|
|
136
|
+
}
|
|
137
|
+
setupActivityListeners() {
|
|
138
|
+
const activityEvents = ['mousemove', 'keydown', 'wheel'];
|
|
139
|
+
activityEvents.forEach(event => document.addEventListener(event, () => this.resetTimer()));
|
|
140
|
+
}
|
|
141
|
+
startWatching() {
|
|
142
|
+
this.stopWatching(); // Stop any existing subscription
|
|
143
|
+
this.idleSubscription = this.userActivity$.pipe(startWith(null), switchMap(() => timer(this.timeoutDuration)), tap(() => this.idle$.next())).subscribe();
|
|
144
|
+
}
|
|
145
|
+
resetTimer() {
|
|
146
|
+
this.userActivity$.next();
|
|
147
|
+
}
|
|
148
|
+
stopWatching() {
|
|
149
|
+
if (this.idleSubscription) {
|
|
150
|
+
this.idleSubscription.unsubscribe();
|
|
151
|
+
this.idleSubscription = null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPIdleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
155
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPIdleService, providedIn: 'root' }); }
|
|
156
|
+
}
|
|
157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPIdleService, decorators: [{
|
|
158
|
+
type: Injectable,
|
|
159
|
+
args: [{ providedIn: 'root' }]
|
|
160
|
+
}], ctorParameters: () => [] });
|
|
161
|
+
|
|
162
|
+
class AXPAuthEffects {
|
|
163
|
+
constructor(actions$, router) {
|
|
164
|
+
this.actions$ = actions$;
|
|
165
|
+
this.router = router;
|
|
166
|
+
this.configs = inject(AXM_AUTH_CONFIG_TOKEN);
|
|
167
|
+
this.sessionService = inject(AXPSessionService);
|
|
168
|
+
this.idleService = inject(AXPIdleService);
|
|
169
|
+
this.dialogService = inject(AXDialogService);
|
|
170
|
+
this.dialogAlreadyOpen = false;
|
|
171
|
+
this.signout$ = createEffect(() => this.actions$.pipe(ofType(AXPSignOutAction), switchMap$1((action) => {
|
|
172
|
+
this.idleService.stopWatching();
|
|
173
|
+
this.router.navigate(['/auth/login']);
|
|
174
|
+
return of();
|
|
175
|
+
})), { dispatch: false });
|
|
176
|
+
this.signin$ = createEffect(() => this.actions$.pipe(ofType(AXPSignInAction), switchMap$1((action) => {
|
|
177
|
+
if (this.configs.idleTimeout) {
|
|
178
|
+
this.idleService.startWatching();
|
|
179
|
+
}
|
|
180
|
+
return of();
|
|
181
|
+
})), { dispatch: false });
|
|
182
|
+
this.idle$ = createEffect(() => this.idleService.idleState$.pipe(tap$1(() => {
|
|
183
|
+
if (!this.dialogAlreadyOpen) {
|
|
184
|
+
let time = 60;
|
|
185
|
+
let intervalId;
|
|
186
|
+
const buttonText = (time) => `Stay Sign In (${time})`;
|
|
187
|
+
const stayButton = {
|
|
188
|
+
text: buttonText(time),
|
|
189
|
+
color: 'primary',
|
|
190
|
+
autofocus: true,
|
|
191
|
+
onClick: () => {
|
|
192
|
+
this.idleService.resetTimer();
|
|
193
|
+
dialog.close();
|
|
194
|
+
this.dialogAlreadyOpen = false;
|
|
195
|
+
clearInterval(intervalId);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
const dialog = this.dialogService.open({
|
|
199
|
+
title: "Session Timeout",
|
|
200
|
+
content: "You're being timed out due to inactivity. Please choose to stay signed in or to sign off. Otherwise, you will signed off automatically.",
|
|
201
|
+
type: 'warning',
|
|
202
|
+
buttons: [
|
|
203
|
+
{
|
|
204
|
+
text: "Sign Off",
|
|
205
|
+
color: 'ghost',
|
|
206
|
+
onClick: async () => {
|
|
207
|
+
await this.sessionService.signout();
|
|
208
|
+
dialog.close();
|
|
209
|
+
this.dialogAlreadyOpen = false;
|
|
210
|
+
clearInterval(intervalId);
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
stayButton,
|
|
214
|
+
]
|
|
215
|
+
});
|
|
216
|
+
this.dialogAlreadyOpen = true;
|
|
217
|
+
// Automatically close dialog and sign out after additional time
|
|
218
|
+
intervalId = setInterval(() => {
|
|
219
|
+
if (time > 0) {
|
|
220
|
+
stayButton.text = buttonText(--time);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
clearInterval(intervalId);
|
|
224
|
+
this.sessionService.signout();
|
|
225
|
+
dialog.close();
|
|
226
|
+
this.dialogAlreadyOpen = false;
|
|
227
|
+
}
|
|
228
|
+
}, 1000);
|
|
229
|
+
//
|
|
230
|
+
}
|
|
231
|
+
})), { dispatch: false });
|
|
232
|
+
}
|
|
233
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAuthEffects, deps: [{ token: i1.Actions }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
234
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAuthEffects }); }
|
|
235
|
+
}
|
|
236
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAuthEffects, decorators: [{
|
|
237
|
+
type: Injectable
|
|
238
|
+
}], ctorParameters: () => [{ type: i1.Actions }, { type: i2.Router }] });
|
|
239
|
+
|
|
240
|
+
//export * from './auth.actions';
|
|
241
|
+
|
|
242
|
+
class AXPAppChooserListComponent {
|
|
243
|
+
constructor() {
|
|
244
|
+
this.router = inject(Router);
|
|
245
|
+
this.sessionService = inject(AXPSessionService);
|
|
246
|
+
this.selectedApplication = null;
|
|
247
|
+
this.applications$ = this.sessionService.applications$;
|
|
248
|
+
}
|
|
249
|
+
async chooseApplication(item) {
|
|
250
|
+
this.selectedApplication = item;
|
|
251
|
+
await this.sessionService.selectApplication(item.name);
|
|
252
|
+
this.router.navigate([`/${item.name}/home`]);
|
|
253
|
+
}
|
|
254
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAppChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
255
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: AXPAppChooserListComponent, isStandalone: true, selector: "axp-app-chooser-list", ngImport: i0, template: "<div class=\" ax-w-full ax-overflow-auto ax-max-h-[300px] ax-pe-2\">\n @for(application of (applications$ | async); track $index){\n <div\n class=\"ax-flex ax-gap-2 ax-justify-between ax-border-b last:ax-border-b-0 ax-py-3 ax-items-start ax-cursor-pointer\"\n (click)=\"chooseApplication(application)\"\n >\n <div class=\"ax-flex ax-flex-1 ax-gap-2 ax-items-center ax-justify-center ax-font-medium\">\n <div class=\"ax-w-12 ax-h-12 ax-flex ax-justify-center ax-items-center ax-rounded-full ax-bg-neutral-100 ax-m-auto\">\n <ax-icon class=\"fa-solid fa-computer ax-text-neutral-500 ax-text-lg\"> </ax-icon>\n <!-- TODO: logo instead of application icon -->\n <!-- <axp-logo [source]=\"application.logo\" [attr.alt]=\"application.title\"\n class=\"!ax-flex ax-items-center ax-justify-center !ax-text-sm ax-mx-auto ax-w-10 ax-h-10 ax-bg-neutral-200 ax-rounded-full\"></axp-logo> -->\n </div>\n <span class=\"ax-flex-1 ax-text-start md:ax-text-base ax-text-sm\">{{ application.title }}</span>\n <span class=\"ax-text-gray-500 md:ax-text-sm ax-text-xs\">{{application.editionName}}</span>\n @if(application.name===selectedApplication?.name){\n <ax-loading></ax-loading>\n }@else {\n <ax-icon class=\"fa-solid fa-chevron-right ax-text-neutral-400\"> </ax-icon>\n }\n </div>\n </div>\n }\n</div>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i7.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i3.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }] }); }
|
|
256
|
+
}
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAppChooserListComponent, decorators: [{
|
|
258
|
+
type: Component,
|
|
259
|
+
args: [{ selector: 'axp-app-chooser-list', standalone: true, imports: [CommonModule, AXDecoratorModule, AXPLogoComponent, AXLoadingModule], template: "<div class=\" ax-w-full ax-overflow-auto ax-max-h-[300px] ax-pe-2\">\n @for(application of (applications$ | async); track $index){\n <div\n class=\"ax-flex ax-gap-2 ax-justify-between ax-border-b last:ax-border-b-0 ax-py-3 ax-items-start ax-cursor-pointer\"\n (click)=\"chooseApplication(application)\"\n >\n <div class=\"ax-flex ax-flex-1 ax-gap-2 ax-items-center ax-justify-center ax-font-medium\">\n <div class=\"ax-w-12 ax-h-12 ax-flex ax-justify-center ax-items-center ax-rounded-full ax-bg-neutral-100 ax-m-auto\">\n <ax-icon class=\"fa-solid fa-computer ax-text-neutral-500 ax-text-lg\"> </ax-icon>\n <!-- TODO: logo instead of application icon -->\n <!-- <axp-logo [source]=\"application.logo\" [attr.alt]=\"application.title\"\n class=\"!ax-flex ax-items-center ax-justify-center !ax-text-sm ax-mx-auto ax-w-10 ax-h-10 ax-bg-neutral-200 ax-rounded-full\"></axp-logo> -->\n </div>\n <span class=\"ax-flex-1 ax-text-start md:ax-text-base ax-text-sm\">{{ application.title }}</span>\n <span class=\"ax-text-gray-500 md:ax-text-sm ax-text-xs\">{{application.editionName}}</span>\n @if(application.name===selectedApplication?.name){\n <ax-loading></ax-loading>\n }@else {\n <ax-icon class=\"fa-solid fa-chevron-right ax-text-neutral-400\"> </ax-icon>\n }\n </div>\n </div>\n }\n</div>" }]
|
|
260
|
+
}] });
|
|
261
|
+
|
|
262
|
+
class AXMAppChooserSlotComponent {
|
|
263
|
+
constructor() {
|
|
264
|
+
this.sessionService = inject(AXPSessionService);
|
|
265
|
+
this.tenant$ = this.sessionService.tenant$;
|
|
266
|
+
this.application$ = this.sessionService.application$;
|
|
267
|
+
this.applications$ = this.sessionService.applications$;
|
|
268
|
+
this.router = inject(Router);
|
|
269
|
+
}
|
|
270
|
+
async chooseApplication(item) {
|
|
271
|
+
await this.sessionService.selectApplication(item.name);
|
|
272
|
+
this.router.navigate([`/${item.name}/home`]);
|
|
273
|
+
}
|
|
274
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAppChooserSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
275
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: AXMAppChooserSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "@if(((applications$ | async)?.length ?? 0) > 1)\n{\n<ax-button color=\"default\" look=\"blank\" #appChooser>\n <ax-icon>\n <i class=\"fa-solid fa-grid-2 ax-text-slate-400 dark:ax-text-slate-200\"></i>\n </ax-icon>\n</ax-button>\n<ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div class=\"ax-bg-surface ax-border ax-overflow-hidden ax-rounded-md ax-shadow-md ax-w-full ax-min-w-64 ax-p-3\">\n <axp-app-chooser-list></axp-app-chooser-list>\n </div>\n</ax-popover>\n}", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "backdropClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i7.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list" }] }); }
|
|
276
|
+
}
|
|
277
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAppChooserSlotComponent, decorators: [{
|
|
278
|
+
type: Component,
|
|
279
|
+
args: [{ standalone: true, imports: [
|
|
280
|
+
CommonModule,
|
|
281
|
+
AXButtonModule,
|
|
282
|
+
AXPopoverModule,
|
|
283
|
+
AXDecoratorModule,
|
|
284
|
+
AXPLogoComponent,
|
|
285
|
+
AXPAppChooserListComponent
|
|
286
|
+
], template: "@if(((applications$ | async)?.length ?? 0) > 1)\n{\n<ax-button color=\"default\" look=\"blank\" #appChooser>\n <ax-icon>\n <i class=\"fa-solid fa-grid-2 ax-text-slate-400 dark:ax-text-slate-200\"></i>\n </ax-icon>\n</ax-button>\n<ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div class=\"ax-bg-surface ax-border ax-overflow-hidden ax-rounded-md ax-shadow-md ax-w-full ax-min-w-64 ax-p-3\">\n <axp-app-chooser-list></axp-app-chooser-list>\n </div>\n</ax-popover>\n}" }]
|
|
287
|
+
}] });
|
|
288
|
+
|
|
289
|
+
class AXPTenantChooserDropdownComponent {
|
|
290
|
+
constructor() {
|
|
291
|
+
this.router = inject(Router);
|
|
292
|
+
this.sessionService = inject(AXPSessionService);
|
|
293
|
+
this.tenants$ = this.sessionService.tenants$;
|
|
294
|
+
this.tenant = this.sessionService.tenant;
|
|
295
|
+
}
|
|
296
|
+
tenantChooser() {
|
|
297
|
+
this.router.navigate(['/auth/account/tenant-chooser']);
|
|
298
|
+
}
|
|
299
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPTenantChooserDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
300
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: AXPTenantChooserDropdownComponent, isStandalone: true, selector: "axp-tenant-chooser-dropdown", ngImport: i0, template: "<ng-container *ngIf=\"tenants$ | async as tenants\">\n @if(tenants.length>1){\n <div (click)=\"tenantChooser()\"\n class=\"ax-flex ax-items-center ax-border ax-rounded-full ax-px-4 ax-py-1 ax-gap-2 ax-cursor-pointer\">\n <ax-icon class=\"fa-solid fa-building ax-text-neutral-500 ax-text-xs\"></ax-icon>\n <p class=\"ax-text-neutral-500 ax-text-sm ax-font-medium\">\n {{ tenant?.title }}\n </p>\n <ax-icon class=\"fa-regular fa-chevron-down ax-text-neutral-400\"></ax-icon>\n </div>\n }@else {\n <div class=\"ax-flex ax-items-center ax-border ax-rounded-full ax-px-4 ax-py-1 ax-gap-2 ax-cursor-pointer\">\n <ax-icon class=\"fa-solid fa-building ax-text-neutral-500\"></ax-icon>\n <p class=\"ax-text-neutral-500 ax-text-sm ax-font-medium\">\n {{ tenant?.title }}\n </p>\n </div>\n }\n</ng-container>", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i7.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }] }); }
|
|
301
|
+
}
|
|
302
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPTenantChooserDropdownComponent, decorators: [{
|
|
303
|
+
type: Component,
|
|
304
|
+
args: [{ selector: 'axp-tenant-chooser-dropdown', standalone: true, imports: [CommonModule, AXDecoratorModule], template: "<ng-container *ngIf=\"tenants$ | async as tenants\">\n @if(tenants.length>1){\n <div (click)=\"tenantChooser()\"\n class=\"ax-flex ax-items-center ax-border ax-rounded-full ax-px-4 ax-py-1 ax-gap-2 ax-cursor-pointer\">\n <ax-icon class=\"fa-solid fa-building ax-text-neutral-500 ax-text-xs\"></ax-icon>\n <p class=\"ax-text-neutral-500 ax-text-sm ax-font-medium\">\n {{ tenant?.title }}\n </p>\n <ax-icon class=\"fa-regular fa-chevron-down ax-text-neutral-400\"></ax-icon>\n </div>\n }@else {\n <div class=\"ax-flex ax-items-center ax-border ax-rounded-full ax-px-4 ax-py-1 ax-gap-2 ax-cursor-pointer\">\n <ax-icon class=\"fa-solid fa-building ax-text-neutral-500\"></ax-icon>\n <p class=\"ax-text-neutral-500 ax-text-sm ax-font-medium\">\n {{ tenant?.title }}\n </p>\n </div>\n }\n</ng-container>" }]
|
|
305
|
+
}] });
|
|
306
|
+
|
|
307
|
+
class AXMAuthProfileSlotComponent {
|
|
308
|
+
constructor() {
|
|
309
|
+
this.router = inject(Router);
|
|
310
|
+
this.sessionService = inject(AXPSessionService);
|
|
311
|
+
this.user$ = this.sessionService.user$;
|
|
312
|
+
this.tenant$ = this.sessionService.tenant$;
|
|
313
|
+
this.isAuthenticated$ = this.sessionService.isAuthenticated$;
|
|
314
|
+
}
|
|
315
|
+
editProfile() {
|
|
316
|
+
this.router.navigate(['/asc/profile/e/profile/0/view']);
|
|
317
|
+
}
|
|
318
|
+
async logOut() {
|
|
319
|
+
await this.sessionService.signout();
|
|
320
|
+
}
|
|
321
|
+
toggleProfileMenu() {
|
|
322
|
+
this.profilePopover.open();
|
|
323
|
+
}
|
|
324
|
+
handleSignIn() {
|
|
325
|
+
this.router.navigate(["/auth/login"]);
|
|
326
|
+
}
|
|
327
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthProfileSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
328
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: AXMAuthProfileSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "profilePopover", first: true, predicate: ["profilePopover"], descendants: true }], ngImport: i0, template: "@if((isAuthenticated$ | async))\n{\n<ax-avatar #avatar color=\"secondary\" [size]=\"32\" class=\"ax-cursor-pointer ax-ms-4\">\n <ax-image [src]=\"(user$ | async)?.avatar\"></ax-image>\n</ax-avatar>\n<ax-popover [target]=\"avatar\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\">\n <div class=\"ax-bg-surface ax-border ax-border-default ax-rounded-md ax-shadow-md ax-w-full ax-min-w-64\">\n <div class=\"ax-flex ax-flex-col ax-items-center ax-p-4 ax-border-b\">\n <ax-avatar [size]=\"60\">\n <ax-image [src]=\"(user$ | async)?.avatar\"></ax-image>\n </ax-avatar>\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-mt-2 ax-gap-1\">\n <div class=\"ax-text-base ax-font-bold\">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"profile-menus ax-text-slate-500\">\n <!-- <ul>\n <li>\n <i class=\"fa-solid fa-folder-open\"></i>\n <span> Project Management </span>\n </li>\n <li>\n <i class=\"fa-solid fa-envelope-open-text\"></i>\n <span>Email Config</span>\n </li>\n <li>\n <i class=\"fa-solid fa-gear\"></i>\n <span>Setting</span>\n </li>\n </ul> -->\n <ul>\n <!-- <li>\n <i class=\"fa-solid fa-gem ax-text-primary-500\"></i>\n <span> Upgrade account </span>\n </li> -->\n <li (click)=\"editProfile()\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Edit profile</span>\n </li>\n </ul>\n <ul>\n <li class=\"ax-text-danger-500\" (click)=\"logOut()\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n <span> Logout </span>\n </li>\n </ul>\n </div>\n </div>\n</ax-popover>\n} @else {\n<ax-button color=\"default\" look=\"blank\" text=\"Sign Up / Sign In\" (click)=\"handleSignIn()\">\n <ax-icon>\n <i class=\"fa-solid fa-user ax-text-slate-400 dark:ax-text-slate-200\"></i>\n </ax-icon>\n</ax-button>\n<!-- <ax-popover [target]=\"signIn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\">\n <div class=\"ax-bg-surface ax-border ax-border-default ax-rounded-md ax-shadow-md ax-w-full ax-p-4\">\n Test\n </div>\n</ax-popover> -->\n}", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i2$1.AXImageComponent, selector: "ax-image", inputs: ["overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "component", type: i3$2.AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "look"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i3$1.AXPopoverComponent, selector: "ax-popover", inputs: ["offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "backdropClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i5.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i7.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown" }] }); }
|
|
329
|
+
}
|
|
330
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthProfileSlotComponent, decorators: [{
|
|
331
|
+
type: Component,
|
|
332
|
+
args: [{ standalone: true, imports: [
|
|
333
|
+
CommonModule,
|
|
334
|
+
AXImageModule,
|
|
335
|
+
AXAvatarModule,
|
|
336
|
+
AXPopoverModule,
|
|
337
|
+
AXButtonModule,
|
|
338
|
+
AXDecoratorModule,
|
|
339
|
+
AXPTenantChooserDropdownComponent
|
|
340
|
+
], template: "@if((isAuthenticated$ | async))\n{\n<ax-avatar #avatar color=\"secondary\" [size]=\"32\" class=\"ax-cursor-pointer ax-ms-4\">\n <ax-image [src]=\"(user$ | async)?.avatar\"></ax-image>\n</ax-avatar>\n<ax-popover [target]=\"avatar\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\">\n <div class=\"ax-bg-surface ax-border ax-border-default ax-rounded-md ax-shadow-md ax-w-full ax-min-w-64\">\n <div class=\"ax-flex ax-flex-col ax-items-center ax-p-4 ax-border-b\">\n <ax-avatar [size]=\"60\">\n <ax-image [src]=\"(user$ | async)?.avatar\"></ax-image>\n </ax-avatar>\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-mt-2 ax-gap-1\">\n <div class=\"ax-text-base ax-font-bold\">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"profile-menus ax-text-slate-500\">\n <!-- <ul>\n <li>\n <i class=\"fa-solid fa-folder-open\"></i>\n <span> Project Management </span>\n </li>\n <li>\n <i class=\"fa-solid fa-envelope-open-text\"></i>\n <span>Email Config</span>\n </li>\n <li>\n <i class=\"fa-solid fa-gear\"></i>\n <span>Setting</span>\n </li>\n </ul> -->\n <ul>\n <!-- <li>\n <i class=\"fa-solid fa-gem ax-text-primary-500\"></i>\n <span> Upgrade account </span>\n </li> -->\n <li (click)=\"editProfile()\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Edit profile</span>\n </li>\n </ul>\n <ul>\n <li class=\"ax-text-danger-500\" (click)=\"logOut()\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n <span> Logout </span>\n </li>\n </ul>\n </div>\n </div>\n</ax-popover>\n} @else {\n<ax-button color=\"default\" look=\"blank\" text=\"Sign Up / Sign In\" (click)=\"handleSignIn()\">\n <ax-icon>\n <i class=\"fa-solid fa-user ax-text-slate-400 dark:ax-text-slate-200\"></i>\n </ax-icon>\n</ax-button>\n<!-- <ax-popover [target]=\"signIn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\">\n <div class=\"ax-bg-surface ax-border ax-border-default ax-rounded-md ax-shadow-md ax-w-full ax-p-4\">\n Test\n </div>\n</ax-popover> -->\n}" }]
|
|
341
|
+
}], propDecorators: { profilePopover: [{
|
|
342
|
+
type: ViewChild,
|
|
343
|
+
args: ['profilePopover']
|
|
344
|
+
}] } });
|
|
345
|
+
|
|
346
|
+
const canActivateTenantChooser = async (route, state) => {
|
|
347
|
+
const sessionService = inject(AXPSessionService);
|
|
348
|
+
const router = inject(Router);
|
|
349
|
+
const tenant = await firstValueFrom(sessionService.tenants$);
|
|
350
|
+
if (tenant.length == 0) {
|
|
351
|
+
return router.createUrlTree(['/auth/login']);
|
|
352
|
+
}
|
|
353
|
+
if (tenant.length == 1) {
|
|
354
|
+
await sessionService.selectTenant(tenant[0].name);
|
|
355
|
+
return router.createUrlTree(['/auth/account/app-chooser']);
|
|
356
|
+
}
|
|
357
|
+
return true;
|
|
358
|
+
};
|
|
359
|
+
const canActivateAppChooser = async (route, state) => {
|
|
360
|
+
const sessionService = inject(AXPSessionService);
|
|
361
|
+
const router = inject(Router);
|
|
362
|
+
const apps = await firstValueFrom(sessionService.applications$);
|
|
363
|
+
if (apps.length == 0) {
|
|
364
|
+
return router.createUrlTree(['/auth/login']);
|
|
365
|
+
}
|
|
366
|
+
if (apps.length == 1) {
|
|
367
|
+
await sessionService.selectApplication(apps[0].name);
|
|
368
|
+
return router.createUrlTree([`/${apps[0].name}/home`]);
|
|
369
|
+
}
|
|
370
|
+
return true;
|
|
371
|
+
};
|
|
372
|
+
function routesFacory() {
|
|
373
|
+
let routes = [];
|
|
374
|
+
routes = [
|
|
375
|
+
{
|
|
376
|
+
path: 'tenant-chooser',
|
|
377
|
+
loadComponent: () => import('./acorex-modules-auth-tenant-chooser.component-PeGg21Im.mjs').then((c) => c.AXPAuthTenantChooserComponent),
|
|
378
|
+
canActivate: [AXPAuthGuard, canActivateTenantChooser]
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
path: 'app-chooser',
|
|
382
|
+
loadComponent: () => import('./acorex-modules-auth-app-chooser.component-Hh2T5orM.mjs').then((c) => c.AXPAuthAppChooserComponent),
|
|
383
|
+
canActivate: [AXPAuthGuard, canActivateAppChooser]
|
|
384
|
+
},
|
|
385
|
+
];
|
|
386
|
+
return routes;
|
|
387
|
+
}
|
|
388
|
+
class AXPAccountModule {
|
|
389
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAccountModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
390
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.1.2", ngImport: i0, type: AXPAccountModule, imports: [RouterModule, i1$2.AXPComponentSlotModule] }); }
|
|
391
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAccountModule, providers: [
|
|
392
|
+
{
|
|
393
|
+
provide: ROUTES,
|
|
394
|
+
multi: true,
|
|
395
|
+
useFactory: routesFacory,
|
|
396
|
+
},
|
|
397
|
+
], imports: [RouterModule,
|
|
398
|
+
//
|
|
399
|
+
AXPComponentSlotModule.forChild({
|
|
400
|
+
"header-end": [
|
|
401
|
+
{
|
|
402
|
+
name: "app-choser",
|
|
403
|
+
component: AXMAppChooserSlotComponent,
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
name: "profile",
|
|
407
|
+
component: AXMAuthProfileSlotComponent,
|
|
408
|
+
},
|
|
409
|
+
]
|
|
410
|
+
})] }); }
|
|
411
|
+
}
|
|
412
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXPAccountModule, decorators: [{
|
|
413
|
+
type: NgModule,
|
|
414
|
+
args: [{
|
|
415
|
+
declarations: [],
|
|
416
|
+
imports: [
|
|
417
|
+
RouterModule,
|
|
418
|
+
//
|
|
419
|
+
AXPComponentSlotModule.forChild({
|
|
420
|
+
"header-end": [
|
|
421
|
+
{
|
|
422
|
+
name: "app-choser",
|
|
423
|
+
component: AXMAppChooserSlotComponent,
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
name: "profile",
|
|
427
|
+
component: AXMAuthProfileSlotComponent,
|
|
428
|
+
},
|
|
429
|
+
]
|
|
430
|
+
})
|
|
431
|
+
],
|
|
432
|
+
exports: [],
|
|
433
|
+
providers: [
|
|
434
|
+
{
|
|
435
|
+
provide: ROUTES,
|
|
436
|
+
multi: true,
|
|
437
|
+
useFactory: routesFacory,
|
|
438
|
+
},
|
|
439
|
+
],
|
|
440
|
+
}]
|
|
441
|
+
}] });
|
|
442
|
+
|
|
443
|
+
var account_module = /*#__PURE__*/Object.freeze({
|
|
444
|
+
__proto__: null,
|
|
445
|
+
AXPAccountModule: AXPAccountModule
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
class AXMAuthModule {
|
|
449
|
+
static forRoot() {
|
|
450
|
+
return {
|
|
451
|
+
ngModule: AXMAuthModule,
|
|
452
|
+
providers: [],
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
456
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$2.AXPCommonModule, HttpClientModule, i2.RouterModule, i1.EffectsFeatureModule, AXPAccountModule] }); }
|
|
457
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthModule, providers: [AXMAuthErrorHandler], imports: [CommonModule,
|
|
458
|
+
AXPCommonModule.forChild({ errorHandlers: [AXMAuthErrorHandler] }),
|
|
459
|
+
HttpClientModule,
|
|
460
|
+
RouterModule.forChild(routes),
|
|
461
|
+
EffectsModule.forFeature([AXPAuthEffects]),
|
|
462
|
+
AXPAccountModule] }); }
|
|
463
|
+
}
|
|
464
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AXMAuthModule, decorators: [{
|
|
465
|
+
type: NgModule,
|
|
466
|
+
args: [{
|
|
467
|
+
imports: [
|
|
468
|
+
CommonModule,
|
|
469
|
+
AXPCommonModule.forChild({ errorHandlers: [AXMAuthErrorHandler] }),
|
|
470
|
+
HttpClientModule,
|
|
471
|
+
RouterModule.forChild(routes),
|
|
472
|
+
EffectsModule.forFeature([AXPAuthEffects]),
|
|
473
|
+
AXPAccountModule
|
|
474
|
+
],
|
|
475
|
+
providers: [AXMAuthErrorHandler],
|
|
476
|
+
}]
|
|
477
|
+
}] });
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Generated bundle index. Do not edit.
|
|
481
|
+
*/
|
|
482
|
+
|
|
483
|
+
export { AXM_AUTH_CONFIG_TOKEN as A, AXMAuthenticationTypes as a, AXPTenantChooserDropdownComponent as b, AXPAppChooserListComponent as c, AXMDefaultAuthConfigs as d, configAuthModule as e, AXMAuthModule as f, AXPIdleService as g };
|
|
484
|
+
//# sourceMappingURL=acorex-modules-auth-acorex-modules-auth-3tiGzryz.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-modules-auth-acorex-modules-auth-3tiGzryz.mjs","sources":["../../../../libs/modules/auth/src/lib/auth.config.ts","../../../../libs/modules/auth/src/lib/auth.routes.ts","../../../../libs/modules/auth/src/lib/error-handler.ts","../../../../libs/modules/auth/src/lib/shared/services/idle.service.ts","../../../../libs/modules/auth/src/lib/store/auth.effects.ts","../../../../libs/modules/auth/src/lib/store/index.ts","../../../../libs/modules/auth/src/lib/account/app-chooser/app-chooser-list.component.ts","../../../../libs/modules/auth/src/lib/account/app-chooser/app-chooser-list.component.html","../../../../libs/modules/auth/src/lib/account/app-chooser/app-chooser-slot.component.ts","../../../../libs/modules/auth/src/lib/account/app-chooser/app-chooser-slot.component.html","../../../../libs/modules/auth/src/lib/account/tenant-chooser/tenant-chooser-dropdown.component.ts","../../../../libs/modules/auth/src/lib/account/tenant-chooser/tenant-chooser-dropdown.component.html","../../../../libs/modules/auth/src/lib/account/profile/profile-slot.component.ts","../../../../libs/modules/auth/src/lib/account/profile/profile-slot.component.html","../../../../libs/modules/auth/src/lib/account/account.module.ts","../../../../libs/modules/auth/src/lib/auth.module.ts","../../../../libs/modules/auth/src/acorex-modules-auth.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { UserManagerSettings } from 'oidc-client-ts';\n\nexport enum AXMAuthenticationTypes {\n UsernamePassword,\n EmailPassword,\n MobilePassword,\n EmailCode,\n MobileCode,\n}\n\nexport const AXM_AUTH_CONFIG_TOKEN = new InjectionToken<AXMAuthConfigs>('app-module-auth-config', {\n providedIn: 'root',\n factory: () => {\n return AXMDefaultAuthConfigs;\n },\n});\n\nexport interface AXMAuthConfigs {\n type: AXMAuthenticationTypes;\n oidc_settings?: UserManagerSettings;\n end_url?: string;\n apiResourceUrl?: string;\n signinPage?: {\n description: string;\n slogan: string;\n };\n idleTimeout?: number;\n}\n\nexport const AXMDefaultAuthConfigs: AXMAuthConfigs = {\n type: AXMAuthenticationTypes.EmailPassword,\n};\n\nexport function configAuthModule(config: Partial<AXMAuthConfigs> = AXMDefaultAuthConfigs): AXMAuthConfigs {\n return { ...AXMDefaultAuthConfigs, ...config };\n}\n","import { Route } from '@angular/router';\nexport const routes: Route[] = [\n {\n path: 'auth',\n children: [\n {\n path: '',\n pathMatch: 'full',\n redirectTo: 'login',\n },\n {\n path: '',\n loadComponent: () =>\n import('./shared/layouts/master/master.layout').then((c) => c.AXPAuthMasterLayoutComponent),\n loadChildren: () => import('./login/login.module').then((c) => c.AXPSignInModule),\n },\n {\n path: '',\n loadComponent: () =>\n import('./shared/layouts/master/master.layout').then((c) => c.AXPAuthMasterLayoutComponent),\n loadChildren: () => import('./two-factor/two-factor.module').then((c) => c.AXPTwoFactorModule),\n },\n {\n path: '',\n loadComponent: () =>\n import('./shared/layouts/master/master.layout').then((c) => c.AXPAuthMasterLayoutComponent),\n loadChildren: () => import('./forgot/routes').then((c) => c),\n },\n {\n path: 'account',\n loadComponent: () => import('./shared/layouts/blank/blank.layout').then((c) => c.AXPAuthBlankLayoutComponent),\n loadChildren: () => import('./account/account.module').then((c) => c.AXPAccountModule),\n },\n {\n path: '',\n loadComponent: () =>\n import('./shared/layouts/master/master.layout').then((c) => c.AXPAuthMasterLayoutComponent),\n loadChildren: () => import('./register/register.module').then((c) => c.AXPRegisterModule),\n },\n ],\n },\n];\n","import { Injectable, NgZone, inject, isDevMode } from \"@angular/core\";\nimport { AXPErrorHandler } from \"@acorex/platform/common\";\nimport { Router } from \"@angular/router\";\nimport { AXPUnauthenticatedError, AXPUnauthorizedError } from \"@acorex/platform/auth\";\nimport { HttpErrorResponse } from \"@angular/common/http\";\n\n@Injectable()\nexport class AXMAuthErrorHandler implements AXPErrorHandler {\n\n\n private router = inject(Router);\n private zone = inject(NgZone);\n\n constructor() {\n }\n\n handleError(error: Error, next: (error: any) => void): void {\n if (error instanceof HttpErrorResponse) {\n if (error.status == 401) {\n this.router.navigate(['/auth/login']);\n }\n else if (error.status == 404) {\n this.router.navigate(['/404']);\n }\n }\n else if (error instanceof AXPUnauthorizedError) {\n this.router.navigate(['/401']);\n }\n else if (error instanceof AXPUnauthenticatedError) {\n this.router.navigate(['/auth/login']);\n } else {\n if (isDevMode()) {\n next(error); // Pass the error to the next handler\n }\n else {\n next(error); // maybe we need a error page\n }\n }\n }\n}","import { Injectable, inject } from '@angular/core';\nimport { Subject, Observable, timer, Subscription } from 'rxjs';\nimport { startWith, switchMap, tap } from 'rxjs/operators';\nimport { AXM_AUTH_CONFIG_TOKEN } from '../../auth.config';\n\n@Injectable({ providedIn: 'root' })\nexport class AXPIdleService {\n private configs = inject(AXM_AUTH_CONFIG_TOKEN);\n private idle$ = new Subject<void>();\n private timeoutDuration = this.configs.idleTimeout ?? 10 * 60 * 1000;\n private userActivity$ = new Subject<void>();\n private idleSubscription: Subscription | null = null;\n\n constructor() {\n this.setupActivityListeners();\n }\n\n get idleState$(): Observable<void> {\n return this.idle$.asObservable();\n }\n\n private setupActivityListeners() {\n const activityEvents = ['mousemove', 'keydown', 'wheel'];\n activityEvents.forEach(event =>\n document.addEventListener(event, () => this.resetTimer())\n );\n }\n\n startWatching() {\n this.stopWatching(); // Stop any existing subscription\n this.idleSubscription = this.userActivity$.pipe(\n startWith(null),\n switchMap(() => timer(this.timeoutDuration)),\n tap(() => this.idle$.next()),\n ).subscribe();\n }\n\n resetTimer() {\n this.userActivity$.next();\n }\n\n stopWatching() {\n if (this.idleSubscription) {\n this.idleSubscription.unsubscribe();\n this.idleSubscription = null;\n }\n }\n}\n","import { AXDialogButtonItem, AXDialogService } from \"@acorex/components/dialog\";\nimport { AXPSessionService } from \"@acorex/platform/auth\";\nimport { AXPSignInAction, AXPSignOutAction } from \"@acorex/platform/common\";\nimport { Injectable, inject } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { Actions, createEffect, ofType } from \"@ngrx/effects\";\nimport { of, switchMap, tap } from \"rxjs\";\nimport { AXPIdleService } from \"../shared/services\";\nimport { AXM_AUTH_CONFIG_TOKEN } from \"../auth.config\";\n\n@Injectable()\nexport class AXPAuthEffects {\n\n private configs = inject(AXM_AUTH_CONFIG_TOKEN);\n private sessionService = inject(AXPSessionService);\n private idleService = inject(AXPIdleService);\n private dialogService = inject(AXDialogService);\n private dialogAlreadyOpen = false;\n\n constructor(private actions$: Actions, private router: Router) { }\n\n signout$ = createEffect(\n () =>\n this.actions$.pipe(\n ofType(AXPSignOutAction),\n switchMap((action) => {\n this.idleService.stopWatching();\n this.router.navigate(['/auth/login']);\n return of();\n })\n ),\n { dispatch: false }\n );\n\n signin$ = createEffect(\n () =>\n this.actions$.pipe(\n ofType(AXPSignInAction),\n switchMap((action) => {\n if (this.configs.idleTimeout) {\n this.idleService.startWatching();\n }\n return of();\n })\n ),\n { dispatch: false }\n );\n\n\n idle$ = createEffect(\n () =>\n this.idleService.idleState$.pipe(\n tap(() => {\n if (!this.dialogAlreadyOpen) {\n let time = 60;\n let intervalId: number;\n const buttonText = (time: number) => `Stay Sign In (${time})`;\n const stayButton: AXDialogButtonItem = {\n text: buttonText(time),\n color: 'primary',\n autofocus: true,\n onClick: () => {\n this.idleService.resetTimer();\n dialog.close();\n this.dialogAlreadyOpen = false;\n clearInterval(intervalId);\n }\n }\n const dialog = this.dialogService.open({\n title: \"Session Timeout\",\n content: \"You're being timed out due to inactivity. Please choose to stay signed in or to sign off. Otherwise, you will signed off automatically.\",\n type: 'warning',\n buttons: [\n {\n text: \"Sign Off\",\n color: 'ghost',\n onClick: async () => {\n await this.sessionService.signout();\n dialog.close();\n this.dialogAlreadyOpen = false;\n clearInterval(intervalId);\n }\n },\n stayButton,\n ]\n });\n this.dialogAlreadyOpen = true;\n // Automatically close dialog and sign out after additional time\n intervalId = setInterval(() => {\n if (time > 0) {\n stayButton.text = buttonText(--time);\n } else {\n clearInterval(intervalId);\n this.sessionService.signout();\n dialog.close();\n this.dialogAlreadyOpen = false;\n }\n }, 1000);\n //\n }\n })\n ),\n { dispatch: false }\n );\n\n}\n","export * from './auth.effects';\n//export * from './auth.actions';","import { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXPApplication, AXPSessionService } from '@acorex/platform/auth';\nimport { AXPLogoComponent } from '@acorex/platform/layouts';\nimport { CommonModule } from '@angular/common';\nimport { Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'axp-app-chooser-list',\n templateUrl: 'app-chooser-list.component.html',\n standalone: true,\n imports: [CommonModule, AXDecoratorModule, AXPLogoComponent, AXLoadingModule],\n})\nexport class AXPAppChooserListComponent {\n private router = inject(Router);\n private sessionService = inject(AXPSessionService);\n\n protected selectedApplication: AXPApplication | null = null;\n protected applications$ = this.sessionService.applications$;\n\n async chooseApplication(item: AXPApplication) {\n this.selectedApplication = item;\n await this.sessionService.selectApplication(item.name);\n this.router.navigate([`/${item.name}/home`]);\n }\n}\n","<div class=\" ax-w-full ax-overflow-auto ax-max-h-[300px] ax-pe-2\">\n @for(application of (applications$ | async); track $index){\n <div\n class=\"ax-flex ax-gap-2 ax-justify-between ax-border-b last:ax-border-b-0 ax-py-3 ax-items-start ax-cursor-pointer\"\n (click)=\"chooseApplication(application)\"\n >\n <div class=\"ax-flex ax-flex-1 ax-gap-2 ax-items-center ax-justify-center ax-font-medium\">\n <div class=\"ax-w-12 ax-h-12 ax-flex ax-justify-center ax-items-center ax-rounded-full ax-bg-neutral-100 ax-m-auto\">\n <ax-icon class=\"fa-solid fa-computer ax-text-neutral-500 ax-text-lg\"> </ax-icon>\n <!-- TODO: logo instead of application icon -->\n <!-- <axp-logo [source]=\"application.logo\" [attr.alt]=\"application.title\"\n class=\"!ax-flex ax-items-center ax-justify-center !ax-text-sm ax-mx-auto ax-w-10 ax-h-10 ax-bg-neutral-200 ax-rounded-full\"></axp-logo> -->\n </div>\n <span class=\"ax-flex-1 ax-text-start md:ax-text-base ax-text-sm\">{{ application.title }}</span>\n <span class=\"ax-text-gray-500 md:ax-text-sm ax-text-xs\">{{application.editionName}}</span>\n @if(application.name===selectedApplication?.name){\n <ax-loading></ax-loading>\n }@else {\n <ax-icon class=\"fa-solid fa-chevron-right ax-text-neutral-400\"> </ax-icon>\n }\n </div>\n </div>\n }\n</div>","import { AXButtonModule } from \"@acorex/components/button\";\nimport { AXDecoratorModule } from \"@acorex/components/decorators\";\nimport { AXPopoverModule } from \"@acorex/components/popover\";\nimport { AXPApplication, AXPSessionService } from \"@acorex/platform/auth\";\nimport { AXPLogoComponent } from \"@acorex/platform/layouts\";\nimport { CommonModule } from \"@angular/common\";\nimport { Component, inject } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { AXPAppChooserListComponent } from \"./app-chooser-list.component\";\n\n@Component({\n templateUrl: './app-chooser-slot.component.html',\n standalone: true,\n imports: [\n CommonModule,\n AXButtonModule,\n AXPopoverModule,\n AXDecoratorModule,\n AXPLogoComponent,\n AXPAppChooserListComponent\n ]\n})\nexport class AXMAppChooserSlotComponent {\n private sessionService = inject(AXPSessionService);\n protected tenant$ = this.sessionService.tenant$;\n\n protected application$ = this.sessionService.application$;\n protected applications$ = this.sessionService.applications$;\n\n private router = inject(Router);\n\n\n async chooseApplication(item: AXPApplication) {\n await this.sessionService.selectApplication(item.name);\n this.router.navigate([`/${item.name}/home`]);\n }\n\n\n}","@if(((applications$ | async)?.length ?? 0) > 1)\n{\n<ax-button color=\"default\" look=\"blank\" #appChooser>\n <ax-icon>\n <i class=\"fa-solid fa-grid-2 ax-text-slate-400 dark:ax-text-slate-200\"></i>\n </ax-icon>\n</ax-button>\n<ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" [adaptivityEnabled]=\"true\">\n <div class=\"ax-bg-surface ax-border ax-overflow-hidden ax-rounded-md ax-shadow-md ax-w-full ax-min-w-64 ax-p-3\">\n <axp-app-chooser-list></axp-app-chooser-list>\n </div>\n</ax-popover>\n}","import { Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AXPSessionService } from '@acorex/platform/auth';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { CommonModule } from '@angular/common';\n\n@Component({\n selector: 'axp-tenant-chooser-dropdown',\n templateUrl: 'tenant-chooser-dropdown.component.html',\n standalone: true,\n imports: [CommonModule, AXDecoratorModule]\n})\nexport class AXPTenantChooserDropdownComponent {\n\n private router = inject(Router);\n private sessionService = inject(AXPSessionService);\n protected tenants$ = this.sessionService.tenants$;\n protected tenant = this.sessionService.tenant;\n\n tenantChooser() {\n this.router.navigate(['/auth/account/tenant-chooser']);\n }\n\n\n}","<ng-container *ngIf=\"tenants$ | async as tenants\">\n @if(tenants.length>1){\n <div (click)=\"tenantChooser()\"\n class=\"ax-flex ax-items-center ax-border ax-rounded-full ax-px-4 ax-py-1 ax-gap-2 ax-cursor-pointer\">\n <ax-icon class=\"fa-solid fa-building ax-text-neutral-500 ax-text-xs\"></ax-icon>\n <p class=\"ax-text-neutral-500 ax-text-sm ax-font-medium\">\n {{ tenant?.title }}\n </p>\n <ax-icon class=\"fa-regular fa-chevron-down ax-text-neutral-400\"></ax-icon>\n </div>\n }@else {\n <div class=\"ax-flex ax-items-center ax-border ax-rounded-full ax-px-4 ax-py-1 ax-gap-2 ax-cursor-pointer\">\n <ax-icon class=\"fa-solid fa-building ax-text-neutral-500\"></ax-icon>\n <p class=\"ax-text-neutral-500 ax-text-sm ax-font-medium\">\n {{ tenant?.title }}\n </p>\n </div>\n }\n</ng-container>","import { AXAvatarModule } from \"@acorex/components/avatar\";\nimport { AXButtonModule } from \"@acorex/components/button\";\nimport { AXDecoratorModule } from \"@acorex/components/decorators\";\nimport { AXImageModule } from \"@acorex/components/image\";\nimport { AXPopoverComponent, AXPopoverModule } from \"@acorex/components/popover\";\nimport { AXPSessionService } from \"@acorex/platform/auth\";\nimport { CommonModule } from \"@angular/common\";\nimport { Component, ViewChild, inject } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { AXPTenantChooserDropdownComponent } from '../tenant-chooser/tenant-chooser-dropdown.component';\n\n@Component({\n templateUrl: './profile-slot.component.html',\n standalone: true,\n imports: [\n CommonModule,\n AXImageModule,\n AXAvatarModule,\n AXPopoverModule,\n AXButtonModule,\n AXDecoratorModule,\n AXPTenantChooserDropdownComponent\n ]\n})\nexport class AXMAuthProfileSlotComponent {\n private router = inject(Router);\n private sessionService = inject(AXPSessionService);\n protected user$ = this.sessionService.user$;\n protected tenant$ = this.sessionService.tenant$;\n\n\n protected isAuthenticated$ = this.sessionService.isAuthenticated$;\n\n @ViewChild('profilePopover') profilePopover!: AXPopoverComponent;\n\n editProfile() {\n this.router.navigate(['/asc/profile/e/profile/0/view']);\n }\n\n async logOut() {\n await this.sessionService.signout();\n }\n\n toggleProfileMenu() {\n this.profilePopover.open();\n }\n\n\n protected handleSignIn() {\n this.router.navigate([\"/auth/login\"]);\n }\n}","@if((isAuthenticated$ | async))\n{\n<ax-avatar #avatar color=\"secondary\" [size]=\"32\" class=\"ax-cursor-pointer ax-ms-4\">\n <ax-image [src]=\"(user$ | async)?.avatar\"></ax-image>\n</ax-avatar>\n<ax-popover [target]=\"avatar\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\">\n <div class=\"ax-bg-surface ax-border ax-border-default ax-rounded-md ax-shadow-md ax-w-full ax-min-w-64\">\n <div class=\"ax-flex ax-flex-col ax-items-center ax-p-4 ax-border-b\">\n <ax-avatar [size]=\"60\">\n <ax-image [src]=\"(user$ | async)?.avatar\"></ax-image>\n </ax-avatar>\n <div class=\"ax-flex ax-flex-col ax-items-center ax-justify-center ax-mt-2 ax-gap-1\">\n <div class=\"ax-text-base ax-font-bold\">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"profile-menus ax-text-slate-500\">\n <!-- <ul>\n <li>\n <i class=\"fa-solid fa-folder-open\"></i>\n <span> Project Management </span>\n </li>\n <li>\n <i class=\"fa-solid fa-envelope-open-text\"></i>\n <span>Email Config</span>\n </li>\n <li>\n <i class=\"fa-solid fa-gear\"></i>\n <span>Setting</span>\n </li>\n </ul> -->\n <ul>\n <!-- <li>\n <i class=\"fa-solid fa-gem ax-text-primary-500\"></i>\n <span> Upgrade account </span>\n </li> -->\n <li (click)=\"editProfile()\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Edit profile</span>\n </li>\n </ul>\n <ul>\n <li class=\"ax-text-danger-500\" (click)=\"logOut()\">\n <i class=\"fa-solid fa-arrow-right-from-bracket\"></i>\n <span> Logout </span>\n </li>\n </ul>\n </div>\n </div>\n</ax-popover>\n} @else {\n<ax-button color=\"default\" look=\"blank\" text=\"Sign Up / Sign In\" (click)=\"handleSignIn()\">\n <ax-icon>\n <i class=\"fa-solid fa-user ax-text-slate-400 dark:ax-text-slate-200\"></i>\n </ax-icon>\n</ax-button>\n<!-- <ax-popover [target]=\"signIn\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\">\n <div class=\"ax-bg-surface ax-border ax-border-default ax-rounded-md ax-shadow-md ax-w-full ax-p-4\">\n Test\n </div>\n</ax-popover> -->\n}","import { AXPAuthGuard, AXPSessionService } from '@acorex/platform/auth';\nimport { AXPComponentSlotModule } from '@acorex/platform/common';\nimport { inject, NgModule } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivateFn, Router, RouterModule, RouterStateSnapshot, ROUTES, Routes } from '@angular/router';\nimport { firstValueFrom } from 'rxjs';\nimport { AXMAppChooserSlotComponent } from './app-chooser/app-chooser-slot.component';\nimport { AXMAuthProfileSlotComponent } from './profile/profile-slot.component';\n\n\nconst canActivateTenantChooser: CanActivateFn =\n async (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const sessionService = inject(AXPSessionService);\n const router = inject(Router);\n const tenant = await firstValueFrom(sessionService.tenants$);\n if (tenant.length == 0) {\n return router.createUrlTree(['/auth/login']);\n }\n if (tenant.length == 1) {\n await sessionService.selectTenant(tenant[0].name);\n return router.createUrlTree(['/auth/account/app-chooser']);\n }\n return true;\n };\n\n\nconst canActivateAppChooser: CanActivateFn =\n async (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {\n const sessionService = inject(AXPSessionService);\n const router = inject(Router);\n const apps = await firstValueFrom(sessionService.applications$);\n if (apps.length == 0) {\n return router.createUrlTree(['/auth/login']);\n }\n if (apps.length == 1) {\n await sessionService.selectApplication(apps[0].name)\n return router.createUrlTree([`/${apps[0].name}/home`]);\n }\n return true\n };\n\n\nfunction routesFacory() {\n let routes: Routes = [];\n routes = [\n {\n path: 'tenant-chooser',\n loadComponent: () =>\n import('./tenant-chooser/tenant-chooser.component').then(\n (c) => c.AXPAuthTenantChooserComponent\n ),\n canActivate: [AXPAuthGuard, canActivateTenantChooser]\n },\n {\n path: 'app-chooser',\n loadComponent: () =>\n import('./app-chooser/app-chooser.component').then((c) => c.AXPAuthAppChooserComponent),\n canActivate: [AXPAuthGuard, canActivateAppChooser]\n },\n ];\n return routes;\n}\n\n@NgModule({\n declarations: [],\n imports: [\n RouterModule,\n //\n AXPComponentSlotModule.forChild({\n \"header-end\": [\n {\n name: \"app-choser\",\n component: AXMAppChooserSlotComponent,\n },\n {\n name: \"profile\",\n component: AXMAuthProfileSlotComponent,\n },\n ]\n })\n ],\n exports: [],\n providers: [\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFacory,\n },\n ],\n})\nexport class AXPAccountModule { }\n","import { AXPCommonModule } from '@acorex/platform/common';\nimport { CommonModule } from '@angular/common';\nimport { HttpClientModule } from '@angular/common/http';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { EffectsModule } from '@ngrx/effects';\nimport { routes } from './auth.routes';\nimport { AXMAuthErrorHandler } from './error-handler';\nimport { AXPAuthEffects } from './store';\nimport { AXPAccountModule } from './account/account.module';\n\n\n@NgModule({\n imports: [\n CommonModule,\n AXPCommonModule.forChild({ errorHandlers: [AXMAuthErrorHandler] }),\n HttpClientModule,\n RouterModule.forChild(routes),\n EffectsModule.forFeature([AXPAuthEffects]),\n AXPAccountModule\n ],\n providers: [AXMAuthErrorHandler],\n})\nexport class AXMAuthModule {\n static forRoot(): ModuleWithProviders<AXMAuthModule> {\n return {\n ngModule: AXMAuthModule,\n providers: [],\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["switchMap","tap","i1","i2","i3","i4"],"mappings":"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"}
|