@acorex-platform/module-auth-client 0.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs +3174 -0
  2. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs.map +1 -0
  3. package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-Cm2ZagaI.mjs +67 -0
  4. package/fesm2022/acorex-platform-module-auth-client-app-chooser.component-Cm2ZagaI.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-module-auth-client-blank.layout-BRGgntib.mjs +18 -0
  6. package/fesm2022/acorex-platform-module-auth-client-blank.layout-BRGgntib.mjs.map +1 -0
  7. package/fesm2022/acorex-platform-module-auth-client-change-password.command-ZyXAjUKw.mjs +168 -0
  8. package/fesm2022/acorex-platform-module-auth-client-change-password.command-ZyXAjUKw.mjs.map +1 -0
  9. package/fesm2022/acorex-platform-module-auth-client-change-photo.command-BC8lw--F.mjs +192 -0
  10. package/fesm2022/acorex-platform-module-auth-client-change-photo.command-BC8lw--F.mjs.map +1 -0
  11. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +80 -0
  12. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs +129 -0
  14. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-B-mVlXxg.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs +32 -0
  16. package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-CcTJJwAX.mjs.map +1 -0
  17. package/fesm2022/acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs +30 -0
  18. package/fesm2022/acorex-platform-module-auth-client-lock-screen.command-41QnG1TQ.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs +57 -0
  20. package/fesm2022/acorex-platform-module-auth-client-login.module-DYtNYzF6.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs +24 -0
  22. package/fesm2022/acorex-platform-module-auth-client-master.layout-DpdD9kgk.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs +19 -0
  24. package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs +105 -0
  26. package/fesm2022/acorex-platform-module-auth-client-oauth-callback.component-BspBH4Ul.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs +196 -0
  28. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-module-auth-client-password.component-BuqUhET7.mjs +59 -0
  30. package/fesm2022/acorex-platform-module-auth-client-password.component-BuqUhET7.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-module-auth-client-password.component-Cihg82vM.mjs +529 -0
  32. package/fesm2022/acorex-platform-module-auth-client-password.component-Cihg82vM.mjs.map +1 -0
  33. package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs +7 -0
  34. package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-B8lBvZsA.mjs +158 -0
  36. package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-B8lBvZsA.mjs.map +1 -0
  37. package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-DBbFbzAx.mjs +31 -0
  38. package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-DBbFbzAx.mjs.map +1 -0
  39. package/fesm2022/acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-CtJho4ab.mjs +79 -0
  40. package/fesm2022/acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-CtJho4ab.mjs.map +1 -0
  41. package/fesm2022/acorex-platform-module-auth-client-profile-page-component.provider-B-Qtd4_j.mjs +27 -0
  42. package/fesm2022/acorex-platform-module-auth-client-profile-page-component.provider-B-Qtd4_j.mjs.map +1 -0
  43. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-tbhf7K0V.mjs +446 -0
  44. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-tbhf7K0V.mjs.map +1 -0
  45. package/fesm2022/acorex-platform-module-auth-client-register-password.component-hSJyEA6Q.mjs +145 -0
  46. package/fesm2022/acorex-platform-module-auth-client-register-password.component-hSJyEA6Q.mjs.map +1 -0
  47. package/fesm2022/acorex-platform-module-auth-client-register.module-DXm6AQpo.mjs +62 -0
  48. package/fesm2022/acorex-platform-module-auth-client-register.module-DXm6AQpo.mjs.map +1 -0
  49. package/fesm2022/acorex-platform-module-auth-client-remove-pin-code.command-zUZooOtv.mjs +91 -0
  50. package/fesm2022/acorex-platform-module-auth-client-remove-pin-code.command-zUZooOtv.mjs.map +1 -0
  51. package/fesm2022/acorex-platform-module-auth-client-result.component-DYJaB-FD.mjs +36 -0
  52. package/fesm2022/acorex-platform-module-auth-client-result.component-DYJaB-FD.mjs.map +1 -0
  53. package/fesm2022/acorex-platform-module-auth-client-routes-REjaWcqY.mjs +9 -0
  54. package/fesm2022/acorex-platform-module-auth-client-routes-REjaWcqY.mjs.map +1 -0
  55. package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-DqXGuIgN.mjs +346 -0
  56. package/fesm2022/acorex-platform-module-auth-client-session-lock-overlay.component-DqXGuIgN.mjs.map +1 -0
  57. package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-DXTVbrS0.mjs +33 -0
  58. package/fesm2022/acorex-platform-module-auth-client-set-pin-code.command-DXTVbrS0.mjs.map +1 -0
  59. package/fesm2022/acorex-platform-module-auth-client-set-pin-code.component-5TxB6aFi.mjs +188 -0
  60. package/fesm2022/acorex-platform-module-auth-client-set-pin-code.component-5TxB6aFi.mjs.map +1 -0
  61. package/fesm2022/acorex-platform-module-auth-client-settings.provider-n1qbs6e1.mjs +177 -0
  62. package/fesm2022/acorex-platform-module-auth-client-settings.provider-n1qbs6e1.mjs.map +1 -0
  63. package/fesm2022/acorex-platform-module-auth-client-show-profile-command-CxMz1yy-.mjs +70 -0
  64. package/fesm2022/acorex-platform-module-auth-client-show-profile-command-CxMz1yy-.mjs.map +1 -0
  65. package/fesm2022/acorex-platform-module-auth-client-signout-command-DqqrP5pk.mjs +24 -0
  66. package/fesm2022/acorex-platform-module-auth-client-signout-command-DqqrP5pk.mjs.map +1 -0
  67. package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-ihsqCJKN.mjs +59 -0
  68. package/fesm2022/acorex-platform-module-auth-client-tenant-chooser.component-ihsqCJKN.mjs.map +1 -0
  69. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CiENsIEh.mjs +40 -0
  70. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CiENsIEh.mjs.map +1 -0
  71. package/fesm2022/acorex-platform-module-auth-client-two-factor.module-BJqdeuAz.mjs +45 -0
  72. package/fesm2022/acorex-platform-module-auth-client-two-factor.module-BJqdeuAz.mjs.map +1 -0
  73. package/fesm2022/acorex-platform-module-auth-client-view-login-history.command-Dl0os5lD.mjs +108 -0
  74. package/fesm2022/acorex-platform-module-auth-client-view-login-history.command-Dl0os5lD.mjs.map +1 -0
  75. package/fesm2022/acorex-platform-module-auth-client.mjs +2 -0
  76. package/fesm2022/acorex-platform-module-auth-client.mjs.map +1 -0
  77. package/package.json +28 -0
  78. package/types/acorex-platform-module-auth-client-contracts.d.ts +67 -0
  79. package/types/acorex-platform-module-auth-client.d.ts +390 -0
@@ -0,0 +1,196 @@
1
+ import { AXPopupService } from '@acorex/components/popup';
2
+ import * as i2 from '@acorex/core/translation';
3
+ import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
4
+ import * as i0 from '@angular/core';
5
+ import { signal, inject, ChangeDetectorRef, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, Injectable } from '@angular/core';
6
+ import { AXButtonModule } from '@acorex/components/button';
7
+ import { AXDataSource } from '@acorex/cdk/common';
8
+ import * as i3 from '@acorex/components/decorators';
9
+ import { AXDecoratorModule } from '@acorex/components/decorators';
10
+ import { AXDropdownModule } from '@acorex/components/dropdown';
11
+ import { AXPopoverModule } from '@acorex/components/popover';
12
+ import * as i3$1 from '@acorex/components/select-box';
13
+ import { AXSelectBoxModule } from '@acorex/components/select-box';
14
+ import { AXBasePageComponent } from '@acorex/components/page';
15
+ import * as i5 from '@acorex/core/format';
16
+ import { AXFormatModule } from '@acorex/core/format';
17
+ import { AXPSettingsService } from '@acorex-platform/framework-client/common';
18
+ import * as i4 from '@angular/common';
19
+ import { CommonModule } from '@angular/common';
20
+ import * as i1 from '@angular/forms';
21
+ import { FormsModule } from '@angular/forms';
22
+ import { AXPAuthInactiveSessionTerminationOptions, AXPAuthSettings } from '@acorex-platform/module-auth-client/contracts';
23
+ import { A as AXMUserDeviceSessionsService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs';
24
+
25
+ //#endregion
26
+ class AXMUserSessionsComponent extends AXBasePageComponent {
27
+ //#endregion
28
+ //#region ---- Lifecycle ----
29
+ constructor() {
30
+ super();
31
+ //#region ---- State ----
32
+ this.items = signal([], ...(ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []));
33
+ this.activeSession = signal(undefined, ...(ngDevMode ? [{ debugName: "activeSession" }] : /* istanbul ignore next */ []));
34
+ this.expireTime = signal(null, ...(ngDevMode ? [{ debugName: "expireTime" }] : /* istanbul ignore next */ []));
35
+ //#endregion
36
+ //#region ---- Services & Dependencies ----
37
+ this.userDeviceSessionsService = inject(AXMUserDeviceSessionsService);
38
+ this.settingsService = inject(AXPSettingsService);
39
+ this.translateService = inject(AXTranslationService);
40
+ this.cdRef = inject(ChangeDetectorRef);
41
+ //#endregion
42
+ //#region ---- Data Sources ----
43
+ this.terminationOptionDefinitions = [
44
+ {
45
+ id: AXPAuthInactiveSessionTerminationOptions.OneWeek,
46
+ titleKey: '@auth:sessions.inactive-termination.options.one-week',
47
+ },
48
+ {
49
+ id: AXPAuthInactiveSessionTerminationOptions.OneMonth,
50
+ titleKey: '@auth:sessions.inactive-termination.options.one-month',
51
+ },
52
+ {
53
+ id: AXPAuthInactiveSessionTerminationOptions.ThreeMonths,
54
+ titleKey: '@auth:sessions.inactive-termination.options.three-months',
55
+ },
56
+ {
57
+ id: AXPAuthInactiveSessionTerminationOptions.SixMonths,
58
+ titleKey: '@auth:sessions.inactive-termination.options.six-months',
59
+ },
60
+ ];
61
+ this.expirationItems = [];
62
+ this.dataSource = new AXDataSource({
63
+ pageSize: 10,
64
+ key: 'id',
65
+ load: async () => ({
66
+ items: this.expirationItems,
67
+ total: this.expirationItems.length,
68
+ }),
69
+ });
70
+ //#endregion
71
+ //#region ---- Computed Properties ----
72
+ this.itemsWithIcons = computed(() => this.items().map((item) => ({
73
+ ...item,
74
+ icon: this.getDeviceIcon(item.deviceName),
75
+ })), ...(ngDevMode ? [{ debugName: "itemsWithIcons" }] : /* istanbul ignore next */ []));
76
+ void this.loadUserSessions();
77
+ }
78
+ //#endregion
79
+ //#region ---- UI Handlers ----
80
+ getDeviceIcon(deviceName) {
81
+ if (!deviceName) {
82
+ return 'fa-solid fa-question';
83
+ }
84
+ const lowerCaseName = deviceName.toLowerCase();
85
+ if (lowerCaseName.includes('windows')) {
86
+ return 'fa-brands fa-windows';
87
+ }
88
+ if (lowerCaseName.includes('macbook') || lowerCaseName.includes('mac')) {
89
+ return 'fa-brands fa-apple';
90
+ }
91
+ if (lowerCaseName.includes('linux')) {
92
+ return 'fa-brands fa-linux';
93
+ }
94
+ if (lowerCaseName.includes('android')) {
95
+ return 'fa-brands fa-android';
96
+ }
97
+ if (lowerCaseName.includes('ios') || lowerCaseName.includes('iphone') || lowerCaseName.includes('ipad')) {
98
+ return 'fa-brands fa-apple';
99
+ }
100
+ return 'fa-solid fa-desktop';
101
+ }
102
+ onChangeSessionExpireTime(e) {
103
+ const selectedId = e.component.selectedItems[0]?.id;
104
+ if (!selectedId) {
105
+ return;
106
+ }
107
+ this.expireTime.set(selectedId);
108
+ void this.userDeviceSessionsService.setInactiveSessionTermination(selectedId);
109
+ }
110
+ async onTerminate(sessionId) {
111
+ if (!sessionId) {
112
+ console.error('No item to terminate');
113
+ return;
114
+ }
115
+ await this.userDeviceSessionsService.terminateSession(sessionId);
116
+ await this.loadUserSessions();
117
+ }
118
+ async onTerminateAll() {
119
+ await this.userDeviceSessionsService.terminateAllSession();
120
+ await this.loadUserSessions();
121
+ }
122
+ //#endregion
123
+ //#region ---- Private Methods ----
124
+ async loadUserSessions() {
125
+ try {
126
+ this.expirationItems = await Promise.all(this.terminationOptionDefinitions.map(async (option) => ({
127
+ id: option.id,
128
+ name: await this.translateService.translateAsync(option.titleKey),
129
+ })));
130
+ const sessions = await this.userDeviceSessionsService.getSessions();
131
+ this.items.set(sessions);
132
+ try {
133
+ const activeSession = await this.userDeviceSessionsService.getCurrentActiveSessions();
134
+ this.activeSession.set(activeSession);
135
+ }
136
+ catch (error) {
137
+ console.warn('No active session found:', error);
138
+ this.activeSession.set(undefined);
139
+ }
140
+ const inactiveSessionTermination = await this.settingsService.get(AXPAuthSettings.InactiveSessionTermination);
141
+ if (inactiveSessionTermination &&
142
+ Object.values(AXPAuthInactiveSessionTerminationOptions).includes(inactiveSessionTermination)) {
143
+ this.expireTime.set(inactiveSessionTermination);
144
+ }
145
+ await this.dataSource.refresh();
146
+ this.cdRef.markForCheck();
147
+ }
148
+ catch (error) {
149
+ console.error('Error loading user sessions', error);
150
+ }
151
+ }
152
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMUserSessionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
153
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXMUserSessionsComponent, isStandalone: true, selector: "axm-user-sessions", usesInheritance: true, ngImport: i0, template: "<ax-content>\n <div class=\"axm-user-sessions__content flex flex-col gap-4 p-6 w-full min-w-0 box-border\">\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.this-device.title' | translate | async }}\n </p>\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--primary shrink-0 rounded-lg border border-primary-200 bg-primary-50\">\n <i class=\"{{ getDeviceIcon(activeSession()?.deviceName) }} m-3 text-primary-500\"></i>\n </div>\n @if (activeSession()) {\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ activeSession()?.deviceName }}</div>\n <div class=\"font-normal text-sm\">{{ activeSession()?.operatingSystem }}</div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">\n {{ activeSession()?.location }}\n @if (activeSession()?.lastLoginDate) {\n <span>{{ activeSession()?.lastLoginDate | format: 'datetime' : 'short' | async }}</span>\n }\n </p>\n </div>\n }\n </div>\n\n @if (itemsWithIcons().length > 0) {\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 cursor-pointer items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n (click)=\"onTerminateAll()\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--danger shrink-0 rounded-lg border border-danger-200 bg-danger-50\">\n <i class=\"icon icon-clear m-3 text-danger-500\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">\n {{ '@auth:sessions.terminate-all.title' | translate | async }}\n </div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-sm\">\n {{ '@auth:sessions.terminate-all.description' | translate | async }}\n </p>\n </div>\n </div>\n\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.active-devices.title' | translate | async }}\n </p>\n @for (item of itemsWithIcons(); track item.id) {\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n >\n <div class=\"axm-user-sessions__icon shrink-0 rounded-lg border\">\n <i class=\"{{ item.icon }} m-3\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ item.deviceName }}</div>\n <div class=\"font-normal text-sm\">{{ item.operatingSystem }}</div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">\n {{ item.location }}\n @if (item.lastLoginDate) {\n <span>{{ item.lastLoginDate | format: 'datetime' : 'short' | async }}</span>\n }\n </p>\n </div>\n <button\n type=\"button\"\n class=\"axm-user-sessions__action shrink-0 border-0 bg-transparent p-1 cursor-pointer\"\n [attr.aria-label]=\"('@general:actions.remove.title' | translate | async) ?? ''\"\n (click)=\"onTerminate(item.id); $event.stopPropagation()\"\n >\n <i class=\"ax-icon ax-icon-close\"></i>\n </button>\n </div>\n }\n }\n </div>\n</ax-content>\n<ax-footer>\n <ax-suffix>\n <div class=\"axm-user-sessions__footer flex w-full min-w-0 flex-col gap-1 px-4 py-2 box-border\">\n <p class=\"m-0 text-start font-medium text-base text-danger-500\">\n {{ '@auth:sessions.terminate-old.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__footer-setting w-full min-w-0\">\n <div class=\"axm-user-sessions__footer-label font-normal text-base text-on-lightest text-start\">\n {{ '@auth:sessions.terminate-old.inactive-for' | translate | async }}\n </div>\n <div class=\"axm-user-sessions__footer-select min-w-0\">\n <ax-select-box\n [ngModel]=\"expireTime()\"\n (onValueChanged)=\"onChangeSessionExpireTime($event)\"\n [dataSource]=\"dataSource\"\n textField=\"name\"\n valueField=\"id\"\n [placeholder]=\"('@auth:sessions.terminate-old.placeholder' | translate | async) ?? ''\"\n >\n </ax-select-box>\n </div>\n </div>\n </div>\n </ax-suffix>\n</ax-footer>\n", styles: [".axm-user-sessions__content,.axm-user-sessions__footer{box-sizing:border-box}.axm-user-sessions__meta{color:rgb(var(--ax-sys-color-on-lighter-surface))}.axm-user-sessions__action{color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-user-sessions__footer-setting{display:flex;align-items:center;gap:.75rem}.axm-user-sessions__footer-label{flex-shrink:0}.axm-user-sessions__footer-select{margin-inline-start:auto;flex:0 1 18rem;min-width:12rem}@media(max-width:640px){.axm-user-sessions__footer-setting{flex-wrap:wrap}.axm-user-sessions__footer-select{margin-inline-start:0;flex:1 1 100%;max-width:none}}\n/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i3$1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXFormatPipe, name: "format" }, { kind: "pipe", type: i2.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
154
+ }
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXMUserSessionsComponent, decorators: [{
156
+ type: Component,
157
+ args: [{ selector: 'axm-user-sessions', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [
158
+ AXButtonModule,
159
+ AXDecoratorModule,
160
+ CommonModule,
161
+ FormsModule,
162
+ AXFormatModule,
163
+ AXSelectBoxModule,
164
+ AXDropdownModule,
165
+ AXPopoverModule,
166
+ AXTranslationModule,
167
+ ], template: "<ax-content>\n <div class=\"axm-user-sessions__content flex flex-col gap-4 p-6 w-full min-w-0 box-border\">\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.this-device.title' | translate | async }}\n </p>\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--primary shrink-0 rounded-lg border border-primary-200 bg-primary-50\">\n <i class=\"{{ getDeviceIcon(activeSession()?.deviceName) }} m-3 text-primary-500\"></i>\n </div>\n @if (activeSession()) {\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ activeSession()?.deviceName }}</div>\n <div class=\"font-normal text-sm\">{{ activeSession()?.operatingSystem }}</div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">\n {{ activeSession()?.location }}\n @if (activeSession()?.lastLoginDate) {\n <span>{{ activeSession()?.lastLoginDate | format: 'datetime' : 'short' | async }}</span>\n }\n </p>\n </div>\n }\n </div>\n\n @if (itemsWithIcons().length > 0) {\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 cursor-pointer items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n (click)=\"onTerminateAll()\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--danger shrink-0 rounded-lg border border-danger-200 bg-danger-50\">\n <i class=\"icon icon-clear m-3 text-danger-500\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">\n {{ '@auth:sessions.terminate-all.title' | translate | async }}\n </div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-sm\">\n {{ '@auth:sessions.terminate-all.description' | translate | async }}\n </p>\n </div>\n </div>\n\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.active-devices.title' | translate | async }}\n </p>\n @for (item of itemsWithIcons(); track item.id) {\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n >\n <div class=\"axm-user-sessions__icon shrink-0 rounded-lg border\">\n <i class=\"{{ item.icon }} m-3\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ item.deviceName }}</div>\n <div class=\"font-normal text-sm\">{{ item.operatingSystem }}</div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">\n {{ item.location }}\n @if (item.lastLoginDate) {\n <span>{{ item.lastLoginDate | format: 'datetime' : 'short' | async }}</span>\n }\n </p>\n </div>\n <button\n type=\"button\"\n class=\"axm-user-sessions__action shrink-0 border-0 bg-transparent p-1 cursor-pointer\"\n [attr.aria-label]=\"('@general:actions.remove.title' | translate | async) ?? ''\"\n (click)=\"onTerminate(item.id); $event.stopPropagation()\"\n >\n <i class=\"ax-icon ax-icon-close\"></i>\n </button>\n </div>\n }\n }\n </div>\n</ax-content>\n<ax-footer>\n <ax-suffix>\n <div class=\"axm-user-sessions__footer flex w-full min-w-0 flex-col gap-1 px-4 py-2 box-border\">\n <p class=\"m-0 text-start font-medium text-base text-danger-500\">\n {{ '@auth:sessions.terminate-old.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__footer-setting w-full min-w-0\">\n <div class=\"axm-user-sessions__footer-label font-normal text-base text-on-lightest text-start\">\n {{ '@auth:sessions.terminate-old.inactive-for' | translate | async }}\n </div>\n <div class=\"axm-user-sessions__footer-select min-w-0\">\n <ax-select-box\n [ngModel]=\"expireTime()\"\n (onValueChanged)=\"onChangeSessionExpireTime($event)\"\n [dataSource]=\"dataSource\"\n textField=\"name\"\n valueField=\"id\"\n [placeholder]=\"('@auth:sessions.terminate-old.placeholder' | translate | async) ?? ''\"\n >\n </ax-select-box>\n </div>\n </div>\n </div>\n </ax-suffix>\n</ax-footer>\n", styles: [".axm-user-sessions__content,.axm-user-sessions__footer{box-sizing:border-box}.axm-user-sessions__meta{color:rgb(var(--ax-sys-color-on-lighter-surface))}.axm-user-sessions__action{color:rgb(var(--ax-sys-color-on-lightest-surface))}.axm-user-sessions__footer-setting{display:flex;align-items:center;gap:.75rem}.axm-user-sessions__footer-label{flex-shrink:0}.axm-user-sessions__footer-select{margin-inline-start:auto;flex:0 1 18rem;min-width:12rem}@media(max-width:640px){.axm-user-sessions__footer-setting{flex-wrap:wrap}.axm-user-sessions__footer-select{margin-inline-start:0;flex:1 1 100%;max-width:none}}\n/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */\n"] }]
168
+ }], ctorParameters: () => [] });
169
+
170
+ //#region ---- Open sessions command ----
171
+ /** Opens the active sessions popup for the current user. */
172
+ class AXPOpenSessionsCommand {
173
+ constructor() {
174
+ //#region ---- Services & Dependencies ----
175
+ this.popupService = inject(AXPopupService);
176
+ this.translateService = inject(AXTranslationService);
177
+ }
178
+ //#endregion
179
+ //#region ---- Command ----
180
+ async execute() {
181
+ await this.popupService.open(AXMUserSessionsComponent, {
182
+ title: await this.translateService.translateAsync('@auth:profile.sessions'),
183
+ size: 'md',
184
+ });
185
+ return { success: true };
186
+ }
187
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPOpenSessionsCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
188
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPOpenSessionsCommand, providedIn: 'root' }); }
189
+ }
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPOpenSessionsCommand, decorators: [{
191
+ type: Injectable,
192
+ args: [{ providedIn: 'root' }]
193
+ }] });
194
+
195
+ export { AXPOpenSessionsCommand };
196
+ //# sourceMappingURL=acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-auth-client-open-sessions.command-CXSGuqYp.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/user-sessions/user-sessions.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/user-sessions/user-sessions.component.html","../../../../libs/modules/auth/client/src/lib/commands/open-sessions.command.ts"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDataSource, AXValueChangedEvent } from '@acorex/cdk/common';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXPopoverModule } from '@acorex/components/popover';\nimport { AXSelectBoxModule } from '@acorex/components/select-box';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, inject, signal, ViewEncapsulation } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AXPAuthInactiveSessionTerminationOptions,\n AXPAuthInactiveSessionTerminationValue,\n AXPAuthSettings,\n} from '@acorex-platform/module-auth-client/contracts';\nimport { AXMSecurityManagementDeviceSessionsEntityModel } from '@acorex-platform/module-security-management-client/contracts';\nimport { AXMUserDeviceSessionsService } from './user-sessions.service';\n\n//#region ---- Types ----\n\ninterface InactiveSessionTerminationOption {\n id: AXPAuthInactiveSessionTerminationValue;\n titleKey: string;\n}\n\ninterface TranslatedInactiveSessionTerminationOption {\n id: AXPAuthInactiveSessionTerminationValue;\n name: string;\n}\n\n//#endregion\n\n@Component({\n selector: 'axm-user-sessions',\n templateUrl: './user-sessions.component.html',\n styleUrl: './user-sessions.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXButtonModule,\n AXDecoratorModule,\n CommonModule,\n FormsModule,\n AXFormatModule,\n AXSelectBoxModule,\n AXDropdownModule,\n AXPopoverModule,\n AXTranslationModule,\n ],\n})\nexport class AXMUserSessionsComponent extends AXBasePageComponent {\n //#region ---- State ----\n\n items = signal<AXMSecurityManagementDeviceSessionsEntityModel[]>([]);\n activeSession = signal<AXMSecurityManagementDeviceSessionsEntityModel | undefined>(undefined);\n expireTime = signal<AXPAuthInactiveSessionTerminationValue | null>(null);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly userDeviceSessionsService = inject(AXMUserDeviceSessionsService);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly translateService = inject(AXTranslationService);\n private readonly cdRef = inject(ChangeDetectorRef);\n\n //#endregion\n\n //#region ---- Data Sources ----\n\n private readonly terminationOptionDefinitions: InactiveSessionTerminationOption[] = [\n {\n id: AXPAuthInactiveSessionTerminationOptions.OneWeek,\n titleKey: '@auth:sessions.inactive-termination.options.one-week',\n },\n {\n id: AXPAuthInactiveSessionTerminationOptions.OneMonth,\n titleKey: '@auth:sessions.inactive-termination.options.one-month',\n },\n {\n id: AXPAuthInactiveSessionTerminationOptions.ThreeMonths,\n titleKey: '@auth:sessions.inactive-termination.options.three-months',\n },\n {\n id: AXPAuthInactiveSessionTerminationOptions.SixMonths,\n titleKey: '@auth:sessions.inactive-termination.options.six-months',\n },\n ];\n\n protected expirationItems: TranslatedInactiveSessionTerminationOption[] = [];\n\n protected dataSource = new AXDataSource<TranslatedInactiveSessionTerminationOption>({\n pageSize: 10,\n key: 'id',\n load: async () => ({\n items: this.expirationItems,\n total: this.expirationItems.length,\n }),\n });\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n itemsWithIcons = computed(() =>\n this.items().map((item) => ({\n ...item,\n icon: this.getDeviceIcon(item.deviceName),\n })),\n );\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n super();\n void this.loadUserSessions();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n getDeviceIcon(deviceName: string | undefined): string {\n if (!deviceName) {\n return 'fa-solid fa-question';\n }\n\n const lowerCaseName = deviceName.toLowerCase();\n\n if (lowerCaseName.includes('windows')) {\n return 'fa-brands fa-windows';\n }\n if (lowerCaseName.includes('macbook') || lowerCaseName.includes('mac')) {\n return 'fa-brands fa-apple';\n }\n if (lowerCaseName.includes('linux')) {\n return 'fa-brands fa-linux';\n }\n if (lowerCaseName.includes('android')) {\n return 'fa-brands fa-android';\n }\n if (lowerCaseName.includes('ios') || lowerCaseName.includes('iphone') || lowerCaseName.includes('ipad')) {\n return 'fa-brands fa-apple';\n }\n\n return 'fa-solid fa-desktop';\n }\n\n protected onChangeSessionExpireTime(e: AXValueChangedEvent): void {\n const selectedId = e.component.selectedItems[0]?.id as AXPAuthInactiveSessionTerminationValue | undefined;\n if (!selectedId) {\n return;\n }\n\n this.expireTime.set(selectedId);\n void this.userDeviceSessionsService.setInactiveSessionTermination(selectedId);\n }\n\n async onTerminate(sessionId: string | undefined): Promise<void> {\n if (!sessionId) {\n console.error('No item to terminate');\n return;\n }\n\n await this.userDeviceSessionsService.terminateSession(sessionId);\n await this.loadUserSessions();\n }\n\n async onTerminateAll(): Promise<void> {\n await this.userDeviceSessionsService.terminateAllSession();\n await this.loadUserSessions();\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async loadUserSessions(): Promise<void> {\n try {\n this.expirationItems = await Promise.all(\n this.terminationOptionDefinitions.map(async (option) => ({\n id: option.id,\n name: await this.translateService.translateAsync(option.titleKey),\n })),\n );\n\n const sessions = await this.userDeviceSessionsService.getSessions();\n this.items.set(sessions);\n\n try {\n const activeSession = await this.userDeviceSessionsService.getCurrentActiveSessions();\n this.activeSession.set(activeSession);\n } catch (error) {\n console.warn('No active session found:', error);\n this.activeSession.set(undefined);\n }\n\n const inactiveSessionTermination = await this.settingsService.get<AXPAuthInactiveSessionTerminationValue>(\n AXPAuthSettings.InactiveSessionTermination,\n );\n\n if (\n inactiveSessionTermination &&\n Object.values(AXPAuthInactiveSessionTerminationOptions).includes(inactiveSessionTermination)\n ) {\n this.expireTime.set(inactiveSessionTermination);\n }\n\n await this.dataSource.refresh();\n this.cdRef.markForCheck();\n } catch (error) {\n console.error('Error loading user sessions', error);\n }\n }\n\n //#endregion\n}\n","<ax-content>\n <div class=\"axm-user-sessions__content flex flex-col gap-4 p-6 w-full min-w-0 box-border\">\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.this-device.title' | translate | async }}\n </p>\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--primary shrink-0 rounded-lg border border-primary-200 bg-primary-50\">\n <i class=\"{{ getDeviceIcon(activeSession()?.deviceName) }} m-3 text-primary-500\"></i>\n </div>\n @if (activeSession()) {\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ activeSession()?.deviceName }}</div>\n <div class=\"font-normal text-sm\">{{ activeSession()?.operatingSystem }}</div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">\n {{ activeSession()?.location }}\n @if (activeSession()?.lastLoginDate) {\n <span>{{ activeSession()?.lastLoginDate | format: 'datetime' : 'short' | async }}</span>\n }\n </p>\n </div>\n }\n </div>\n\n @if (itemsWithIcons().length > 0) {\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 cursor-pointer items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n (click)=\"onTerminateAll()\"\n >\n <div class=\"axm-user-sessions__icon axm-user-sessions__icon--danger shrink-0 rounded-lg border border-danger-200 bg-danger-50\">\n <i class=\"icon icon-clear m-3 text-danger-500\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">\n {{ '@auth:sessions.terminate-all.title' | translate | async }}\n </div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-sm\">\n {{ '@auth:sessions.terminate-all.description' | translate | async }}\n </p>\n </div>\n </div>\n\n <p class=\"font-semibold text-base text-on-lightest text-start m-0\">\n {{ '@auth:sessions.active-devices.title' | translate | async }}\n </p>\n @for (item of itemsWithIcons(); track item.id) {\n <div\n class=\"axm-user-sessions__row flex w-full min-w-0 items-center gap-3 rounded-lg border border-lightest bg-lightest p-3 text-on-lightest\"\n >\n <div class=\"axm-user-sessions__icon shrink-0 rounded-lg border\">\n <i class=\"{{ item.icon }} m-3\"></i>\n </div>\n <div class=\"flex min-w-0 flex-1 flex-col text-start\">\n <div class=\"font-medium text-base\">{{ item.deviceName }}</div>\n <div class=\"font-normal text-sm\">{{ item.operatingSystem }}</div>\n <p class=\"axm-user-sessions__meta m-0 font-normal text-xs\">\n {{ item.location }}\n @if (item.lastLoginDate) {\n <span>{{ item.lastLoginDate | format: 'datetime' : 'short' | async }}</span>\n }\n </p>\n </div>\n <button\n type=\"button\"\n class=\"axm-user-sessions__action shrink-0 border-0 bg-transparent p-1 cursor-pointer\"\n [attr.aria-label]=\"('@general:actions.remove.title' | translate | async) ?? ''\"\n (click)=\"onTerminate(item.id); $event.stopPropagation()\"\n >\n <i class=\"ax-icon ax-icon-close\"></i>\n </button>\n </div>\n }\n }\n </div>\n</ax-content>\n<ax-footer>\n <ax-suffix>\n <div class=\"axm-user-sessions__footer flex w-full min-w-0 flex-col gap-1 px-4 py-2 box-border\">\n <p class=\"m-0 text-start font-medium text-base text-danger-500\">\n {{ '@auth:sessions.terminate-old.title' | translate | async }}\n </p>\n <div class=\"axm-user-sessions__footer-setting w-full min-w-0\">\n <div class=\"axm-user-sessions__footer-label font-normal text-base text-on-lightest text-start\">\n {{ '@auth:sessions.terminate-old.inactive-for' | translate | async }}\n </div>\n <div class=\"axm-user-sessions__footer-select min-w-0\">\n <ax-select-box\n [ngModel]=\"expireTime()\"\n (onValueChanged)=\"onChangeSessionExpireTime($event)\"\n [dataSource]=\"dataSource\"\n textField=\"name\"\n valueField=\"id\"\n [placeholder]=\"('@auth:sessions.terminate-old.placeholder' | translate | async) ?? ''\"\n >\n </ax-select-box>\n </div>\n </div>\n </div>\n </ax-suffix>\n</ax-footer>\n","import { AXPCommand } from '@acorex-platform/framework-shared/runtime';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPExecuteCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { inject, Injectable } from '@angular/core';\nimport { AXMUserSessionsComponent } from '../pages/account/user-sessions/user-sessions.component';\n\n//#region ---- Open sessions command ----\n\n/** Opens the active sessions popup for the current user. */\n@Injectable({ providedIn: 'root' })\nexport class AXPOpenSessionsCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly popupService = inject(AXPopupService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): Promise<AXPExecuteCommandResult<void>> {\n await this.popupService.open(AXMUserSessionsComponent, {\n title: await this.translateService.translateAsync('@auth:profile.sessions'),\n size: 'md',\n });\n\n return { success: true };\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":["i2","i3","i6"],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import * as i1$1 from '@acorex/components/button';
2
+ import { AXButtonModule } from '@acorex/components/button';
3
+ import { AXCheckBoxModule } from '@acorex/components/check-box';
4
+ import * as i1 from '@acorex/components/form';
5
+ import { AXFormModule } from '@acorex/components/form';
6
+ import * as i3 from '@acorex/components/label';
7
+ import { AXLabelModule } from '@acorex/components/label';
8
+ import { AXPasswordBoxModule } from '@acorex/components/password-box';
9
+ import * as i2 from '@acorex/components/text-box';
10
+ import { AXTextBoxModule } from '@acorex/components/text-box';
11
+ import * as i2$1 from '@acorex/core/translation';
12
+ import { AXTranslationModule } from '@acorex/core/translation';
13
+ import * as i4 from '@angular/common';
14
+ import { CommonModule } from '@angular/common';
15
+ import * as i0 from '@angular/core';
16
+ import { inject, Component } from '@angular/core';
17
+ import * as i1$2 from '@angular/router';
18
+ import { RouterModule } from '@angular/router';
19
+ import { n as AXM_AUTH_CONFIG_TOKEN, p as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-B7tIKOw6.mjs';
20
+
21
+ const MODULES = [
22
+ CommonModule,
23
+ AXFormModule,
24
+ AXTextBoxModule,
25
+ AXPasswordBoxModule,
26
+ AXButtonModule,
27
+ AXLabelModule,
28
+ AXCheckBoxModule,
29
+ AXTranslationModule,
30
+ RouterModule,
31
+ ];
32
+ class AXPForgetPasswordComponent {
33
+ constructor() {
34
+ this.configs = inject(AXM_AUTH_CONFIG_TOKEN);
35
+ }
36
+ ngOnInit() {
37
+ this.l2 = 'password';
38
+ switch (this.configs.type) {
39
+ case AXMAuthenticationTypes.EmailPassword:
40
+ this.l1 = 'email';
41
+ break;
42
+ case AXMAuthenticationTypes.MobilePassword:
43
+ this.l1 = 'mobile';
44
+ break;
45
+ case AXMAuthenticationTypes.UsernamePassword:
46
+ default:
47
+ this.l1 = 'username';
48
+ }
49
+ }
50
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPForgetPasswordComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
51
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: AXPForgetPasswordComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<div class=\"text-center mb-4\" *translate=\"let t\">\n <h1 class=\"font-bold text-xl mb-2\">{{ '@auth:forgot.password' | translate | async }}</h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n</div>\n<div class=\"w-80 lg:w-96\" *translate=\"let t\">\n <ax-form>\n <div class=\"flex flex-col gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button color=\"primary\" class=\"mt-6 w-full\" [text]=\"'@auth:forgot.submit' | translate | async\"></ax-button>\n <div class=\"text-center mt-6 text-sm font-normal\">\n <span> {{ '@auth:forgot.remember' | translate | async }} </span>\n <a [routerLink]=\"['/auth/login']\" class=\"links font-semibold\">{{\n '@auth:signin.title' | translate | async\n }}</a>\n </div>\n </ax-form>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i1.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i1.AXFormComponent, selector: "ax-form", inputs: ["disabled", "readonly", "labelMode", "look", "messageStyle", "updateOn", "inUserInteractionActive"], outputs: ["onValidate", "updateOnChange"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "component", type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["disabled", "tabIndex", "readonly", "value", "state", "name", "id", "placeholder", "maxLength", "allowNull", "type", "autoComplete", "look", "maskPattern", "customTokens", "class"], outputs: ["onBlur", "onFocus", "valueChange", "stateChange", "onValueChanged", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress", "onMaskChanged"] }, { kind: "ngmodule", type: AXPasswordBoxModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXLabelModule }, { kind: "component", type: i3.AXLabelComponent, selector: "ax-label", inputs: ["required", "for"], outputs: ["requiredChange"] }, { kind: "ngmodule", type: AXCheckBoxModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "directive", type: i2$1.AXTranslatorDirective, selector: "[translate]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.AXTranslatorPipe, name: "translate" }] }); }
52
+ }
53
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXPForgetPasswordComponent, decorators: [{
54
+ type: Component,
55
+ args: [{ imports: [...MODULES], template: "<div class=\"text-center mb-4\" *translate=\"let t\">\n <h1 class=\"font-bold text-xl mb-2\">{{ '@auth:forgot.password' | translate | async }}</h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n</div>\n<div class=\"w-80 lg:w-96\" *translate=\"let t\">\n <ax-form>\n <div class=\"flex flex-col gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button color=\"primary\" class=\"mt-6 w-full\" [text]=\"'@auth:forgot.submit' | translate | async\"></ax-button>\n <div class=\"text-center mt-6 text-sm font-normal\">\n <span> {{ '@auth:forgot.remember' | translate | async }} </span>\n <a [routerLink]=\"['/auth/login']\" class=\"links font-semibold\">{{\n '@auth:signin.title' | translate | async\n }}</a>\n </div>\n </ax-form>\n</div>\n" }]
56
+ }] });
57
+
58
+ export { AXPForgetPasswordComponent };
59
+ //# sourceMappingURL=acorex-platform-module-auth-client-password.component-BuqUhET7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-auth-client-password.component-BuqUhET7.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.ts","../../../../libs/modules/auth/client/src/lib/pages/forgot/password/password.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXCheckBoxModule } from '@acorex/components/check-box';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXLabelModule } from '@acorex/components/label';\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 { Component, OnInit, inject } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { AXMAuthConfigs, AXMAuthenticationTypes, AXM_AUTH_CONFIG_TOKEN } from '../../../auth.config';\n\nconst MODULES = [\n CommonModule,\n AXFormModule,\n AXTextBoxModule,\n AXPasswordBoxModule,\n AXButtonModule,\n AXLabelModule,\n AXCheckBoxModule,\n AXTranslationModule,\n RouterModule,\n];\n\n@Component({\n templateUrl: './password.component.html',\n imports: [...MODULES],\n})\nexport class AXPForgetPasswordComponent implements OnInit {\n protected l1!: string;\n protected l2!: string;\n\n protected configs: AXMAuthConfigs = inject<AXMAuthConfigs>(AXM_AUTH_CONFIG_TOKEN);\n\n ngOnInit(): void {\n this.l2 = 'password';\n switch (this.configs.type) {\n case AXMAuthenticationTypes.EmailPassword:\n this.l1 = 'email';\n break;\n case AXMAuthenticationTypes.MobilePassword:\n this.l1 = 'mobile';\n\n break;\n case AXMAuthenticationTypes.UsernamePassword:\n default:\n this.l1 = 'username';\n }\n }\n}\n","<div class=\"text-center mb-4\" *translate=\"let t\">\n <h1 class=\"font-bold text-xl mb-2\">{{ '@auth:forgot.password' | translate | async }}</h1>\n <p class=\"text-base text-neutral-600\">\n {{ '@auth:forgot.hint' | translate | async }}\n </p>\n</div>\n<div class=\"w-80 lg:w-96\" *translate=\"let t\">\n <ax-form>\n <div class=\"flex flex-col gap-6\">\n <ax-form-field>\n <ax-label>{{ '@auth:username-email' | translate | async }}</ax-label>\n <ax-text-box></ax-text-box>\n </ax-form-field>\n </div>\n <ax-button color=\"primary\" class=\"mt-6 w-full\" [text]=\"'@auth:forgot.submit' | translate | async\"></ax-button>\n <div class=\"text-center mt-6 text-sm font-normal\">\n <span> {{ '@auth:forgot.remember' | translate | async }} </span>\n <a [routerLink]=\"['/auth/login']\" class=\"links font-semibold\">{{\n '@auth:signin.title' | translate | async\n }}</a>\n </div>\n </ax-form>\n</div>\n"],"names":["i4","i6","i7","i5"],"mappings":"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"}