@acorex-platform/module-auth-client 0.0.38 → 0.0.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/acorex-platform-module-auth-client-accept-invitation.component-Ct28GG3a.mjs +179 -0
- package/fesm2022/acorex-platform-module-auth-client-accept-invitation.component-Ct28GG3a.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs} +1150 -107
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs → acorex-platform-module-auth-client-app-chooser.component-CxYe1hmk.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CxYe1hmk.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs → acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs} +3 -3
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs → acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map → acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs → acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs} +71 -21
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs +69 -0
- package/fesm2022/acorex-platform-module-auth-client-command-return-url.util-mBmtJ7T2.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-contracts.mjs +12 -7
- 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 → acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs} +25 -4
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs → acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-B1bKcSVQ.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs → acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map → acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs → acorex-platform-module-auth-client-login.module-DasQfX02.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map → acorex-platform-module-auth-client-login.module-DasQfX02.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs +445 -0
- package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs → acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map → acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs → acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-oauth-callback.component-fdWC08nA.mjs.map → acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs → acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map → acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs +28 -0
- package/fesm2022/acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-password.component-BE2JkYm_.mjs.map → acorex-platform-module-auth-client-password.component-Ci5Wy3rO.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-password.component-BoWDVby5.mjs → acorex-platform-module-auth-client-password.component-CkUMxpZm.mjs} +39 -9
- package/fesm2022/acorex-platform-module-auth-client-password.component-CkUMxpZm.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs → acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-platform-settings-unavailable.component-BJMtsa99.mjs.map → acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-DTfyVXWu.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-CFaRGMKu.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-DTfyVXWu.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-DWNbDzDd.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-Dx2-o9XL.mjs.map → acorex-platform-module-auth-client-profile-delete-account-danger-zone.component-DWNbDzDd.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs → acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-1Spuexhb.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs → acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs} +9 -7
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs +84 -0
- package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs → acorex-platform-module-auth-client-register-password.component-C_Vu3KS-.mjs} +7 -7
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map → acorex-platform-module-auth-client-register-password.component-C_Vu3KS-.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs → acorex-platform-module-auth-client-register.module-KlxTQevf.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map → acorex-platform-module-auth-client-register.module-KlxTQevf.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs → acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-Da7ryul6.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs → acorex-platform-module-auth-client-reset-password.component-BQfKSqpW.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-auth-client-reset-password.component-D0nxlhJm.mjs.map → acorex-platform-module-auth-client-reset-password.component-BQfKSqpW.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-result.component-Bo1QkwMu.mjs.map → acorex-platform-module-auth-client-result.component-PhPaEAgh.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs +17 -0
- package/fesm2022/acorex-platform-module-auth-client-routes-90eFjxx8.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs → acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-session-limit.component-DH58dRba.mjs.map → acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-CJJmgXqu.mjs} +7 -7
- package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-cDCrwNRV.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-CJJmgXqu.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs → acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-FjM1kzUj.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs → acorex-platform-module-auth-client-set-pin-code.component-DFzKiM1U.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-BgEgdFxQ.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-DFzKiM1U.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs → acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs} +18 -13
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs → acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs} +7 -1
- package/fesm2022/acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs → acorex-platform-module-auth-client-tenant-chooser.component-HqU75mfO.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-HqU75mfO.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs +48 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-challenge.storage-mi0UD7Sc.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CfZo5Jl0.mjs +200 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CfZo5Jl0.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs → acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs} +10 -5
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs → acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-Cqb27L-l.mjs.map → acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs +165 -0
- package/fesm2022/acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs +813 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs +59 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs.map +1 -0
- 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 +13 -3
- package/types/acorex-platform-module-auth-client.d.ts +60 -2
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CRl74b8g.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-blank.layout-BCXNPgrp.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-edit-account-info.command-CD9IrimO.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-password.component-BoWDVby5.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs +0 -13
- package/fesm2022/acorex-platform-module-auth-client-routes-B6iJHJ60.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-settings.provider-DGiK-MmW.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-signout-command-B7n_Fn4P.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs +0 -40
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-BrqfaY8i.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs.map +0 -1
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
import * as i1$4 from '@acorex-platform/framework-client/common';
|
|
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';
|
|
2
|
+
import { AXPFileStorageService, AXPHomePageService, AXPPlatformSettingsLoadState, AXPSettingsService, AXPDataProvider, AXPCommonSettings, AXPSettingDefinitionProviderService, AXP_PROTECTED_ROUTE_GUARDS, AXPCommonModule, AXPPlatformSettingsOfflineBootstrapService, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/common';
|
|
3
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
|
-
import { AXPFileStorageStatus, coerceUnknownToTrimmedString, AXPPlatformScope, AXPKeyboardShortcutPriority, verifyPassword } from '@acorex-platform/framework-shared/core';
|
|
6
|
-
import { RootConfig, AXMSessionStatusTypes, AXPSecurityManagementFeatureKeys } from '@acorex-platform/module-security-management-client/contracts';
|
|
5
|
+
import { AXPFileStorageStatus, coerceUnknownToTrimmedString, AXPPlatformScope, AXPKeyboardShortcutPriority, AXPRegionalSetting, verifyPassword, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';
|
|
6
|
+
import { RootConfig, AXMSessionStatusTypes, AXPSecurityManagementFeatureKeys, AXMSecurityManagementServerCommands } 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
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
|
-
import { AXPLayoutThemeService, AXPMenuVerticalMode } from '@acorex-platform/framework-client/themes/shared';
|
|
10
|
+
import { AXPLayoutThemeService, AXPMenuVerticalMode, AXPThemeLayoutSetting } from '@acorex-platform/framework-client/themes/shared';
|
|
11
11
|
import { HttpErrorResponse } from '@angular/common/http';
|
|
12
|
-
import * as
|
|
12
|
+
import * as i6$1 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
18
|
import * as i1$3 from '@acorex-platform/framework-client/core';
|
|
19
|
-
import { axpApplicationLogoKey, AXPEntityLogoRegistrationService, AXPLogoComponent, axpTenantLogoKey, AXPHookService, AXPKeyboardShortcutRegistry, chordToKbdItemKeys, getPrimaryKeyboardShortcutChord, normalizeKeyboardShortcuts,
|
|
19
|
+
import { axpApplicationLogoKey, AXPEntityLogoRegistrationService, AXPLogoComponent, axpTenantLogoKey, AXPHookService, AXPKeyboardShortcutRegistry, AXPDeviceService, chordToKbdItemKeys, getPrimaryKeyboardShortcutChord, normalizeKeyboardShortcuts, AXPComponentSlotModule, AXPAppStartUpService, AXP_APP_STARTUP_PRIORITY, AXP_HOOK_PROVIDER, provideAppStartUpTask, 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 i3$1 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';
|
|
26
26
|
import { AXButtonModule } from '@acorex/components/button';
|
|
27
|
-
import * as
|
|
27
|
+
import * as i2$2 from '@acorex/components/decorators';
|
|
28
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';
|
|
@@ -36,7 +36,7 @@ import * as i2 from '@acorex/components/loading';
|
|
|
36
36
|
import { AXLoadingModule } from '@acorex/components/loading';
|
|
37
37
|
import * as i3 from '@acorex/components/skeleton';
|
|
38
38
|
import { AXSkeletonModule } from '@acorex/components/skeleton';
|
|
39
|
-
import * as i5
|
|
39
|
+
import * as i5 from '@acorex/core/translation';
|
|
40
40
|
import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
|
|
41
41
|
import { AXAvatarModule } from '@acorex/components/avatar';
|
|
42
42
|
import { AXImageModule } from '@acorex/components/image';
|
|
@@ -46,6 +46,7 @@ import { AXSearchBoxModule } from '@acorex/components/search-box';
|
|
|
46
46
|
import * as i1$2 from '@angular/forms';
|
|
47
47
|
import { FormsModule } from '@angular/forms';
|
|
48
48
|
import { AXToastService } from '@acorex/components/toast';
|
|
49
|
+
import { AXPLayoutBuilderService } from '@acorex-platform/framework-client/layout/builder';
|
|
49
50
|
import { AXOverlayService } from '@acorex/cdk/overlay';
|
|
50
51
|
import { AXPlatform } from '@acorex/core/platform';
|
|
51
52
|
import { PRESENCE_SET_AVAILABILITY } from '@acorex-platform/framework-shared/runtime';
|
|
@@ -990,36 +991,46 @@ const routes = [
|
|
|
990
991
|
},
|
|
991
992
|
{
|
|
992
993
|
path: 'unavailable',
|
|
993
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-
|
|
994
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-platform-settings-unavailable.component-LwuokJiZ.mjs').then((c) => c.AXMPlatformSettingsUnavailableComponent),
|
|
994
995
|
},
|
|
995
996
|
{
|
|
996
997
|
path: '',
|
|
997
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
998
|
-
|
|
998
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
999
|
+
children: [
|
|
1000
|
+
{
|
|
1001
|
+
path: 'install',
|
|
1002
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-pwa-install.component-DnDHvNsF.mjs').then((c) => c.AXMPwaInstallComponent),
|
|
1003
|
+
},
|
|
1004
|
+
],
|
|
999
1005
|
},
|
|
1000
1006
|
{
|
|
1001
1007
|
path: '',
|
|
1002
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
1003
|
-
loadChildren: () => import('./acorex-platform-module-auth-client-
|
|
1008
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
1009
|
+
loadChildren: () => import('./acorex-platform-module-auth-client-login.module-DasQfX02.mjs').then((c) => c.AXPSignInModule),
|
|
1004
1010
|
},
|
|
1005
1011
|
{
|
|
1006
1012
|
path: '',
|
|
1007
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
1008
|
-
loadChildren: () => import('./acorex-platform-module-auth-client-
|
|
1013
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
1014
|
+
loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-DoghMqeQ.mjs').then((c) => c.AXPTwoFactorModule),
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
path: '',
|
|
1018
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
1019
|
+
loadChildren: () => import('./acorex-platform-module-auth-client-routes-90eFjxx8.mjs').then((c) => c),
|
|
1009
1020
|
},
|
|
1010
1021
|
{
|
|
1011
1022
|
path: 'oauth-callback',
|
|
1012
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-
|
|
1023
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-oauth-callback.component-DWnljN18.mjs').then((c) => c.AXPOAuthCallbackComponent),
|
|
1013
1024
|
},
|
|
1014
1025
|
{
|
|
1015
1026
|
path: 'account',
|
|
1016
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-blank.layout-
|
|
1027
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-blank.layout-xSXPWxyw.mjs').then((c) => c.AXPAuthBlankLayoutComponent),
|
|
1017
1028
|
loadChildren: () => Promise.resolve().then(function () { return account_module; }).then((c) => c.AXPAccountModule),
|
|
1018
1029
|
},
|
|
1019
1030
|
{
|
|
1020
1031
|
path: '',
|
|
1021
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-
|
|
1022
|
-
loadChildren: () => import('./acorex-platform-module-auth-client-register.module-
|
|
1032
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-hYj9JwHA.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
1033
|
+
loadChildren: () => import('./acorex-platform-module-auth-client-register.module-KlxTQevf.mjs').then((c) => c.AXPRegisterModule),
|
|
1023
1034
|
},
|
|
1024
1035
|
],
|
|
1025
1036
|
},
|
|
@@ -1202,7 +1213,7 @@ class AXPAppChooserListComponent {
|
|
|
1202
1213
|
}
|
|
1203
1214
|
}
|
|
1204
1215
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
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:
|
|
1216
|
+
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: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1206
1217
|
}
|
|
1207
1218
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, decorators: [{
|
|
1208
1219
|
type: Component,
|
|
@@ -1231,7 +1242,7 @@ class AXMAppChooserSlotComponent {
|
|
|
1231
1242
|
this.appPopover()?.close();
|
|
1232
1243
|
}
|
|
1233
1244
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
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:
|
|
1245
|
+
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", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list", inputs: ["simple"], outputs: ["applicationChosen", "loadingChange"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
1235
1246
|
}
|
|
1236
1247
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, decorators: [{
|
|
1237
1248
|
type: Component,
|
|
@@ -1437,7 +1448,7 @@ class AXPTenantChooserListComponent {
|
|
|
1437
1448
|
}
|
|
1438
1449
|
}
|
|
1439
1450
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
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 }); }
|
|
1451
|
+
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: i2$2.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: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1441
1452
|
}
|
|
1442
1453
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, decorators: [{
|
|
1443
1454
|
type: Component,
|
|
@@ -1472,7 +1483,7 @@ class AXPTenantChooserDropdownComponent {
|
|
|
1472
1483
|
//#endregion
|
|
1473
1484
|
//#region ----- Constants -----
|
|
1474
1485
|
/** Shared panel size so sidebar and header tenant popovers match. */
|
|
1475
|
-
this.popupPanelClass = 'bg-lightest
|
|
1486
|
+
this.popupPanelClass = 'bg-lightest overflow-hidden rounded-md shadow-md w-full p-1';
|
|
1476
1487
|
//#endregion
|
|
1477
1488
|
//#region ----- Inputs -----
|
|
1478
1489
|
/**
|
|
@@ -1498,19 +1509,11 @@ class AXPTenantChooserDropdownComponent {
|
|
|
1498
1509
|
void this.router.navigate(['/auth/account/tenant-chooser']);
|
|
1499
1510
|
}
|
|
1500
1511
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
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:
|
|
1512
|
+
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", "closeOnNavigation", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.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: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
1502
1513
|
}
|
|
1503
1514
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, decorators: [{
|
|
1504
1515
|
type: Component,
|
|
1505
|
-
args: [{ selector: 'axp-tenant-chooser-dropdown', changeDetection: ChangeDetectionStrategy.Eager, imports: [
|
|
1506
|
-
CommonModule,
|
|
1507
|
-
AXTranslationModule,
|
|
1508
|
-
AXButtonModule,
|
|
1509
|
-
AXPopoverModule,
|
|
1510
|
-
AXDecoratorModule,
|
|
1511
|
-
AXSkeletonModule,
|
|
1512
|
-
AXPTenantChooserListComponent,
|
|
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" }]
|
|
1516
|
+
args: [{ selector: 'axp-tenant-chooser-dropdown', changeDetection: ChangeDetectionStrategy.Eager, imports: [CommonModule, AXTranslationModule, AXButtonModule, AXPopoverModule, AXDecoratorModule, AXSkeletonModule, AXPTenantChooserListComponent], 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" }]
|
|
1514
1517
|
}], propDecorators: { tenantPopover: [{ type: i0.ViewChild, args: ['tenantPopover', { isSignal: true }] }], inline: [{
|
|
1515
1518
|
type: Input
|
|
1516
1519
|
}] } });
|
|
@@ -1536,6 +1539,7 @@ class AXMAuthProfileSlotComponent {
|
|
|
1536
1539
|
this.shortcutRegistry = inject(AXPKeyboardShortcutRegistry);
|
|
1537
1540
|
this.settingsService = inject(AXPSettingsService);
|
|
1538
1541
|
this.destroyRef = inject(DestroyRef);
|
|
1542
|
+
this.deviceService = inject(AXPDeviceService);
|
|
1539
1543
|
//#endregion
|
|
1540
1544
|
//#region ---- State ----
|
|
1541
1545
|
this.isDarkMode = this.themeService.isDarkMode;
|
|
@@ -1639,14 +1643,14 @@ class AXMAuthProfileSlotComponent {
|
|
|
1639
1643
|
}
|
|
1640
1644
|
}
|
|
1641
1645
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
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:
|
|
1646
|
+
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 @if (!deviceService.isSmall()) {\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n }\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:
|
|
1643
1647
|
//
|
|
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:
|
|
1648
|
+
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", "closeOnNavigation", "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: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type:
|
|
1645
1649
|
// AXKBDComponent,
|
|
1646
1650
|
// AXKBDItemComponent,
|
|
1647
1651
|
AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "component", type:
|
|
1648
1652
|
//
|
|
1649
|
-
AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type:
|
|
1653
|
+
AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type: i3$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
1650
1654
|
}
|
|
1651
1655
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, decorators: [{
|
|
1652
1656
|
type: Component,
|
|
@@ -1666,7 +1670,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1666
1670
|
AXPUserAvatarComponent,
|
|
1667
1671
|
//
|
|
1668
1672
|
AXPTenantChooserDropdownComponent,
|
|
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"] }]
|
|
1673
|
+
], 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 @if (!deviceService.isSmall()) {\n <axp-tenant-chooser-dropdown class=\"mt-1\"></axp-tenant-chooser-dropdown>\n }\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"] }]
|
|
1670
1674
|
}] });
|
|
1671
1675
|
|
|
1672
1676
|
class AXMUserProfileCardSlotComponent {
|
|
@@ -1681,6 +1685,9 @@ class AXMUserProfileCardSlotComponent {
|
|
|
1681
1685
|
return this.themeStore.effectiveMenuVerticalMode() === AXPMenuVerticalMode.Compact;
|
|
1682
1686
|
}, /* @ts-ignore */
|
|
1683
1687
|
...(ngDevMode ? [{ debugName: "isCompactMode" }] : /* istanbul ignore next */ []));
|
|
1688
|
+
/** Compact rail: match mark size; full menu keeps the larger profile avatar. */
|
|
1689
|
+
this.avatarSize = computed(() => (this.isCompactMode() ? 28 : 48), /* @ts-ignore */
|
|
1690
|
+
...(ngDevMode ? [{ debugName: "avatarSize" }] : /* istanbul ignore next */ []));
|
|
1684
1691
|
this.isMenuDark = computed(() => this.themeStore.menuDarkEnabled() ||
|
|
1685
1692
|
(this.themeStore.menuAppearance() === 'brand-light' &&
|
|
1686
1693
|
this.themeStore.isDarkMode()), /* @ts-ignore */
|
|
@@ -1711,6 +1718,10 @@ class AXMUserProfileCardSlotComponent {
|
|
|
1711
1718
|
}
|
|
1712
1719
|
async logOut() {
|
|
1713
1720
|
await this.sessionService.signout();
|
|
1721
|
+
const path = (this.router.url ?? '').split('?')[0];
|
|
1722
|
+
if (!path.startsWith('/auth')) {
|
|
1723
|
+
await this.router.navigateByUrl('/auth/login', { replaceUrl: true });
|
|
1724
|
+
}
|
|
1714
1725
|
}
|
|
1715
1726
|
toggleProfileMenu() {
|
|
1716
1727
|
this.profilePopover.open();
|
|
@@ -1742,9 +1753,9 @@ class AXMUserProfileCardSlotComponent {
|
|
|
1742
1753
|
}
|
|
1743
1754
|
}
|
|
1744
1755
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserProfileCardSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1745
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMUserProfileCardSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "profilePopover", first: true, predicate: ["profilePopover"], descendants: true }], ngImport: i0, template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"
|
|
1756
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMUserProfileCardSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "profilePopover", first: true, predicate: ["profilePopover"], descendants: true }], ngImport: i0, template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"flex items-center gap-1 border-b\"\n [class.p-3]=\"!isCompactMode()\"\n [class.py-2]=\"isCompactMode()\"\n [class.px-0]=\"isCompactMode()\"\n [class.border-white/7]=\"isMenuDark()\"\n [class.border-black/7]=\"!isMenuDark()\"\n [class.justify-center]=\"isCompactMode()\"\n>\n <div #avatar>\n <axp-user-avatar\n [size]=\"avatarSize()\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n </div>\n @if (!isCompactMode()) {\n <div class=\"flex flex-col\">\n <ax-title class=\"text-sm font-medium px-3\">{{ (user$ | async)?.title }}</ax-title>\n <axp-tenant-chooser-dropdown [inline]=\"true\" />\n </div>\n }\n</div>\n}\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
|
|
1746
1757
|
//
|
|
1747
|
-
AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type:
|
|
1758
|
+
AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.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: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type:
|
|
1748
1759
|
//
|
|
1749
1760
|
AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
|
|
1750
1761
|
}
|
|
@@ -1764,12 +1775,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
1764
1775
|
AXPTenantChooserDropdownComponent,
|
|
1765
1776
|
AsyncPipe,
|
|
1766
1777
|
AXPUserAvatarComponent,
|
|
1767
|
-
], template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"
|
|
1778
|
+
], template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"flex items-center gap-1 border-b\"\n [class.p-3]=\"!isCompactMode()\"\n [class.py-2]=\"isCompactMode()\"\n [class.px-0]=\"isCompactMode()\"\n [class.border-white/7]=\"isMenuDark()\"\n [class.border-black/7]=\"!isMenuDark()\"\n [class.justify-center]=\"isCompactMode()\"\n>\n <div #avatar>\n <axp-user-avatar\n [size]=\"avatarSize()\"\n [userId]=\"$safeNavigationMigration((user$ | async)?.id)!\"\n [showPresence]=\"false\"\n ></axp-user-avatar>\n </div>\n @if (!isCompactMode()) {\n <div class=\"flex flex-col\">\n <ax-title class=\"text-sm font-medium px-3\">{{ (user$ | async)?.title }}</ax-title>\n <axp-tenant-chooser-dropdown [inline]=\"true\" />\n </div>\n }\n</div>\n}\n" }]
|
|
1768
1779
|
}], ctorParameters: () => [], propDecorators: { profilePopover: [{
|
|
1769
1780
|
type: ViewChild,
|
|
1770
1781
|
args: ['profilePopover']
|
|
1771
1782
|
}] } });
|
|
1772
1783
|
|
|
1784
|
+
//#region ----- Imports -----
|
|
1785
|
+
//#endregion
|
|
1786
|
+
//#region ----- PWA install -----
|
|
1787
|
+
/**
|
|
1788
|
+
* Captures Chromium `beforeinstallprompt` as soon as startup runs, so the install
|
|
1789
|
+
* page still has a deferred prompt if the event fired before navigation.
|
|
1790
|
+
*/
|
|
1791
|
+
class AXPPwaInstallService {
|
|
1792
|
+
constructor() {
|
|
1793
|
+
//#region ----- Services & Dependencies -----
|
|
1794
|
+
this.destroyRef = inject(DestroyRef);
|
|
1795
|
+
//#endregion
|
|
1796
|
+
//#region ----- State Signals -----
|
|
1797
|
+
this.installedSignal = signal(false, /* @ts-ignore */
|
|
1798
|
+
...(ngDevMode ? [{ debugName: "installedSignal" }] : /* istanbul ignore next */ []));
|
|
1799
|
+
this.canPromptSignal = signal(false, /* @ts-ignore */
|
|
1800
|
+
...(ngDevMode ? [{ debugName: "canPromptSignal" }] : /* istanbul ignore next */ []));
|
|
1801
|
+
this.iosSignal = signal(false, /* @ts-ignore */
|
|
1802
|
+
...(ngDevMode ? [{ debugName: "iosSignal" }] : /* istanbul ignore next */ []));
|
|
1803
|
+
this.dismissedSignal = signal(readPromptDismissed(), /* @ts-ignore */
|
|
1804
|
+
...(ngDevMode ? [{ debugName: "dismissedSignal" }] : /* istanbul ignore next */ []));
|
|
1805
|
+
this.deferredPrompt = null;
|
|
1806
|
+
this.started = false;
|
|
1807
|
+
this.installed = this.installedSignal.asReadonly();
|
|
1808
|
+
this.canPrompt = this.canPromptSignal.asReadonly();
|
|
1809
|
+
this.ios = this.iosSignal.asReadonly();
|
|
1810
|
+
this.dismissed = this.dismissedSignal.asReadonly();
|
|
1811
|
+
this.showPrompt = computed(() => !this.installedSignal() && !this.dismissedSignal(), /* @ts-ignore */
|
|
1812
|
+
...(ngDevMode ? [{ debugName: "showPrompt" }] : /* istanbul ignore next */ []));
|
|
1813
|
+
this.offerInProfile = computed(() => !this.installedSignal(), /* @ts-ignore */
|
|
1814
|
+
...(ngDevMode ? [{ debugName: "offerInProfile" }] : /* istanbul ignore next */ []));
|
|
1815
|
+
this.promptHostClaimed = false;
|
|
1816
|
+
}
|
|
1817
|
+
//#endregion
|
|
1818
|
+
//#region ----- Public API -----
|
|
1819
|
+
start() {
|
|
1820
|
+
if (this.started || typeof window === 'undefined') {
|
|
1821
|
+
return;
|
|
1822
|
+
}
|
|
1823
|
+
this.started = true;
|
|
1824
|
+
this.installedSignal.set(isStandaloneDisplay());
|
|
1825
|
+
this.iosSignal.set(isIosSafari() && !isStandaloneDisplay());
|
|
1826
|
+
const onBeforeInstall = (event) => {
|
|
1827
|
+
event.preventDefault();
|
|
1828
|
+
this.deferredPrompt = event;
|
|
1829
|
+
this.canPromptSignal.set(true);
|
|
1830
|
+
};
|
|
1831
|
+
const onInstalled = () => {
|
|
1832
|
+
this.deferredPrompt = null;
|
|
1833
|
+
this.canPromptSignal.set(false);
|
|
1834
|
+
this.installedSignal.set(true);
|
|
1835
|
+
this.iosSignal.set(false);
|
|
1836
|
+
this.dismissPrompt();
|
|
1837
|
+
};
|
|
1838
|
+
const onDisplayMode = () => {
|
|
1839
|
+
const standalone = isStandaloneDisplay();
|
|
1840
|
+
this.installedSignal.set(standalone);
|
|
1841
|
+
if (standalone) {
|
|
1842
|
+
this.iosSignal.set(false);
|
|
1843
|
+
}
|
|
1844
|
+
};
|
|
1845
|
+
window.addEventListener('beforeinstallprompt', onBeforeInstall);
|
|
1846
|
+
window.addEventListener('appinstalled', onInstalled);
|
|
1847
|
+
const displayQuery = window.matchMedia('(display-mode: standalone)');
|
|
1848
|
+
displayQuery.addEventListener('change', onDisplayMode);
|
|
1849
|
+
this.destroyRef.onDestroy(() => {
|
|
1850
|
+
window.removeEventListener('beforeinstallprompt', onBeforeInstall);
|
|
1851
|
+
window.removeEventListener('appinstalled', onInstalled);
|
|
1852
|
+
displayQuery.removeEventListener('change', onDisplayMode);
|
|
1853
|
+
});
|
|
1854
|
+
}
|
|
1855
|
+
dismissPrompt() {
|
|
1856
|
+
this.dismissedSignal.set(true);
|
|
1857
|
+
persistPromptDismissed();
|
|
1858
|
+
}
|
|
1859
|
+
claimPromptHost() {
|
|
1860
|
+
if (this.promptHostClaimed) {
|
|
1861
|
+
return false;
|
|
1862
|
+
}
|
|
1863
|
+
this.promptHostClaimed = true;
|
|
1864
|
+
return true;
|
|
1865
|
+
}
|
|
1866
|
+
async promptInstall() {
|
|
1867
|
+
const promptEvent = this.deferredPrompt;
|
|
1868
|
+
if (!promptEvent) {
|
|
1869
|
+
return 'unavailable';
|
|
1870
|
+
}
|
|
1871
|
+
await promptEvent.prompt();
|
|
1872
|
+
const choice = await promptEvent.userChoice;
|
|
1873
|
+
this.deferredPrompt = null;
|
|
1874
|
+
this.canPromptSignal.set(false);
|
|
1875
|
+
if (choice.outcome === 'accepted') {
|
|
1876
|
+
this.installedSignal.set(true);
|
|
1877
|
+
}
|
|
1878
|
+
return choice.outcome;
|
|
1879
|
+
}
|
|
1880
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPwaInstallService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1881
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPwaInstallService, providedIn: 'root' }); }
|
|
1882
|
+
}
|
|
1883
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPPwaInstallService, decorators: [{
|
|
1884
|
+
type: Injectable,
|
|
1885
|
+
args: [{ providedIn: 'root' }]
|
|
1886
|
+
}] });
|
|
1887
|
+
//#endregion
|
|
1888
|
+
//#region ----- Helpers -----
|
|
1889
|
+
function isStandaloneDisplay() {
|
|
1890
|
+
if (typeof window === 'undefined') {
|
|
1891
|
+
return false;
|
|
1892
|
+
}
|
|
1893
|
+
const navigatorStandalone = navigator.standalone === true;
|
|
1894
|
+
return (navigatorStandalone ||
|
|
1895
|
+
window.matchMedia('(display-mode: standalone)').matches ||
|
|
1896
|
+
window.matchMedia('(display-mode: window-controls-overlay)').matches);
|
|
1897
|
+
}
|
|
1898
|
+
const PWA_INSTALL_PROMPT_DISMISSED_KEY = 'axp:pwa-install-prompt-dismissed';
|
|
1899
|
+
function readPromptDismissed() {
|
|
1900
|
+
if (typeof window === 'undefined') {
|
|
1901
|
+
return false;
|
|
1902
|
+
}
|
|
1903
|
+
try {
|
|
1904
|
+
return window.localStorage.getItem(PWA_INSTALL_PROMPT_DISMISSED_KEY) === '1';
|
|
1905
|
+
}
|
|
1906
|
+
catch {
|
|
1907
|
+
return false;
|
|
1908
|
+
}
|
|
1909
|
+
}
|
|
1910
|
+
function persistPromptDismissed() {
|
|
1911
|
+
if (typeof window === 'undefined') {
|
|
1912
|
+
return;
|
|
1913
|
+
}
|
|
1914
|
+
try {
|
|
1915
|
+
window.localStorage.setItem(PWA_INSTALL_PROMPT_DISMISSED_KEY, '1');
|
|
1916
|
+
}
|
|
1917
|
+
catch {
|
|
1918
|
+
// Private mode or blocked storage; in-memory dismiss still applies for this session.
|
|
1919
|
+
}
|
|
1920
|
+
}
|
|
1921
|
+
function isIosSafari() {
|
|
1922
|
+
if (typeof navigator === 'undefined') {
|
|
1923
|
+
return false;
|
|
1924
|
+
}
|
|
1925
|
+
const ua = navigator.userAgent;
|
|
1926
|
+
const iPhone = /iPhone|iPad|iPod/i.test(ua);
|
|
1927
|
+
const iPadOs = navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;
|
|
1928
|
+
return iPhone || iPadOs;
|
|
1929
|
+
}
|
|
1930
|
+
|
|
1931
|
+
//#region ----- Imports -----
|
|
1932
|
+
//#endregion
|
|
1933
|
+
//#region ----- Component -----
|
|
1934
|
+
class AXMPwaInstallPromptComponent {
|
|
1935
|
+
constructor() {
|
|
1936
|
+
//#region ----- Services & Dependencies -----
|
|
1937
|
+
this.router = inject(Router);
|
|
1938
|
+
this.pwaInstall = inject(AXPPwaInstallService);
|
|
1939
|
+
this.isPromptHost = this.pwaInstall.claimPromptHost();
|
|
1940
|
+
}
|
|
1941
|
+
//#endregion
|
|
1942
|
+
//#region ----- Event Handlers -----
|
|
1943
|
+
handleOpenInstallPage() {
|
|
1944
|
+
this.pwaInstall.dismissPrompt();
|
|
1945
|
+
void this.router.navigateByUrl('/auth/install');
|
|
1946
|
+
}
|
|
1947
|
+
handleDismiss() {
|
|
1948
|
+
this.pwaInstall.dismissPrompt();
|
|
1949
|
+
}
|
|
1950
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPwaInstallPromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1951
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMPwaInstallPromptComponent, isStandalone: true, selector: "axm-pwa-install-prompt", ngImport: i0, template: "@if (isPromptHost && pwaInstall.showPrompt()) {\n <!-- ----- Corner install suggestion while the app is not installed ----- -->\n <div\n class=\"axp-pwa-install-prompt\"\n role=\"region\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.title' | translate | async\"\n >\n <ax-button\n class=\"axp-pwa-install-prompt__dismiss\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.dismiss' | translate | async\"\n (onClick)=\"handleDismiss()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </ax-prefix>\n </ax-button>\n <div class=\"axp-pwa-install-prompt__copy\">\n <p class=\"font-semibold\">{{ '@auth:pwa-install.prompt.title' | translate | async }}</p>\n <p class=\"text-sm text-neutral-600\">{{ '@auth:pwa-install.prompt.hint' | translate | async }}</p>\n </div>\n <ax-button\n color=\"primary\"\n class=\"w-full\"\n [text]=\"'@auth:pwa-install.prompt.action' | translate | async\"\n (onClick)=\"handleOpenInstallPage()\"\n ></ax-button>\n </div>\n}\n", styles: ["@layer properties;:host{display:contents}.axp-pwa-install-prompt{position:fixed;z-index:40;display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-default);background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 4);--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);inset-inline-end:1.5rem;bottom:1.5rem;width:min(20rem,calc(100vw - 2rem))}.axp-pwa-install-prompt__dismiss{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 2);top:calc(var(--spacing, .25rem) * 2)}.axp-pwa-install-prompt__copy{padding-inline-end:calc(var(--spacing, .25rem) * 8);text-align:start}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@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;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i2$2.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i2$2.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: AXTranslationModule }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1952
|
+
}
|
|
1953
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMPwaInstallPromptComponent, decorators: [{
|
|
1954
|
+
type: Component,
|
|
1955
|
+
args: [{ selector: 'axm-pwa-install-prompt', changeDetection: ChangeDetectionStrategy.OnPush, imports: [AXButtonModule, AXDecoratorModule, AXTranslationModule, AsyncPipe], template: "@if (isPromptHost && pwaInstall.showPrompt()) {\n <!-- ----- Corner install suggestion while the app is not installed ----- -->\n <div\n class=\"axp-pwa-install-prompt\"\n role=\"region\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.title' | translate | async\"\n >\n <ax-button\n class=\"axp-pwa-install-prompt__dismiss\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [attr.aria-label]=\"'@auth:pwa-install.prompt.dismiss' | translate | async\"\n (onClick)=\"handleDismiss()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </ax-prefix>\n </ax-button>\n <div class=\"axp-pwa-install-prompt__copy\">\n <p class=\"font-semibold\">{{ '@auth:pwa-install.prompt.title' | translate | async }}</p>\n <p class=\"text-sm text-neutral-600\">{{ '@auth:pwa-install.prompt.hint' | translate | async }}</p>\n </div>\n <ax-button\n color=\"primary\"\n class=\"w-full\"\n [text]=\"'@auth:pwa-install.prompt.action' | translate | async\"\n (onClick)=\"handleOpenInstallPage()\"\n ></ax-button>\n </div>\n}\n", styles: ["@layer properties;:host{display:contents}.axp-pwa-install-prompt{position:fixed;z-index:40;display:flex;flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--radius-lg, .5rem);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-border-default);background-color:rgba(var(--ax-sys-color-lightest-surface));padding:calc(var(--spacing, .25rem) * 4);--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);inset-inline-end:1.5rem;bottom:1.5rem;width:min(20rem,calc(100vw - 2rem))}.axp-pwa-install-prompt__dismiss{position:absolute;inset-inline-end:calc(var(--spacing, .25rem) * 2);top:calc(var(--spacing, .25rem) * 2)}.axp-pwa-install-prompt__copy{padding-inline-end:calc(var(--spacing, .25rem) * 8);text-align:start}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@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;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"] }]
|
|
1956
|
+
}] });
|
|
1957
|
+
|
|
1773
1958
|
class AXMUserDeviceSessionsService {
|
|
1774
1959
|
}
|
|
1775
1960
|
class AXMUserDeviceSessionsServiceImp extends AXMUserDeviceSessionsService {
|
|
@@ -1904,9 +2089,8 @@ const canActivateTenantChooser = async (_route, _state) => {
|
|
|
1904
2089
|
const tenants = await sessionService.getTenantsList();
|
|
1905
2090
|
traceAuthGuard('Tenant chooser catalog', () => ({ count: tenants.length }));
|
|
1906
2091
|
if (tenants.length === 0) {
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
return true;
|
|
2092
|
+
traceAuthGuard('Tenant chooser → waiting room (no tenants)');
|
|
2093
|
+
return router.createUrlTree(['/auth/account/waiting-room']);
|
|
1910
2094
|
}
|
|
1911
2095
|
if (tenants.length === 1) {
|
|
1912
2096
|
if (strategy && typeof strategy.updateToken === 'function') {
|
|
@@ -1980,24 +2164,438 @@ const canActivateAppChooser = async (_route, _state) => {
|
|
|
1980
2164
|
};
|
|
1981
2165
|
//#endregion
|
|
1982
2166
|
|
|
2167
|
+
//#region ----- Types -----
|
|
2168
|
+
/** Hook key for modules/apps to contribute welcome wizard steps. */
|
|
2169
|
+
const ONBOARDING_STEPS_HOOK = 'onboarding.steps';
|
|
2170
|
+
/** User-scoped settings key for welcome onboarding progress blob. */
|
|
2171
|
+
const ONBOARDING_WELCOME_SETTING_KEY = AXPAuthSettings.OnboardingWelcome;
|
|
2172
|
+
//#endregion
|
|
2173
|
+
|
|
2174
|
+
//#region ----- Progress service -----
|
|
2175
|
+
const EMPTY_PROGRESS = { steps: {} };
|
|
2176
|
+
class AXPOnboardingProgressService {
|
|
2177
|
+
constructor() {
|
|
2178
|
+
//#region ----- Services & Dependencies -----
|
|
2179
|
+
this.settingsService = inject(AXPSettingsService);
|
|
2180
|
+
}
|
|
2181
|
+
//#endregion
|
|
2182
|
+
//#region ----- Public API -----
|
|
2183
|
+
async getProgress() {
|
|
2184
|
+
const raw = await this.settingsService
|
|
2185
|
+
.scope(AXPPlatformScope.User)
|
|
2186
|
+
.get(ONBOARDING_WELCOME_SETTING_KEY);
|
|
2187
|
+
if (!raw || typeof raw !== 'object') {
|
|
2188
|
+
return { ...EMPTY_PROGRESS, steps: {} };
|
|
2189
|
+
}
|
|
2190
|
+
return {
|
|
2191
|
+
steps: raw.steps && typeof raw.steps === 'object' ? { ...raw.steps } : {},
|
|
2192
|
+
remindLaterUntil: raw.remindLaterUntil ?? null,
|
|
2193
|
+
dismissedPlanAt: raw.dismissedPlanAt ?? null,
|
|
2194
|
+
};
|
|
2195
|
+
}
|
|
2196
|
+
async setProgress(progress) {
|
|
2197
|
+
await this.settingsService.scope(AXPPlatformScope.User).set(ONBOARDING_WELCOME_SETTING_KEY, progress, {
|
|
2198
|
+
flush: true,
|
|
2199
|
+
});
|
|
2200
|
+
}
|
|
2201
|
+
isStepComplete(step, progress, context) {
|
|
2202
|
+
const entry = progress.steps[this.progressKey(step, context)];
|
|
2203
|
+
if (!entry || (entry.status !== 'completed' && entry.status !== 'skipped')) {
|
|
2204
|
+
return false;
|
|
2205
|
+
}
|
|
2206
|
+
switch (step.scope) {
|
|
2207
|
+
case 'user':
|
|
2208
|
+
return true;
|
|
2209
|
+
case 'tenant':
|
|
2210
|
+
return entry.tenantId === context.tenantId;
|
|
2211
|
+
case 'application':
|
|
2212
|
+
return entry.tenantId === context.tenantId && entry.applicationId === context.applicationId;
|
|
2213
|
+
default:
|
|
2214
|
+
return false;
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
async markComplete(step, context, progress) {
|
|
2218
|
+
return this.markStatus(step, context, 'completed', progress);
|
|
2219
|
+
}
|
|
2220
|
+
async markSkipped(step, context, progress) {
|
|
2221
|
+
return this.markStatus(step, context, 'skipped', progress);
|
|
2222
|
+
}
|
|
2223
|
+
async setRemindLater(untilIso) {
|
|
2224
|
+
const progress = await this.getProgress();
|
|
2225
|
+
const next = {
|
|
2226
|
+
...progress,
|
|
2227
|
+
remindLaterUntil: untilIso,
|
|
2228
|
+
};
|
|
2229
|
+
await this.setProgress(next);
|
|
2230
|
+
return next;
|
|
2231
|
+
}
|
|
2232
|
+
isSnoozed(progress, now = new Date()) {
|
|
2233
|
+
const until = progress.remindLaterUntil;
|
|
2234
|
+
if (!until) {
|
|
2235
|
+
return false;
|
|
2236
|
+
}
|
|
2237
|
+
const untilMs = Date.parse(until);
|
|
2238
|
+
if (Number.isNaN(untilMs)) {
|
|
2239
|
+
return false;
|
|
2240
|
+
}
|
|
2241
|
+
return now.getTime() < untilMs;
|
|
2242
|
+
}
|
|
2243
|
+
//#endregion
|
|
2244
|
+
//#region ----- Private helpers -----
|
|
2245
|
+
/** Stable progress map key so tenant/app completions do not overwrite each other. */
|
|
2246
|
+
progressKey(step, context) {
|
|
2247
|
+
switch (step.scope) {
|
|
2248
|
+
case 'tenant':
|
|
2249
|
+
return `${step.id}:${context.tenantId}`;
|
|
2250
|
+
case 'application':
|
|
2251
|
+
return `${step.id}:${context.tenantId}:${context.applicationId}`;
|
|
2252
|
+
case 'user':
|
|
2253
|
+
default:
|
|
2254
|
+
return step.id;
|
|
2255
|
+
}
|
|
2256
|
+
}
|
|
2257
|
+
async markStatus(step, context, status, progress) {
|
|
2258
|
+
const current = progress ?? (await this.getProgress());
|
|
2259
|
+
const entry = {
|
|
2260
|
+
status,
|
|
2261
|
+
at: new Date().toISOString(),
|
|
2262
|
+
scope: step.scope,
|
|
2263
|
+
};
|
|
2264
|
+
if (step.scope === 'tenant' || step.scope === 'application') {
|
|
2265
|
+
entry.tenantId = context.tenantId;
|
|
2266
|
+
}
|
|
2267
|
+
if (step.scope === 'application') {
|
|
2268
|
+
entry.applicationId = context.applicationId;
|
|
2269
|
+
}
|
|
2270
|
+
const next = {
|
|
2271
|
+
...current,
|
|
2272
|
+
steps: {
|
|
2273
|
+
...current.steps,
|
|
2274
|
+
[this.progressKey(step, context)]: entry,
|
|
2275
|
+
},
|
|
2276
|
+
remindLaterUntil: null,
|
|
2277
|
+
};
|
|
2278
|
+
await this.setProgress(next);
|
|
2279
|
+
return next;
|
|
2280
|
+
}
|
|
2281
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingProgressService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2282
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingProgressService, providedIn: 'root' }); }
|
|
2283
|
+
}
|
|
2284
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingProgressService, decorators: [{
|
|
2285
|
+
type: Injectable,
|
|
2286
|
+
args: [{ providedIn: 'root' }]
|
|
2287
|
+
}] });
|
|
2288
|
+
|
|
2289
|
+
//#region ----- Plan service -----
|
|
2290
|
+
class AXPOnboardingPlanService {
|
|
2291
|
+
constructor() {
|
|
2292
|
+
//#region ----- Services & Dependencies -----
|
|
2293
|
+
this.hooks = inject(AXPHookService);
|
|
2294
|
+
this.progressService = inject(AXPOnboardingProgressService);
|
|
2295
|
+
}
|
|
2296
|
+
//#endregion
|
|
2297
|
+
//#region ----- Public API -----
|
|
2298
|
+
/**
|
|
2299
|
+
* Runs the onboarding.steps hook waterfall and returns all contributed steps
|
|
2300
|
+
* sorted by priority (including already completed ones).
|
|
2301
|
+
*/
|
|
2302
|
+
async assembleFullPlan(context) {
|
|
2303
|
+
const payload = await this.hooks.runAsync(ONBOARDING_STEPS_HOOK, {
|
|
2304
|
+
context,
|
|
2305
|
+
steps: [],
|
|
2306
|
+
});
|
|
2307
|
+
const steps = Array.isArray(payload.steps) ? [...payload.steps] : [];
|
|
2308
|
+
return steps.sort((a, b) => a.priority - b.priority);
|
|
2309
|
+
}
|
|
2310
|
+
/**
|
|
2311
|
+
* Runs the onboarding.steps hook waterfall, sorts by priority, and returns
|
|
2312
|
+
* only steps that are still incomplete for the given session context.
|
|
2313
|
+
*/
|
|
2314
|
+
async assembleIncompletePlan(context) {
|
|
2315
|
+
const steps = await this.assembleFullPlan(context);
|
|
2316
|
+
const progress = await this.progressService.getProgress();
|
|
2317
|
+
return steps.filter((step) => !this.progressService.isStepComplete(step, progress, context));
|
|
2318
|
+
}
|
|
2319
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingPlanService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2320
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingPlanService, providedIn: 'root' }); }
|
|
2321
|
+
}
|
|
2322
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPOnboardingPlanService, decorators: [{
|
|
2323
|
+
type: Injectable,
|
|
2324
|
+
args: [{ providedIn: 'root' }]
|
|
2325
|
+
}] });
|
|
2326
|
+
|
|
2327
|
+
//#region ----- Constants -----
|
|
2328
|
+
const WELCOME_ONBOARDING_ROUTE = '/auth/account/welcome-onboarding';
|
|
2329
|
+
const REMIND_LATER_HOURS = 24;
|
|
2330
|
+
/** User preference keys rendered on welcome preference steps. */
|
|
2331
|
+
const WELCOME_PREFERENCE_SETTING_KEYS = [
|
|
2332
|
+
AXPRegionalSetting.Language,
|
|
2333
|
+
AXPRegionalSetting.TimeZone,
|
|
2334
|
+
AXPThemeLayoutSetting.Mode,
|
|
2335
|
+
AXPThemeLayoutSetting.Palette,
|
|
2336
|
+
AXPThemeLayoutSetting.MenuOrientation,
|
|
2337
|
+
AXPThemeLayoutSetting.MenuVerticalMode,
|
|
2338
|
+
AXPThemeLayoutSetting.HeaderAppearance,
|
|
2339
|
+
AXPCommonSettings.NavigationMode,
|
|
2340
|
+
AXPCommonSettings.MaxOpenTabs,
|
|
2341
|
+
AXPThemeLayoutSetting.Font,
|
|
2342
|
+
AXPThemeLayoutSetting.FontSize,
|
|
2343
|
+
];
|
|
2344
|
+
//#endregion
|
|
2345
|
+
//#region ----- Welcome onboarding flow -----
|
|
2346
|
+
/** Loads plan/preferences and builds per-step layout nodes for the welcome page. */
|
|
2347
|
+
class AXPWelcomeOnboardingFlowService {
|
|
2348
|
+
constructor() {
|
|
2349
|
+
//#region ----- Services & Dependencies -----
|
|
2350
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
2351
|
+
this.sessionService = inject(AXPSessionService);
|
|
2352
|
+
this.planService = inject(AXPOnboardingPlanService);
|
|
2353
|
+
this.progressService = inject(AXPOnboardingProgressService);
|
|
2354
|
+
this.settingsService = inject(AXPSettingsService);
|
|
2355
|
+
this.settingDefinitions = inject(AXPSettingDefinitionProviderService);
|
|
2356
|
+
//#endregion
|
|
2357
|
+
//#region ----- State -----
|
|
2358
|
+
this.preferenceSettings = [];
|
|
2359
|
+
this.resumeContextKey = null;
|
|
2360
|
+
this.resumeStepId = null;
|
|
2361
|
+
}
|
|
2362
|
+
//#endregion
|
|
2363
|
+
//#region ----- Session & plan -----
|
|
2364
|
+
resolveContext() {
|
|
2365
|
+
const userId = this.sessionService.user?.id;
|
|
2366
|
+
const tenantId = this.sessionService.tenant?.id;
|
|
2367
|
+
const applicationId = this.sessionService.application?.id;
|
|
2368
|
+
if (!userId || !tenantId || !applicationId) {
|
|
2369
|
+
return null;
|
|
2370
|
+
}
|
|
2371
|
+
return { userId, tenantId, applicationId };
|
|
2372
|
+
}
|
|
2373
|
+
async evaluatePending(force) {
|
|
2374
|
+
const context = this.resolveContext();
|
|
2375
|
+
if (!context) {
|
|
2376
|
+
return null;
|
|
2377
|
+
}
|
|
2378
|
+
const progress = await this.progressService.getProgress();
|
|
2379
|
+
if (!force && this.progressService.isSnoozed(progress)) {
|
|
2380
|
+
return null;
|
|
2381
|
+
}
|
|
2382
|
+
const steps = await this.planService.assembleFullPlan(context);
|
|
2383
|
+
if (steps.length === 0) {
|
|
2384
|
+
return null;
|
|
2385
|
+
}
|
|
2386
|
+
const hasIncomplete = steps.some((step) => !this.progressService.isStepComplete(step, progress, context));
|
|
2387
|
+
if (!force && !hasIncomplete) {
|
|
2388
|
+
return null;
|
|
2389
|
+
}
|
|
2390
|
+
return { context, steps };
|
|
2391
|
+
}
|
|
2392
|
+
/** Index of the first step that is not completed/skipped for this session. */
|
|
2393
|
+
resolveFirstIncompleteStepIndex(steps, context, progress) {
|
|
2394
|
+
const index = steps.findIndex((step) => !this.progressService.isStepComplete(step, progress, context));
|
|
2395
|
+
return index >= 0 ? index : 0;
|
|
2396
|
+
}
|
|
2397
|
+
//#endregion
|
|
2398
|
+
//#region ----- Preferences -----
|
|
2399
|
+
async loadPreferenceContext() {
|
|
2400
|
+
this.preferenceSettings = await this.settingDefinitions.collectSettingsByKeys(AXPPlatformScope.User, WELCOME_PREFERENCE_SETTING_KEYS);
|
|
2401
|
+
const inheritedDefaults = await this.settingsService.defaultValues(AXPPlatformScope.User);
|
|
2402
|
+
const context = { ...inheritedDefaults };
|
|
2403
|
+
for (const setting of this.preferenceSettings) {
|
|
2404
|
+
const value = await this.settingsService.get(setting.name);
|
|
2405
|
+
if (value !== undefined && value !== null) {
|
|
2406
|
+
context[setting.name] = value;
|
|
2407
|
+
}
|
|
2408
|
+
}
|
|
2409
|
+
return context;
|
|
2410
|
+
}
|
|
2411
|
+
async savePreferences(formContext) {
|
|
2412
|
+
if (!formContext || this.preferenceSettings.length === 0) {
|
|
2413
|
+
return;
|
|
2414
|
+
}
|
|
2415
|
+
const values = {};
|
|
2416
|
+
for (const setting of this.preferenceSettings) {
|
|
2417
|
+
if (Object.prototype.hasOwnProperty.call(formContext, setting.name)) {
|
|
2418
|
+
values[setting.name] = formContext[setting.name];
|
|
2419
|
+
}
|
|
2420
|
+
}
|
|
2421
|
+
if (Object.keys(values).length === 0) {
|
|
2422
|
+
return;
|
|
2423
|
+
}
|
|
2424
|
+
await this.settingsService.scope(AXPPlatformScope.User).set(values, { flush: true });
|
|
2425
|
+
}
|
|
2426
|
+
//#endregion
|
|
2427
|
+
//#region ----- Resume (sub-flows e.g. change photo) -----
|
|
2428
|
+
contextKey(context) {
|
|
2429
|
+
return `${context.userId}:${context.tenantId}:${context.applicationId}`;
|
|
2430
|
+
}
|
|
2431
|
+
setResumeState(context, stepId) {
|
|
2432
|
+
this.resumeContextKey = this.contextKey(context);
|
|
2433
|
+
this.resumeStepId = stepId;
|
|
2434
|
+
}
|
|
2435
|
+
resolveResumeStepIndex(context, steps) {
|
|
2436
|
+
if (this.resumeContextKey !== this.contextKey(context) || !this.resumeStepId) {
|
|
2437
|
+
return 0;
|
|
2438
|
+
}
|
|
2439
|
+
const index = steps.findIndex((step) => step.id === this.resumeStepId);
|
|
2440
|
+
return index >= 0 ? index : 0;
|
|
2441
|
+
}
|
|
2442
|
+
clearResumeState() {
|
|
2443
|
+
this.resumeContextKey = null;
|
|
2444
|
+
this.resumeStepId = null;
|
|
2445
|
+
}
|
|
2446
|
+
hasActiveResumeState() {
|
|
2447
|
+
return this.resumeContextKey != null && this.resumeStepId != null;
|
|
2448
|
+
}
|
|
2449
|
+
//#endregion
|
|
2450
|
+
//#region ----- Progress -----
|
|
2451
|
+
async markStep(step, context, status) {
|
|
2452
|
+
if (status === 'completed') {
|
|
2453
|
+
await this.progressService.markComplete(step, context);
|
|
2454
|
+
return;
|
|
2455
|
+
}
|
|
2456
|
+
await this.progressService.markSkipped(step, context);
|
|
2457
|
+
}
|
|
2458
|
+
async markSteps(steps, context, status) {
|
|
2459
|
+
let progress = await this.progressService.getProgress();
|
|
2460
|
+
for (const step of steps) {
|
|
2461
|
+
progress =
|
|
2462
|
+
status === 'completed'
|
|
2463
|
+
? await this.progressService.markComplete(step, context, progress)
|
|
2464
|
+
: await this.progressService.markSkipped(step, context, progress);
|
|
2465
|
+
}
|
|
2466
|
+
}
|
|
2467
|
+
async persistAll(steps, context, status) {
|
|
2468
|
+
let progress = await this.progressService.getProgress();
|
|
2469
|
+
for (const step of steps) {
|
|
2470
|
+
progress =
|
|
2471
|
+
status === 'completed'
|
|
2472
|
+
? await this.progressService.markComplete(step, context, progress)
|
|
2473
|
+
: await this.progressService.markSkipped(step, context, progress);
|
|
2474
|
+
}
|
|
2475
|
+
}
|
|
2476
|
+
async setRemindLater() {
|
|
2477
|
+
const until = new Date(Date.now() + REMIND_LATER_HOURS * 60 * 60 * 1000).toISOString();
|
|
2478
|
+
await this.progressService.setRemindLater(until);
|
|
2479
|
+
}
|
|
2480
|
+
//#endregion
|
|
2481
|
+
//#region ----- Step layout -----
|
|
2482
|
+
buildStepLayout(step) {
|
|
2483
|
+
const builder = this.layoutBuilder.create();
|
|
2484
|
+
builder.flex((flex) => {
|
|
2485
|
+
flex
|
|
2486
|
+
.setDirection('column')
|
|
2487
|
+
.setGap('12px')
|
|
2488
|
+
.setAlignItems('stretch')
|
|
2489
|
+
.setJustifyContent('flex-start');
|
|
2490
|
+
const settingKeys = step.settingKeys ?? [];
|
|
2491
|
+
if (settingKeys.length > 0) {
|
|
2492
|
+
this.appendPreferenceFields(flex, settingKeys);
|
|
2493
|
+
}
|
|
2494
|
+
const actions = step.actions ?? [];
|
|
2495
|
+
if (actions.length > 0) {
|
|
2496
|
+
flex.flex((row) => {
|
|
2497
|
+
row.setDirection('row').setGap('8px').setWrap('wrap');
|
|
2498
|
+
for (const action of actions) {
|
|
2499
|
+
row.customWidget('button-action', {
|
|
2500
|
+
text: action.text,
|
|
2501
|
+
icon: action.icon,
|
|
2502
|
+
look: { id: 'outline' },
|
|
2503
|
+
color: { id: 'primary' },
|
|
2504
|
+
command: action.command,
|
|
2505
|
+
});
|
|
2506
|
+
}
|
|
2507
|
+
});
|
|
2508
|
+
}
|
|
2509
|
+
});
|
|
2510
|
+
return builder.build();
|
|
2511
|
+
}
|
|
2512
|
+
appendPreferenceFields(flex, settingKeys) {
|
|
2513
|
+
const settings = this.preferenceSettings.filter((setting) => settingKeys.includes(setting.name));
|
|
2514
|
+
for (const setting of settings) {
|
|
2515
|
+
flex.formField(setting.title, (formField) => {
|
|
2516
|
+
formField.path(setting.name);
|
|
2517
|
+
if (setting.description) {
|
|
2518
|
+
formField.setOptions({
|
|
2519
|
+
hint: setting.description,
|
|
2520
|
+
hintDisplayMode: 'note',
|
|
2521
|
+
});
|
|
2522
|
+
}
|
|
2523
|
+
const widgetOptions = { ...(setting.widget.options ?? {}) };
|
|
2524
|
+
const visibilityExpr = widgetOptions['visibility'];
|
|
2525
|
+
if (typeof visibilityExpr === 'string') {
|
|
2526
|
+
formField.visible(visibilityExpr);
|
|
2527
|
+
delete widgetOptions['visibility'];
|
|
2528
|
+
}
|
|
2529
|
+
formField.customWidget(setting.widget.type, {
|
|
2530
|
+
...widgetOptions,
|
|
2531
|
+
...(setting.isRequired ? { validations: [{ rule: 'required' }] } : {}),
|
|
2532
|
+
});
|
|
2533
|
+
});
|
|
2534
|
+
}
|
|
2535
|
+
}
|
|
2536
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2537
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, providedIn: 'root' }); }
|
|
2538
|
+
}
|
|
2539
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, decorators: [{
|
|
2540
|
+
type: Injectable,
|
|
2541
|
+
args: [{ providedIn: 'root' }]
|
|
2542
|
+
}] });
|
|
2543
|
+
|
|
2544
|
+
//#region ----- Welcome onboarding route guard -----
|
|
2545
|
+
const canActivateWelcomeOnboarding = async (route) => {
|
|
2546
|
+
const sessionService = inject(AXPSessionService);
|
|
2547
|
+
const router = inject(Router);
|
|
2548
|
+
const flowService = inject(AXPWelcomeOnboardingFlowService);
|
|
2549
|
+
const homePageService = inject(AXPHomePageService);
|
|
2550
|
+
if (!sessionService.hasSessionCredentials()) {
|
|
2551
|
+
return router.createUrlTree(['/auth/login']);
|
|
2552
|
+
}
|
|
2553
|
+
if (!sessionService.tenant?.id) {
|
|
2554
|
+
return router.createUrlTree(['/auth/account/tenant-chooser']);
|
|
2555
|
+
}
|
|
2556
|
+
if (!sessionService.application?.id) {
|
|
2557
|
+
return router.createUrlTree(['/auth/account/app-chooser']);
|
|
2558
|
+
}
|
|
2559
|
+
const force = route.queryParamMap.get('force') === '1' || route.queryParamMap.get('force') === 'true';
|
|
2560
|
+
const pending = await flowService.evaluatePending(force);
|
|
2561
|
+
if (!pending) {
|
|
2562
|
+
if (flowService.hasActiveResumeState()) {
|
|
2563
|
+
return true;
|
|
2564
|
+
}
|
|
2565
|
+
return await homePageService.resolveAuthorizedHomeUrlTree();
|
|
2566
|
+
}
|
|
2567
|
+
return true;
|
|
2568
|
+
};
|
|
2569
|
+
//#endregion
|
|
2570
|
+
|
|
1983
2571
|
function routesFacory() {
|
|
1984
2572
|
let routes = [];
|
|
1985
2573
|
routes = [
|
|
1986
2574
|
{
|
|
1987
2575
|
path: 'tenant-chooser',
|
|
1988
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-
|
|
2576
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-HqU75mfO.mjs').then((c) => c.AXPAuthTenantChooserComponent),
|
|
1989
2577
|
canActivate: [AXPAuthGuard, canActivateTenantChooser],
|
|
1990
2578
|
},
|
|
2579
|
+
{
|
|
2580
|
+
path: 'waiting-room',
|
|
2581
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs').then((c) => c.AXPAuthWaitingRoomComponent),
|
|
2582
|
+
canActivate: [AXPAuthGuard],
|
|
2583
|
+
},
|
|
1991
2584
|
{
|
|
1992
2585
|
path: 'session-limit',
|
|
1993
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-
|
|
2586
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs').then((c) => c.AXPAuthSessionLimitComponent),
|
|
1994
2587
|
canActivate: [AXPAuthGuard],
|
|
1995
2588
|
},
|
|
1996
2589
|
{
|
|
1997
2590
|
path: 'app-chooser',
|
|
1998
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-
|
|
2591
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CxYe1hmk.mjs').then((c) => c.AXPAuthAppChooserComponent),
|
|
1999
2592
|
canActivate: [AXPAuthGuard, canActivateAppChooser],
|
|
2000
2593
|
},
|
|
2594
|
+
{
|
|
2595
|
+
path: 'welcome-onboarding',
|
|
2596
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-welcome-onboarding-page.component-5NtRLNn3.mjs').then((c) => c.AXPAuthWelcomeOnboardingPageComponent),
|
|
2597
|
+
canActivate: [AXPAuthGuard, canActivateWelcomeOnboarding],
|
|
2598
|
+
},
|
|
2001
2599
|
];
|
|
2002
2600
|
return routes;
|
|
2003
2601
|
}
|
|
@@ -2022,6 +2620,20 @@ class AXPAccountModule {
|
|
|
2022
2620
|
component: AXMUserProfileCardSlotComponent,
|
|
2023
2621
|
},
|
|
2024
2622
|
],
|
|
2623
|
+
'root-footer-end': [
|
|
2624
|
+
{
|
|
2625
|
+
priority: 20,
|
|
2626
|
+
name: 'pwa-install-prompt',
|
|
2627
|
+
component: AXMPwaInstallPromptComponent,
|
|
2628
|
+
},
|
|
2629
|
+
],
|
|
2630
|
+
'root-layout-overlay': [
|
|
2631
|
+
{
|
|
2632
|
+
priority: 10,
|
|
2633
|
+
name: 'pwa-install-prompt',
|
|
2634
|
+
component: AXMPwaInstallPromptComponent,
|
|
2635
|
+
},
|
|
2636
|
+
],
|
|
2025
2637
|
'root-header-end': [
|
|
2026
2638
|
{
|
|
2027
2639
|
priority: 98,
|
|
@@ -2049,6 +2661,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
2049
2661
|
component: AXMUserProfileCardSlotComponent,
|
|
2050
2662
|
},
|
|
2051
2663
|
],
|
|
2664
|
+
'root-footer-end': [
|
|
2665
|
+
{
|
|
2666
|
+
priority: 20,
|
|
2667
|
+
name: 'pwa-install-prompt',
|
|
2668
|
+
component: AXMPwaInstallPromptComponent,
|
|
2669
|
+
},
|
|
2670
|
+
],
|
|
2671
|
+
'root-layout-overlay': [
|
|
2672
|
+
{
|
|
2673
|
+
priority: 10,
|
|
2674
|
+
name: 'pwa-install-prompt',
|
|
2675
|
+
component: AXMPwaInstallPromptComponent,
|
|
2676
|
+
},
|
|
2677
|
+
],
|
|
2052
2678
|
'root-header-end': [
|
|
2053
2679
|
{
|
|
2054
2680
|
priority: 98,
|
|
@@ -2383,7 +3009,7 @@ class AXPIdleLockService {
|
|
|
2383
3009
|
this.overlayOpening = true;
|
|
2384
3010
|
this.locked.set(true);
|
|
2385
3011
|
try {
|
|
2386
|
-
const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-
|
|
3012
|
+
const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-CJJmgXqu.mjs');
|
|
2387
3013
|
const panelClasses = ['axm-session-lock-overlay-shell'];
|
|
2388
3014
|
if (this.platform.isDark()) {
|
|
2389
3015
|
panelClasses.push('ax-dark');
|
|
@@ -2582,6 +3208,26 @@ const CoreProfileSectionsHookProvider = {
|
|
|
2582
3208
|
priority: 0,
|
|
2583
3209
|
execute: (payload) => {
|
|
2584
3210
|
const contributed = [
|
|
3211
|
+
{
|
|
3212
|
+
id: 'welcome-onboarding',
|
|
3213
|
+
groupId: 'account',
|
|
3214
|
+
title: '@auth:welcome-onboarding.profile.resume-section.title',
|
|
3215
|
+
description: '@auth:welcome-onboarding.profile.resume-section.description',
|
|
3216
|
+
icon: 'far fa-hand-wave',
|
|
3217
|
+
priority: 5,
|
|
3218
|
+
layout: { colSpan: 6 },
|
|
3219
|
+
actions: [
|
|
3220
|
+
{
|
|
3221
|
+
name: 'resume-welcome',
|
|
3222
|
+
title: '@auth:welcome-onboarding.profile.resume-action',
|
|
3223
|
+
icon: 'far fa-play',
|
|
3224
|
+
command: {
|
|
3225
|
+
name: AXMAuthCommandKeys.Onboarding.Welcome,
|
|
3226
|
+
options: { force: true },
|
|
3227
|
+
},
|
|
3228
|
+
},
|
|
3229
|
+
],
|
|
3230
|
+
},
|
|
2585
3231
|
{
|
|
2586
3232
|
id: 'basic-info',
|
|
2587
3233
|
groupId: 'account',
|
|
@@ -2672,7 +3318,7 @@ const CoreProfileSectionsHookProvider = {
|
|
|
2672
3318
|
name: 'manage-two-factor',
|
|
2673
3319
|
title: '@auth:profile-page.sections.two-factor.actions.manage',
|
|
2674
3320
|
icon: 'far fa-pen',
|
|
2675
|
-
command:
|
|
3321
|
+
command: { name: AXMAuthCommandKeys.Security.ManageTwoFactor }, // auth:manage-two-factor
|
|
2676
3322
|
},
|
|
2677
3323
|
],
|
|
2678
3324
|
},
|
|
@@ -2843,10 +3489,30 @@ function buildPasswordLastChangedInsights(lastChangedAt) {
|
|
|
2843
3489
|
}
|
|
2844
3490
|
//#endregion
|
|
2845
3491
|
|
|
3492
|
+
//#region ----- Constants -----
|
|
3493
|
+
const TWO_FACTOR_SECTION_ID$1 = 'two-factor';
|
|
3494
|
+
//#endregion
|
|
3495
|
+
//#region ----- Two-factor insight -----
|
|
3496
|
+
/** Builds the enabled/disabled insight shown on the Two-Factor profile card. */
|
|
3497
|
+
function buildTwoFactorStatusInsights(enabled) {
|
|
3498
|
+
return [
|
|
3499
|
+
{
|
|
3500
|
+
id: 'two-factor-status',
|
|
3501
|
+
icon: enabled ? 'fa-light fa-fw fa-shield-check' : 'fa-light fa-fw fa-shield',
|
|
3502
|
+
text: enabled
|
|
3503
|
+
? '@auth:profile-page.sections.two-factor.insights.enabled'
|
|
3504
|
+
: '@auth:profile-page.sections.two-factor.insights.disabled',
|
|
3505
|
+
},
|
|
3506
|
+
];
|
|
3507
|
+
}
|
|
3508
|
+
//#endregion
|
|
3509
|
+
|
|
2846
3510
|
//#region ---- Section ids ----
|
|
3511
|
+
const BASIC_INFO_SECTION_ID = 'basic-info';
|
|
2847
3512
|
const SECURITY_PIN_SECTION_ID = 'security-pin';
|
|
2848
3513
|
const ACTIVE_SESSIONS_SECTION_ID = 'active-sessions';
|
|
2849
3514
|
const LOGIN_HISTORY_SECTION_ID = 'login-history';
|
|
3515
|
+
const TWO_FACTOR_SECTION_ID = 'two-factor';
|
|
2850
3516
|
//#endregion
|
|
2851
3517
|
//#region ---- Profile page security insights service ----
|
|
2852
3518
|
/** Loads contextual security insights for profile section cards. */
|
|
@@ -2855,19 +3521,34 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2855
3521
|
//#region ---- Services & Dependencies ----
|
|
2856
3522
|
this.sessionService = inject(AXPSessionService);
|
|
2857
3523
|
this.entityService = inject(AXPEntityService);
|
|
3524
|
+
this.commandService = inject(AXPCommandService);
|
|
2858
3525
|
this.translateService = inject(AXTranslationService);
|
|
2859
3526
|
this.passwordChangeTrackingService = inject(AXPAuthPasswordChangeTrackingService);
|
|
2860
3527
|
}
|
|
2861
3528
|
//#endregion
|
|
2862
3529
|
//#region ---- Public API ----
|
|
3530
|
+
/** Account-tab insights (email on Basic Information). */
|
|
3531
|
+
async loadAccountBySectionId() {
|
|
3532
|
+
const userId = this.sessionService.user?.id;
|
|
3533
|
+
if (!userId) {
|
|
3534
|
+
return {};
|
|
3535
|
+
}
|
|
3536
|
+
const user = await this.loadCurrentUser(userId);
|
|
3537
|
+
const basicInfoInsights = this.buildBasicInfoInsights(user);
|
|
3538
|
+
if (isEmpty(basicInfoInsights)) {
|
|
3539
|
+
return {};
|
|
3540
|
+
}
|
|
3541
|
+
return { [BASIC_INFO_SECTION_ID]: basicInfoInsights };
|
|
3542
|
+
}
|
|
2863
3543
|
async loadBySectionId() {
|
|
2864
3544
|
const userId = this.sessionService.user?.id;
|
|
2865
3545
|
if (!userId) {
|
|
2866
3546
|
return {};
|
|
2867
3547
|
}
|
|
2868
|
-
const [sessions, user] = await Promise.all([
|
|
3548
|
+
const [sessions, user, twoFactorStatus] = await Promise.all([
|
|
2869
3549
|
this.loadUserSessions(userId),
|
|
2870
3550
|
this.loadCurrentUser(userId),
|
|
3551
|
+
this.loadTwoFactorStatus(),
|
|
2871
3552
|
]);
|
|
2872
3553
|
const insightsBySectionId = {};
|
|
2873
3554
|
const passwordInsights = this.buildPasswordInsights(userId, user);
|
|
@@ -2878,6 +3559,7 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2878
3559
|
if (!isEmpty(pinInsights)) {
|
|
2879
3560
|
insightsBySectionId[SECURITY_PIN_SECTION_ID] = pinInsights;
|
|
2880
3561
|
}
|
|
3562
|
+
insightsBySectionId[TWO_FACTOR_SECTION_ID] = buildTwoFactorStatusInsights(twoFactorStatus?.enabled === true || twoFactorStatus?.enrolled === true);
|
|
2881
3563
|
const activeSessionInsights = await this.buildActiveSessionInsights(sessions);
|
|
2882
3564
|
if (!isEmpty(activeSessionInsights)) {
|
|
2883
3565
|
insightsBySectionId[ACTIVE_SESSIONS_SECTION_ID] = activeSessionInsights;
|
|
@@ -2890,6 +3572,19 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2890
3572
|
}
|
|
2891
3573
|
//#endregion
|
|
2892
3574
|
//#region ---- Insight builders ----
|
|
3575
|
+
buildBasicInfoInsights(user) {
|
|
3576
|
+
const email = defaultTo(user?.email, '').trim();
|
|
3577
|
+
return [
|
|
3578
|
+
{
|
|
3579
|
+
id: 'email',
|
|
3580
|
+
icon: 'fa-light fa-fw fa-envelope',
|
|
3581
|
+
title: '@general:terms.communication.email',
|
|
3582
|
+
text: isEmpty(email)
|
|
3583
|
+
? '@auth:profile-page.sections.basic-info.insights.email-not-set'
|
|
3584
|
+
: email,
|
|
3585
|
+
},
|
|
3586
|
+
];
|
|
3587
|
+
}
|
|
2893
3588
|
buildPasswordInsights(userId, user) {
|
|
2894
3589
|
const lastChangedAt = this.parseValidDate(user?.passwordChangedAt) ??
|
|
2895
3590
|
this.passwordChangeTrackingService.getLastChangedAt(userId);
|
|
@@ -3009,6 +3704,19 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
3009
3704
|
});
|
|
3010
3705
|
return response.items ?? [];
|
|
3011
3706
|
}
|
|
3707
|
+
async loadTwoFactorStatus() {
|
|
3708
|
+
try {
|
|
3709
|
+
const result = await this.commandService.execute(AXMSecurityManagementServerCommands.GetTwoFactorStatus, {});
|
|
3710
|
+
if (!result?.success) {
|
|
3711
|
+
return null;
|
|
3712
|
+
}
|
|
3713
|
+
return runtimeCommandPayloadData(result) ?? null;
|
|
3714
|
+
}
|
|
3715
|
+
catch (error) {
|
|
3716
|
+
console.error('Failed to load two-factor status for profile security insights', error);
|
|
3717
|
+
return null;
|
|
3718
|
+
}
|
|
3719
|
+
}
|
|
3012
3720
|
//#endregion
|
|
3013
3721
|
//#region ---- Formatting ----
|
|
3014
3722
|
parseValidDate(value) {
|
|
@@ -3042,16 +3750,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3042
3750
|
}] });
|
|
3043
3751
|
|
|
3044
3752
|
//#region ---- Security sections insights hook ----
|
|
3045
|
-
/** Adds
|
|
3753
|
+
/** Adds account + security context (email, sessions, login, password, PIN) to profile section cards. */
|
|
3046
3754
|
const SecuritySectionsInsightsHookProvider = {
|
|
3047
3755
|
key: PROFILE_PAGE_SECTIONS_HOOK,
|
|
3048
3756
|
priority: 15,
|
|
3049
3757
|
execute: async (payload) => {
|
|
3050
|
-
|
|
3758
|
+
const wantAccount = isUserProfileSectionsGroupRequested(payload, 'account');
|
|
3759
|
+
const wantSecurity = isUserProfileSectionsGroupRequested(payload, 'security');
|
|
3760
|
+
if (!wantAccount && !wantSecurity) {
|
|
3051
3761
|
return payload;
|
|
3052
3762
|
}
|
|
3053
3763
|
const insightsService = inject(AXPUserProfileSecurityInsightsService);
|
|
3054
|
-
const insightsBySectionId =
|
|
3764
|
+
const insightsBySectionId = {
|
|
3765
|
+
...(wantAccount ? await insightsService.loadAccountBySectionId() : {}),
|
|
3766
|
+
...(wantSecurity ? await insightsService.loadBySectionId() : {}),
|
|
3767
|
+
};
|
|
3055
3768
|
return {
|
|
3056
3769
|
...payload,
|
|
3057
3770
|
sections: payload.sections.map((section) => {
|
|
@@ -3187,6 +3900,213 @@ const ProfileSlotPresenceMenuHookProvider = {
|
|
|
3187
3900
|
};
|
|
3188
3901
|
//#endregion
|
|
3189
3902
|
|
|
3903
|
+
//#region ---- Profile slot install app menu hook ----
|
|
3904
|
+
/** Registers Install App in the profile dropdown while this device is not in standalone mode. */
|
|
3905
|
+
const ProfileSlotInstallAppMenuHookProvider = {
|
|
3906
|
+
key: PROFILE_SLOT_MENU_ITEMS_HOOK,
|
|
3907
|
+
priority: 5,
|
|
3908
|
+
execute: (payload) => {
|
|
3909
|
+
const pwaInstall = inject(AXPPwaInstallService);
|
|
3910
|
+
return {
|
|
3911
|
+
...payload,
|
|
3912
|
+
items: [
|
|
3913
|
+
...payload.items,
|
|
3914
|
+
{
|
|
3915
|
+
name: 'install-app',
|
|
3916
|
+
title: '@auth:pwa-install.link',
|
|
3917
|
+
icon: 'fa-light fa-download',
|
|
3918
|
+
visible: pwaInstall.offerInProfile(),
|
|
3919
|
+
command: {
|
|
3920
|
+
name: 'navigate',
|
|
3921
|
+
options: {
|
|
3922
|
+
path: '/auth/install',
|
|
3923
|
+
},
|
|
3924
|
+
},
|
|
3925
|
+
},
|
|
3926
|
+
],
|
|
3927
|
+
};
|
|
3928
|
+
},
|
|
3929
|
+
};
|
|
3930
|
+
//#endregion
|
|
3931
|
+
|
|
3932
|
+
//#region ----- Welcome preference steps hook -----
|
|
3933
|
+
/**
|
|
3934
|
+
* Core welcome preference steps, ordered for first-run UX:
|
|
3935
|
+
* language first (so later steps are readable), then appearance.
|
|
3936
|
+
* Editors use the same setting definitions as Settings → User.
|
|
3937
|
+
*/
|
|
3938
|
+
const WelcomeIntroOnboardingHookProvider = {
|
|
3939
|
+
key: ONBOARDING_STEPS_HOOK,
|
|
3940
|
+
priority: 0,
|
|
3941
|
+
execute: (payload) => ({
|
|
3942
|
+
...payload,
|
|
3943
|
+
steps: [
|
|
3944
|
+
...payload.steps,
|
|
3945
|
+
{
|
|
3946
|
+
id: 'welcome-intro',
|
|
3947
|
+
scope: 'user',
|
|
3948
|
+
title: '@auth:welcome-onboarding.steps.welcome-intro.title',
|
|
3949
|
+
description: '@auth:welcome-onboarding.steps.welcome-intro.description',
|
|
3950
|
+
icon: 'fa-solid fa-earth-americas',
|
|
3951
|
+
priority: 10,
|
|
3952
|
+
settingKeys: [AXPRegionalSetting.Language, AXPRegionalSetting.TimeZone],
|
|
3953
|
+
},
|
|
3954
|
+
{
|
|
3955
|
+
id: 'welcome-appearance',
|
|
3956
|
+
scope: 'user',
|
|
3957
|
+
title: '@auth:welcome-onboarding.steps.welcome-appearance.title',
|
|
3958
|
+
description: '@auth:welcome-onboarding.steps.welcome-appearance.description',
|
|
3959
|
+
icon: 'far fa-palette',
|
|
3960
|
+
priority: 15,
|
|
3961
|
+
settingKeys: [
|
|
3962
|
+
AXPThemeLayoutSetting.Mode,
|
|
3963
|
+
AXPThemeLayoutSetting.Palette,
|
|
3964
|
+
AXPThemeLayoutSetting.MenuOrientation,
|
|
3965
|
+
AXPThemeLayoutSetting.MenuVerticalMode,
|
|
3966
|
+
AXPThemeLayoutSetting.HeaderAppearance,
|
|
3967
|
+
],
|
|
3968
|
+
},
|
|
3969
|
+
],
|
|
3970
|
+
}),
|
|
3971
|
+
};
|
|
3972
|
+
//#endregion
|
|
3973
|
+
|
|
3974
|
+
//#region ----- Profile basics step hook -----
|
|
3975
|
+
const welcomeSubFlowReturn = { subFlowReturnUrl: WELCOME_ONBOARDING_ROUTE };
|
|
3976
|
+
/**
|
|
3977
|
+
* User-scoped profile basics step (priority 20).
|
|
3978
|
+
* Self-service display name + photo only — no position/org assignment.
|
|
3979
|
+
*/
|
|
3980
|
+
const ProfileBasicsOnboardingHookProvider = {
|
|
3981
|
+
key: ONBOARDING_STEPS_HOOK,
|
|
3982
|
+
priority: 0,
|
|
3983
|
+
execute: (payload) => ({
|
|
3984
|
+
...payload,
|
|
3985
|
+
steps: [
|
|
3986
|
+
...payload.steps,
|
|
3987
|
+
{
|
|
3988
|
+
id: 'profile-basics',
|
|
3989
|
+
scope: 'user',
|
|
3990
|
+
title: '@auth:welcome-onboarding.steps.profile-basics.title',
|
|
3991
|
+
description: '@auth:welcome-onboarding.steps.profile-basics.description',
|
|
3992
|
+
icon: 'far fa-user',
|
|
3993
|
+
priority: 20,
|
|
3994
|
+
actions: [
|
|
3995
|
+
{
|
|
3996
|
+
text: '@auth:welcome-onboarding.steps.profile-basics.edit-account',
|
|
3997
|
+
icon: 'fa-regular fa-pen',
|
|
3998
|
+
command: { name: AXMAuthCommandKeys.Profile.EditAccountInfo, options: welcomeSubFlowReturn },
|
|
3999
|
+
},
|
|
4000
|
+
{
|
|
4001
|
+
text: '@auth:welcome-onboarding.steps.profile-basics.change-photo',
|
|
4002
|
+
icon: 'fa-regular fa-camera',
|
|
4003
|
+
command: { name: AXMAuthCommandKeys.Profile.ChangePhoto, options: welcomeSubFlowReturn },
|
|
4004
|
+
},
|
|
4005
|
+
],
|
|
4006
|
+
},
|
|
4007
|
+
],
|
|
4008
|
+
}),
|
|
4009
|
+
};
|
|
4010
|
+
//#endregion
|
|
4011
|
+
|
|
4012
|
+
//#region ----- Navigation & typography welcome steps -----
|
|
4013
|
+
/** User preference steps: typography (with appearance), then navigation. */
|
|
4014
|
+
const WelcomeNavigationTypographyOnboardingHookProvider = {
|
|
4015
|
+
key: ONBOARDING_STEPS_HOOK,
|
|
4016
|
+
priority: 5,
|
|
4017
|
+
execute: (payload) => ({
|
|
4018
|
+
...payload,
|
|
4019
|
+
steps: [
|
|
4020
|
+
...payload.steps,
|
|
4021
|
+
{
|
|
4022
|
+
id: 'welcome-typography',
|
|
4023
|
+
scope: 'user',
|
|
4024
|
+
title: '@auth:welcome-onboarding.steps.welcome-typography.title',
|
|
4025
|
+
description: '@auth:welcome-onboarding.steps.welcome-typography.description',
|
|
4026
|
+
icon: 'fa-solid fa-font',
|
|
4027
|
+
priority: 16,
|
|
4028
|
+
settingKeys: [AXPThemeLayoutSetting.Font, AXPThemeLayoutSetting.FontSize],
|
|
4029
|
+
},
|
|
4030
|
+
{
|
|
4031
|
+
id: 'welcome-navigation',
|
|
4032
|
+
scope: 'user',
|
|
4033
|
+
title: '@auth:welcome-onboarding.steps.welcome-navigation.title',
|
|
4034
|
+
description: '@auth:welcome-onboarding.steps.welcome-navigation.description',
|
|
4035
|
+
icon: 'fa-solid fa-table-columns',
|
|
4036
|
+
priority: 17,
|
|
4037
|
+
settingKeys: [AXPCommonSettings.NavigationMode, AXPCommonSettings.MaxOpenTabs],
|
|
4038
|
+
},
|
|
4039
|
+
],
|
|
4040
|
+
}),
|
|
4041
|
+
};
|
|
4042
|
+
//#endregion
|
|
4043
|
+
|
|
4044
|
+
//#region ----- Welcome onboarding trigger -----
|
|
4045
|
+
const WELCOME_TRIGGER_DELAY_MS = 600;
|
|
4046
|
+
/** Opens the welcome wizard after terms when the assembled plan is incomplete and not snoozed. */
|
|
4047
|
+
class AXPWelcomeOnboardingTriggerService {
|
|
4048
|
+
//#endregion
|
|
4049
|
+
//#region ----- Lifecycle -----
|
|
4050
|
+
constructor() {
|
|
4051
|
+
//#region ----- Services & Dependencies -----
|
|
4052
|
+
this.sessionService = inject(AXPSessionService);
|
|
4053
|
+
this.appInitService = inject(AXPAppStartUpService);
|
|
4054
|
+
this.flowService = inject(AXPWelcomeOnboardingFlowService);
|
|
4055
|
+
this.router = inject(Router);
|
|
4056
|
+
this.destroyRef = inject(DestroyRef);
|
|
4057
|
+
//#endregion
|
|
4058
|
+
//#region ----- State -----
|
|
4059
|
+
this.triggerGeneration = 0;
|
|
4060
|
+
this.appInitService.registerTask({
|
|
4061
|
+
name: 'welcome-onboarding',
|
|
4062
|
+
// Silent — no splash status text
|
|
4063
|
+
priority: AXP_APP_STARTUP_PRIORITY.terms + 1,
|
|
4064
|
+
run: async () => {
|
|
4065
|
+
// Evaluated reactively once the session is authorized with an application.
|
|
4066
|
+
},
|
|
4067
|
+
});
|
|
4068
|
+
combineLatest([this.sessionService.isAuthorized$, this.sessionService.application$])
|
|
4069
|
+
.pipe(distinctUntilChanged(([authorized, app], [previousAuthorized, previousApp]) => authorized === previousAuthorized && app?.id === previousApp?.id), switchMap(([authorized, app]) => {
|
|
4070
|
+
if (!authorized || !app || !this.sessionService.hasSessionCredentials()) {
|
|
4071
|
+
this.triggerGeneration++;
|
|
4072
|
+
return EMPTY;
|
|
4073
|
+
}
|
|
4074
|
+
const generation = this.triggerGeneration;
|
|
4075
|
+
return from(this.evaluateWelcomePlan(generation));
|
|
4076
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
4077
|
+
.subscribe();
|
|
4078
|
+
}
|
|
4079
|
+
//#endregion
|
|
4080
|
+
//#region ----- Evaluation -----
|
|
4081
|
+
async evaluateWelcomePlan(generation) {
|
|
4082
|
+
if (!this.canTrigger() || generation !== this.triggerGeneration) {
|
|
4083
|
+
return;
|
|
4084
|
+
}
|
|
4085
|
+
const pending = await this.flowService.evaluatePending(false);
|
|
4086
|
+
if (generation !== this.triggerGeneration || !this.canTrigger() || !pending) {
|
|
4087
|
+
return;
|
|
4088
|
+
}
|
|
4089
|
+
setTimeout(() => {
|
|
4090
|
+
if (generation !== this.triggerGeneration || !this.canTrigger()) {
|
|
4091
|
+
return;
|
|
4092
|
+
}
|
|
4093
|
+
const url = this.router.url;
|
|
4094
|
+
if (url.includes('/auth/account/welcome-onboarding')) {
|
|
4095
|
+
return;
|
|
4096
|
+
}
|
|
4097
|
+
void this.router.navigate(['/auth/account/welcome-onboarding']);
|
|
4098
|
+
}, WELCOME_TRIGGER_DELAY_MS);
|
|
4099
|
+
}
|
|
4100
|
+
canTrigger() {
|
|
4101
|
+
return this.sessionService.isReadyForAppScopedApi;
|
|
4102
|
+
}
|
|
4103
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4104
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService }); }
|
|
4105
|
+
}
|
|
4106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, decorators: [{
|
|
4107
|
+
type: Injectable
|
|
4108
|
+
}], ctorParameters: () => [] });
|
|
4109
|
+
|
|
3190
4110
|
//#region ---- User avatar client middleware ----
|
|
3191
4111
|
const USER_ENTITY = `${RootConfig.module.name}.${RootConfig.entities.users.name}`;
|
|
3192
4112
|
/** Refreshes avatar cache/session after user detail saves avatar. */
|
|
@@ -3219,26 +4139,48 @@ const TITLE_KEYS = {
|
|
|
3219
4139
|
login_failed: '@auth:security-alert.login-failed.title',
|
|
3220
4140
|
account_locked: '@auth:security-alert.account-locked.title',
|
|
3221
4141
|
logout: '@auth:security-alert.logout.title',
|
|
4142
|
+
two_factor_enabled: '@auth:security-alert.two-factor-enabled.title',
|
|
4143
|
+
two_factor_disabled: '@auth:security-alert.two-factor-disabled.title',
|
|
4144
|
+
two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.title',
|
|
4145
|
+
two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.title',
|
|
3222
4146
|
};
|
|
3223
4147
|
const CONTENT_KEYS = {
|
|
3224
4148
|
login_success: '@auth:security-alert.login-success.content',
|
|
3225
4149
|
login_failed: '@auth:security-alert.login-failed.content',
|
|
3226
4150
|
account_locked: '@auth:security-alert.account-locked.content',
|
|
3227
4151
|
logout: '@auth:security-alert.logout.content',
|
|
4152
|
+
two_factor_enabled: '@auth:security-alert.two-factor-enabled.content',
|
|
4153
|
+
two_factor_disabled: '@auth:security-alert.two-factor-disabled.content',
|
|
4154
|
+
two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content',
|
|
4155
|
+
two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content',
|
|
3228
4156
|
};
|
|
3229
4157
|
const CONTENT_WITH_DETAIL_KEYS = {
|
|
3230
4158
|
login_success: '@auth:security-alert.login-success.content-with-detail',
|
|
3231
4159
|
login_failed: '@auth:security-alert.login-failed.content-with-detail',
|
|
3232
4160
|
account_locked: '@auth:security-alert.account-locked.content-with-detail',
|
|
3233
4161
|
logout: '@auth:security-alert.logout.content-with-detail',
|
|
4162
|
+
two_factor_enabled: '@auth:security-alert.two-factor-enabled.content-with-detail',
|
|
4163
|
+
two_factor_disabled: '@auth:security-alert.two-factor-disabled.content-with-detail',
|
|
4164
|
+
two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content-with-detail',
|
|
4165
|
+
two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content-with-detail',
|
|
3234
4166
|
};
|
|
3235
|
-
/**
|
|
4167
|
+
/** True while handling remote terminate (suppresses duplicate dialog + logout toast). */
|
|
3236
4168
|
let remoteTerminateDialogOpen = false;
|
|
3237
|
-
async function showAuthSecurityAlertToast(envelope, toast, translate) {
|
|
4169
|
+
async function showAuthSecurityAlertToast(envelope, toast, translate, sessionService) {
|
|
3238
4170
|
const payload = (envelope.payload ?? {});
|
|
3239
4171
|
if (!payload.kind || payload.kind === 'session_terminated' || !TITLE_KEYS[payload.kind]) {
|
|
3240
4172
|
return;
|
|
3241
4173
|
}
|
|
4174
|
+
// "Signed Out Elsewhere" is for other devices only — never toast on the signing-out browser.
|
|
4175
|
+
if (payload.kind === 'logout' && sessionService) {
|
|
4176
|
+
const [stillAuthenticated, loading] = await Promise.all([
|
|
4177
|
+
firstValueFrom(sessionService.isAuthenticated$),
|
|
4178
|
+
firstValueFrom(sessionService.isLoading$),
|
|
4179
|
+
]);
|
|
4180
|
+
if (!stillAuthenticated || loading) {
|
|
4181
|
+
return;
|
|
4182
|
+
}
|
|
4183
|
+
}
|
|
3242
4184
|
const detail = [payload.deviceSummary, payload.ipAddress]
|
|
3243
4185
|
.map((part) => (part ?? '').trim())
|
|
3244
4186
|
.filter(Boolean)
|
|
@@ -3251,20 +4193,30 @@ async function showAuthSecurityAlertToast(envelope, toast, translate) {
|
|
|
3251
4193
|
params: { detail },
|
|
3252
4194
|
})
|
|
3253
4195
|
: CONTENT_KEYS[payload.kind];
|
|
3254
|
-
const color = payload.kind === 'login_success' ||
|
|
4196
|
+
const color = payload.kind === 'login_success' ||
|
|
4197
|
+
payload.kind === 'logout' ||
|
|
4198
|
+
payload.kind === 'two_factor_enabled' ||
|
|
4199
|
+
payload.kind === 'two_factor_disabled' ||
|
|
4200
|
+
payload.kind === 'two_factor_recovery_codes_regenerated'
|
|
4201
|
+
? 'warning'
|
|
4202
|
+
: 'danger';
|
|
3255
4203
|
toast.show({ color, title, content, closeButton: true, timeOut: 8000 });
|
|
3256
4204
|
}
|
|
3257
4205
|
async function handleRemoteSessionTerminated(sessionService, dialog, router) {
|
|
3258
|
-
|
|
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) {
|
|
4206
|
+
if (remoteTerminateDialogOpen) {
|
|
3264
4207
|
return;
|
|
3265
4208
|
}
|
|
4209
|
+
// Set before any await so a concurrent logout envelope skips its toast.
|
|
3266
4210
|
remoteTerminateDialogOpen = true;
|
|
3267
4211
|
try {
|
|
4212
|
+
const [stillAuthenticated, loading] = await Promise.all([
|
|
4213
|
+
firstValueFrom(sessionService.isAuthenticated$),
|
|
4214
|
+
firstValueFrom(sessionService.isLoading$),
|
|
4215
|
+
]);
|
|
4216
|
+
// Skip while local sign-out / session bind is in flight (avoids dialog on self-logout).
|
|
4217
|
+
if (!stillAuthenticated || loading) {
|
|
4218
|
+
return;
|
|
4219
|
+
}
|
|
3268
4220
|
// Backdrop click is disabled by AXDialogService.open — only Okay closes.
|
|
3269
4221
|
await dialog.alert('@auth:security-alert.session-terminated.title', '@auth:security-alert.session-terminated.content', 'danger', 'horizontal');
|
|
3270
4222
|
const authenticatedAfterAck = await firstValueFrom(sessionService.isAuthenticated$);
|
|
@@ -3303,7 +4255,11 @@ function provideAuthSecurityAlertRealtime() {
|
|
|
3303
4255
|
await handleRemoteSessionTerminated(sessionService, dialog, router);
|
|
3304
4256
|
return;
|
|
3305
4257
|
}
|
|
3306
|
-
|
|
4258
|
+
// Logout often arrives with session_terminated on the same socket — dialog only.
|
|
4259
|
+
if (payload.kind === 'logout' && remoteTerminateDialogOpen) {
|
|
4260
|
+
return;
|
|
4261
|
+
}
|
|
4262
|
+
await showAuthSecurityAlertToast(envelope, toast, translate, sessionService);
|
|
3307
4263
|
});
|
|
3308
4264
|
},
|
|
3309
4265
|
};
|
|
@@ -3314,7 +4270,7 @@ function provideAuthSecurityAlertRealtime() {
|
|
|
3314
4270
|
//#endregion
|
|
3315
4271
|
|
|
3316
4272
|
function profileRoutesFactory() {
|
|
3317
|
-
const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-
|
|
4273
|
+
const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-DNtpDf8J.mjs').then((c) => c.AXMUserProfilePageComponent);
|
|
3318
4274
|
return [
|
|
3319
4275
|
{
|
|
3320
4276
|
path: ':app/profile',
|
|
@@ -3340,12 +4296,23 @@ class AXMAuthModule {
|
|
|
3340
4296
|
constructor() {
|
|
3341
4297
|
inject(AXPIdleLockService);
|
|
3342
4298
|
inject(AXPLogoEntitySyncService);
|
|
4299
|
+
inject(AXPWelcomeOnboardingTriggerService);
|
|
3343
4300
|
}
|
|
3344
4301
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
3345
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$4.AXPCommonModule,
|
|
4302
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, imports: [CommonModule, i1$4.AXPCommonModule, i6$1.RouterModule, AXPAccountModule,
|
|
3346
4303
|
AXMAuthValidationRulesModule] }); }
|
|
3347
4304
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, providers: [
|
|
3348
4305
|
...provideAuthSecurityAlertRealtime(),
|
|
4306
|
+
provideAppStartUpTask(() => {
|
|
4307
|
+
const pwaInstall = inject(AXPPwaInstallService);
|
|
4308
|
+
return {
|
|
4309
|
+
name: 'pwa-install-prompt',
|
|
4310
|
+
priority: AXP_APP_STARTUP_PRIORITY.terms,
|
|
4311
|
+
run: async () => {
|
|
4312
|
+
pwaInstall.start();
|
|
4313
|
+
},
|
|
4314
|
+
};
|
|
4315
|
+
}),
|
|
3349
4316
|
provideAppStartUpTask(() => {
|
|
3350
4317
|
const sessionService = inject(AXPSessionService);
|
|
3351
4318
|
const idleLockService = inject(AXPIdleLockService);
|
|
@@ -3430,12 +4397,12 @@ class AXMAuthModule {
|
|
|
3430
4397
|
}),
|
|
3431
4398
|
AXMAuthErrorHandler,
|
|
3432
4399
|
provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
|
|
3433
|
-
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-
|
|
3434
|
-
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-
|
|
4400
|
+
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
|
|
4401
|
+
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs').then((module) => module.AXMProfilePageComponentProvider)),
|
|
3435
4402
|
provideQuerySetups([
|
|
3436
4403
|
{
|
|
3437
4404
|
key: 'Auth:GetUserActivity',
|
|
3438
|
-
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-
|
|
4405
|
+
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs').then((c) => c.AXMGetUserActivityQuery),
|
|
3439
4406
|
},
|
|
3440
4407
|
]),
|
|
3441
4408
|
{
|
|
@@ -3455,39 +4422,43 @@ class AXMAuthModule {
|
|
|
3455
4422
|
},
|
|
3456
4423
|
{
|
|
3457
4424
|
key: AXMAuthCommandKeys.Session.Signout,
|
|
3458
|
-
command: () => import('./acorex-platform-module-auth-client-signout-command-
|
|
4425
|
+
command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
|
|
3459
4426
|
},
|
|
3460
4427
|
{
|
|
3461
4428
|
key: AXMAuthCommandKeys.Session.OpenSessions,
|
|
3462
|
-
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-
|
|
4429
|
+
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs').then((c) => c.AXPOpenSessionsCommand),
|
|
3463
4430
|
},
|
|
3464
4431
|
{
|
|
3465
4432
|
key: AXMAuthCommandKeys.Session.LockScreen,
|
|
3466
|
-
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-
|
|
4433
|
+
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs').then((c) => c.AXPLockScreenCommand),
|
|
3467
4434
|
},
|
|
3468
4435
|
{
|
|
3469
4436
|
key: AXMAuthCommandKeys.Profile.ChangePhoto,
|
|
3470
|
-
command: () => import('./acorex-platform-module-auth-client-change-photo.command-
|
|
4437
|
+
command: () => import('./acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs').then((c) => c.AXPChangePhotoCommand),
|
|
3471
4438
|
},
|
|
3472
4439
|
{
|
|
3473
4440
|
key: AXMAuthCommandKeys.Profile.EditAccountInfo,
|
|
3474
|
-
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-
|
|
4441
|
+
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
|
|
3475
4442
|
},
|
|
3476
4443
|
{
|
|
3477
4444
|
key: AXMAuthCommandKeys.Security.ChangePassword,
|
|
3478
|
-
command: () => import('./acorex-platform-module-auth-client-change-password.command-
|
|
4445
|
+
command: () => import('./acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs').then((c) => c.AXPChangePasswordCommand),
|
|
4446
|
+
},
|
|
4447
|
+
{
|
|
4448
|
+
key: AXMAuthCommandKeys.Security.ManageTwoFactor,
|
|
4449
|
+
command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs').then((c) => c.AXPManageTwoFactorCommand),
|
|
3479
4450
|
},
|
|
3480
4451
|
{
|
|
3481
4452
|
key: AXMAuthCommandKeys.Security.SetPinCode,
|
|
3482
|
-
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-
|
|
4453
|
+
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs').then((c) => c.AXPSetPinCodeCommand),
|
|
3483
4454
|
},
|
|
3484
4455
|
{
|
|
3485
4456
|
key: AXMAuthCommandKeys.Security.RemovePinCode,
|
|
3486
|
-
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-
|
|
4457
|
+
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs').then((c) => c.AXPRemovePinCodeCommand),
|
|
3487
4458
|
},
|
|
3488
4459
|
{
|
|
3489
4460
|
key: AXMAuthCommandKeys.Security.ViewLoginHistory,
|
|
3490
|
-
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-
|
|
4461
|
+
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs').then((c) => c.AXPViewLoginHistoryCommand),
|
|
3491
4462
|
},
|
|
3492
4463
|
{
|
|
3493
4464
|
key: AXMAuthCommandKeys.Security.EditSignature,
|
|
@@ -3497,47 +4468,76 @@ class AXMAuthModule {
|
|
|
3497
4468
|
key: AXMAuthCommandKeys.Profile.ComingSoon,
|
|
3498
4469
|
command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
|
|
3499
4470
|
},
|
|
4471
|
+
{
|
|
4472
|
+
key: AXMAuthCommandKeys.Onboarding.Welcome,
|
|
4473
|
+
command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
|
|
4474
|
+
},
|
|
4475
|
+
{
|
|
4476
|
+
key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
|
|
4477
|
+
command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
|
|
4478
|
+
},
|
|
3500
4479
|
]),
|
|
4480
|
+
AXPWelcomeOnboardingTriggerService,
|
|
3501
4481
|
{
|
|
3502
|
-
provide:
|
|
4482
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3503
4483
|
useValue: ProfileSlotLogoutMenuHookProvider,
|
|
3504
4484
|
multi: true,
|
|
3505
4485
|
},
|
|
3506
4486
|
{
|
|
3507
|
-
provide:
|
|
4487
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3508
4488
|
useValue: ProfileSlotMyProfileMenuHookProvider,
|
|
3509
4489
|
multi: true,
|
|
3510
4490
|
},
|
|
3511
4491
|
{
|
|
3512
|
-
provide:
|
|
4492
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4493
|
+
useValue: ProfileSlotInstallAppMenuHookProvider,
|
|
4494
|
+
multi: true,
|
|
4495
|
+
},
|
|
4496
|
+
{
|
|
4497
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3513
4498
|
useValue: ProfileSlotLockMenuHookProvider,
|
|
3514
4499
|
multi: true,
|
|
3515
4500
|
},
|
|
3516
4501
|
{
|
|
3517
|
-
provide:
|
|
4502
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3518
4503
|
useValue: ProfileSlotPresenceMenuHookProvider,
|
|
3519
4504
|
multi: true,
|
|
3520
4505
|
},
|
|
3521
4506
|
{
|
|
3522
|
-
provide:
|
|
4507
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3523
4508
|
useValue: CoreProfileGroupsHookProvider,
|
|
3524
4509
|
multi: true,
|
|
3525
4510
|
},
|
|
3526
4511
|
{
|
|
3527
|
-
provide:
|
|
4512
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3528
4513
|
useValue: CoreProfileSectionsHookProvider,
|
|
3529
4514
|
multi: true,
|
|
3530
4515
|
},
|
|
3531
4516
|
{
|
|
3532
|
-
provide:
|
|
4517
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3533
4518
|
useValue: SecurityPinSectionHookProvider,
|
|
3534
4519
|
multi: true,
|
|
3535
4520
|
},
|
|
3536
4521
|
{
|
|
3537
|
-
provide:
|
|
4522
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3538
4523
|
useValue: SecuritySectionsInsightsHookProvider,
|
|
3539
4524
|
multi: true,
|
|
3540
4525
|
},
|
|
4526
|
+
{
|
|
4527
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4528
|
+
useValue: WelcomeIntroOnboardingHookProvider,
|
|
4529
|
+
multi: true,
|
|
4530
|
+
},
|
|
4531
|
+
{
|
|
4532
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4533
|
+
useValue: ProfileBasicsOnboardingHookProvider,
|
|
4534
|
+
multi: true,
|
|
4535
|
+
},
|
|
4536
|
+
{
|
|
4537
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4538
|
+
useValue: WelcomeNavigationTypographyOnboardingHookProvider,
|
|
4539
|
+
multi: true,
|
|
4540
|
+
},
|
|
3541
4541
|
], imports: [CommonModule,
|
|
3542
4542
|
AXPCommonModule.forChild({ errorHandlers: [AXMAuthErrorHandler] }),
|
|
3543
4543
|
RouterModule.forChild(routes),
|
|
@@ -3556,6 +4556,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3556
4556
|
],
|
|
3557
4557
|
providers: [
|
|
3558
4558
|
...provideAuthSecurityAlertRealtime(),
|
|
4559
|
+
provideAppStartUpTask(() => {
|
|
4560
|
+
const pwaInstall = inject(AXPPwaInstallService);
|
|
4561
|
+
return {
|
|
4562
|
+
name: 'pwa-install-prompt',
|
|
4563
|
+
priority: AXP_APP_STARTUP_PRIORITY.terms,
|
|
4564
|
+
run: async () => {
|
|
4565
|
+
pwaInstall.start();
|
|
4566
|
+
},
|
|
4567
|
+
};
|
|
4568
|
+
}),
|
|
3559
4569
|
provideAppStartUpTask(() => {
|
|
3560
4570
|
const sessionService = inject(AXPSessionService);
|
|
3561
4571
|
const idleLockService = inject(AXPIdleLockService);
|
|
@@ -3640,12 +4650,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3640
4650
|
}),
|
|
3641
4651
|
AXMAuthErrorHandler,
|
|
3642
4652
|
provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
|
|
3643
|
-
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-
|
|
3644
|
-
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-
|
|
4653
|
+
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
|
|
4654
|
+
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-i1SGrccV.mjs').then((module) => module.AXMProfilePageComponentProvider)),
|
|
3645
4655
|
provideQuerySetups([
|
|
3646
4656
|
{
|
|
3647
4657
|
key: 'Auth:GetUserActivity',
|
|
3648
|
-
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-
|
|
4658
|
+
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-B6se2sJt.mjs').then((c) => c.AXMGetUserActivityQuery),
|
|
3649
4659
|
},
|
|
3650
4660
|
]),
|
|
3651
4661
|
{
|
|
@@ -3665,39 +4675,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3665
4675
|
},
|
|
3666
4676
|
{
|
|
3667
4677
|
key: AXMAuthCommandKeys.Session.Signout,
|
|
3668
|
-
command: () => import('./acorex-platform-module-auth-client-signout-command-
|
|
4678
|
+
command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
|
|
3669
4679
|
},
|
|
3670
4680
|
{
|
|
3671
4681
|
key: AXMAuthCommandKeys.Session.OpenSessions,
|
|
3672
|
-
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-
|
|
4682
|
+
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-C9ue1SMV.mjs').then((c) => c.AXPOpenSessionsCommand),
|
|
3673
4683
|
},
|
|
3674
4684
|
{
|
|
3675
4685
|
key: AXMAuthCommandKeys.Session.LockScreen,
|
|
3676
|
-
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-
|
|
4686
|
+
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BRGUe-5j.mjs').then((c) => c.AXPLockScreenCommand),
|
|
3677
4687
|
},
|
|
3678
4688
|
{
|
|
3679
4689
|
key: AXMAuthCommandKeys.Profile.ChangePhoto,
|
|
3680
|
-
command: () => import('./acorex-platform-module-auth-client-change-photo.command-
|
|
4690
|
+
command: () => import('./acorex-platform-module-auth-client-change-photo.command-CuieLa-Q.mjs').then((c) => c.AXPChangePhotoCommand),
|
|
3681
4691
|
},
|
|
3682
4692
|
{
|
|
3683
4693
|
key: AXMAuthCommandKeys.Profile.EditAccountInfo,
|
|
3684
|
-
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-
|
|
4694
|
+
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
|
|
3685
4695
|
},
|
|
3686
4696
|
{
|
|
3687
4697
|
key: AXMAuthCommandKeys.Security.ChangePassword,
|
|
3688
|
-
command: () => import('./acorex-platform-module-auth-client-change-password.command-
|
|
4698
|
+
command: () => import('./acorex-platform-module-auth-client-change-password.command-ci4weP0r.mjs').then((c) => c.AXPChangePasswordCommand),
|
|
4699
|
+
},
|
|
4700
|
+
{
|
|
4701
|
+
key: AXMAuthCommandKeys.Security.ManageTwoFactor,
|
|
4702
|
+
command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-t4UEDms3.mjs').then((c) => c.AXPManageTwoFactorCommand),
|
|
3689
4703
|
},
|
|
3690
4704
|
{
|
|
3691
4705
|
key: AXMAuthCommandKeys.Security.SetPinCode,
|
|
3692
|
-
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-
|
|
4706
|
+
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CzUeATL1.mjs').then((c) => c.AXPSetPinCodeCommand),
|
|
3693
4707
|
},
|
|
3694
4708
|
{
|
|
3695
4709
|
key: AXMAuthCommandKeys.Security.RemovePinCode,
|
|
3696
|
-
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-
|
|
4710
|
+
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-0kRQprWO.mjs').then((c) => c.AXPRemovePinCodeCommand),
|
|
3697
4711
|
},
|
|
3698
4712
|
{
|
|
3699
4713
|
key: AXMAuthCommandKeys.Security.ViewLoginHistory,
|
|
3700
|
-
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-
|
|
4714
|
+
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-B35cTU-Z.mjs').then((c) => c.AXPViewLoginHistoryCommand),
|
|
3701
4715
|
},
|
|
3702
4716
|
{
|
|
3703
4717
|
key: AXMAuthCommandKeys.Security.EditSignature,
|
|
@@ -3707,47 +4721,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3707
4721
|
key: AXMAuthCommandKeys.Profile.ComingSoon,
|
|
3708
4722
|
command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
|
|
3709
4723
|
},
|
|
4724
|
+
{
|
|
4725
|
+
key: AXMAuthCommandKeys.Onboarding.Welcome,
|
|
4726
|
+
command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Cms-SKKf.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
|
|
4727
|
+
},
|
|
4728
|
+
{
|
|
4729
|
+
key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
|
|
4730
|
+
command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
|
|
4731
|
+
},
|
|
3710
4732
|
]),
|
|
4733
|
+
AXPWelcomeOnboardingTriggerService,
|
|
3711
4734
|
{
|
|
3712
|
-
provide:
|
|
4735
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3713
4736
|
useValue: ProfileSlotLogoutMenuHookProvider,
|
|
3714
4737
|
multi: true,
|
|
3715
4738
|
},
|
|
3716
4739
|
{
|
|
3717
|
-
provide:
|
|
4740
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3718
4741
|
useValue: ProfileSlotMyProfileMenuHookProvider,
|
|
3719
4742
|
multi: true,
|
|
3720
4743
|
},
|
|
3721
4744
|
{
|
|
3722
|
-
provide:
|
|
4745
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4746
|
+
useValue: ProfileSlotInstallAppMenuHookProvider,
|
|
4747
|
+
multi: true,
|
|
4748
|
+
},
|
|
4749
|
+
{
|
|
4750
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3723
4751
|
useValue: ProfileSlotLockMenuHookProvider,
|
|
3724
4752
|
multi: true,
|
|
3725
4753
|
},
|
|
3726
4754
|
{
|
|
3727
|
-
provide:
|
|
4755
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3728
4756
|
useValue: ProfileSlotPresenceMenuHookProvider,
|
|
3729
4757
|
multi: true,
|
|
3730
4758
|
},
|
|
3731
4759
|
{
|
|
3732
|
-
provide:
|
|
4760
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3733
4761
|
useValue: CoreProfileGroupsHookProvider,
|
|
3734
4762
|
multi: true,
|
|
3735
4763
|
},
|
|
3736
4764
|
{
|
|
3737
|
-
provide:
|
|
4765
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3738
4766
|
useValue: CoreProfileSectionsHookProvider,
|
|
3739
4767
|
multi: true,
|
|
3740
4768
|
},
|
|
3741
4769
|
{
|
|
3742
|
-
provide:
|
|
4770
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3743
4771
|
useValue: SecurityPinSectionHookProvider,
|
|
3744
4772
|
multi: true,
|
|
3745
4773
|
},
|
|
3746
4774
|
{
|
|
3747
|
-
provide:
|
|
4775
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3748
4776
|
useValue: SecuritySectionsInsightsHookProvider,
|
|
3749
4777
|
multi: true,
|
|
3750
4778
|
},
|
|
4779
|
+
{
|
|
4780
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4781
|
+
useValue: WelcomeIntroOnboardingHookProvider,
|
|
4782
|
+
multi: true,
|
|
4783
|
+
},
|
|
4784
|
+
{
|
|
4785
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4786
|
+
useValue: ProfileBasicsOnboardingHookProvider,
|
|
4787
|
+
multi: true,
|
|
4788
|
+
},
|
|
4789
|
+
{
|
|
4790
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4791
|
+
useValue: WelcomeNavigationTypographyOnboardingHookProvider,
|
|
4792
|
+
multi: true,
|
|
4793
|
+
},
|
|
3751
4794
|
],
|
|
3752
4795
|
}]
|
|
3753
4796
|
}], ctorParameters: () => [] });
|
|
@@ -3820,5 +4863,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3820
4863
|
* Generated bundle index. Do not edit.
|
|
3821
4864
|
*/
|
|
3822
4865
|
|
|
3823
|
-
export {
|
|
3824
|
-
//# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-
|
|
4866
|
+
export { countToActivityLevel as $, AXMUserDeviceSessionsService as A, AXPTenantChooserDropdownComponent as B, CHANGE_PASSWORD_SECTION_ID as C, AXPAppChooserListComponent as D, AXPOnboardingProgressService as E, formatCompactActivityCount as F, AXPLoginExternalProvidersComponent as G, AXMAuthenticationTypes as H, AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT as I, AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS as J, AUTH_USER_ACTIVITY_DEFAULT_WEEKS as K, AUTH_USER_ACTIVITY_WEEK_PRESETS as L, AXMAuthErrorHandler as M, AXMAuthModule as N, AXMDefaultAuthConfigs as O, PROFILE_PAGE_GROUPS_HOOK as P, AXM_AUTH_CONFIG_TOKEN as Q, ONBOARDING_STEPS_HOOK as R, ONBOARDING_WELCOME_SETTING_KEY as S, TWO_FACTOR_SECTION_ID$1 as T, aggregateDailySessionCounts as U, aggregateHourlySessionCounts as V, buildUserActivityHours as W, buildUserActivityWeeks as X, canActivateLogin as Y, computeUserActivityStats as Z, configAuthModule as _, PROFILE_PAGE_SECTIONS_HOOK as a, extractUserActivityEndDate as a0, extractUserActivityStartDate as a1, extractUserActivityUserId as a2, isUserProfileGroupComponent as a3, isUserProfileSectionsGroupRequested as a4, parseAuthCredentialType as a5, resolveDayDateRange as a6, resolveUserActivityHeatmapLayout as a7, 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, buildTwoFactorStatusInsights as s, AXPLoginHistoryService as t, AXPWelcomeOnboardingFlowService as u, visibleUserProfileSectionActions as v, AXMAuthPlatformSettingsService as w, AXPPwaInstallService as x, AXM_LOGIN_GUARD_TOKEN as y, AXPTenantChooserListComponent as z };
|
|
4867
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-DXunSlPC.mjs.map
|