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