@acorex-platform/module-auth-client 0.0.38 → 0.0.48
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-C1oSPf12.mjs} +1154 -107
- package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-C1oSPf12.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs → acorex-platform-module-auth-client-app-chooser.component-CLKLwWW8.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-CjWofUGR.mjs.map → acorex-platform-module-auth-client-app-chooser.component-CLKLwWW8.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-CknYaMZD.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BqU3jYV9.mjs.map → acorex-platform-module-auth-client-change-password.command-CknYaMZD.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-CzO3A7OG.mjs → acorex-platform-module-auth-client-change-photo.command-CML784Lg.mjs} +71 -21
- package/fesm2022/acorex-platform-module-auth-client-change-photo.command-CML784Lg.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-CV9mdOBi.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-CV9mdOBi.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs → acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-DKtlBzS7.mjs.map → acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs → acorex-platform-module-auth-client-login.module-DtvnPpBH.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-auth-client-login.module-CXl61yOu.mjs.map → acorex-platform-module-auth-client-login.module-DtvnPpBH.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs +445 -0
- package/fesm2022/acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs → acorex-platform-module-auth-client-master.layout-B3krDskY.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-master.layout-D7zUm7aL.mjs.map → acorex-platform-module-auth-client-master.layout-B3krDskY.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-CEpu6c7D.mjs} +6 -6
- package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DKvyMkhl.mjs.map → acorex-platform-module-auth-client-open-sessions.command-CEpu6c7D.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-ddh-_0k3.mjs} +39 -9
- package/fesm2022/acorex-platform-module-auth-client-password.component-ddh-_0k3.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-D4bqeKCd.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-D4bqeKCd.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-DLTbTEe6.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-DLTbTEe6.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-CGs24n0j.mjs → acorex-platform-module-auth-client-profile-page.component-BhmMsO3g.mjs} +9 -7
- package/fesm2022/acorex-platform-module-auth-client-profile-page.component-BhmMsO3g.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-BJOvT0hW.mjs +84 -0
- package/fesm2022/acorex-platform-module-auth-client-pwa-install.component-BJOvT0hW.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs → acorex-platform-module-auth-client-register-password.component-M-ayP7oO.mjs} +7 -7
- package/fesm2022/{acorex-platform-module-auth-client-register-password.component-BlOn9609.mjs.map → acorex-platform-module-auth-client-register-password.component-M-ayP7oO.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs → acorex-platform-module-auth-client-register.module-Qa3ovje0.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-auth-client-register.module-CpoYf5uG.mjs.map → acorex-platform-module-auth-client-register.module-Qa3ovje0.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-BenNCyt6.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-BenNCyt6.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-ChigSAI-.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-ChigSAI-.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-CefSbJz8.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-CefSbJz8.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-DqFW_4rM.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-DqFW_4rM.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-DCdRCf1m.mjs} +5 -5
- package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B8CNqHx5.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-DCdRCf1m.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-CtSv3MQu.mjs +200 -0
- package/fesm2022/acorex-platform-module-auth-client-two-factor-code.component-CtSv3MQu.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-CI8KC5M_.mjs → acorex-platform-module-auth-client-two-factor.module-B7tETPbq.mjs} +10 -5
- package/fesm2022/acorex-platform-module-auth-client-two-factor.module-B7tETPbq.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-CKPbyVWd.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-CKPbyVWd.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-C2WYgv4l.mjs +813 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding-page.component-C2WYgv4l.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.mjs +59 -0
- package/fesm2022/acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.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-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
999
|
+
children: [
|
|
1000
|
+
{
|
|
1001
|
+
path: 'install',
|
|
1002
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-pwa-install.component-BJOvT0hW.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-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
1009
|
+
loadChildren: () => import('./acorex-platform-module-auth-client-login.module-DtvnPpBH.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-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
1014
|
+
loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-B7tETPbq.mjs').then((c) => c.AXPTwoFactorModule),
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
path: '',
|
|
1018
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-B3krDskY.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-B3krDskY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
|
|
1033
|
+
loadChildren: () => import('./acorex-platform-module-auth-client-register.module-Qa3ovje0.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,442 @@ 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.MenuBadgeVisible,
|
|
2339
|
+
AXPThemeLayoutSetting.MenuLookWithLine,
|
|
2340
|
+
AXPThemeLayoutSetting.MenuDensity,
|
|
2341
|
+
AXPThemeLayoutSetting.MenuDark,
|
|
2342
|
+
AXPThemeLayoutSetting.HeaderAppearance,
|
|
2343
|
+
AXPCommonSettings.NavigationMode,
|
|
2344
|
+
AXPCommonSettings.MaxOpenTabs,
|
|
2345
|
+
AXPThemeLayoutSetting.Font,
|
|
2346
|
+
AXPThemeLayoutSetting.FontSize,
|
|
2347
|
+
];
|
|
2348
|
+
//#endregion
|
|
2349
|
+
//#region ----- Welcome onboarding flow -----
|
|
2350
|
+
/** Loads plan/preferences and builds per-step layout nodes for the welcome page. */
|
|
2351
|
+
class AXPWelcomeOnboardingFlowService {
|
|
2352
|
+
constructor() {
|
|
2353
|
+
//#region ----- Services & Dependencies -----
|
|
2354
|
+
this.layoutBuilder = inject(AXPLayoutBuilderService);
|
|
2355
|
+
this.sessionService = inject(AXPSessionService);
|
|
2356
|
+
this.planService = inject(AXPOnboardingPlanService);
|
|
2357
|
+
this.progressService = inject(AXPOnboardingProgressService);
|
|
2358
|
+
this.settingsService = inject(AXPSettingsService);
|
|
2359
|
+
this.settingDefinitions = inject(AXPSettingDefinitionProviderService);
|
|
2360
|
+
//#endregion
|
|
2361
|
+
//#region ----- State -----
|
|
2362
|
+
this.preferenceSettings = [];
|
|
2363
|
+
this.resumeContextKey = null;
|
|
2364
|
+
this.resumeStepId = null;
|
|
2365
|
+
}
|
|
2366
|
+
//#endregion
|
|
2367
|
+
//#region ----- Session & plan -----
|
|
2368
|
+
resolveContext() {
|
|
2369
|
+
const userId = this.sessionService.user?.id;
|
|
2370
|
+
const tenantId = this.sessionService.tenant?.id;
|
|
2371
|
+
const applicationId = this.sessionService.application?.id;
|
|
2372
|
+
if (!userId || !tenantId || !applicationId) {
|
|
2373
|
+
return null;
|
|
2374
|
+
}
|
|
2375
|
+
return { userId, tenantId, applicationId };
|
|
2376
|
+
}
|
|
2377
|
+
async evaluatePending(force) {
|
|
2378
|
+
const context = this.resolveContext();
|
|
2379
|
+
if (!context) {
|
|
2380
|
+
return null;
|
|
2381
|
+
}
|
|
2382
|
+
const progress = await this.progressService.getProgress();
|
|
2383
|
+
if (!force && this.progressService.isSnoozed(progress)) {
|
|
2384
|
+
return null;
|
|
2385
|
+
}
|
|
2386
|
+
const steps = await this.planService.assembleFullPlan(context);
|
|
2387
|
+
if (steps.length === 0) {
|
|
2388
|
+
return null;
|
|
2389
|
+
}
|
|
2390
|
+
const hasIncomplete = steps.some((step) => !this.progressService.isStepComplete(step, progress, context));
|
|
2391
|
+
if (!force && !hasIncomplete) {
|
|
2392
|
+
return null;
|
|
2393
|
+
}
|
|
2394
|
+
return { context, steps };
|
|
2395
|
+
}
|
|
2396
|
+
/** Index of the first step that is not completed/skipped for this session. */
|
|
2397
|
+
resolveFirstIncompleteStepIndex(steps, context, progress) {
|
|
2398
|
+
const index = steps.findIndex((step) => !this.progressService.isStepComplete(step, progress, context));
|
|
2399
|
+
return index >= 0 ? index : 0;
|
|
2400
|
+
}
|
|
2401
|
+
//#endregion
|
|
2402
|
+
//#region ----- Preferences -----
|
|
2403
|
+
async loadPreferenceContext() {
|
|
2404
|
+
this.preferenceSettings = await this.settingDefinitions.collectSettingsByKeys(AXPPlatformScope.User, WELCOME_PREFERENCE_SETTING_KEYS);
|
|
2405
|
+
const inheritedDefaults = await this.settingsService.defaultValues(AXPPlatformScope.User);
|
|
2406
|
+
const context = { ...inheritedDefaults };
|
|
2407
|
+
for (const setting of this.preferenceSettings) {
|
|
2408
|
+
const value = await this.settingsService.get(setting.name);
|
|
2409
|
+
if (value !== undefined && value !== null) {
|
|
2410
|
+
context[setting.name] = value;
|
|
2411
|
+
}
|
|
2412
|
+
}
|
|
2413
|
+
return context;
|
|
2414
|
+
}
|
|
2415
|
+
async savePreferences(formContext) {
|
|
2416
|
+
if (!formContext || this.preferenceSettings.length === 0) {
|
|
2417
|
+
return;
|
|
2418
|
+
}
|
|
2419
|
+
const values = {};
|
|
2420
|
+
for (const setting of this.preferenceSettings) {
|
|
2421
|
+
if (Object.prototype.hasOwnProperty.call(formContext, setting.name)) {
|
|
2422
|
+
values[setting.name] = formContext[setting.name];
|
|
2423
|
+
}
|
|
2424
|
+
}
|
|
2425
|
+
if (Object.keys(values).length === 0) {
|
|
2426
|
+
return;
|
|
2427
|
+
}
|
|
2428
|
+
await this.settingsService.scope(AXPPlatformScope.User).set(values, { flush: true });
|
|
2429
|
+
}
|
|
2430
|
+
//#endregion
|
|
2431
|
+
//#region ----- Resume (sub-flows e.g. change photo) -----
|
|
2432
|
+
contextKey(context) {
|
|
2433
|
+
return `${context.userId}:${context.tenantId}:${context.applicationId}`;
|
|
2434
|
+
}
|
|
2435
|
+
setResumeState(context, stepId) {
|
|
2436
|
+
this.resumeContextKey = this.contextKey(context);
|
|
2437
|
+
this.resumeStepId = stepId;
|
|
2438
|
+
}
|
|
2439
|
+
resolveResumeStepIndex(context, steps) {
|
|
2440
|
+
if (this.resumeContextKey !== this.contextKey(context) || !this.resumeStepId) {
|
|
2441
|
+
return 0;
|
|
2442
|
+
}
|
|
2443
|
+
const index = steps.findIndex((step) => step.id === this.resumeStepId);
|
|
2444
|
+
return index >= 0 ? index : 0;
|
|
2445
|
+
}
|
|
2446
|
+
clearResumeState() {
|
|
2447
|
+
this.resumeContextKey = null;
|
|
2448
|
+
this.resumeStepId = null;
|
|
2449
|
+
}
|
|
2450
|
+
hasActiveResumeState() {
|
|
2451
|
+
return this.resumeContextKey != null && this.resumeStepId != null;
|
|
2452
|
+
}
|
|
2453
|
+
//#endregion
|
|
2454
|
+
//#region ----- Progress -----
|
|
2455
|
+
async markStep(step, context, status) {
|
|
2456
|
+
if (status === 'completed') {
|
|
2457
|
+
await this.progressService.markComplete(step, context);
|
|
2458
|
+
return;
|
|
2459
|
+
}
|
|
2460
|
+
await this.progressService.markSkipped(step, context);
|
|
2461
|
+
}
|
|
2462
|
+
async markSteps(steps, context, status) {
|
|
2463
|
+
let progress = await this.progressService.getProgress();
|
|
2464
|
+
for (const step of steps) {
|
|
2465
|
+
progress =
|
|
2466
|
+
status === 'completed'
|
|
2467
|
+
? await this.progressService.markComplete(step, context, progress)
|
|
2468
|
+
: await this.progressService.markSkipped(step, context, progress);
|
|
2469
|
+
}
|
|
2470
|
+
}
|
|
2471
|
+
async persistAll(steps, context, status) {
|
|
2472
|
+
let progress = await this.progressService.getProgress();
|
|
2473
|
+
for (const step of steps) {
|
|
2474
|
+
progress =
|
|
2475
|
+
status === 'completed'
|
|
2476
|
+
? await this.progressService.markComplete(step, context, progress)
|
|
2477
|
+
: await this.progressService.markSkipped(step, context, progress);
|
|
2478
|
+
}
|
|
2479
|
+
}
|
|
2480
|
+
async setRemindLater() {
|
|
2481
|
+
const until = new Date(Date.now() + REMIND_LATER_HOURS * 60 * 60 * 1000).toISOString();
|
|
2482
|
+
await this.progressService.setRemindLater(until);
|
|
2483
|
+
}
|
|
2484
|
+
//#endregion
|
|
2485
|
+
//#region ----- Step layout -----
|
|
2486
|
+
buildStepLayout(step) {
|
|
2487
|
+
const builder = this.layoutBuilder.create();
|
|
2488
|
+
builder.flex((flex) => {
|
|
2489
|
+
flex
|
|
2490
|
+
.setDirection('column')
|
|
2491
|
+
.setGap('12px')
|
|
2492
|
+
.setAlignItems('stretch')
|
|
2493
|
+
.setJustifyContent('flex-start');
|
|
2494
|
+
const settingKeys = step.settingKeys ?? [];
|
|
2495
|
+
if (settingKeys.length > 0) {
|
|
2496
|
+
this.appendPreferenceFields(flex, settingKeys);
|
|
2497
|
+
}
|
|
2498
|
+
const actions = step.actions ?? [];
|
|
2499
|
+
if (actions.length > 0) {
|
|
2500
|
+
flex.flex((row) => {
|
|
2501
|
+
row.setDirection('row').setGap('8px').setWrap('wrap');
|
|
2502
|
+
for (const action of actions) {
|
|
2503
|
+
row.customWidget('button-action', {
|
|
2504
|
+
text: action.text,
|
|
2505
|
+
icon: action.icon,
|
|
2506
|
+
look: { id: 'outline' },
|
|
2507
|
+
color: { id: 'primary' },
|
|
2508
|
+
command: action.command,
|
|
2509
|
+
});
|
|
2510
|
+
}
|
|
2511
|
+
});
|
|
2512
|
+
}
|
|
2513
|
+
});
|
|
2514
|
+
return builder.build();
|
|
2515
|
+
}
|
|
2516
|
+
appendPreferenceFields(flex, settingKeys) {
|
|
2517
|
+
const settings = this.preferenceSettings.filter((setting) => settingKeys.includes(setting.name));
|
|
2518
|
+
for (const setting of settings) {
|
|
2519
|
+
flex.formField(setting.title, (formField) => {
|
|
2520
|
+
formField.path(setting.name);
|
|
2521
|
+
if (setting.description) {
|
|
2522
|
+
formField.setOptions({
|
|
2523
|
+
hint: setting.description,
|
|
2524
|
+
hintDisplayMode: 'note',
|
|
2525
|
+
});
|
|
2526
|
+
}
|
|
2527
|
+
const widgetOptions = { ...(setting.widget.options ?? {}) };
|
|
2528
|
+
const visibilityExpr = widgetOptions['visibility'];
|
|
2529
|
+
if (typeof visibilityExpr === 'string') {
|
|
2530
|
+
formField.visible(visibilityExpr);
|
|
2531
|
+
delete widgetOptions['visibility'];
|
|
2532
|
+
}
|
|
2533
|
+
formField.customWidget(setting.widget.type, {
|
|
2534
|
+
...widgetOptions,
|
|
2535
|
+
...(setting.isRequired ? { validations: [{ rule: 'required' }] } : {}),
|
|
2536
|
+
});
|
|
2537
|
+
});
|
|
2538
|
+
}
|
|
2539
|
+
}
|
|
2540
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2541
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, providedIn: 'root' }); }
|
|
2542
|
+
}
|
|
2543
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingFlowService, decorators: [{
|
|
2544
|
+
type: Injectable,
|
|
2545
|
+
args: [{ providedIn: 'root' }]
|
|
2546
|
+
}] });
|
|
2547
|
+
|
|
2548
|
+
//#region ----- Welcome onboarding route guard -----
|
|
2549
|
+
const canActivateWelcomeOnboarding = async (route) => {
|
|
2550
|
+
const sessionService = inject(AXPSessionService);
|
|
2551
|
+
const router = inject(Router);
|
|
2552
|
+
const flowService = inject(AXPWelcomeOnboardingFlowService);
|
|
2553
|
+
const homePageService = inject(AXPHomePageService);
|
|
2554
|
+
if (!sessionService.hasSessionCredentials()) {
|
|
2555
|
+
return router.createUrlTree(['/auth/login']);
|
|
2556
|
+
}
|
|
2557
|
+
if (!sessionService.tenant?.id) {
|
|
2558
|
+
return router.createUrlTree(['/auth/account/tenant-chooser']);
|
|
2559
|
+
}
|
|
2560
|
+
if (!sessionService.application?.id) {
|
|
2561
|
+
return router.createUrlTree(['/auth/account/app-chooser']);
|
|
2562
|
+
}
|
|
2563
|
+
const force = route.queryParamMap.get('force') === '1' || route.queryParamMap.get('force') === 'true';
|
|
2564
|
+
const pending = await flowService.evaluatePending(force);
|
|
2565
|
+
if (!pending) {
|
|
2566
|
+
if (flowService.hasActiveResumeState()) {
|
|
2567
|
+
return true;
|
|
2568
|
+
}
|
|
2569
|
+
return await homePageService.resolveAuthorizedHomeUrlTree();
|
|
2570
|
+
}
|
|
2571
|
+
return true;
|
|
2572
|
+
};
|
|
2573
|
+
//#endregion
|
|
2574
|
+
|
|
1983
2575
|
function routesFacory() {
|
|
1984
2576
|
let routes = [];
|
|
1985
2577
|
routes = [
|
|
1986
2578
|
{
|
|
1987
2579
|
path: 'tenant-chooser',
|
|
1988
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-
|
|
2580
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-DCdRCf1m.mjs').then((c) => c.AXPAuthTenantChooserComponent),
|
|
1989
2581
|
canActivate: [AXPAuthGuard, canActivateTenantChooser],
|
|
1990
2582
|
},
|
|
2583
|
+
{
|
|
2584
|
+
path: 'waiting-room',
|
|
2585
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-waiting-room.component-IAVIt1fY.mjs').then((c) => c.AXPAuthWaitingRoomComponent),
|
|
2586
|
+
canActivate: [AXPAuthGuard],
|
|
2587
|
+
},
|
|
1991
2588
|
{
|
|
1992
2589
|
path: 'session-limit',
|
|
1993
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-
|
|
2590
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-session-limit.component-Dc6TIn-2.mjs').then((c) => c.AXPAuthSessionLimitComponent),
|
|
1994
2591
|
canActivate: [AXPAuthGuard],
|
|
1995
2592
|
},
|
|
1996
2593
|
{
|
|
1997
2594
|
path: 'app-chooser',
|
|
1998
|
-
loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-
|
|
2595
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-CLKLwWW8.mjs').then((c) => c.AXPAuthAppChooserComponent),
|
|
1999
2596
|
canActivate: [AXPAuthGuard, canActivateAppChooser],
|
|
2000
2597
|
},
|
|
2598
|
+
{
|
|
2599
|
+
path: 'welcome-onboarding',
|
|
2600
|
+
loadComponent: () => import('./acorex-platform-module-auth-client-welcome-onboarding-page.component-C2WYgv4l.mjs').then((c) => c.AXPAuthWelcomeOnboardingPageComponent),
|
|
2601
|
+
canActivate: [AXPAuthGuard, canActivateWelcomeOnboarding],
|
|
2602
|
+
},
|
|
2001
2603
|
];
|
|
2002
2604
|
return routes;
|
|
2003
2605
|
}
|
|
@@ -2022,6 +2624,20 @@ class AXPAccountModule {
|
|
|
2022
2624
|
component: AXMUserProfileCardSlotComponent,
|
|
2023
2625
|
},
|
|
2024
2626
|
],
|
|
2627
|
+
'root-footer-end': [
|
|
2628
|
+
{
|
|
2629
|
+
priority: 20,
|
|
2630
|
+
name: 'pwa-install-prompt',
|
|
2631
|
+
component: AXMPwaInstallPromptComponent,
|
|
2632
|
+
},
|
|
2633
|
+
],
|
|
2634
|
+
'root-layout-overlay': [
|
|
2635
|
+
{
|
|
2636
|
+
priority: 10,
|
|
2637
|
+
name: 'pwa-install-prompt',
|
|
2638
|
+
component: AXMPwaInstallPromptComponent,
|
|
2639
|
+
},
|
|
2640
|
+
],
|
|
2025
2641
|
'root-header-end': [
|
|
2026
2642
|
{
|
|
2027
2643
|
priority: 98,
|
|
@@ -2049,6 +2665,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
2049
2665
|
component: AXMUserProfileCardSlotComponent,
|
|
2050
2666
|
},
|
|
2051
2667
|
],
|
|
2668
|
+
'root-footer-end': [
|
|
2669
|
+
{
|
|
2670
|
+
priority: 20,
|
|
2671
|
+
name: 'pwa-install-prompt',
|
|
2672
|
+
component: AXMPwaInstallPromptComponent,
|
|
2673
|
+
},
|
|
2674
|
+
],
|
|
2675
|
+
'root-layout-overlay': [
|
|
2676
|
+
{
|
|
2677
|
+
priority: 10,
|
|
2678
|
+
name: 'pwa-install-prompt',
|
|
2679
|
+
component: AXMPwaInstallPromptComponent,
|
|
2680
|
+
},
|
|
2681
|
+
],
|
|
2052
2682
|
'root-header-end': [
|
|
2053
2683
|
{
|
|
2054
2684
|
priority: 98,
|
|
@@ -2383,7 +3013,7 @@ class AXPIdleLockService {
|
|
|
2383
3013
|
this.overlayOpening = true;
|
|
2384
3014
|
this.locked.set(true);
|
|
2385
3015
|
try {
|
|
2386
|
-
const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-
|
|
3016
|
+
const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-ChigSAI-.mjs');
|
|
2387
3017
|
const panelClasses = ['axm-session-lock-overlay-shell'];
|
|
2388
3018
|
if (this.platform.isDark()) {
|
|
2389
3019
|
panelClasses.push('ax-dark');
|
|
@@ -2582,6 +3212,26 @@ const CoreProfileSectionsHookProvider = {
|
|
|
2582
3212
|
priority: 0,
|
|
2583
3213
|
execute: (payload) => {
|
|
2584
3214
|
const contributed = [
|
|
3215
|
+
{
|
|
3216
|
+
id: 'welcome-onboarding',
|
|
3217
|
+
groupId: 'account',
|
|
3218
|
+
title: '@auth:welcome-onboarding.profile.resume-section.title',
|
|
3219
|
+
description: '@auth:welcome-onboarding.profile.resume-section.description',
|
|
3220
|
+
icon: 'far fa-hand-wave',
|
|
3221
|
+
priority: 5,
|
|
3222
|
+
layout: { colSpan: 6 },
|
|
3223
|
+
actions: [
|
|
3224
|
+
{
|
|
3225
|
+
name: 'resume-welcome',
|
|
3226
|
+
title: '@auth:welcome-onboarding.profile.resume-action',
|
|
3227
|
+
icon: 'far fa-play',
|
|
3228
|
+
command: {
|
|
3229
|
+
name: AXMAuthCommandKeys.Onboarding.Welcome,
|
|
3230
|
+
options: { force: true },
|
|
3231
|
+
},
|
|
3232
|
+
},
|
|
3233
|
+
],
|
|
3234
|
+
},
|
|
2585
3235
|
{
|
|
2586
3236
|
id: 'basic-info',
|
|
2587
3237
|
groupId: 'account',
|
|
@@ -2672,7 +3322,7 @@ const CoreProfileSectionsHookProvider = {
|
|
|
2672
3322
|
name: 'manage-two-factor',
|
|
2673
3323
|
title: '@auth:profile-page.sections.two-factor.actions.manage',
|
|
2674
3324
|
icon: 'far fa-pen',
|
|
2675
|
-
command:
|
|
3325
|
+
command: { name: AXMAuthCommandKeys.Security.ManageTwoFactor }, // auth:manage-two-factor
|
|
2676
3326
|
},
|
|
2677
3327
|
],
|
|
2678
3328
|
},
|
|
@@ -2843,10 +3493,30 @@ function buildPasswordLastChangedInsights(lastChangedAt) {
|
|
|
2843
3493
|
}
|
|
2844
3494
|
//#endregion
|
|
2845
3495
|
|
|
3496
|
+
//#region ----- Constants -----
|
|
3497
|
+
const TWO_FACTOR_SECTION_ID$1 = 'two-factor';
|
|
3498
|
+
//#endregion
|
|
3499
|
+
//#region ----- Two-factor insight -----
|
|
3500
|
+
/** Builds the enabled/disabled insight shown on the Two-Factor profile card. */
|
|
3501
|
+
function buildTwoFactorStatusInsights(enabled) {
|
|
3502
|
+
return [
|
|
3503
|
+
{
|
|
3504
|
+
id: 'two-factor-status',
|
|
3505
|
+
icon: enabled ? 'fa-light fa-fw fa-shield-check' : 'fa-light fa-fw fa-shield',
|
|
3506
|
+
text: enabled
|
|
3507
|
+
? '@auth:profile-page.sections.two-factor.insights.enabled'
|
|
3508
|
+
: '@auth:profile-page.sections.two-factor.insights.disabled',
|
|
3509
|
+
},
|
|
3510
|
+
];
|
|
3511
|
+
}
|
|
3512
|
+
//#endregion
|
|
3513
|
+
|
|
2846
3514
|
//#region ---- Section ids ----
|
|
3515
|
+
const BASIC_INFO_SECTION_ID = 'basic-info';
|
|
2847
3516
|
const SECURITY_PIN_SECTION_ID = 'security-pin';
|
|
2848
3517
|
const ACTIVE_SESSIONS_SECTION_ID = 'active-sessions';
|
|
2849
3518
|
const LOGIN_HISTORY_SECTION_ID = 'login-history';
|
|
3519
|
+
const TWO_FACTOR_SECTION_ID = 'two-factor';
|
|
2850
3520
|
//#endregion
|
|
2851
3521
|
//#region ---- Profile page security insights service ----
|
|
2852
3522
|
/** Loads contextual security insights for profile section cards. */
|
|
@@ -2855,19 +3525,34 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2855
3525
|
//#region ---- Services & Dependencies ----
|
|
2856
3526
|
this.sessionService = inject(AXPSessionService);
|
|
2857
3527
|
this.entityService = inject(AXPEntityService);
|
|
3528
|
+
this.commandService = inject(AXPCommandService);
|
|
2858
3529
|
this.translateService = inject(AXTranslationService);
|
|
2859
3530
|
this.passwordChangeTrackingService = inject(AXPAuthPasswordChangeTrackingService);
|
|
2860
3531
|
}
|
|
2861
3532
|
//#endregion
|
|
2862
3533
|
//#region ---- Public API ----
|
|
3534
|
+
/** Account-tab insights (email on Basic Information). */
|
|
3535
|
+
async loadAccountBySectionId() {
|
|
3536
|
+
const userId = this.sessionService.user?.id;
|
|
3537
|
+
if (!userId) {
|
|
3538
|
+
return {};
|
|
3539
|
+
}
|
|
3540
|
+
const user = await this.loadCurrentUser(userId);
|
|
3541
|
+
const basicInfoInsights = this.buildBasicInfoInsights(user);
|
|
3542
|
+
if (isEmpty(basicInfoInsights)) {
|
|
3543
|
+
return {};
|
|
3544
|
+
}
|
|
3545
|
+
return { [BASIC_INFO_SECTION_ID]: basicInfoInsights };
|
|
3546
|
+
}
|
|
2863
3547
|
async loadBySectionId() {
|
|
2864
3548
|
const userId = this.sessionService.user?.id;
|
|
2865
3549
|
if (!userId) {
|
|
2866
3550
|
return {};
|
|
2867
3551
|
}
|
|
2868
|
-
const [sessions, user] = await Promise.all([
|
|
3552
|
+
const [sessions, user, twoFactorStatus] = await Promise.all([
|
|
2869
3553
|
this.loadUserSessions(userId),
|
|
2870
3554
|
this.loadCurrentUser(userId),
|
|
3555
|
+
this.loadTwoFactorStatus(),
|
|
2871
3556
|
]);
|
|
2872
3557
|
const insightsBySectionId = {};
|
|
2873
3558
|
const passwordInsights = this.buildPasswordInsights(userId, user);
|
|
@@ -2878,6 +3563,7 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2878
3563
|
if (!isEmpty(pinInsights)) {
|
|
2879
3564
|
insightsBySectionId[SECURITY_PIN_SECTION_ID] = pinInsights;
|
|
2880
3565
|
}
|
|
3566
|
+
insightsBySectionId[TWO_FACTOR_SECTION_ID] = buildTwoFactorStatusInsights(twoFactorStatus?.enabled === true || twoFactorStatus?.enrolled === true);
|
|
2881
3567
|
const activeSessionInsights = await this.buildActiveSessionInsights(sessions);
|
|
2882
3568
|
if (!isEmpty(activeSessionInsights)) {
|
|
2883
3569
|
insightsBySectionId[ACTIVE_SESSIONS_SECTION_ID] = activeSessionInsights;
|
|
@@ -2890,6 +3576,19 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
2890
3576
|
}
|
|
2891
3577
|
//#endregion
|
|
2892
3578
|
//#region ---- Insight builders ----
|
|
3579
|
+
buildBasicInfoInsights(user) {
|
|
3580
|
+
const email = defaultTo(user?.email, '').trim();
|
|
3581
|
+
return [
|
|
3582
|
+
{
|
|
3583
|
+
id: 'email',
|
|
3584
|
+
icon: 'fa-light fa-fw fa-envelope',
|
|
3585
|
+
title: '@general:terms.communication.email',
|
|
3586
|
+
text: isEmpty(email)
|
|
3587
|
+
? '@auth:profile-page.sections.basic-info.insights.email-not-set'
|
|
3588
|
+
: email,
|
|
3589
|
+
},
|
|
3590
|
+
];
|
|
3591
|
+
}
|
|
2893
3592
|
buildPasswordInsights(userId, user) {
|
|
2894
3593
|
const lastChangedAt = this.parseValidDate(user?.passwordChangedAt) ??
|
|
2895
3594
|
this.passwordChangeTrackingService.getLastChangedAt(userId);
|
|
@@ -3009,6 +3708,19 @@ class AXPUserProfileSecurityInsightsService {
|
|
|
3009
3708
|
});
|
|
3010
3709
|
return response.items ?? [];
|
|
3011
3710
|
}
|
|
3711
|
+
async loadTwoFactorStatus() {
|
|
3712
|
+
try {
|
|
3713
|
+
const result = await this.commandService.execute(AXMSecurityManagementServerCommands.GetTwoFactorStatus, {});
|
|
3714
|
+
if (!result?.success) {
|
|
3715
|
+
return null;
|
|
3716
|
+
}
|
|
3717
|
+
return runtimeCommandPayloadData(result) ?? null;
|
|
3718
|
+
}
|
|
3719
|
+
catch (error) {
|
|
3720
|
+
console.error('Failed to load two-factor status for profile security insights', error);
|
|
3721
|
+
return null;
|
|
3722
|
+
}
|
|
3723
|
+
}
|
|
3012
3724
|
//#endregion
|
|
3013
3725
|
//#region ---- Formatting ----
|
|
3014
3726
|
parseValidDate(value) {
|
|
@@ -3042,16 +3754,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3042
3754
|
}] });
|
|
3043
3755
|
|
|
3044
3756
|
//#region ---- Security sections insights hook ----
|
|
3045
|
-
/** Adds
|
|
3757
|
+
/** Adds account + security context (email, sessions, login, password, PIN) to profile section cards. */
|
|
3046
3758
|
const SecuritySectionsInsightsHookProvider = {
|
|
3047
3759
|
key: PROFILE_PAGE_SECTIONS_HOOK,
|
|
3048
3760
|
priority: 15,
|
|
3049
3761
|
execute: async (payload) => {
|
|
3050
|
-
|
|
3762
|
+
const wantAccount = isUserProfileSectionsGroupRequested(payload, 'account');
|
|
3763
|
+
const wantSecurity = isUserProfileSectionsGroupRequested(payload, 'security');
|
|
3764
|
+
if (!wantAccount && !wantSecurity) {
|
|
3051
3765
|
return payload;
|
|
3052
3766
|
}
|
|
3053
3767
|
const insightsService = inject(AXPUserProfileSecurityInsightsService);
|
|
3054
|
-
const insightsBySectionId =
|
|
3768
|
+
const insightsBySectionId = {
|
|
3769
|
+
...(wantAccount ? await insightsService.loadAccountBySectionId() : {}),
|
|
3770
|
+
...(wantSecurity ? await insightsService.loadBySectionId() : {}),
|
|
3771
|
+
};
|
|
3055
3772
|
return {
|
|
3056
3773
|
...payload,
|
|
3057
3774
|
sections: payload.sections.map((section) => {
|
|
@@ -3187,6 +3904,213 @@ const ProfileSlotPresenceMenuHookProvider = {
|
|
|
3187
3904
|
};
|
|
3188
3905
|
//#endregion
|
|
3189
3906
|
|
|
3907
|
+
//#region ---- Profile slot install app menu hook ----
|
|
3908
|
+
/** Registers Install App in the profile dropdown while this device is not in standalone mode. */
|
|
3909
|
+
const ProfileSlotInstallAppMenuHookProvider = {
|
|
3910
|
+
key: PROFILE_SLOT_MENU_ITEMS_HOOK,
|
|
3911
|
+
priority: 5,
|
|
3912
|
+
execute: (payload) => {
|
|
3913
|
+
const pwaInstall = inject(AXPPwaInstallService);
|
|
3914
|
+
return {
|
|
3915
|
+
...payload,
|
|
3916
|
+
items: [
|
|
3917
|
+
...payload.items,
|
|
3918
|
+
{
|
|
3919
|
+
name: 'install-app',
|
|
3920
|
+
title: '@auth:pwa-install.link',
|
|
3921
|
+
icon: 'fa-light fa-download',
|
|
3922
|
+
visible: pwaInstall.offerInProfile(),
|
|
3923
|
+
command: {
|
|
3924
|
+
name: 'navigate',
|
|
3925
|
+
options: {
|
|
3926
|
+
path: '/auth/install',
|
|
3927
|
+
},
|
|
3928
|
+
},
|
|
3929
|
+
},
|
|
3930
|
+
],
|
|
3931
|
+
};
|
|
3932
|
+
},
|
|
3933
|
+
};
|
|
3934
|
+
//#endregion
|
|
3935
|
+
|
|
3936
|
+
//#region ----- Welcome preference steps hook -----
|
|
3937
|
+
/**
|
|
3938
|
+
* Core welcome preference steps, ordered for first-run UX:
|
|
3939
|
+
* language first (so later steps are readable), then appearance.
|
|
3940
|
+
* Editors use the same setting definitions as Settings → User.
|
|
3941
|
+
*/
|
|
3942
|
+
const WelcomeIntroOnboardingHookProvider = {
|
|
3943
|
+
key: ONBOARDING_STEPS_HOOK,
|
|
3944
|
+
priority: 0,
|
|
3945
|
+
execute: (payload) => ({
|
|
3946
|
+
...payload,
|
|
3947
|
+
steps: [
|
|
3948
|
+
...payload.steps,
|
|
3949
|
+
{
|
|
3950
|
+
id: 'welcome-intro',
|
|
3951
|
+
scope: 'user',
|
|
3952
|
+
title: '@auth:welcome-onboarding.steps.welcome-intro.title',
|
|
3953
|
+
description: '@auth:welcome-onboarding.steps.welcome-intro.description',
|
|
3954
|
+
icon: 'fa-solid fa-earth-americas',
|
|
3955
|
+
priority: 10,
|
|
3956
|
+
settingKeys: [AXPRegionalSetting.Language, AXPRegionalSetting.TimeZone],
|
|
3957
|
+
},
|
|
3958
|
+
{
|
|
3959
|
+
id: 'welcome-appearance',
|
|
3960
|
+
scope: 'user',
|
|
3961
|
+
title: '@auth:welcome-onboarding.steps.welcome-appearance.title',
|
|
3962
|
+
description: '@auth:welcome-onboarding.steps.welcome-appearance.description',
|
|
3963
|
+
icon: 'far fa-palette',
|
|
3964
|
+
priority: 15,
|
|
3965
|
+
settingKeys: [
|
|
3966
|
+
AXPThemeLayoutSetting.Mode,
|
|
3967
|
+
AXPThemeLayoutSetting.Palette,
|
|
3968
|
+
AXPThemeLayoutSetting.MenuOrientation,
|
|
3969
|
+
AXPThemeLayoutSetting.MenuVerticalMode,
|
|
3970
|
+
AXPThemeLayoutSetting.HeaderAppearance,
|
|
3971
|
+
],
|
|
3972
|
+
},
|
|
3973
|
+
],
|
|
3974
|
+
}),
|
|
3975
|
+
};
|
|
3976
|
+
//#endregion
|
|
3977
|
+
|
|
3978
|
+
//#region ----- Profile basics step hook -----
|
|
3979
|
+
const welcomeSubFlowReturn = { subFlowReturnUrl: WELCOME_ONBOARDING_ROUTE };
|
|
3980
|
+
/**
|
|
3981
|
+
* User-scoped profile basics step (priority 20).
|
|
3982
|
+
* Self-service display name + photo only — no position/org assignment.
|
|
3983
|
+
*/
|
|
3984
|
+
const ProfileBasicsOnboardingHookProvider = {
|
|
3985
|
+
key: ONBOARDING_STEPS_HOOK,
|
|
3986
|
+
priority: 0,
|
|
3987
|
+
execute: (payload) => ({
|
|
3988
|
+
...payload,
|
|
3989
|
+
steps: [
|
|
3990
|
+
...payload.steps,
|
|
3991
|
+
{
|
|
3992
|
+
id: 'profile-basics',
|
|
3993
|
+
scope: 'user',
|
|
3994
|
+
title: '@auth:welcome-onboarding.steps.profile-basics.title',
|
|
3995
|
+
description: '@auth:welcome-onboarding.steps.profile-basics.description',
|
|
3996
|
+
icon: 'far fa-user',
|
|
3997
|
+
priority: 20,
|
|
3998
|
+
actions: [
|
|
3999
|
+
{
|
|
4000
|
+
text: '@auth:welcome-onboarding.steps.profile-basics.edit-account',
|
|
4001
|
+
icon: 'fa-regular fa-pen',
|
|
4002
|
+
command: { name: AXMAuthCommandKeys.Profile.EditAccountInfo, options: welcomeSubFlowReturn },
|
|
4003
|
+
},
|
|
4004
|
+
{
|
|
4005
|
+
text: '@auth:welcome-onboarding.steps.profile-basics.change-photo',
|
|
4006
|
+
icon: 'fa-regular fa-camera',
|
|
4007
|
+
command: { name: AXMAuthCommandKeys.Profile.ChangePhoto, options: welcomeSubFlowReturn },
|
|
4008
|
+
},
|
|
4009
|
+
],
|
|
4010
|
+
},
|
|
4011
|
+
],
|
|
4012
|
+
}),
|
|
4013
|
+
};
|
|
4014
|
+
//#endregion
|
|
4015
|
+
|
|
4016
|
+
//#region ----- Navigation & typography welcome steps -----
|
|
4017
|
+
/** User preference steps: typography (with appearance), then navigation. */
|
|
4018
|
+
const WelcomeNavigationTypographyOnboardingHookProvider = {
|
|
4019
|
+
key: ONBOARDING_STEPS_HOOK,
|
|
4020
|
+
priority: 5,
|
|
4021
|
+
execute: (payload) => ({
|
|
4022
|
+
...payload,
|
|
4023
|
+
steps: [
|
|
4024
|
+
...payload.steps,
|
|
4025
|
+
{
|
|
4026
|
+
id: 'welcome-typography',
|
|
4027
|
+
scope: 'user',
|
|
4028
|
+
title: '@auth:welcome-onboarding.steps.welcome-typography.title',
|
|
4029
|
+
description: '@auth:welcome-onboarding.steps.welcome-typography.description',
|
|
4030
|
+
icon: 'fa-solid fa-font',
|
|
4031
|
+
priority: 16,
|
|
4032
|
+
settingKeys: [AXPThemeLayoutSetting.Font, AXPThemeLayoutSetting.FontSize],
|
|
4033
|
+
},
|
|
4034
|
+
{
|
|
4035
|
+
id: 'welcome-navigation',
|
|
4036
|
+
scope: 'user',
|
|
4037
|
+
title: '@auth:welcome-onboarding.steps.welcome-navigation.title',
|
|
4038
|
+
description: '@auth:welcome-onboarding.steps.welcome-navigation.description',
|
|
4039
|
+
icon: 'fa-solid fa-table-columns',
|
|
4040
|
+
priority: 17,
|
|
4041
|
+
settingKeys: [AXPCommonSettings.NavigationMode, AXPCommonSettings.MaxOpenTabs],
|
|
4042
|
+
},
|
|
4043
|
+
],
|
|
4044
|
+
}),
|
|
4045
|
+
};
|
|
4046
|
+
//#endregion
|
|
4047
|
+
|
|
4048
|
+
//#region ----- Welcome onboarding trigger -----
|
|
4049
|
+
const WELCOME_TRIGGER_DELAY_MS = 600;
|
|
4050
|
+
/** Opens the welcome wizard after terms when the assembled plan is incomplete and not snoozed. */
|
|
4051
|
+
class AXPWelcomeOnboardingTriggerService {
|
|
4052
|
+
//#endregion
|
|
4053
|
+
//#region ----- Lifecycle -----
|
|
4054
|
+
constructor() {
|
|
4055
|
+
//#region ----- Services & Dependencies -----
|
|
4056
|
+
this.sessionService = inject(AXPSessionService);
|
|
4057
|
+
this.appInitService = inject(AXPAppStartUpService);
|
|
4058
|
+
this.flowService = inject(AXPWelcomeOnboardingFlowService);
|
|
4059
|
+
this.router = inject(Router);
|
|
4060
|
+
this.destroyRef = inject(DestroyRef);
|
|
4061
|
+
//#endregion
|
|
4062
|
+
//#region ----- State -----
|
|
4063
|
+
this.triggerGeneration = 0;
|
|
4064
|
+
this.appInitService.registerTask({
|
|
4065
|
+
name: 'welcome-onboarding',
|
|
4066
|
+
// Silent — no splash status text
|
|
4067
|
+
priority: AXP_APP_STARTUP_PRIORITY.terms + 1,
|
|
4068
|
+
run: async () => {
|
|
4069
|
+
// Evaluated reactively once the session is authorized with an application.
|
|
4070
|
+
},
|
|
4071
|
+
});
|
|
4072
|
+
combineLatest([this.sessionService.isAuthorized$, this.sessionService.application$])
|
|
4073
|
+
.pipe(distinctUntilChanged(([authorized, app], [previousAuthorized, previousApp]) => authorized === previousAuthorized && app?.id === previousApp?.id), switchMap(([authorized, app]) => {
|
|
4074
|
+
if (!authorized || !app || !this.sessionService.hasSessionCredentials()) {
|
|
4075
|
+
this.triggerGeneration++;
|
|
4076
|
+
return EMPTY;
|
|
4077
|
+
}
|
|
4078
|
+
const generation = this.triggerGeneration;
|
|
4079
|
+
return from(this.evaluateWelcomePlan(generation));
|
|
4080
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
4081
|
+
.subscribe();
|
|
4082
|
+
}
|
|
4083
|
+
//#endregion
|
|
4084
|
+
//#region ----- Evaluation -----
|
|
4085
|
+
async evaluateWelcomePlan(generation) {
|
|
4086
|
+
if (!this.canTrigger() || generation !== this.triggerGeneration) {
|
|
4087
|
+
return;
|
|
4088
|
+
}
|
|
4089
|
+
const pending = await this.flowService.evaluatePending(false);
|
|
4090
|
+
if (generation !== this.triggerGeneration || !this.canTrigger() || !pending) {
|
|
4091
|
+
return;
|
|
4092
|
+
}
|
|
4093
|
+
setTimeout(() => {
|
|
4094
|
+
if (generation !== this.triggerGeneration || !this.canTrigger()) {
|
|
4095
|
+
return;
|
|
4096
|
+
}
|
|
4097
|
+
const url = this.router.url;
|
|
4098
|
+
if (url.includes('/auth/account/welcome-onboarding')) {
|
|
4099
|
+
return;
|
|
4100
|
+
}
|
|
4101
|
+
void this.router.navigate(['/auth/account/welcome-onboarding']);
|
|
4102
|
+
}, WELCOME_TRIGGER_DELAY_MS);
|
|
4103
|
+
}
|
|
4104
|
+
canTrigger() {
|
|
4105
|
+
return this.sessionService.isReadyForAppScopedApi;
|
|
4106
|
+
}
|
|
4107
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4108
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService }); }
|
|
4109
|
+
}
|
|
4110
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPWelcomeOnboardingTriggerService, decorators: [{
|
|
4111
|
+
type: Injectable
|
|
4112
|
+
}], ctorParameters: () => [] });
|
|
4113
|
+
|
|
3190
4114
|
//#region ---- User avatar client middleware ----
|
|
3191
4115
|
const USER_ENTITY = `${RootConfig.module.name}.${RootConfig.entities.users.name}`;
|
|
3192
4116
|
/** Refreshes avatar cache/session after user detail saves avatar. */
|
|
@@ -3219,26 +4143,48 @@ const TITLE_KEYS = {
|
|
|
3219
4143
|
login_failed: '@auth:security-alert.login-failed.title',
|
|
3220
4144
|
account_locked: '@auth:security-alert.account-locked.title',
|
|
3221
4145
|
logout: '@auth:security-alert.logout.title',
|
|
4146
|
+
two_factor_enabled: '@auth:security-alert.two-factor-enabled.title',
|
|
4147
|
+
two_factor_disabled: '@auth:security-alert.two-factor-disabled.title',
|
|
4148
|
+
two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.title',
|
|
4149
|
+
two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.title',
|
|
3222
4150
|
};
|
|
3223
4151
|
const CONTENT_KEYS = {
|
|
3224
4152
|
login_success: '@auth:security-alert.login-success.content',
|
|
3225
4153
|
login_failed: '@auth:security-alert.login-failed.content',
|
|
3226
4154
|
account_locked: '@auth:security-alert.account-locked.content',
|
|
3227
4155
|
logout: '@auth:security-alert.logout.content',
|
|
4156
|
+
two_factor_enabled: '@auth:security-alert.two-factor-enabled.content',
|
|
4157
|
+
two_factor_disabled: '@auth:security-alert.two-factor-disabled.content',
|
|
4158
|
+
two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content',
|
|
4159
|
+
two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content',
|
|
3228
4160
|
};
|
|
3229
4161
|
const CONTENT_WITH_DETAIL_KEYS = {
|
|
3230
4162
|
login_success: '@auth:security-alert.login-success.content-with-detail',
|
|
3231
4163
|
login_failed: '@auth:security-alert.login-failed.content-with-detail',
|
|
3232
4164
|
account_locked: '@auth:security-alert.account-locked.content-with-detail',
|
|
3233
4165
|
logout: '@auth:security-alert.logout.content-with-detail',
|
|
4166
|
+
two_factor_enabled: '@auth:security-alert.two-factor-enabled.content-with-detail',
|
|
4167
|
+
two_factor_disabled: '@auth:security-alert.two-factor-disabled.content-with-detail',
|
|
4168
|
+
two_factor_admin_reset: '@auth:security-alert.two-factor-admin-reset.content-with-detail',
|
|
4169
|
+
two_factor_recovery_codes_regenerated: '@auth:security-alert.two-factor-recovery-codes-regenerated.content-with-detail',
|
|
3234
4170
|
};
|
|
3235
|
-
/**
|
|
4171
|
+
/** True while handling remote terminate (suppresses duplicate dialog + logout toast). */
|
|
3236
4172
|
let remoteTerminateDialogOpen = false;
|
|
3237
|
-
async function showAuthSecurityAlertToast(envelope, toast, translate) {
|
|
4173
|
+
async function showAuthSecurityAlertToast(envelope, toast, translate, sessionService) {
|
|
3238
4174
|
const payload = (envelope.payload ?? {});
|
|
3239
4175
|
if (!payload.kind || payload.kind === 'session_terminated' || !TITLE_KEYS[payload.kind]) {
|
|
3240
4176
|
return;
|
|
3241
4177
|
}
|
|
4178
|
+
// "Signed Out Elsewhere" is for other devices only — never toast on the signing-out browser.
|
|
4179
|
+
if (payload.kind === 'logout' && sessionService) {
|
|
4180
|
+
const [stillAuthenticated, loading] = await Promise.all([
|
|
4181
|
+
firstValueFrom(sessionService.isAuthenticated$),
|
|
4182
|
+
firstValueFrom(sessionService.isLoading$),
|
|
4183
|
+
]);
|
|
4184
|
+
if (!stillAuthenticated || loading) {
|
|
4185
|
+
return;
|
|
4186
|
+
}
|
|
4187
|
+
}
|
|
3242
4188
|
const detail = [payload.deviceSummary, payload.ipAddress]
|
|
3243
4189
|
.map((part) => (part ?? '').trim())
|
|
3244
4190
|
.filter(Boolean)
|
|
@@ -3251,20 +4197,30 @@ async function showAuthSecurityAlertToast(envelope, toast, translate) {
|
|
|
3251
4197
|
params: { detail },
|
|
3252
4198
|
})
|
|
3253
4199
|
: CONTENT_KEYS[payload.kind];
|
|
3254
|
-
const color = payload.kind === 'login_success' ||
|
|
4200
|
+
const color = payload.kind === 'login_success' ||
|
|
4201
|
+
payload.kind === 'logout' ||
|
|
4202
|
+
payload.kind === 'two_factor_enabled' ||
|
|
4203
|
+
payload.kind === 'two_factor_disabled' ||
|
|
4204
|
+
payload.kind === 'two_factor_recovery_codes_regenerated'
|
|
4205
|
+
? 'warning'
|
|
4206
|
+
: 'danger';
|
|
3255
4207
|
toast.show({ color, title, content, closeButton: true, timeOut: 8000 });
|
|
3256
4208
|
}
|
|
3257
4209
|
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) {
|
|
4210
|
+
if (remoteTerminateDialogOpen) {
|
|
3264
4211
|
return;
|
|
3265
4212
|
}
|
|
4213
|
+
// Set before any await so a concurrent logout envelope skips its toast.
|
|
3266
4214
|
remoteTerminateDialogOpen = true;
|
|
3267
4215
|
try {
|
|
4216
|
+
const [stillAuthenticated, loading] = await Promise.all([
|
|
4217
|
+
firstValueFrom(sessionService.isAuthenticated$),
|
|
4218
|
+
firstValueFrom(sessionService.isLoading$),
|
|
4219
|
+
]);
|
|
4220
|
+
// Skip while local sign-out / session bind is in flight (avoids dialog on self-logout).
|
|
4221
|
+
if (!stillAuthenticated || loading) {
|
|
4222
|
+
return;
|
|
4223
|
+
}
|
|
3268
4224
|
// Backdrop click is disabled by AXDialogService.open — only Okay closes.
|
|
3269
4225
|
await dialog.alert('@auth:security-alert.session-terminated.title', '@auth:security-alert.session-terminated.content', 'danger', 'horizontal');
|
|
3270
4226
|
const authenticatedAfterAck = await firstValueFrom(sessionService.isAuthenticated$);
|
|
@@ -3303,7 +4259,11 @@ function provideAuthSecurityAlertRealtime() {
|
|
|
3303
4259
|
await handleRemoteSessionTerminated(sessionService, dialog, router);
|
|
3304
4260
|
return;
|
|
3305
4261
|
}
|
|
3306
|
-
|
|
4262
|
+
// Logout often arrives with session_terminated on the same socket — dialog only.
|
|
4263
|
+
if (payload.kind === 'logout' && remoteTerminateDialogOpen) {
|
|
4264
|
+
return;
|
|
4265
|
+
}
|
|
4266
|
+
await showAuthSecurityAlertToast(envelope, toast, translate, sessionService);
|
|
3307
4267
|
});
|
|
3308
4268
|
},
|
|
3309
4269
|
};
|
|
@@ -3314,7 +4274,7 @@ function provideAuthSecurityAlertRealtime() {
|
|
|
3314
4274
|
//#endregion
|
|
3315
4275
|
|
|
3316
4276
|
function profileRoutesFactory() {
|
|
3317
|
-
const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-
|
|
4277
|
+
const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-BhmMsO3g.mjs').then((c) => c.AXMUserProfilePageComponent);
|
|
3318
4278
|
return [
|
|
3319
4279
|
{
|
|
3320
4280
|
path: ':app/profile',
|
|
@@ -3340,12 +4300,23 @@ class AXMAuthModule {
|
|
|
3340
4300
|
constructor() {
|
|
3341
4301
|
inject(AXPIdleLockService);
|
|
3342
4302
|
inject(AXPLogoEntitySyncService);
|
|
4303
|
+
inject(AXPWelcomeOnboardingTriggerService);
|
|
3343
4304
|
}
|
|
3344
4305
|
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,
|
|
4306
|
+
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
4307
|
AXMAuthValidationRulesModule] }); }
|
|
3347
4308
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthModule, providers: [
|
|
3348
4309
|
...provideAuthSecurityAlertRealtime(),
|
|
4310
|
+
provideAppStartUpTask(() => {
|
|
4311
|
+
const pwaInstall = inject(AXPPwaInstallService);
|
|
4312
|
+
return {
|
|
4313
|
+
name: 'pwa-install-prompt',
|
|
4314
|
+
priority: AXP_APP_STARTUP_PRIORITY.terms,
|
|
4315
|
+
run: async () => {
|
|
4316
|
+
pwaInstall.start();
|
|
4317
|
+
},
|
|
4318
|
+
};
|
|
4319
|
+
}),
|
|
3349
4320
|
provideAppStartUpTask(() => {
|
|
3350
4321
|
const sessionService = inject(AXPSessionService);
|
|
3351
4322
|
const idleLockService = inject(AXPIdleLockService);
|
|
@@ -3430,12 +4401,12 @@ class AXMAuthModule {
|
|
|
3430
4401
|
}),
|
|
3431
4402
|
AXMAuthErrorHandler,
|
|
3432
4403
|
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-
|
|
4404
|
+
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
|
|
4405
|
+
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-DLTbTEe6.mjs').then((module) => module.AXMProfilePageComponentProvider)),
|
|
3435
4406
|
provideQuerySetups([
|
|
3436
4407
|
{
|
|
3437
4408
|
key: 'Auth:GetUserActivity',
|
|
3438
|
-
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-
|
|
4409
|
+
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-CV9mdOBi.mjs').then((c) => c.AXMGetUserActivityQuery),
|
|
3439
4410
|
},
|
|
3440
4411
|
]),
|
|
3441
4412
|
{
|
|
@@ -3455,39 +4426,43 @@ class AXMAuthModule {
|
|
|
3455
4426
|
},
|
|
3456
4427
|
{
|
|
3457
4428
|
key: AXMAuthCommandKeys.Session.Signout,
|
|
3458
|
-
command: () => import('./acorex-platform-module-auth-client-signout-command-
|
|
4429
|
+
command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
|
|
3459
4430
|
},
|
|
3460
4431
|
{
|
|
3461
4432
|
key: AXMAuthCommandKeys.Session.OpenSessions,
|
|
3462
|
-
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-
|
|
4433
|
+
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-CEpu6c7D.mjs').then((c) => c.AXPOpenSessionsCommand),
|
|
3463
4434
|
},
|
|
3464
4435
|
{
|
|
3465
4436
|
key: AXMAuthCommandKeys.Session.LockScreen,
|
|
3466
|
-
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-
|
|
4437
|
+
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs').then((c) => c.AXPLockScreenCommand),
|
|
3467
4438
|
},
|
|
3468
4439
|
{
|
|
3469
4440
|
key: AXMAuthCommandKeys.Profile.ChangePhoto,
|
|
3470
|
-
command: () => import('./acorex-platform-module-auth-client-change-photo.command-
|
|
4441
|
+
command: () => import('./acorex-platform-module-auth-client-change-photo.command-CML784Lg.mjs').then((c) => c.AXPChangePhotoCommand),
|
|
3471
4442
|
},
|
|
3472
4443
|
{
|
|
3473
4444
|
key: AXMAuthCommandKeys.Profile.EditAccountInfo,
|
|
3474
|
-
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-
|
|
4445
|
+
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
|
|
3475
4446
|
},
|
|
3476
4447
|
{
|
|
3477
4448
|
key: AXMAuthCommandKeys.Security.ChangePassword,
|
|
3478
|
-
command: () => import('./acorex-platform-module-auth-client-change-password.command-
|
|
4449
|
+
command: () => import('./acorex-platform-module-auth-client-change-password.command-CknYaMZD.mjs').then((c) => c.AXPChangePasswordCommand),
|
|
4450
|
+
},
|
|
4451
|
+
{
|
|
4452
|
+
key: AXMAuthCommandKeys.Security.ManageTwoFactor,
|
|
4453
|
+
command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs').then((c) => c.AXPManageTwoFactorCommand),
|
|
3479
4454
|
},
|
|
3480
4455
|
{
|
|
3481
4456
|
key: AXMAuthCommandKeys.Security.SetPinCode,
|
|
3482
|
-
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-
|
|
4457
|
+
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CefSbJz8.mjs').then((c) => c.AXPSetPinCodeCommand),
|
|
3483
4458
|
},
|
|
3484
4459
|
{
|
|
3485
4460
|
key: AXMAuthCommandKeys.Security.RemovePinCode,
|
|
3486
|
-
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-
|
|
4461
|
+
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-BenNCyt6.mjs').then((c) => c.AXPRemovePinCodeCommand),
|
|
3487
4462
|
},
|
|
3488
4463
|
{
|
|
3489
4464
|
key: AXMAuthCommandKeys.Security.ViewLoginHistory,
|
|
3490
|
-
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-
|
|
4465
|
+
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-CKPbyVWd.mjs').then((c) => c.AXPViewLoginHistoryCommand),
|
|
3491
4466
|
},
|
|
3492
4467
|
{
|
|
3493
4468
|
key: AXMAuthCommandKeys.Security.EditSignature,
|
|
@@ -3497,47 +4472,76 @@ class AXMAuthModule {
|
|
|
3497
4472
|
key: AXMAuthCommandKeys.Profile.ComingSoon,
|
|
3498
4473
|
command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
|
|
3499
4474
|
},
|
|
4475
|
+
{
|
|
4476
|
+
key: AXMAuthCommandKeys.Onboarding.Welcome,
|
|
4477
|
+
command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
|
|
4478
|
+
},
|
|
4479
|
+
{
|
|
4480
|
+
key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
|
|
4481
|
+
command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
|
|
4482
|
+
},
|
|
3500
4483
|
]),
|
|
4484
|
+
AXPWelcomeOnboardingTriggerService,
|
|
3501
4485
|
{
|
|
3502
|
-
provide:
|
|
4486
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3503
4487
|
useValue: ProfileSlotLogoutMenuHookProvider,
|
|
3504
4488
|
multi: true,
|
|
3505
4489
|
},
|
|
3506
4490
|
{
|
|
3507
|
-
provide:
|
|
4491
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3508
4492
|
useValue: ProfileSlotMyProfileMenuHookProvider,
|
|
3509
4493
|
multi: true,
|
|
3510
4494
|
},
|
|
3511
4495
|
{
|
|
3512
|
-
provide:
|
|
4496
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4497
|
+
useValue: ProfileSlotInstallAppMenuHookProvider,
|
|
4498
|
+
multi: true,
|
|
4499
|
+
},
|
|
4500
|
+
{
|
|
4501
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3513
4502
|
useValue: ProfileSlotLockMenuHookProvider,
|
|
3514
4503
|
multi: true,
|
|
3515
4504
|
},
|
|
3516
4505
|
{
|
|
3517
|
-
provide:
|
|
4506
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3518
4507
|
useValue: ProfileSlotPresenceMenuHookProvider,
|
|
3519
4508
|
multi: true,
|
|
3520
4509
|
},
|
|
3521
4510
|
{
|
|
3522
|
-
provide:
|
|
4511
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3523
4512
|
useValue: CoreProfileGroupsHookProvider,
|
|
3524
4513
|
multi: true,
|
|
3525
4514
|
},
|
|
3526
4515
|
{
|
|
3527
|
-
provide:
|
|
4516
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3528
4517
|
useValue: CoreProfileSectionsHookProvider,
|
|
3529
4518
|
multi: true,
|
|
3530
4519
|
},
|
|
3531
4520
|
{
|
|
3532
|
-
provide:
|
|
4521
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3533
4522
|
useValue: SecurityPinSectionHookProvider,
|
|
3534
4523
|
multi: true,
|
|
3535
4524
|
},
|
|
3536
4525
|
{
|
|
3537
|
-
provide:
|
|
4526
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3538
4527
|
useValue: SecuritySectionsInsightsHookProvider,
|
|
3539
4528
|
multi: true,
|
|
3540
4529
|
},
|
|
4530
|
+
{
|
|
4531
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4532
|
+
useValue: WelcomeIntroOnboardingHookProvider,
|
|
4533
|
+
multi: true,
|
|
4534
|
+
},
|
|
4535
|
+
{
|
|
4536
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4537
|
+
useValue: ProfileBasicsOnboardingHookProvider,
|
|
4538
|
+
multi: true,
|
|
4539
|
+
},
|
|
4540
|
+
{
|
|
4541
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4542
|
+
useValue: WelcomeNavigationTypographyOnboardingHookProvider,
|
|
4543
|
+
multi: true,
|
|
4544
|
+
},
|
|
3541
4545
|
], imports: [CommonModule,
|
|
3542
4546
|
AXPCommonModule.forChild({ errorHandlers: [AXMAuthErrorHandler] }),
|
|
3543
4547
|
RouterModule.forChild(routes),
|
|
@@ -3556,6 +4560,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3556
4560
|
],
|
|
3557
4561
|
providers: [
|
|
3558
4562
|
...provideAuthSecurityAlertRealtime(),
|
|
4563
|
+
provideAppStartUpTask(() => {
|
|
4564
|
+
const pwaInstall = inject(AXPPwaInstallService);
|
|
4565
|
+
return {
|
|
4566
|
+
name: 'pwa-install-prompt',
|
|
4567
|
+
priority: AXP_APP_STARTUP_PRIORITY.terms,
|
|
4568
|
+
run: async () => {
|
|
4569
|
+
pwaInstall.start();
|
|
4570
|
+
},
|
|
4571
|
+
};
|
|
4572
|
+
}),
|
|
3559
4573
|
provideAppStartUpTask(() => {
|
|
3560
4574
|
const sessionService = inject(AXPSessionService);
|
|
3561
4575
|
const idleLockService = inject(AXPIdleLockService);
|
|
@@ -3640,12 +4654,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3640
4654
|
}),
|
|
3641
4655
|
AXMAuthErrorHandler,
|
|
3642
4656
|
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-
|
|
4657
|
+
provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-DsKsZrOC.mjs').then(m => m.AXMSettingProvider)),
|
|
4658
|
+
provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-DLTbTEe6.mjs').then((module) => module.AXMProfilePageComponentProvider)),
|
|
3645
4659
|
provideQuerySetups([
|
|
3646
4660
|
{
|
|
3647
4661
|
key: 'Auth:GetUserActivity',
|
|
3648
|
-
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-
|
|
4662
|
+
loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-CV9mdOBi.mjs').then((c) => c.AXMGetUserActivityQuery),
|
|
3649
4663
|
},
|
|
3650
4664
|
]),
|
|
3651
4665
|
{
|
|
@@ -3665,39 +4679,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3665
4679
|
},
|
|
3666
4680
|
{
|
|
3667
4681
|
key: AXMAuthCommandKeys.Session.Signout,
|
|
3668
|
-
command: () => import('./acorex-platform-module-auth-client-signout-command-
|
|
4682
|
+
command: () => import('./acorex-platform-module-auth-client-signout-command-D4Qgv7q2.mjs').then((c) => c.AXPSignoutCommand),
|
|
3669
4683
|
},
|
|
3670
4684
|
{
|
|
3671
4685
|
key: AXMAuthCommandKeys.Session.OpenSessions,
|
|
3672
|
-
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-
|
|
4686
|
+
command: () => import('./acorex-platform-module-auth-client-open-sessions.command-CEpu6c7D.mjs').then((c) => c.AXPOpenSessionsCommand),
|
|
3673
4687
|
},
|
|
3674
4688
|
{
|
|
3675
4689
|
key: AXMAuthCommandKeys.Session.LockScreen,
|
|
3676
|
-
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-
|
|
4690
|
+
command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BH3Q6lJE.mjs').then((c) => c.AXPLockScreenCommand),
|
|
3677
4691
|
},
|
|
3678
4692
|
{
|
|
3679
4693
|
key: AXMAuthCommandKeys.Profile.ChangePhoto,
|
|
3680
|
-
command: () => import('./acorex-platform-module-auth-client-change-photo.command-
|
|
4694
|
+
command: () => import('./acorex-platform-module-auth-client-change-photo.command-CML784Lg.mjs').then((c) => c.AXPChangePhotoCommand),
|
|
3681
4695
|
},
|
|
3682
4696
|
{
|
|
3683
4697
|
key: AXMAuthCommandKeys.Profile.EditAccountInfo,
|
|
3684
|
-
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-
|
|
4698
|
+
command: () => import('./acorex-platform-module-auth-client-edit-account-info.command-DulLUfWs.mjs').then((c) => c.AXPEditAccountInfoCommand),
|
|
3685
4699
|
},
|
|
3686
4700
|
{
|
|
3687
4701
|
key: AXMAuthCommandKeys.Security.ChangePassword,
|
|
3688
|
-
command: () => import('./acorex-platform-module-auth-client-change-password.command-
|
|
4702
|
+
command: () => import('./acorex-platform-module-auth-client-change-password.command-CknYaMZD.mjs').then((c) => c.AXPChangePasswordCommand),
|
|
4703
|
+
},
|
|
4704
|
+
{
|
|
4705
|
+
key: AXMAuthCommandKeys.Security.ManageTwoFactor,
|
|
4706
|
+
command: () => import('./acorex-platform-module-auth-client-manage-two-factor.command-BAg2W20W.mjs').then((c) => c.AXPManageTwoFactorCommand),
|
|
3689
4707
|
},
|
|
3690
4708
|
{
|
|
3691
4709
|
key: AXMAuthCommandKeys.Security.SetPinCode,
|
|
3692
|
-
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-
|
|
4710
|
+
command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CefSbJz8.mjs').then((c) => c.AXPSetPinCodeCommand),
|
|
3693
4711
|
},
|
|
3694
4712
|
{
|
|
3695
4713
|
key: AXMAuthCommandKeys.Security.RemovePinCode,
|
|
3696
|
-
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-
|
|
4714
|
+
command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-BenNCyt6.mjs').then((c) => c.AXPRemovePinCodeCommand),
|
|
3697
4715
|
},
|
|
3698
4716
|
{
|
|
3699
4717
|
key: AXMAuthCommandKeys.Security.ViewLoginHistory,
|
|
3700
|
-
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-
|
|
4718
|
+
command: () => import('./acorex-platform-module-auth-client-view-login-history.command-CKPbyVWd.mjs').then((c) => c.AXPViewLoginHistoryCommand),
|
|
3701
4719
|
},
|
|
3702
4720
|
{
|
|
3703
4721
|
key: AXMAuthCommandKeys.Security.EditSignature,
|
|
@@ -3707,47 +4725,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3707
4725
|
key: AXMAuthCommandKeys.Profile.ComingSoon,
|
|
3708
4726
|
command: () => import('./acorex-platform-module-auth-client-profile-coming-soon.command-Crh2GsRA.mjs').then((c) => c.AXPProfileComingSoonCommand),
|
|
3709
4727
|
},
|
|
4728
|
+
{
|
|
4729
|
+
key: AXMAuthCommandKeys.Onboarding.Welcome,
|
|
4730
|
+
command: () => import('./acorex-platform-module-auth-client-welcome-onboarding.command-Ck1A26BI.mjs').then((c) => c.AXPWelcomeOnboardingCommand),
|
|
4731
|
+
},
|
|
4732
|
+
{
|
|
4733
|
+
key: AXMAuthCommandKeys.Account.OpenWaitingRoom,
|
|
4734
|
+
command: () => import('./acorex-platform-module-auth-client-open-waiting-room.command-CR-_ppYd.mjs').then((c) => c.AXPOpenWaitingRoomCommand),
|
|
4735
|
+
},
|
|
3710
4736
|
]),
|
|
4737
|
+
AXPWelcomeOnboardingTriggerService,
|
|
3711
4738
|
{
|
|
3712
|
-
provide:
|
|
4739
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3713
4740
|
useValue: ProfileSlotLogoutMenuHookProvider,
|
|
3714
4741
|
multi: true,
|
|
3715
4742
|
},
|
|
3716
4743
|
{
|
|
3717
|
-
provide:
|
|
4744
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3718
4745
|
useValue: ProfileSlotMyProfileMenuHookProvider,
|
|
3719
4746
|
multi: true,
|
|
3720
4747
|
},
|
|
3721
4748
|
{
|
|
3722
|
-
provide:
|
|
4749
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4750
|
+
useValue: ProfileSlotInstallAppMenuHookProvider,
|
|
4751
|
+
multi: true,
|
|
4752
|
+
},
|
|
4753
|
+
{
|
|
4754
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3723
4755
|
useValue: ProfileSlotLockMenuHookProvider,
|
|
3724
4756
|
multi: true,
|
|
3725
4757
|
},
|
|
3726
4758
|
{
|
|
3727
|
-
provide:
|
|
4759
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3728
4760
|
useValue: ProfileSlotPresenceMenuHookProvider,
|
|
3729
4761
|
multi: true,
|
|
3730
4762
|
},
|
|
3731
4763
|
{
|
|
3732
|
-
provide:
|
|
4764
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3733
4765
|
useValue: CoreProfileGroupsHookProvider,
|
|
3734
4766
|
multi: true,
|
|
3735
4767
|
},
|
|
3736
4768
|
{
|
|
3737
|
-
provide:
|
|
4769
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3738
4770
|
useValue: CoreProfileSectionsHookProvider,
|
|
3739
4771
|
multi: true,
|
|
3740
4772
|
},
|
|
3741
4773
|
{
|
|
3742
|
-
provide:
|
|
4774
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3743
4775
|
useValue: SecurityPinSectionHookProvider,
|
|
3744
4776
|
multi: true,
|
|
3745
4777
|
},
|
|
3746
4778
|
{
|
|
3747
|
-
provide:
|
|
4779
|
+
provide: AXP_HOOK_PROVIDER,
|
|
3748
4780
|
useValue: SecuritySectionsInsightsHookProvider,
|
|
3749
4781
|
multi: true,
|
|
3750
4782
|
},
|
|
4783
|
+
{
|
|
4784
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4785
|
+
useValue: WelcomeIntroOnboardingHookProvider,
|
|
4786
|
+
multi: true,
|
|
4787
|
+
},
|
|
4788
|
+
{
|
|
4789
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4790
|
+
useValue: ProfileBasicsOnboardingHookProvider,
|
|
4791
|
+
multi: true,
|
|
4792
|
+
},
|
|
4793
|
+
{
|
|
4794
|
+
provide: AXP_HOOK_PROVIDER,
|
|
4795
|
+
useValue: WelcomeNavigationTypographyOnboardingHookProvider,
|
|
4796
|
+
multi: true,
|
|
4797
|
+
},
|
|
3751
4798
|
],
|
|
3752
4799
|
}]
|
|
3753
4800
|
}], ctorParameters: () => [] });
|
|
@@ -3820,5 +4867,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3820
4867
|
* Generated bundle index. Do not edit.
|
|
3821
4868
|
*/
|
|
3822
4869
|
|
|
3823
|
-
export {
|
|
3824
|
-
//# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-
|
|
4870
|
+
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 };
|
|
4871
|
+
//# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-C1oSPf12.mjs.map
|