@acorex-platform/module-auth-client 0.0.37 → 0.0.46
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-accept-invitation.component-Ct28GG3a.mjs +179 -0
- package/fesm2022/acorex-platform-module-auth-client-accept-invitation.component-Ct28GG3a.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs} +1150 -107
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs → acorex-platform-module-auth-client-app-chooser.component-CxYe1hmk.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CxYe1hmk.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs → acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs} +3 -3
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs → acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map → acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs → acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs} +71 -21
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs +69 -0
- package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +12 -7
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs → acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs} +25 -4
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs → acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs → acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map → acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs → acorex-platform-module-auth-client-login.module-DasQfX02.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map → acorex-platform-module-auth-client-login.module-DasQfX02.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs +445 -0
- package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs → acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map → acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs → acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs.map → acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs → acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map → acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs +28 -0
- package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-password.component-BoWDVby5.mjs → acorex-platform-module-auth-client-password.component-CkUMxpZm.mjs} +39 -9
- package/fesm2022/acorex-platform-module-auth-client-password.component-CkUMxpZm.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs → acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs.map → acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-DTfyVXWu.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-DTfyVXWu.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-DWNbDzDd.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs.map → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-DWNbDzDd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs → acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs → acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs} +9 -7
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs +84 -0
- package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs → acorex-platform-module-auth-client-register-password.component-C_Vu3KS-.mjs} +7 -7
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map → acorex-platform-module-auth-client-register-password.component-C_Vu3KS-.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs → acorex-platform-module-auth-client-register.module-KlxTQevf.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map → acorex-platform-module-auth-client-register.module-KlxTQevf.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs → acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs → acorex-platform-module-auth-client-reset-password.component-BQfKSqpW.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs.map → acorex-platform-module-auth-client-reset-password.component-BQfKSqpW.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs +17 -0
- package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs → acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs.map → acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-CJJmgXqu.mjs} +7 -7
- package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-CJJmgXqu.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs → acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs → acorex-platform-module-auth-client-set-pin-code.component-DFzKiM1U.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-DFzKiM1U.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs → acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs} +18 -13
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs → acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs} +7 -1
- package/fesm2022/acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs → acorex-platform-module-auth-client-tenant-chooser.component-HqU75mfO.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-HqU75mfO.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs +48 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CfZo5Jl0.mjs +200 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CfZo5Jl0.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs → acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs} +10 -5
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs → acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs.map → acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs +165 -0
- package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs +813 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs +59 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
- package/package.json +2 -2
- package/types/acorex-platform-module-auth-client-contracts.d.ts +13 -3
- package/types/acorex-platform-module-auth-client.d.ts +60 -2
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs +0 -13
- package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs +0 -40
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs.map +0 -1
|
@@ -2,21 +2,21 @@ import * as i1 from '@acorex/components/button';
|
|
|
2
2
|
import { AXButtonModule } from '@acorex/components/button';
|
|
3
3
|
import * as i7 from '@acorex/components/check-box';
|
|
4
4
|
import { AXCheckBoxModule } from '@acorex/components/check-box';
|
|
5
|
-
import * as
|
|
5
|
+
import * as i2$1 from '@acorex/components/decorators';
|
|
6
6
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
7
7
|
import * as i1$1 from '@acorex/components/form';
|
|
8
8
|
import { AXFormModule, AXFormComponent } from '@acorex/components/form';
|
|
9
|
-
import * as
|
|
9
|
+
import * as i4 from '@acorex/components/label';
|
|
10
10
|
import { AXLabelModule } from '@acorex/components/label';
|
|
11
|
-
import * as i2$
|
|
11
|
+
import * as i2$2 from '@acorex/components/loading';
|
|
12
12
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
13
|
-
import * as
|
|
13
|
+
import * as i2$3 from '@acorex/components/password-box';
|
|
14
14
|
import { AXPasswordBoxModule } from '@acorex/components/password-box';
|
|
15
15
|
import * as i2 from '@acorex/components/text-box';
|
|
16
16
|
import { AXTextBoxModule } from '@acorex/components/text-box';
|
|
17
17
|
import * as i5 from '@acorex/core/translation';
|
|
18
18
|
import { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';
|
|
19
|
-
import * as
|
|
19
|
+
import * as i3 from '@angular/common';
|
|
20
20
|
import { CommonModule } from '@angular/common';
|
|
21
21
|
import * as i0 from '@angular/core';
|
|
22
22
|
import { signal, ChangeDetectionStrategy, Component, inject, Injector, effect, ViewContainerRef, ViewChild } from '@angular/core';
|
|
@@ -30,7 +30,8 @@ import { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';
|
|
|
30
30
|
import * as i1$2 from '@angular/forms';
|
|
31
31
|
import { FormsModule } from '@angular/forms';
|
|
32
32
|
import { BehaviorSubject, firstValueFrom } from 'rxjs';
|
|
33
|
-
import {
|
|
33
|
+
import { G as AXPLoginExternalProvidersComponent, w as AXMAuthPlatformSettingsService, H as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs';
|
|
34
|
+
import { w as writeTwoFactorChallenge } from './acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs';
|
|
34
35
|
|
|
35
36
|
//#region ---- Default Challenge Component ----
|
|
36
37
|
/**
|
|
@@ -111,7 +112,7 @@ class AXPDefaultChallengeComponent extends AXPLoginChallengeComponentBase {
|
|
|
111
112
|
</ax-text-box>
|
|
112
113
|
</ax-form-field>
|
|
113
114
|
</div>
|
|
114
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "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:
|
|
115
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "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: i4.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: i2$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2$2.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.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
115
116
|
}
|
|
116
117
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPDefaultChallengeComponent, decorators: [{
|
|
117
118
|
type: Component,
|
|
@@ -352,6 +353,9 @@ class AXPLoginPasswordComponent {
|
|
|
352
353
|
*/
|
|
353
354
|
async handleLoginError(error) {
|
|
354
355
|
const apiError = this.extractApiError(error);
|
|
356
|
+
if (await this.navigateToTwoFactorIfRequired(apiError)) {
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
355
359
|
// Check if challenge provider wants to handle this error
|
|
356
360
|
if (this.challengeProvider) {
|
|
357
361
|
const checkResult = this.challengeProvider.checkResponse(error);
|
|
@@ -382,6 +386,32 @@ class AXPLoginPasswordComponent {
|
|
|
382
386
|
// that flag is for challenge UI; without a provider it duplicated the error toast)
|
|
383
387
|
await this.showLoginError(error, apiError);
|
|
384
388
|
}
|
|
389
|
+
async navigateToTwoFactorIfRequired(apiError) {
|
|
390
|
+
if (!apiError) {
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
const errorCode = (typeof apiError['error'] === 'string' && apiError['error']) ||
|
|
394
|
+
(typeof apiError['code'] === 'string' && apiError['code']) ||
|
|
395
|
+
'';
|
|
396
|
+
if (errorCode !== 'TWO_FACTOR_REQUIRED') {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
const challengeId = typeof apiError['challengeId'] === 'string' ? apiError['challengeId'].trim() : '';
|
|
400
|
+
if (!challengeId) {
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
writeTwoFactorChallenge({
|
|
404
|
+
challengeId,
|
|
405
|
+
rememberMe: apiError['rememberMe'] === true,
|
|
406
|
+
});
|
|
407
|
+
const redirectUrl = this.activateRoute.snapshot.queryParams['redirectUrl'];
|
|
408
|
+
await this.router.navigate(['/auth/twofactor'], {
|
|
409
|
+
queryParams: redirectUrl ? { redirectUrl } : undefined,
|
|
410
|
+
});
|
|
411
|
+
this.submitText = 'signin.submit';
|
|
412
|
+
this.isLoading$.next(false);
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
385
415
|
/**
|
|
386
416
|
* Displays the login error message to the user
|
|
387
417
|
*/
|
|
@@ -558,7 +588,7 @@ class AXPLoginPasswordComponent {
|
|
|
558
588
|
this.destroyChallengeComponent();
|
|
559
589
|
}
|
|
560
590
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
561
|
-
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:
|
|
591
|
+
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: i2$3.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", "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: i4.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$2.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.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
562
592
|
}
|
|
563
593
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginPasswordComponent, decorators: [{
|
|
564
594
|
type: Component,
|
|
@@ -572,4 +602,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
572
602
|
}] } });
|
|
573
603
|
|
|
574
604
|
export { AXPLoginPasswordComponent };
|
|
575
|
-
//# sourceMappingURL=acorex-platform-module-auth-client-password.component-
|
|
605
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-password.component-CkUMxpZm.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-password.component-CkUMxpZm.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 { writeTwoFactorChallenge } from '../../two-factor/two-factor-challenge.storage';\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 rememberMe: this.isKeepLogin,\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 if (await this.navigateToTwoFactorIfRequired(apiError)) {\n return;\n }\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 private async navigateToTwoFactorIfRequired(\n apiError: Record<string, unknown> | null,\n ): Promise<boolean> {\n if (!apiError) {\n return false;\n }\n\n const errorCode =\n (typeof apiError['error'] === 'string' && apiError['error']) ||\n (typeof apiError['code'] === 'string' && apiError['code']) ||\n '';\n if (errorCode !== 'TWO_FACTOR_REQUIRED') {\n return false;\n }\n\n const challengeId =\n typeof apiError['challengeId'] === 'string' ? apiError['challengeId'].trim() : '';\n if (!challengeId) {\n return false;\n }\n\n writeTwoFactorChallenge({\n challengeId,\n rememberMe: apiError['rememberMe'] === true,\n });\n\n const redirectUrl = this.activateRoute.snapshot.queryParams['redirectUrl'];\n await this.router.navigate(['/auth/twofactor'], {\n queryParams: redirectUrl ? { redirectUrl } : undefined,\n });\n this.submitText = 'signin.submit';\n this.isLoading$.next(false);\n return true;\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 (\n errorCode === 'MAX_ACTIVE_DEVICE_SESSIONS' ||\n resolvedApiError?.['message'] === 'MAX_ACTIVE_DEVICE_SESSIONS'\n ) {\n errorMsg = await this.translateService.translateAsync(\n '@auth:signin.errors.max-active-device-sessions',\n );\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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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as i1 from '@acorex/components/button';
|
|
2
2
|
import { AXButtonModule } from '@acorex/components/button';
|
|
3
|
-
import * as i5
|
|
3
|
+
import * as i5 from '@acorex/core/translation';
|
|
4
4
|
import { AXTranslationModule } from '@acorex/core/translation';
|
|
5
5
|
import { AXPPlatformSettingsLoadState, AXPSettingsService, AXPCommonSettings } from '@acorex-platform/framework-client/common';
|
|
6
|
-
import * as
|
|
6
|
+
import * as i3 from '@angular/common';
|
|
7
7
|
import { CommonModule } from '@angular/common';
|
|
8
8
|
import * as i0 from '@angular/core';
|
|
9
9
|
import { inject, signal, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
@@ -36,7 +36,7 @@ class AXMPlatformSettingsUnavailableComponent {
|
|
|
36
36
|
this.showTechnicalDetail.set(debugMode === true);
|
|
37
37
|
}
|
|
38
38
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPlatformSettingsUnavailableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMPlatformSettingsUnavailableComponent, isStandalone: true, selector: "axm-platform-settings-unavailable", ngImport: i0, template: "<div class=\"min-h-full w-full flex items-center justify-center p-8 lightest-surface\">\n <div class=\"max-w-lg text-center flex flex-col gap-4\">\n <h1 class=\"font-bold text-2xl\">\n {{ '@auth:startup-error.title' | translate | async }}\n </h1>\n <p class=\"text-neutral-600\">\n {{ '@auth:startup-error.description' | translate | async }}\n </p>\n @if (showTechnicalDetail() !== null) {\n <!--->\n <!-- ----- Technical detail when Debug Mode is enabled in cached settings ----- -->\n @if (showTechnicalDetail() && detail) {\n <p class=\"text-sm text-neutral-500 break-words\">{{ detail }}</p>\n }\n <!-- ----- Contact admin tip when technical detail is hidden ----- -->\n @else {\n <p class=\"text-sm text-neutral-500\">\n {{ '@auth:startup-error.contact-admin' | translate | async }}\n </p>\n }\n }\n <ax-button\n color=\"primary\"\n class=\"mx-auto\"\n [text]=\"'@auth:startup-error.retry' | translate | async\"\n (onClick)=\"handleRetry()\"\n ></ax-button>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type:
|
|
39
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMPlatformSettingsUnavailableComponent, isStandalone: true, selector: "axm-platform-settings-unavailable", ngImport: i0, template: "<div class=\"min-h-full w-full flex items-center justify-center p-8 lightest-surface\">\n <div class=\"max-w-lg text-center flex flex-col gap-4\">\n <h1 class=\"font-bold text-2xl\">\n {{ '@auth:startup-error.title' | translate | async }}\n </h1>\n <p class=\"text-neutral-600\">\n {{ '@auth:startup-error.description' | translate | async }}\n </p>\n @if (showTechnicalDetail() !== null) {\n <!--->\n <!-- ----- Technical detail when Debug Mode is enabled in cached settings ----- -->\n @if (showTechnicalDetail() && detail) {\n <p class=\"text-sm text-neutral-500 break-words\">{{ detail }}</p>\n }\n <!-- ----- Contact admin tip when technical detail is hidden ----- -->\n @else {\n <p class=\"text-sm text-neutral-500\">\n {{ '@auth:startup-error.contact-admin' | translate | async }}\n </p>\n }\n }\n <ax-button\n color=\"primary\"\n class=\"mx-auto\"\n [text]=\"'@auth:startup-error.retry' | translate | async\"\n (onClick)=\"handleRetry()\"\n ></ax-button>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
40
40
|
}
|
|
41
41
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPlatformSettingsUnavailableComponent, decorators: [{
|
|
42
42
|
type: Component,
|
|
@@ -44,4 +44,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
44
44
|
}], ctorParameters: () => [] });
|
|
45
45
|
|
|
46
46
|
export { AXMPlatformSettingsUnavailableComponent };
|
|
47
|
-
//# sourceMappingURL=acorex-platform-module-auth-client-platform-settings-unavailable.component-
|
|
47
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-auth-client-platform-settings-unavailable.component-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/unavailable/platform-settings-unavailable.component.ts","../../../../libs/modules/auth/client/src/lib/pages/unavailable/platform-settings-unavailable.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport {\n AXPCommonSettings,\n AXPPlatformSettingsLoadState,\n AXPSettingsService,\n} from '@acorex-platform/framework-client/common';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\n\n//#region ----- Platform settings unavailable page -----\n\n@Component({\n selector: 'axm-platform-settings-unavailable',\n templateUrl: './platform-settings-unavailable.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXButtonModule, AXTranslationModule],\n})\nexport class AXMPlatformSettingsUnavailableComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly loadState = inject(AXPPlatformSettingsLoadState);\n private readonly settingsService = inject(AXPSettingsService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly detail = this.loadState.message();\n /** `null` until cached Debug Mode is resolved. */\n protected readonly showTechnicalDetail = signal<boolean | null>(null);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n void this.resolveShowTechnicalDetail();\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected handleRetry(): void {\n window.location.assign('/');\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n private async resolveShowTechnicalDetail(): Promise<void> {\n const debugMode = await this.settingsService.peekPlatformCached(AXPCommonSettings.DebugMode);\n this.showTechnicalDetail.set(debugMode === true);\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"min-h-full w-full flex items-center justify-center p-8 lightest-surface\">\n <div class=\"max-w-lg text-center flex flex-col gap-4\">\n <h1 class=\"font-bold text-2xl\">\n {{ '@auth:startup-error.title' | translate | async }}\n </h1>\n <p class=\"text-neutral-600\">\n {{ '@auth:startup-error.description' | translate | async }}\n </p>\n @if (showTechnicalDetail() !== null) {\n <!--->\n <!-- ----- Technical detail when Debug Mode is enabled in cached settings ----- -->\n @if (showTechnicalDetail() && detail) {\n <p class=\"text-sm text-neutral-500 break-words\">{{ detail }}</p>\n }\n <!-- ----- Contact admin tip when technical detail is hidden ----- -->\n @else {\n <p class=\"text-sm text-neutral-500\">\n {{ '@auth:startup-error.contact-admin' | translate | async }}\n </p>\n }\n }\n <ax-button\n color=\"primary\"\n class=\"mx-auto\"\n [text]=\"'@auth:startup-error.retry' | translate | async\"\n (onClick)=\"handleRetry()\"\n ></ax-button>\n </div>\n</div>\n"],"names":["i2","i3"],"mappings":";;;;;;;;;;AAUA;MAQa,uCAAuC,CAAA;;;AAkBlD,IAAA,WAAA,GAAA;;AAfiB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,4BAA4B,CAAC;AAChD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;;;AAM1C,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE;;QAEjC,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAiB,IAAI;gGAAC;AAOnE,QAAA,KAAK,IAAI,CAAC,0BAA0B,EAAE;IACxC;;;IAMU,WAAW,GAAA;AACnB,QAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;IAC7B;;;AAMQ,IAAA,MAAM,0BAA0B,GAAA;AACtC,QAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC5F,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC;IAClD;8GArCW,uCAAuC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uCAAuC,6FClBpD,glCA6BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDbY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,qXAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;2FAEhD,uCAAuC,EAAA,UAAA,EAAA,CAAA;kBANnD,SAAS;+BACE,mCAAmC,EAAA,eAAA,EAE5B,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,YAAY,EAAE,cAAc,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,glCAAA,EAAA;;;"}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { AXPQueryService } from '@acorex-platform/framework-client/runtime';
|
|
2
2
|
import { runtimeQueryObjectData, AXPRegionalSetting } from '@acorex-platform/framework-shared/core';
|
|
3
|
-
import * as
|
|
3
|
+
import * as i2 from '@acorex/components/decorators';
|
|
4
4
|
import { AXDecoratorModule } from '@acorex/components/decorators';
|
|
5
5
|
import * as i4 from '@acorex/core/format';
|
|
6
6
|
import { AXFormatModule } from '@acorex/core/format';
|
|
7
7
|
import * as i5 from '@acorex/core/translation';
|
|
8
8
|
import { AXTranslationModule } from '@acorex/core/translation';
|
|
9
9
|
import { AXPPageLayoutBaseComponent, AXPPageLayoutBase } from '@acorex-platform/framework-client/layout/views';
|
|
10
|
-
import * as
|
|
10
|
+
import * as i3 from '@angular/common';
|
|
11
11
|
import { CommonModule, AsyncPipe } from '@angular/common';
|
|
12
12
|
import * as i0 from '@angular/core';
|
|
13
13
|
import { input, inject, signal, computed, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
14
14
|
import { isEmpty } from 'lodash';
|
|
15
|
-
import {
|
|
15
|
+
import { F as formatCompactActivityCount } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs';
|
|
16
16
|
|
|
17
17
|
//#endregion
|
|
18
18
|
//#region ---- Constants ----
|
|
@@ -213,7 +213,7 @@ class AXMProfileActivityChartComponent extends AXPPageLayoutBaseComponent {
|
|
|
213
213
|
provide: AXPPageLayoutBase,
|
|
214
214
|
useExisting: AXMProfileActivityChartComponent,
|
|
215
215
|
},
|
|
216
|
-
], usesInheritance: true, ngImport: i0, template: "<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n", styles: ["@layer properties;.axm-profile-activity-chart{display:block;width:100%}.axm-profile-activity-chart .__panel{width:100%;border-radius:var(--radius-2xl, 1rem);border-style:var(--tw-border-style);border-width:1px;background-color:var(--color-lightest);color:var(--color-on-lightest);border-color:var(--color-border-lightest);padding:calc(var(--spacing, .25rem) * 6);--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:rgb(var(--ax-sys-color-border-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__header{margin-bottom:calc(var(--spacing, .25rem) * 5);display:flex;align-items:flex-start;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4)}.axm-profile-activity-chart .__title-row{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__title{margin:0;font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__info-icon{opacity:50%;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__footer{margin-top:calc(var(--spacing, .25rem) * 4);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;column-gap:calc(var(--spacing, .25rem) * 6);row-gap:calc(var(--spacing, .25rem) * 3);padding-top:calc(var(--spacing, .25rem) * 3);border-top:1px solid rgb(var(--ax-sys-color-border-lightest-surface))}.axm-profile-activity-chart .__stats{margin:0;display:flex;flex-wrap:wrap;align-items:center;column-gap:calc(var(--spacing, .25rem) * 4);row-gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__stat{margin:0;display:inline-flex;align-items:baseline;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__stat dt{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__stat dd{margin:0;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);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__heatmap-wrap{--week-count: 53;width:100%;overflow-x:auto;padding-bottom:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__month-labels{margin-bottom:calc(var(--spacing, .25rem) * 2);display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-columns:1.75rem repeat(var(--week-count, 53),minmax(0,1fr))}.axm-profile-activity-chart .__month-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__heatmap{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:1.75rem 1fr;align-items:stretch}.axm-profile-activity-chart .__weekday-labels{display:grid;gap:var(--spacing, .25rem);align-self:stretch;grid-template-rows:repeat(7,1fr)}.axm-profile-activity-chart .__weekday-label{display:flex;align-items:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__grid{display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-rows:repeat(7,auto);grid-auto-flow:column;grid-auto-columns:minmax(0,1fr)}.axm-profile-activity-chart .__cell{width:100%;border-radius:var(--radius-sm, .25rem);aspect-ratio:1}.axm-profile-activity-chart .__cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}.axm-profile-activity-chart .__strip{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__strip--days{--day-count: 7;grid-template-columns:repeat(var(--day-count, 7),minmax(0,1fr))}.axm-profile-activity-chart .__strip--hours{grid-template-columns:repeat(24,minmax(0,1fr));gap:.25rem}.axm-profile-activity-chart .__strip-col{display:flex;min-width:0px;flex-direction:column;gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__strip-label{display:block;text-align:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));white-space:nowrap;min-height:1rem;overflow:visible;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__strip .__cell{width:100%;border-radius:var(--radius-md, .375rem);height:3.5rem;aspect-ratio:auto}.axm-profile-activity-chart .__strip--hours .__cell{height:2.5rem;border-radius:.25rem}.axm-profile-activity-chart .__strip--days.--dense .__cell{height:2.25rem}.axm-profile-activity-chart .__legend{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__legend-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__legend-cell{width:calc(var(--spacing, .25rem) * 3);height:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-sm, .25rem)}.axm-profile-activity-chart .__legend-cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__legend-cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__legend-cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__legend-cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__legend-cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{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-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "pipe", type: i5$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXFormatPipe, name: "format" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
216
|
+
], usesInheritance: true, ngImport: i0, template: "<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n", styles: ["@layer properties;.axm-profile-activity-chart{display:block;width:100%}.axm-profile-activity-chart .__panel{width:100%;border-radius:var(--radius-2xl, 1rem);border-style:var(--tw-border-style);border-width:1px;background-color:var(--color-lightest);color:var(--color-on-lightest);border-color:var(--color-border-lightest);padding:calc(var(--spacing, .25rem) * 6);--tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:rgb(var(--ax-sys-color-border-lightest-surface));color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__header{margin-bottom:calc(var(--spacing, .25rem) * 5);display:flex;align-items:flex-start;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 4)}.axm-profile-activity-chart .__title-row{display:inline-flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__title{margin:0;font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__info-icon{opacity:50%;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__footer{margin-top:calc(var(--spacing, .25rem) * 4);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;column-gap:calc(var(--spacing, .25rem) * 6);row-gap:calc(var(--spacing, .25rem) * 3);padding-top:calc(var(--spacing, .25rem) * 3);border-top:1px solid rgb(var(--ax-sys-color-border-lightest-surface))}.axm-profile-activity-chart .__stats{margin:0;display:flex;flex-wrap:wrap;align-items:center;column-gap:calc(var(--spacing, .25rem) * 4);row-gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__stat{margin:0;display:inline-flex;align-items:baseline;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__stat dt{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));--tw-font-weight: var(--font-weight-normal, 400);font-weight:var(--font-weight-normal, 400);color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__stat dd{margin:0;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);--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-profile-activity-chart .__heatmap-wrap{--week-count: 53;width:100%;overflow-x:auto;padding-bottom:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__month-labels{margin-bottom:calc(var(--spacing, .25rem) * 2);display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-columns:1.75rem repeat(var(--week-count, 53),minmax(0,1fr))}.axm-profile-activity-chart .__month-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__heatmap{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2);grid-template-columns:1.75rem 1fr;align-items:stretch}.axm-profile-activity-chart .__weekday-labels{display:grid;gap:var(--spacing, .25rem);align-self:stretch;grid-template-rows:repeat(7,1fr)}.axm-profile-activity-chart .__weekday-label{display:flex;align-items:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__grid{display:grid;width:100%;gap:var(--spacing, .25rem);grid-template-rows:repeat(7,auto);grid-auto-flow:column;grid-auto-columns:minmax(0,1fr)}.axm-profile-activity-chart .__cell{width:100%;border-radius:var(--radius-sm, .25rem);aspect-ratio:1}.axm-profile-activity-chart .__cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}.axm-profile-activity-chart .__strip{display:grid;width:100%;gap:calc(var(--spacing, .25rem) * 2)}.axm-profile-activity-chart .__strip--days{--day-count: 7;grid-template-columns:repeat(var(--day-count, 7),minmax(0,1fr))}.axm-profile-activity-chart .__strip--hours{grid-template-columns:repeat(24,minmax(0,1fr));gap:.25rem}.axm-profile-activity-chart .__strip-col{display:flex;min-width:0px;flex-direction:column;gap:var(--spacing, .25rem)}.axm-profile-activity-chart .__strip-label{display:block;text-align:center;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));white-space:nowrap;min-height:1rem;overflow:visible;color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__strip .__cell{width:100%;border-radius:var(--radius-md, .375rem);height:3.5rem;aspect-ratio:auto}.axm-profile-activity-chart .__strip--hours .__cell{height:2.5rem;border-radius:.25rem}.axm-profile-activity-chart .__strip--days.--dense .__cell{height:2.25rem}.axm-profile-activity-chart .__legend{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 1.5)}.axm-profile-activity-chart .__legend-label{font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgb(var(--ax-sys-color-on-light-surface))}.axm-profile-activity-chart .__legend-cell{width:calc(var(--spacing, .25rem) * 3);height:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-sm, .25rem)}.axm-profile-activity-chart .__legend-cell.--level-0{background:rgb(var(--ax-sys-color-dark-surface))}.axm-profile-activity-chart .__legend-cell.--level-1{background:rgb(var(--ax-sys-color-primary-200))}.axm-profile-activity-chart .__legend-cell.--level-2{background:rgb(var(--ax-sys-color-primary-400))}.axm-profile-activity-chart .__legend-cell.--level-3{background:rgb(var(--ax-sys-color-primary-600))}.axm-profile-activity-chart .__legend-cell.--level-4{background:rgb(var(--ax-sys-color-primary-800))}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@property --tw-ordinal{syntax: \"*\"; inherits: false;}@property --tw-slashed-zero{syntax: \"*\"; inherits: false;}@property --tw-numeric-figure{syntax: \"*\"; inherits: false;}@property --tw-numeric-spacing{syntax: \"*\"; inherits: false;}@property --tw-numeric-fraction{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-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-font-weight: initial;--tw-ordinal: initial;--tw-slashed-zero: initial;--tw-numeric-figure: initial;--tw-numeric-spacing: initial;--tw-numeric-fraction: initial}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i5.AXTranslatorDirective, selector: "[translate]" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.AXFormatPipe, name: "format" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
217
217
|
}
|
|
218
218
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMProfileActivityChartComponent, decorators: [{
|
|
219
219
|
type: Component,
|
|
@@ -226,4 +226,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
226
226
|
}], propDecorators: { rootContext: [{ type: i0.Input, args: [{ isSignal: true, alias: "rootContext", required: false }] }], pageConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageConfig", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
|
|
227
227
|
|
|
228
228
|
export { AXMProfileActivityChartComponent };
|
|
229
|
-
//# sourceMappingURL=acorex-platform-module-auth-client-profile-activity-chart.component-
|
|
229
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-profile-activity-chart.component-DTfyVXWu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.html"],"sourcesContent":["import { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { AXPRegionalSetting, runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { isEmpty } from 'lodash';\nimport {\n AXPUserActivityDataSourceItem,\n AXPUserActivityHeatmapLayout,\n AXPUserActivityHour,\n AXPUserActivityLevel,\n AXPUserActivityStats,\n AXPUserActivityWeek,\n formatCompactActivityCount,\n} from '../../../../../shared/datasources/user-activity';\n\n//#region ---- View types ----\n\ninterface ActivityDay {\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface ActivityWeek {\n days: ActivityDay[];\n}\n\ninterface ActivityHour {\n hour: number;\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface CalendarColumnLabel {\n key: string;\n date: Date;\n weekIndex: number;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst DEFAULT_USER_ACTIVITY_QUERY_KEY = 'Auth:GetUserActivity';\nconst DEFAULT_TIME_FORMAT = 'HH:mm';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction parseLocalDay(value: string): Date {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, (month ?? 1) - 1, day ?? 1);\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n/** Contribution-style activity heatmap for the profile Activity tab. */\n@Component({\n selector: 'axm-profile-activity-chart',\n imports: [CommonModule, AsyncPipe, AXDecoratorModule, AXFormatModule, AXTranslationModule],\n templateUrl: './profile-activity-chart.component.html',\n styleUrl: './profile-activity-chart.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'axm-profile-activity-chart' },\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMProfileActivityChartComponent,\n },\n ],\n})\nexport class AXMProfileActivityChartComponent extends AXPPageLayoutBaseComponent {\n //#region ---- Inputs ----\n\n rootContext = input<Record<string, unknown>>({});\n pageConfig = input<Record<string, unknown>>();\n options = input<Record<string, unknown>>({});\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly queryService = inject(AXPQueryService);\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly heatmapLayout = signal<AXPUserActivityHeatmapLayout>('calendar');\n protected readonly weeks = signal<ActivityWeek[]>([]);\n protected readonly hours = signal<ActivityHour[]>([]);\n protected readonly stats = signal<AXPUserActivityStats>({\n longestStreak: 0,\n avgPerDay: 0,\n avgPerWeek: 0,\n total: 0,\n });\n protected readonly isLoading = signal(true);\n protected readonly shortDateFormat = signal('');\n protected readonly shortTimeFormat = signal(DEFAULT_TIME_FORMAT);\n\n protected readonly weekdayLabels = ['M', 'W', 'F'];\n protected readonly intensityLevels: Array<AXPUserActivityLevel> = [0, 1, 2, 3, 4];\n\n //#endregion\n\n //#region ---- Derived state ----\n\n protected readonly queryKey = computed(\n () => (this.options()['queryKey'] as string | undefined) ?? DEFAULT_USER_ACTIVITY_QUERY_KEY,\n );\n\n protected readonly stripDays = computed(() => this.weeks().flatMap((week) => week.days));\n\n protected readonly dayCount = computed(() => Math.max(this.stripDays().length, 1));\n\n protected readonly weekCount = computed(() => Math.max(this.weeks().length, 1));\n\n\n protected readonly columnLabels = computed(() => {\n const labels: CalendarColumnLabel[] = [];\n let lastMonth = -1;\n\n this.weeks().forEach((week, weekIndex) => {\n const firstDay = week.days[0];\n const month = firstDay.date.getMonth();\n if (month !== lastMonth) {\n labels.push({\n key: `${firstDay.date.getFullYear()}-${month}`,\n date: firstDay.date,\n weekIndex,\n });\n lastMonth = month;\n }\n });\n\n return labels;\n });\n\n //#endregion\n\n //#region ---- Effects ----\n\n #loadActivityEffect = effect(() => {\n const userId = this.sessionService.user?.id;\n const queryKey = this.queryKey();\n void this.loadActivity(userId, queryKey);\n });\n\n //#endregion\n\n //#region ---- Data loading ----\n\n private async loadActivity(userId: string | undefined, queryKey: string): Promise<void> {\n this.isLoading.set(true);\n\n try {\n await this.loadRegionalFormats();\n\n if (isEmpty(userId)) {\n this.resetChart();\n return;\n }\n\n const result = await this.queryService.fetch<\n { userId: string },\n AXPUserActivityDataSourceItem | null\n >(queryKey, { userId: userId! });\n\n const item = runtimeQueryObjectData(result);\n if (!item) {\n this.resetChart();\n return;\n }\n\n const weeks = item.weeks.map((week: AXPUserActivityWeek) => ({\n days: week.days.map((day) => ({\n date: parseLocalDay(day.date),\n count: day.count,\n level: day.level,\n })),\n }));\n const activityDay = parseLocalDay(item.startDate);\n\n this.heatmapLayout.set(item.layout ?? 'calendar');\n this.weeks.set(weeks);\n this.hours.set(this.mapHours(item.hours ?? [], activityDay));\n this.stats.set(item.stats);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async loadRegionalFormats(): Promise<void> {\n const [dateFormat, timeFormat] = await Promise.all([\n this.settingsService.get<string>(AXPRegionalSetting.ShortDate),\n this.settingsService.get<string>(AXPRegionalSetting.ShortTime),\n ]);\n this.shortDateFormat.set(dateFormat ?? '');\n this.shortTimeFormat.set(timeFormat || DEFAULT_TIME_FORMAT);\n }\n\n private resetChart(): void {\n this.heatmapLayout.set('days');\n this.weeks.set([]);\n this.hours.set([]);\n this.stats.set({ longestStreak: 0, avgPerDay: 0, avgPerWeek: 0, total: 0 });\n }\n\n private mapHours(hours: AXPUserActivityHour[], activityDay: Date): ActivityHour[] {\n return hours.map((hour) => {\n const date = new Date(activityDay);\n date.setHours(hour.hour, 0, 0, 0);\n return {\n hour: hour.hour,\n date,\n count: hour.count,\n level: hour.level,\n };\n });\n }\n\n //#endregion\n\n //#region ---- UI helpers ----\n\n protected formatCount(value: number): string {\n return formatCompactActivityCount(value);\n }\n\n protected weekdayRowIndex(label: string): number {\n if (label === 'M') {\n return 1;\n }\n if (label === 'W') {\n return 3;\n }\n return 5;\n }\n\n protected showHourLabel(hour: number): boolean {\n return hour % 3 === 0;\n }\n\n protected showDayStripLabel(index: number): boolean {\n const day = this.stripDays()[index];\n if (!day) {\n return false;\n }\n if (this.dayCount() <= 7) {\n return true;\n }\n return day.date.getDate() === 1 || index % 7 === 0;\n }\n\n protected dayStripLabelFormatFor(day: ActivityDay): string {\n if (this.dayCount() <= 7) {\n return 'ddd';\n }\n return day.date.getDate() === 1 ? 'MMM D' : 'D';\n }\n\n protected cellTitle(day: ActivityDay): string {\n const dateText = String(\n this.formatService.format(day.date, 'date', {\n format: this.shortDateFormat(),\n }) ?? '',\n );\n return `${dateText} — ${day.count}`;\n }\n\n protected hourCellTitle(hour: ActivityHour): string {\n const timeText = String(\n this.formatService.format(hour.date, 'datetime', {\n format: this.shortTimeFormat(),\n }) ?? '',\n );\n return `${timeText} — ${hour.count}`;\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n"],"names":["i1","i2","i3"],"mappings":";;;;;;;;;;;;;;;;AAqDA;AAEA;AAEA,MAAM,+BAA+B,GAAG,sBAAsB;AAC9D,MAAM,mBAAmB,GAAG,OAAO;AAEnC;AAEA;AAEA,SAAS,aAAa,CAAC,KAAa,EAAA;AAClC,IAAA,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AACvD,IAAA,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;AACnD;AAEA;AAEA;AAEA;AAgBM,MAAO,gCAAiC,SAAQ,0BAA0B,CAAA;AAfhF,IAAA,WAAA,GAAA;;;QAkBE,IAAA,CAAA,WAAW,GAAG,KAAK,CAA0B,EAAE;wFAAC;AAChD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK;kGAA2B;QAC7C,IAAA,CAAA,OAAO,GAAG,KAAK,CAA0B,EAAE;oFAAC;;;AAM3B,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC;;;QAMpC,IAAA,CAAA,aAAa,GAAG,MAAM,CAA+B,UAAU;0FAAC;QAChE,IAAA,CAAA,KAAK,GAAG,MAAM,CAAiB,EAAE;kFAAC;QAClC,IAAA,CAAA,KAAK,GAAG,MAAM,CAAiB,EAAE;kFAAC;QAClC,IAAA,CAAA,KAAK,GAAG,MAAM,CAAuB;AACtD,YAAA,aAAa,EAAE,CAAC;AAChB,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,UAAU,EAAE,CAAC;AACb,YAAA,KAAK,EAAE,CAAC;AACT,SAAA;kFAAC;QACiB,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,IAAI;sFAAC;QACxB,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,EAAE;4FAAC;QAC5B,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,mBAAmB;4FAAC;QAE7C,IAAA,CAAA,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AAC/B,QAAA,IAAA,CAAA,eAAe,GAAgC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;;AAM9D,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CACpC,MAAO,IAAI,CAAC,OAAO,EAAE,CAAC,UAAU,CAAwB,IAAI,+BAA+B;qFAC5F;QAEkB,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;sFAAC;AAErE,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;qFAAC;AAE/D,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;sFAAC;AAG5D,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;YAC9C,MAAM,MAAM,GAA0B,EAAE;AACxC,YAAA,IAAI,SAAS,GAAG,CAAC,CAAC;YAElB,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,KAAI;gBACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;AACtC,gBAAA,IAAI,KAAK,KAAK,SAAS,EAAE;oBACvB,MAAM,CAAC,IAAI,CAAC;wBACV,GAAG,EAAE,CAAA,EAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;wBAC9C,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,SAAS;AACV,qBAAA,CAAC;oBACF,SAAS,GAAG,KAAK;gBACnB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAM;QACf,CAAC;yFAAC;;;AAMF,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,MAAK;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;YAChC,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC1C,CAAC;gGAAC;AAsIH,IAAA;;;AA1IC,IAAA,mBAAmB;;;AAUX,IAAA,MAAM,YAAY,CAAC,MAA0B,EAAE,QAAgB,EAAA;AACrE,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,mBAAmB,EAAE;AAEhC,YAAA,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;gBACnB,IAAI,CAAC,UAAU,EAAE;gBACjB;YACF;AAEA,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAG1C,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAO,EAAE,CAAC;AAEhC,YAAA,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,CAAC;YAC3C,IAAI,CAAC,IAAI,EAAE;gBACT,IAAI,CAAC,UAAU,EAAE;gBACjB;YACF;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAyB,MAAM;AAC3D,gBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM;AAC5B,oBAAA,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC7B,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,KAAK,EAAE,GAAG,CAAC,KAAK;AACjB,iBAAA,CAAC,CAAC;AACJ,aAAA,CAAC,CAAC;YACH,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;YAEjD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,UAAU,CAAC;AACjD,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5B;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEQ,IAAA,MAAM,mBAAmB,GAAA;QAC/B,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAS,kBAAkB,CAAC,SAAS,CAAC;YAC9D,IAAI,CAAC,eAAe,CAAC,GAAG,CAAS,kBAAkB,CAAC,SAAS,CAAC;AAC/D,SAAA,CAAC;QACF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,IAAI,mBAAmB,CAAC;IAC7D;IAEQ,UAAU,GAAA;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC7E;IAEQ,QAAQ,CAAC,KAA4B,EAAE,WAAiB,EAAA;AAC9D,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AACxB,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC;AAClC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI;gBACJ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB;AACH,QAAA,CAAC,CAAC;IACJ;;;AAMU,IAAA,WAAW,CAAC,KAAa,EAAA;AACjC,QAAA,OAAO,0BAA0B,CAAC,KAAK,CAAC;IAC1C;AAEU,IAAA,eAAe,CAAC,KAAa,EAAA;AACrC,QAAA,IAAI,KAAK,KAAK,GAAG,EAAE;AACjB,YAAA,OAAO,CAAC;QACV;AACA,QAAA,IAAI,KAAK,KAAK,GAAG,EAAE;AACjB,YAAA,OAAO,CAAC;QACV;AACA,QAAA,OAAO,CAAC;IACV;AAEU,IAAA,aAAa,CAAC,IAAY,EAAA;AAClC,QAAA,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC;IACvB;AAEU,IAAA,iBAAiB,CAAC,KAAa,EAAA;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,OAAO,KAAK;QACd;AACA,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;AACxB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,KAAK,CAAC;IACpD;AAEU,IAAA,sBAAsB,CAAC,GAAgB,EAAA;AAC/C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;AACxB,YAAA,OAAO,KAAK;QACd;AACA,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,OAAO,GAAG,GAAG;IACjD;AAEU,IAAA,SAAS,CAAC,GAAgB,EAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,MAAM,CACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE;AAC1C,YAAA,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE;SAC/B,CAAC,IAAI,EAAE,CACT;AACD,QAAA,OAAO,GAAG,QAAQ,CAAA,GAAA,EAAM,GAAG,CAAC,KAAK,EAAE;IACrC;AAEU,IAAA,aAAa,CAAC,IAAkB,EAAA;AACxC,QAAA,MAAM,QAAQ,GAAG,MAAM,CACrB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE;AAC/C,YAAA,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE;SAC/B,CAAC,IAAI,EAAE,CACT;AACD,QAAA,OAAO,GAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,CAAC,KAAK,EAAE;IACtC;8GA/MW,gCAAgC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gCAAgC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,EAAA,SAAA,EAPhC;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,gCAAgC;AAC9C,aAAA;SACF,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvFH,0zLAmJA,q6RDvEY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAa,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,8BAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAD,EAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAa9E,gCAAgC,EAAA,UAAA,EAAA,CAAA;kBAf5C,SAAS;+BACE,4BAA4B,EAAA,OAAA,EAC7B,CAAC,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,cAAc,EAAE,mBAAmB,CAAC,EAAA,eAAA,EAGzE,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B,EAAE,KAAK,EAAE,4BAA4B,EAAE,EAAA,SAAA,EAClC;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAA,gCAAkC;AAC9C,yBAAA;AACF,qBAAA,EAAA,QAAA,EAAA,0zLAAA,EAAA,MAAA,EAAA,CAAA,82RAAA,CAAA,EAAA;;;"}
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-auth-client-profile-activity-chart.component-DTfyVXWu.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.html"],"sourcesContent":["import { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { AXPRegionalSetting, runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { isEmpty } from 'lodash';\nimport {\n AXPUserActivityDataSourceItem,\n AXPUserActivityHeatmapLayout,\n AXPUserActivityHour,\n AXPUserActivityLevel,\n AXPUserActivityStats,\n AXPUserActivityWeek,\n formatCompactActivityCount,\n} from '../../../../../shared/datasources/user-activity';\n\n//#region ---- View types ----\n\ninterface ActivityDay {\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface ActivityWeek {\n days: ActivityDay[];\n}\n\ninterface ActivityHour {\n hour: number;\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface CalendarColumnLabel {\n key: string;\n date: Date;\n weekIndex: number;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst DEFAULT_USER_ACTIVITY_QUERY_KEY = 'Auth:GetUserActivity';\nconst DEFAULT_TIME_FORMAT = 'HH:mm';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction parseLocalDay(value: string): Date {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, (month ?? 1) - 1, day ?? 1);\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n/** Contribution-style activity heatmap for the profile Activity tab. */\n@Component({\n selector: 'axm-profile-activity-chart',\n imports: [CommonModule, AsyncPipe, AXDecoratorModule, AXFormatModule, AXTranslationModule],\n templateUrl: './profile-activity-chart.component.html',\n styleUrl: './profile-activity-chart.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'axm-profile-activity-chart' },\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMProfileActivityChartComponent,\n },\n ],\n})\nexport class AXMProfileActivityChartComponent extends AXPPageLayoutBaseComponent {\n //#region ---- Inputs ----\n\n rootContext = input<Record<string, unknown>>({});\n pageConfig = input<Record<string, unknown>>();\n options = input<Record<string, unknown>>({});\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly queryService = inject(AXPQueryService);\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly heatmapLayout = signal<AXPUserActivityHeatmapLayout>('calendar');\n protected readonly weeks = signal<ActivityWeek[]>([]);\n protected readonly hours = signal<ActivityHour[]>([]);\n protected readonly stats = signal<AXPUserActivityStats>({\n longestStreak: 0,\n avgPerDay: 0,\n avgPerWeek: 0,\n total: 0,\n });\n protected readonly isLoading = signal(true);\n protected readonly shortDateFormat = signal('');\n protected readonly shortTimeFormat = signal(DEFAULT_TIME_FORMAT);\n\n protected readonly weekdayLabels = ['M', 'W', 'F'];\n protected readonly intensityLevels: Array<AXPUserActivityLevel> = [0, 1, 2, 3, 4];\n\n //#endregion\n\n //#region ---- Derived state ----\n\n protected readonly queryKey = computed(\n () => (this.options()['queryKey'] as string | undefined) ?? DEFAULT_USER_ACTIVITY_QUERY_KEY,\n );\n\n protected readonly stripDays = computed(() => this.weeks().flatMap((week) => week.days));\n\n protected readonly dayCount = computed(() => Math.max(this.stripDays().length, 1));\n\n protected readonly weekCount = computed(() => Math.max(this.weeks().length, 1));\n\n\n protected readonly columnLabels = computed(() => {\n const labels: CalendarColumnLabel[] = [];\n let lastMonth = -1;\n\n this.weeks().forEach((week, weekIndex) => {\n const firstDay = week.days[0];\n const month = firstDay.date.getMonth();\n if (month !== lastMonth) {\n labels.push({\n key: `${firstDay.date.getFullYear()}-${month}`,\n date: firstDay.date,\n weekIndex,\n });\n lastMonth = month;\n }\n });\n\n return labels;\n });\n\n //#endregion\n\n //#region ---- Effects ----\n\n #loadActivityEffect = effect(() => {\n const userId = this.sessionService.user?.id;\n const queryKey = this.queryKey();\n void this.loadActivity(userId, queryKey);\n });\n\n //#endregion\n\n //#region ---- Data loading ----\n\n private async loadActivity(userId: string | undefined, queryKey: string): Promise<void> {\n this.isLoading.set(true);\n\n try {\n await this.loadRegionalFormats();\n\n if (isEmpty(userId)) {\n this.resetChart();\n return;\n }\n\n const result = await this.queryService.fetch<\n { userId: string },\n AXPUserActivityDataSourceItem | null\n >(queryKey, { userId: userId! });\n\n const item = runtimeQueryObjectData(result);\n if (!item) {\n this.resetChart();\n return;\n }\n\n const weeks = item.weeks.map((week: AXPUserActivityWeek) => ({\n days: week.days.map((day) => ({\n date: parseLocalDay(day.date),\n count: day.count,\n level: day.level,\n })),\n }));\n const activityDay = parseLocalDay(item.startDate);\n\n this.heatmapLayout.set(item.layout ?? 'calendar');\n this.weeks.set(weeks);\n this.hours.set(this.mapHours(item.hours ?? [], activityDay));\n this.stats.set(item.stats);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async loadRegionalFormats(): Promise<void> {\n const [dateFormat, timeFormat] = await Promise.all([\n this.settingsService.get<string>(AXPRegionalSetting.ShortDate),\n this.settingsService.get<string>(AXPRegionalSetting.ShortTime),\n ]);\n this.shortDateFormat.set(dateFormat ?? '');\n this.shortTimeFormat.set(timeFormat || DEFAULT_TIME_FORMAT);\n }\n\n private resetChart(): void {\n this.heatmapLayout.set('days');\n this.weeks.set([]);\n this.hours.set([]);\n this.stats.set({ longestStreak: 0, avgPerDay: 0, avgPerWeek: 0, total: 0 });\n }\n\n private mapHours(hours: AXPUserActivityHour[], activityDay: Date): ActivityHour[] {\n return hours.map((hour) => {\n const date = new Date(activityDay);\n date.setHours(hour.hour, 0, 0, 0);\n return {\n hour: hour.hour,\n date,\n count: hour.count,\n level: hour.level,\n };\n });\n }\n\n //#endregion\n\n //#region ---- UI helpers ----\n\n protected formatCount(value: number): string {\n return formatCompactActivityCount(value);\n }\n\n protected weekdayRowIndex(label: string): number {\n if (label === 'M') {\n return 1;\n }\n if (label === 'W') {\n return 3;\n }\n return 5;\n }\n\n protected showHourLabel(hour: number): boolean {\n return hour % 3 === 0;\n }\n\n protected showDayStripLabel(index: number): boolean {\n const day = this.stripDays()[index];\n if (!day) {\n return false;\n }\n if (this.dayCount() <= 7) {\n return true;\n }\n return day.date.getDate() === 1 || index % 7 === 0;\n }\n\n protected dayStripLabelFormatFor(day: ActivityDay): string {\n if (this.dayCount() <= 7) {\n return 'ddd';\n }\n return day.date.getDate() === 1 ? 'MMM D' : 'D';\n }\n\n protected cellTitle(day: ActivityDay): string {\n const dateText = String(\n this.formatService.format(day.date, 'date', {\n format: this.shortDateFormat(),\n }) ?? '',\n );\n return `${dateText} — ${day.count}`;\n }\n\n protected hourCellTitle(hour: ActivityHour): string {\n const timeText = String(\n this.formatService.format(hour.date, 'datetime', {\n format: this.shortTimeFormat(),\n }) ?? '',\n );\n return `${timeText} — ${hour.count}`;\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n"],"names":["i1","i2"],"mappings":"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"}
|