@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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"}
|