@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.
Files changed (107) hide show
  1. package/fesm2022/acorex-platform-module-auth-client-accept-invitation.component-Ct28GG3a.mjs +179 -0
  2. package/fesm2022/acorex-platform-module-auth-client-accept-invitation.component-Ct28GG3a.mjs.map +1 -0
  3. 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
  4. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs.map +1 -0
  5. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs → acorex-platform-module-auth-client-app-chooser.component-CxYe1hmk.mjs} +4 -4
  6. 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
  7. package/fesm2022/{acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs → acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs} +3 -3
  8. package/fesm2022/acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs.map +1 -0
  9. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs → acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs} +2 -2
  10. 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
  11. 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
  12. package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs +69 -0
  14. package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +12 -7
  16. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
  17. 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
  18. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs.map +1 -0
  19. 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
  20. 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
  21. 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
  22. 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
  23. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs → acorex-platform-module-auth-client-login.module-DasQfX02.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map → acorex-platform-module-auth-client-login.module-DasQfX02.mjs.map} +1 -1
  25. package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs +445 -0
  26. package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs → acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs} +5 -5
  28. package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map → acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs → acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs} +3 -3
  30. 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
  31. package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs → acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs} +6 -6
  32. 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
  33. package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs +28 -0
  34. package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs.map +1 -0
  35. package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs} +5 -5
  36. package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs.map} +1 -1
  37. package/fesm2022/{acorex-platform-module-auth-client-password.component-BoWDVby5.mjs → acorex-platform-module-auth-client-password.component-CkUMxpZm.mjs} +39 -9
  38. package/fesm2022/acorex-platform-module-auth-client-password.component-CkUMxpZm.mjs.map +1 -0
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs → acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs} +9 -7
  48. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs.map +1 -0
  49. package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs +84 -0
  50. package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs.map +1 -0
  51. 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
  52. 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
  53. package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs → acorex-platform-module-auth-client-register.module-KlxTQevf.mjs} +4 -4
  54. package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map → acorex-platform-module-auth-client-register.module-KlxTQevf.mjs.map} +1 -1
  55. 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
  56. 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
  57. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs → acorex-platform-module-auth-client-reset-password.component-BQfKSqpW.mjs} +6 -6
  58. 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
  59. package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs} +3 -3
  60. package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs.map} +1 -1
  61. package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs +17 -0
  62. package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs.map +1 -0
  63. 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
  64. 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
  65. 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
  66. 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
  67. 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
  68. 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
  69. 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
  70. 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
  71. package/fesm2022/{acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs → acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs} +18 -13
  72. package/fesm2022/acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs.map +1 -0
  73. package/fesm2022/{acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs → acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs} +7 -1
  74. package/fesm2022/acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs.map +1 -0
  75. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs → acorex-platform-module-auth-client-tenant-chooser.component-HqU75mfO.mjs} +5 -5
  76. 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
  77. package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs +48 -0
  78. package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs.map +1 -0
  79. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CfZo5Jl0.mjs +200 -0
  80. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CfZo5Jl0.mjs.map +1 -0
  81. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs → acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs} +10 -5
  82. package/fesm2022/acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs.map +1 -0
  83. 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
  84. 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
  85. package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs +165 -0
  86. package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs.map +1 -0
  87. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs +813 -0
  88. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs.map +1 -0
  89. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs +59 -0
  90. package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs.map +1 -0
  91. package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
  92. package/package.json +2 -2
  93. package/types/acorex-platform-module-auth-client-contracts.d.ts +13 -3
  94. package/types/acorex-platform-module-auth-client.d.ts +60 -2
  95. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +0 -1
  96. package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +0 -1
  97. package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map +0 -1
  98. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +0 -1
  99. package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +0 -1
  100. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map +0 -1
  101. package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs +0 -13
  102. package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +0 -1
  105. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs +0 -40
  106. package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs","sources":["../../../../libs/modules/auth/client/src/lib/features/session-lock/session-lock-overlay.component.ts","../../../../libs/modules/auth/client/src/lib/features/session-lock/session-lock-overlay.component.html"],"sourcesContent":["import { AXFocusTrapDirective } from '@acorex/cdk/focus-trap';\nimport { AXClickEvent, AXComponentState } from '@acorex/cdk/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXOtpCompletedEvent, AXOtpComponent, AXOtpModule } from '@acorex/components/otp';\nimport { AXPasswordBoxComponent, AXPasswordBoxModule } from '@acorex/components/password-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPUserAvatarComponent, AXPVirtualKeypadComponent } from '@acorex-platform/framework-client/layout/components';\nimport { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n Injector,\n OnInit,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { defaultTo, first, get } from 'lodash';\nimport { AXP_AUTH_PIN_CODE_LENGTH, AXP_AUTH_PIN_CODE_PATTERN } from '../../shared/constants/pin-code.constants';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXMAuthCommandKeys } from '@acorex-platform/module-auth-client/contracts';\nimport { AXPIdleLockService } from '../../shared/services/idle-lock.service';\n\n//#region ---- Session lock overlay ----\n\ntype AXMSessionLockUnlockMode = 'pin' | 'password';\n\nconst SECURITY_MANAGEMENT_MODULE = 'SecurityManagement';\nconst SECURITY_MANAGEMENT_USER_ENTITY = 'User';\n\n@Component({\n selector: 'axm-session-lock-overlay',\n templateUrl: './session-lock-overlay.component.html',\n styleUrl: './session-lock-overlay.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n FormsModule,\n AXButtonModule,\n AXDecoratorModule,\n AXOtpModule,\n AXPasswordBoxModule,\n AXTranslationModule,\n AXPUserAvatarComponent,\n AXPVirtualKeypadComponent,\n AXFocusTrapDirective,\n ],\n host: {\n class: 'axm-session-lock-overlay-host',\n },\n})\nexport class AXMSessionLockOverlayComponent implements OnInit {\n //#region ---- Constants ----\n\n protected readonly pinLength = AXP_AUTH_PIN_CODE_LENGTH;\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly pinInput = signal('');\n protected readonly passwordInput = signal('');\n protected readonly pinError = signal(false);\n protected readonly passwordError = signal(false);\n protected readonly isVerifying = signal(false);\n protected readonly unlockMode = signal<AXMSessionLockUnlockMode>('pin');\n protected readonly userRoleTitle = signal('');\n\n protected readonly hasPinCode = computed(() => this.idleLockService.hasPinCode());\n\n protected readonly useDeviceKeyboard = computed(() => !this.deviceService.isDesktopDevice());\n protected readonly displayName = computed(() => defaultTo(this.sessionService.user?.title, ''));\n protected readonly userId = computed(() => this.sessionService.user?.id ?? '');\n protected readonly applicationBadge = computed(() => {\n const application = this.sessionService.application;\n return application?.title ?? application?.name ?? '';\n });\n protected readonly otpState = computed((): AXComponentState => (this.pinError() ? 'error' : 'clear'));\n\n //#endregion\n\n //#region ---- View children ----\n\n private readonly otpInput = viewChild(AXOtpComponent);\n private readonly passwordBox = viewChild(AXPasswordBoxComponent);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n protected readonly idleLockService = inject(AXPIdleLockService);\n protected readonly sessionService = inject(AXPSessionService);\n private readonly deviceService = inject(AXPDeviceService);\n private readonly entityService = inject(AXPEntityService);\n private readonly toastService = inject(AXToastService);\n private readonly translateService = inject(AXTranslationService);\n private readonly commandService = inject(AXPCommandService);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n ngOnInit(): void {\n void this.initializeUnlockMode();\n void this.loadUserRoleTitle();\n this.bindRefocusOnInteraction();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected onOverlayClick(): void {\n if (!this.isUnlockEntryFocused()) {\n this.focusUnlockEntry();\n }\n }\n\n protected onDesktopPinChange(value: string): void {\n const normalized = defaultTo(value, '');\n\n if (this.pinError() && normalized.length > 0) {\n this.pinError.set(false);\n }\n\n this.pinInput.set(normalized);\n }\n\n protected onDesktopPinCompleted(event: AXOtpCompletedEvent): void {\n if (!event.isCompleted || this.isVerifying()) {\n return;\n }\n\n this.pinInput.set(defaultTo(event.value, ''));\n void this.submitPin();\n }\n\n protected onMobilePinDigit(digit: number): void {\n if (this.isVerifying()) {\n return;\n }\n\n const current = this.pinInput();\n if (current.length >= AXP_AUTH_PIN_CODE_LENGTH) {\n return;\n }\n\n const next = `${current}${digit}`;\n\n if (this.pinError() && next.length > 0) {\n this.pinError.set(false);\n }\n\n this.pinInput.set(next);\n\n if (next.length === AXP_AUTH_PIN_CODE_LENGTH) {\n void this.submitPin();\n }\n }\n\n protected onMobilePinBackspace(): void {\n if (this.isVerifying()) {\n return;\n }\n\n const current = this.pinInput();\n if (!current.length) {\n return;\n }\n\n const next = current.slice(0, -1);\n\n if (this.pinError() && next.length > 0) {\n this.pinError.set(false);\n }\n\n this.pinInput.set(next);\n }\n\n protected onPasswordChange(value: string): void {\n this.passwordInput.set(defaultTo(value, ''));\n this.passwordError.set(false);\n }\n\n protected showPasswordUnlock(event?: AXClickEvent): void {\n event?.nativeEvent.stopPropagation();\n this.unlockMode.set('password');\n this.resetPinInput();\n this.focusUnlockEntry();\n }\n\n protected showPinUnlock(event?: AXClickEvent): void {\n event?.nativeEvent.stopPropagation();\n\n if (!this.hasPinCode()) {\n return;\n }\n\n this.unlockMode.set('pin');\n this.passwordInput.set('');\n this.passwordError.set(false);\n this.focusUnlockEntry();\n }\n\n protected submitPassword(): void {\n void this.verifyPasswordAndUnlock();\n }\n\n protected signOut(event?: AXClickEvent): void {\n event?.nativeEvent.stopPropagation();\n void this.commandService.execute(AXMAuthCommandKeys.Session.Signout, {});\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async initializeUnlockMode(): Promise<void> {\n await this.idleLockService.refreshPinState();\n this.resetUnlockState();\n this.focusUnlockEntry();\n }\n\n private getDefaultUnlockMode(): AXMSessionLockUnlockMode {\n return this.idleLockService.hasPinCode() ? 'pin' : 'password';\n }\n\n private async loadUserRoleTitle(): Promise<void> {\n const userId = this.sessionService.user?.id;\n if (!userId || !this.sessionService.isReadyForAppScopedApi) {\n this.userRoleTitle.set('');\n return;\n }\n\n try {\n const user = await this.entityService\n .withEntity(SECURITY_MANAGEMENT_MODULE, SECURITY_MANAGEMENT_USER_ENTITY)\n .data<string>()\n .byKey(userId);\n\n const roleTitle = defaultTo(get(first(get(user, 'roles', [])), 'title'), '');\n this.userRoleTitle.set(roleTitle);\n } catch (error) {\n console.error('Failed to load user role for session lock overlay', error);\n this.userRoleTitle.set('');\n }\n }\n\n private async submitPin(): Promise<void> {\n if (this.isVerifying()) {\n return;\n }\n\n const pin = this.pinInput();\n if (!AXP_AUTH_PIN_CODE_PATTERN.test(pin)) {\n return;\n }\n\n this.isVerifying.set(true);\n try {\n if (this.idleLockService.verifyPin(pin)) {\n this.idleLockService.unlock();\n this.resetUnlockState();\n return;\n }\n\n await this.showIncorrectPinError();\n this.applyPinValidationError();\n } finally {\n this.isVerifying.set(false);\n }\n }\n\n private async verifyPasswordAndUnlock(): Promise<void> {\n if (this.isVerifying() || !this.passwordInput()) {\n return;\n }\n\n this.isVerifying.set(true);\n try {\n if (await this.idleLockService.verifyPassword(this.passwordInput())) {\n this.idleLockService.unlock();\n this.resetUnlockState();\n return;\n }\n\n await this.showIncorrectPasswordError();\n this.triggerPasswordError();\n this.passwordInput.set('');\n this.focusUnlockEntry();\n } finally {\n this.isVerifying.set(false);\n }\n }\n\n private resetUnlockState(): void {\n this.unlockMode.set(this.getDefaultUnlockMode());\n this.resetPinInput();\n this.passwordInput.set('');\n this.passwordError.set(false);\n this.pinError.set(false);\n }\n\n private resetPinInput(clearError = true): void {\n if (clearError) {\n this.pinError.set(false);\n }\n\n this.pinInput.set('');\n this.otpInput()?.reset();\n }\n\n private applyPinValidationError(): void {\n this.resetPinInput(false);\n\n afterNextRender(\n () => {\n this.pinError.set(true);\n this.syncOtpErrorState();\n\n if (!this.useDeviceKeyboard()) {\n this.otpInput()?.focus();\n }\n },\n { injector: this.injector },\n );\n }\n\n private syncOtpErrorState(): void {\n const otp = this.otpInput();\n if (otp) {\n otp.state = 'error';\n }\n }\n\n private focusUnlockEntry(): void {\n afterNextRender(\n () => {\n if (this.unlockMode() === 'password') {\n this.focusPasswordInput();\n return;\n }\n\n if (!this.useDeviceKeyboard()) {\n this.otpInput()?.focus();\n }\n },\n { injector: this.injector },\n );\n }\n\n private focusPasswordInput(): void {\n const attemptFocus = (): boolean => {\n const passwordBox = this.passwordBox();\n if (!passwordBox) {\n return false;\n }\n\n passwordBox.focus();\n\n requestAnimationFrame(() => {\n if (!this.isUnlockEntryFocused()) {\n passwordBox.focus();\n }\n });\n\n return true;\n };\n\n if (!attemptFocus()) {\n afterNextRender(() => attemptFocus(), { injector: this.injector });\n }\n }\n\n private bindRefocusOnInteraction(): void {\n const onKeydown = (event: KeyboardEvent): void => {\n if (this.isUnlockEntryFocused() || event.defaultPrevented) {\n return;\n }\n\n this.focusUnlockEntry();\n };\n\n document.addEventListener('keydown', onKeydown, true);\n this.destroyRef.onDestroy(() => {\n document.removeEventListener('keydown', onKeydown, true);\n });\n }\n\n private isUnlockEntryFocused(): boolean {\n const active = document.activeElement;\n if (!(active instanceof HTMLElement)) {\n return false;\n }\n\n if (this.unlockMode() === 'password') {\n return active.closest('ax-password-box') !== null;\n }\n\n if (this.useDeviceKeyboard()) {\n return active.closest('axp-virtual-keypad') !== null;\n }\n\n return active.closest('ax-otp') !== null;\n }\n\n private triggerPasswordError(): void {\n this.passwordError.set(true);\n setTimeout(() => this.passwordError.set(false), 450);\n }\n\n private async showIncorrectPinError(): Promise<void> {\n const content = await this.translateService.translateAsync('@auth:session-lock.messages.incorrect-pin');\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n\n private async showIncorrectPasswordError(): Promise<void> {\n const content = await this.translateService.translateAsync('@auth:session-lock.messages.incorrect-password');\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axm-session-lock-overlay\" [class.axm-session-lock-overlay--desktop]=\"!useDeviceKeyboard()\"\n [class.axm-session-lock-overlay--mobile]=\"useDeviceKeyboard()\" (click)=\"onOverlayClick()\">\n <div class=\"axm-session-lock-overlay__panel\" axFocusTrap tabindex=\"-1\" (click)=\"$event.stopPropagation()\">\n <div class=\"axm-session-lock-overlay__profile\">\n <div class=\"axm-session-lock-overlay__avatar-wrap\">\n @if (userId(); as resolvedUserId) {\n <axp-user-avatar [size]=\"useDeviceKeyboard() ? 64 : 80\" [userId]=\"resolvedUserId\"></axp-user-avatar>\n }\n </div>\n\n @if (displayName()) {\n <p class=\"axm-session-lock-overlay__name m-0\">\n {{ displayName() }}\n </p>\n }\n\n <!-- @if (userRoleTitle()) {\n <p class=\"axm-session-lock-overlay__role m-0\">\n {{ userRoleTitle() }}\n </p>\n } -->\n\n @if (applicationBadge()) {\n <div class=\"axm-session-lock-overlay__user-badge\">\n <i class=\"fa-light fa-lock\" aria-hidden=\"true\"></i>\n <span>{{ applicationBadge() | translate | async }}</span>\n </div>\n }\n </div>\n\n <div class=\"axm-session-lock-overlay__divider\" aria-hidden=\"true\"></div>\n\n <div class=\"axm-session-lock-overlay__body\">\n <div class=\"axm-session-lock-overlay__body-main\">\n <div class=\"axm-session-lock-overlay__lock-badge\" aria-hidden=\"true\">\n <i class=\"fa-light fa-lock\"></i>\n </div>\n\n <h2 class=\"axm-session-lock-overlay__title m-0\">\n {{ '@auth:session-lock.title' | translate | async }}\n </h2>\n\n @if (unlockMode() === 'pin' && hasPinCode()) {\n <p class=\"axm-session-lock-overlay__instruction m-0\">\n {{ '@auth:session-lock.pin-instruction' | translate | async }}\n </p>\n\n <div class=\"axm-session-lock-overlay__otp\" [class.axm-session-lock-overlay__otp--error]=\"pinError()\">\n <ax-otp class=\"w-full block\" [type]=\"'number'\" [mode]=\"'star'\" [length]=\"pinLength\" [state]=\"otpState()\"\n [readonly]=\"useDeviceKeyboard()\" [disabled]=\"isVerifying()\" [ngModel]=\"pinInput()\"\n (ngModelChange)=\"onDesktopPinChange($event)\" (onCompleted)=\"onDesktopPinCompleted($event)\"></ax-otp>\n </div>\n } @else {\n <p class=\"axm-session-lock-overlay__instruction m-0\">\n {{ '@auth:session-lock.password-instruction' | translate | async }}\n </p>\n\n <div class=\"axm-session-lock-overlay__password\"\n [class.axm-session-lock-overlay__password--error]=\"passwordError()\">\n <ax-password-box class=\"axm-session-lock-overlay__password-input w-full\" look=\"outline\"\n [disabled]=\"isVerifying()\" [ngModel]=\"passwordInput()\" (ngModelChange)=\"onPasswordChange($event)\"\n (keydown.enter)=\"submitPassword()\" [placeholder]=\"'@auth:password' | translate | async\"></ax-password-box>\n </div>\n\n <div class=\"axm-session-lock-overlay__actions\">\n <ax-button class=\"axm-session-lock-overlay__action w-full rounded-lg\" look=\"solid\" color=\"primary\"\n [disabled]=\"isVerifying() || !passwordInput()\" [text]=\"'@auth:session-lock.unlock' | translate | async\"\n (onClick)=\"submitPassword()\"></ax-button>\n </div>\n }\n </div>\n\n @if (useDeviceKeyboard() && unlockMode() === 'pin' && hasPinCode()) {\n <axp-virtual-keypad class=\"axm-session-lock-overlay__keypad\" look=\"solid\" [disabled]=\"isVerifying()\"\n (digitPress)=\"onMobilePinDigit($event)\" (backspace)=\"onMobilePinBackspace()\">\n </axp-virtual-keypad>\n }\n </div>\n\n <div class=\"axm-session-lock-overlay__footer\">\n <div class=\"axm-session-lock-overlay__footer-actions\">\n @if (hasPinCode()) {\n <div class=\"axm-session-lock-overlay__footer-action\">\n @if (unlockMode() === 'pin') {\n <ax-button class=\"w-full\" look=\"blank\" color=\"primary\" [disabled]=\"isVerifying()\"\n [text]=\"'@auth:session-lock.use-password-instead' | translate | async\"\n (onClick)=\"showPasswordUnlock($event)\">\n <ax-prefix>\n <i class=\"fa-light fa-lock\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n } @else {\n <ax-button class=\"w-full\" look=\"blank\" color=\"primary\" [disabled]=\"isVerifying()\"\n [text]=\"'@auth:session-lock.use-pin-instead' | translate | async\" (onClick)=\"showPinUnlock($event)\">\n <ax-prefix>\n <i class=\"fa-light fa-lock\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n }\n </div>\n\n <div class=\"axm-session-lock-overlay__footer-divider\" aria-hidden=\"true\"></div>\n }\n\n <div class=\"axm-session-lock-overlay__footer-action\">\n <ax-button class=\"w-full\" look=\"blank\" color=\"danger\" [disabled]=\"isVerifying()\"\n [text]=\"'@auth:session-lock.sign-out' | translate | async\" (onClick)=\"signOut($event)\">\n <ax-prefix>\n <i class=\"fa-light fa-arrow-right-from-bracket\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n </div>\n </div>\n</div>"],"names":["i5","i6","i7"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-session-lock-overlay.component-CJJmgXqu.mjs","sources":["../../../../libs/modules/auth/client/src/lib/features/session-lock/session-lock-overlay.component.ts","../../../../libs/modules/auth/client/src/lib/features/session-lock/session-lock-overlay.component.html"],"sourcesContent":["import { AXFocusTrapDirective } from '@acorex/cdk/focus-trap';\nimport { AXClickEvent, AXComponentState } from '@acorex/cdk/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXOtpCompletedEvent, AXOtpComponent, AXOtpModule } from '@acorex/components/otp';\nimport { AXPasswordBoxComponent, AXPasswordBoxModule } from '@acorex/components/password-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPUserAvatarComponent, AXPVirtualKeypadComponent } from '@acorex-platform/framework-client/layout/components';\nimport { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n Injector,\n OnInit,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { defaultTo, first, get } from 'lodash';\nimport { AXP_AUTH_PIN_CODE_LENGTH, AXP_AUTH_PIN_CODE_PATTERN } from '../../shared/constants/pin-code.constants';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXMAuthCommandKeys } from '@acorex-platform/module-auth-client/contracts';\nimport { AXPIdleLockService } from '../../shared/services/idle-lock.service';\n\n//#region ---- Session lock overlay ----\n\ntype AXMSessionLockUnlockMode = 'pin' | 'password';\n\nconst SECURITY_MANAGEMENT_MODULE = 'SecurityManagement';\nconst SECURITY_MANAGEMENT_USER_ENTITY = 'User';\n\n@Component({\n selector: 'axm-session-lock-overlay',\n templateUrl: './session-lock-overlay.component.html',\n styleUrl: './session-lock-overlay.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n CommonModule,\n FormsModule,\n AXButtonModule,\n AXDecoratorModule,\n AXOtpModule,\n AXPasswordBoxModule,\n AXTranslationModule,\n AXPUserAvatarComponent,\n AXPVirtualKeypadComponent,\n AXFocusTrapDirective,\n ],\n host: {\n class: 'axm-session-lock-overlay-host',\n },\n})\nexport class AXMSessionLockOverlayComponent implements OnInit {\n //#region ---- Constants ----\n\n protected readonly pinLength = AXP_AUTH_PIN_CODE_LENGTH;\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly pinInput = signal('');\n protected readonly passwordInput = signal('');\n protected readonly pinError = signal(false);\n protected readonly passwordError = signal(false);\n protected readonly isVerifying = signal(false);\n protected readonly unlockMode = signal<AXMSessionLockUnlockMode>('pin');\n protected readonly userRoleTitle = signal('');\n\n protected readonly hasPinCode = computed(() => this.idleLockService.hasPinCode());\n\n protected readonly useDeviceKeyboard = computed(() => !this.deviceService.isDesktopDevice());\n protected readonly displayName = computed(() => defaultTo(this.sessionService.user?.title, ''));\n protected readonly userId = computed(() => this.sessionService.user?.id ?? '');\n protected readonly applicationBadge = computed(() => {\n const application = this.sessionService.application;\n return application?.title ?? application?.name ?? '';\n });\n protected readonly otpState = computed((): AXComponentState => (this.pinError() ? 'error' : 'clear'));\n\n //#endregion\n\n //#region ---- View children ----\n\n private readonly otpInput = viewChild(AXOtpComponent);\n private readonly passwordBox = viewChild(AXPasswordBoxComponent);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n protected readonly idleLockService = inject(AXPIdleLockService);\n protected readonly sessionService = inject(AXPSessionService);\n private readonly deviceService = inject(AXPDeviceService);\n private readonly entityService = inject(AXPEntityService);\n private readonly toastService = inject(AXToastService);\n private readonly translateService = inject(AXTranslationService);\n private readonly commandService = inject(AXPCommandService);\n private readonly injector = inject(Injector);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n ngOnInit(): void {\n void this.initializeUnlockMode();\n void this.loadUserRoleTitle();\n this.bindRefocusOnInteraction();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected onOverlayClick(): void {\n if (!this.isUnlockEntryFocused()) {\n this.focusUnlockEntry();\n }\n }\n\n protected onDesktopPinChange(value: string): void {\n const normalized = defaultTo(value, '');\n\n if (this.pinError() && normalized.length > 0) {\n this.pinError.set(false);\n }\n\n this.pinInput.set(normalized);\n }\n\n protected onDesktopPinCompleted(event: AXOtpCompletedEvent): void {\n if (!event.isCompleted || this.isVerifying()) {\n return;\n }\n\n this.pinInput.set(defaultTo(event.value, ''));\n void this.submitPin();\n }\n\n protected onMobilePinDigit(digit: number): void {\n if (this.isVerifying()) {\n return;\n }\n\n const current = this.pinInput();\n if (current.length >= AXP_AUTH_PIN_CODE_LENGTH) {\n return;\n }\n\n const next = `${current}${digit}`;\n\n if (this.pinError() && next.length > 0) {\n this.pinError.set(false);\n }\n\n this.pinInput.set(next);\n\n if (next.length === AXP_AUTH_PIN_CODE_LENGTH) {\n void this.submitPin();\n }\n }\n\n protected onMobilePinBackspace(): void {\n if (this.isVerifying()) {\n return;\n }\n\n const current = this.pinInput();\n if (!current.length) {\n return;\n }\n\n const next = current.slice(0, -1);\n\n if (this.pinError() && next.length > 0) {\n this.pinError.set(false);\n }\n\n this.pinInput.set(next);\n }\n\n protected onPasswordChange(value: string): void {\n this.passwordInput.set(defaultTo(value, ''));\n this.passwordError.set(false);\n }\n\n protected showPasswordUnlock(event?: AXClickEvent): void {\n event?.nativeEvent.stopPropagation();\n this.unlockMode.set('password');\n this.resetPinInput();\n this.focusUnlockEntry();\n }\n\n protected showPinUnlock(event?: AXClickEvent): void {\n event?.nativeEvent.stopPropagation();\n\n if (!this.hasPinCode()) {\n return;\n }\n\n this.unlockMode.set('pin');\n this.passwordInput.set('');\n this.passwordError.set(false);\n this.focusUnlockEntry();\n }\n\n protected submitPassword(): void {\n void this.verifyPasswordAndUnlock();\n }\n\n protected signOut(event?: AXClickEvent): void {\n event?.nativeEvent.stopPropagation();\n void this.commandService.execute(AXMAuthCommandKeys.Session.Signout, {});\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async initializeUnlockMode(): Promise<void> {\n await this.idleLockService.refreshPinState();\n this.resetUnlockState();\n this.focusUnlockEntry();\n }\n\n private getDefaultUnlockMode(): AXMSessionLockUnlockMode {\n return this.idleLockService.hasPinCode() ? 'pin' : 'password';\n }\n\n private async loadUserRoleTitle(): Promise<void> {\n const userId = this.sessionService.user?.id;\n if (!userId || !this.sessionService.isReadyForAppScopedApi) {\n this.userRoleTitle.set('');\n return;\n }\n\n try {\n const user = await this.entityService\n .withEntity(SECURITY_MANAGEMENT_MODULE, SECURITY_MANAGEMENT_USER_ENTITY)\n .data<string>()\n .byKey(userId);\n\n const roleTitle = defaultTo(get(first(get(user, 'roles', [])), 'title'), '');\n this.userRoleTitle.set(roleTitle);\n } catch (error) {\n console.error('Failed to load user role for session lock overlay', error);\n this.userRoleTitle.set('');\n }\n }\n\n private async submitPin(): Promise<void> {\n if (this.isVerifying()) {\n return;\n }\n\n const pin = this.pinInput();\n if (!AXP_AUTH_PIN_CODE_PATTERN.test(pin)) {\n return;\n }\n\n this.isVerifying.set(true);\n try {\n if (this.idleLockService.verifyPin(pin)) {\n this.idleLockService.unlock();\n this.resetUnlockState();\n return;\n }\n\n await this.showIncorrectPinError();\n this.applyPinValidationError();\n } finally {\n this.isVerifying.set(false);\n }\n }\n\n private async verifyPasswordAndUnlock(): Promise<void> {\n if (this.isVerifying() || !this.passwordInput()) {\n return;\n }\n\n this.isVerifying.set(true);\n try {\n if (await this.idleLockService.verifyPassword(this.passwordInput())) {\n this.idleLockService.unlock();\n this.resetUnlockState();\n return;\n }\n\n await this.showIncorrectPasswordError();\n this.triggerPasswordError();\n this.passwordInput.set('');\n this.focusUnlockEntry();\n } finally {\n this.isVerifying.set(false);\n }\n }\n\n private resetUnlockState(): void {\n this.unlockMode.set(this.getDefaultUnlockMode());\n this.resetPinInput();\n this.passwordInput.set('');\n this.passwordError.set(false);\n this.pinError.set(false);\n }\n\n private resetPinInput(clearError = true): void {\n if (clearError) {\n this.pinError.set(false);\n }\n\n this.pinInput.set('');\n this.otpInput()?.reset();\n }\n\n private applyPinValidationError(): void {\n this.resetPinInput(false);\n\n afterNextRender(\n () => {\n this.pinError.set(true);\n this.syncOtpErrorState();\n\n if (!this.useDeviceKeyboard()) {\n this.otpInput()?.focus();\n }\n },\n { injector: this.injector },\n );\n }\n\n private syncOtpErrorState(): void {\n const otp = this.otpInput();\n if (otp) {\n otp.state = 'error';\n }\n }\n\n private focusUnlockEntry(): void {\n afterNextRender(\n () => {\n if (this.unlockMode() === 'password') {\n this.focusPasswordInput();\n return;\n }\n\n if (!this.useDeviceKeyboard()) {\n this.otpInput()?.focus();\n }\n },\n { injector: this.injector },\n );\n }\n\n private focusPasswordInput(): void {\n const attemptFocus = (): boolean => {\n const passwordBox = this.passwordBox();\n if (!passwordBox) {\n return false;\n }\n\n passwordBox.focus();\n\n requestAnimationFrame(() => {\n if (!this.isUnlockEntryFocused()) {\n passwordBox.focus();\n }\n });\n\n return true;\n };\n\n if (!attemptFocus()) {\n afterNextRender(() => attemptFocus(), { injector: this.injector });\n }\n }\n\n private bindRefocusOnInteraction(): void {\n const onKeydown = (event: KeyboardEvent): void => {\n if (this.isUnlockEntryFocused() || event.defaultPrevented) {\n return;\n }\n\n this.focusUnlockEntry();\n };\n\n document.addEventListener('keydown', onKeydown, true);\n this.destroyRef.onDestroy(() => {\n document.removeEventListener('keydown', onKeydown, true);\n });\n }\n\n private isUnlockEntryFocused(): boolean {\n const active = document.activeElement;\n if (!(active instanceof HTMLElement)) {\n return false;\n }\n\n if (this.unlockMode() === 'password') {\n return active.closest('ax-password-box') !== null;\n }\n\n if (this.useDeviceKeyboard()) {\n return active.closest('axp-virtual-keypad') !== null;\n }\n\n return active.closest('ax-otp') !== null;\n }\n\n private triggerPasswordError(): void {\n this.passwordError.set(true);\n setTimeout(() => this.passwordError.set(false), 450);\n }\n\n private async showIncorrectPinError(): Promise<void> {\n const content = await this.translateService.translateAsync('@auth:session-lock.messages.incorrect-pin');\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n\n private async showIncorrectPasswordError(): Promise<void> {\n const content = await this.translateService.translateAsync('@auth:session-lock.messages.incorrect-password');\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axm-session-lock-overlay\" [class.axm-session-lock-overlay--desktop]=\"!useDeviceKeyboard()\"\n [class.axm-session-lock-overlay--mobile]=\"useDeviceKeyboard()\" (click)=\"onOverlayClick()\">\n <div class=\"axm-session-lock-overlay__panel\" axFocusTrap tabindex=\"-1\" (click)=\"$event.stopPropagation()\">\n <div class=\"axm-session-lock-overlay__profile\">\n <div class=\"axm-session-lock-overlay__avatar-wrap\">\n @if (userId(); as resolvedUserId) {\n <axp-user-avatar [size]=\"useDeviceKeyboard() ? 64 : 80\" [userId]=\"resolvedUserId\"></axp-user-avatar>\n }\n </div>\n\n @if (displayName()) {\n <p class=\"axm-session-lock-overlay__name m-0\">\n {{ displayName() }}\n </p>\n }\n\n <!-- @if (userRoleTitle()) {\n <p class=\"axm-session-lock-overlay__role m-0\">\n {{ userRoleTitle() }}\n </p>\n } -->\n\n @if (applicationBadge()) {\n <div class=\"axm-session-lock-overlay__user-badge\">\n <i class=\"fa-light fa-lock\" aria-hidden=\"true\"></i>\n <span>{{ applicationBadge() | translate | async }}</span>\n </div>\n }\n </div>\n\n <div class=\"axm-session-lock-overlay__divider\" aria-hidden=\"true\"></div>\n\n <div class=\"axm-session-lock-overlay__body\">\n <div class=\"axm-session-lock-overlay__body-main\">\n <div class=\"axm-session-lock-overlay__lock-badge\" aria-hidden=\"true\">\n <i class=\"fa-light fa-lock\"></i>\n </div>\n\n <h2 class=\"axm-session-lock-overlay__title m-0\">\n {{ '@auth:session-lock.title' | translate | async }}\n </h2>\n\n @if (unlockMode() === 'pin' && hasPinCode()) {\n <p class=\"axm-session-lock-overlay__instruction m-0\">\n {{ '@auth:session-lock.pin-instruction' | translate | async }}\n </p>\n\n <div class=\"axm-session-lock-overlay__otp\" [class.axm-session-lock-overlay__otp--error]=\"pinError()\">\n <ax-otp class=\"w-full block\" [type]=\"'number'\" [mode]=\"'star'\" [length]=\"pinLength\" [state]=\"otpState()\"\n [readonly]=\"useDeviceKeyboard()\" [disabled]=\"isVerifying()\" [ngModel]=\"pinInput()\"\n (ngModelChange)=\"onDesktopPinChange($event)\" (onCompleted)=\"onDesktopPinCompleted($event)\"></ax-otp>\n </div>\n } @else {\n <p class=\"axm-session-lock-overlay__instruction m-0\">\n {{ '@auth:session-lock.password-instruction' | translate | async }}\n </p>\n\n <div class=\"axm-session-lock-overlay__password\"\n [class.axm-session-lock-overlay__password--error]=\"passwordError()\">\n <ax-password-box class=\"axm-session-lock-overlay__password-input w-full\" look=\"outline\"\n [disabled]=\"isVerifying()\" [ngModel]=\"passwordInput()\" (ngModelChange)=\"onPasswordChange($event)\"\n (keydown.enter)=\"submitPassword()\" [placeholder]=\"'@auth:password' | translate | async\"></ax-password-box>\n </div>\n\n <div class=\"axm-session-lock-overlay__actions\">\n <ax-button class=\"axm-session-lock-overlay__action w-full rounded-lg\" look=\"solid\" color=\"primary\"\n [disabled]=\"isVerifying() || !passwordInput()\" [text]=\"'@auth:session-lock.unlock' | translate | async\"\n (onClick)=\"submitPassword()\"></ax-button>\n </div>\n }\n </div>\n\n @if (useDeviceKeyboard() && unlockMode() === 'pin' && hasPinCode()) {\n <axp-virtual-keypad class=\"axm-session-lock-overlay__keypad\" look=\"solid\" [disabled]=\"isVerifying()\"\n (digitPress)=\"onMobilePinDigit($event)\" (backspace)=\"onMobilePinBackspace()\">\n </axp-virtual-keypad>\n }\n </div>\n\n <div class=\"axm-session-lock-overlay__footer\">\n <div class=\"axm-session-lock-overlay__footer-actions\">\n @if (hasPinCode()) {\n <div class=\"axm-session-lock-overlay__footer-action\">\n @if (unlockMode() === 'pin') {\n <ax-button class=\"w-full\" look=\"blank\" color=\"primary\" [disabled]=\"isVerifying()\"\n [text]=\"'@auth:session-lock.use-password-instead' | translate | async\"\n (onClick)=\"showPasswordUnlock($event)\">\n <ax-prefix>\n <i class=\"fa-light fa-lock\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n } @else {\n <ax-button class=\"w-full\" look=\"blank\" color=\"primary\" [disabled]=\"isVerifying()\"\n [text]=\"'@auth:session-lock.use-pin-instead' | translate | async\" (onClick)=\"showPinUnlock($event)\">\n <ax-prefix>\n <i class=\"fa-light fa-lock\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n }\n </div>\n\n <div class=\"axm-session-lock-overlay__footer-divider\" aria-hidden=\"true\"></div>\n }\n\n <div class=\"axm-session-lock-overlay__footer-action\">\n <ax-button class=\"w-full\" look=\"blank\" color=\"danger\" [disabled]=\"isVerifying()\"\n [text]=\"'@auth:session-lock.sign-out' | translate | async\" (onClick)=\"signOut($event)\">\n <ax-prefix>\n <i class=\"fa-light fa-arrow-right-from-bracket\" aria-hidden=\"true\"></i>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n </div>\n </div>\n</div>"],"names":["i3","i5","i6","i7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA,MAAM,0BAA0B,GAAG,oBAAoB;AACvD,MAAM,+BAA+B,GAAG,MAAM;MAwBjC,8BAA8B,CAAA;AAtB3C,IAAA,WAAA,GAAA;;QAyBqB,IAAA,CAAA,SAAS,GAAG,wBAAwB;;;QAMpC,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,EAAE;qFAAC;QACrB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,EAAE;0FAAC;QAC1B,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK;qFAAC;QACxB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK;0FAAC;QAC7B,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK;wFAAC;QAC3B,IAAA,CAAA,UAAU,GAAG,MAAM,CAA2B,KAAK;uFAAC;QACpD,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,EAAE;0FAAC;QAE1B,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;uFAAC;AAE9D,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE;8FAAC;AACzE,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;wFAAC;AAC5E,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;mFAAC;AAC3D,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAClD,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW;YACnD,OAAO,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,IAAI,IAAI,EAAE;QACtD,CAAC;6FAAC;AACiB,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,OAAyB,IAAI,CAAC,QAAQ,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC;qFAAC;;;QAMpF,IAAA,CAAA,QAAQ,GAAG,SAAS,CAAC,cAAc;qFAAC;QACpC,IAAA,CAAA,WAAW,GAAG,SAAS,CAAC,sBAAsB;wFAAC;;;AAM7C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC5C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC5C,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAC/C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAwUjD,IAAA;;;IAlUC,QAAQ,GAAA;AACN,QAAA,KAAK,IAAI,CAAC,oBAAoB,EAAE;AAChC,QAAA,KAAK,IAAI,CAAC,iBAAiB,EAAE;QAC7B,IAAI,CAAC,wBAAwB,EAAE;IACjC;;;IAMU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;YAChC,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;AAEU,IAAA,kBAAkB,CAAC,KAAa,EAAA;QACxC,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAEvC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5C,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;IAC/B;AAEU,IAAA,qBAAqB,CAAC,KAA0B,EAAA;QACxD,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YAC5C;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC7C,QAAA,KAAK,IAAI,CAAC,SAAS,EAAE;IACvB;AAEU,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACtC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC/B,QAAA,IAAI,OAAO,CAAC,MAAM,IAAI,wBAAwB,EAAE;YAC9C;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,CAAA,EAAG,OAAO,CAAA,EAAG,KAAK,EAAE;QAEjC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAEvB,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,wBAAwB,EAAE;AAC5C,YAAA,KAAK,IAAI,CAAC,SAAS,EAAE;QACvB;IACF;IAEU,oBAAoB,GAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC/B,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnB;QACF;QAEA,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEU,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACtC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC5C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B;AAEU,IAAA,kBAAkB,CAAC,KAAoB,EAAA;AAC/C,QAAA,KAAK,EAAE,WAAW,CAAC,eAAe,EAAE;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;QAC/B,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,gBAAgB,EAAE;IACzB;AAEU,IAAA,aAAa,CAAC,KAAoB,EAAA;AAC1C,QAAA,KAAK,EAAE,WAAW,CAAC,eAAe,EAAE;AAEpC,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;YACtB;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEU,cAAc,GAAA;AACtB,QAAA,KAAK,IAAI,CAAC,uBAAuB,EAAE;IACrC;AAEU,IAAA,OAAO,CAAC,KAAoB,EAAA;AACpC,QAAA,KAAK,EAAE,WAAW,CAAC,eAAe,EAAE;AACpC,QAAA,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAC1E;;;AAMQ,IAAA,MAAM,oBAAoB,GAAA;AAChC,QAAA,MAAM,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE;QAC5C,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,GAAG,KAAK,GAAG,UAAU;IAC/D;AAEQ,IAAA,MAAM,iBAAiB,GAAA;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,sBAAsB,EAAE;AAC1D,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B;QACF;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;AACrB,iBAAA,UAAU,CAAC,0BAA0B,EAAE,+BAA+B;AACtE,iBAAA,IAAI;iBACJ,KAAK,CAAC,MAAM,CAAC;YAEhB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;AAC5E,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;QACnC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC;AACzE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B;IACF;AAEQ,IAAA,MAAM,SAAS,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtB;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACxC;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI;YACF,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;AACvC,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;gBAC7B,IAAI,CAAC,gBAAgB,EAAE;gBACvB;YACF;AAEA,YAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE;YAClC,IAAI,CAAC,uBAAuB,EAAE;QAChC;gBAAU;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;IACF;AAEQ,IAAA,MAAM,uBAAuB,GAAA;QACnC,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;YAC/C;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI;AACF,YAAA,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE;AACnE,gBAAA,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;gBAC7B,IAAI,CAAC,gBAAgB,EAAE;gBACvB;YACF;AAEA,YAAA,MAAM,IAAI,CAAC,0BAA0B,EAAE;YACvC,IAAI,CAAC,oBAAoB,EAAE;AAC3B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,EAAE;QACzB;gBAAU;AACR,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7B;IACF;IAEQ,gBAAgB,GAAA;QACtB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChD,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B;IAEQ,aAAa,CAAC,UAAU,GAAG,IAAI,EAAA;QACrC,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE;IAC1B;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAEzB,eAAe,CACb,MAAK;AACH,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB,IAAI,CAAC,iBAAiB,EAAE;AAExB,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC7B,gBAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE;YAC1B;QACF,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;IACH;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI,GAAG,EAAE;AACP,YAAA,GAAG,CAAC,KAAK,GAAG,OAAO;QACrB;IACF;IAEQ,gBAAgB,GAAA;QACtB,eAAe,CACb,MAAK;AACH,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;gBACpC,IAAI,CAAC,kBAAkB,EAAE;gBACzB;YACF;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC7B,gBAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE;YAC1B;QACF,CAAC,EACD,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAC5B;IACH;IAEQ,kBAAkB,GAAA;QACxB,MAAM,YAAY,GAAG,MAAc;AACjC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;YACtC,IAAI,CAAC,WAAW,EAAE;AAChB,gBAAA,OAAO,KAAK;YACd;YAEA,WAAW,CAAC,KAAK,EAAE;YAEnB,qBAAqB,CAAC,MAAK;AACzB,gBAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;oBAChC,WAAW,CAAC,KAAK,EAAE;gBACrB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,YAAY,EAAE,EAAE;AACnB,YAAA,eAAe,CAAC,MAAM,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE;IACF;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,MAAM,SAAS,GAAG,CAAC,KAAoB,KAAU;YAC/C,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,KAAK,CAAC,gBAAgB,EAAE;gBACzD;YACF;YAEA,IAAI,CAAC,gBAAgB,EAAE;AACzB,QAAA,CAAC;QAED,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;YAC7B,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC;AAC1D,QAAA,CAAC,CAAC;IACJ;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa;AACrC,QAAA,IAAI,EAAE,MAAM,YAAY,WAAW,CAAC,EAAE;AACpC,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;YACpC,OAAO,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,IAAI;QACnD;AAEA,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC5B,OAAO,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI;QACtD;QAEA,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI;IAC1C;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;IACtD;AAEQ,IAAA,MAAM,qBAAqB,GAAA;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,2CAA2C,CAAC;QACvG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,uCAAuC,CAAC;AACjG,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAChF;AAEQ,IAAA,MAAM,0BAA0B,GAAA;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,gDAAgD,CAAC;QAC5G,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,uCAAuC,CAAC;AACjG,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAChF;8GApXW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA9B,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,+BAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAgCH,cAAc,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACX,sBAAsB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/FjE,2yKAmHM,EAAA,MAAA,EAAA,CAAA,oqmBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDpEF,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,cAAc,uXACd,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,yBAAyB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,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,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAMX,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAtB1C,SAAS;+BACE,0BAA0B,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,YAAY;wBACZ,WAAW;wBACX,cAAc;wBACd,iBAAiB;wBACjB,WAAW;wBACX,mBAAmB;wBACnB,mBAAmB;wBACnB,sBAAsB;wBACtB,yBAAyB;wBACzB,oBAAoB;qBACrB,EAAA,IAAA,EACK;AACJ,wBAAA,KAAK,EAAE,+BAA+B;AACvC,qBAAA,EAAA,QAAA,EAAA,2yKAAA,EAAA,MAAA,EAAA,CAAA,oqmBAAA,CAAA,EAAA;AAkCqC,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,cAAc,0FACX,sBAAsB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;"}
@@ -7,7 +7,7 @@ import { AXPPlatformScope } from '@acorex-platform/framework-shared/core';
7
7
  import { AXPAuthSettings } from '@acorex-platform/module-auth-client/contracts';
8
8
  import * as i0 from '@angular/core';
9
9
  import { inject, Injectable } from '@angular/core';
10
- import { j as AXPIdleLockService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
10
+ import { j as AXPIdleLockService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs';
11
11
 
12
12
  //#region ---- Set PIN code command ----
13
13
  /** Opens the step-by-step security PIN setup popup for the current user. */
@@ -24,7 +24,7 @@ class AXPSetPinCodeCommand {
24
24
  //#endregion
25
25
  //#region ---- Command ----
26
26
  async execute() {
27
- const { AXMSetPinCodeComponent } = await import('./acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs');
27
+ const { AXMSetPinCodeComponent } = await import('./acorex-platform-module-auth-client-set-pin-code.component-DFzKiM1U.mjs');
28
28
  const popupResult = await this.popupService.open(AXMSetPinCodeComponent, {
29
29
  title: await this.translateService.translateAsync('@auth:profile-page.commands.set-pin-code.dialog.title'),
30
30
  size: 'sm',
@@ -113,4 +113,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
113
113
  }] });
114
114
 
115
115
  export { AXPSetPinCodeCommand };
116
- //# sourceMappingURL=acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map
116
+ //# sourceMappingURL=acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/set-pin-code.command.ts"],"sourcesContent":["import { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { AXPAuthSettings } from '@acorex-platform/module-auth-client/contracts';\n\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXPIdleLockService } from '../shared/services/idle-lock.service';\n\n//#region ---- Set PIN code command ----\n\n/** Opens the step-by-step security PIN setup popup for the current user. */\n@Injectable({ providedIn: 'root' })\nexport class AXPSetPinCodeCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly popupService = inject(AXPopupService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translateService = inject(AXTranslationService);\n private readonly toastService = inject(AXToastService);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly idleLockService = inject(AXPIdleLockService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): AXPCommandExecuteResultPromise<void> {\n const { AXMSetPinCodeComponent } = await import('../pages/account/set-pin-code/set-pin-code.component');\n\n const popupResult = await this.popupService.open(AXMSetPinCodeComponent, {\n title: await this.translateService.translateAsync('@auth:profile-page.commands.set-pin-code.dialog.title'),\n size: 'sm',\n });\n\n if (this.idleLockService.consumeLockScreenOffer() || this.isSuccessfulPinSave(popupResult)) {\n await this.afterPinSaved();\n }\n\n return { success: true, kind: 'object', data: undefined };\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private isSuccessfulPinSave(popupResult: unknown): boolean {\n if (!popupResult || typeof popupResult !== 'object') {\n return false;\n }\n\n const root = popupResult as Record<string, unknown>;\n if (root['success'] === true) {\n return true;\n }\n\n const data = root['data'];\n if (!data || typeof data !== 'object') {\n return false;\n }\n\n const nested = data as Record<string, unknown>;\n if (nested['success'] === true) {\n return true;\n }\n\n const inner = nested['data'];\n return Boolean(inner && typeof inner === 'object' && (inner as Record<string, unknown>)['success'] === true);\n }\n\n private async afterPinSaved(): Promise<void> {\n await this.idleLockService.refreshLockMenuState();\n\n if (this.idleLockService.canLock()) {\n await this.idleLockService.notifyPinChanged();\n await this.showLockActiveAlert();\n return;\n }\n\n await this.offerLockScreenActivation();\n }\n\n private async offerLockScreenActivation(): Promise<void> {\n const dialogResult = await this.dialogService.show({\n title: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.dialog.title',\n content: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.dialog.description',\n type: 'primary',\n orientation: 'horizontal',\n buttons: [\n {\n name: 'confirm',\n text: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.actions.activate',\n color: 'primary',\n autofocus: true,\n },\n {\n name: 'cancel',\n text: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.actions.not-now',\n color: 'default',\n },\n ],\n });\n\n if (dialogResult?.name !== 'confirm') {\n return;\n }\n\n try {\n await this.settingsService\n .scope(AXPPlatformScope.User)\n .set(AXPAuthSettings.LockWhenIdleEnabled, true, { flush: true });\n await this.idleLockService.notifyPinChanged();\n await this.showLockActiveAlert();\n } catch (error) {\n console.error('Failed to activate lock screen after PIN setup', error);\n const content = await this.translateService.translateAsync(\n '@auth:profile-page.commands.set-pin-code.activate-lock-screen.messages.activate-failed',\n );\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n }\n\n private async showLockActiveAlert(): Promise<void> {\n await this.dialogService.alert(\n '@auth:profile-page.commands.set-pin-code.activate-lock-screen.alert.title',\n '@auth:profile-page.commands.set-pin-code.activate-lock-screen.alert.description',\n 'success',\n 'horizontal',\n );\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/set-pin-code.command.ts"],"sourcesContent":["import { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { AXPAuthSettings } from '@acorex-platform/module-auth-client/contracts';\n\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXPIdleLockService } from '../shared/services/idle-lock.service';\n\n//#region ---- Set PIN code command ----\n\n/** Opens the step-by-step security PIN setup popup for the current user. */\n@Injectable({ providedIn: 'root' })\nexport class AXPSetPinCodeCommand implements AXPCommand {\n //#region ---- Services & Dependencies ----\n\n private readonly popupService = inject(AXPopupService);\n private readonly dialogService = inject(AXDialogService);\n private readonly translateService = inject(AXTranslationService);\n private readonly toastService = inject(AXToastService);\n private readonly settingsService = inject(AXPSettingsService);\n private readonly idleLockService = inject(AXPIdleLockService);\n\n //#endregion\n\n //#region ---- Command ----\n\n async execute(): AXPCommandExecuteResultPromise<void> {\n const { AXMSetPinCodeComponent } = await import('../pages/account/set-pin-code/set-pin-code.component');\n\n const popupResult = await this.popupService.open(AXMSetPinCodeComponent, {\n title: await this.translateService.translateAsync('@auth:profile-page.commands.set-pin-code.dialog.title'),\n size: 'sm',\n });\n\n if (this.idleLockService.consumeLockScreenOffer() || this.isSuccessfulPinSave(popupResult)) {\n await this.afterPinSaved();\n }\n\n return { success: true, kind: 'object', data: undefined };\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private isSuccessfulPinSave(popupResult: unknown): boolean {\n if (!popupResult || typeof popupResult !== 'object') {\n return false;\n }\n\n const root = popupResult as Record<string, unknown>;\n if (root['success'] === true) {\n return true;\n }\n\n const data = root['data'];\n if (!data || typeof data !== 'object') {\n return false;\n }\n\n const nested = data as Record<string, unknown>;\n if (nested['success'] === true) {\n return true;\n }\n\n const inner = nested['data'];\n return Boolean(inner && typeof inner === 'object' && (inner as Record<string, unknown>)['success'] === true);\n }\n\n private async afterPinSaved(): Promise<void> {\n await this.idleLockService.refreshLockMenuState();\n\n if (this.idleLockService.canLock()) {\n await this.idleLockService.notifyPinChanged();\n await this.showLockActiveAlert();\n return;\n }\n\n await this.offerLockScreenActivation();\n }\n\n private async offerLockScreenActivation(): Promise<void> {\n const dialogResult = await this.dialogService.show({\n title: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.dialog.title',\n content: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.dialog.description',\n type: 'primary',\n orientation: 'horizontal',\n buttons: [\n {\n name: 'confirm',\n text: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.actions.activate',\n color: 'primary',\n autofocus: true,\n },\n {\n name: 'cancel',\n text: '@auth:profile-page.commands.set-pin-code.activate-lock-screen.actions.not-now',\n color: 'default',\n },\n ],\n });\n\n if (dialogResult?.name !== 'confirm') {\n return;\n }\n\n try {\n await this.settingsService\n .scope(AXPPlatformScope.User)\n .set(AXPAuthSettings.LockWhenIdleEnabled, true, { flush: true });\n await this.idleLockService.notifyPinChanged();\n await this.showLockActiveAlert();\n } catch (error) {\n console.error('Failed to activate lock screen after PIN setup', error);\n const content = await this.translateService.translateAsync(\n '@auth:profile-page.commands.set-pin-code.activate-lock-screen.messages.activate-failed',\n );\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n }\n\n private async showLockActiveAlert(): Promise<void> {\n await this.dialogService.alert(\n '@auth:profile-page.commands.set-pin-code.activate-lock-screen.alert.title',\n '@auth:profile-page.commands.set-pin-code.activate-lock-screen.alert.description',\n 'success',\n 'horizontal',\n );\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
@@ -1,18 +1,18 @@
1
1
  import * as i1$1 from '@acorex/components/button';
2
2
  import { AXButtonModule } from '@acorex/components/button';
3
- import * as i3 from '@acorex/components/decorators';
3
+ import * as i2 from '@acorex/components/decorators';
4
4
  import { AXDecoratorModule } from '@acorex/components/decorators';
5
5
  import { AXFormModule } from '@acorex/components/form';
6
6
  import * as i4 from '@acorex/components/otp';
7
7
  import { AXOtpComponent, AXOtpModule } from '@acorex/components/otp';
8
8
  import { AXBasePageComponent } from '@acorex/components/page';
9
9
  import { AXToastService } from '@acorex/components/toast';
10
- import * as i5$1 from '@acorex/core/translation';
10
+ import * as i5 from '@acorex/core/translation';
11
11
  import { AXTranslationService, AXTranslationModule } from '@acorex/core/translation';
12
12
  import { RootConfig } from '@acorex-platform/module-security-management-client/contracts';
13
13
  import { AXPSessionService } from '@acorex-platform/framework-client/auth';
14
14
  import { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';
15
- import * as i5 from '@angular/common';
15
+ import * as i3 from '@angular/common';
16
16
  import { CommonModule } from '@angular/common';
17
17
  import * as i0 from '@angular/core';
18
18
  import { signal, computed, viewChild, inject, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
@@ -20,7 +20,7 @@ import * as i1 from '@angular/forms';
20
20
  import { FormsModule } from '@angular/forms';
21
21
  import { defaultTo, isNil, get, isEmpty } from 'lodash';
22
22
  import { A as AXP_AUTH_PIN_CODE_LENGTH, a as AXP_AUTH_PIN_CODE_PATTERN } from './acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs';
23
- import { j as AXPIdleLockService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs';
23
+ import { j as AXPIdleLockService } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs';
24
24
 
25
25
  //#endregion
26
26
  class AXMSetPinCodeComponent extends AXBasePageComponent {
@@ -186,7 +186,7 @@ class AXMSetPinCodeComponent extends AXBasePageComponent {
186
186
  this.toastService.show({ color: 'danger', title, content, closeButton: true });
187
187
  }
188
188
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMSetPinCodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
189
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMSetPinCodeComponent, isStandalone: true, selector: "axm-set-pin-code", viewQueries: [{ propertyName: "otpInput", first: true, predicate: AXOtpComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ax-content>\n <div class=\"axm-set-pin-code__content flex flex-col items-center gap-4 p-6 text-center\">\n <div class=\"axm-set-pin-code__intro flex flex-col gap-2\">\n <h2 class=\"m-0 text-base font-semibold text-on-lightest\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.title' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.title' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.title' | translate | async }}\n }\n }\n </h2>\n <p class=\"m-0 text-sm text-on-lighter-surface\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.description' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.description' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.description' | translate | async }}\n }\n }\n </p>\n </div>\n\n <div class=\"axm-set-pin-code__otp w-full max-w-xs\">\n <ax-otp\n class=\"w-full block\"\n type=\"number\"\n [length]=\"pinLength\"\n [ngModel]=\"pinInput()\"\n (ngModelChange)=\"onPinInputChange($event)\"\n (onCompleted)=\"onPinCompleted($event)\"\n ></ax-otp>\n </div>\n </div>\n</ax-content>\n\n<ax-footer>\n <ax-suffix>\n @if (step() === 'confirm') {\n <ax-button\n look=\"solid\"\n color=\"default\"\n [text]=\"'@general:actions.back.title' | translate | async\"\n [disabled]=\"isSaving()\"\n (onClick)=\"onBack()\"\n ></ax-button>\n }\n\n <ax-button\n look=\"solid\"\n color=\"primary\"\n [text]=\"\n (step() === 'confirm'\n ? '@auth:profile-page.commands.set-pin-code.actions.save'\n : '@general:actions.next.title'\n )\n | translate\n | async\n \"\n [disabled]=\"!canProceed() || isSaving()\"\n (onClick)=\"onNext()\"\n ></ax-button>\n </ax-suffix>\n</ax-footer>\n", styles: [".axm-set-pin-code .axm-set-pin-code__content{box-sizing:border-box}.axm-set-pin-code .axm-set-pin-code__intro{max-width:calc(var(--spacing, .25rem) * 80)}.axm-set-pin-code .axm-set-pin-code__otp{box-sizing:border-box}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ 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: AXFormModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: 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: AXOtpModule }, { kind: "component", type: i4.AXOtpComponent, selector: "ax-otp", inputs: ["state", "disabled", "readonly", "look", "name", "type", "mode", "length"], outputs: ["stateChange", "disabledChange", "lengthChange", "onCompleted"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
189
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMSetPinCodeComponent, isStandalone: true, selector: "axm-set-pin-code", viewQueries: [{ propertyName: "otpInput", first: true, predicate: AXOtpComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ax-content>\n <div class=\"axm-set-pin-code__content flex flex-col items-center gap-4 p-6 text-center\">\n <div class=\"axm-set-pin-code__intro flex flex-col gap-2\">\n <h2 class=\"m-0 text-base font-semibold text-on-lightest\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.title' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.title' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.title' | translate | async }}\n }\n }\n </h2>\n <p class=\"m-0 text-sm text-on-lighter-surface\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.description' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.description' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.description' | translate | async }}\n }\n }\n </p>\n </div>\n\n <div class=\"axm-set-pin-code__otp w-full max-w-xs\">\n <ax-otp\n class=\"w-full block\"\n type=\"number\"\n [length]=\"pinLength\"\n [ngModel]=\"pinInput()\"\n (ngModelChange)=\"onPinInputChange($event)\"\n (onCompleted)=\"onPinCompleted($event)\"\n ></ax-otp>\n </div>\n </div>\n</ax-content>\n\n<ax-footer>\n <ax-suffix>\n @if (step() === 'confirm') {\n <ax-button\n look=\"solid\"\n color=\"default\"\n [text]=\"'@general:actions.back.title' | translate | async\"\n [disabled]=\"isSaving()\"\n (onClick)=\"onBack()\"\n ></ax-button>\n }\n\n <ax-button\n look=\"solid\"\n color=\"primary\"\n [text]=\"\n (step() === 'confirm'\n ? '@auth:profile-page.commands.set-pin-code.actions.save'\n : '@general:actions.next.title'\n )\n | translate\n | async\n \"\n [disabled]=\"!canProceed() || isSaving()\"\n (onClick)=\"onNext()\"\n ></ax-button>\n </ax-suffix>\n</ax-footer>\n", styles: [".axm-set-pin-code .axm-set-pin-code__content{box-sizing:border-box}.axm-set-pin-code .axm-set-pin-code__intro{max-width:calc(var(--spacing, .25rem) * 80)}.axm-set-pin-code .axm-set-pin-code__otp{box-sizing:border-box}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ 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: AXFormModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.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: AXDecoratorModule }, { kind: "component", type: i2.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: AXOtpModule }, { kind: "component", type: i4.AXOtpComponent, selector: "ax-otp", inputs: ["state", "disabled", "readonly", "look", "name", "type", "mode", "length"], outputs: ["stateChange", "disabledChange", "lengthChange", "onCompleted"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
190
190
  }
191
191
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMSetPinCodeComponent, decorators: [{
192
192
  type: Component,
@@ -194,4 +194,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
194
194
  }], ctorParameters: () => [], propDecorators: { otpInput: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXOtpComponent), { isSignal: true }] }] } });
195
195
 
196
196
  export { AXMSetPinCodeComponent };
197
- //# sourceMappingURL=acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map
197
+ //# sourceMappingURL=acorex-platform-module-auth-client-set-pin-code.component-DFzKiM1U.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/set-pin-code/set-pin-code.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/set-pin-code/set-pin-code.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXOtpCompletedEvent, AXOtpComponent, AXOtpModule } from '@acorex/components/otp';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport {RootConfig as SecurityManagementRootConfig} from '@acorex-platform/module-security-management-client/contracts'\nimport {AXMSecurityManagementUsersEntityModel} from '@acorex-platform/module-security-management-client/contracts';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { defaultTo, get, isEmpty, isNil } from 'lodash';\nimport { AXP_AUTH_PIN_CODE_LENGTH, AXP_AUTH_PIN_CODE_PATTERN } from '../../../shared/constants/pin-code.constants';\nimport { AXPIdleLockService } from '../../../shared/services/idle-lock.service';\n\n//#region ---- Types ----\n\ntype SetPinCodeStep = 'verify-current' | 'enter' | 'confirm';\n\n//#endregion\n\n@Component({\n selector: 'axm-set-pin-code',\n templateUrl: './set-pin-code.component.html',\n styleUrl: './set-pin-code.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, FormsModule, AXFormModule, AXButtonModule, AXDecoratorModule, AXOtpModule, AXTranslationModule],\n})\nexport class AXMSetPinCodeComponent extends AXBasePageComponent {\n //#region ---- Constants ----\n\n protected readonly pinLength = AXP_AUTH_PIN_CODE_LENGTH;\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly step = signal<SetPinCodeStep>('enter');\n protected readonly pinInput = signal('');\n protected readonly draftPin = signal('');\n protected readonly hasExistingPin = signal(false);\n protected readonly isSaving = signal(false);\n protected readonly storedPinCode = signal('');\n\n private isAdvancing = false;\n\n protected readonly canProceed = computed(() => AXP_AUTH_PIN_CODE_PATTERN.test(this.pinInput()));\n\n //#endregion\n\n //#region ---- View children ----\n\n private readonly otpInput = viewChild(AXOtpComponent);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly idleLockService = inject(AXPIdleLockService);\n private readonly toastService = inject(AXToastService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n super();\n void this.loadExistingPinState();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected onPinInputChange(value: string): void {\n this.pinInput.set(defaultTo(value, ''));\n }\n\n protected onPinCompleted(event: AXOtpCompletedEvent): void {\n if (!event.isCompleted || this.isSaving() || this.isAdvancing) {\n return;\n }\n\n this.pinInput.set(defaultTo(event.value, ''));\n void this.onNext();\n }\n\n protected onBack(): void {\n this.draftPin.set('');\n this.goToStep('enter');\n }\n\n protected async onNext(): Promise<void> {\n if (this.isAdvancing || this.isSaving()) {\n return;\n }\n\n this.isAdvancing = true;\n\n try {\n const pin = this.pinInput();\n\n if (!AXP_AUTH_PIN_CODE_PATTERN.test(pin)) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.invalid-pin');\n this.focusOtp();\n return;\n }\n\n const currentStep = this.step();\n\n if (currentStep === 'verify-current') {\n if (pin !== this.storedPinCode()) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.incorrect-current');\n this.resetPinInput();\n return;\n }\n\n this.goToStep('enter');\n return;\n }\n\n if (currentStep === 'enter') {\n this.draftPin.set(pin);\n this.goToStep('confirm');\n return;\n }\n\n if (pin !== this.draftPin()) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.mismatch');\n this.resetPinInput();\n return;\n }\n\n await this.savePin(pin);\n } finally {\n this.isAdvancing = false;\n }\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async loadExistingPinState(): Promise<void> {\n const userId = this.sessionService.user?.id;\n if (isNil(userId)) {\n return;\n }\n\n try {\n const user = await this.getUserData().byKey(userId);\n const pinCode = defaultTo(get(user, 'pinCode'), '');\n const hasPin = !isEmpty(pinCode);\n\n this.storedPinCode.set(pinCode);\n this.hasExistingPin.set(hasPin);\n this.step.set(hasPin ? 'verify-current' : 'enter');\n this.focusOtp();\n } catch (error) {\n console.error('Failed to load user PIN state', error);\n this.step.set('enter');\n this.focusOtp();\n }\n }\n\n private goToStep(step: SetPinCodeStep): void {\n this.step.set(step);\n this.resetPinInput();\n }\n\n private resetPinInput(): void {\n this.pinInput.set('');\n this.otpInput()?.reset();\n this.focusOtp();\n }\n\n private focusOtp(): void {\n queueMicrotask(() => {\n this.otpInput()?.focus();\n });\n }\n\n private async savePin(pin: string): Promise<void> {\n const userId = this.sessionService.user?.id;\n if (isNil(userId)) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.not-signed-in');\n return;\n }\n\n this.isSaving.set(true);\n try {\n await this.getUserData().update(userId, {\n pinCode: pin,\n pinChangedAt: new Date().toISOString(),\n });\n\n const successTitle = await this.translateService.translateAsync(\n '@auth:profile-page.commands.set-pin-code.messages.success',\n );\n this.toastService.show({ color: 'success', title: successTitle });\n this.idleLockService.requestLockScreenOffer();\n this.close({ success: true });\n } catch (error) {\n console.error('Failed to save PIN code', error);\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.save-failed');\n } finally {\n this.isSaving.set(false);\n }\n }\n\n private getUserData() {\n return this.entityService\n .withEntity(SecurityManagementRootConfig.module.name, SecurityManagementRootConfig.entities.users.name)\n .data<string, AXMSecurityManagementUsersEntityModel>();\n }\n\n private async showError(messageKey: string): Promise<void> {\n const content = await this.translateService.translateAsync(messageKey);\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n\n //#endregion\n}\n","<ax-content>\n <div class=\"axm-set-pin-code__content flex flex-col items-center gap-4 p-6 text-center\">\n <div class=\"axm-set-pin-code__intro flex flex-col gap-2\">\n <h2 class=\"m-0 text-base font-semibold text-on-lightest\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.title' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.title' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.title' | translate | async }}\n }\n }\n </h2>\n <p class=\"m-0 text-sm text-on-lighter-surface\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.description' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.description' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.description' | translate | async }}\n }\n }\n </p>\n </div>\n\n <div class=\"axm-set-pin-code__otp w-full max-w-xs\">\n <ax-otp\n class=\"w-full block\"\n type=\"number\"\n [length]=\"pinLength\"\n [ngModel]=\"pinInput()\"\n (ngModelChange)=\"onPinInputChange($event)\"\n (onCompleted)=\"onPinCompleted($event)\"\n ></ax-otp>\n </div>\n </div>\n</ax-content>\n\n<ax-footer>\n <ax-suffix>\n @if (step() === 'confirm') {\n <ax-button\n look=\"solid\"\n color=\"default\"\n [text]=\"'@general:actions.back.title' | translate | async\"\n [disabled]=\"isSaving()\"\n (onClick)=\"onBack()\"\n ></ax-button>\n }\n\n <ax-button\n look=\"solid\"\n color=\"primary\"\n [text]=\"\n (step() === 'confirm'\n ? '@auth:profile-page.commands.set-pin-code.actions.save'\n : '@general:actions.next.title'\n )\n | translate\n | async\n \"\n [disabled]=\"!canProceed() || isSaving()\"\n (onClick)=\"onNext()\"\n ></ax-button>\n </ax-suffix>\n</ax-footer>\n"],"names":["SecurityManagementRootConfig","i2","i6"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-set-pin-code.component-DFzKiM1U.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/set-pin-code/set-pin-code.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/set-pin-code/set-pin-code.component.html"],"sourcesContent":["import { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXOtpCompletedEvent, AXOtpComponent, AXOtpModule } from '@acorex/components/otp';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport {RootConfig as SecurityManagementRootConfig} from '@acorex-platform/module-security-management-client/contracts'\nimport {AXMSecurityManagementUsersEntityModel} from '@acorex-platform/module-security-management-client/contracts';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { defaultTo, get, isEmpty, isNil } from 'lodash';\nimport { AXP_AUTH_PIN_CODE_LENGTH, AXP_AUTH_PIN_CODE_PATTERN } from '../../../shared/constants/pin-code.constants';\nimport { AXPIdleLockService } from '../../../shared/services/idle-lock.service';\n\n//#region ---- Types ----\n\ntype SetPinCodeStep = 'verify-current' | 'enter' | 'confirm';\n\n//#endregion\n\n@Component({\n selector: 'axm-set-pin-code',\n templateUrl: './set-pin-code.component.html',\n styleUrl: './set-pin-code.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [CommonModule, FormsModule, AXFormModule, AXButtonModule, AXDecoratorModule, AXOtpModule, AXTranslationModule],\n})\nexport class AXMSetPinCodeComponent extends AXBasePageComponent {\n //#region ---- Constants ----\n\n protected readonly pinLength = AXP_AUTH_PIN_CODE_LENGTH;\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly step = signal<SetPinCodeStep>('enter');\n protected readonly pinInput = signal('');\n protected readonly draftPin = signal('');\n protected readonly hasExistingPin = signal(false);\n protected readonly isSaving = signal(false);\n protected readonly storedPinCode = signal('');\n\n private isAdvancing = false;\n\n protected readonly canProceed = computed(() => AXP_AUTH_PIN_CODE_PATTERN.test(this.pinInput()));\n\n //#endregion\n\n //#region ---- View children ----\n\n private readonly otpInput = viewChild(AXOtpComponent);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly idleLockService = inject(AXPIdleLockService);\n private readonly toastService = inject(AXToastService);\n private readonly translateService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n super();\n void this.loadExistingPinState();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected onPinInputChange(value: string): void {\n this.pinInput.set(defaultTo(value, ''));\n }\n\n protected onPinCompleted(event: AXOtpCompletedEvent): void {\n if (!event.isCompleted || this.isSaving() || this.isAdvancing) {\n return;\n }\n\n this.pinInput.set(defaultTo(event.value, ''));\n void this.onNext();\n }\n\n protected onBack(): void {\n this.draftPin.set('');\n this.goToStep('enter');\n }\n\n protected async onNext(): Promise<void> {\n if (this.isAdvancing || this.isSaving()) {\n return;\n }\n\n this.isAdvancing = true;\n\n try {\n const pin = this.pinInput();\n\n if (!AXP_AUTH_PIN_CODE_PATTERN.test(pin)) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.invalid-pin');\n this.focusOtp();\n return;\n }\n\n const currentStep = this.step();\n\n if (currentStep === 'verify-current') {\n if (pin !== this.storedPinCode()) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.incorrect-current');\n this.resetPinInput();\n return;\n }\n\n this.goToStep('enter');\n return;\n }\n\n if (currentStep === 'enter') {\n this.draftPin.set(pin);\n this.goToStep('confirm');\n return;\n }\n\n if (pin !== this.draftPin()) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.mismatch');\n this.resetPinInput();\n return;\n }\n\n await this.savePin(pin);\n } finally {\n this.isAdvancing = false;\n }\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private async loadExistingPinState(): Promise<void> {\n const userId = this.sessionService.user?.id;\n if (isNil(userId)) {\n return;\n }\n\n try {\n const user = await this.getUserData().byKey(userId);\n const pinCode = defaultTo(get(user, 'pinCode'), '');\n const hasPin = !isEmpty(pinCode);\n\n this.storedPinCode.set(pinCode);\n this.hasExistingPin.set(hasPin);\n this.step.set(hasPin ? 'verify-current' : 'enter');\n this.focusOtp();\n } catch (error) {\n console.error('Failed to load user PIN state', error);\n this.step.set('enter');\n this.focusOtp();\n }\n }\n\n private goToStep(step: SetPinCodeStep): void {\n this.step.set(step);\n this.resetPinInput();\n }\n\n private resetPinInput(): void {\n this.pinInput.set('');\n this.otpInput()?.reset();\n this.focusOtp();\n }\n\n private focusOtp(): void {\n queueMicrotask(() => {\n this.otpInput()?.focus();\n });\n }\n\n private async savePin(pin: string): Promise<void> {\n const userId = this.sessionService.user?.id;\n if (isNil(userId)) {\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.not-signed-in');\n return;\n }\n\n this.isSaving.set(true);\n try {\n await this.getUserData().update(userId, {\n pinCode: pin,\n pinChangedAt: new Date().toISOString(),\n });\n\n const successTitle = await this.translateService.translateAsync(\n '@auth:profile-page.commands.set-pin-code.messages.success',\n );\n this.toastService.show({ color: 'success', title: successTitle });\n this.idleLockService.requestLockScreenOffer();\n this.close({ success: true });\n } catch (error) {\n console.error('Failed to save PIN code', error);\n await this.showError('@auth:profile-page.commands.set-pin-code.messages.save-failed');\n } finally {\n this.isSaving.set(false);\n }\n }\n\n private getUserData() {\n return this.entityService\n .withEntity(SecurityManagementRootConfig.module.name, SecurityManagementRootConfig.entities.users.name)\n .data<string, AXMSecurityManagementUsersEntityModel>();\n }\n\n private async showError(messageKey: string): Promise<void> {\n const content = await this.translateService.translateAsync(messageKey);\n const title = await this.translateService.translateAsync('@general:messages.generic.error.title');\n this.toastService.show({ color: 'danger', title, content, closeButton: true });\n }\n\n //#endregion\n}\n","<ax-content>\n <div class=\"axm-set-pin-code__content flex flex-col items-center gap-4 p-6 text-center\">\n <div class=\"axm-set-pin-code__intro flex flex-col gap-2\">\n <h2 class=\"m-0 text-base font-semibold text-on-lightest\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.title' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.title' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.title' | translate | async }}\n }\n }\n </h2>\n <p class=\"m-0 text-sm text-on-lighter-surface\">\n @switch (step()) {\n @case ('verify-current') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.verify-current.description' | translate | async }}\n }\n @case ('enter') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.enter.description' | translate | async }}\n }\n @case ('confirm') {\n {{ '@auth:profile-page.commands.set-pin-code.steps.confirm.description' | translate | async }}\n }\n }\n </p>\n </div>\n\n <div class=\"axm-set-pin-code__otp w-full max-w-xs\">\n <ax-otp\n class=\"w-full block\"\n type=\"number\"\n [length]=\"pinLength\"\n [ngModel]=\"pinInput()\"\n (ngModelChange)=\"onPinInputChange($event)\"\n (onCompleted)=\"onPinCompleted($event)\"\n ></ax-otp>\n </div>\n </div>\n</ax-content>\n\n<ax-footer>\n <ax-suffix>\n @if (step() === 'confirm') {\n <ax-button\n look=\"solid\"\n color=\"default\"\n [text]=\"'@general:actions.back.title' | translate | async\"\n [disabled]=\"isSaving()\"\n (onClick)=\"onBack()\"\n ></ax-button>\n }\n\n <ax-button\n look=\"solid\"\n color=\"primary\"\n [text]=\"\n (step() === 'confirm'\n ? '@auth:profile-page.commands.set-pin-code.actions.save'\n : '@general:actions.next.title'\n )\n | translate\n | async\n \"\n [disabled]=\"!canProceed() || isSaving()\"\n (onClick)=\"onNext()\"\n ></ax-button>\n </ax-suffix>\n</ax-footer>\n"],"names":["SecurityManagementRootConfig","i2","i3","i5","i6"],"mappings":"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"}
@@ -119,18 +119,6 @@ class AXMSettingProvider {
119
119
  //#endregion
120
120
  // Authentication — tenant password policy; platform lockout thresholds
121
121
  .addSection('authentication', `${I18N}.authentication.title`, `${I18N}.authentication.description`)
122
- .addSetting({
123
- key: AXPAuthSettings.TwoFactorAuth,
124
- title: `${I18N}.authentication.two-factor.title`,
125
- scope: 'T',
126
- overridableAt: [],
127
- isInherited: true,
128
- defaultValue: false,
129
- widget: {
130
- type: AXPWidgetsCatalog.toggle,
131
- },
132
- description: `${I18N}.authentication.two-factor.description`,
133
- })
134
122
  .addSetting({
135
123
  key: AXPAuthSettings.PasswordComplexity,
136
124
  title: `${I18N}.authentication.password.title`,
@@ -232,6 +220,23 @@ class AXMSettingProvider {
232
220
  .endSection()
233
221
  // Session — idle lock screen + terminate old sessions
234
222
  .addSection('session-management', `${I18N}.session.title`, `${I18N}.session.description`)
223
+ .addSetting({
224
+ key: AXPAuthSettings.UserTwoFactorEnabled,
225
+ title: `${I18N}.user-two-factor.enabled.title`,
226
+ scope: 'U',
227
+ overridableAt: [],
228
+ isInherited: false,
229
+ defaultValue: false,
230
+ // Managed from Profile → Security (enroll/disable commands), not the settings form.
231
+ cacheable: false,
232
+ widget: {
233
+ type: AXPWidgetsCatalog.toggle,
234
+ options: {
235
+ visibility: 'false',
236
+ },
237
+ },
238
+ description: `${I18N}.user-two-factor.enabled.description`,
239
+ })
235
240
  .addSetting({
236
241
  key: AXPAuthSettings.LockWhenIdleEnabled,
237
242
  title: `${I18N}.session.lock-when-idle.title`,
@@ -304,4 +309,4 @@ class AXMSettingProvider {
304
309
  }
305
310
 
306
311
  export { AXMSettingProvider };
307
- //# sourceMappingURL=acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map
312
+ //# sourceMappingURL=acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs","sources":["../../../../libs/modules/auth/client/src/lib/settings.provider.ts"],"sourcesContent":["import {\n AXPSettingDefinitionProvider,\n AXPSettingDefinitionProviderContext,\n} from '@acorex-platform/framework-client/common';\nimport { AXPWidgetsCatalog } from '@acorex-platform/framework-shared/core';\nimport {\n AXPAuthCredentialTypeOptions,\n AXPAuthSettings,\n AXP_AUTH_INACTIVE_SESSION_TERMINATION_OPTION_DEFINITIONS,\n AXP_AUTH_INACTIVE_SESSION_TERMINATION_SETTING_DEFAULTS,\n AXP_AUTH_LOCKOUT_SETTING_DEFAULTS,\n AXP_AUTH_MAX_ACTIVE_DEVICE_SESSIONS_SETTING_DEFAULTS,\n AXP_AUTH_SIGN_IN_PAGE_DESCRIPTION_DEFAULT,\n AXP_AUTH_SIGN_IN_PAGE_SLOGAN_DEFAULT,\n} from '@acorex-platform/module-auth-client/contracts';\n\nconst I18N = '@auth:settings';\n\nexport class AXMSettingProvider implements AXPSettingDefinitionProvider {\n async provide(context: AXPSettingDefinitionProviderContext): Promise<void> {\n context\n .addGroup(\n 'security-settings',\n `${I18N}.nav-title`,\n `${I18N}.description`,\n 'fa-light fa-lock',\n `${I18N}.title`,\n 95,\n )\n\n //#region ----- Sign-in page (P) -----\n .addSection('sign-in-page', `${I18N}.sign-in-page.title`, `${I18N}.sign-in-page.description`)\n .addSetting({\n key: AXPAuthSettings.SignInPageSlogan,\n title: `${I18N}.sign-in-page.slogan.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: AXP_AUTH_SIGN_IN_PAGE_SLOGAN_DEFAULT,\n widget: {\n type: AXPWidgetsCatalog.text,\n options: { multiLanguage: true },\n },\n description: `${I18N}.sign-in-page.slogan.description`,\n })\n .addSetting({\n key: AXPAuthSettings.SignInPageDescription,\n title: `${I18N}.sign-in-page.body.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: AXP_AUTH_SIGN_IN_PAGE_DESCRIPTION_DEFAULT,\n widget: {\n type: AXPWidgetsCatalog.largeText,\n options: { multiLanguage: true },\n },\n description: `${I18N}.sign-in-page.body.description`,\n })\n .endSection()\n //#endregion\n\n //#region ----- Sign-up (P) -----\n .addSection('sign-up', `${I18N}.sign-up.title`, `${I18N}.sign-up.description`)\n .addSetting({\n key: AXPAuthSettings.SignUpEnabled,\n title: `${I18N}.sign-up.enabled.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: true,\n widget: {\n type: AXPWidgetsCatalog.toggle,\n },\n description: `${I18N}.sign-up.enabled.description`,\n })\n .addSetting({\n key: AXPAuthSettings.SignUpUrl,\n title: `${I18N}.sign-up.url.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: '/auth/register',\n widget: {\n type: AXPWidgetsCatalog.text,\n options: {\n visibility: `{{ context.eval('${AXPAuthSettings.SignUpEnabled}') }}`,\n },\n },\n description: `${I18N}.sign-up.url.description`,\n })\n .endSection()\n //#endregion\n\n //#region ----- Sign-in (P) -----\n .addSection('sign-in', `${I18N}.sign-in.title`, `${I18N}.sign-in.description`)\n .addSetting({\n key: AXPAuthSettings.SignInCredentialType,\n title: `${I18N}.sign-in.credential-type.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: AXPAuthCredentialTypeOptions.UsernameEmailPassword,\n widget: {\n type: AXPWidgetsCatalog.select,\n options: {\n valueField: 'value',\n textField: 'text',\n dataSource: [\n {\n text: `${I18N}.sign-in.credential-type.options.username-password`,\n value: AXPAuthCredentialTypeOptions.UsernamePassword,\n },\n {\n text: `${I18N}.sign-in.credential-type.options.username-email-password`,\n value: AXPAuthCredentialTypeOptions.UsernameEmailPassword,\n },\n {\n text: `${I18N}.sign-in.credential-type.options.email-password`,\n value: AXPAuthCredentialTypeOptions.EmailPassword,\n },\n {\n text: `${I18N}.sign-in.credential-type.options.mobile-password`,\n value: AXPAuthCredentialTypeOptions.MobilePassword,\n },\n ],\n },\n },\n description: `${I18N}.sign-in.credential-type.description`,\n })\n .addSetting({\n key: AXPAuthSettings.SignInDefaultStrategy,\n title: `${I18N}.sign-in.default-strategy.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: 'user-pass',\n widget: {\n type: AXPWidgetsCatalog.text,\n },\n description: `${I18N}.sign-in.default-strategy.description`,\n })\n .endSection()\n //#endregion\n\n // Authentication — tenant password policy; platform lockout thresholds\n .addSection('authentication', `${I18N}.authentication.title`, `${I18N}.authentication.description`)\n .addSetting({\n key: AXPAuthSettings.PasswordComplexity,\n title: `${I18N}.authentication.password.title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n defaultValue: 'Medium',\n widget: {\n type: AXPWidgetsCatalog.select,\n options: {\n valueField: 'value',\n textField: 'text',\n dataSource: [\n {\n text: `${I18N}.authentication.password.options.low`,\n value: 'Low',\n },\n {\n text: `${I18N}.authentication.password.options.medium`,\n value: 'Medium',\n },\n {\n text: `${I18N}.authentication.password.options.high`,\n value: 'High',\n },\n ],\n },\n },\n description: `${I18N}.authentication.password.description`,\n })\n .addSetting({\n key: AXPAuthSettings.PasswordExpiryDays,\n title: `${I18N}.authentication.password-expiry.title`,\n scope: 'T',\n overridableAt: [],\n isInherited: true,\n defaultValue: 90,\n widget: {\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 30,\n maxValue: 365,\n step: 1,\n },\n },\n description: `${I18N}.authentication.password-expiry.description`,\n })\n .addSetting({\n key: AXPAuthSettings.MaxLoginAttempts,\n title: `${I18N}.authentication.max-attempts.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: AXP_AUTH_LOCKOUT_SETTING_DEFAULTS[AXPAuthSettings.MaxLoginAttempts],\n widget: {\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 3,\n maxValue: 10,\n step: 1,\n },\n },\n description: `${I18N}.authentication.max-attempts.description`,\n })\n .addSetting({\n key: AXPAuthSettings.LockoutDuration,\n title: `${I18N}.authentication.lockout.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: AXP_AUTH_LOCKOUT_SETTING_DEFAULTS[AXPAuthSettings.LockoutDuration],\n widget: {\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 60,\n step: 1,\n },\n },\n description: `${I18N}.authentication.lockout.description`,\n })\n .addSetting({\n key: AXPAuthSettings.CaptchaAttemptThreshold,\n title: `${I18N}.authentication.captcha-threshold.title`,\n scope: 'P',\n overridableAt: [],\n isInherited: false,\n defaultValue: AXP_AUTH_LOCKOUT_SETTING_DEFAULTS[AXPAuthSettings.CaptchaAttemptThreshold],\n widget: {\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 10,\n step: 1,\n },\n },\n description: `${I18N}.authentication.captcha-threshold.description`,\n })\n .endSection()\n\n // Session — idle lock screen + terminate old sessions\n .addSection('session-management', `${I18N}.session.title`, `${I18N}.session.description`)\n .addSetting({\n key: AXPAuthSettings.UserTwoFactorEnabled,\n title: `${I18N}.user-two-factor.enabled.title`,\n scope: 'U',\n overridableAt: [],\n isInherited: false,\n defaultValue: false,\n // Managed from Profile → Security (enroll/disable commands), not the settings form.\n cacheable: false,\n widget: {\n type: AXPWidgetsCatalog.toggle,\n options: {\n visibility: 'false',\n },\n },\n description: `${I18N}.user-two-factor.enabled.description`,\n })\n .addSetting({\n key: AXPAuthSettings.LockWhenIdleEnabled,\n title: `${I18N}.session.lock-when-idle.title`,\n scope: 'U',\n overridableAt: [],\n isInherited: true,\n defaultValue: true,\n widget: {\n type: AXPWidgetsCatalog.toggle,\n },\n description: `${I18N}.session.lock-when-idle.description`,\n })\n .addSetting({\n key: AXPAuthSettings.LockWhenIdleMinutes,\n title: `${I18N}.session.lock-when-idle-minutes.title`,\n scope: 'U',\n overridableAt: [],\n isInherited: true,\n defaultValue: 15,\n widget: {\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 1,\n maxValue: 60,\n step: 1,\n visibility: `{{ context.eval('${AXPAuthSettings.LockWhenIdleEnabled}') }}`,\n },\n },\n description: `${I18N}.session.lock-when-idle-minutes.description`,\n })\n .addSetting({\n key: AXPAuthSettings.InactiveSessionTermination,\n title: `${I18N}.session.terminate-old-sessions.title`,\n description: `${I18N}.session.terminate-old-sessions.description`,\n scope: 'T',\n overridableAt: ['U'],\n isInherited: true,\n defaultValue:\n AXP_AUTH_INACTIVE_SESSION_TERMINATION_SETTING_DEFAULTS[AXPAuthSettings.InactiveSessionTermination],\n widget: {\n type: AXPWidgetsCatalog.select,\n options: {\n valueField: 'id',\n textField: 'title',\n dataSource: AXP_AUTH_INACTIVE_SESSION_TERMINATION_OPTION_DEFINITIONS.map((option) => ({\n id: option.id,\n title: option.titleKey,\n })),\n },\n },\n })\n .addSetting({\n key: AXPAuthSettings.MaxActiveDeviceSessions,\n title: `${I18N}.session.concurrent.title`,\n description: `${I18N}.session.concurrent.description`,\n scope: 'T',\n overridableAt: [],\n isInherited: false,\n defaultValue:\n AXP_AUTH_MAX_ACTIVE_DEVICE_SESSIONS_SETTING_DEFAULTS[AXPAuthSettings.MaxActiveDeviceSessions],\n widget: {\n type: AXPWidgetsCatalog.number,\n options: {\n minValue: 0,\n step: 1,\n },\n },\n })\n .endSection()\n .endGroup();\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,13 +1,19 @@
1
1
  import { AXPSessionService } from '@acorex-platform/framework-client/auth';
2
2
  import * as i0 from '@angular/core';
3
3
  import { inject, Injectable } from '@angular/core';
4
+ import { Router } from '@angular/router';
4
5
 
5
6
  class AXPSignoutCommand {
6
7
  constructor() {
7
8
  this.sessionService = inject(AXPSessionService);
9
+ this.router = inject(Router);
8
10
  }
9
11
  async execute() {
10
12
  await this.sessionService.signout();
13
+ const path = (this.router.url ?? '').split('?')[0];
14
+ if (!path.startsWith('/auth')) {
15
+ await this.router.navigateByUrl('/auth/login', { replaceUrl: true });
16
+ }
11
17
  return { success: true, kind: 'object', data: undefined };
12
18
  }
13
19
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPSignoutCommand, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -21,4 +27,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
21
27
  }] });
22
28
 
23
29
  export { AXPSignoutCommand };
24
- //# sourceMappingURL=acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map
30
+ //# sourceMappingURL=acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs","sources":["../../../../libs/modules/auth/client/src/lib/commands/signout-command.ts"],"sourcesContent":["import { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\n\nimport { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXPSignoutCommand implements AXPCommand {\n private readonly sessionService = inject(AXPSessionService);\n private readonly router = inject(Router);\n\n async execute(): AXPCommandExecuteResultPromise<void> {\n await this.sessionService.signout();\n const path = (this.router.url ?? '').split('?')[0];\n if (!path.startsWith('/auth')) {\n await this.router.navigateByUrl('/auth/login', { replaceUrl: true });\n }\n return { success: true, kind: 'object', data: undefined };\n }\n}\n"],"names":[],"mappings":";;;;;MASa,iBAAiB,CAAA;AAH9B,IAAA,WAAA,GAAA;AAImB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAUzC,IAAA;AARC,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AACnC,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC7B,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACtE;AACA,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;IAC3D;8GAXW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;"}