@acorex-platform/module-auth-client 0.0.32 → 0.0.37

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 (82) hide show
  1. package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CPmffSrQ.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs} +287 -102
  2. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-BfOgjNxw.mjs → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs} +5 -5
  4. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-BfOgjNxw.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map} +1 -1
  5. package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +1 -1
  6. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BcBbN5hX.mjs → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs} +2 -2
  7. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BcBbN5hX.mjs.map → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map} +1 -1
  8. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-DfHUPj7p.mjs → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs} +2 -2
  9. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-DfHUPj7p.mjs.map → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map} +1 -1
  10. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +63 -1
  11. package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
  12. package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +1 -1
  13. package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-TjOLhvKL.mjs.map +1 -1
  14. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-D9fyLuBy.mjs → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs} +2 -2
  15. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-D9fyLuBy.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs.map} +1 -1
  16. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DUZ255VK.mjs → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs} +2 -2
  17. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DUZ255VK.mjs.map → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map} +1 -1
  18. package/fesm2022/{acorex-platform-module-auth-client-login.module-uRv9Gwea.mjs → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs} +3 -3
  19. package/fesm2022/{acorex-platform-module-auth-client-login.module-uRv9Gwea.mjs.map → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map} +1 -1
  20. package/fesm2022/{acorex-platform-module-auth-client-master.layout-Cu8mQN9B.mjs → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs} +4 -4
  21. package/fesm2022/{acorex-platform-module-auth-client-master.layout-Cu8mQN9B.mjs.map → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map} +1 -1
  22. package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs.map +1 -1
  23. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs → acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs.map → acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs.map} +1 -1
  25. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs +265 -0
  26. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs} +3 -3
  28. package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs.map → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-module-auth-client-password.component-5-0kaY5J.mjs → acorex-platform-module-auth-client-password.component-BoWDVby5.mjs} +10 -5
  30. package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs.map +1 -1
  32. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs → acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs} +4 -4
  33. package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs.map → acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs.map} +1 -1
  34. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-kBmoYwRh.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs} +5 -5
  35. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-kBmoYwRh.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map} +1 -1
  36. package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs.map +1 -1
  37. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs} +3 -3
  38. package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-D0QS8joQ.mjs.map → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs.map} +1 -1
  39. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-Bz1mdVCM.mjs → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs} +4 -4
  40. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-Bz1mdVCM.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs.map} +1 -1
  41. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-w2SYmCyc.mjs → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs} +7 -7
  42. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-w2SYmCyc.mjs.map → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map} +1 -1
  43. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BtDgEnmo.mjs → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs} +4 -4
  44. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BtDgEnmo.mjs.map → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map} +1 -1
  45. package/fesm2022/{acorex-platform-module-auth-client-register.module-DCWoPb0u.mjs → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs} +4 -4
  46. package/fesm2022/{acorex-platform-module-auth-client-register.module-DCWoPb0u.mjs.map → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map} +1 -1
  47. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-DJeSHCLL.mjs → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs} +2 -2
  48. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-DJeSHCLL.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs.map} +1 -1
  49. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs → acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs} +3 -3
  50. package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs.map → acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs.map} +1 -1
  51. package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs} +2 -2
  52. package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs.map → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map} +1 -1
  53. package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs} +3 -3
  54. package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs.map → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map} +1 -1
  55. package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs +195 -0
  56. package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs.map +1 -0
  57. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-3HJEmCYI.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs} +5 -5
  58. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-3HJEmCYI.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs.map} +1 -1
  59. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-C2kCGuQW.mjs → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs} +3 -3
  60. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-C2kCGuQW.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map} +1 -1
  61. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Dpdgw4KT.mjs → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs} +5 -5
  62. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Dpdgw4KT.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map} +1 -1
  63. package/fesm2022/{acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs → acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs} +27 -25
  64. package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +1 -0
  65. package/fesm2022/acorex-platform-module-auth-client-show-profile-command-BWoDxIdx.mjs.map +1 -1
  66. package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +1 -1
  67. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-1Kv-LGZc.mjs → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs} +5 -5
  68. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-1Kv-LGZc.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map} +1 -1
  69. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs → acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs} +3 -3
  70. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-nsB4v25Z.mjs.map → acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs.map} +1 -1
  71. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs → acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs} +2 -2
  72. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs.map → acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs.map} +1 -1
  73. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-C_T4l61M.mjs → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs} +2 -2
  74. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-C_T4l61M.mjs.map → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs.map} +1 -1
  75. package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
  76. package/package.json +2 -2
  77. package/types/acorex-platform-module-auth-client-contracts.d.ts +30 -2
  78. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CPmffSrQ.mjs.map +0 -1
  79. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BlPxfa3v.mjs +0 -200
  80. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BlPxfa3v.mjs.map +0 -1
  81. package/fesm2022/acorex-platform-module-auth-client-password.component-5-0kaY5J.mjs.map +0 -1
  82. package/fesm2022/acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs.map +0 -1
@@ -1,25 +1,25 @@
1
- import * as i1$5 from '@acorex-platform/framework-client/common';
1
+ import * as i1$4 from '@acorex-platform/framework-client/common';
2
2
  import { AXPFileStorageService, AXPHomePageService, AXPPlatformSettingsLoadState, AXPSettingsService, AXPDataProvider, AXPCommonSettings, AXP_PROTECTED_ROUTE_GUARDS, AXPCommonModule, AXPPlatformSettingsOfflineBootstrapService, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';
3
- import { AXPSessionService, AXPUnauthorizedError, AXPUnauthenticatedError, AXPAuthStrategyRegistryService, traceAuthGuard, AXPAuthGuard, AXPSessionStatus } from '@acorex-platform/framework-client/auth';
3
+ import { AXPSessionService, AXPUnauthorizedError, AXPUnauthenticatedError, AXPAuthStrategyRegistryService, storeSessionLimitPendingTenant, isMaxActiveDeviceSessionsError, traceAuthGuard, AXPAuthGuard, AXPSessionStatus } from '@acorex-platform/framework-client/auth';
4
4
  import { AXPUserAvatarService, AXPUserAvatarComponent, AXP_PAGE_COMPONENT_PROVIDER } from '@acorex-platform/framework-client/layout/components';
5
5
  import { AXPFileStorageStatus, coerceUnknownToTrimmedString, AXPPlatformScope, AXPKeyboardShortcutPriority, verifyPassword } from '@acorex-platform/framework-shared/core';
6
- import { RootConfig, AXPSecurityManagementFeatureKeys } from '@acorex-platform/module-security-management-client/contracts';
6
+ import { RootConfig, AXMSessionStatusTypes, AXPSecurityManagementFeatureKeys } from '@acorex-platform/module-security-management-client/contracts';
7
7
  import { AXPEntityService, AXP_ENTITY_STORAGE_MIDDLEWARE } from '@acorex-platform/framework-client/layout/entity';
8
8
  import * as i0 from '@angular/core';
9
- import { inject, Injectable, isDevMode, InjectionToken, NgModule, input, output, viewChild, viewChildren, signal, computed, effect, ChangeDetectionStrategy, Component, Input, DestroyRef, ViewEncapsulation, ViewChild, Injector, afterNextRender, ApplicationRef } from '@angular/core';
9
+ import { inject, Injectable, isDevMode, InjectionToken, NgModule, input, output, viewChild, viewChildren, signal, computed, effect, ChangeDetectionStrategy, Component, Input, DestroyRef, ViewEncapsulation, ViewChild, Injector, afterNextRender, NgZone, ApplicationRef } from '@angular/core';
10
10
  import { AXPLayoutThemeService, AXPMenuVerticalMode } from '@acorex-platform/framework-client/themes/shared';
11
11
  import { HttpErrorResponse } from '@angular/common/http';
12
- import * as i1$6 from '@angular/router';
12
+ import * as i1$5 from '@angular/router';
13
13
  import { Router, RouterModule, ROUTES, NavigationStart } from '@angular/router';
14
14
  import { AXPAuthCredentialTypeOptions, AXP_AUTH_SIGN_IN_PAGE_SLOGAN_DEFAULT, AXP_AUTH_SIGN_IN_PAGE_DESCRIPTION_DEFAULT, AXPAuthSettings, AXMAuthCommandKeys } from '@acorex-platform/module-auth-client/contracts';
15
15
  import * as i1 from '@acorex/core/validation';
16
16
  import { AXValidationModule } from '@acorex/core/validation';
17
17
  import { isNil, isString, orderBy, isEmpty, get, defaultTo } from 'lodash';
18
- import * as i1$4 from '@acorex-platform/framework-client/core';
18
+ import * as i1$3 from '@acorex-platform/framework-client/core';
19
19
  import { axpApplicationLogoKey, AXPEntityLogoRegistrationService, AXPLogoComponent, axpTenantLogoKey, AXPHookService, AXPKeyboardShortcutRegistry, chordToKbdItemKeys, getPrimaryKeyboardShortcutChord, normalizeKeyboardShortcuts, AXPDeviceService, AXPComponentSlotModule, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER, provideAppStartUpTask, AXP_APP_STARTUP_PRIORITY, provideLazyProvider, AXPComponentSlotDirective } from '@acorex-platform/framework-client/core';
20
20
  import { AXPCommandService, provideQuerySetups, provideCommandSetups } from '@acorex-platform/framework-client/runtime';
21
21
  import { AXPRootLayoutComponent } from '@acorex-platform/framework-client/themes/default';
22
- import * as i3 from '@angular/common';
22
+ import * as i5 from '@angular/common';
23
23
  import { CommonModule, AsyncPipe, Location } from '@angular/common';
24
24
  import { first, filter, firstValueFrom, take, combineLatest, distinctUntilChanged, switchMap, EMPTY, from, timeout } from 'rxjs';
25
25
  import * as i1$1 from '@acorex/components/button';
@@ -29,28 +29,28 @@ import { AXDecoratorModule } from '@acorex/components/decorators';
29
29
  import * as i2$1 from '@acorex/components/popover';
30
30
  import { AXPopoverModule } from '@acorex/components/popover';
31
31
  import { RootConfig as RootConfig$1 } from '@acorex-platform/module-application-management-client/contracts';
32
- import * as i6 from '@acorex/cdk/list-navigation';
32
+ import * as i4 from '@acorex/cdk/list-navigation';
33
33
  import { AXListNavigationDirective, AXListNavigationItemDirective, AXListNavigationModule } from '@acorex/cdk/list-navigation';
34
- import * as i5 from '@acorex/components/search-box';
35
- import { AXSearchBoxModule } from '@acorex/components/search-box';
36
- import * as i4 from '@acorex/components/select-box';
37
- import { AXSelectBoxModule } from '@acorex/components/select-box';
34
+ import { AXLookupComponent } from '@acorex/components/lookup';
38
35
  import * as i2 from '@acorex/components/loading';
39
36
  import { AXLoadingModule } from '@acorex/components/loading';
40
- import * as i1$2 from '@acorex/components/skeleton';
37
+ import * as i3 from '@acorex/components/skeleton';
41
38
  import { AXSkeletonModule } from '@acorex/components/skeleton';
42
39
  import * as i5$1 from '@acorex/core/translation';
43
40
  import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
44
41
  import { AXAvatarModule } from '@acorex/components/avatar';
45
42
  import { AXImageModule } from '@acorex/components/image';
46
43
  import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
47
- import * as i1$3 from '@angular/forms';
44
+ import * as i6 from '@acorex/components/search-box';
45
+ import { AXSearchBoxModule } from '@acorex/components/search-box';
46
+ import * as i1$2 from '@angular/forms';
48
47
  import { FormsModule } from '@angular/forms';
49
48
  import { AXToastService } from '@acorex/components/toast';
50
- import { AXMDeviceSessionsService } from '@acorex-platform/module-security-management-client';
51
49
  import { AXOverlayService } from '@acorex/cdk/overlay';
52
50
  import { AXPlatform } from '@acorex/core/platform';
53
51
  import { PRESENCE_SET_AVAILABILITY } from '@acorex-platform/framework-shared/runtime';
52
+ import { AXDialogService } from '@acorex/components/dialog';
53
+ import { AXP_REALTIME_TOPIC_HANDLER, AXP_REALTIME_TOPIC_AUTH_SECURITY_ALERT } from '@acorex-platform/framework-client/realtime';
54
54
 
55
55
  //#region ---- Hook keys ----
56
56
  const PROFILE_PAGE_GROUPS_HOOK = 'profile-page.groups';
@@ -990,26 +990,26 @@ const routes = [
990
990
  },
991
991
  {
992
992
  path: 'unavailable',
993
- loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-BEVkQ3jh.mjs').then((c) => c.AXMPlatformSettingsUnavailableComponent),
993
+ loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs').then((c) => c.AXMPlatformSettingsUnavailableComponent),
994
994
  },
995
995
  {
996
996
  path: '',
997
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-Cu8mQN9B.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
998
- loadChildren: () => import('./acorex-platform-module-auth-client-login.module-uRv9Gwea.mjs').then((c) => c.AXPSignInModule),
997
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
998
+ loadChildren: () => import('./acorex-platform-module-auth-client-login.module-CXl61yOu.mjs').then((c) => c.AXPSignInModule),
999
999
  },
1000
1000
  {
1001
1001
  path: '',
1002
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-Cu8mQN9B.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1003
- loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs').then((c) => c.AXPTwoFactorModule),
1002
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1003
+ loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs').then((c) => c.AXPTwoFactorModule),
1004
1004
  },
1005
1005
  {
1006
1006
  path: '',
1007
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-Cu8mQN9B.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1008
- loadChildren: () => import('./acorex-platform-module-auth-client-routes-IX2qmeqU.mjs').then((c) => c),
1007
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1008
+ loadChildren: () => import('./acorex-platform-module-auth-client-routes-B6iJHJ60.mjs').then((c) => c),
1009
1009
  },
1010
1010
  {
1011
1011
  path: 'oauth-callback',
1012
- loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs').then((c) => c.AXPOAuthCallbackComponent),
1012
+ loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs').then((c) => c.AXPOAuthCallbackComponent),
1013
1013
  },
1014
1014
  {
1015
1015
  path: 'account',
@@ -1018,8 +1018,8 @@ const routes = [
1018
1018
  },
1019
1019
  {
1020
1020
  path: '',
1021
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-Cu8mQN9B.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1022
- loadChildren: () => import('./acorex-platform-module-auth-client-register.module-DCWoPb0u.mjs').then((c) => c.AXPRegisterModule),
1021
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1022
+ loadChildren: () => import('./acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs').then((c) => c.AXPRegisterModule),
1023
1023
  },
1024
1024
  ],
1025
1025
  },
@@ -1100,11 +1100,13 @@ class AXPAppChooserListComponent {
1100
1100
  }
1101
1101
  //#endregion
1102
1102
  //#region ---- UI Handlers ----
1103
+ handleApplicationSelectionChanged(event) {
1104
+ this.selectedApplication.set(event.items?.[0] ?? null);
1105
+ }
1103
1106
  handleApplicationSelect(event) {
1104
1107
  if (!event.isUserInteraction) {
1105
1108
  return;
1106
1109
  }
1107
- this.selectedApplication.set(event.component.selectedItems[0] ?? null);
1108
1110
  }
1109
1111
  handleListItemKeyDown(event, application) {
1110
1112
  if (event.key === 'Enter' || event.key === ' ') {
@@ -1200,7 +1202,7 @@ class AXPAppChooserListComponent {
1200
1202
  }
1201
1203
  }
1202
1204
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1203
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAppChooserListComponent, isStandalone: true, selector: "axp-app-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applicationChosen: "applicationChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n @if (item.data.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.data.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i4.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i6.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i6.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAppChooserListComponent, isStandalone: true, selector: "axp-app-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applicationChosen: "applicationChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n [selectedTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n (onSelectionChanged)=\"handleApplicationSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n @if (item.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i4.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i4.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1204
1206
  }
1205
1207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, decorators: [{
1206
1208
  type: Component,
@@ -1210,12 +1212,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1210
1212
  AXDecoratorModule,
1211
1213
  AXLoadingModule,
1212
1214
  AXSkeletonModule,
1213
- AXSelectBoxModule,
1214
- AXSearchBoxModule,
1215
+ AXLookupComponent,
1215
1216
  AXListNavigationModule,
1216
1217
  AXTranslationModule,
1217
1218
  AXPLogoComponent,
1218
- ], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n @if (item.data.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.data.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n" }]
1219
+ ], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n [selectedTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n (onSelectionChanged)=\"handleApplicationSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n @if (item.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n" }]
1219
1220
  }], ctorParameters: () => [], propDecorators: { simple: [{ type: i0.Input, args: [{ isSignal: true, alias: "simple", required: false }] }], applicationChosen: [{ type: i0.Output, args: ["applicationChosen"] }], loadingChange: [{ type: i0.Output, args: ["loadingChange"] }], listNav: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXListNavigationDirective), { isSignal: true }] }], listItems: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => AXListNavigationItemDirective), { isSignal: true }] }] } });
1220
1221
 
1221
1222
  class AXMAppChooserSlotComponent {
@@ -1230,13 +1231,25 @@ class AXMAppChooserSlotComponent {
1230
1231
  this.appPopover()?.close();
1231
1232
  }
1232
1233
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1233
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAppChooserSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "appPopover", first: true, predicate: ["appPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button [color]=\"themeStore.headerButtonColor()\" [look]=\"themeStore.headerButtonLook()\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list", inputs: ["simple"], outputs: ["applicationChosen", "loadingChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1234
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAppChooserSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "appPopover", first: true, predicate: ["appPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button [color]=\"themeStore.headerButtonColor()\" [look]=\"themeStore.headerButtonLook()\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list", inputs: ["simple"], outputs: ["applicationChosen", "loadingChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1234
1235
  }
1235
1236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, decorators: [{
1236
1237
  type: Component,
1237
1238
  args: [{ changeDetection: ChangeDetectionStrategy.Eager, imports: [CommonModule, AXButtonModule, AXPopoverModule, AXDecoratorModule, AXPAppChooserListComponent], template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button [color]=\"themeStore.headerButtonColor()\" [look]=\"themeStore.headerButtonLook()\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n" }]
1238
1239
  }], propDecorators: { appPopover: [{ type: i0.ViewChild, args: ['appPopover', { isSignal: true }] }] } });
1239
1240
 
1241
+ //#region ----- Session limit navigation -----
1242
+ async function navigateToSessionLimitChooser(router, tenant) {
1243
+ storeSessionLimitPendingTenant(tenant);
1244
+ return router.navigate(['/auth/account/session-limit'], {
1245
+ state: { tenant },
1246
+ });
1247
+ }
1248
+ function isSessionLimitBindError(error) {
1249
+ return isMaxActiveDeviceSessionsError(error);
1250
+ }
1251
+ //#endregion
1252
+
1240
1253
  class AXPTenantChooserListComponent {
1241
1254
  tenantLogoKey(tenant) {
1242
1255
  return axpTenantLogoKey(tenant.id);
@@ -1342,11 +1355,13 @@ class AXPTenantChooserListComponent {
1342
1355
  showAllTenants() {
1343
1356
  this.showAll.update((value) => !value);
1344
1357
  }
1358
+ handleTenantSelectionChanged(event) {
1359
+ this.selectedTenant.set(event.items?.[0] ?? null);
1360
+ }
1345
1361
  handleTenantSelect(event) {
1346
1362
  if (!event.isUserInteraction) {
1347
1363
  return;
1348
1364
  }
1349
- this.selectedTenant.set(event.component.selectedItems[0] ?? null);
1350
1365
  }
1351
1366
  handleListItemKeyDown(event, tenant) {
1352
1367
  if (event.key === 'Enter' || event.key === ' ') {
@@ -1396,6 +1411,15 @@ class AXPTenantChooserListComponent {
1396
1411
  this.tenantChosen.emit();
1397
1412
  return this.router.navigate(['/auth/account/app-chooser']);
1398
1413
  }
1414
+ catch (error) {
1415
+ if (isSessionLimitBindError(error)) {
1416
+ // Swallow — do not rethrow (avoids global error handler + logout noise).
1417
+ await navigateToSessionLimitChooser(this.router, item);
1418
+ return;
1419
+ }
1420
+ console.error('Tenant choose failed:', error);
1421
+ throw error;
1422
+ }
1399
1423
  finally {
1400
1424
  this.isChoosing.set(false);
1401
1425
  this.choosingId.set(null);
@@ -1413,7 +1437,7 @@ class AXPTenantChooserListComponent {
1413
1437
  }
1414
1438
  }
1415
1439
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1416
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserListComponent, isStandalone: true, selector: "axp-tenant-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChosen: "tenantChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] pe-2 flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 justify-between py-3 items-center cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center font-medium min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i4.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i6.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i6.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1440
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserListComponent, isStandalone: true, selector: "axp-tenant-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChosen: "tenantChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <!--->\n <!-- ----- Compact dropdown skeleton ----- -->\n @if (simple()) {\n <div class=\"w-full flex flex-col gap-1\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-2 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-6 rounded-md shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-4 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n <!-- ----- Full chooser skeleton ----- -->\n @else {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n}\n<!-- ----- Compact list for header/sidebar dropdowns ----- -->\n@else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] flex flex-col gap-1\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-2 items-center min-w-0\">\n <div class=\"shrink-0 size-6 overflow-hidden rounded-md grid place-items-center\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"24\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-6 overflow-hidden\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n <!--->\n <!-- ----- Choosing indicator for this tenant ----- -->\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n<!-- ----- Lookup when the catalog is long ----- -->\n@else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n [selectedTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n (onSelectionChanged)=\"handleTenantSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n}\n<!-- ----- Full list on the login tenant chooser ----- -->\n@else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { 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$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "highlightSearch", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i6.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i4.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i4.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1417
1441
  }
1418
1442
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, decorators: [{
1419
1443
  type: Component,
@@ -1425,11 +1449,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1425
1449
  AXDecoratorModule,
1426
1450
  AXLoadingModule,
1427
1451
  AXSkeletonModule,
1428
- AXSelectBoxModule,
1452
+ AXLookupComponent,
1429
1453
  AXSearchBoxModule,
1430
1454
  AXListNavigationModule,
1431
1455
  AXPLogoComponent,
1432
- ], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] pe-2 flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 justify-between py-3 items-center cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center font-medium min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n </div>\n</ng-template>\n" }]
1456
+ ], template: "@if (isLoading()) {\n <!--->\n <!-- ----- Compact dropdown skeleton ----- -->\n @if (simple()) {\n <div class=\"w-full flex flex-col gap-1\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-2 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-6 rounded-md shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-4 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n <!-- ----- Full chooser skeleton ----- -->\n @else {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n }\n}\n<!-- ----- Compact list for header/sidebar dropdowns ----- -->\n@else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] flex flex-col gap-1\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-2 items-center min-w-0\">\n <div class=\"shrink-0 size-6 overflow-hidden rounded-md grid place-items-center\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"24\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-6 overflow-hidden\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n <!--->\n <!-- ----- Choosing indicator for this tenant ----- -->\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n<!-- ----- Lookup when the catalog is long ----- -->\n@else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n [selectedTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n (onSelectionChanged)=\"handleTenantSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n}\n<!-- ----- Full list on the login tenant chooser ----- -->\n@else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n </div>\n</ng-template>\n" }]
1433
1457
  }], ctorParameters: () => [], propDecorators: { simple: [{ type: i0.Input, args: [{ isSignal: true, alias: "simple", required: false }] }], tenantChosen: [{ type: i0.Output, args: ["tenantChosen"] }], loadingChange: [{ type: i0.Output, args: ["loadingChange"] }], listNav: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXListNavigationDirective), { isSignal: true }] }], listItems: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => AXListNavigationItemDirective), { isSignal: true }] }] } });
1434
1458
 
1435
1459
  class AXPTenantChooserDropdownComponent {
@@ -1446,6 +1470,10 @@ class AXPTenantChooserDropdownComponent {
1446
1470
  this.tenantPopover = viewChild('tenantPopover', /* @ts-ignore */
1447
1471
  ...(ngDevMode ? [{ debugName: "tenantPopover" }] : /* istanbul ignore next */ []));
1448
1472
  //#endregion
1473
+ //#region ----- Constants -----
1474
+ /** Shared panel size so sidebar and header tenant popovers match. */
1475
+ this.popupPanelClass = 'bg-lightest border overflow-hidden rounded-md shadow-md w-80 p-1';
1476
+ //#endregion
1449
1477
  //#region ----- Inputs -----
1450
1478
  /**
1451
1479
  * When true, renders a plain inline tenant text (no popover).
@@ -1470,7 +1498,7 @@ class AXPTenantChooserDropdownComponent {
1470
1498
  void this.router.navigate(['/auth/account/tenant-chooser']);
1471
1499
  }
1472
1500
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1473
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserDropdownComponent, isStandalone: true, selector: "axp-tenant-chooser-dropdown", inputs: { inline: "inline" }, viewQueries: [{ propertyName: "tenantPopover", first: true, predicate: ["tenantPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3$1.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: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXPTenantChooserListComponent, selector: "axp-tenant-chooser-list", inputs: ["simple"], outputs: ["tenantChosen", "loadingChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1501
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserDropdownComponent, isStandalone: true, selector: "axp-tenant-chooser-dropdown", inputs: { inline: "inline" }, viewQueries: [{ propertyName: "tenantPopover", first: true, predicate: ["tenantPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { 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: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3$1.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: AXSkeletonModule }, { kind: "component", type: i3.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXPTenantChooserListComponent, selector: "axp-tenant-chooser-list", inputs: ["simple"], outputs: ["tenantChosen", "loadingChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1474
1502
  }
1475
1503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, decorators: [{
1476
1504
  type: Component,
@@ -1482,7 +1510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1482
1510
  AXDecoratorModule,
1483
1511
  AXSkeletonModule,
1484
1512
  AXPTenantChooserListComponent,
1485
- ], template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n" }]
1513
+ ], template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div [class]=\"popupPanelClass\">\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n" }]
1486
1514
  }], propDecorators: { tenantPopover: [{ type: i0.ViewChild, args: ['tenantPopover', { isSignal: true }] }], inline: [{
1487
1515
  type: Input
1488
1516
  }] } });
@@ -1611,14 +1639,14 @@ class AXMAuthProfileSlotComponent {
1611
1639
  }
1612
1640
  }
1613
1641
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1614
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAuthProfileSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-full min-w-64\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold\">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
1642
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAuthProfileSlotComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-80\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold \">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);display:flex;flex-direction:column;gap:var(--spacing, .25rem);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
1615
1643
  //
1616
- AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type:
1644
+ AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { 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$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type:
1617
1645
  // AXKBDComponent,
1618
1646
  // AXKBDItemComponent,
1619
1647
  AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "component", type:
1620
1648
  //
1621
- AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1649
+ AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1622
1650
  }
1623
1651
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, decorators: [{
1624
1652
  type: Component,
@@ -1638,7 +1666,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1638
1666
  AXPUserAvatarComponent,
1639
1667
  //
1640
1668
  AXPTenantChooserDropdownComponent,
1641
- ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-full min-w-64\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold\">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
1669
+ ], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@if (isAuthenticated$ | async) {\n <div class=\"size-fit\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"36\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"true\"\n ></axp-user-avatar>\n </div>\n\n <ax-popover\n [target]=\"avatar\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"false\"\n #p\n >\n <div\n class=\"bg-lightest border border-lightest rounded-md shadow-md w-80\"\n >\n <div class=\"flex flex-col items-center p-4 border-b\">\n <axp-user-avatar\n [size]=\"64\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n\n <div class=\"flex flex-col items-center justify-center mt-2\">\n <div class=\"text-base font-bold \">{{ (user$ | async)?.title }}</div>\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n </div>\n </div>\n <div class=\"axp-profile-slot-menus\">\n <ul>\n @for (item of menuItems(); track item.name ?? item.title) {\n @if (item.visible != false) {\n @if (hasProfileSlotMenuBreakBefore(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n <li [class]=\"menuItemClass(item)\">\n <a (click)=\"handleMenuItemClick(item, p)\">\n <i [class]=\"item.icon\"></i>\n <span class=\"flex-1\">{{\n item.title | translate | async\n }}</span>\n </a>\n </li>\n @if (hasProfileSlotMenuBreakAfter(item.break)) {\n <li class=\"axp-profile-slot-menu-break\" role=\"separator\"></li>\n }\n }\n }\n </ul>\n </div>\n </div>\n </ax-popover>\n </div>\n} @else {\n <ax-button\n color=\"default\"\n look=\"blank\"\n text=\"Sign Up / Sign In\"\n (click)=\"handleSignIn()\"\n >\n <ax-icon>\n <i class=\"fa-solid fa-user text-slate-400 dark:text-slate-200\"></i>\n </ax-icon>\n </ax-button>\n}\n", styles: ["@layer properties;.axp-profile-slot-menus ul{margin-top:calc(var(--spacing, .25rem) * 2);display:flex;flex-direction:column;gap:var(--spacing, .25rem);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding-inline:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul:last-child{border-style:var(--tw-border-style);border-width:0px}.axp-profile-slot-menus ul li{display:flex;cursor:pointer;border-radius:var(--radius-md, .375rem)}.axp-profile-slot-menus ul li:last-child{margin-bottom:calc(var(--spacing, .25rem) * 2)}.axp-profile-slot-menus ul li:hover{background-color:rgba(var(--ax-sys-color-dark-surface))}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break{pointer-events:none;margin-inline:calc(var(--spacing, .25rem) * 2);margin-block:var(--spacing, .25rem);height:0px;min-height:0px;cursor:default;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--color-border-default);padding:0}.axp-profile-slot-menus ul li.axp-profile-slot-menu-break:hover{background-color:transparent}.axp-profile-slot-menus ul li i{margin-inline-end:calc(var(--spacing, .25rem) * 3);display:grid;height:calc(var(--spacing, .25rem) * 6);width:calc(var(--spacing, .25rem) * 6);place-items:center;font-size:var(--text-xl, 1.25rem);line-height:var(--tw-leading, var(--text-xl--line-height, calc(1.75 / 1.25)))}.axp-profile-slot-menus ul li a{display:flex;height:100%;width:100%;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 2)}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
1642
1670
  }] });
1643
1671
 
1644
1672
  class AXMUserProfileCardSlotComponent {
@@ -1753,49 +1781,50 @@ class AXMUserDeviceSessionsServiceImp extends AXMUserDeviceSessionsService {
1753
1781
  this.deviceSessionsDataAccessor = this.entityService
1754
1782
  .withEntity(RootConfig.module.name, RootConfig.entities.deviceSessions.name)
1755
1783
  .data();
1756
- this.deviceSessionsService = inject(AXMDeviceSessionsService);
1757
1784
  this.settingsService = inject(AXPSettingsService);
1758
1785
  this.toastService = inject(AXToastService);
1759
1786
  this.translationService = inject(AXTranslationService);
1760
1787
  }
1761
1788
  //#endregion
1762
1789
  async getSessions() {
1763
- const userId = this.sessionService.user?.id;
1764
- if (!userId) {
1765
- return [];
1766
- }
1767
- const response = await this.deviceSessionsDataAccessor.query();
1768
- return response.items.filter((item) => item.userId === userId &&
1769
- String(item.status).toLowerCase() === 'active' &&
1770
- !item.isActiveSession);
1790
+ const sessions = await this.loadActiveUserSessions();
1791
+ const current = this.pickCurrentSession(sessions);
1792
+ const others = current ? sessions.filter((item) => item.id !== current.id) : sessions;
1793
+ return orderBy(others, [(session) => new Date(session.lastLoginDate).getTime()], ['desc']);
1771
1794
  }
1772
1795
  async getCurrentActiveSessions() {
1773
- const userId = this.sessionService.user?.id;
1774
- if (!userId) {
1775
- throw new Error('No user found in session');
1776
- }
1777
- const response = await this.deviceSessionsDataAccessor.query();
1778
- const userSessions = response.items.filter((item) => item.userId === userId && String(item.status).toLowerCase() === 'active');
1779
- const activeSession = userSessions.find((item) => item.isActiveSession);
1780
- if (activeSession) {
1781
- return activeSession;
1782
- }
1783
- const mostRecentSession = orderBy(userSessions, [(session) => new Date(session.lastLoginDate).getTime()], ['desc'])[0];
1784
- if (!mostRecentSession) {
1796
+ const userSessions = await this.loadActiveUserSessions();
1797
+ const activeSession = this.pickCurrentSession(userSessions);
1798
+ if (!activeSession) {
1785
1799
  throw new Error('No active session found for current user');
1786
1800
  }
1787
- return mostRecentSession;
1801
+ return activeSession;
1788
1802
  }
1789
1803
  async terminateSession(sessionId) {
1804
+ const sessions = await this.loadActiveUserSessions();
1805
+ const current = this.pickCurrentSession(sessions);
1806
+ if (current && sessionId === current.id) {
1807
+ return;
1808
+ }
1790
1809
  await this.deviceSessionsDataAccessor.update(sessionId, {
1791
- status: 'revoked',
1810
+ status: AXMSessionStatusTypes.revoked,
1792
1811
  loggedOutAt: new Date(),
1793
1812
  isActiveSession: false,
1794
1813
  });
1795
1814
  await this.showTerminateSuccessToast();
1796
1815
  }
1797
1816
  async terminateAllSession() {
1798
- await this.deviceSessionsService.terminateAllCurrentUserSessions();
1817
+ const sessions = await this.loadActiveUserSessions();
1818
+ const current = this.pickCurrentSession(sessions);
1819
+ if (!current) {
1820
+ return;
1821
+ }
1822
+ const otherActiveSessions = sessions.filter((session) => session.id !== current.id);
1823
+ await Promise.all(otherActiveSessions.map((session) => this.deviceSessionsDataAccessor.update(session.id, {
1824
+ status: AXMSessionStatusTypes.revoked,
1825
+ loggedOutAt: new Date(),
1826
+ isActiveSession: false,
1827
+ })));
1799
1828
  await this.showTerminateSuccessToast();
1800
1829
  }
1801
1830
  async setInactiveSessionTermination(value) {
@@ -1803,6 +1832,38 @@ class AXMUserDeviceSessionsServiceImp extends AXMUserDeviceSessionsService {
1803
1832
  .scope(AXPPlatformScope.User)
1804
1833
  .set(AXPAuthSettings.InactiveSessionTermination, value);
1805
1834
  }
1835
+ /**
1836
+ * Current device = unique middleware flag, otherwise most recent last visit.
1837
+ */
1838
+ pickCurrentSession(sessions) {
1839
+ if (sessions.length === 0) {
1840
+ return undefined;
1841
+ }
1842
+ const flagged = sessions.filter((session) => session.isActiveSession === true);
1843
+ if (flagged.length === 1) {
1844
+ return flagged[0];
1845
+ }
1846
+ return orderBy(sessions, [(session) => new Date(session.lastLoginDate).getTime()], ['desc'])[0];
1847
+ }
1848
+ async loadActiveUserSessions() {
1849
+ const userId = this.sessionService.user?.id;
1850
+ if (!userId) {
1851
+ return [];
1852
+ }
1853
+ const response = await this.deviceSessionsDataAccessor.query({
1854
+ skip: 0,
1855
+ take: 1000,
1856
+ filter: {
1857
+ logic: 'and',
1858
+ filters: [
1859
+ { field: 'userId', operator: { type: 'equal' }, value: userId },
1860
+ { field: 'status', operator: { type: 'equal' }, value: 'active' },
1861
+ ],
1862
+ },
1863
+ });
1864
+ const items = response.items ?? [];
1865
+ return orderBy(items, [(session) => new Date(session.lastLoginDate).getTime()], ['desc']);
1866
+ }
1806
1867
  async showTerminateSuccessToast() {
1807
1868
  const showResult = await this.settingsService.get(AXPCommonSettings.EnableOperationToasts);
1808
1869
  if (!showResult) {
@@ -1849,12 +1910,22 @@ const canActivateTenantChooser = async (_route, _state) => {
1849
1910
  }
1850
1911
  if (tenants.length === 1) {
1851
1912
  if (strategy && typeof strategy.updateToken === 'function') {
1852
- await sessionService.updateToken({
1853
- user: sessionService.user,
1854
- tenant: tenants[0],
1855
- });
1856
- traceAuthGuard('Tenant chooser auto-bound single tenant → app chooser');
1857
- return router.createUrlTree(['/auth/account/app-chooser']);
1913
+ try {
1914
+ await sessionService.updateToken({
1915
+ user: sessionService.user,
1916
+ tenant: tenants[0],
1917
+ });
1918
+ traceAuthGuard('Tenant chooser auto-bound single tenant → app chooser');
1919
+ return router.createUrlTree(['/auth/account/app-chooser']);
1920
+ }
1921
+ catch (error) {
1922
+ if (isSessionLimitBindError(error)) {
1923
+ traceAuthGuard('Tenant chooser auto-bind blocked by max device sessions');
1924
+ storeSessionLimitPendingTenant(tenants[0]);
1925
+ return router.createUrlTree(['/auth/account/session-limit']);
1926
+ }
1927
+ throw error;
1928
+ }
1858
1929
  }
1859
1930
  return true;
1860
1931
  }
@@ -1914,12 +1985,17 @@ function routesFacory() {
1914
1985
  routes = [
1915
1986
  {
1916
1987
  path: 'tenant-chooser',
1917
- loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-1Kv-LGZc.mjs').then((c) => c.AXPAuthTenantChooserComponent),
1988
+ loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs').then((c) => c.AXPAuthTenantChooserComponent),
1918
1989
  canActivate: [AXPAuthGuard, canActivateTenantChooser],
1919
1990
  },
1991
+ {
1992
+ path: 'session-limit',
1993
+ loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs').then((c) => c.AXPAuthSessionLimitComponent),
1994
+ canActivate: [AXPAuthGuard],
1995
+ },
1920
1996
  {
1921
1997
  path: 'app-chooser',
1922
- loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-BfOgjNxw.mjs').then((c) => c.AXPAuthAppChooserComponent),
1998
+ loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs').then((c) => c.AXPAuthAppChooserComponent),
1923
1999
  canActivate: [AXPAuthGuard, canActivateAppChooser],
1924
2000
  },
1925
2001
  ];
@@ -1927,7 +2003,7 @@ function routesFacory() {
1927
2003
  }
1928
2004
  class AXPAccountModule {
1929
2005
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1930
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, imports: [i1$4.AXPComponentSlotModule] }); }
2006
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, imports: [i1$3.AXPComponentSlotModule] }); }
1931
2007
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, providers: [
1932
2008
  {
1933
2009
  provide: ROUTES,
@@ -2307,7 +2383,7 @@ class AXPIdleLockService {
2307
2383
  this.overlayOpening = true;
2308
2384
  this.locked.set(true);
2309
2385
  try {
2310
- const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-3HJEmCYI.mjs');
2386
+ const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs');
2311
2387
  const panelClasses = ['axm-session-lock-overlay-shell'];
2312
2388
  if (this.platform.isDark()) {
2313
2389
  panelClasses.push('ax-dark');
@@ -2853,7 +2929,8 @@ class AXPUserProfileSecurityInsightsService {
2853
2929
  }
2854
2930
  async buildActiveSessionInsights(sessions) {
2855
2931
  const activeSessions = sessions.filter((session) => String(session.status).toLowerCase() === 'active');
2856
- const currentSession = activeSessions.find((session) => session.isActiveSession) ??
2932
+ const flaggedCurrent = activeSessions.filter((session) => session.isActiveSession === true);
2933
+ const currentSession = (flaggedCurrent.length === 1 ? flaggedCurrent[0] : undefined) ??
2857
2934
  orderBy(activeSessions, [(session) => this.parseValidDate(session.lastLoginDate)?.getTime() ?? 0], ['desc'])[0];
2858
2935
  if (isNil(currentSession)) {
2859
2936
  return [];
@@ -2922,8 +2999,15 @@ class AXPUserProfileSecurityInsightsService {
2922
2999
  const response = await this.entityService
2923
3000
  .withEntity(RootConfig.module.name, RootConfig.entities.deviceSessions.name)
2924
3001
  .data()
2925
- .query({ skip: 0, take: 1000 });
2926
- return (response.items ?? []).filter((item) => item.userId === userId);
3002
+ .query({
3003
+ skip: 0,
3004
+ take: 1000,
3005
+ filter: {
3006
+ logic: 'and',
3007
+ filters: [{ field: 'userId', operator: { type: 'equal' }, value: userId }],
3008
+ },
3009
+ });
3010
+ return response.items ?? [];
2927
3011
  }
2928
3012
  //#endregion
2929
3013
  //#region ---- Formatting ----
@@ -3130,8 +3214,107 @@ const userAvatarCacheRefreshMiddleware = {
3130
3214
  };
3131
3215
  //#endregion
3132
3216
 
3217
+ const TITLE_KEYS = {
3218
+ login_success: '@auth:security-alert.login-success.title',
3219
+ login_failed: '@auth:security-alert.login-failed.title',
3220
+ account_locked: '@auth:security-alert.account-locked.title',
3221
+ logout: '@auth:security-alert.logout.title',
3222
+ };
3223
+ const CONTENT_KEYS = {
3224
+ login_success: '@auth:security-alert.login-success.content',
3225
+ login_failed: '@auth:security-alert.login-failed.content',
3226
+ account_locked: '@auth:security-alert.account-locked.content',
3227
+ logout: '@auth:security-alert.logout.content',
3228
+ };
3229
+ const CONTENT_WITH_DETAIL_KEYS = {
3230
+ login_success: '@auth:security-alert.login-success.content-with-detail',
3231
+ login_failed: '@auth:security-alert.login-failed.content-with-detail',
3232
+ account_locked: '@auth:security-alert.account-locked.content-with-detail',
3233
+ logout: '@auth:security-alert.logout.content-with-detail',
3234
+ };
3235
+ /** Prevents stacking multiple terminate dialogs on duplicate envelopes. */
3236
+ let remoteTerminateDialogOpen = false;
3237
+ async function showAuthSecurityAlertToast(envelope, toast, translate) {
3238
+ const payload = (envelope.payload ?? {});
3239
+ if (!payload.kind || payload.kind === 'session_terminated' || !TITLE_KEYS[payload.kind]) {
3240
+ return;
3241
+ }
3242
+ const detail = [payload.deviceSummary, payload.ipAddress]
3243
+ .map((part) => (part ?? '').trim())
3244
+ .filter(Boolean)
3245
+ .join(' · ') || undefined;
3246
+ // Toast template runs `| translate` — pass @scope keys for title.
3247
+ // Content with {{detail}} must be resolved first (pipe has no params).
3248
+ const title = TITLE_KEYS[payload.kind];
3249
+ const content = detail
3250
+ ? await translate.translateAsync(CONTENT_WITH_DETAIL_KEYS[payload.kind], {
3251
+ params: { detail },
3252
+ })
3253
+ : CONTENT_KEYS[payload.kind];
3254
+ const color = payload.kind === 'login_success' || payload.kind === 'logout' ? 'warning' : 'danger';
3255
+ toast.show({ color, title, content, closeButton: true, timeOut: 8000 });
3256
+ }
3257
+ async function handleRemoteSessionTerminated(sessionService, dialog, router) {
3258
+ const [stillAuthenticated, loading] = await Promise.all([
3259
+ firstValueFrom(sessionService.isAuthenticated$),
3260
+ firstValueFrom(sessionService.isLoading$),
3261
+ ]);
3262
+ // Skip while local sign-out / session bind is in flight (avoids dialog on self-logout).
3263
+ if (!stillAuthenticated || loading || remoteTerminateDialogOpen) {
3264
+ return;
3265
+ }
3266
+ remoteTerminateDialogOpen = true;
3267
+ try {
3268
+ // Backdrop click is disabled by AXDialogService.open — only Okay closes.
3269
+ await dialog.alert('@auth:security-alert.session-terminated.title', '@auth:security-alert.session-terminated.content', 'danger', 'horizontal');
3270
+ const authenticatedAfterAck = await firstValueFrom(sessionService.isAuthenticated$);
3271
+ if (authenticatedAfterAck) {
3272
+ await sessionService.signout();
3273
+ await router.navigate(['/auth/login']);
3274
+ }
3275
+ }
3276
+ finally {
3277
+ remoteTerminateDialogOpen = false;
3278
+ }
3279
+ }
3280
+ /**
3281
+ * Registers toast + remote-terminate handlers via {@link AXP_REALTIME_TOPIC_HANDLER}
3282
+ * so they are wired when the dispatcher is constructed (before Socket.IO connect).
3283
+ */
3284
+ function provideAuthSecurityAlertRealtime() {
3285
+ return [
3286
+ {
3287
+ provide: AXP_REALTIME_TOPIC_HANDLER,
3288
+ multi: true,
3289
+ useFactory: () => {
3290
+ const toast = inject(AXToastService);
3291
+ const translate = inject(AXTranslationService);
3292
+ const dialog = inject(AXDialogService);
3293
+ const sessionService = inject(AXPSessionService);
3294
+ const router = inject(Router);
3295
+ const zone = inject(NgZone);
3296
+ return {
3297
+ topic: AXP_REALTIME_TOPIC_AUTH_SECURITY_ALERT,
3298
+ handle: (envelope) => {
3299
+ // Socket.IO callbacks run outside Angular; dialog/toast need the zone.
3300
+ void zone.run(async () => {
3301
+ const payload = (envelope.payload ?? {});
3302
+ if (payload.kind === 'session_terminated') {
3303
+ await handleRemoteSessionTerminated(sessionService, dialog, router);
3304
+ return;
3305
+ }
3306
+ await showAuthSecurityAlertToast(envelope, toast, translate);
3307
+ });
3308
+ },
3309
+ };
3310
+ },
3311
+ },
3312
+ ];
3313
+ }
3314
+ //#endregion
3315
+
3133
3316
  function profileRoutesFactory() {
3134
- const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-w2SYmCyc.mjs').then((c) => c.AXMUserProfilePageComponent);
3317
+ const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs').then((c) => c.AXMUserProfilePageComponent);
3135
3318
  return [
3136
3319
  {
3137
3320
  path: ':app/profile',
@@ -3159,9 +3342,10 @@ class AXMAuthModule {
3159
3342
  inject(AXPLogoEntitySyncService);
3160
3343
  }
3161
3344
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3162
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$5.AXPCommonModule, i1$6.RouterModule, AXPAccountModule,
3345
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$4.AXPCommonModule, i1$5.RouterModule, AXPAccountModule,
3163
3346
  AXMAuthValidationRulesModule] }); }
3164
3347
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, providers: [
3348
+ ...provideAuthSecurityAlertRealtime(),
3165
3349
  provideAppStartUpTask(() => {
3166
3350
  const sessionService = inject(AXPSessionService);
3167
3351
  const idleLockService = inject(AXPIdleLockService);
@@ -3246,12 +3430,12 @@ class AXMAuthModule {
3246
3430
  }),
3247
3431
  AXMAuthErrorHandler,
3248
3432
  provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
3249
- provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs').then(m => m.AXMSettingProvider)),
3250
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-Bz1mdVCM.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3433
+ provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs').then(m => m.AXMSettingProvider)),
3434
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3251
3435
  provideQuerySetups([
3252
3436
  {
3253
3437
  key: 'Auth:GetUserActivity',
3254
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-D9fyLuBy.mjs').then((c) => c.AXMGetUserActivityQuery),
3438
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
3255
3439
  },
3256
3440
  ]),
3257
3441
  {
@@ -3275,15 +3459,15 @@ class AXMAuthModule {
3275
3459
  },
3276
3460
  {
3277
3461
  key: AXMAuthCommandKeys.Session.OpenSessions,
3278
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-BlPxfa3v.mjs').then((c) => c.AXPOpenSessionsCommand),
3462
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
3279
3463
  },
3280
3464
  {
3281
3465
  key: AXMAuthCommandKeys.Session.LockScreen,
3282
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DUZ255VK.mjs').then((c) => c.AXPLockScreenCommand),
3466
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
3283
3467
  },
3284
3468
  {
3285
3469
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3286
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-DfHUPj7p.mjs').then((c) => c.AXPChangePhotoCommand),
3470
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
3287
3471
  },
3288
3472
  {
3289
3473
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
@@ -3291,19 +3475,19 @@ class AXMAuthModule {
3291
3475
  },
3292
3476
  {
3293
3477
  key: AXMAuthCommandKeys.Security.ChangePassword,
3294
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BcBbN5hX.mjs').then((c) => c.AXPChangePasswordCommand),
3478
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
3295
3479
  },
3296
3480
  {
3297
3481
  key: AXMAuthCommandKeys.Security.SetPinCode,
3298
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-C2kCGuQW.mjs').then((c) => c.AXPSetPinCodeCommand),
3482
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
3299
3483
  },
3300
3484
  {
3301
3485
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3302
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-DJeSHCLL.mjs').then((c) => c.AXPRemovePinCodeCommand),
3486
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
3303
3487
  },
3304
3488
  {
3305
3489
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3306
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-C_T4l61M.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3490
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3307
3491
  },
3308
3492
  {
3309
3493
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3371,6 +3555,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3371
3555
  AXMAuthValidationRulesModule,
3372
3556
  ],
3373
3557
  providers: [
3558
+ ...provideAuthSecurityAlertRealtime(),
3374
3559
  provideAppStartUpTask(() => {
3375
3560
  const sessionService = inject(AXPSessionService);
3376
3561
  const idleLockService = inject(AXPIdleLockService);
@@ -3455,12 +3640,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3455
3640
  }),
3456
3641
  AXMAuthErrorHandler,
3457
3642
  provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
3458
- provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs').then(m => m.AXMSettingProvider)),
3459
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-Bz1mdVCM.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3643
+ provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs').then(m => m.AXMSettingProvider)),
3644
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3460
3645
  provideQuerySetups([
3461
3646
  {
3462
3647
  key: 'Auth:GetUserActivity',
3463
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-D9fyLuBy.mjs').then((c) => c.AXMGetUserActivityQuery),
3648
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
3464
3649
  },
3465
3650
  ]),
3466
3651
  {
@@ -3484,15 +3669,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3484
3669
  },
3485
3670
  {
3486
3671
  key: AXMAuthCommandKeys.Session.OpenSessions,
3487
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-BlPxfa3v.mjs').then((c) => c.AXPOpenSessionsCommand),
3672
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
3488
3673
  },
3489
3674
  {
3490
3675
  key: AXMAuthCommandKeys.Session.LockScreen,
3491
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DUZ255VK.mjs').then((c) => c.AXPLockScreenCommand),
3676
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
3492
3677
  },
3493
3678
  {
3494
3679
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3495
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-DfHUPj7p.mjs').then((c) => c.AXPChangePhotoCommand),
3680
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
3496
3681
  },
3497
3682
  {
3498
3683
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
@@ -3500,19 +3685,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3500
3685
  },
3501
3686
  {
3502
3687
  key: AXMAuthCommandKeys.Security.ChangePassword,
3503
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BcBbN5hX.mjs').then((c) => c.AXPChangePasswordCommand),
3688
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
3504
3689
  },
3505
3690
  {
3506
3691
  key: AXMAuthCommandKeys.Security.SetPinCode,
3507
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-C2kCGuQW.mjs').then((c) => c.AXPSetPinCodeCommand),
3692
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
3508
3693
  },
3509
3694
  {
3510
3695
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3511
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-DJeSHCLL.mjs').then((c) => c.AXPRemovePinCodeCommand),
3696
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
3512
3697
  },
3513
3698
  {
3514
3699
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3515
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-C_T4l61M.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3700
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3516
3701
  },
3517
3702
  {
3518
3703
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3583,7 +3768,7 @@ class AXPLoginExternalProvidersComponent {
3583
3768
  return !!slot && !slot.isEmpty();
3584
3769
  }
3585
3770
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginExternalProvidersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3586
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.8", type: AXPLoginExternalProvidersComponent, isStandalone: true, selector: "axm-login-external-providers", viewQueries: [{ propertyName: "slot", first: true, predicate: AXPComponentSlotDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<axp-component-slot\n class=\"flex flex-col gap-2 w-full mt-0 lg:mt-2\"\n #slot=\"slot\"\n [name]=\"slotName\"\n [host]=\"this\"\n></axp-component-slot>\n", dependencies: [{ kind: "ngmodule", type: AXPComponentSlotModule }, { kind: "directive", type: i1$4.AXPComponentSlotDirective, selector: "axp-component-slot", inputs: ["name", "host", "context"], exportAs: ["slot"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
3771
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.8", type: AXPLoginExternalProvidersComponent, isStandalone: true, selector: "axm-login-external-providers", viewQueries: [{ propertyName: "slot", first: true, predicate: AXPComponentSlotDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<axp-component-slot\n class=\"flex flex-col gap-2 w-full mt-0 lg:mt-2\"\n #slot=\"slot\"\n [name]=\"slotName\"\n [host]=\"this\"\n></axp-component-slot>\n", dependencies: [{ kind: "ngmodule", type: AXPComponentSlotModule }, { kind: "directive", type: i1$3.AXPComponentSlotDirective, selector: "axp-component-slot", inputs: ["name", "host", "context"], exportAs: ["slot"] }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
3587
3772
  }
3588
3773
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginExternalProvidersComponent, decorators: [{
3589
3774
  type: Component,
@@ -3636,4 +3821,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3636
3821
  */
3637
3822
 
3638
3823
  export { resolveDayDateRange as $, AXMUserDeviceSessionsService as A, AXPLoginExternalProvidersComponent as B, CHANGE_PASSWORD_SECTION_ID as C, AXMAuthenticationTypes as D, AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT as E, AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS as F, AUTH_USER_ACTIVITY_DEFAULT_WEEKS as G, AUTH_USER_ACTIVITY_WEEK_PRESETS as H, AXMAuthErrorHandler as I, AXMAuthModule as J, AXMDefaultAuthConfigs as K, AXM_AUTH_CONFIG_TOKEN as L, aggregateDailySessionCounts as M, aggregateHourlySessionCounts as N, buildUserActivityHours as O, PROFILE_PAGE_GROUPS_HOOK as P, buildUserActivityWeeks as Q, canActivateLogin as R, computeUserActivityStats as S, configAuthModule as T, countToActivityLevel as U, extractUserActivityEndDate as V, extractUserActivityStartDate as W, extractUserActivityUserId as X, isUserProfileGroupComponent as Y, isUserProfileSectionsGroupRequested as Z, parseAuthCredentialType as _, PROFILE_PAGE_SECTIONS_HOOK as a, resolveUserActivityHeatmapLayout as a0, PROFILE_PAGE_HEADER_META_HOOK as b, resolveUserProfileSectionContent as c, PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY as d, PROFILE_ACTIVITY_CHART_COMPONENT_KEY as e, PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY as f, resolveDefaultUserActivityDateRange as g, resolveSmartUserActivityDateRange as h, buildUserActivityDataSourceItem as i, AXPIdleLockService as j, AXPUserAvatarSyncService as k, AXPAuthPasswordComplexityService as l, AXPAuthPasswordChangeTrackingService as m, getPasswordComplexityHintKey as n, getPasswordComplexityValidationMessageKey as o, validatePasswordAgainstComplexity as p, buildPasswordLastChangedInsights as q, resolveDefaultUserProfileSectionAction as r, AXPLoginHistoryService as s, AXMAuthPlatformSettingsService as t, AXM_LOGIN_GUARD_TOKEN as u, visibleUserProfileSectionActions as v, AXPTenantChooserListComponent as w, AXPTenantChooserDropdownComponent as x, AXPAppChooserListComponent as y, formatCompactActivityCount as z };
3639
- //# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-CPmffSrQ.mjs.map
3824
+ //# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map