@acorex-platform/module-auth-client 0.0.15 → 0.0.20
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 → acorex-platform-module-auth-client-acorex-platform-module-auth-client-CYmUn-lw.mjs} +941 -609
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CYmUn-lw.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-BVbu-f8h.mjs +75 -0
- package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-BVbu-f8h.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-blank.layout-BRGgntib.mjs → acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs} +6 -6
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-ZyXAjUKw.mjs → acorex-platform-module-auth-client-change-password.command-DIM_d7RO.mjs} +51 -40
- package/fesm2022/acorex-platform-module-auth-client-change-password.command-DIM_d7RO.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CYGqrJV0.mjs +257 -0
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CYGqrJV0.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +46 -10
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs → acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs} +5 -5
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs → acorex-platform-module-auth-client-edit-signature.command-TjOLhvKL.mjs} +5 -5
- package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-TjOLhvKL.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-get-user-activity.query-BTpibxe9.mjs +80 -0
- package/fesm2022/acorex-platform-module-auth-client-get-user-activity.query-BTpibxe9.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs → acorex-platform-module-auth-client-lock-screen.command-Br9O4b5c.mjs} +6 -6
- package/fesm2022/acorex-platform-module-auth-client-lock-screen.command-Br9O4b5c.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs → acorex-platform-module-auth-client-login.module-DJVL3bAF.mjs} +8 -21
- package/fesm2022/acorex-platform-module-auth-client-login.module-DJVL3bAF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-master.layout-DZUYm22p.mjs +39 -0
- package/fesm2022/acorex-platform-module-auth-client-master.layout-DZUYm22p.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs → acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs} +11 -15
- package/fesm2022/acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-LZKM9fgo.mjs +200 -0
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-LZKM9fgo.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-password.component-Cihg82vM.mjs → acorex-platform-module-auth-client-password.component-CNKRWfuG.mjs} +86 -45
- package/fesm2022/acorex-platform-module-auth-client-password.component-CNKRWfuG.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs +87 -0
- package/fesm2022/acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs +47 -0
- package/fesm2022/acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-B8lBvZsA.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-CtSrYARX.mjs} +38 -46
- package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-CtSrYARX.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-profile-coming-soon.command-DBbFbzAx.mjs → acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs} +5 -5
- package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-CtJho4ab.mjs → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs} +18 -13
- package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-CtJho4ab.mjs.map → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-B-Qtd4_j.mjs → acorex-platform-module-auth-client-profile-page-component.provider-6lNx6bKI.mjs} +7 -7
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-B-Qtd4_j.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-6lNx6bKI.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-CdxseoJX.mjs +650 -0
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-CdxseoJX.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-hSJyEA6Q.mjs → acorex-platform-module-auth-client-register-password.component-D-tBrCJv.mjs} +15 -14
- package/fesm2022/acorex-platform-module-auth-client-register-password.component-D-tBrCJv.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-register.module-DXm6AQpo.mjs → acorex-platform-module-auth-client-register.module-BrXqva0B.mjs} +23 -23
- package/fesm2022/acorex-platform-module-auth-client-register.module-BrXqva0B.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-zUZooOtv.mjs → acorex-platform-module-auth-client-remove-pin-code.command-uK04-h15.mjs} +7 -7
- package/fesm2022/acorex-platform-module-auth-client-remove-pin-code.command-uK04-h15.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs +115 -0
- package/fesm2022/acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-result.component-DYJaB-FD.mjs → acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs} +6 -6
- package/fesm2022/acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-routes-IX2qmeqU.mjs +13 -0
- package/fesm2022/acorex-platform-module-auth-client-routes-IX2qmeqU.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-BhsTAmVe.mjs +361 -0
- package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-BhsTAmVe.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-BJT7F-xz.mjs +116 -0
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-BJT7F-xz.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-5TxB6aFi.mjs → acorex-platform-module-auth-client-set-pin-code.component-Cq4skm_3.mjs} +29 -20
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.component-Cq4skm_3.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-settings.provider-n1qbs6e1.mjs → acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs} +139 -11
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-show-profile-command-CxMz1yy-.mjs → acorex-platform-module-auth-client-show-profile-command-BWoDxIdx.mjs} +5 -6
- package/fesm2022/acorex-platform-module-auth-client-show-profile-command-BWoDxIdx.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-signout-command-DqqrP5pk.mjs → acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs} +5 -5
- package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-CHmg7D5H.mjs +67 -0
- package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-CHmg7D5H.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs +40 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BJqdeuAz.mjs → acorex-platform-module-auth-client-two-factor.module-_jYo6xXr.mjs} +8 -11
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-_jYo6xXr.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-Dl0os5lD.mjs → acorex-platform-module-auth-client-view-login-history.command-ovj5rdHL.mjs} +13 -11
- package/fesm2022/acorex-platform-module-auth-client-view-login-history.command-ovj5rdHL.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
- package/package.json +1 -1
- package/types/acorex-platform-module-auth-client-contracts.d.ts +43 -9
- package/types/acorex-platform-module-auth-client.d.ts +63 -56
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-Cm2ZagaI.mjs +0 -67
- package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-Cm2ZagaI.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-BRGgntib.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-change-password.command-ZyXAjUKw.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-BC8lw--F.mjs +0 -192
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-BC8lw--F.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs +0 -24
- package/fesm2022/acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs +0 -196
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-password.component-BuqUhET7.mjs +0 -59
- package/fesm2022/acorex-platform-module-auth-client-password.component-BuqUhET7.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-password.component-Cihg82vM.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-B8lBvZsA.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-DBbFbzAx.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-tbhf7K0V.mjs +0 -446
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-tbhf7K0V.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-register-password.component-hSJyEA6Q.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-register.module-DXm6AQpo.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-remove-pin-code.command-zUZooOtv.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-result.component-DYJaB-FD.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-routes-REjaWcqY.mjs +0 -9
- package/fesm2022/acorex-platform-module-auth-client-routes-REjaWcqY.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-DqXGuIgN.mjs +0 -346
- package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-DqXGuIgN.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-DXTVbrS0.mjs +0 -33
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-DXTVbrS0.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-set-pin-code.component-5TxB6aFi.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-n1qbs6e1.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-show-profile-command-CxMz1yy-.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-signout-command-DqqrP5pk.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-ihsqCJKN.mjs +0 -59
- package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-ihsqCJKN.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CiENsIEh.mjs +0 -40
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CiENsIEh.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-BJqdeuAz.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-view-login-history.command-Dl0os5lD.mjs.map +0 -1
|
@@ -4,32 +4,33 @@ import * as i7 from '@acorex/components/check-box';
|
|
|
4
4
|
import { AXCheckBoxModule } from '@acorex/components/check-box';
|
|
5
5
|
import * as i3$1 from '@acorex/components/decorators';
|
|
6
6
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
7
|
-
import { AXDialogService } from '@acorex/components/dialog';
|
|
8
7
|
import * as i1$1 from '@acorex/components/form';
|
|
9
8
|
import { AXFormModule, AXFormComponent } from '@acorex/components/form';
|
|
10
9
|
import * as i3 from '@acorex/components/label';
|
|
11
10
|
import { AXLabelModule } from '@acorex/components/label';
|
|
12
|
-
import * as
|
|
11
|
+
import * as i2$1 from '@acorex/components/loading';
|
|
13
12
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
14
|
-
import * as i4
|
|
13
|
+
import * as i4 from '@acorex/components/password-box';
|
|
15
14
|
import { AXPasswordBoxModule } from '@acorex/components/password-box';
|
|
16
15
|
import * as i2 from '@acorex/components/text-box';
|
|
17
16
|
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
18
|
-
import * as
|
|
19
|
-
import { AXTranslationModule } from '@acorex/core/translation';
|
|
20
|
-
import * as
|
|
17
|
+
import * as i5 from '@acorex/core/translation';
|
|
18
|
+
import { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';
|
|
19
|
+
import * as i3$2 from '@angular/common';
|
|
21
20
|
import { CommonModule } from '@angular/common';
|
|
22
21
|
import * as i0 from '@angular/core';
|
|
23
|
-
import { signal, Component, inject, Injector, effect, ViewContainerRef, ViewChild } from '@angular/core';
|
|
22
|
+
import { signal, ChangeDetectionStrategy, Component, inject, Injector, effect, ViewContainerRef, ViewChild } from '@angular/core';
|
|
24
23
|
import { RouterModule, ActivatedRoute, Router } from '@angular/router';
|
|
25
24
|
import { AXToastService } from '@acorex/components/toast';
|
|
25
|
+
import { AXFormatService } from '@acorex/core/format';
|
|
26
26
|
import { AXValidationModule } from '@acorex/core/validation';
|
|
27
27
|
import { AXPLoginChallengeComponentBase, AXPSessionService, AXP_LOGIN_CHALLENGE_PROVIDER } from '@acorex-platform/framework-client/auth';
|
|
28
|
-
import { AXPHomePageService } from '@acorex-platform/framework-client/common';
|
|
28
|
+
import { AXPHomePageService, AXPSettingsService } from '@acorex-platform/framework-client/common';
|
|
29
|
+
import { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';
|
|
29
30
|
import * as i1$2 from '@angular/forms';
|
|
30
31
|
import { FormsModule } from '@angular/forms';
|
|
31
32
|
import { BehaviorSubject, firstValueFrom } from 'rxjs';
|
|
32
|
-
import {
|
|
33
|
+
import { z as AXPLoginExternalProvidersComponent, s as AXMAuthPlatformSettingsService, B as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CYmUn-lw.mjs';
|
|
33
34
|
|
|
34
35
|
//#region ---- Default Challenge Component ----
|
|
35
36
|
/**
|
|
@@ -41,7 +42,8 @@ class AXPDefaultChallengeComponent extends AXPLoginChallengeComponentBase {
|
|
|
41
42
|
super(...arguments);
|
|
42
43
|
//#region ---- Local State ----
|
|
43
44
|
/** Local state for the response input */
|
|
44
|
-
this.response = signal('',
|
|
45
|
+
this.response = signal('', /* @ts-ignore */
|
|
46
|
+
...(ngDevMode ? [{ debugName: "response" }] : /* istanbul ignore next */ []));
|
|
45
47
|
}
|
|
46
48
|
//#endregion
|
|
47
49
|
//#region ---- Event Handlers ----
|
|
@@ -58,8 +60,8 @@ class AXPDefaultChallengeComponent extends AXPLoginChallengeComponentBase {
|
|
|
58
60
|
onRefreshClick() {
|
|
59
61
|
this.refreshRequest.emit();
|
|
60
62
|
}
|
|
61
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
62
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
63
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDefaultChallengeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
64
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPDefaultChallengeComponent, isStandalone: true, selector: "axp-default-challenge", usesInheritance: true, ngImport: i0, template: `
|
|
63
65
|
<div class="flex flex-col gap-3 p-4 border rounded-md border-warning-300 bg-warning-50">
|
|
64
66
|
<!-- Challenge Image -->
|
|
65
67
|
<div class="flex items-center justify-center gap-2">
|
|
@@ -109,9 +111,9 @@ class AXPDefaultChallengeComponent extends AXPLoginChallengeComponentBase {
|
|
|
109
111
|
</ax-text-box>
|
|
110
112
|
</ax-form-field>
|
|
111
113
|
</div>
|
|
112
|
-
`, isInline: true, dependencies: [{ 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: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "directive", type: i1$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type:
|
|
114
|
+
`, isInline: true, dependencies: [{ 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: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "directive", type: i1$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: i3$2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
113
115
|
}
|
|
114
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDefaultChallengeComponent, decorators: [{
|
|
115
117
|
type: Component,
|
|
116
118
|
args: [{
|
|
117
119
|
selector: 'axp-default-challenge',
|
|
@@ -127,6 +129,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
127
129
|
AXValidationModule,
|
|
128
130
|
CommonModule,
|
|
129
131
|
],
|
|
132
|
+
changeDetection: ChangeDetectionStrategy.Eager,
|
|
130
133
|
template: `
|
|
131
134
|
<div class="flex flex-col gap-3 p-4 border rounded-md border-warning-300 bg-warning-50">
|
|
132
135
|
<!-- Challenge Image -->
|
|
@@ -202,14 +205,17 @@ const MODULES = [
|
|
|
202
205
|
class AXPLoginPasswordComponent {
|
|
203
206
|
constructor() {
|
|
204
207
|
//#region ---- Services & Dependencies ----
|
|
205
|
-
this.
|
|
206
|
-
this.dialogService = inject(AXDialogService);
|
|
208
|
+
this.authPlatformSettings = inject(AXMAuthPlatformSettingsService);
|
|
207
209
|
this.sessionService = inject(AXPSessionService);
|
|
208
210
|
this.activateRoute = inject(ActivatedRoute);
|
|
209
211
|
this.homePageService = inject(AXPHomePageService);
|
|
210
212
|
this.toastService = inject(AXToastService);
|
|
213
|
+
this.formatService = inject(AXFormatService);
|
|
214
|
+
this.settingsService = inject(AXPSettingsService);
|
|
215
|
+
this.translateService = inject(AXTranslationService);
|
|
211
216
|
this.router = inject(Router);
|
|
212
217
|
this.injector = inject(Injector);
|
|
218
|
+
this.signupEnabled = this.authPlatformSettings.signupEnabled();
|
|
213
219
|
/** Optional challenge provider - injected only if configured */
|
|
214
220
|
this.challengeProvider = inject(AXP_LOGIN_CHALLENGE_PROVIDER, { optional: true });
|
|
215
221
|
/** Value of the first input field (username/email) */
|
|
@@ -219,11 +225,14 @@ class AXPLoginPasswordComponent {
|
|
|
219
225
|
/** Whether to keep the user logged in */
|
|
220
226
|
this.isKeepLogin = false;
|
|
221
227
|
/** Current challenge data from the server */
|
|
222
|
-
this.challengeData = signal(null,
|
|
228
|
+
this.challengeData = signal(null, /* @ts-ignore */
|
|
229
|
+
...(ngDevMode ? [{ debugName: "challengeData" }] : /* istanbul ignore next */ []));
|
|
223
230
|
/** User's response to the challenge (e.g., CAPTCHA text) */
|
|
224
|
-
this.challengeResponse = signal('',
|
|
231
|
+
this.challengeResponse = signal('', /* @ts-ignore */
|
|
232
|
+
...(ngDevMode ? [{ debugName: "challengeResponse" }] : /* istanbul ignore next */ []));
|
|
225
233
|
/** Loading state for challenge refresh */
|
|
226
|
-
this.isChallengeLoading = signal(false,
|
|
234
|
+
this.isChallengeLoading = signal(false, /* @ts-ignore */
|
|
235
|
+
...(ngDevMode ? [{ debugName: "isChallengeLoading" }] : /* istanbul ignore next */ []));
|
|
227
236
|
/**
|
|
228
237
|
* Effect to render the challenge component when challenge data changes
|
|
229
238
|
*/
|
|
@@ -239,7 +248,8 @@ class AXPLoginPasswordComponent {
|
|
|
239
248
|
this.destroyChallengeComponent();
|
|
240
249
|
}
|
|
241
250
|
});
|
|
242
|
-
},
|
|
251
|
+
}, /* @ts-ignore */
|
|
252
|
+
...(ngDevMode ? [{ debugName: "challengeRenderEffect" }] : /* istanbul ignore next */ []));
|
|
243
253
|
//#endregion
|
|
244
254
|
//#region ---- Loading & Status State ----
|
|
245
255
|
this.isLoading$ = new BehaviorSubject(false);
|
|
@@ -255,7 +265,7 @@ class AXPLoginPasswordComponent {
|
|
|
255
265
|
//#region ---- Lifecycle Methods ----
|
|
256
266
|
ngOnInit() {
|
|
257
267
|
this.l2 = 'password';
|
|
258
|
-
switch (this.
|
|
268
|
+
switch (this.authPlatformSettings.credentialType()) {
|
|
259
269
|
case AXMAuthenticationTypes.EmailPassword:
|
|
260
270
|
this.l1 = 'email';
|
|
261
271
|
break;
|
|
@@ -276,26 +286,23 @@ class AXPLoginPasswordComponent {
|
|
|
276
286
|
this.router.navigate(['/auth/forgot']);
|
|
277
287
|
}
|
|
278
288
|
handleRegisterOnClick() {
|
|
279
|
-
this.router.navigate([this.
|
|
289
|
+
this.router.navigate([this.authPlatformSettings.signupUrl()]);
|
|
280
290
|
}
|
|
281
291
|
//#endregion
|
|
282
292
|
//#region ---- Login Handlers ----
|
|
283
293
|
handleLoginClick() {
|
|
284
|
-
this.
|
|
294
|
+
const strategyName = this.authPlatformSettings.defaultStrategyName();
|
|
295
|
+
this.sessionService.setStrategy(strategyName);
|
|
285
296
|
const redirectUrl = this.activateRoute.snapshot.queryParams['redirectUrl'];
|
|
286
297
|
this.form.validate().then(async (form) => {
|
|
287
298
|
if (form.result) {
|
|
288
299
|
this.isLoading$.next(true);
|
|
289
300
|
this.submitText = 'processing';
|
|
290
301
|
try {
|
|
291
|
-
const strategy = this.sessionService.getSessionData()?.strategy;
|
|
292
|
-
if (!strategy) {
|
|
293
|
-
throw new Error('Strategy not found');
|
|
294
|
-
}
|
|
295
302
|
// Build credentials object with challenge data if active
|
|
296
303
|
const currentChallenge = this.challengeData();
|
|
297
304
|
const credentials = {
|
|
298
|
-
strategy:
|
|
305
|
+
strategy: strategyName,
|
|
299
306
|
username: this.v1,
|
|
300
307
|
password: this.v2,
|
|
301
308
|
...(currentChallenge && {
|
|
@@ -316,6 +323,11 @@ class AXPLoginPasswordComponent {
|
|
|
316
323
|
catch (error) {
|
|
317
324
|
await this.handleLoginError(error);
|
|
318
325
|
}
|
|
326
|
+
finally {
|
|
327
|
+
// Always unlock the button — success navigates away; failure must not stay "processing".
|
|
328
|
+
this.submitText = 'signin.submit';
|
|
329
|
+
this.isLoading$.next(false);
|
|
330
|
+
}
|
|
319
331
|
}
|
|
320
332
|
});
|
|
321
333
|
}
|
|
@@ -365,23 +377,23 @@ class AXPLoginPasswordComponent {
|
|
|
365
377
|
}
|
|
366
378
|
}
|
|
367
379
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
content: 'Too many failed attempts. Additional verification may be required on your next try.',
|
|
372
|
-
timeOut: 5000,
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
// Default error handling
|
|
376
|
-
this.showLoginError(error, apiError);
|
|
380
|
+
// Default error handling (do not add a second toast for requiresCaptcha —
|
|
381
|
+
// that flag is for challenge UI; without a provider it duplicated the error toast)
|
|
382
|
+
await this.showLoginError(error, apiError);
|
|
377
383
|
}
|
|
378
384
|
/**
|
|
379
385
|
* Displays the login error message to the user
|
|
380
386
|
*/
|
|
381
|
-
showLoginError(error, apiError) {
|
|
387
|
+
async showLoginError(error, apiError) {
|
|
382
388
|
let errorMsg = 'An error occurred during sign in.';
|
|
383
389
|
const resolvedApiError = apiError ?? this.extractApiError(error);
|
|
384
|
-
|
|
390
|
+
const errorCode = (typeof resolvedApiError?.['error'] === 'string' && resolvedApiError['error']) ||
|
|
391
|
+
(typeof resolvedApiError?.['code'] === 'string' && resolvedApiError['code']) ||
|
|
392
|
+
'';
|
|
393
|
+
if (errorCode === 'AccountLocked') {
|
|
394
|
+
errorMsg = await this.formatAccountLockedMessage(resolvedApiError);
|
|
395
|
+
}
|
|
396
|
+
else if (resolvedApiError?.['message'] && typeof resolvedApiError['message'] === 'string') {
|
|
385
397
|
errorMsg = resolvedApiError['message'];
|
|
386
398
|
}
|
|
387
399
|
else if (error && typeof error === 'object') {
|
|
@@ -398,7 +410,7 @@ class AXPLoginPasswordComponent {
|
|
|
398
410
|
}
|
|
399
411
|
}
|
|
400
412
|
const remainingAttempts = resolvedApiError?.['remainingAttempts'];
|
|
401
|
-
if (typeof remainingAttempts === 'number' && remainingAttempts >= 0 &&
|
|
413
|
+
if (typeof remainingAttempts === 'number' && remainingAttempts >= 0 && errorCode !== 'AccountLocked') {
|
|
402
414
|
errorMsg = `${errorMsg} (${remainingAttempts} attempt${remainingAttempts === 1 ? '' : 's'} remaining)`;
|
|
403
415
|
}
|
|
404
416
|
this.toastService.show({
|
|
@@ -419,11 +431,40 @@ class AXPLoginPasswordComponent {
|
|
|
419
431
|
if (err['apiError'] && typeof err['apiError'] === 'object') {
|
|
420
432
|
return err['apiError'];
|
|
421
433
|
}
|
|
434
|
+
// AuthApiError exposes captcha/lockout fields on `.apiError`.
|
|
435
|
+
if ('apiError' in err && err['apiError'] == null && typeof err['message'] === 'string') {
|
|
436
|
+
return { message: err['message'] };
|
|
437
|
+
}
|
|
422
438
|
if (err['error'] && typeof err['error'] === 'object') {
|
|
423
439
|
return err['error'];
|
|
424
440
|
}
|
|
425
441
|
return null;
|
|
426
442
|
}
|
|
443
|
+
async formatAccountLockedMessage(apiError) {
|
|
444
|
+
const details = apiError?.['details'] && typeof apiError['details'] === 'object'
|
|
445
|
+
? apiError['details']
|
|
446
|
+
: null;
|
|
447
|
+
const lockedUntil = (typeof apiError?.['lockedUntil'] === 'string' && apiError['lockedUntil']) ||
|
|
448
|
+
(typeof details?.['lockedUntil'] === 'string' && details['lockedUntil']) ||
|
|
449
|
+
'';
|
|
450
|
+
const formatted = lockedUntil ? await this.formatLockedUntil(lockedUntil) : '';
|
|
451
|
+
if (formatted) {
|
|
452
|
+
return this.translateService.translateAsync('@auth:signin.errors.account-locked-until', {
|
|
453
|
+
params: { datetime: formatted },
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
return this.translateService.translateAsync('@auth:signin.errors.account-locked');
|
|
457
|
+
}
|
|
458
|
+
async formatLockedUntil(iso) {
|
|
459
|
+
const parsed = Date.parse(iso);
|
|
460
|
+
if (!Number.isFinite(parsed)) {
|
|
461
|
+
return '';
|
|
462
|
+
}
|
|
463
|
+
const dateFormat = await this.settingsService.get(AXPRegionalSetting.ShortDate);
|
|
464
|
+
const timeFormat = await this.settingsService.get(AXPRegionalSetting.ShortTime);
|
|
465
|
+
const format = `${dateFormat} ${timeFormat}`.trim();
|
|
466
|
+
return this.formatService.format(new Date(parsed), 'datetime', { format });
|
|
467
|
+
}
|
|
427
468
|
//#endregion
|
|
428
469
|
//#region ---- Challenge Handlers ----
|
|
429
470
|
/**
|
|
@@ -511,12 +552,12 @@ class AXPLoginPasswordComponent {
|
|
|
511
552
|
this.challengeResponse.set('');
|
|
512
553
|
this.destroyChallengeComponent();
|
|
513
554
|
}
|
|
514
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
515
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
555
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
556
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPLoginPasswordComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "form", first: true, predicate: AXFormComponent, descendants: true }, { propertyName: "challengeContainerRef", first: true, predicate: ["challengeContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:signin.title' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:signin.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ ('@auth:' + l1) | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'username'\"\n id=\"username\"\n [autoComplete]=\"'username'\"\n [(value)]=\"v1\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n <ax-form-field>\n <ax-label>{{ '@auth:password' | translate | async }}</ax-label>\n <ax-password-box\n [name]=\"'password'\"\n id=\"password\"\n [autoComplete]=\"'current-password'\"\n [(value)]=\"v2\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-password-box>\n </ax-form-field>\n\n <!-- Challenge Section (CAPTCHA) - rendered via ViewContainerRef -->\n @if (hasChallengeActive) {\n <ng-container #challengeContainer></ng-container>\n }\n\n <div class=\"flex justify-between items-center\">\n <ax-check-box [(ngModel)]=\"isKeepLogin\">\n <ax-label class=\"mb-0\">{{\n '@auth:signin.remember' | translate | async\n }}</ax-label>\n </ax-check-box>\n <ax-button\n color=\"primary\"\n class=\"ax-sm\"\n id=\"forgot-password\"\n [text]=\"'@auth:forgot.password' | translate | async\"\n look=\"blank\"\n (onClick)=\"handleForgotOnClick()\"\n >\n </ax-button>\n </div>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n id=\"submit-login\"\n [text]=\"'@auth:signin.submit' | translate | async\"\n (onClick)=\"handleLoginClick()\"\n [disabled]=\"isLoading$ | async\"\n [type]=\"'submit'\"\n >\n @if (isLoading$ | async) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n @if (externalProviders.hasContent() || signupEnabled) {\n <div class=\"my-5 lg:my-8 flex w-full items-center\">\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n <span class=\"px-3 text-xs font-medium tracking-wide text-neutral-400\">\n {{ '@auth:signin.or' | translate | async }}\n </span>\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n </div>\n }\n <axm-login-external-providers\n #externalProviders\n ></axm-login-external-providers>\n </ax-form>\n @if (signupEnabled) {\n <ax-button\n class=\"w-full mt-2\"\n id=\"register\"\n (onClick)=\"handleRegisterOnClick()\"\n text=\"{{ '@auth:register' | translate | async }}\"\n [color]=\"'default'\"\n >\n </ax-button>\n }\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box,.axp-auth-form ax-password-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1$1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i1$1.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i1$1.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message", "disabled"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXPasswordBoxModule }, { kind: "component", type: i4.AXPasswordBoxComponent, selector: "ax-password-box", inputs: ["readonly", "disabled", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "autoComplete", "showToggleButton", "class"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { 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: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "component", type: i7.AXCheckBoxComponent, selector: "ax-check-box", inputs: ["disabled", "tabIndex", "readonly", "color", "value", "name", "id", "isLoading", "indeterminate"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$1.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: AXValidationModule }, { kind: "component", type: AXPLoginExternalProvidersComponent, selector: "axm-login-external-providers" }, { kind: "pipe", type: i3$2.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
516
557
|
}
|
|
517
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
558
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginPasswordComponent, decorators: [{
|
|
518
559
|
type: Component,
|
|
519
|
-
args: [{ imports: [...MODULES], template: "<ng-container *translate=\"let t\">\n <div class=\"text-center mb-
|
|
560
|
+
args: [{ changeDetection: ChangeDetectionStrategy.Eager, imports: [...MODULES], template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:signin.title' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:signin.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ ('@auth:' + l1) | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'username'\"\n id=\"username\"\n [autoComplete]=\"'username'\"\n [(value)]=\"v1\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n <ax-form-field>\n <ax-label>{{ '@auth:password' | translate | async }}</ax-label>\n <ax-password-box\n [name]=\"'password'\"\n id=\"password\"\n [autoComplete]=\"'current-password'\"\n [(value)]=\"v2\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-password-box>\n </ax-form-field>\n\n <!-- Challenge Section (CAPTCHA) - rendered via ViewContainerRef -->\n @if (hasChallengeActive) {\n <ng-container #challengeContainer></ng-container>\n }\n\n <div class=\"flex justify-between items-center\">\n <ax-check-box [(ngModel)]=\"isKeepLogin\">\n <ax-label class=\"mb-0\">{{\n '@auth:signin.remember' | translate | async\n }}</ax-label>\n </ax-check-box>\n <ax-button\n color=\"primary\"\n class=\"ax-sm\"\n id=\"forgot-password\"\n [text]=\"'@auth:forgot.password' | translate | async\"\n look=\"blank\"\n (onClick)=\"handleForgotOnClick()\"\n >\n </ax-button>\n </div>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n id=\"submit-login\"\n [text]=\"'@auth:signin.submit' | translate | async\"\n (onClick)=\"handleLoginClick()\"\n [disabled]=\"isLoading$ | async\"\n [type]=\"'submit'\"\n >\n @if (isLoading$ | async) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n @if (externalProviders.hasContent() || signupEnabled) {\n <div class=\"my-5 lg:my-8 flex w-full items-center\">\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n <span class=\"px-3 text-xs font-medium tracking-wide text-neutral-400\">\n {{ '@auth:signin.or' | translate | async }}\n </span>\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n </div>\n }\n <axm-login-external-providers\n #externalProviders\n ></axm-login-external-providers>\n </ax-form>\n @if (signupEnabled) {\n <ax-button\n class=\"w-full mt-2\"\n id=\"register\"\n (onClick)=\"handleRegisterOnClick()\"\n text=\"{{ '@auth:register' | translate | async }}\"\n [color]=\"'default'\"\n >\n </ax-button>\n }\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box,.axp-auth-form ax-password-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
520
561
|
}], propDecorators: { form: [{
|
|
521
562
|
type: ViewChild,
|
|
522
563
|
args: [AXFormComponent]
|
|
@@ -526,4 +567,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
526
567
|
}] } });
|
|
527
568
|
|
|
528
569
|
export { AXPLoginPasswordComponent };
|
|
529
|
-
//# sourceMappingURL=acorex-platform-module-auth-client-password.component-
|
|
570
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-password.component-CNKRWfuG.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-password.component-CNKRWfuG.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/login/password/default-challenge.component.ts","../../../../libs/modules/auth/client/src/lib/pages/login/password/password.component.ts","../../../../libs/modules/auth/client/src/lib/pages/login/password/password.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport { AXPLoginChallengeComponentBase } from '@acorex-platform/framework-client/auth';\nimport { CommonModule } from '@angular/common';\nimport { Component, signal, ChangeDetectionStrategy } from '@angular/core';\n\n//#region ---- Default Challenge Component ----\n\n/**\n * Default built-in challenge component for login\n * Shows challenge image/content with an input field and refresh button\n */\n@Component({\n selector: 'axp-default-challenge',\n standalone: true,\n imports: [\n AXButtonModule,\n AXTextBoxModule,\n AXLabelModule,\n AXFormModule,\n AXDecoratorModule,\n AXLoadingModule,\n AXTranslationModule,\n AXValidationModule,\n CommonModule,\n ],\n changeDetection: ChangeDetectionStrategy.Eager,\n template: `\n <div class=\"flex flex-col gap-3 p-4 border rounded-md border-warning-300 bg-warning-50\">\n <!-- Challenge Image -->\n <div class=\"flex items-center justify-center gap-2\">\n @if (challengeData(); as challenge) {\n @if (challenge.contentType === 'image-base64') {\n <img\n [src]=\"'data:image/png;base64,' + challenge.content\"\n alt=\"Security Challenge\"\n class=\"h-12 border rounded\"\n />\n } @else if (challenge.contentType === 'image-url') {\n <img [src]=\"challenge.content\" alt=\"Security Challenge\" class=\"h-12 border rounded\" />\n } @else {\n <span class=\"font-mono text-lg p-2 border rounded bg-white\">\n {{ challenge.content }}\n </span>\n }\n }\n <!-- Refresh Challenge Button -->\n <ax-button\n look=\"blank\"\n color=\"primary\"\n class=\"ax-sm\"\n id=\"refresh-challenge\"\n (onClick)=\"onRefreshClick()\"\n [disabled]=\"isLoading()\"\n >\n @if (isLoading()) {\n <ax-loading></ax-loading>\n } @else {\n <ax-icon><i class=\"fa-solid fa-rotate\"></i></ax-icon>\n }\n </ax-button>\n </div>\n\n <!-- Challenge Response Input -->\n <ax-form-field>\n <ax-label>{{ '@auth:challenge.enter-code' | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'challengeResponse'\"\n id=\"challenge-response\"\n [placeholder]=\"'@auth:challenge.placeholder' | translate | async\"\n [value]=\"response()\"\n (valueChange)=\"onResponseChange($event)\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n </div>\n `,\n})\nexport class AXPDefaultChallengeComponent extends AXPLoginChallengeComponentBase {\n //#region ---- Local State ----\n\n /** Local state for the response input */\n protected response = signal<string>('');\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n /**\n * Handles response input change\n */\n protected onResponseChange(value: string): void {\n this.response.set(value);\n this.responseChange.emit(value);\n }\n\n /**\n * Handles refresh button click\n */\n protected onRefreshClick(): void {\n this.refreshRequest.emit();\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormComponent, AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXPasswordBoxModule } from '@acorex/components/password-box';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport {\n Component,\n ComponentRef,\n Injector,\n OnInit,\n Type,\n ViewChild,\n ViewContainerRef,\n effect,\n inject,\n signal,\n ChangeDetectionStrategy\n} from '@angular/core';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\n\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXValidationModule } from '@acorex/core/validation';\nimport {\n AXPLoginChallengeComponentBase,\n AXPLoginChallengeData,\n AXPSessionService,\n AXP_LOGIN_CHALLENGE_PROVIDER,\n} from '@acorex-platform/framework-client/auth';\nimport { AXPHomePageService, AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport { FormsModule } from '@angular/forms';\nimport { BehaviorSubject, firstValueFrom } from 'rxjs';\nimport { AXMAuthenticationTypes } from '../../../auth.config';\nimport { AXMAuthPlatformSettingsService } from '../../../auth-platform-settings.service';\nimport { AXPLoginExternalProvidersComponent } from '../login-external-providers.component';\nimport { AXPDefaultChallengeComponent } from './default-challenge.component';\n\n//#region ---- Module Imports ----\n\nconst MODULES = [\n CommonModule,\n FormsModule,\n AXFormModule,\n AXTextBoxModule,\n AXPasswordBoxModule,\n AXButtonModule,\n AXLabelModule,\n AXDecoratorModule,\n AXCheckBoxModule,\n AXTranslationModule,\n AXLoadingModule,\n RouterModule,\n AXValidationModule,\n AXPLoginExternalProvidersComponent,\n];\n\n//#endregion\n\n@Component({\n templateUrl: './password.component.html',\n styleUrls: ['./password.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [...MODULES],\n})\nexport class AXPLoginPasswordComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private readonly authPlatformSettings = inject(AXMAuthPlatformSettingsService);\n private sessionService = inject(AXPSessionService);\n private activateRoute = inject(ActivatedRoute);\n private homePageService = inject(AXPHomePageService);\n private toastService = inject(AXToastService);\n private formatService = inject(AXFormatService);\n private settingsService = inject(AXPSettingsService);\n private translateService = inject(AXTranslationService);\n private router = inject(Router);\n protected injector = inject(Injector);\n\n protected readonly signupEnabled = this.authPlatformSettings.signupEnabled();\n\n /** Optional challenge provider - injected only if configured */\n private challengeProvider = inject(AXP_LOGIN_CHALLENGE_PROVIDER, { optional: true });\n\n //#endregion\n\n //#region ---- Form References ----\n\n @ViewChild(AXFormComponent)\n private form!: AXFormComponent;\n\n //#endregion\n\n //#region ---- Form Fields ----\n\n /** Label key for the first input field (username/email/mobile) */\n protected l1!: string;\n\n /** Label key for the second input field (password) */\n protected l2!: string;\n\n /** Value of the first input field (username/email) */\n protected v1 = '';\n\n /** Value of the second input field (password) */\n protected v2: string | null = '';\n\n /** Whether to keep the user logged in */\n protected isKeepLogin = false;\n\n //#endregion\n\n //#region ---- Challenge State ----\n\n /** ViewContainerRef for rendering the challenge component */\n @ViewChild('challengeContainer', { read: ViewContainerRef })\n private challengeContainerRef?: ViewContainerRef;\n\n /** Reference to the currently rendered challenge component */\n private challengeComponentRef?: ComponentRef<AXPLoginChallengeComponentBase>;\n\n /** Current challenge data from the server */\n protected challengeData = signal<AXPLoginChallengeData | null>(null);\n\n /** User's response to the challenge (e.g., CAPTCHA text) */\n protected challengeResponse = signal<string>('');\n\n /** Loading state for challenge refresh */\n protected isChallengeLoading = signal<boolean>(false);\n\n /**\n * Effect to render the challenge component when challenge data changes\n */\n private challengeRenderEffect = effect(() => {\n const data = this.challengeData();\n const isLoading = this.isChallengeLoading();\n\n // Wait for next tick to ensure ViewContainerRef is available\n setTimeout(() => {\n if (data && this.challengeContainerRef) {\n this.renderChallengeComponent(data, isLoading);\n } else {\n this.destroyChallengeComponent();\n }\n });\n });\n\n //#endregion\n\n //#region ---- Loading & Status State ----\n\n protected isLoading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n protected submitText = 'signin.submit';\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n /** Check if a challenge is currently active and should be displayed */\n protected get hasChallengeActive(): boolean {\n return this.challengeData() !== null;\n }\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n ngOnInit(): void {\n this.l2 = 'password';\n switch (this.authPlatformSettings.credentialType()) {\n case AXMAuthenticationTypes.EmailPassword:\n this.l1 = 'email';\n break;\n case AXMAuthenticationTypes.MobilePassword:\n this.l1 = 'mobile';\n break;\n case AXMAuthenticationTypes.UsernameEmailPassword:\n this.l1 = 'username-email';\n break;\n case AXMAuthenticationTypes.UsernamePassword:\n default:\n this.l1 = 'username';\n }\n }\n\n //#endregion\n\n //#region ---- Navigation Handlers ----\n\n protected handleForgotOnClick(): void {\n this.router.navigate(['/auth/forgot']);\n }\n\n protected handleRegisterOnClick(): void {\n this.router.navigate([this.authPlatformSettings.signupUrl()]);\n }\n\n //#endregion\n\n //#region ---- Login Handlers ----\n\n protected handleLoginClick(): void {\n const strategyName = this.authPlatformSettings.defaultStrategyName();\n this.sessionService.setStrategy(strategyName);\n const redirectUrl = this.activateRoute.snapshot.queryParams['redirectUrl'];\n\n this.form.validate().then(async (form) => {\n if (form.result) {\n this.isLoading$.next(true);\n this.submitText = 'processing';\n\n try {\n // Build credentials object with challenge data if active\n const currentChallenge = this.challengeData();\n const credentials = {\n strategy: strategyName,\n username: this.v1,\n password: this.v2!,\n ...(currentChallenge && {\n challengeId: currentChallenge.id,\n challengeResponse: this.challengeResponse(),\n }),\n };\n\n await this.sessionService.signin(credentials);\n\n // Check authentication status before navigation\n const isAuthenticated = await firstValueFrom(this.sessionService.isAuthenticated$);\n\n if (!isAuthenticated) {\n throw new Error('Authentication failed after signin');\n }\n\n // Clear challenge state on successful login\n this.clearChallengeState();\n\n await this.navigateAfterAuth(redirectUrl);\n } catch (error: unknown) {\n await this.handleLoginError(error);\n } finally {\n // Always unlock the button — success navigates away; failure must not stay \"processing\".\n this.submitText = 'signin.submit';\n this.isLoading$.next(false);\n }\n }\n });\n }\n\n private async navigateAfterAuth(redirectUrl?: string): Promise<void> {\n if (this.sessionService.tenant?.id == null) {\n await this.router.navigate(['/auth/account/tenant-chooser']);\n return;\n }\n\n if (this.sessionService.application?.id == null) {\n await this.router.navigate(['/auth/account/app-chooser']);\n return;\n }\n\n if (redirectUrl) {\n await this.router.navigate([redirectUrl]);\n return;\n }\n\n await this.homePageService.navigateTo();\n }\n\n /**\n * Handles login errors and checks if a challenge is required\n */\n private async handleLoginError(error: unknown): Promise<void> {\n const apiError = this.extractApiError(error);\n\n // Check if challenge provider wants to handle this error\n if (this.challengeProvider) {\n const checkResult = this.challengeProvider.checkResponse(error);\n\n if (checkResult?.required) {\n try {\n // Fetch challenge from server\n const challenge = await this.challengeProvider.getChallenge(checkResult.serverData);\n this.challengeData.set(challenge);\n this.challengeResponse.set('');\n\n // Show challenge message if provided\n if (checkResult.message) {\n this.toastService.show({\n color: 'warning',\n content: checkResult.message,\n timeOut: 5000,\n });\n }\n\n this.submitText = 'signin.submit';\n this.isLoading$.next(false);\n return;\n } catch (challengeError) {\n console.error('Failed to fetch challenge:', challengeError);\n }\n }\n }\n\n // Default error handling (do not add a second toast for requiresCaptcha —\n // that flag is for challenge UI; without a provider it duplicated the error toast)\n await this.showLoginError(error, apiError);\n }\n\n /**\n * Displays the login error message to the user\n */\n private async showLoginError(error: unknown, apiError?: Record<string, unknown> | null): Promise<void> {\n let errorMsg = 'An error occurred during sign in.';\n const resolvedApiError = apiError ?? this.extractApiError(error);\n const errorCode =\n (typeof resolvedApiError?.['error'] === 'string' && resolvedApiError['error']) ||\n (typeof resolvedApiError?.['code'] === 'string' && resolvedApiError['code']) ||\n '';\n\n if (errorCode === 'AccountLocked') {\n errorMsg = await this.formatAccountLockedMessage(resolvedApiError);\n } else if (resolvedApiError?.['message'] && typeof resolvedApiError['message'] === 'string') {\n errorMsg = resolvedApiError['message'];\n } else if (error && typeof error === 'object') {\n const err = error as Record<string, unknown>;\n const errObj = err['error'] as Record<string, unknown> | undefined;\n\n errorMsg =\n (errObj?.['error_description'] as string) ||\n (errObj?.['error'] as string) ||\n (err['message'] as string) ||\n errorMsg;\n\n if (typeof errorMsg === 'object') {\n const msgObj = errorMsg as unknown as Record<string, unknown>;\n errorMsg = (msgObj['message'] as string) || (msgObj['error_description'] as string) || JSON.stringify(errorMsg);\n }\n }\n\n const remainingAttempts = resolvedApiError?.['remainingAttempts'];\n if (typeof remainingAttempts === 'number' && remainingAttempts >= 0 && errorCode !== 'AccountLocked') {\n errorMsg = `${errorMsg} (${remainingAttempts} attempt${remainingAttempts === 1 ? '' : 's'} remaining)`;\n }\n\n this.toastService.show({\n color: 'danger',\n content: errorMsg,\n timeOut: 5000,\n });\n\n console.error('Login error:', error);\n this.submitText = 'signin.submit';\n this.v2 = null;\n this.isLoading$.next(false);\n }\n\n private extractApiError(error: unknown): Record<string, unknown> | null {\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const err = error as Record<string, unknown>;\n if (err['apiError'] && typeof err['apiError'] === 'object') {\n return err['apiError'] as Record<string, unknown>;\n }\n\n // AuthApiError exposes captcha/lockout fields on `.apiError`.\n if ('apiError' in err && err['apiError'] == null && typeof err['message'] === 'string') {\n return { message: err['message'] };\n }\n\n if (err['error'] && typeof err['error'] === 'object') {\n return err['error'] as Record<string, unknown>;\n }\n\n return null;\n }\n\n private async formatAccountLockedMessage(apiError: Record<string, unknown> | null): Promise<string> {\n const details =\n apiError?.['details'] && typeof apiError['details'] === 'object'\n ? (apiError['details'] as Record<string, unknown>)\n : null;\n const lockedUntil =\n (typeof apiError?.['lockedUntil'] === 'string' && apiError['lockedUntil']) ||\n (typeof details?.['lockedUntil'] === 'string' && details['lockedUntil']) ||\n '';\n const formatted = lockedUntil ? await this.formatLockedUntil(lockedUntil) : '';\n\n if (formatted) {\n return this.translateService.translateAsync('@auth:signin.errors.account-locked-until', {\n params: { datetime: formatted },\n });\n }\n\n return this.translateService.translateAsync('@auth:signin.errors.account-locked');\n }\n\n private async formatLockedUntil(iso: string): Promise<string> {\n const parsed = Date.parse(iso);\n if (!Number.isFinite(parsed)) {\n return '';\n }\n\n const dateFormat = await this.settingsService.get(AXPRegionalSetting.ShortDate);\n const timeFormat = await this.settingsService.get(AXPRegionalSetting.ShortTime);\n const format = `${dateFormat} ${timeFormat}`.trim();\n return this.formatService.format(new Date(parsed), 'datetime', { format });\n }\n\n //#endregion\n\n //#region ---- Challenge Handlers ----\n\n /**\n * Gets the challenge component type from provider or uses default\n */\n private getChallengeComponentType(): Type<AXPLoginChallengeComponentBase> {\n return this.challengeProvider?.getChallengeComponent() ?? AXPDefaultChallengeComponent;\n }\n\n /**\n * Renders the challenge component dynamically\n */\n private renderChallengeComponent(data: AXPLoginChallengeData, isLoading: boolean): void {\n if (!this.challengeContainerRef) return;\n\n // If component already exists, just update inputs\n if (this.challengeComponentRef) {\n this.updateChallengeComponentInputs(data, isLoading);\n return;\n }\n\n // Clear container and create new component\n this.challengeContainerRef.clear();\n const componentType = this.getChallengeComponentType();\n this.challengeComponentRef = this.challengeContainerRef.createComponent(componentType);\n\n // Set inputs\n this.updateChallengeComponentInputs(data, isLoading);\n\n // Subscribe to outputs\n const instance = this.challengeComponentRef.instance;\n instance.responseChange.subscribe((response: string) => {\n this.challengeResponse.set(response);\n });\n instance.refreshRequest.subscribe(() => {\n this.handleRefreshChallenge();\n });\n }\n\n /**\n * Updates the inputs of the challenge component\n */\n private updateChallengeComponentInputs(data: AXPLoginChallengeData, isLoading: boolean): void {\n if (!this.challengeComponentRef) return;\n\n this.challengeComponentRef.setInput('challengeData', data);\n this.challengeComponentRef.setInput('isLoading', isLoading);\n }\n\n /**\n * Destroys the challenge component\n */\n private destroyChallengeComponent(): void {\n if (this.challengeComponentRef) {\n this.challengeComponentRef.destroy();\n this.challengeComponentRef = undefined;\n }\n if (this.challengeContainerRef) {\n this.challengeContainerRef.clear();\n }\n }\n\n /**\n * Refreshes the challenge (e.g., user clicks \"new image\" button)\n */\n protected async handleRefreshChallenge(): Promise<void> {\n if (!this.challengeProvider) return;\n\n this.isChallengeLoading.set(true);\n try {\n const newChallenge = await this.challengeProvider.refreshChallenge();\n this.challengeData.set(newChallenge);\n this.challengeResponse.set('');\n } catch (error) {\n console.error('Failed to refresh challenge:', error);\n this.toastService.show({\n color: 'danger',\n content: 'Failed to load new challenge. Please try again.',\n timeOut: 3000,\n });\n } finally {\n this.isChallengeLoading.set(false);\n }\n }\n\n /**\n * Clears the challenge state (after successful login or manual clear)\n */\n private clearChallengeState(): void {\n this.challengeData.set(null);\n this.challengeResponse.set('');\n this.destroyChallengeComponent();\n }\n\n //#endregion\n}\n","<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:signin.title' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:signin.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ ('@auth:' + l1) | translate | async }}</ax-label>\n <ax-text-box\n [name]=\"'username'\"\n id=\"username\"\n [autoComplete]=\"'username'\"\n [(value)]=\"v1\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-text-box>\n </ax-form-field>\n <ax-form-field>\n <ax-label>{{ '@auth:password' | translate | async }}</ax-label>\n <ax-password-box\n [name]=\"'password'\"\n id=\"password\"\n [autoComplete]=\"'current-password'\"\n [(value)]=\"v2\"\n >\n <ax-validation-rule rule=\"required\"></ax-validation-rule>\n </ax-password-box>\n </ax-form-field>\n\n <!-- Challenge Section (CAPTCHA) - rendered via ViewContainerRef -->\n @if (hasChallengeActive) {\n <ng-container #challengeContainer></ng-container>\n }\n\n <div class=\"flex justify-between items-center\">\n <ax-check-box [(ngModel)]=\"isKeepLogin\">\n <ax-label class=\"mb-0\">{{\n '@auth:signin.remember' | translate | async\n }}</ax-label>\n </ax-check-box>\n <ax-button\n color=\"primary\"\n class=\"ax-sm\"\n id=\"forgot-password\"\n [text]=\"'@auth:forgot.password' | translate | async\"\n look=\"blank\"\n (onClick)=\"handleForgotOnClick()\"\n >\n </ax-button>\n </div>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n id=\"submit-login\"\n [text]=\"'@auth:signin.submit' | translate | async\"\n (onClick)=\"handleLoginClick()\"\n [disabled]=\"isLoading$ | async\"\n [type]=\"'submit'\"\n >\n @if (isLoading$ | async) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n @if (externalProviders.hasContent() || signupEnabled) {\n <div class=\"my-5 lg:my-8 flex w-full items-center\">\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n <span class=\"px-3 text-xs font-medium tracking-wide text-neutral-400\">\n {{ '@auth:signin.or' | translate | async }}\n </span>\n <div class=\"h-px flex-1 bg-border-lighter\"></div>\n </div>\n }\n <axm-login-external-providers\n #externalProviders\n ></axm-login-external-providers>\n </ax-form>\n @if (signupEnabled) {\n <ax-button\n class=\"w-full mt-2\"\n id=\"register\"\n (onClick)=\"handleRegisterOnClick()\"\n text=\"{{ '@auth:register' | translate | async }}\"\n [color]=\"'default'\"\n >\n </ax-button>\n }\n </div>\n</ng-container>\n"],"names":["i4","i5","i6","i7","i8","i1","i2","i3","i9","i10"],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { AXPCommandService } from '@acorex-platform/framework-client/runtime';
|
|
2
|
+
import { AXMSecurityManagementServerCommands } from '@acorex-platform/module-security-management-contracts';
|
|
3
|
+
import * as i1$1 from '@acorex/components/button';
|
|
4
|
+
import { AXButtonModule } from '@acorex/components/button';
|
|
5
|
+
import * as i1 from '@acorex/components/form';
|
|
6
|
+
import { AXFormModule } from '@acorex/components/form';
|
|
7
|
+
import * as i3 from '@acorex/components/label';
|
|
8
|
+
import { AXLabelModule } from '@acorex/components/label';
|
|
9
|
+
import * as i2 from '@acorex/components/text-box';
|
|
10
|
+
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
11
|
+
import { AXToastService } from '@acorex/components/toast';
|
|
12
|
+
import * as i5 from '@acorex/core/translation';
|
|
13
|
+
import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
|
|
14
|
+
import * as i3$1 from '@angular/common';
|
|
15
|
+
import { CommonModule } from '@angular/common';
|
|
16
|
+
import * as i0 from '@angular/core';
|
|
17
|
+
import { inject, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
18
|
+
import * as i1$2 from '@angular/router';
|
|
19
|
+
import { RouterModule } from '@angular/router';
|
|
20
|
+
|
|
21
|
+
class AXPForgetPasswordComponent {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.commandService = inject(AXPCommandService);
|
|
24
|
+
this.toast = inject(AXToastService);
|
|
25
|
+
this.translation = inject(AXTranslationService);
|
|
26
|
+
this.login = '';
|
|
27
|
+
this.submitting = false;
|
|
28
|
+
this.submitted = false;
|
|
29
|
+
}
|
|
30
|
+
async submit() {
|
|
31
|
+
const login = this.login.trim();
|
|
32
|
+
if (!login || this.submitting) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.submitting = true;
|
|
36
|
+
try {
|
|
37
|
+
const result = await this.commandService.execute(AXMSecurityManagementServerCommands.SendPasswordResetEmail, {
|
|
38
|
+
login,
|
|
39
|
+
webOrigin: typeof window !== 'undefined' ? window.location.origin : undefined,
|
|
40
|
+
});
|
|
41
|
+
if (!result?.success) {
|
|
42
|
+
throw new Error('request failed');
|
|
43
|
+
}
|
|
44
|
+
this.submitted = true;
|
|
45
|
+
const [title, content] = await Promise.all([
|
|
46
|
+
this.translation
|
|
47
|
+
.translateAsync('@auth:forgot.success.title')
|
|
48
|
+
.catch(() => 'Check Your Email'),
|
|
49
|
+
this.translation
|
|
50
|
+
.translateAsync('@auth:forgot.success.description')
|
|
51
|
+
.catch(() => 'If an account exists, a password reset email has been sent.'),
|
|
52
|
+
]);
|
|
53
|
+
this.toast.show({ color: 'success', title, content, timeOut: 4000 });
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
const [title, content] = await Promise.all([
|
|
57
|
+
this.translation
|
|
58
|
+
.translateAsync('@auth:forgot.error.title')
|
|
59
|
+
.catch(() => 'Request Failed'),
|
|
60
|
+
this.translation
|
|
61
|
+
.translateAsync('@auth:forgot.error.description')
|
|
62
|
+
.catch(() => 'Unable to send password reset email. Please try again later.'),
|
|
63
|
+
]);
|
|
64
|
+
this.toast.show({ color: 'danger', title, content, timeOut: 4000 });
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
this.submitting = false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPForgetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
71
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: AXPForgetPasswordComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:forgot.password' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box\n name=\"login\"\n [(value)]=\"login\"\n [disabled]=\"submitting || submitted\"\n ></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n [text]=\"'@auth:forgot.submit' | translate | async\"\n [disabled]=\"submitting || submitted || !login.trim()\"\n (onClick)=\"submit()\"\n ></ax-button>\n <p class=\"text-center mt-6 text-neutral-400 text-sm\">\n {{ '@auth:tenant-chooser.footer' | translate | async }}\n <a\n [routerLink]=\"['/auth/login']\"\n class=\"text-primary font-medium cursor-pointer hover:underline\"\n >\n {{ '@auth:backLogin' | translate | async }}\n </a>\n </p>\n </ax-form>\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i1.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "browserUrl", "routerLink"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
72
|
+
}
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPForgetPasswordComponent, decorators: [{
|
|
74
|
+
type: Component,
|
|
75
|
+
args: [{ changeDetection: ChangeDetectionStrategy.Eager, imports: [
|
|
76
|
+
CommonModule,
|
|
77
|
+
AXFormModule,
|
|
78
|
+
AXTextBoxModule,
|
|
79
|
+
AXButtonModule,
|
|
80
|
+
AXLabelModule,
|
|
81
|
+
AXTranslationModule,
|
|
82
|
+
RouterModule,
|
|
83
|
+
], template: "<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:forgot.password' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box\n name=\"login\"\n [(value)]=\"login\"\n [disabled]=\"submitting || submitted\"\n ></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n [text]=\"'@auth:forgot.submit' | translate | async\"\n [disabled]=\"submitting || submitted || !login.trim()\"\n (onClick)=\"submit()\"\n ></ax-button>\n <p class=\"text-center mt-6 text-neutral-400 text-sm\">\n {{ '@auth:tenant-chooser.footer' | translate | async }}\n <a\n [routerLink]=\"['/auth/login']\"\n class=\"text-primary font-medium cursor-pointer hover:underline\"\n >\n {{ '@auth:backLogin' | translate | async }}\n </a>\n </p>\n </ax-form>\n </div>\n</ng-container>\n", styles: [":host{display:block;width:100%}.axp-auth-form{width:100%;margin-inline:auto}@media(min-width:768px){.axp-auth-form{width:24rem;max-width:100%}}.axp-auth-form ax-form,.axp-auth-form ax-form-field,.axp-auth-form ax-text-box{display:block;width:100%}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
84
|
+
}] });
|
|
85
|
+
|
|
86
|
+
export { AXPForgetPasswordComponent };
|
|
87
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.ts","../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.html"],"sourcesContent":["import { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXMSecurityManagementServerCommands } from '@acorex-platform/module-security-management-contracts';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXTextBoxModule } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\n@Component({\n templateUrl: './password.component.html',\n styleUrls: ['./password.component.css'],\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [\n CommonModule,\n AXFormModule,\n AXTextBoxModule,\n AXButtonModule,\n AXLabelModule,\n AXTranslationModule,\n RouterModule,\n ],\n})\nexport class AXPForgetPasswordComponent {\n private readonly commandService = inject(AXPCommandService);\n private readonly toast = inject(AXToastService);\n private readonly translation = inject(AXTranslationService);\n\n protected login = '';\n protected submitting = false;\n protected submitted = false;\n\n protected async submit(): Promise<void> {\n const login = this.login.trim();\n if (!login || this.submitting) {\n return;\n }\n\n this.submitting = true;\n try {\n const result = await this.commandService.execute(\n AXMSecurityManagementServerCommands.SendPasswordResetEmail,\n {\n login,\n webOrigin:\n typeof window !== 'undefined' ? window.location.origin : undefined,\n },\n );\n if (!result?.success) {\n throw new Error('request failed');\n }\n this.submitted = true;\n const [title, content] = await Promise.all([\n this.translation\n .translateAsync('@auth:forgot.success.title')\n .catch(() => 'Check Your Email'),\n this.translation\n .translateAsync('@auth:forgot.success.description')\n .catch(\n () =>\n 'If an account exists, a password reset email has been sent.',\n ),\n ]);\n this.toast.show({ color: 'success', title, content, timeOut: 4000 });\n } catch {\n const [title, content] = await Promise.all([\n this.translation\n .translateAsync('@auth:forgot.error.title')\n .catch(() => 'Request Failed'),\n this.translation\n .translateAsync('@auth:forgot.error.description')\n .catch(\n () =>\n 'Unable to send password reset email. Please try again later.',\n ),\n ]);\n this.toast.show({ color: 'danger', title, content, timeOut: 4000 });\n } finally {\n this.submitting = false;\n }\n }\n}\n","<ng-container *translate=\"let t\">\n <div class=\"axp-auth-form\">\n <div class=\"text-center mb-3 lg:mb-5\">\n <h1 class=\"font-bold text-xl mb-1 lg:mb-2\">\n {{ '@auth:forgot.password' | translate | async }}\n </h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n </div>\n <ax-form>\n <div class=\"flex flex-col gap-4 lg:gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box\n name=\"login\"\n [(value)]=\"login\"\n [disabled]=\"submitting || submitted\"\n ></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button\n color=\"primary\"\n class=\"mt-4 lg:mt-6 w-full\"\n [text]=\"'@auth:forgot.submit' | translate | async\"\n [disabled]=\"submitting || submitted || !login.trim()\"\n (onClick)=\"submit()\"\n ></ax-button>\n <p class=\"text-center mt-6 text-neutral-400 text-sm\">\n {{ '@auth:tenant-chooser.footer' | translate | async }}\n <a\n [routerLink]=\"['/auth/login']\"\n class=\"text-primary font-medium cursor-pointer hover:underline\"\n >\n {{ '@auth:backLogin' | translate | async }}\n </a>\n </p>\n </ax-form>\n </div>\n</ng-container>\n"],"names":["i3","i4","i6","i7"],"mappings":"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"}
|