@acorex-platform/module-auth-client 0.0.30 → 0.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-BJduAePW.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs} +199 -60
  2. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-BeXTcP-B.mjs → acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs} +3 -3
  4. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-BeXTcP-B.mjs.map → acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs.map} +1 -1
  5. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BiAjSn5C.mjs → acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-BiAjSn5C.mjs.map → acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs.map} +1 -1
  7. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BrQVX8wA.mjs → acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs} +2 -2
  8. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-BrQVX8wA.mjs.map → acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs.map} +1 -1
  9. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-ChzxVhRM.mjs → acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs} +16 -6
  10. package/fesm2022/acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs.map +1 -0
  11. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-tuEnmBqT.mjs → acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs} +2 -2
  12. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-tuEnmBqT.mjs.map → acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs.map} +1 -1
  13. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXYUlOPx.mjs → acorex-platform-module-auth-client-login.module-DushGqH6.mjs} +3 -3
  14. package/fesm2022/{acorex-platform-module-auth-client-login.module-CXYUlOPx.mjs.map → acorex-platform-module-auth-client-login.module-DushGqH6.mjs.map} +1 -1
  15. package/fesm2022/{acorex-platform-module-auth-client-master.layout-WlPLf7po.mjs → acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs} +2 -2
  16. package/fesm2022/{acorex-platform-module-auth-client-master.layout-WlPLf7po.mjs.map → acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs.map} +1 -1
  17. package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-DcMF_kGc.mjs → acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs} +13 -23
  18. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs.map +1 -0
  19. package/fesm2022/{acorex-platform-module-auth-client-password.component-DPPz48en.mjs → acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs} +2 -2
  20. package/fesm2022/{acorex-platform-module-auth-client-password.component-DPPz48en.mjs.map → acorex-platform-module-auth-client-password.component-D5QDAaKY.mjs.map} +1 -1
  21. package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs +229 -0
  22. package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-o7Eq3zuR.mjs.map +1 -0
  23. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-BkR63GX0.mjs → acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-BkR63GX0.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs.map} +1 -1
  25. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-jhc0ZSSB.mjs → acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs} +7 -3
  26. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs.map +1 -0
  27. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-p_aNCzTQ.mjs → acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs} +2 -2
  28. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-p_aNCzTQ.mjs.map → acorex-platform-module-auth-client-register-password.component-BMHOG5m4.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-module-auth-client-register.module-ht9ZxSLU.mjs → acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs} +3 -3
  30. package/fesm2022/{acorex-platform-module-auth-client-register.module-ht9ZxSLU.mjs.map → acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs.map} +1 -1
  31. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-BHIn0igt.mjs → acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs} +2 -2
  32. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-BHIn0igt.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs.map} +1 -1
  33. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-Dy21tFJ1.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs} +2 -2
  34. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-Dy21tFJ1.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs.map} +1 -1
  35. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-CHEfCVZU.mjs → acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs} +3 -3
  36. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-CHEfCVZU.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs.map} +1 -1
  37. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-CrYXfzCf.mjs → acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs} +2 -2
  38. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-CrYXfzCf.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-Bm32dRFz.mjs.map} +1 -1
  39. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-CmcpvQia.mjs → acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs} +2 -2
  40. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-CmcpvQia.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs.map} +1 -1
  41. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-BnGwRAd-.mjs → acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs} +2 -5
  42. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-BnGwRAd-.mjs.map → acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs.map} +1 -1
  43. package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
  44. package/package.json +2 -2
  45. package/types/acorex-platform-module-auth-client.d.ts +32 -2
  46. package/fesm2022/acorex-platform-module-auth-client-acorex-platform-module-auth-client-BJduAePW.mjs.map +0 -1
  47. package/fesm2022/acorex-platform-module-auth-client-get-user-activity.query-ChzxVhRM.mjs.map +0 -1
  48. package/fesm2022/acorex-platform-module-auth-client-open-sessions.command-DcMF_kGc.mjs.map +0 -1
  49. package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-BPcaNq3h.mjs +0 -150
  50. package/fesm2022/acorex-platform-module-auth-client-profile-activity-chart.component-BPcaNq3h.mjs.map +0 -1
  51. package/fesm2022/acorex-platform-module-auth-client-profile-page.component-jhc0ZSSB.mjs.map +0 -1
@@ -3,10 +3,10 @@ import { AXPFileStorageService, AXPHomePageService, AXPPlatformSettingsLoadState
3
3
  import { AXPSessionService, AXPUnauthorizedError, AXPUnauthenticatedError, AXPAuthStrategyRegistryService, traceAuthGuard, AXPAuthGuard, AXPSessionStatus } from '@acorex-platform/framework-client/auth';
4
4
  import { AXPUserAvatarService, AXPUserAvatarComponent, AXP_PAGE_COMPONENT_PROVIDER } from '@acorex-platform/framework-client/layout/components';
5
5
  import { AXPFileStorageStatus, coerceUnknownToTrimmedString, AXPPlatformScope, AXPKeyboardShortcutPriority, verifyPassword } from '@acorex-platform/framework-shared/core';
6
- import { RootConfig } from '@acorex-platform/module-security-management-client/contracts';
6
+ import { RootConfig, AXPSecurityManagementFeatureKeys } from '@acorex-platform/module-security-management-client/contracts';
7
7
  import { AXPEntityService, AXP_ENTITY_STORAGE_MIDDLEWARE } from '@acorex-platform/framework-client/layout/entity';
8
8
  import * as i0 from '@angular/core';
9
- import { inject, Injectable, isDevMode, InjectionToken, NgModule, input, output, viewChild, viewChildren, signal, computed, effect, ChangeDetectionStrategy, Component, DestroyRef, ViewEncapsulation, ViewChild, Injector, afterNextRender, ApplicationRef } from '@angular/core';
9
+ import { inject, Injectable, isDevMode, InjectionToken, NgModule, input, output, viewChild, viewChildren, signal, computed, effect, ChangeDetectionStrategy, Component, Input, DestroyRef, ViewEncapsulation, ViewChild, Injector, afterNextRender, ApplicationRef } from '@angular/core';
10
10
  import { AXPLayoutThemeService, AXPMenuVerticalMode } from '@acorex-platform/framework-client/themes/shared';
11
11
  import { HttpErrorResponse } from '@angular/common/http';
12
12
  import * as i1$6 from '@angular/router';
@@ -29,21 +29,20 @@ import { AXDecoratorModule } from '@acorex/components/decorators';
29
29
  import * as i2$1 from '@acorex/components/popover';
30
30
  import { AXPopoverModule } from '@acorex/components/popover';
31
31
  import { RootConfig as RootConfig$1 } from '@acorex-platform/module-application-management-client/contracts';
32
- import * as i6 from '@acorex/cdk/list-navigation';
32
+ import * as i4 from '@acorex/cdk/list-navigation';
33
33
  import { AXListNavigationDirective, AXListNavigationItemDirective, AXListNavigationModule } from '@acorex/cdk/list-navigation';
34
- import * as i5 from '@acorex/components/search-box';
35
- import { AXSearchBoxModule } from '@acorex/components/search-box';
36
- import * as i4 from '@acorex/components/select-box';
37
- import { AXSelectBoxModule } from '@acorex/components/select-box';
34
+ import { AXLookupComponent } from '@acorex/components/lookup';
38
35
  import * as i2 from '@acorex/components/loading';
39
36
  import { AXLoadingModule } from '@acorex/components/loading';
40
37
  import * as i1$2 from '@acorex/components/skeleton';
41
38
  import { AXSkeletonModule } from '@acorex/components/skeleton';
42
- import * as i5$1 from '@acorex/core/translation';
39
+ import * as i5 from '@acorex/core/translation';
43
40
  import { AXTranslationModule, AXTranslationService, resolveMultiLanguageString } from '@acorex/core/translation';
44
41
  import { AXAvatarModule } from '@acorex/components/avatar';
45
42
  import { AXImageModule } from '@acorex/components/image';
46
43
  import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
44
+ import * as i6 from '@acorex/components/search-box';
45
+ import { AXSearchBoxModule } from '@acorex/components/search-box';
47
46
  import * as i1$3 from '@angular/forms';
48
47
  import { FormsModule } from '@angular/forms';
49
48
  import { AXToastService } from '@acorex/components/toast';
@@ -267,12 +266,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
267
266
  //#region ---- User activity helpers ----
268
267
  //#region ---- Constants ----
269
268
  const AUTH_USER_ACTIVITY_DEFAULT_WEEKS = 53;
269
+ /** Ignore an older sign-in cluster when the gap to the next newer day exceeds this. */
270
+ const AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS = 14;
271
+ /** Week / month / quarter / year heatmap windows, smallest first. */
272
+ const AUTH_USER_ACTIVITY_WEEK_PRESETS = [1, 2, 5, 13, 53];
270
273
  const LEVEL_THRESHOLDS = [0, 3, 8, 15, 30];
274
+ const MS_PER_DAY = 24 * 60 * 60 * 1000;
271
275
  //#endregion
272
276
  //#region ---- Date range ----
277
+ function startOfLocalDay(date) {
278
+ const value = new Date(date);
279
+ value.setHours(0, 0, 0, 0);
280
+ return value;
281
+ }
282
+ function calendarDaysBetween(newer, older) {
283
+ return Math.round((startOfLocalDay(newer).getTime() - startOfLocalDay(older).getTime()) / MS_PER_DAY);
284
+ }
273
285
  function resolveDefaultUserActivityDateRange(weeksToShow = AUTH_USER_ACTIVITY_DEFAULT_WEEKS, referenceDate = new Date()) {
274
- const today = new Date(referenceDate);
275
- today.setHours(0, 0, 0, 0);
286
+ const today = startOfLocalDay(referenceDate);
276
287
  const endSunday = new Date(today);
277
288
  endSunday.setDate(today.getDate() + (6 - today.getDay()));
278
289
  const startDate = new Date(endSunday);
@@ -280,6 +291,80 @@ function resolveDefaultUserActivityDateRange(weeksToShow = AUTH_USER_ACTIVITY_DE
280
291
  startDate.setHours(0, 0, 0, 0);
281
292
  return { startDate, endDate: endSunday };
282
293
  }
294
+ function collectUserSignInDays(sessions, userId, lookbackStart, lookbackEnd) {
295
+ const days = new Map();
296
+ const rangeStart = startOfLocalDay(lookbackStart);
297
+ const rangeEnd = startOfLocalDay(lookbackEnd);
298
+ for (const session of sessions) {
299
+ if (session.userId !== userId || session.lastLoginDate == null) {
300
+ continue;
301
+ }
302
+ const day = startOfLocalDay(new Date(session.lastLoginDate));
303
+ if (Number.isNaN(day.getTime()) || day < rangeStart || day > rangeEnd) {
304
+ continue;
305
+ }
306
+ days.set(day.getTime(), day);
307
+ }
308
+ return [...days.values()].sort((left, right) => right.getTime() - left.getTime());
309
+ }
310
+ function resolveRecentSignInCluster(activityDaysNewestFirst, gapDays) {
311
+ if (activityDaysNewestFirst.length === 0) {
312
+ return [];
313
+ }
314
+ const cluster = [activityDaysNewestFirst[0]];
315
+ for (let index = 1; index < activityDaysNewestFirst.length; index += 1) {
316
+ const newer = activityDaysNewestFirst[index - 1];
317
+ const older = activityDaysNewestFirst[index];
318
+ if (calendarDaysBetween(newer, older) > gapDays) {
319
+ break;
320
+ }
321
+ cluster.push(older);
322
+ }
323
+ return cluster;
324
+ }
325
+ function pickWeeksToCoverCluster(oldestDay, referenceDate) {
326
+ const oldest = startOfLocalDay(oldestDay);
327
+ for (const weeks of AUTH_USER_ACTIVITY_WEEK_PRESETS) {
328
+ const { startDate } = resolveDefaultUserActivityDateRange(weeks, referenceDate);
329
+ if (startDate <= oldest) {
330
+ return weeks;
331
+ }
332
+ }
333
+ return AUTH_USER_ACTIVITY_DEFAULT_WEEKS;
334
+ }
335
+ /**
336
+ * Auto heatmap window from recent sign-in days.
337
+ * Walks backward from the latest sign-in and drops an older cluster when the gap
338
+ * exceeds {@link AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS}. Empty users get one week.
339
+ */
340
+ function resolveSmartUserActivityDateRange(sessions, userId, referenceDate = new Date()) {
341
+ const lookback = resolveDefaultUserActivityDateRange(AUTH_USER_ACTIVITY_DEFAULT_WEEKS, referenceDate);
342
+ const activityDays = collectUserSignInDays(sessions, userId, lookback.startDate, lookback.endDate);
343
+ const cluster = resolveRecentSignInCluster(activityDays, AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS);
344
+ if (cluster.length === 0) {
345
+ return resolveDefaultUserActivityDateRange(1, referenceDate);
346
+ }
347
+ if (cluster.length === 1) {
348
+ return resolveDayDateRange(cluster[0]);
349
+ }
350
+ const oldest = cluster[cluster.length - 1];
351
+ return resolveDefaultUserActivityDateRange(pickWeeksToCoverCluster(oldest, referenceDate), referenceDate);
352
+ }
353
+ function resolveDayDateRange(day) {
354
+ const startDate = startOfLocalDay(day);
355
+ return { startDate, endDate: new Date(startDate) };
356
+ }
357
+ function resolveUserActivityHeatmapLayout(startDate, endDate) {
358
+ const { rangeStart, rangeEnd } = normalizeDateRange(startDate, endDate);
359
+ const spanDays = calendarDaysBetween(rangeEnd, rangeStart) + 1;
360
+ if (spanDays <= 1) {
361
+ return 'hours';
362
+ }
363
+ if (spanDays <= 35) {
364
+ return 'days';
365
+ }
366
+ return 'calendar';
367
+ }
283
368
  //#endregion
284
369
  //#region ---- Session aggregation ----
285
370
  function normalizeDateRange(startDate, endDate) {
@@ -320,6 +405,33 @@ function aggregateDailySessionCounts(sessions, params) {
320
405
  }
321
406
  return counts;
322
407
  }
408
+ /** Counts sign-in events per local hour from device session rows. */
409
+ function aggregateHourlySessionCounts(sessions, params) {
410
+ const { rangeStart, rangeEnd } = normalizeDateRange(params.startDate, params.endDate);
411
+ const counts = Array.from({ length: 24 }, () => 0);
412
+ for (const session of sessions) {
413
+ if (session.userId !== params.userId || session.lastLoginDate == null) {
414
+ continue;
415
+ }
416
+ const login = new Date(session.lastLoginDate);
417
+ if (Number.isNaN(login.getTime())) {
418
+ continue;
419
+ }
420
+ const day = startOfLocalDay(login);
421
+ if (day < rangeStart || day > rangeEnd) {
422
+ continue;
423
+ }
424
+ counts[login.getHours()] += 1;
425
+ }
426
+ return counts;
427
+ }
428
+ function buildUserActivityHours(hourlyCounts) {
429
+ return hourlyCounts.map((count, hour) => ({
430
+ hour,
431
+ count,
432
+ level: countToActivityLevel(count),
433
+ }));
434
+ }
323
435
  //#endregion
324
436
  //#region ---- Week grid ----
325
437
  function countToActivityLevel(count) {
@@ -395,12 +507,16 @@ function computeUserActivityStats(weeks) {
395
507
  function buildUserActivityDataSourceItem(params, sessions) {
396
508
  const dailyCounts = aggregateDailySessionCounts(sessions, params);
397
509
  const weeks = buildUserActivityWeeks(params, dailyCounts);
510
+ const layout = resolveUserActivityHeatmapLayout(params.startDate, params.endDate);
511
+ const hours = layout === 'hours' ? buildUserActivityHours(aggregateHourlySessionCounts(sessions, params)) : [];
398
512
  return {
399
513
  id: `${params.userId}:${toIsoDate(params.startDate)}:${toIsoDate(params.endDate)}`,
400
514
  userId: params.userId,
401
515
  startDate: toIsoDate(params.startDate),
402
516
  endDate: toIsoDate(params.endDate),
517
+ layout,
403
518
  weeks,
519
+ hours,
404
520
  stats: computeUserActivityStats(weeks),
405
521
  };
406
522
  }
@@ -877,17 +993,17 @@ const routes = [
877
993
  },
878
994
  {
879
995
  path: '',
880
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-WlPLf7po.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
881
- loadChildren: () => import('./acorex-platform-module-auth-client-login.module-CXYUlOPx.mjs').then((c) => c.AXPSignInModule),
996
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
997
+ loadChildren: () => import('./acorex-platform-module-auth-client-login.module-DushGqH6.mjs').then((c) => c.AXPSignInModule),
882
998
  },
883
999
  {
884
1000
  path: '',
885
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-WlPLf7po.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1001
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
886
1002
  loadChildren: () => import('./acorex-platform-module-auth-client-two-factor.module-BnH72Bob.mjs').then((c) => c.AXPTwoFactorModule),
887
1003
  },
888
1004
  {
889
1005
  path: '',
890
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-WlPLf7po.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1006
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
891
1007
  loadChildren: () => import('./acorex-platform-module-auth-client-routes-IX2qmeqU.mjs').then((c) => c),
892
1008
  },
893
1009
  {
@@ -901,8 +1017,8 @@ const routes = [
901
1017
  },
902
1018
  {
903
1019
  path: '',
904
- loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-WlPLf7po.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
905
- loadChildren: () => import('./acorex-platform-module-auth-client-register.module-ht9ZxSLU.mjs').then((c) => c.AXPRegisterModule),
1020
+ loadComponent: () => import('./acorex-platform-module-auth-client-master.layout-BLUWyFTY.mjs').then((c) => c.AXPAuthMasterLayoutComponent),
1021
+ loadChildren: () => import('./acorex-platform-module-auth-client-register.module-CFIHZOYj.mjs').then((c) => c.AXPRegisterModule),
906
1022
  },
907
1023
  ],
908
1024
  },
@@ -983,11 +1099,13 @@ class AXPAppChooserListComponent {
983
1099
  }
984
1100
  //#endregion
985
1101
  //#region ---- UI Handlers ----
1102
+ handleApplicationSelectionChanged(event) {
1103
+ this.selectedApplication.set(event.items?.[0] ?? null);
1104
+ }
986
1105
  handleApplicationSelect(event) {
987
1106
  if (!event.isUserInteraction) {
988
1107
  return;
989
1108
  }
990
- this.selectedApplication.set(event.component.selectedItems[0] ?? null);
991
1109
  }
992
1110
  handleListItemKeyDown(event, application) {
993
1111
  if (event.key === 'Enter' || event.key === ' ') {
@@ -1083,7 +1201,7 @@ class AXPAppChooserListComponent {
1083
1201
  }
1084
1202
  }
1085
1203
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1086
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAppChooserListComponent, isStandalone: true, selector: "axp-app-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applicationChosen: "applicationChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n @if (item.data.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.data.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i4.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i6.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i6.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1204
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPAppChooserListComponent, isStandalone: true, selector: "axp-app-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { applicationChosen: "applicationChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n [selectedTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n (onSelectionChanged)=\"handleApplicationSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n @if (item.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: 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.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1087
1205
  }
1088
1206
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPAppChooserListComponent, decorators: [{
1089
1207
  type: Component,
@@ -1093,17 +1211,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1093
1211
  AXDecoratorModule,
1094
1212
  AXLoadingModule,
1095
1213
  AXSkeletonModule,
1096
- AXSelectBoxModule,
1097
- AXSearchBoxModule,
1214
+ AXLookupComponent,
1098
1215
  AXListNavigationModule,
1099
1216
  AXTranslationModule,
1100
1217
  AXPLogoComponent,
1101
- ], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allApplications()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedApplication()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:application-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"applicationItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleApplicationSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (application of allApplications(); track application.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isApplicationSelected(application)\"\n [attr.aria-busy]=\"choosingId() === application.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isApplicationSelected(application)\"\n [class.dark:bg-primary-darker]=\"isApplicationSelected(application)\"\n [class.text-primary-on-lighter]=\"isApplicationSelected(application)\"\n [class.dark:text-primary-on-darker]=\"isApplicationSelected(application)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== application.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseApplication(application)\"\n (keydown)=\"handleListItemKeyDown($event, application)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(application)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(application.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 min-w-0 text-start md:text-base text-sm break-words md:truncate\">{{\n application.title | translate | async\n }}</span>\n @if (application.edition?.title) {\n <span class=\"text-muted text-xs shrink-0\">{{\n application.edition?.title | translate | async\n }}</span>\n }\n </div>\n @if (choosingId() === application.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n}\n\n<ng-template #applicationItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"applicationLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n @if (item.data.edition?.title) {\n <span class=\"text-muted text-xs\">{{ item.data.edition.title | translate | async }}</span>\n }\n </div>\n</ng-template>\n" }]
1218
+ ], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-10 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"w-16 h-4 rounded-md shrink-0\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-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" }]
1102
1219
  }], ctorParameters: () => [], propDecorators: { simple: [{ type: i0.Input, args: [{ isSignal: true, alias: "simple", required: false }] }], applicationChosen: [{ type: i0.Output, args: ["applicationChosen"] }], loadingChange: [{ type: i0.Output, args: ["loadingChange"] }], listNav: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXListNavigationDirective), { isSignal: true }] }], listItems: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => AXListNavigationItemDirective), { isSignal: true }] }] } });
1103
1220
 
1104
1221
  class AXMAppChooserSlotComponent {
1105
1222
  constructor() {
1106
1223
  this.sessionService = inject(AXPSessionService);
1224
+ this.themeStore = inject(AXPLayoutThemeService);
1107
1225
  this.applications$ = this.sessionService.applications$;
1108
1226
  this.appPopover = viewChild('appPopover', /* @ts-ignore */
1109
1227
  ...(ngDevMode ? [{ debugName: "appPopover" }] : /* istanbul ignore next */ []));
@@ -1112,11 +1230,11 @@ class AXMAppChooserSlotComponent {
1112
1230
  this.appPopover()?.close();
1113
1231
  }
1114
1232
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1115
- 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=\"primary\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list", inputs: ["simple"], outputs: ["applicationChosen", "loadingChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1233
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXMAppChooserSlotComponent, isStandalone: true, selector: "ng-component", viewQueries: [{ propertyName: "appPopover", first: true, predicate: ["appPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button [color]=\"themeStore.headerButtonColor()\" [look]=\"themeStore.headerButtonLook()\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXPAppChooserListComponent, selector: "axp-app-chooser-list", inputs: ["simple"], outputs: ["applicationChosen", "loadingChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1116
1234
  }
1117
1235
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAppChooserSlotComponent, decorators: [{
1118
1236
  type: Component,
1119
- args: [{ changeDetection: ChangeDetectionStrategy.Eager, imports: [CommonModule, AXButtonModule, AXPopoverModule, AXDecoratorModule, AXPAppChooserListComponent], template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button color=\"primary\" #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" }]
1237
+ args: [{ changeDetection: ChangeDetectionStrategy.Eager, imports: [CommonModule, AXButtonModule, AXPopoverModule, AXDecoratorModule, AXPAppChooserListComponent], template: "@if (applications$ | async; as applications) {\n @if (applications.length > 1) {\n <ax-button [color]=\"themeStore.headerButtonColor()\" [look]=\"themeStore.headerButtonLook()\" #appChooser>\n <ax-icon class=\"fa-regular fa-grid-2\"> </ax-icon>\n </ax-button>\n <ax-popover [target]=\"appChooser\" [openOn]=\"'toggle'\" [closeOn]=\"'clickOut'\" #appPopover>\n <div class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\">\n <axp-app-chooser-list [simple]=\"true\" (applicationChosen)=\"closePopover()\"></axp-app-chooser-list>\n </div>\n </ax-popover>\n }\n}\n" }]
1120
1238
  }], propDecorators: { appPopover: [{ type: i0.ViewChild, args: ['appPopover', { isSignal: true }] }] } });
1121
1239
 
1122
1240
  class AXPTenantChooserListComponent {
@@ -1224,11 +1342,13 @@ class AXPTenantChooserListComponent {
1224
1342
  showAllTenants() {
1225
1343
  this.showAll.update((value) => !value);
1226
1344
  }
1345
+ handleTenantSelectionChanged(event) {
1346
+ this.selectedTenant.set(event.items?.[0] ?? null);
1347
+ }
1227
1348
  handleTenantSelect(event) {
1228
1349
  if (!event.isUserInteraction) {
1229
1350
  return;
1230
1351
  }
1231
- this.selectedTenant.set(event.component.selectedItems[0] ?? null);
1232
1352
  }
1233
1353
  handleListItemKeyDown(event, tenant) {
1234
1354
  if (event.key === 'Enter' || event.key === ' ') {
@@ -1295,7 +1415,7 @@ class AXPTenantChooserListComponent {
1295
1415
  }
1296
1416
  }
1297
1417
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1298
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserListComponent, isStandalone: true, selector: "axp-tenant-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChosen: "tenantChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] pe-2 flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 justify-between py-3 items-center cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center font-medium min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i4.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "isItemTruncated", "showItemTooltip", "itemHeight", "maxVisibleItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed", "onItemSelected", "onItemClick"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i5.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i6.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i6.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1418
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserListComponent, isStandalone: true, selector: "axp-tenant-chooser-list", inputs: { simple: { classPropertyName: "simple", publicName: "simple", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tenantChosen: "tenantChosen", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "listNav", first: true, predicate: AXListNavigationDirective, descendants: true, isSignal: true }, { propertyName: "listItems", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] pe-2 flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 justify-between py-3 items-center cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center font-medium min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n [selectedTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n (onSelectionChanged)=\"handleTenantSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i2.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXLookupComponent, selector: "ax-lookup", inputs: ["name", "mode", "dataSource", "treeDataSource", "valueField", "textField", "disabledField", "columns", "treeParentField", "hasChildrenField", "searchable", "adaptivityEnabled", "caption", "alternate", "searchPlaceholder", "placeholder", "disabled", "readonly", "look", "itemHeight", "maxVisibleItems", "treeSelectionBehavior", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "value", "valueItems"], outputs: ["lookChange", "valueChange", "onValueChanged", "onSelectionChanged", "onFocus", "onBlur", "onItemClick", "onItemSelected", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXSearchBoxModule }, { kind: "component", type: i6.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i4.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i4.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "component", type: AXPLogoComponent, selector: "axp-logo", inputs: ["logoKey", "appearance", "size", "format"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1299
1419
  }
1300
1420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserListComponent, decorators: [{
1301
1421
  type: Component,
@@ -1307,17 +1427,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1307
1427
  AXDecoratorModule,
1308
1428
  AXLoadingModule,
1309
1429
  AXSkeletonModule,
1310
- AXSelectBoxModule,
1430
+ AXLookupComponent,
1311
1431
  AXSearchBoxModule,
1312
1432
  AXListNavigationModule,
1313
1433
  AXPLogoComponent,
1314
- ], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] pe-2 flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 justify-between py-3 items-center cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center font-medium min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-select-box\n class=\"w-full\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()\"\n [itemHeight]=\"56\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n >\n <ax-search-box look=\"fill\"></ax-search-box>\n </ax-select-box>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item.data)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.data.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.data.title | translate | async }}</span>\n </div>\n</ng-template>\n" }]
1434
+ ], template: "@if (isLoading()) {\n <div class=\"w-full flex flex-col gap-3\">\n @for (item of skeletonItems; track item) {\n <div class=\"flex gap-3 items-center p-2\">\n <ax-skeleton [animated]=\"true\" class=\"size-12 rounded-lg shrink-0\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"flex-1 h-5 rounded-md\"></ax-skeleton>\n </div>\n }\n </div>\n} @else if (simple()) {\n <div\n class=\"w-full overflow-auto max-h-[300px] pe-2 flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of allTenants(); track tenant.id) {\n <div\n class=\"flex gap-2 justify-between py-3 items-center cursor-pointer rounded-md transition-colors hover:bg-primary-lightest hover:dark:bg-primary-dark\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n (click)=\"chooseTenant(tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center font-medium min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n} @else if (useSelectBox()) {\n <div\n class=\"w-full flex flex-col gap-4\"\n [class.pointer-events-none]=\"isChoosing()\"\n [class.opacity-60]=\"isChoosing()\"\n (keydown.capture)=\"handleSelectBoxKeyDown($event)\"\n >\n <ax-lookup\n class=\"w-full\"\n mode=\"drop-down-list\"\n [dataSource]=\"allTenants()\"\n textField=\"title\"\n valueField=\"id\"\n [value]=\"selectedTenant()?.id\"\n [itemHeight]=\"56\"\n [searchable]=\"true\"\n [placeholder]=\"('@auth:tenant-chooser.select-placeholder' | translate | async) ?? ''\"\n [itemTemplate]=\"tenantItemTemplate\"\n [selectedTemplate]=\"tenantItemTemplate\"\n (onOpened)=\"isSelectBoxOpen.set(true)\"\n (onClosed)=\"isSelectBoxOpen.set(false)\"\n (onValueChanged)=\"handleTenantSelect($event)\"\n (onSelectionChanged)=\"handleTenantSelectionChanged($event)\"\n >\n </ax-lookup>\n <ax-button\n class=\"w-full\"\n color=\"primary\"\n [disabled]=\"!canApply() || isChoosing()\"\n [text]=\"('@general:actions.apply.title' | translate | async) ?? ''\"\n (onClick)=\"applySelection()\"\n >\n @if (isChoosing()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </div>\n} @else {\n @if (showSearchAndViewAll()) {\n <ax-search-box\n [placeholder]=\"'@general:search.title' | translate | async\"\n [ngModel]=\"searchValue()\"\n (ngModelChange)=\"handleSearch($event)\"\n class=\"w-full\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n }\n <div\n axListNavigation\n #listNav=\"axListNavigation\"\n class=\"w-full overflow-auto max-h-[300px] flex flex-col divide-y divide-neutral-100 dark:divide-neutral-800\"\n role=\"listbox\"\n [class.pointer-events-none]=\"isChoosing()\"\n >\n @for (tenant of displayedTenants(); track tenant.id) {\n <div\n axListNavigationItem\n #navItem=\"axListNavigationItem\"\n tabindex=\"0\"\n role=\"option\"\n [attr.aria-selected]=\"isTenantSelected(tenant)\"\n [attr.aria-busy]=\"choosingId() === tenant.id\"\n class=\"flex gap-2 items-center p-2 cursor-pointer rounded-md transition-colors outline-none hover:bg-primary-lightest hover:dark:bg-primary-dark focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-primary\"\n [class.bg-primary-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:bg-primary-darker]=\"isTenantSelected(tenant)\"\n [class.text-primary-on-lighter]=\"isTenantSelected(tenant)\"\n [class.dark:text-primary-on-darker]=\"isTenantSelected(tenant)\"\n [class.opacity-50]=\"isChoosing() && choosingId() !== tenant.id\"\n [class.cursor-wait]=\"isChoosing()\"\n (click)=\"chooseTenant(tenant)\"\n (keydown)=\"handleListItemKeyDown($event, tenant)\"\n >\n <div class=\"flex flex-1 gap-3 items-center min-w-0\">\n <div class=\"shrink-0 size-12 overflow-hidden rounded-lg\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(tenant)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(tenant.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"flex-1 truncate text-start md:text-base text-sm\">{{\n tenant.title | translate | async\n }}</span>\n </div>\n @if (choosingId() === tenant.id) {\n <ax-loading class=\"shrink-0\"></ax-loading>\n }\n </div>\n }\n </div>\n @if (showSearchAndViewAll()) {\n <div class=\"mt-6 w-full flex justify-center\">\n <ax-button\n (onClick)=\"showAllTenants()\"\n class=\"w-full\"\n look=\"outline\"\n [disabled]=\"isChoosing()\"\n [text]=\"\n showAll()\n ? ('@general:actions.view-less.title' | translate | async)\n : ('@general:actions.view-all.title' | translate | async)\n \"\n ></ax-button>\n </div>\n }\n}\n\n<ng-template #tenantItemTemplate let-item>\n <div class=\"flex gap-3 items-center p-2\">\n <div class=\"size-12 overflow-hidden rounded-lg shrink-0\">\n <axp-logo\n [logoKey]=\"tenantLogoKey(item)\"\n appearance=\"colored\"\n [size]=\"42\"\n [attr.alt]=\"(item.title | translate | async) ?? ''\"\n class=\"size-12 overflow-hidden rounded-lg\"\n ></axp-logo>\n </div>\n <span class=\"text-start md:text-base text-sm\">{{ item.title | translate | async }}</span>\n </div>\n</ng-template>\n" }]
1315
1435
  }], ctorParameters: () => [], propDecorators: { simple: [{ type: i0.Input, args: [{ isSignal: true, alias: "simple", required: false }] }], tenantChosen: [{ type: i0.Output, args: ["tenantChosen"] }], loadingChange: [{ type: i0.Output, args: ["loadingChange"] }], listNav: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXListNavigationDirective), { isSignal: true }] }], listItems: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => AXListNavigationItemDirective), { isSignal: true }] }] } });
1316
1436
 
1317
1437
  class AXPTenantChooserDropdownComponent {
1318
1438
  constructor() {
1319
1439
  //#region ----- Services & Dependencies -----
1320
1440
  this.sessionService = inject(AXPSessionService);
1441
+ this.router = inject(Router);
1321
1442
  //#endregion
1322
1443
  //#region ----- State Signals -----
1323
1444
  this.tenants$ = this.sessionService.tenants$;
@@ -1326,6 +1447,13 @@ class AXPTenantChooserDropdownComponent {
1326
1447
  ...(ngDevMode ? [{ debugName: "tenantsLoading" }] : /* istanbul ignore next */ []));
1327
1448
  this.tenantPopover = viewChild('tenantPopover', /* @ts-ignore */
1328
1449
  ...(ngDevMode ? [{ debugName: "tenantPopover" }] : /* istanbul ignore next */ []));
1450
+ //#endregion
1451
+ //#region ----- Inputs -----
1452
+ /**
1453
+ * When true, renders a plain inline tenant text (no popover).
1454
+ * When multiple tenants are available, the text is clickable.
1455
+ */
1456
+ this.inline = false;
1329
1457
  }
1330
1458
  //#endregion
1331
1459
  //#region ----- Lifecycle -----
@@ -1339,8 +1467,12 @@ class AXPTenantChooserDropdownComponent {
1339
1467
  closePopover() {
1340
1468
  this.tenantPopover()?.close();
1341
1469
  }
1470
+ openTenantChooser() {
1471
+ // Route registered in `AXPAccountModule` as `/auth/account/tenant-chooser`.
1472
+ void this.router.navigate(['/auth/account/tenant-chooser']);
1473
+ }
1342
1474
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1343
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserDropdownComponent, isStandalone: true, selector: "axp-tenant-chooser-dropdown", 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 (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXPTenantChooserListComponent, selector: "axp-tenant-chooser-list", inputs: ["simple"], outputs: ["tenantChosen", "loadingChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1475
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXPTenantChooserDropdownComponent, isStandalone: true, selector: "axp-tenant-chooser-dropdown", inputs: { inline: "inline" }, viewQueries: [{ propertyName: "tenantPopover", first: true, predicate: ["tenantPopover"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i1$1.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "component", type: i2$1.AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i1$2.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "component", type: AXPTenantChooserListComponent, selector: "axp-tenant-chooser-list", inputs: ["simple"], outputs: ["tenantChosen", "loadingChange"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1344
1476
  }
1345
1477
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXPTenantChooserDropdownComponent, decorators: [{
1346
1478
  type: Component,
@@ -1352,8 +1484,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1352
1484
  AXDecoratorModule,
1353
1485
  AXSkeletonModule,
1354
1486
  AXPTenantChooserListComponent,
1355
- ], 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 (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n}\n" }]
1356
- }], propDecorators: { tenantPopover: [{ type: i0.ViewChild, args: ['tenantPopover', { isSignal: true }] }] } });
1487
+ ], template: "@if (tenantsLoading()) {\n <ax-skeleton [animated]=\"true\" class=\"h-5 w-32 max-w-full\"></ax-skeleton>\n} @else if (tenants$ | async; as tenants) {\n @if (inline) {\n @if (tenants.length > 1) {\n <!-- ----- Inline dropdown for multi-tenant ----- -->\n <span\n class=\"text-xs font-medium px-3 cursor-pointer inline-flex items-center gap-1\"\n #inlineTenantTrigger\n >\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n <i class=\"fa-solid fa-caret-down text-2xs opacity-60\"></i>\n </span>\n <ax-popover\n [target]=\"inlineTenantTrigger\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <!-- ----- Plain text for single tenant ----- -->\n <span class=\"text-xs font-medium px-3\">\n {{ ((tenant$ | async)?.title | translate | async) ?? '' }}\n </span>\n }\n } @else {\n @if (tenants.length > 1) {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n #tenantChooser\n >\n <ax-suffix>\n <ax-icon class=\"fa-solid fa-caret-down\"></ax-icon>\n </ax-suffix>\n </ax-button>\n <ax-popover\n [target]=\"tenantChooser\"\n [openOn]=\"'toggle'\"\n [closeOn]=\"'clickOut'\"\n [adaptivityEnabled]=\"true\"\n #tenantPopover\n >\n <div\n class=\"bg-lightest border overflow-hidden rounded-md shadow-md w-full min-w-64 p-1\"\n >\n <axp-tenant-chooser-list\n [simple]=\"true\"\n (tenantChosen)=\"closePopover()\"\n ></axp-tenant-chooser-list>\n </div>\n </ax-popover>\n } @else {\n <ax-button\n [text]=\"((tenant$ | async)?.title | translate | async) ?? ''\"\n class=\"ax-sm\"\n look=\"blank\"\n ></ax-button>\n }\n }\n}\n" }]
1488
+ }], propDecorators: { tenantPopover: [{ type: i0.ViewChild, args: ['tenantPopover', { isSignal: true }] }], inline: [{
1489
+ type: Input
1490
+ }] } });
1357
1491
 
1358
1492
  //#region ---- Profile slot menu hook ----
1359
1493
  const PROFILE_SLOT_MENU_ITEMS_HOOK = 'profile-slot.menu-items';
@@ -1486,7 +1620,7 @@ class AXMAuthProfileSlotComponent {
1486
1620
  // AXKBDItemComponent,
1487
1621
  AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "component", type:
1488
1622
  //
1489
- AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1623
+ AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown", inputs: ["inline"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1490
1624
  }
1491
1625
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMAuthProfileSlotComponent, decorators: [{
1492
1626
  type: Component,
@@ -1521,6 +1655,10 @@ class AXMUserProfileCardSlotComponent {
1521
1655
  return this.themeStore.effectiveMenuVerticalMode() === AXPMenuVerticalMode.Compact;
1522
1656
  }, /* @ts-ignore */
1523
1657
  ...(ngDevMode ? [{ debugName: "isCompactMode" }] : /* istanbul ignore next */ []));
1658
+ this.isMenuDark = computed(() => this.themeStore.menuDarkEnabled() ||
1659
+ (this.themeStore.menuAppearance() === 'brand-light' &&
1660
+ this.themeStore.isDarkMode()), /* @ts-ignore */
1661
+ ...(ngDevMode ? [{ debugName: "isMenuDark" }] : /* istanbul ignore next */ []));
1524
1662
  this.hasPicture = signal(true, /* @ts-ignore */
1525
1663
  ...(ngDevMode ? [{ debugName: "hasPicture" }] : /* istanbul ignore next */ []));
1526
1664
  this.avatarText = signal('', /* @ts-ignore */
@@ -1532,8 +1670,8 @@ class AXMUserProfileCardSlotComponent {
1532
1670
  this.getAvatarText = () => {
1533
1671
  this.user$.pipe(first()).subscribe((user) => {
1534
1672
  const names = user?.title.split(' ');
1535
- if (names?.length && names?.length > 1) {
1536
- this.avatarText.set(`${names[0][0].toUpperCase()}${names[names.length - 1][0].toUpperCase()}`);
1673
+ if (names?.length && names[0]?.[0]) {
1674
+ this.avatarText.set(names[0][0].toUpperCase());
1537
1675
  }
1538
1676
  else
1539
1677
  return this.avatarText.set('AC');
@@ -1578,11 +1716,11 @@ class AXMUserProfileCardSlotComponent {
1578
1716
  }
1579
1717
  }
1580
1718
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserProfileCardSlotComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1581
- 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 class=\"p-3 flex items-center gap-1 border-b border-border-lighter\" [class.justify-center]=\"isCompactMode()\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"48\"\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 />\n </div>\n }\n</div>\n}\n", dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type:
1719
+ 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=\"p-3 flex items-center gap-1 border-b\"\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]=\"48\"\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:
1582
1720
  //
1583
1721
  AXImageModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "ngmodule", type: AXPopoverModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "ngmodule", type: AXTranslationModule }, { kind: "component", type:
1584
1722
  //
1585
- AXPTenantChooserDropdownComponent, selector: "axp-tenant-chooser-dropdown" }, { kind: "component", type: AXPUserAvatarComponent, selector: "axp-user-avatar", inputs: ["size", "userId", "showPresence", "displayName", "displayAvatar"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.Eager }); }
1723
+ 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 }); }
1586
1724
  }
1587
1725
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXMUserProfileCardSlotComponent, decorators: [{
1588
1726
  type: Component,
@@ -1600,7 +1738,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1600
1738
  AXPTenantChooserDropdownComponent,
1601
1739
  AsyncPipe,
1602
1740
  AXPUserAvatarComponent,
1603
- ], template: "@if((isAuthenticated$ | async)) {\n<div class=\"p-3 flex items-center gap-1 border-b border-border-lighter\" [class.justify-center]=\"isCompactMode()\">\n <div #avatar>\n <axp-user-avatar\n [size]=\"48\"\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 />\n </div>\n }\n</div>\n}\n" }]
1741
+ ], template: "@if((isAuthenticated$ | async)) {\n<div\n class=\"p-3 flex items-center gap-1 border-b\"\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]=\"48\"\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" }]
1604
1742
  }], ctorParameters: () => [], propDecorators: { profilePopover: [{
1605
1743
  type: ViewChild,
1606
1744
  args: ['profilePopover']
@@ -1778,12 +1916,12 @@ function routesFacory() {
1778
1916
  routes = [
1779
1917
  {
1780
1918
  path: 'tenant-chooser',
1781
- loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-CmcpvQia.mjs').then((c) => c.AXPAuthTenantChooserComponent),
1919
+ loadComponent: () => import('./acorex-platform-module-auth-client-tenant-chooser.component-DKTvZ1-I.mjs').then((c) => c.AXPAuthTenantChooserComponent),
1782
1920
  canActivate: [AXPAuthGuard, canActivateTenantChooser],
1783
1921
  },
1784
1922
  {
1785
1923
  path: 'app-chooser',
1786
- loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-BeXTcP-B.mjs').then((c) => c.AXPAuthAppChooserComponent),
1924
+ loadComponent: () => import('./acorex-platform-module-auth-client-app-chooser.component-TPCkYJej.mjs').then((c) => c.AXPAuthAppChooserComponent),
1787
1925
  canActivate: [AXPAuthGuard, canActivateAppChooser],
1788
1926
  },
1789
1927
  ];
@@ -2171,7 +2309,7 @@ class AXPIdleLockService {
2171
2309
  this.overlayOpening = true;
2172
2310
  this.locked.set(true);
2173
2311
  try {
2174
- const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-Dy21tFJ1.mjs');
2312
+ const { AXMSessionLockOverlayComponent: overlayComponent } = await import('./acorex-platform-module-auth-client-session-lock-overlay.component-CcGFA6Op.mjs');
2175
2313
  const panelClasses = ['axm-session-lock-overlay-shell'];
2176
2314
  if (this.platform.isDark()) {
2177
2315
  panelClasses.push('ax-dark');
@@ -2485,6 +2623,7 @@ const CoreProfileSectionsHookProvider = {
2485
2623
  id: 'delete-account',
2486
2624
  groupId: 'account',
2487
2625
  priority: 100,
2626
+ feature: AXPSecurityManagementFeatureKeys.DeleteAccount,
2488
2627
  content: {
2489
2628
  mode: 'component',
2490
2629
  componentKey: PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY,
@@ -2994,7 +3133,7 @@ const userAvatarCacheRefreshMiddleware = {
2994
3133
  //#endregion
2995
3134
 
2996
3135
  function profileRoutesFactory() {
2997
- const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-jhc0ZSSB.mjs').then((c) => c.AXMUserProfilePageComponent);
3136
+ const loadProfilePage = () => import('./acorex-platform-module-auth-client-profile-page.component-CPHQXCpS.mjs').then((c) => c.AXMUserProfilePageComponent);
2998
3137
  return [
2999
3138
  {
3000
3139
  path: ':app/profile',
@@ -3110,11 +3249,11 @@ class AXMAuthModule {
3110
3249
  AXMAuthErrorHandler,
3111
3250
  provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
3112
3251
  provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs').then(m => m.AXMSettingProvider)),
3113
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-BkR63GX0.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3252
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3114
3253
  provideQuerySetups([
3115
3254
  {
3116
3255
  key: 'Auth:GetUserActivity',
3117
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-ChzxVhRM.mjs').then((c) => c.AXMGetUserActivityQuery),
3256
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs').then((c) => c.AXMGetUserActivityQuery),
3118
3257
  },
3119
3258
  ]),
3120
3259
  {
@@ -3138,15 +3277,15 @@ class AXMAuthModule {
3138
3277
  },
3139
3278
  {
3140
3279
  key: AXMAuthCommandKeys.Session.OpenSessions,
3141
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DcMF_kGc.mjs').then((c) => c.AXPOpenSessionsCommand),
3280
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs').then((c) => c.AXPOpenSessionsCommand),
3142
3281
  },
3143
3282
  {
3144
3283
  key: AXMAuthCommandKeys.Session.LockScreen,
3145
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-tuEnmBqT.mjs').then((c) => c.AXPLockScreenCommand),
3284
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs').then((c) => c.AXPLockScreenCommand),
3146
3285
  },
3147
3286
  {
3148
3287
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3149
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-BrQVX8wA.mjs').then((c) => c.AXPChangePhotoCommand),
3288
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs').then((c) => c.AXPChangePhotoCommand),
3150
3289
  },
3151
3290
  {
3152
3291
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
@@ -3154,19 +3293,19 @@ class AXMAuthModule {
3154
3293
  },
3155
3294
  {
3156
3295
  key: AXMAuthCommandKeys.Security.ChangePassword,
3157
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BiAjSn5C.mjs').then((c) => c.AXPChangePasswordCommand),
3296
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs').then((c) => c.AXPChangePasswordCommand),
3158
3297
  },
3159
3298
  {
3160
3299
  key: AXMAuthCommandKeys.Security.SetPinCode,
3161
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CHEfCVZU.mjs').then((c) => c.AXPSetPinCodeCommand),
3300
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs').then((c) => c.AXPSetPinCodeCommand),
3162
3301
  },
3163
3302
  {
3164
3303
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3165
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-BHIn0igt.mjs').then((c) => c.AXPRemovePinCodeCommand),
3304
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs').then((c) => c.AXPRemovePinCodeCommand),
3166
3305
  },
3167
3306
  {
3168
3307
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3169
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-BnGwRAd-.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3308
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3170
3309
  },
3171
3310
  {
3172
3311
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3319,11 +3458,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3319
3458
  AXMAuthErrorHandler,
3320
3459
  provideLazyProvider(AXP_MENU_PROVIDER, () => import('./acorex-platform-module-auth-client-menu.provider-Bz-kRip4.mjs').then(m => m.AXMSecurityManagementModuleMenuProvider)),
3321
3460
  provideLazyProvider(AXP_SETTING_DEFINITION_PROVIDER, () => import('./acorex-platform-module-auth-client-settings.provider-Yaoz8yp3.mjs').then(m => m.AXMSettingProvider)),
3322
- provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-BkR63GX0.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3461
+ provideLazyProvider(AXP_PAGE_COMPONENT_PROVIDER, () => import('./acorex-platform-module-auth-client-profile-page-component.provider-CfQySdD8.mjs').then((module) => module.AXMProfilePageComponentProvider)),
3323
3462
  provideQuerySetups([
3324
3463
  {
3325
3464
  key: 'Auth:GetUserActivity',
3326
- loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-ChzxVhRM.mjs').then((c) => c.AXMGetUserActivityQuery),
3465
+ loader: () => import('./acorex-platform-module-auth-client-get-user-activity.query-DBdELID4.mjs').then((c) => c.AXMGetUserActivityQuery),
3327
3466
  },
3328
3467
  ]),
3329
3468
  {
@@ -3347,15 +3486,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3347
3486
  },
3348
3487
  {
3349
3488
  key: AXMAuthCommandKeys.Session.OpenSessions,
3350
- command: () => import('./acorex-platform-module-auth-client-open-sessions.command-DcMF_kGc.mjs').then((c) => c.AXPOpenSessionsCommand),
3489
+ command: () => import('./acorex-platform-module-auth-client-open-sessions.command-BHAf7500.mjs').then((c) => c.AXPOpenSessionsCommand),
3351
3490
  },
3352
3491
  {
3353
3492
  key: AXMAuthCommandKeys.Session.LockScreen,
3354
- command: () => import('./acorex-platform-module-auth-client-lock-screen.command-tuEnmBqT.mjs').then((c) => c.AXPLockScreenCommand),
3493
+ command: () => import('./acorex-platform-module-auth-client-lock-screen.command-BADSRZxj.mjs').then((c) => c.AXPLockScreenCommand),
3355
3494
  },
3356
3495
  {
3357
3496
  key: AXMAuthCommandKeys.Profile.ChangePhoto,
3358
- command: () => import('./acorex-platform-module-auth-client-change-photo.command-BrQVX8wA.mjs').then((c) => c.AXPChangePhotoCommand),
3497
+ command: () => import('./acorex-platform-module-auth-client-change-photo.command-BZK_W29M.mjs').then((c) => c.AXPChangePhotoCommand),
3359
3498
  },
3360
3499
  {
3361
3500
  key: AXMAuthCommandKeys.Profile.EditAccountInfo,
@@ -3363,19 +3502,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3363
3502
  },
3364
3503
  {
3365
3504
  key: AXMAuthCommandKeys.Security.ChangePassword,
3366
- command: () => import('./acorex-platform-module-auth-client-change-password.command-BiAjSn5C.mjs').then((c) => c.AXPChangePasswordCommand),
3505
+ command: () => import('./acorex-platform-module-auth-client-change-password.command-DHwnPkUO.mjs').then((c) => c.AXPChangePasswordCommand),
3367
3506
  },
3368
3507
  {
3369
3508
  key: AXMAuthCommandKeys.Security.SetPinCode,
3370
- command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-CHEfCVZU.mjs').then((c) => c.AXPSetPinCodeCommand),
3509
+ command: () => import('./acorex-platform-module-auth-client-set-pin-code.command-BSZhRCN7.mjs').then((c) => c.AXPSetPinCodeCommand),
3371
3510
  },
3372
3511
  {
3373
3512
  key: AXMAuthCommandKeys.Security.RemovePinCode,
3374
- command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-BHIn0igt.mjs').then((c) => c.AXPRemovePinCodeCommand),
3513
+ command: () => import('./acorex-platform-module-auth-client-remove-pin-code.command-CdlJF48g.mjs').then((c) => c.AXPRemovePinCodeCommand),
3375
3514
  },
3376
3515
  {
3377
3516
  key: AXMAuthCommandKeys.Security.ViewLoginHistory,
3378
- command: () => import('./acorex-platform-module-auth-client-view-login-history.command-BnGwRAd-.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3517
+ command: () => import('./acorex-platform-module-auth-client-view-login-history.command-CWmD9wNM.mjs').then((c) => c.AXPViewLoginHistoryCommand),
3379
3518
  },
3380
3519
  {
3381
3520
  key: AXMAuthCommandKeys.Security.EditSignature,
@@ -3498,5 +3637,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3498
3637
  * Generated bundle index. Do not edit.
3499
3638
  */
3500
3639
 
3501
- export { AXMUserDeviceSessionsService as A, AXMAuthenticationTypes as B, CHANGE_PASSWORD_SECTION_ID as C, AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT as D, AUTH_USER_ACTIVITY_DEFAULT_WEEKS as E, AXMAuthErrorHandler as F, AXMAuthModule as G, AXMDefaultAuthConfigs as H, AXM_AUTH_CONFIG_TOKEN as I, aggregateDailySessionCounts as J, buildUserActivityWeeks as K, canActivateLogin as L, computeUserActivityStats as M, configAuthModule as N, countToActivityLevel as O, PROFILE_PAGE_GROUPS_HOOK as P, extractUserActivityEndDate as Q, extractUserActivityStartDate as R, extractUserActivityUserId as S, isUserProfileGroupComponent as T, isUserProfileSectionsGroupRequested as U, parseAuthCredentialType as V, PROFILE_PAGE_SECTIONS_HOOK as a, 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, buildUserActivityDataSourceItem as h, AXPIdleLockService as i, AXPUserAvatarSyncService as j, AXPAuthPasswordComplexityService as k, AXPAuthPasswordChangeTrackingService as l, getPasswordComplexityHintKey as m, getPasswordComplexityValidationMessageKey as n, validatePasswordAgainstComplexity as o, buildPasswordLastChangedInsights as p, AXPLoginHistoryService as q, resolveDefaultUserProfileSectionAction as r, AXMAuthPlatformSettingsService as s, AXM_LOGIN_GUARD_TOKEN as t, AXPTenantChooserListComponent as u, visibleUserProfileSectionActions as v, AXPTenantChooserDropdownComponent as w, AXPAppChooserListComponent as x, formatCompactActivityCount as y, AXPLoginExternalProvidersComponent as z };
3502
- //# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-BJduAePW.mjs.map
3640
+ export { resolveDayDateRange as $, AXMUserDeviceSessionsService as A, AXPLoginExternalProvidersComponent as B, CHANGE_PASSWORD_SECTION_ID as C, AXMAuthenticationTypes as D, AUTH_LOGIN_EXTERNAL_PROVIDERS_SLOT as E, AUTH_USER_ACTIVITY_CLUSTER_GAP_DAYS as F, AUTH_USER_ACTIVITY_DEFAULT_WEEKS as G, AUTH_USER_ACTIVITY_WEEK_PRESETS as H, AXMAuthErrorHandler as I, AXMAuthModule as J, AXMDefaultAuthConfigs as K, AXM_AUTH_CONFIG_TOKEN as L, aggregateDailySessionCounts as M, aggregateHourlySessionCounts as N, buildUserActivityHours as O, PROFILE_PAGE_GROUPS_HOOK as P, buildUserActivityWeeks as Q, canActivateLogin as R, computeUserActivityStats as S, configAuthModule as T, countToActivityLevel as U, extractUserActivityEndDate as V, extractUserActivityStartDate as W, extractUserActivityUserId as X, isUserProfileGroupComponent as Y, isUserProfileSectionsGroupRequested as Z, parseAuthCredentialType as _, PROFILE_PAGE_SECTIONS_HOOK as a, resolveUserActivityHeatmapLayout as a0, PROFILE_PAGE_HEADER_META_HOOK as b, resolveUserProfileSectionContent as c, PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY as d, PROFILE_ACTIVITY_CHART_COMPONENT_KEY as e, PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY as f, resolveDefaultUserActivityDateRange as g, resolveSmartUserActivityDateRange as h, buildUserActivityDataSourceItem as i, AXPIdleLockService as j, AXPUserAvatarSyncService as k, AXPAuthPasswordComplexityService as l, AXPAuthPasswordChangeTrackingService as m, getPasswordComplexityHintKey as n, getPasswordComplexityValidationMessageKey as o, validatePasswordAgainstComplexity as p, buildPasswordLastChangedInsights as q, resolveDefaultUserProfileSectionAction as r, AXPLoginHistoryService as s, AXMAuthPlatformSettingsService as t, AXM_LOGIN_GUARD_TOKEN as u, visibleUserProfileSectionActions as v, AXPTenantChooserListComponent as w, AXPTenantChooserDropdownComponent as x, AXPAppChooserListComponent as y, formatCompactActivityCount as z };
3641
+ //# sourceMappingURL=acorex-platform-module-auth-client-acorex-platform-module-auth-client-CTf7qxkQ.mjs.map