@acorex-platform/module-auth-client 0.0.15
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/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs +3174 -0
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-Cm2ZagaI.mjs +67 -0
- package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-Cm2ZagaI.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-BRGgntib.mjs +18 -0
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-BRGgntib.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-change-password.command-ZyXAjUKw.mjs +168 -0
- package/fesm2022/acorex-platform-module-auth-client-change-password.command-ZyXAjUKw.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-BC8lw--F.mjs +192 -0
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-BC8lw--F.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +80 -0
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs +129 -0
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs +32 -0
- package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs +30 -0
- package/fesm2022/acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs +57 -0
- package/fesm2022/acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs +24 -0
- package/fesm2022/acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs +19 -0
- package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs +105 -0
- package/fesm2022/acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs +196 -0
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-password.component-BuqUhET7.mjs +59 -0
- package/fesm2022/acorex-platform-module-auth-client-password.component-BuqUhET7.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-password.component-Cihg82vM.mjs +529 -0
- package/fesm2022/acorex-platform-module-auth-client-password.component-Cihg82vM.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs +7 -0
- package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-B8lBvZsA.mjs +158 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-B8lBvZsA.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-DBbFbzAx.mjs +31 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-DBbFbzAx.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-CtJho4ab.mjs +79 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-CtJho4ab.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-page-component.provider-B-Qtd4_j.mjs +27 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-page-component.provider-B-Qtd4_j.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-tbhf7K0V.mjs +446 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-tbhf7K0V.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-register-password.component-hSJyEA6Q.mjs +145 -0
- package/fesm2022/acorex-platform-module-auth-client-register-password.component-hSJyEA6Q.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-register.module-DXm6AQpo.mjs +62 -0
- package/fesm2022/acorex-platform-module-auth-client-register.module-DXm6AQpo.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-remove-pin-code.command-zUZooOtv.mjs +91 -0
- package/fesm2022/acorex-platform-module-auth-client-remove-pin-code.command-zUZooOtv.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-result.component-DYJaB-FD.mjs +36 -0
- package/fesm2022/acorex-platform-module-auth-client-result.component-DYJaB-FD.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-routes-REjaWcqY.mjs +9 -0
- package/fesm2022/acorex-platform-module-auth-client-routes-REjaWcqY.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-DqXGuIgN.mjs +346 -0
- package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-DqXGuIgN.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-DXTVbrS0.mjs +33 -0
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-DXTVbrS0.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.component-5TxB6aFi.mjs +188 -0
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.component-5TxB6aFi.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-n1qbs6e1.mjs +177 -0
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-n1qbs6e1.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-show-profile-command-CxMz1yy-.mjs +70 -0
- package/fesm2022/acorex-platform-module-auth-client-show-profile-command-CxMz1yy-.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-signout-command-DqqrP5pk.mjs +24 -0
- package/fesm2022/acorex-platform-module-auth-client-signout-command-DqqrP5pk.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-ihsqCJKN.mjs +59 -0
- package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-ihsqCJKN.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CiENsIEh.mjs +40 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CiENsIEh.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-BJqdeuAz.mjs +45 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-BJqdeuAz.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-view-login-history.command-Dl0os5lD.mjs +108 -0
- package/fesm2022/acorex-platform-module-auth-client-view-login-history.command-Dl0os5lD.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client.mjs +2 -0
- package/fesm2022/acorex-platform-module-auth-client.mjs.map +1 -0
- package/package.json +28 -0
- package/types/acorex-platform-module-auth-client-contracts.d.ts +67 -0
- package/types/acorex-platform-module-auth-client.d.ts +390 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-contracts.mjs","sources":["../../../../libs/modules/auth/client/contracts/src/commands.keys.ts","../../../../libs/modules/auth/client/contracts/src/datasource.keys.ts","../../../../libs/modules/auth/client/contracts/src/menu.keys.ts","../../../../libs/modules/auth/client/contracts/src/permission.keys.ts","../../../../libs/modules/auth/client/contracts/src/root-config.ts","../../../../libs/modules/auth/client/contracts/src/settings.keys.ts","../../../../libs/modules/auth/client/contracts/src/index.ts","../../../../libs/modules/auth/client/contracts/src/acorex-platform-module-auth-client-contracts.ts"],"sourcesContent":["//#region ---- Command keys ----\n\nexport const AXMAuthCommandKeys = {\n Profile: {\n Show: 'auth:profile',\n ChangePhoto: 'auth:change-photo',\n EditAccountInfo: 'auth:edit-account-info',\n ComingSoon: 'auth:profile-coming-soon',\n },\n Session: {\n Signout: 'auth:signout',\n OpenSessions: 'auth:open-sessions',\n LockScreen: 'auth:lock-screen',\n },\n Security: {\n ChangePassword: 'auth:change-password',\n SetPinCode: 'auth:set-pin-code',\n RemovePinCode: 'auth:remove-pin-code',\n ViewLoginHistory: 'auth:view-login-history',\n EditSignature: 'auth:edit-signature',\n },\n} as const;\n\n//#endregion\n","//#region ---- Datasource keys ----\n\n/** Auth module datasource registry names. */\nexport const AXMAuthDataSourceKeys = {\n UserActivity: 'auth-user-activity',\n} as const;\n\n//#endregion\n","export const AXPAuthMenuKeys = {} as const;\n\n","export const AXMPermissionsKeys = {\n Auth: {\n Management: 'Auth:Permission:Management',\n // TODO: Add permission keys when permissions are defined\n },\n};\n","const config = {\n i18n: 'auth',\n module: 'Auth',\n};\n\nexport const RootConfig = {\n config,\n module: {\n route: 'auth',\n name: config.module,\n title: '@auth:module.title',\n icon: 'fa-light fa-shield-keyhole',\n },\n} as const;\n","export enum AXPAuthSettings {\n TwoFactorAuth = 'Auth:Setting:Authentication.TwoFactorAuth',\n PasswordComplexity = 'Auth:Setting:Authentication.PasswordComplexity',\n PasswordExpiryDays = 'Auth:Setting:Authentication.PasswordExpiryDays',\n MaxLoginAttempts = 'Auth:Setting:Authentication.MaxLoginAttempts',\n LockoutDuration = 'Auth:Setting:Authentication.LockoutDuration',\n LockWhenIdleEnabled = 'Auth:Setting:SessionManagement.LockWhenIdleEnabled',\n LockWhenIdleMinutes = 'Auth:Setting:SessionManagement.LockWhenIdleMinutes',\n InactiveSessionTermination = 'Auth:Setting:SessionManagement.InactiveSessionTermination',\n}\n\nexport const AXPAuthInactiveSessionTerminationOptions = {\n OneWeek: 'oneWeek',\n OneMonth: 'oneMonth',\n ThreeMonths: 'threeMonths',\n SixMonths: 'sixMonths',\n} as const;\n\nexport type AXPAuthInactiveSessionTerminationValue =\n (typeof AXPAuthInactiveSessionTerminationOptions)[keyof typeof AXPAuthInactiveSessionTerminationOptions];\n\n","//#region ---- Contracts barrel ----\n\nexport * from './commands.keys';\nexport * from './datasource.keys';\nexport * from './menu.keys';\nexport * from './permission.keys';\nexport * from './root-config';\nexport * from './settings.keys';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA;AAEO,MAAM,kBAAkB,GAAG;AAChC,IAAA,OAAO,EAAE;AACP,QAAA,IAAI,EAAE,cAAc;AACpB,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,UAAU,EAAE,0BAA0B;AACvC,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,OAAO,EAAE,cAAc;AACvB,QAAA,YAAY,EAAE,oBAAoB;AAClC,QAAA,UAAU,EAAE,kBAAkB;AAC/B,KAAA;AACD,IAAA,QAAQ,EAAE;AACR,QAAA,cAAc,EAAE,sBAAsB;AACtC,QAAA,UAAU,EAAE,mBAAmB;AAC/B,QAAA,aAAa,EAAE,sBAAsB;AACrC,QAAA,gBAAgB,EAAE,yBAAyB;AAC3C,QAAA,aAAa,EAAE,qBAAqB;AACrC,KAAA;;AAGH;;ACvBA;AAEA;AACO,MAAM,qBAAqB,GAAG;AACnC,IAAA,YAAY,EAAE,oBAAoB;;AAGpC;;ACPO,MAAM,eAAe,GAAG;;ACAxB,MAAM,kBAAkB,GAAG;AAChC,IAAA,IAAI,EAAE;AACJ,QAAA,UAAU,EAAE,4BAA4B;;AAEzC,KAAA;;;ACJH,MAAM,MAAM,GAAG;AACb,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,MAAM,EAAE,MAAM;CACf;AAEM,MAAM,UAAU,GAAG;IACxB,MAAM;AACN,IAAA,MAAM,EAAE;AACN,QAAA,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,MAAM,CAAC,MAAM;AACnB,QAAA,KAAK,EAAE,oBAAoB;AAC3B,QAAA,IAAI,EAAE,4BAA4B;AACnC,KAAA;;;ICZS;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,eAAA,CAAA,GAAA,2CAA2D;AAC3D,IAAA,eAAA,CAAA,oBAAA,CAAA,GAAA,gDAAqE;AACrE,IAAA,eAAA,CAAA,oBAAA,CAAA,GAAA,gDAAqE;AACrE,IAAA,eAAA,CAAA,kBAAA,CAAA,GAAA,8CAAiE;AACjE,IAAA,eAAA,CAAA,iBAAA,CAAA,GAAA,6CAA+D;AAC/D,IAAA,eAAA,CAAA,qBAAA,CAAA,GAAA,oDAA0E;AAC1E,IAAA,eAAA,CAAA,qBAAA,CAAA,GAAA,oDAA0E;AAC1E,IAAA,eAAA,CAAA,4BAAA,CAAA,GAAA,2DAAwF;AAC1F,CAAC,EATW,eAAe,KAAf,eAAe,GAAA,EAAA,CAAA,CAAA;AAWpB,MAAM,wCAAwC,GAAG;AACtD,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,SAAS,EAAE,WAAW;;;ACfxB;AASA;;ACTA;;AAEG;;;;"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
2
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
3
|
+
import { RootConfig } from '@acorex-platform/module-security-management-client/contracts';
|
|
4
|
+
import { AXPSessionService, AXPUserProfileIdentityService } from '@acorex-platform/framework-client/auth';
|
|
5
|
+
import { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';
|
|
6
|
+
import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
|
|
7
|
+
import * as i0 from '@angular/core';
|
|
8
|
+
import { inject, Injectable } from '@angular/core';
|
|
9
|
+
import { isNil, defaultTo, trim, isEmpty } from 'lodash';
|
|
10
|
+
|
|
11
|
+
//#region ---- Edit account info command ----
|
|
12
|
+
/** Opens a self-service dialog for users without an employee record (display name editable; username read-only). */
|
|
13
|
+
class AXPEditAccountInfoCommand {
|
|
14
|
+
constructor() {
|
|
15
|
+
//#region ---- Services & Dependencies ----
|
|
16
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
17
|
+
this.entityService = inject(AXPEntityService);
|
|
18
|
+
this.sessionService = inject(AXPSessionService);
|
|
19
|
+
this.identityService = inject(AXPUserProfileIdentityService);
|
|
20
|
+
this.toastService = inject(AXToastService);
|
|
21
|
+
this.translateService = inject(AXTranslationService);
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region ---- Command ----
|
|
25
|
+
async execute() {
|
|
26
|
+
const userId = this.sessionService.user?.id;
|
|
27
|
+
if (isNil(userId)) {
|
|
28
|
+
return {
|
|
29
|
+
success: false,
|
|
30
|
+
message: {
|
|
31
|
+
text: await this.translateService.translateAsync('@auth:profile-page.commands.edit-account-info.messages.not-signed-in'),
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const userData = this.entityService
|
|
36
|
+
.withEntity(RootConfig.module.name, RootConfig.entities.users.name)
|
|
37
|
+
.data();
|
|
38
|
+
const user = await userData.byKey(userId);
|
|
39
|
+
if (isNil(user)) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
message: {
|
|
43
|
+
text: await this.translateService.translateAsync('@auth:profile-page.commands.edit-account-info.messages.user-not-found'),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const dialogTitle = await this.translateService.translateAsync('@auth:profile-page.commands.edit-account-info.dialog.title');
|
|
48
|
+
const result = await this.layoutBuilder
|
|
49
|
+
.create()
|
|
50
|
+
.dialog((dialog) => {
|
|
51
|
+
dialog
|
|
52
|
+
.setTitle(dialogTitle)
|
|
53
|
+
.setSize('md')
|
|
54
|
+
.setCloseButton(true)
|
|
55
|
+
.setContext({
|
|
56
|
+
username: defaultTo(user.username, ''),
|
|
57
|
+
displayName: defaultTo(user.displayName, ''),
|
|
58
|
+
})
|
|
59
|
+
.content((layout) => {
|
|
60
|
+
layout.flex((flex) => {
|
|
61
|
+
flex
|
|
62
|
+
.setDirection('column')
|
|
63
|
+
.setGap('1rem')
|
|
64
|
+
.formField('@general:terms.contact.username', (field) => {
|
|
65
|
+
field.path('username');
|
|
66
|
+
field.disabled(true);
|
|
67
|
+
field.textBox({
|
|
68
|
+
placeholder: '@general:terms.contact.username',
|
|
69
|
+
});
|
|
70
|
+
})
|
|
71
|
+
.formField('@general:terms.common.display-name', (field) => {
|
|
72
|
+
field.path('displayName');
|
|
73
|
+
field.textBox({
|
|
74
|
+
placeholder: '@general:terms.common.display-name',
|
|
75
|
+
validations: [{ rule: 'required' }],
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
})
|
|
80
|
+
.setActions((actions) => {
|
|
81
|
+
actions.cancel('@general:actions.cancel.title');
|
|
82
|
+
actions.submit('@general:actions.save.title');
|
|
83
|
+
})
|
|
84
|
+
.onAction(async (dialogRef) => {
|
|
85
|
+
if (dialogRef.action() === 'cancel') {
|
|
86
|
+
return { success: false };
|
|
87
|
+
}
|
|
88
|
+
const form = dialogRef.context();
|
|
89
|
+
const displayName = trim(defaultTo(form.displayName, ''));
|
|
90
|
+
if (isEmpty(displayName)) {
|
|
91
|
+
await this.showError('@auth:profile-page.commands.edit-account-info.messages.required-fields');
|
|
92
|
+
throw new Error('Display name is required');
|
|
93
|
+
}
|
|
94
|
+
dialogRef.setLoading(true);
|
|
95
|
+
try {
|
|
96
|
+
await userData.update(userId, { displayName });
|
|
97
|
+
await this.identityService.applySessionPatch({
|
|
98
|
+
title: displayName,
|
|
99
|
+
});
|
|
100
|
+
const successTitle = await this.translateService.translateAsync('@auth:profile-page.commands.edit-account-info.messages.success');
|
|
101
|
+
this.toastService.show({ color: 'success', title: successTitle });
|
|
102
|
+
dialogRef.close();
|
|
103
|
+
return { success: true };
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
dialogRef.setLoading(false);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
})
|
|
110
|
+
.show();
|
|
111
|
+
return result ?? { success: false };
|
|
112
|
+
}
|
|
113
|
+
//#endregion
|
|
114
|
+
//#region ---- Utility Methods ----
|
|
115
|
+
async showError(messageKey) {
|
|
116
|
+
const content = await this.translateService.translateAsync(messageKey);
|
|
117
|
+
const title = await this.translateService.translateAsync('@general:messages.generic.error.title');
|
|
118
|
+
this.toastService.show({ color: 'danger', title, content, closeButton: true });
|
|
119
|
+
}
|
|
120
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEditAccountInfoCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
121
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEditAccountInfoCommand, providedIn: 'root' }); }
|
|
122
|
+
}
|
|
123
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEditAccountInfoCommand, decorators: [{
|
|
124
|
+
type: Injectable,
|
|
125
|
+
args: [{ providedIn: 'root' }]
|
|
126
|
+
}] });
|
|
127
|
+
|
|
128
|
+
export { AXPEditAccountInfoCommand };
|
|
129
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs.map
|
package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/edit-account-info.command.ts"],"sourcesContent":["import { AXPCommand } from '@acorex-platform/framework-shared/runtime';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {RootConfig as SecurityManagementRootConfig} from '@acorex-platform/module-security-management-client/contracts'\nimport {AXMSecurityManagementUsersEntityModel} from '@acorex-platform/module-security-management-client/contracts';\nimport { AXPSessionService, AXPUserProfileIdentityService } from '@acorex-platform/framework-client/auth';\nimport { AXPExecuteCommandResult } from '@acorex-platform/framework-shared/core';\nimport { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\n\nimport { inject, Injectable } from '@angular/core';\nimport { defaultTo, isEmpty, isNil, trim } from 'lodash';\n\n//#region ---- Edit account info command ----\n\n/** Opens a self-service dialog for users without an employee record (display name editable; username read-only). */\n@Injectable({ providedIn: 'root' })\nexport class AXPEditAccountInfoCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly layoutBuilder = inject(AXPLayoutBuilderService);\n private readonly entityService = inject(AXPEntityService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly identityService = inject(AXPUserProfileIdentityService);\n private readonly toastService = inject(AXToastService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): Promise<AXPExecuteCommandResult<void>> {\n const userId = this.sessionService.user?.id;\n if (isNil(userId)) {\n return {\n success: false,\n message: {\n text: await this.translateService.translateAsync(\n '@auth:profile-page.commands.edit-account-info.messages.not-signed-in',\n ),\n },\n };\n }\n\n const userData = this.entityService\n .withEntity(\n SecurityManagementRootConfig.module.name,\n SecurityManagementRootConfig.entities.users.name,\n )\n .data<string, AXMSecurityManagementUsersEntityModel>();\n\n const user = await userData.byKey(userId);\n if (isNil(user)) {\n return {\n success: false,\n message: {\n text: await this.translateService.translateAsync(\n '@auth:profile-page.commands.edit-account-info.messages.user-not-found',\n ),\n },\n };\n }\n\n const dialogTitle = await this.translateService.translateAsync(\n '@auth:profile-page.commands.edit-account-info.dialog.title',\n );\n\n const result = await this.layoutBuilder\n .create()\n .dialog<AXPExecuteCommandResult<void>>((dialog) => {\n dialog\n .setTitle(dialogTitle)\n .setSize('md')\n .setCloseButton(true)\n .setContext({\n username: defaultTo(user.username, ''),\n displayName: defaultTo(user.displayName, ''),\n })\n .content((layout) => {\n layout.flex((flex) => {\n flex\n .setDirection('column')\n .setGap('1rem')\n .formField('@general:terms.contact.username', (field) => {\n field.path('username');\n field.disabled(true);\n field.textBox({\n placeholder: '@general:terms.contact.username',\n });\n })\n .formField('@general:terms.common.display-name', (field) => {\n field.path('displayName');\n field.textBox({\n placeholder: '@general:terms.common.display-name',\n validations: [{ rule: 'required' }],\n });\n });\n });\n })\n .setActions((actions) => {\n actions.cancel('@general:actions.cancel.title');\n actions.submit('@general:actions.save.title');\n })\n .onAction(async (dialogRef) => {\n if (dialogRef.action() === 'cancel') {\n return { success: false };\n }\n\n const form = dialogRef.context() as { username?: string; displayName?: string };\n const displayName = trim(defaultTo(form.displayName, ''));\n\n if (isEmpty(displayName)) {\n await this.showError('@auth:profile-page.commands.edit-account-info.messages.required-fields');\n throw new Error('Display name is required');\n }\n\n dialogRef.setLoading(true);\n try {\n await userData.update(userId, { displayName });\n\n await this.identityService.applySessionPatch({\n title: displayName,\n });\n\n const successTitle = await this.translateService.translateAsync(\n '@auth:profile-page.commands.edit-account-info.messages.success',\n );\n this.toastService.show({ color: 'success', title: successTitle });\n dialogRef.close();\n return { success: true };\n } finally {\n dialogRef.setLoading(false);\n }\n });\n })\n .show();\n\n return result ?? { success: false };\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private async showError(messageKey: string): Promise<void> {\n const content = await this.translateService.translateAsync(messageKey);\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":["SecurityManagementRootConfig"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
2
|
+
import { AXTranslationService } from '@acorex/core/translation';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { inject, Injectable } from '@angular/core';
|
|
5
|
+
|
|
6
|
+
//#region ---- Edit signature command (stub) ----
|
|
7
|
+
/**
|
|
8
|
+
* Opens the signature editor for the current user. Full flow will be added in a follow-up iteration.
|
|
9
|
+
*/
|
|
10
|
+
class AXPEditSignatureCommand {
|
|
11
|
+
constructor() {
|
|
12
|
+
//#region ---- Services & Dependencies ----
|
|
13
|
+
this.toastService = inject(AXToastService);
|
|
14
|
+
this.translateService = inject(AXTranslationService);
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
//#region ---- Command ----
|
|
18
|
+
async execute() {
|
|
19
|
+
const text = await this.translateService.translateAsync('@auth:profile-page.commands.edit-signature.coming-soon');
|
|
20
|
+
this.toastService.show({ color: 'primary', title: text });
|
|
21
|
+
return { success: true };
|
|
22
|
+
}
|
|
23
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEditSignatureCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
24
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEditSignatureCommand, providedIn: 'root' }); }
|
|
25
|
+
}
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPEditSignatureCommand, decorators: [{
|
|
27
|
+
type: Injectable,
|
|
28
|
+
args: [{ providedIn: 'root' }]
|
|
29
|
+
}] });
|
|
30
|
+
|
|
31
|
+
export { AXPEditSignatureCommand };
|
|
32
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/edit-signature.command.ts"],"sourcesContent":["import { AXPCommand } from '@acorex-platform/framework-shared/runtime';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPExecuteCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { inject, Injectable } from '@angular/core';\n\n//#region ---- Edit signature command (stub) ----\n\n/**\n * Opens the signature editor for the current user. Full flow will be added in a follow-up iteration.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPEditSignatureCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly toastService = inject(AXToastService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): Promise<AXPExecuteCommandResult<void>> {\n const text = await this.translateService.translateAsync('@auth:profile-page.commands.edit-signature.coming-soon');\n this.toastService.show({ color: 'primary', title: text });\n return { success: true };\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;;AAOA;AAEA;;AAEG;MAEU,uBAAuB,CAAA;AADpC,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAajE,IAAA;;;AAPC,IAAA,MAAM,OAAO,GAAA;QACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,wDAAwD,CAAC;AACjH,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzD,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1B;8GAdW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cADV,MAAM,EAAA,CAAA,CAAA;;2FACnB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBADnC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, Injectable } from '@angular/core';
|
|
3
|
+
import { f as AXPIdleLockService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs';
|
|
4
|
+
|
|
5
|
+
//#region ---- Lock screen command ----
|
|
6
|
+
/** Locks the session overlay when Lock When Idle is enabled. */
|
|
7
|
+
class AXPLockScreenCommand {
|
|
8
|
+
constructor() {
|
|
9
|
+
//#region ---- Services & Dependencies ----
|
|
10
|
+
this.idleLockService = inject(AXPIdleLockService);
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region ---- Command ----
|
|
14
|
+
async execute() {
|
|
15
|
+
await this.idleLockService.refreshLockState();
|
|
16
|
+
if (this.idleLockService.canLock()) {
|
|
17
|
+
this.idleLockService.lockScreen();
|
|
18
|
+
}
|
|
19
|
+
return { success: true };
|
|
20
|
+
}
|
|
21
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLockScreenCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
22
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLockScreenCommand, providedIn: 'root' }); }
|
|
23
|
+
}
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPLockScreenCommand, decorators: [{
|
|
25
|
+
type: Injectable,
|
|
26
|
+
args: [{ providedIn: 'root' }]
|
|
27
|
+
}] });
|
|
28
|
+
|
|
29
|
+
export { AXPLockScreenCommand };
|
|
30
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/lock-screen.command.ts"],"sourcesContent":["import { AXPCommand } from '@acorex-platform/framework-shared/runtime';\nimport { AXPExecuteCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXPIdleLockService } from '../shared/services/idle-lock.service';\n\n//#region ---- Lock screen command ----\n\n/** Locks the session overlay when Lock When Idle is enabled. */\n@Injectable({ providedIn: 'root' })\nexport class AXPLockScreenCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly idleLockService = inject(AXPIdleLockService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): Promise<AXPExecuteCommandResult<void>> {\n await this.idleLockService.refreshLockState();\n\n if (this.idleLockService.canLock()) {\n this.idleLockService.lockScreen();\n }\n\n return { success: true };\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;AAMA;AAEA;MAEa,oBAAoB,CAAA;AADjC,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAiB9D,IAAA;;;AAXC,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;AAE7C,QAAA,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,EAAE;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;QACnC;AAEA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;IAC1B;8GAjBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cADP,MAAM,EAAA,CAAA,CAAA;;2FACnB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBADhC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;;;"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, NgModule } from '@angular/core';
|
|
3
|
+
import { RouterModule, ROUTES } from '@angular/router';
|
|
4
|
+
import { n as AXM_AUTH_CONFIG_TOKEN, o as AXM_LOGIN_GUARD_TOKEN, p as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs';
|
|
5
|
+
|
|
6
|
+
function routesFacory() {
|
|
7
|
+
const val = inject(AXM_AUTH_CONFIG_TOKEN);
|
|
8
|
+
const loginGuard = inject(AXM_LOGIN_GUARD_TOKEN);
|
|
9
|
+
let routes = [];
|
|
10
|
+
routes = [
|
|
11
|
+
{
|
|
12
|
+
path: 'login',
|
|
13
|
+
canActivate: [loginGuard],
|
|
14
|
+
loadComponent: () => {
|
|
15
|
+
if ([
|
|
16
|
+
AXMAuthenticationTypes.UsernamePassword,
|
|
17
|
+
AXMAuthenticationTypes.EmailPassword,
|
|
18
|
+
AXMAuthenticationTypes.MobilePassword,
|
|
19
|
+
].includes(val.type)) {
|
|
20
|
+
return import('./acorex-platform-module-auth-client-password.component-Cihg82vM.mjs').then((c) => c.AXPLoginPasswordComponent);
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
return import('./acorex-platform-module-auth-client-password.component-Cihg82vM.mjs').then((c) => c.AXPLoginPasswordComponent);
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
];
|
|
28
|
+
return routes;
|
|
29
|
+
}
|
|
30
|
+
class AXPSignInModule {
|
|
31
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPSignInModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
32
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXPSignInModule, imports: [RouterModule] }); }
|
|
33
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPSignInModule, providers: [
|
|
34
|
+
{
|
|
35
|
+
provide: ROUTES,
|
|
36
|
+
multi: true,
|
|
37
|
+
useFactory: routesFacory,
|
|
38
|
+
},
|
|
39
|
+
], imports: [RouterModule] }); }
|
|
40
|
+
}
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPSignInModule, decorators: [{
|
|
42
|
+
type: NgModule,
|
|
43
|
+
args: [{
|
|
44
|
+
imports: [RouterModule],
|
|
45
|
+
exports: [],
|
|
46
|
+
providers: [
|
|
47
|
+
{
|
|
48
|
+
provide: ROUTES,
|
|
49
|
+
multi: true,
|
|
50
|
+
useFactory: routesFacory,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
}]
|
|
54
|
+
}] });
|
|
55
|
+
|
|
56
|
+
export { AXPSignInModule };
|
|
57
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/login/login.module.ts"],"sourcesContent":["import { NgModule, inject } from '@angular/core';\nimport { ROUTES, RouterModule, Routes } from '@angular/router';\nimport { AXMAuthenticationTypes, AXM_AUTH_CONFIG_TOKEN, AXM_LOGIN_GUARD_TOKEN } from '../../auth.config';\n\nfunction routesFacory() {\n const val = inject(AXM_AUTH_CONFIG_TOKEN);\n const loginGuard = inject(AXM_LOGIN_GUARD_TOKEN);\n let routes: Routes = [];\n routes = [\n {\n path: 'login',\n canActivate: [loginGuard],\n loadComponent: () => {\n if (\n [\n AXMAuthenticationTypes.UsernamePassword,\n AXMAuthenticationTypes.EmailPassword,\n AXMAuthenticationTypes.MobilePassword,\n ].includes(val.type)\n ) {\n return import('./password/password.component').then((c) => c.AXPLoginPasswordComponent);\n } else {\n return import('./password/password.component').then((c) => c.AXPLoginPasswordComponent);\n }\n },\n },\n ];\n return routes;\n}\n\n@NgModule({\n imports: [RouterModule],\n exports: [],\n providers: [\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFacory,\n },\n ],\n})\nexport class AXPSignInModule {}\n"],"names":[],"mappings":";;;;;AAIA,SAAS,YAAY,GAAA;AACnB,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACzC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAChD,IAAI,MAAM,GAAW,EAAE;AACvB,IAAA,MAAM,GAAG;AACP,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,CAAC,UAAU,CAAC;YACzB,aAAa,EAAE,MAAK;gBAClB,IACE;AACE,oBAAA,sBAAsB,CAAC,gBAAgB;AACvC,oBAAA,sBAAsB,CAAC,aAAa;AACpC,oBAAA,sBAAsB,CAAC,cAAc;AACtC,iBAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EACpB;AACA,oBAAA,OAAO,OAAO,sEAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC;gBACzF;qBAAO;AACL,oBAAA,OAAO,OAAO,sEAA+B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC;gBACzF;YACF,CAAC;AACF,SAAA;KACF;AACD,IAAA,OAAO,MAAM;AACf;MAaa,eAAe,CAAA;8GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,YAVhB,YAAY,CAAA,EAAA,CAAA,CAAA;AAUX,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EAAA,SAAA,EARf;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,MAAM;AACf,gBAAA,KAAK,EAAE,IAAI;AACX,gBAAA,UAAU,EAAE,YAAY;AACzB,aAAA;AACF,SAAA,EAAA,OAAA,EAAA,CARS,YAAY,CAAA,EAAA,CAAA,CAAA;;2FAUX,eAAe,EAAA,UAAA,EAAA,CAAA;kBAX3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,CAAC;AACvB,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,MAAM;AACf,4BAAA,KAAK,EAAE,IAAI;AACX,4BAAA,UAAU,EAAE,YAAY;AACzB,yBAAA;AACF,qBAAA;AACF,iBAAA;;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { AXP_PLATFORM_CONFIG_TOKEN } from '@acorex-platform/framework-client/common';
|
|
2
|
+
import * as i1$1 from '@acorex-platform/framework-client/core';
|
|
3
|
+
import { AXPLogoComponent, AXPComponentSlotModule, AXPContextStore } from '@acorex-platform/framework-client/core';
|
|
4
|
+
import * as i0 from '@angular/core';
|
|
5
|
+
import { inject, ViewEncapsulation, Component } from '@angular/core';
|
|
6
|
+
import * as i1 from '@angular/router';
|
|
7
|
+
import { RouterModule } from '@angular/router';
|
|
8
|
+
import { n as AXM_AUTH_CONFIG_TOKEN } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs';
|
|
9
|
+
|
|
10
|
+
class AXPAuthMasterLayoutComponent {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.authConfig = inject(AXM_AUTH_CONFIG_TOKEN);
|
|
13
|
+
this.platformConfig = inject(AXP_PLATFORM_CONFIG_TOKEN);
|
|
14
|
+
}
|
|
15
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPAuthMasterLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
16
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPAuthMasterLayoutComponent, isStandalone: true, selector: "ng-component", providers: [AXPContextStore], ngImport: i0, template: "<div class=\"w-full h-full flex\">\n <div class=\"flex-1 lightest-surface dark:darker-surface flex flex-col items-center justify-between py-12\">\n <router-outlet></router-outlet>\n <div class=\"flex justify-between\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo logoKey=\"platform\" appearance=\"onDark\" format=\"full\" [size]=\"160\" [attr.alt]=\"platformConfig.title\"\n class=\"mx-auto text-2xl\"></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{authConfig.signinPage?.slogan}}</p>\n <p>{{authConfig.signinPage?.description}}</p>\n </div>\n </div>\n </div>\n</div>", styles: ["@layer properties;.auth-footer-links{gap:calc(var(--spacing, .25rem) * 5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.auth-footer-links a{background-color:transparent;color:var(--ax-comp-bg,var(--color-on-surface))}.auth-footer-links a.ax-state-selected{color:var(--ax-comp-bg-darker,var(--color-on-surface))}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "ngmodule", type: AXPComponentSlotModule }, { kind: "directive", type: i1$1.AXPComponentSlotDirective, selector: "axp-component-slot", inputs: ["name", "host", "context"], exportAs: ["slot"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPAuthMasterLayoutComponent, decorators: [{
|
|
19
|
+
type: Component,
|
|
20
|
+
args: [{ imports: [RouterModule, AXPLogoComponent, AXPComponentSlotModule], providers: [AXPContextStore], encapsulation: ViewEncapsulation.None, template: "<div class=\"w-full h-full flex\">\n <div class=\"flex-1 lightest-surface dark:darker-surface flex flex-col items-center justify-between py-12\">\n <router-outlet></router-outlet>\n <div class=\"flex justify-between\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo logoKey=\"platform\" appearance=\"onDark\" format=\"full\" [size]=\"160\" [attr.alt]=\"platformConfig.title\"\n class=\"mx-auto text-2xl\"></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{authConfig.signinPage?.slogan}}</p>\n <p>{{authConfig.signinPage?.description}}</p>\n </div>\n </div>\n </div>\n</div>", styles: ["@layer properties;.auth-footer-links{gap:calc(var(--spacing, .25rem) * 5);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600)}.auth-footer-links a{background-color:transparent;color:var(--ax-comp-bg,var(--color-on-surface))}.auth-footer-links a.ax-state-selected{color:var(--ax-comp-bg-darker,var(--color-on-surface))}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight: initial}}}\n/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */\n"] }]
|
|
21
|
+
}] });
|
|
22
|
+
|
|
23
|
+
export { AXPAuthMasterLayoutComponent };
|
|
24
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs","sources":["../../../../libs/modules/auth/client/src/lib/shared/layouts/master/master.layout.ts","../../../../libs/modules/auth/client/src/lib/shared/layouts/master/master.layout.html"],"sourcesContent":["import { AXP_PLATFORM_CONFIG_TOKEN } from '@acorex-platform/framework-client/common';\nimport { AXPLogoComponent } from '@acorex-platform/framework-client/core';\nimport { Component, ViewEncapsulation, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { AXM_AUTH_CONFIG_TOKEN } from '../../../auth.config';\nimport { AXPComponentSlotModule, AXPContextStore } from '@acorex-platform/framework-client/core';\n\n@Component({\n templateUrl: 'master.layout.html',\n styleUrls: ['master.layout.css'],\n imports: [RouterModule, AXPLogoComponent, AXPComponentSlotModule],\n providers: [AXPContextStore],\n encapsulation: ViewEncapsulation.None\n})\nexport class AXPAuthMasterLayoutComponent {\n protected authConfig = inject(AXM_AUTH_CONFIG_TOKEN);\n protected platformConfig = inject(AXP_PLATFORM_CONFIG_TOKEN);\n}\n","<div class=\"w-full h-full flex\">\n <div class=\"flex-1 lightest-surface dark:darker-surface flex flex-col items-center justify-between py-12\">\n <router-outlet></router-outlet>\n <div class=\"flex justify-between\">\n <div class=\"auth-footer-links\">\n <axp-component-slot name=\"auth-footer-links\"></axp-component-slot>\n </div>\n </div>\n </div>\n <div class=\"hidden lg:flex bg-primary-500 flex-1 axp-auth-bk text-white\">\n <div class=\"flex w-full flex-col justify-between px-48 py-20 text-center \">\n <div>\n <axp-logo logoKey=\"platform\" appearance=\"onDark\" format=\"full\" [size]=\"160\" [attr.alt]=\"platformConfig.title\"\n class=\"mx-auto text-2xl\"></axp-logo>\n </div>\n <div>\n <p class=\"font-black text-4xl mb-4\">{{authConfig.signinPage?.slogan}}</p>\n <p>{{authConfig.signinPage?.description}}</p>\n </div>\n </div>\n </div>\n</div>"],"names":["i2"],"mappings":";;;;;;;;;MAca,4BAA4B,CAAA;AAPzC,IAAA,WAAA,GAAA;AAQY,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC1C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC7D,IAAA;8GAHY,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,SAAA,EAH5B,CAAC,eAAe,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECX9B,m7BAqBM,EAAA,MAAA,EAAA,CAAA,2yBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXM,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAIrD,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAPxC,SAAS;AAGC,YAAA,IAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAC,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,CAAC,EAAA,SAAA,EACtD,CAAC,eAAe,CAAC,EAAA,aAAA,EACb,iBAAiB,CAAC,IAAI,EAAA,QAAA,EAAA,m7BAAA,EAAA,MAAA,EAAA,CAAA,2yBAAA,CAAA,EAAA;;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AXPSessionService } from '@acorex-platform/framework-client/auth';
|
|
2
|
+
import { inject } from '@angular/core';
|
|
3
|
+
import { firstValueFrom } from 'rxjs';
|
|
4
|
+
|
|
5
|
+
class AXMSecurityManagementModuleMenuProvider {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.sessionService = inject(AXPSessionService);
|
|
8
|
+
}
|
|
9
|
+
async provide(context) {
|
|
10
|
+
const isAuthorized = await firstValueFrom(this.sessionService.isAuthorized$);
|
|
11
|
+
if (!isAuthorized) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
// user:profile menu removed - profile actions are in header popover
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { AXMSecurityManagementModuleMenuProvider };
|
|
19
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs","sources":["../../../../libs/modules/auth/client/src/lib/menu.provider.ts"],"sourcesContent":["import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\nexport class AXMSecurityManagementModuleMenuProvider implements AXPMenuProvider {\n private sessionService = inject(AXPSessionService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const isAuthorized = await firstValueFrom(this.sessionService.isAuthorized$);\n if (!isAuthorized) {\n return;\n }\n // user:profile menu removed - profile actions are in header popover\n }\n}\n"],"names":[],"mappings":";;;;MAKa,uCAAuC,CAAA;AAApD,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;IASpD;IAPE,MAAM,OAAO,CAAC,OAA+B,EAAA;QAC3C,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;QAC5E,IAAI,CAAC,YAAY,EAAE;YACjB;QACF;;IAEF;AACD;;;;"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import * as i1 from '@acorex/components/button';
|
|
2
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
3
|
+
import { AXLoadingModule } from '@acorex/components/loading';
|
|
4
|
+
import * as i2 from '@acorex/core/translation';
|
|
5
|
+
import { AXTranslationModule } from '@acorex/core/translation';
|
|
6
|
+
import { AXPSessionService, AXPAuthStrategyRegistryService } from '@acorex-platform/framework-client/auth';
|
|
7
|
+
import { AXPHomePageService } from '@acorex-platform/framework-client/common';
|
|
8
|
+
import { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';
|
|
9
|
+
import * as i4 from '@angular/common';
|
|
10
|
+
import { CommonModule } from '@angular/common';
|
|
11
|
+
import * as i0 from '@angular/core';
|
|
12
|
+
import { inject, Component } from '@angular/core';
|
|
13
|
+
import { Router, ActivatedRoute } from '@angular/router';
|
|
14
|
+
import { BehaviorSubject } from 'rxjs';
|
|
15
|
+
import { n as AXM_AUTH_CONFIG_TOKEN } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs';
|
|
16
|
+
|
|
17
|
+
class AXPOAuthCallbackComponent {
|
|
18
|
+
constructor() {
|
|
19
|
+
//#region ---- Services & Dependencies ----
|
|
20
|
+
this.sessionService = inject(AXPSessionService);
|
|
21
|
+
this.router = inject(Router);
|
|
22
|
+
this.route = inject(ActivatedRoute);
|
|
23
|
+
this.homePageService = inject(AXPHomePageService);
|
|
24
|
+
this.configs = inject(AXM_AUTH_CONFIG_TOKEN);
|
|
25
|
+
this.authStrategyRegistry = inject(AXPAuthStrategyRegistryService);
|
|
26
|
+
this.strategyName = this.sessionService.getSessionData()?.strategy;
|
|
27
|
+
this.strategy = this.authStrategyRegistry.get(this.strategyName);
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region ---- Properties ----
|
|
30
|
+
this.isLoading$ = new BehaviorSubject(true);
|
|
31
|
+
this.error$ = new BehaviorSubject(null);
|
|
32
|
+
this.status$ = new BehaviorSubject('Processing authorization...');
|
|
33
|
+
this.exchangeStarted = false;
|
|
34
|
+
}
|
|
35
|
+
// Removed: @Input() flow
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region ---- Lifecycle Methods ----
|
|
38
|
+
async ngOnInit() {
|
|
39
|
+
if (this.exchangeStarted) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.exchangeStarted = true;
|
|
43
|
+
try {
|
|
44
|
+
const queryParams = this.route.snapshot.queryParams;
|
|
45
|
+
const code = queryParams['code'];
|
|
46
|
+
const error = queryParams['error'];
|
|
47
|
+
// Removed: flowParam and its assignment
|
|
48
|
+
if (error) {
|
|
49
|
+
throw new Error(`OAuth error: ${error} - ${queryParams['error_description'] || 'Unknown error'}`);
|
|
50
|
+
}
|
|
51
|
+
if (!code) {
|
|
52
|
+
throw new Error('No authorization code received from OAuth provider');
|
|
53
|
+
}
|
|
54
|
+
this.status$.next('Exchanging authorization code for tokens...');
|
|
55
|
+
const redirectUri = `${window.location.origin}/auth/axp-oauth-callback`;
|
|
56
|
+
await this.sessionService.updateToken({ code, redirectUri });
|
|
57
|
+
this.status$.next('Authentication successful! Redirecting...');
|
|
58
|
+
await this.navigateAfterSuccess();
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('OAuth callback error:', error);
|
|
62
|
+
const message = error instanceof Error && error.message.trim()
|
|
63
|
+
? error.message
|
|
64
|
+
: 'Authentication failed. Please try again.';
|
|
65
|
+
this.error$.next(message);
|
|
66
|
+
await this.sessionService.signout();
|
|
67
|
+
this.isLoading$.next(false);
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
this.isLoading$.next(false);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region ---- Navigation ----
|
|
75
|
+
async navigateAfterSuccess() {
|
|
76
|
+
// Use await with router.navigate to ensure navigation completes
|
|
77
|
+
if (this.sessionService.tenant?.id == null) {
|
|
78
|
+
await this.router.navigate(['/auth/account/tenant-chooser']);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (this.sessionService.application?.id == null) {
|
|
82
|
+
await this.router.navigate(['/auth/account/app-chooser']);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Navigate to home page
|
|
86
|
+
await this.homePageService.navigateTo();
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
//#region ---- UI Handlers ----
|
|
90
|
+
handleRetry() {
|
|
91
|
+
this.router.navigate(['/auth/login']);
|
|
92
|
+
}
|
|
93
|
+
handleGoHome() {
|
|
94
|
+
this.router.navigate(['/']);
|
|
95
|
+
}
|
|
96
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPOAuthCallbackComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
97
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXPOAuthCallbackComponent, isStandalone: true, selector: "axp-oauth-callback", ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n [title]=\"(status$ | async) || '@auth:state-message.loading.title'\"\n [description]=\"'@auth:state-message.loading.description'\"\n >\n </axp-state-message>\n }\n\n <!-- Error State -->\n @if ((error$ | async) && !(isLoading$ | async)) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@auth:state-message.error.title'\"\n [description]=\"(error$ | async) || '@auth:state-message.error.description'\"\n >\n <div slot=\"actions\" class=\"flex flex-col gap-2 sm:flex-row sm:justify-center\">\n <ax-button color=\"primary\" text=\"Try Again\" (onClick)=\"handleRetry()\" class=\"w-full sm:w-auto\">\n </ax-button>\n <ax-button color=\"default\" text=\"Go Home\" (onClick)=\"handleGoHome()\" class=\"w-full sm:w-auto\">\n </ax-button>\n </div>\n </axp-state-message>\n }\n\n <!-- Success State (briefly shown before redirect) -->\n @if (!(isLoading$ | async) && !(error$ | async)) {\n <axp-state-message\n mode=\"success\"\n icon=\"fa-solid fa-check\"\n [title]=\"'@auth:state-message.success.title'\"\n [description]=\"'@auth:state-message.success.description'\"\n >\n </axp-state-message>\n }\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i2.AXTranslatorDirective, selector: "[translate]" }, { kind: "component", type: AXPStateMessageComponent, selector: "axp-state-message", inputs: ["mode", "icon", "title", "description", "titleParams", "descriptionParams", "look"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
98
|
+
}
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPOAuthCallbackComponent, decorators: [{
|
|
100
|
+
type: Component,
|
|
101
|
+
args: [{ selector: 'axp-oauth-callback', imports: [CommonModule, AXButtonModule, AXLoadingModule, AXTranslationModule, AXPStateMessageComponent], standalone: true, template: "<ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n [title]=\"(status$ | async) || '@auth:state-message.loading.title'\"\n [description]=\"'@auth:state-message.loading.description'\"\n >\n </axp-state-message>\n }\n\n <!-- Error State -->\n @if ((error$ | async) && !(isLoading$ | async)) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@auth:state-message.error.title'\"\n [description]=\"(error$ | async) || '@auth:state-message.error.description'\"\n >\n <div slot=\"actions\" class=\"flex flex-col gap-2 sm:flex-row sm:justify-center\">\n <ax-button color=\"primary\" text=\"Try Again\" (onClick)=\"handleRetry()\" class=\"w-full sm:w-auto\">\n </ax-button>\n <ax-button color=\"default\" text=\"Go Home\" (onClick)=\"handleGoHome()\" class=\"w-full sm:w-auto\">\n </ax-button>\n </div>\n </axp-state-message>\n }\n\n <!-- Success State (briefly shown before redirect) -->\n @if (!(isLoading$ | async) && !(error$ | async)) {\n <axp-state-message\n mode=\"success\"\n icon=\"fa-solid fa-check\"\n [title]=\"'@auth:state-message.success.title'\"\n [description]=\"'@auth:state-message.success.description'\"\n >\n </axp-state-message>\n }\n </div>\n </div>\n</ng-container>\n" }]
|
|
102
|
+
}] });
|
|
103
|
+
|
|
104
|
+
export { AXPOAuthCallbackComponent };
|
|
105
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/callback/oauth-callback.component.ts","../../../../libs/modules/auth/client/src/lib/pages/callback/oauth-callback.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPAuthStrategyRegistryService, AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPHomePageService } from '@acorex-platform/framework-client/common';\nimport { AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { CommonModule } from '@angular/common';\nimport { Component, OnInit, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BehaviorSubject } from 'rxjs';\nimport { AXMAuthConfigs, AXM_AUTH_CONFIG_TOKEN } from '../../auth.config';\n\n@Component({\n selector: 'axp-oauth-callback',\n templateUrl: './oauth-callback.component.html',\n imports: [CommonModule, AXButtonModule, AXLoadingModule, AXTranslationModule, AXPStateMessageComponent],\n standalone: true,\n})\nexport class AXPOAuthCallbackComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private sessionService = inject(AXPSessionService);\n private router = inject(Router);\n private route = inject(ActivatedRoute);\n private homePageService = inject(AXPHomePageService);\n protected configs: AXMAuthConfigs = inject<AXMAuthConfigs>(AXM_AUTH_CONFIG_TOKEN);\n private authStrategyRegistry = inject(AXPAuthStrategyRegistryService);\n private strategyName = this.sessionService.getSessionData()?.strategy;\n private strategy = this.authStrategyRegistry.get(this.strategyName!);\n\n //#endregion\n\n //#region ---- Properties ----\n\n protected isLoading$ = new BehaviorSubject<boolean>(true);\n protected error$ = new BehaviorSubject<string | null>(null);\n protected status$ = new BehaviorSubject<string>('Processing authorization...');\n private exchangeStarted = false;\n // Removed: @Input() flow\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n async ngOnInit(): Promise<void> {\n if (this.exchangeStarted) {\n return;\n }\n this.exchangeStarted = true;\n\n try {\n const queryParams = this.route.snapshot.queryParams;\n const code = queryParams['code'];\n const error = queryParams['error'];\n // Removed: flowParam and its assignment\n if (error) {\n throw new Error(`OAuth error: ${error} - ${queryParams['error_description'] || 'Unknown error'}`);\n }\n if (!code) {\n throw new Error('No authorization code received from OAuth provider');\n }\n this.status$.next('Exchanging authorization code for tokens...');\n\n const redirectUri = `${window.location.origin}/auth/axp-oauth-callback`;\n await this.sessionService.updateToken({ code, redirectUri });\n this.status$.next('Authentication successful! Redirecting...');\n await this.navigateAfterSuccess();\n } catch (error) {\n console.error('OAuth callback error:', error);\n const message =\n error instanceof Error && error.message.trim()\n ? error.message\n : 'Authentication failed. Please try again.';\n this.error$.next(message);\n await this.sessionService.signout();\n this.isLoading$.next(false);\n } finally {\n this.isLoading$.next(false);\n }\n }\n\n //#endregion\n\n //#region ---- Navigation ----\n\n private async navigateAfterSuccess(): Promise<void> {\n // Use await with router.navigate to ensure navigation completes\n if (this.sessionService.tenant?.id == null) {\n await this.router.navigate(['/auth/account/tenant-chooser']);\n return;\n }\n if (this.sessionService.application?.id == null) {\n await this.router.navigate(['/auth/account/app-chooser']);\n return;\n }\n // Navigate to home page\n await this.homePageService.navigateTo();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected handleRetry(): void {\n this.router.navigate(['/auth/login']);\n }\n\n protected handleGoHome(): void {\n this.router.navigate(['/']);\n }\n\n //#endregion\n}\n","<ng-container *translate=\"let t\">\n <div class=\"h-full flex flex-col items-center justify-center p-8\">\n <div class=\"w-96 text-center\">\n <!-- Loading State -->\n @if (isLoading$ | async) {\n <axp-state-message\n mode=\"loading\"\n icon=\"fa-solid fa-spinner fa-spin\"\n [title]=\"(status$ | async) || '@auth:state-message.loading.title'\"\n [description]=\"'@auth:state-message.loading.description'\"\n >\n </axp-state-message>\n }\n\n <!-- Error State -->\n @if ((error$ | async) && !(isLoading$ | async)) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-solid fa-exclamation-triangle\"\n [title]=\"'@auth:state-message.error.title'\"\n [description]=\"(error$ | async) || '@auth:state-message.error.description'\"\n >\n <div slot=\"actions\" class=\"flex flex-col gap-2 sm:flex-row sm:justify-center\">\n <ax-button color=\"primary\" text=\"Try Again\" (onClick)=\"handleRetry()\" class=\"w-full sm:w-auto\">\n </ax-button>\n <ax-button color=\"default\" text=\"Go Home\" (onClick)=\"handleGoHome()\" class=\"w-full sm:w-auto\">\n </ax-button>\n </div>\n </axp-state-message>\n }\n\n <!-- Success State (briefly shown before redirect) -->\n @if (!(isLoading$ | async) && !(error$ | async)) {\n <axp-state-message\n mode=\"success\"\n icon=\"fa-solid fa-check\"\n [title]=\"'@auth:state-message.success.title'\"\n [description]=\"'@auth:state-message.success.description'\"\n >\n </axp-state-message>\n }\n </div>\n </div>\n</ng-container>\n"],"names":["i3"],"mappings":"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"}
|