@acorex-platform/module-auth-client 0.0.33 → 0.0.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs} +275 -92
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs.map → acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs.map → acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +63 -1
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-auth-client-edit-signature.command-TjOLhvKL.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs.map → acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-login.module-DushGqH6.mjs → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-login.module-DushGqH6.mjs.map → acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs.map → acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-DnQzPUxF.mjs → acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs} +3 -3
- 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
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs +265 -0
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-password.component-CW0t9fEn.mjs.map → acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs → acorex-platform-module-auth-client-password.component-BoWDVby5.mjs} +10 -5
- package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-pin-code.constants-CRsFG7fg.mjs.map +1 -1
- 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
- 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
- package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs.map +1 -1
- 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
- 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
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs} +7 -7
- package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs.map → acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs.map → acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs.map → acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-CcwDb6Wb.mjs → acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs} +3 -3
- 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
- package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-result.component-DWv1hmQR.mjs.map → acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-routes-IX2qmeqU.mjs.map → acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs +195 -0
- package/fesm2022/acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs → acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs} +27 -25
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-show-profile-command-BWoDxIdx.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map} +1 -1
- 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
- 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
- package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs → acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs} +2 -2
- 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
- package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs.map → acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
- package/package.json +2 -2
- package/types/acorex-platform-module-auth-client-contracts.d.ts +30 -2
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs +0 -190
- package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs.map +0 -1
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import * as i1$
|
|
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$
|
|
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$
|
|
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
|
|
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';
|
|
@@ -34,22 +34,23 @@ import { AXListNavigationDirective, AXListNavigationItemDirective, AXListNavigat
|
|
|
34
34
|
import { AXLookupComponent } from '@acorex/components/lookup';
|
|
35
35
|
import * as i2 from '@acorex/components/loading';
|
|
36
36
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
37
|
-
import * as
|
|
37
|
+
import * as i3 from '@acorex/components/skeleton';
|
|
38
38
|
import { AXSkeletonModule } from '@acorex/components/skeleton';
|
|
39
|
-
import * as i5 from '@acorex/core/translation';
|
|
39
|
+
import * as i5$1 from '@acorex/core/translation';
|
|
40
40
|
import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
|
|
41
41
|
import { AXAvatarModule } from '@acorex/components/avatar';
|
|
42
42
|
import { AXImageModule } from '@acorex/components/image';
|
|
43
43
|
import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
44
44
|
import * as i6 from '@acorex/components/search-box';
|
|
45
45
|
import { AXSearchBoxModule } from '@acorex/components/search-box';
|
|
46
|
-
import * as i1$
|
|
46
|
+
import * as i1$2 from '@angular/forms';
|
|
47
47
|
import { FormsModule } from '@angular/forms';
|
|
48
48
|
import { AXToastService } from '@acorex/components/toast';
|
|
49
|
-
import { AXMDeviceSessionsService } from '@acorex-platform/module-security-management-client';
|
|
50
49
|
import { AXOverlayService } from '@acorex/cdk/overlay';
|
|
51
50
|
import { AXPlatform } from '@acorex/core/platform';
|
|
52
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';
|
|
53
54
|
|
|
54
55
|
//#region ---- Hook keys ----
|
|
55
56
|
const PROFILE_PAGE_GROUPS_HOOK = 'profile-page.groups';
|
|
@@ -989,26 +990,26 @@ const routes = [
|
|
|
989
990
|
},
|
|
990
991
|
{
|
|
991
992
|
path: 'unavailable',
|
|
992
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-
|
|
993
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs').then((c) => c.AXMPlatformSettingsUnavailableComponent),
|
|
993
994
|
},
|
|
994
995
|
{
|
|
995
996
|
path: '',
|
|
996
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
997
|
-
loadChildren: () => import('./acorex-platform-module-auth-client-login.module-
|
|
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),
|
|
998
999
|
},
|
|
999
1000
|
{
|
|
1000
1001
|
path: '',
|
|
1001
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
1002
|
-
loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-
|
|
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),
|
|
1003
1004
|
},
|
|
1004
1005
|
{
|
|
1005
1006
|
path: '',
|
|
1006
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
1007
|
-
loadChildren: () => import('./acorex-platform-module-auth-client-routes-
|
|
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),
|
|
1008
1009
|
},
|
|
1009
1010
|
{
|
|
1010
1011
|
path: 'oauth-callback',
|
|
1011
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-
|
|
1012
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs').then((c) => c.AXPOAuthCallbackComponent),
|
|
1012
1013
|
},
|
|
1013
1014
|
{
|
|
1014
1015
|
path: 'account',
|
|
@@ -1017,8 +1018,8 @@ const routes = [
|
|
|
1017
1018
|
},
|
|
1018
1019
|
{
|
|
1019
1020
|
path: '',
|
|
1020
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
1021
|
-
loadChildren: () => import('./acorex-platform-module-auth-client-register.module-
|
|
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),
|
|
1022
1023
|
},
|
|
1023
1024
|
],
|
|
1024
1025
|
},
|
|
@@ -1201,7 +1202,7 @@ class AXPAppChooserListComponent {
|
|
|
1201
1202
|
}
|
|
1202
1203
|
}
|
|
1203
1204
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1204
|
-
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", "
|
|
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 }); }
|
|
1205
1206
|
}
|
|
1206
1207
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, decorators: [{
|
|
1207
1208
|
type: Component,
|
|
@@ -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", "
|
|
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);
|
|
@@ -1398,6 +1411,15 @@ class AXPTenantChooserListComponent {
|
|
|
1398
1411
|
this.tenantChosen.emit();
|
|
1399
1412
|
return this.router.navigate(['/auth/account/app-chooser']);
|
|
1400
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
|
+
}
|
|
1401
1423
|
finally {
|
|
1402
1424
|
this.isChoosing.set(false);
|
|
1403
1425
|
this.choosingId.set(null);
|
|
@@ -1415,7 +1437,7 @@ class AXPTenantChooserListComponent {
|
|
|
1415
1437
|
}
|
|
1416
1438
|
}
|
|
1417
1439
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1418
|
-
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-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} @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$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: "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", "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: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.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 }); }
|
|
1419
1441
|
}
|
|
1420
1442
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, decorators: [{
|
|
1421
1443
|
type: Component,
|
|
@@ -1431,7 +1453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1431
1453
|
AXSearchBoxModule,
|
|
1432
1454
|
AXListNavigationModule,
|
|
1433
1455
|
AXPLogoComponent,
|
|
1434
|
-
], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-
|
|
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" }]
|
|
1435
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 }] }] } });
|
|
1436
1458
|
|
|
1437
1459
|
class AXPTenantChooserDropdownComponent {
|
|
@@ -1448,6 +1470,10 @@ class AXPTenantChooserDropdownComponent {
|
|
|
1448
1470
|
this.tenantPopover = viewChild('tenantPopover', /* @ts-ignore */
|
|
1449
1471
|
...(ngDevMode ? [{ debugName: "tenantPopover" }] : /* istanbul ignore next */ []));
|
|
1450
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
|
|
1451
1477
|
//#region ----- Inputs -----
|
|
1452
1478
|
/**
|
|
1453
1479
|
* When true, renders a plain inline tenant text (no popover).
|
|
@@ -1472,7 +1498,7 @@ class AXPTenantChooserDropdownComponent {
|
|
|
1472
1498
|
void this.router.navigate(['/auth/account/tenant-chooser']);
|
|
1473
1499
|
}
|
|
1474
1500
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1475
|
-
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
|
|
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 }); }
|
|
1476
1502
|
}
|
|
1477
1503
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, decorators: [{
|
|
1478
1504
|
type: Component,
|
|
@@ -1484,7 +1510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1484
1510
|
AXDecoratorModule,
|
|
1485
1511
|
AXSkeletonModule,
|
|
1486
1512
|
AXPTenantChooserListComponent,
|
|
1487
|
-
], 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
|
|
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" }]
|
|
1488
1514
|
}], propDecorators: { tenantPopover: [{ type: i0.ViewChild, args: ['tenantPopover', { isSignal: true }] }], inline: [{
|
|
1489
1515
|
type: Input
|
|
1490
1516
|
}] } });
|
|
@@ -1613,14 +1639,14 @@ class AXMAuthProfileSlotComponent {
|
|
|
1613
1639
|
}
|
|
1614
1640
|
}
|
|
1615
1641
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1616
|
-
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-
|
|
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:
|
|
1617
1643
|
//
|
|
1618
|
-
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", "
|
|
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:
|
|
1619
1645
|
// AXKBDComponent,
|
|
1620
1646
|
// AXKBDItemComponent,
|
|
1621
1647
|
AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "component", type:
|
|
1622
1648
|
//
|
|
1623
|
-
AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type:
|
|
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 }); }
|
|
1624
1650
|
}
|
|
1625
1651
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, decorators: [{
|
|
1626
1652
|
type: Component,
|
|
@@ -1640,7 +1666,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1640
1666
|
AXPUserAvatarComponent,
|
|
1641
1667
|
//
|
|
1642
1668
|
AXPTenantChooserDropdownComponent,
|
|
1643
|
-
], 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-
|
|
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"] }]
|
|
1644
1670
|
}] });
|
|
1645
1671
|
|
|
1646
1672
|
class AXMUserProfileCardSlotComponent {
|
|
@@ -1755,49 +1781,50 @@ class AXMUserDeviceSessionsServiceImp extends AXMUserDeviceSessionsService {
|
|
|
1755
1781
|
this.deviceSessionsDataAccessor = this.entityService
|
|
1756
1782
|
.withEntity(RootConfig.module.name, RootConfig.entities.deviceSessions.name)
|
|
1757
1783
|
.data();
|
|
1758
|
-
this.deviceSessionsService = inject(AXMDeviceSessionsService);
|
|
1759
1784
|
this.settingsService = inject(AXPSettingsService);
|
|
1760
1785
|
this.toastService = inject(AXToastService);
|
|
1761
1786
|
this.translationService = inject(AXTranslationService);
|
|
1762
1787
|
}
|
|
1763
1788
|
//#endregion
|
|
1764
1789
|
async getSessions() {
|
|
1765
|
-
const
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
const response = await this.deviceSessionsDataAccessor.query();
|
|
1770
|
-
return response.items.filter((item) => item.userId === userId &&
|
|
1771
|
-
String(item.status).toLowerCase() === 'active' &&
|
|
1772
|
-
!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']);
|
|
1773
1794
|
}
|
|
1774
1795
|
async getCurrentActiveSessions() {
|
|
1775
|
-
const
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
}
|
|
1779
|
-
const response = await this.deviceSessionsDataAccessor.query();
|
|
1780
|
-
const userSessions = response.items.filter((item) => item.userId === userId && String(item.status).toLowerCase() === 'active');
|
|
1781
|
-
const activeSession = userSessions.find((item) => item.isActiveSession);
|
|
1782
|
-
if (activeSession) {
|
|
1783
|
-
return activeSession;
|
|
1784
|
-
}
|
|
1785
|
-
const mostRecentSession = orderBy(userSessions, [(session) => new Date(session.lastLoginDate).getTime()], ['desc'])[0];
|
|
1786
|
-
if (!mostRecentSession) {
|
|
1796
|
+
const userSessions = await this.loadActiveUserSessions();
|
|
1797
|
+
const activeSession = this.pickCurrentSession(userSessions);
|
|
1798
|
+
if (!activeSession) {
|
|
1787
1799
|
throw new Error('No active session found for current user');
|
|
1788
1800
|
}
|
|
1789
|
-
return
|
|
1801
|
+
return activeSession;
|
|
1790
1802
|
}
|
|
1791
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
|
+
}
|
|
1792
1809
|
await this.deviceSessionsDataAccessor.update(sessionId, {
|
|
1793
|
-
status:
|
|
1810
|
+
status: AXMSessionStatusTypes.revoked,
|
|
1794
1811
|
loggedOutAt: new Date(),
|
|
1795
1812
|
isActiveSession: false,
|
|
1796
1813
|
});
|
|
1797
1814
|
await this.showTerminateSuccessToast();
|
|
1798
1815
|
}
|
|
1799
1816
|
async terminateAllSession() {
|
|
1800
|
-
await this.
|
|
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
|
+
})));
|
|
1801
1828
|
await this.showTerminateSuccessToast();
|
|
1802
1829
|
}
|
|
1803
1830
|
async setInactiveSessionTermination(value) {
|
|
@@ -1805,6 +1832,38 @@ class AXMUserDeviceSessionsServiceImp extends AXMUserDeviceSessionsService {
|
|
|
1805
1832
|
.scope(AXPPlatformScope.User)
|
|
1806
1833
|
.set(AXPAuthSettings.InactiveSessionTermination, value);
|
|
1807
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
|
+
}
|
|
1808
1867
|
async showTerminateSuccessToast() {
|
|
1809
1868
|
const showResult = await this.settingsService.get(AXPCommonSettings.EnableOperationToasts);
|
|
1810
1869
|
if (!showResult) {
|
|
@@ -1851,12 +1910,22 @@ const canActivateTenantChooser = async (_route, _state) => {
|
|
|
1851
1910
|
}
|
|
1852
1911
|
if (tenants.length === 1) {
|
|
1853
1912
|
if (strategy && typeof strategy.updateToken === 'function') {
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
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
|
+
}
|
|
1860
1929
|
}
|
|
1861
1930
|
return true;
|
|
1862
1931
|
}
|
|
@@ -1916,12 +1985,17 @@ function routesFacory() {
|
|
|
1916
1985
|
routes = [
|
|
1917
1986
|
{
|
|
1918
1987
|
path: 'tenant-chooser',
|
|
1919
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-
|
|
1988
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs').then((c) => c.AXPAuthTenantChooserComponent),
|
|
1920
1989
|
canActivate: [AXPAuthGuard, canActivateTenantChooser],
|
|
1921
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
|
+
},
|
|
1922
1996
|
{
|
|
1923
1997
|
path: 'app-chooser',
|
|
1924
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-
|
|
1998
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs').then((c) => c.AXPAuthAppChooserComponent),
|
|
1925
1999
|
canActivate: [AXPAuthGuard, canActivateAppChooser],
|
|
1926
2000
|
},
|
|
1927
2001
|
];
|
|
@@ -1929,7 +2003,7 @@ function routesFacory() {
|
|
|
1929
2003
|
}
|
|
1930
2004
|
class AXPAccountModule {
|
|
1931
2005
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1932
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, imports: [i1$
|
|
2006
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, imports: [i1$3.AXPComponentSlotModule] }); }
|
|
1933
2007
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAccountModule, providers: [
|
|
1934
2008
|
{
|
|
1935
2009
|
provide: ROUTES,
|
|
@@ -2309,7 +2383,7 @@ class AXPIdleLockService {
|
|
|
2309
2383
|
this.overlayOpening = true;
|
|
2310
2384
|
this.locked.set(true);
|
|
2311
2385
|
try {
|
|
2312
|
-
const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-
|
|
2386
|
+
const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs');
|
|
2313
2387
|
const panelClasses = ['axm-session-lock-overlay-shell'];
|
|
2314
2388
|
if (this.platform.isDark()) {
|
|
2315
2389
|
panelClasses.push('ax-dark');
|
|
@@ -2855,7 +2929,8 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2855
2929
|
}
|
|
2856
2930
|
async buildActiveSessionInsights(sessions) {
|
|
2857
2931
|
const activeSessions = sessions.filter((session) => String(session.status).toLowerCase() === 'active');
|
|
2858
|
-
const
|
|
2932
|
+
const flaggedCurrent = activeSessions.filter((session) => session.isActiveSession === true);
|
|
2933
|
+
const currentSession = (flaggedCurrent.length === 1 ? flaggedCurrent[0] : undefined) ??
|
|
2859
2934
|
orderBy(activeSessions, [(session) => this.parseValidDate(session.lastLoginDate)?.getTime() ?? 0], ['desc'])[0];
|
|
2860
2935
|
if (isNil(currentSession)) {
|
|
2861
2936
|
return [];
|
|
@@ -2924,8 +2999,15 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2924
2999
|
const response = await this.entityService
|
|
2925
3000
|
.withEntity(RootConfig.module.name, RootConfig.entities.deviceSessions.name)
|
|
2926
3001
|
.data()
|
|
2927
|
-
.query({
|
|
2928
|
-
|
|
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 ?? [];
|
|
2929
3011
|
}
|
|
2930
3012
|
//#endregion
|
|
2931
3013
|
//#region ---- Formatting ----
|
|
@@ -3132,8 +3214,107 @@ const userAvatarCacheRefreshMiddleware = {
|
|
|
3132
3214
|
};
|
|
3133
3215
|
//#endregion
|
|
3134
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
|
+
|
|
3135
3316
|
function profileRoutesFactory() {
|
|
3136
|
-
const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-
|
|
3317
|
+
const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs').then((c) => c.AXMUserProfilePageComponent);
|
|
3137
3318
|
return [
|
|
3138
3319
|
{
|
|
3139
3320
|
path: ':app/profile',
|
|
@@ -3161,9 +3342,10 @@ class AXMAuthModule {
|
|
|
3161
3342
|
inject(AXPLogoEntitySyncService);
|
|
3162
3343
|
}
|
|
3163
3344
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
3164
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$
|
|
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,
|
|
3165
3346
|
AXMAuthValidationRulesModule] }); }
|
|
3166
3347
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, providers: [
|
|
3348
|
+
...provideAuthSecurityAlertRealtime(),
|
|
3167
3349
|
provideAppStartUpTask(() => {
|
|
3168
3350
|
const sessionService = inject(AXPSessionService);
|
|
3169
3351
|
const idleLockService = inject(AXPIdleLockService);
|
|
@@ -3248,12 +3430,12 @@ class AXMAuthModule {
|
|
|
3248
3430
|
}),
|
|
3249
3431
|
AXMAuthErrorHandler,
|
|
3250
3432
|
provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
|
|
3251
|
-
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-
|
|
3252
|
-
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-
|
|
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)),
|
|
3253
3435
|
provideQuerySetups([
|
|
3254
3436
|
{
|
|
3255
3437
|
key: 'Auth:GetUserActivity',
|
|
3256
|
-
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-
|
|
3438
|
+
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
|
|
3257
3439
|
},
|
|
3258
3440
|
]),
|
|
3259
3441
|
{
|
|
@@ -3277,15 +3459,15 @@ class AXMAuthModule {
|
|
|
3277
3459
|
},
|
|
3278
3460
|
{
|
|
3279
3461
|
key: AXMAuthCommandKeys.Session.OpenSessions,
|
|
3280
|
-
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-
|
|
3462
|
+
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
|
|
3281
3463
|
},
|
|
3282
3464
|
{
|
|
3283
3465
|
key: AXMAuthCommandKeys.Session.LockScreen,
|
|
3284
|
-
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-
|
|
3466
|
+
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
|
|
3285
3467
|
},
|
|
3286
3468
|
{
|
|
3287
3469
|
key: AXMAuthCommandKeys.Profile.ChangePhoto,
|
|
3288
|
-
command: () => import('./acorex-platform-module-auth-client-change-photo.command-
|
|
3470
|
+
command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
|
|
3289
3471
|
},
|
|
3290
3472
|
{
|
|
3291
3473
|
key: AXMAuthCommandKeys.Profile.EditAccountInfo,
|
|
@@ -3293,19 +3475,19 @@ class AXMAuthModule {
|
|
|
3293
3475
|
},
|
|
3294
3476
|
{
|
|
3295
3477
|
key: AXMAuthCommandKeys.Security.ChangePassword,
|
|
3296
|
-
command: () => import('./acorex-platform-module-auth-client-change-password.command-
|
|
3478
|
+
command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
|
|
3297
3479
|
},
|
|
3298
3480
|
{
|
|
3299
3481
|
key: AXMAuthCommandKeys.Security.SetPinCode,
|
|
3300
|
-
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-
|
|
3482
|
+
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
|
|
3301
3483
|
},
|
|
3302
3484
|
{
|
|
3303
3485
|
key: AXMAuthCommandKeys.Security.RemovePinCode,
|
|
3304
|
-
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-
|
|
3486
|
+
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
|
|
3305
3487
|
},
|
|
3306
3488
|
{
|
|
3307
3489
|
key: AXMAuthCommandKeys.Security.ViewLoginHistory,
|
|
3308
|
-
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-
|
|
3490
|
+
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
|
|
3309
3491
|
},
|
|
3310
3492
|
{
|
|
3311
3493
|
key: AXMAuthCommandKeys.Security.EditSignature,
|
|
@@ -3373,6 +3555,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3373
3555
|
AXMAuthValidationRulesModule,
|
|
3374
3556
|
],
|
|
3375
3557
|
providers: [
|
|
3558
|
+
...provideAuthSecurityAlertRealtime(),
|
|
3376
3559
|
provideAppStartUpTask(() => {
|
|
3377
3560
|
const sessionService = inject(AXPSessionService);
|
|
3378
3561
|
const idleLockService = inject(AXPIdleLockService);
|
|
@@ -3457,12 +3640,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3457
3640
|
}),
|
|
3458
3641
|
AXMAuthErrorHandler,
|
|
3459
3642
|
provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
|
|
3460
|
-
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-
|
|
3461
|
-
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-
|
|
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)),
|
|
3462
3645
|
provideQuerySetups([
|
|
3463
3646
|
{
|
|
3464
3647
|
key: 'Auth:GetUserActivity',
|
|
3465
|
-
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-
|
|
3648
|
+
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs').then((c) => c.AXMGetUserActivityQuery),
|
|
3466
3649
|
},
|
|
3467
3650
|
]),
|
|
3468
3651
|
{
|
|
@@ -3486,15 +3669,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3486
3669
|
},
|
|
3487
3670
|
{
|
|
3488
3671
|
key: AXMAuthCommandKeys.Session.OpenSessions,
|
|
3489
|
-
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-
|
|
3672
|
+
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs').then((c) => c.AXPOpenSessionsCommand),
|
|
3490
3673
|
},
|
|
3491
3674
|
{
|
|
3492
3675
|
key: AXMAuthCommandKeys.Session.LockScreen,
|
|
3493
|
-
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-
|
|
3676
|
+
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs').then((c) => c.AXPLockScreenCommand),
|
|
3494
3677
|
},
|
|
3495
3678
|
{
|
|
3496
3679
|
key: AXMAuthCommandKeys.Profile.ChangePhoto,
|
|
3497
|
-
command: () => import('./acorex-platform-module-auth-client-change-photo.command-
|
|
3680
|
+
command: () => import('./acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs').then((c) => c.AXPChangePhotoCommand),
|
|
3498
3681
|
},
|
|
3499
3682
|
{
|
|
3500
3683
|
key: AXMAuthCommandKeys.Profile.EditAccountInfo,
|
|
@@ -3502,19 +3685,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3502
3685
|
},
|
|
3503
3686
|
{
|
|
3504
3687
|
key: AXMAuthCommandKeys.Security.ChangePassword,
|
|
3505
|
-
command: () => import('./acorex-platform-module-auth-client-change-password.command-
|
|
3688
|
+
command: () => import('./acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs').then((c) => c.AXPChangePasswordCommand),
|
|
3506
3689
|
},
|
|
3507
3690
|
{
|
|
3508
3691
|
key: AXMAuthCommandKeys.Security.SetPinCode,
|
|
3509
|
-
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-
|
|
3692
|
+
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs').then((c) => c.AXPSetPinCodeCommand),
|
|
3510
3693
|
},
|
|
3511
3694
|
{
|
|
3512
3695
|
key: AXMAuthCommandKeys.Security.RemovePinCode,
|
|
3513
|
-
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-
|
|
3696
|
+
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs').then((c) => c.AXPRemovePinCodeCommand),
|
|
3514
3697
|
},
|
|
3515
3698
|
{
|
|
3516
3699
|
key: AXMAuthCommandKeys.Security.ViewLoginHistory,
|
|
3517
|
-
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-
|
|
3700
|
+
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs').then((c) => c.AXPViewLoginHistoryCommand),
|
|
3518
3701
|
},
|
|
3519
3702
|
{
|
|
3520
3703
|
key: AXMAuthCommandKeys.Security.EditSignature,
|
|
@@ -3585,7 +3768,7 @@ class AXPLoginExternalProvidersComponent {
|
|
|
3585
3768
|
return !!slot && !slot.isEmpty();
|
|
3586
3769
|
}
|
|
3587
3770
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginExternalProvidersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3588
|
-
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$
|
|
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 }); }
|
|
3589
3772
|
}
|
|
3590
3773
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPLoginExternalProvidersComponent, decorators: [{
|
|
3591
3774
|
type: Component,
|
|
@@ -3638,4 +3821,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3638
3821
|
*/
|
|
3639
3822
|
|
|
3640
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 };
|
|
3641
|
-
//# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-
|
|
3824
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map
|