@acorex-platform/module-auth-client 2.0.0-next.1 → 2.0.0-next.10

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 (52) hide show
  1. package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CWE43xt1.mjs → acorex-platform-module-auth-client-acorex-platform-module-auth-client-SkJb5De_.mjs} +36 -36
  2. package/fesm2022/{acorex-platform-module-auth-client-acorex-platform-module-auth-client-CWE43xt1.mjs.map → acorex-platform-module-auth-client-acorex-platform-module-auth-client-SkJb5De_.mjs.map} +1 -1
  3. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-D14L5cdt.mjs → acorex-platform-module-auth-client-app-chooser.component-DOVByQ1Y.mjs} +2 -2
  4. package/fesm2022/{acorex-platform-module-auth-client-app-chooser.component-D14L5cdt.mjs.map → acorex-platform-module-auth-client-app-chooser.component-DOVByQ1Y.mjs.map} +1 -1
  5. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DN0yaJ9l.mjs → acorex-platform-module-auth-client-change-password.command-4x8gjfSP.mjs} +2 -2
  6. package/fesm2022/{acorex-platform-module-auth-client-change-password.command-DN0yaJ9l.mjs.map → acorex-platform-module-auth-client-change-password.command-4x8gjfSP.mjs.map} +1 -1
  7. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-CWeeauFw.mjs → acorex-platform-module-auth-client-change-photo.command-CjjLvPGU.mjs} +2 -2
  8. package/fesm2022/{acorex-platform-module-auth-client-change-photo.command-CWeeauFw.mjs.map → acorex-platform-module-auth-client-change-photo.command-CjjLvPGU.mjs.map} +1 -1
  9. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DI0JR1cS.mjs → acorex-platform-module-auth-client-get-user-activity.query-DN9utgW4.mjs} +2 -2
  10. package/fesm2022/{acorex-platform-module-auth-client-get-user-activity.query-DI0JR1cS.mjs.map → acorex-platform-module-auth-client-get-user-activity.query-DN9utgW4.mjs.map} +1 -1
  11. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BnS3p6z3.mjs → acorex-platform-module-auth-client-lock-screen.command-D_hOIiAX.mjs} +2 -2
  12. package/fesm2022/{acorex-platform-module-auth-client-lock-screen.command-BnS3p6z3.mjs.map → acorex-platform-module-auth-client-lock-screen.command-D_hOIiAX.mjs.map} +1 -1
  13. package/fesm2022/{acorex-platform-module-auth-client-login.module-DVbaukL7.mjs → acorex-platform-module-auth-client-login.module-WwQbqd7-.mjs} +3 -3
  14. package/fesm2022/{acorex-platform-module-auth-client-login.module-DVbaukL7.mjs.map → acorex-platform-module-auth-client-login.module-WwQbqd7-.mjs.map} +1 -1
  15. package/fesm2022/{acorex-platform-module-auth-client-manage-two-factor.command-7e4HVcyU.mjs → acorex-platform-module-auth-client-manage-two-factor.command-CVJDhh2m.mjs} +2 -2
  16. package/fesm2022/{acorex-platform-module-auth-client-manage-two-factor.command-7e4HVcyU.mjs.map → acorex-platform-module-auth-client-manage-two-factor.command-CVJDhh2m.mjs.map} +1 -1
  17. package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-CMNlOr22.mjs → acorex-platform-module-auth-client-open-sessions.command-DLk84W39.mjs} +2 -2
  18. package/fesm2022/{acorex-platform-module-auth-client-open-sessions.command-CMNlOr22.mjs.map → acorex-platform-module-auth-client-open-sessions.command-DLk84W39.mjs.map} +1 -1
  19. package/fesm2022/{acorex-platform-module-auth-client-password.component-DekdMba0.mjs → acorex-platform-module-auth-client-password.component-DxALNrzl.mjs} +2 -2
  20. package/fesm2022/{acorex-platform-module-auth-client-password.component-DekdMba0.mjs.map → acorex-platform-module-auth-client-password.component-DxALNrzl.mjs.map} +1 -1
  21. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-DUpEusRs.mjs → acorex-platform-module-auth-client-profile-activity-chart.component-Dj_K4cZa.mjs} +2 -2
  22. package/fesm2022/{acorex-platform-module-auth-client-profile-activity-chart.component-DUpEusRs.mjs.map → acorex-platform-module-auth-client-profile-activity-chart.component-Dj_K4cZa.mjs.map} +1 -1
  23. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-DaFESP6l.mjs → acorex-platform-module-auth-client-profile-page-component.provider-BtfflpzH.mjs} +3 -3
  24. package/fesm2022/{acorex-platform-module-auth-client-profile-page-component.provider-DaFESP6l.mjs.map → acorex-platform-module-auth-client-profile-page-component.provider-BtfflpzH.mjs.map} +1 -1
  25. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-ClNuHd7p.mjs → acorex-platform-module-auth-client-profile-page.component-zoMpwrJM.mjs} +2 -2
  26. package/fesm2022/{acorex-platform-module-auth-client-profile-page.component-ClNuHd7p.mjs.map → acorex-platform-module-auth-client-profile-page.component-zoMpwrJM.mjs.map} +1 -1
  27. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-Cu_R4Y5F.mjs → acorex-platform-module-auth-client-register-password.component-DngD3wb3.mjs} +2 -2
  28. package/fesm2022/{acorex-platform-module-auth-client-register-password.component-Cu_R4Y5F.mjs.map → acorex-platform-module-auth-client-register-password.component-DngD3wb3.mjs.map} +1 -1
  29. package/fesm2022/{acorex-platform-module-auth-client-register.module-DwbrjF2b.mjs → acorex-platform-module-auth-client-register.module-GjhqH1S7.mjs} +3 -3
  30. package/fesm2022/{acorex-platform-module-auth-client-register.module-DwbrjF2b.mjs.map → acorex-platform-module-auth-client-register.module-GjhqH1S7.mjs.map} +1 -1
  31. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CC5IWpwS.mjs → acorex-platform-module-auth-client-remove-pin-code.command-TphAoLJG.mjs} +2 -2
  32. package/fesm2022/{acorex-platform-module-auth-client-remove-pin-code.command-CC5IWpwS.mjs.map → acorex-platform-module-auth-client-remove-pin-code.command-TphAoLJG.mjs.map} +1 -1
  33. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-8Bj33U4_.mjs → acorex-platform-module-auth-client-session-lock-overlay.component-B-IYqWN5.mjs} +2 -2
  34. package/fesm2022/{acorex-platform-module-auth-client-session-lock-overlay.component-8Bj33U4_.mjs.map → acorex-platform-module-auth-client-session-lock-overlay.component-B-IYqWN5.mjs.map} +1 -1
  35. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BEyXf2XA.mjs → acorex-platform-module-auth-client-set-pin-code.command-g8ZYcYLN.mjs} +3 -3
  36. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.command-BEyXf2XA.mjs.map → acorex-platform-module-auth-client-set-pin-code.command-g8ZYcYLN.mjs.map} +1 -1
  37. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-CRft8IKd.mjs → acorex-platform-module-auth-client-set-pin-code.component-DFWsVVmI.mjs} +2 -2
  38. package/fesm2022/{acorex-platform-module-auth-client-set-pin-code.component-CRft8IKd.mjs.map → acorex-platform-module-auth-client-set-pin-code.component-DFWsVVmI.mjs.map} +1 -1
  39. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B0kWYel9.mjs → acorex-platform-module-auth-client-tenant-chooser.component-CcmfIxWu.mjs} +2 -2
  40. package/fesm2022/{acorex-platform-module-auth-client-tenant-chooser.component-B0kWYel9.mjs.map → acorex-platform-module-auth-client-tenant-chooser.component-CcmfIxWu.mjs.map} +1 -1
  41. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-DkIXfsXi.mjs → acorex-platform-module-auth-client-two-factor-code.component-CF5k_qxI.mjs} +2 -2
  42. package/fesm2022/{acorex-platform-module-auth-client-two-factor-code.component-DkIXfsXi.mjs.map → acorex-platform-module-auth-client-two-factor-code.component-CF5k_qxI.mjs.map} +1 -1
  43. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-DMlxcFuT.mjs → acorex-platform-module-auth-client-two-factor.module-vAvrglMG.mjs} +2 -2
  44. package/fesm2022/{acorex-platform-module-auth-client-two-factor.module-DMlxcFuT.mjs.map → acorex-platform-module-auth-client-two-factor.module-vAvrglMG.mjs.map} +1 -1
  45. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-BHbkWOO3.mjs → acorex-platform-module-auth-client-view-login-history.command-BhmZhCti.mjs} +2 -2
  46. package/fesm2022/{acorex-platform-module-auth-client-view-login-history.command-BHbkWOO3.mjs.map → acorex-platform-module-auth-client-view-login-history.command-BhmZhCti.mjs.map} +1 -1
  47. package/fesm2022/{acorex-platform-module-auth-client-welcome-onboarding-page.component-DcVVR1Zp.mjs → acorex-platform-module-auth-client-welcome-onboarding-page.component-3hQyrN9O.mjs} +2 -2
  48. package/fesm2022/{acorex-platform-module-auth-client-welcome-onboarding-page.component-DcVVR1Zp.mjs.map → acorex-platform-module-auth-client-welcome-onboarding-page.component-3hQyrN9O.mjs.map} +1 -1
  49. package/fesm2022/{acorex-platform-module-auth-client-welcome-onboarding.command-BpZt3m22.mjs → acorex-platform-module-auth-client-welcome-onboarding.command-Dj8Ty__8.mjs} +2 -2
  50. package/fesm2022/{acorex-platform-module-auth-client-welcome-onboarding.command-BpZt3m22.mjs.map → acorex-platform-module-auth-client-welcome-onboarding.command-Dj8Ty__8.mjs.map} +1 -1
  51. package/fesm2022/acorex-platform-module-auth-client.mjs +1 -1
  52. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-profile-activity-chart.component-DUpEusRs.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.html"],"sourcesContent":["import { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { AXPRegionalSetting, runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { isEmpty } from 'lodash';\nimport {\n AXPUserActivityDataSourceItem,\n AXPUserActivityHeatmapLayout,\n AXPUserActivityHour,\n AXPUserActivityLevel,\n AXPUserActivityStats,\n AXPUserActivityWeek,\n formatCompactActivityCount,\n} from '../../../../../shared/datasources/user-activity';\n\n//#region ---- View types ----\n\ninterface ActivityDay {\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface ActivityWeek {\n days: ActivityDay[];\n}\n\ninterface ActivityHour {\n hour: number;\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface CalendarColumnLabel {\n key: string;\n date: Date;\n weekIndex: number;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst DEFAULT_USER_ACTIVITY_QUERY_KEY = 'Auth:GetUserActivity';\nconst DEFAULT_TIME_FORMAT = 'HH:mm';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction parseLocalDay(value: string): Date {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, (month ?? 1) - 1, day ?? 1);\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n/** Contribution-style activity heatmap for the profile Activity tab. */\n@Component({\n selector: 'axm-profile-activity-chart',\n imports: [CommonModule, AsyncPipe, AXDecoratorModule, AXFormatModule, AXTranslationModule],\n templateUrl: './profile-activity-chart.component.html',\n styleUrl: './profile-activity-chart.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'axm-profile-activity-chart' },\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMProfileActivityChartComponent,\n },\n ],\n})\nexport class AXMProfileActivityChartComponent extends AXPPageLayoutBaseComponent {\n //#region ---- Inputs ----\n\n rootContext = input<Record<string, unknown>>({});\n pageConfig = input<Record<string, unknown>>();\n options = input<Record<string, unknown>>({});\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly queryService = inject(AXPQueryService);\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly heatmapLayout = signal<AXPUserActivityHeatmapLayout>('calendar');\n protected readonly weeks = signal<ActivityWeek[]>([]);\n protected readonly hours = signal<ActivityHour[]>([]);\n protected readonly stats = signal<AXPUserActivityStats>({\n longestStreak: 0,\n avgPerDay: 0,\n avgPerWeek: 0,\n total: 0,\n });\n protected readonly isLoading = signal(true);\n protected readonly shortDateFormat = signal('');\n protected readonly shortTimeFormat = signal(DEFAULT_TIME_FORMAT);\n\n protected readonly weekdayLabels = ['M', 'W', 'F'];\n protected readonly intensityLevels: Array<AXPUserActivityLevel> = [0, 1, 2, 3, 4];\n\n //#endregion\n\n //#region ---- Derived state ----\n\n protected readonly queryKey = computed(\n () => (this.options()['queryKey'] as string | undefined) ?? DEFAULT_USER_ACTIVITY_QUERY_KEY,\n );\n\n protected readonly stripDays = computed(() => this.weeks().flatMap((week) => week.days));\n\n protected readonly dayCount = computed(() => Math.max(this.stripDays().length, 1));\n\n protected readonly weekCount = computed(() => Math.max(this.weeks().length, 1));\n\n\n protected readonly columnLabels = computed(() => {\n const labels: CalendarColumnLabel[] = [];\n let lastMonth = -1;\n\n this.weeks().forEach((week, weekIndex) => {\n const firstDay = week.days[0];\n const month = firstDay.date.getMonth();\n if (month !== lastMonth) {\n labels.push({\n key: `${firstDay.date.getFullYear()}-${month}`,\n date: firstDay.date,\n weekIndex,\n });\n lastMonth = month;\n }\n });\n\n return labels;\n });\n\n //#endregion\n\n //#region ---- Effects ----\n\n #loadActivityEffect = effect(() => {\n const userId = this.sessionService.user?.id;\n const queryKey = this.queryKey();\n void this.loadActivity(userId, queryKey);\n });\n\n //#endregion\n\n //#region ---- Data loading ----\n\n private async loadActivity(userId: string | undefined, queryKey: string): Promise<void> {\n this.isLoading.set(true);\n\n try {\n await this.loadRegionalFormats();\n\n if (isEmpty(userId)) {\n this.resetChart();\n return;\n }\n\n const result = await this.queryService.fetch<\n { userId: string },\n AXPUserActivityDataSourceItem | null\n >(queryKey, { userId: userId! });\n\n const item = runtimeQueryObjectData(result);\n if (!item) {\n this.resetChart();\n return;\n }\n\n const weeks = item.weeks.map((week: AXPUserActivityWeek) => ({\n days: week.days.map((day) => ({\n date: parseLocalDay(day.date),\n count: day.count,\n level: day.level,\n })),\n }));\n const activityDay = parseLocalDay(item.startDate);\n\n this.heatmapLayout.set(item.layout ?? 'calendar');\n this.weeks.set(weeks);\n this.hours.set(this.mapHours(item.hours ?? [], activityDay));\n this.stats.set(item.stats);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async loadRegionalFormats(): Promise<void> {\n const [dateFormat, timeFormat] = await Promise.all([\n this.settingsService.get<string>(AXPRegionalSetting.ShortDate),\n this.settingsService.get<string>(AXPRegionalSetting.ShortTime),\n ]);\n this.shortDateFormat.set(dateFormat ?? '');\n this.shortTimeFormat.set(timeFormat || DEFAULT_TIME_FORMAT);\n }\n\n private resetChart(): void {\n this.heatmapLayout.set('days');\n this.weeks.set([]);\n this.hours.set([]);\n this.stats.set({ longestStreak: 0, avgPerDay: 0, avgPerWeek: 0, total: 0 });\n }\n\n private mapHours(hours: AXPUserActivityHour[], activityDay: Date): ActivityHour[] {\n return hours.map((hour) => {\n const date = new Date(activityDay);\n date.setHours(hour.hour, 0, 0, 0);\n return {\n hour: hour.hour,\n date,\n count: hour.count,\n level: hour.level,\n };\n });\n }\n\n //#endregion\n\n //#region ---- UI helpers ----\n\n protected formatCount(value: number): string {\n return formatCompactActivityCount(value);\n }\n\n protected weekdayRowIndex(label: string): number {\n if (label === 'M') {\n return 1;\n }\n if (label === 'W') {\n return 3;\n }\n return 5;\n }\n\n protected showHourLabel(hour: number): boolean {\n return hour % 3 === 0;\n }\n\n protected showDayStripLabel(index: number): boolean {\n const day = this.stripDays()[index];\n if (!day) {\n return false;\n }\n if (this.dayCount() <= 7) {\n return true;\n }\n return day.date.getDate() === 1 || index % 7 === 0;\n }\n\n protected dayStripLabelFormatFor(day: ActivityDay): string {\n if (this.dayCount() <= 7) {\n return 'ddd';\n }\n return day.date.getDate() === 1 ? 'MMM D' : 'D';\n }\n\n protected cellTitle(day: ActivityDay): string {\n const dateText = String(\n this.formatService.format(day.date, 'date', {\n format: this.shortDateFormat(),\n }) ?? '',\n );\n return `${dateText} — ${day.count}`;\n }\n\n protected hourCellTitle(hour: ActivityHour): string {\n const timeText = String(\n this.formatService.format(hour.date, 'datetime', {\n format: this.shortTimeFormat(),\n }) ?? '',\n );\n return `${timeText} — ${hour.count}`;\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n"],"names":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-profile-activity-chart.component-Dj_K4cZa.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/components/profile-activity-chart/profile-activity-chart.component.html"],"sourcesContent":["import { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { AXPRegionalSetting, runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPPageLayoutBase, AXPPageLayoutBaseComponent } from '@acorex-platform/framework-client/layout/views';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { isEmpty } from 'lodash';\nimport {\n AXPUserActivityDataSourceItem,\n AXPUserActivityHeatmapLayout,\n AXPUserActivityHour,\n AXPUserActivityLevel,\n AXPUserActivityStats,\n AXPUserActivityWeek,\n formatCompactActivityCount,\n} from '../../../../../shared/datasources/user-activity';\n\n//#region ---- View types ----\n\ninterface ActivityDay {\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface ActivityWeek {\n days: ActivityDay[];\n}\n\ninterface ActivityHour {\n hour: number;\n date: Date;\n count: number;\n level: AXPUserActivityLevel;\n}\n\ninterface CalendarColumnLabel {\n key: string;\n date: Date;\n weekIndex: number;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst DEFAULT_USER_ACTIVITY_QUERY_KEY = 'Auth:GetUserActivity';\nconst DEFAULT_TIME_FORMAT = 'HH:mm';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction parseLocalDay(value: string): Date {\n const [year, month, day] = value.split('-').map(Number);\n return new Date(year, (month ?? 1) - 1, day ?? 1);\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n/** Contribution-style activity heatmap for the profile Activity tab. */\n@Component({\n selector: 'axm-profile-activity-chart',\n imports: [CommonModule, AsyncPipe, AXDecoratorModule, AXFormatModule, AXTranslationModule],\n templateUrl: './profile-activity-chart.component.html',\n styleUrl: './profile-activity-chart.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'axm-profile-activity-chart' },\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMProfileActivityChartComponent,\n },\n ],\n})\nexport class AXMProfileActivityChartComponent extends AXPPageLayoutBaseComponent {\n //#region ---- Inputs ----\n\n rootContext = input<Record<string, unknown>>({});\n pageConfig = input<Record<string, unknown>>();\n options = input<Record<string, unknown>>({});\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly queryService = inject(AXPQueryService);\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly heatmapLayout = signal<AXPUserActivityHeatmapLayout>('calendar');\n protected readonly weeks = signal<ActivityWeek[]>([]);\n protected readonly hours = signal<ActivityHour[]>([]);\n protected readonly stats = signal<AXPUserActivityStats>({\n longestStreak: 0,\n avgPerDay: 0,\n avgPerWeek: 0,\n total: 0,\n });\n protected readonly isLoading = signal(true);\n protected readonly shortDateFormat = signal('');\n protected readonly shortTimeFormat = signal(DEFAULT_TIME_FORMAT);\n\n protected readonly weekdayLabels = ['M', 'W', 'F'];\n protected readonly intensityLevels: Array<AXPUserActivityLevel> = [0, 1, 2, 3, 4];\n\n //#endregion\n\n //#region ---- Derived state ----\n\n protected readonly queryKey = computed(\n () => (this.options()['queryKey'] as string | undefined) ?? DEFAULT_USER_ACTIVITY_QUERY_KEY,\n );\n\n protected readonly stripDays = computed(() => this.weeks().flatMap((week) => week.days));\n\n protected readonly dayCount = computed(() => Math.max(this.stripDays().length, 1));\n\n protected readonly weekCount = computed(() => Math.max(this.weeks().length, 1));\n\n\n protected readonly columnLabels = computed(() => {\n const labels: CalendarColumnLabel[] = [];\n let lastMonth = -1;\n\n this.weeks().forEach((week, weekIndex) => {\n const firstDay = week.days[0];\n const month = firstDay.date.getMonth();\n if (month !== lastMonth) {\n labels.push({\n key: `${firstDay.date.getFullYear()}-${month}`,\n date: firstDay.date,\n weekIndex,\n });\n lastMonth = month;\n }\n });\n\n return labels;\n });\n\n //#endregion\n\n //#region ---- Effects ----\n\n #loadActivityEffect = effect(() => {\n const userId = this.sessionService.user?.id;\n const queryKey = this.queryKey();\n void this.loadActivity(userId, queryKey);\n });\n\n //#endregion\n\n //#region ---- Data loading ----\n\n private async loadActivity(userId: string | undefined, queryKey: string): Promise<void> {\n this.isLoading.set(true);\n\n try {\n await this.loadRegionalFormats();\n\n if (isEmpty(userId)) {\n this.resetChart();\n return;\n }\n\n const result = await this.queryService.fetch<\n { userId: string },\n AXPUserActivityDataSourceItem | null\n >(queryKey, { userId: userId! });\n\n const item = runtimeQueryObjectData(result);\n if (!item) {\n this.resetChart();\n return;\n }\n\n const weeks = item.weeks.map((week: AXPUserActivityWeek) => ({\n days: week.days.map((day) => ({\n date: parseLocalDay(day.date),\n count: day.count,\n level: day.level,\n })),\n }));\n const activityDay = parseLocalDay(item.startDate);\n\n this.heatmapLayout.set(item.layout ?? 'calendar');\n this.weeks.set(weeks);\n this.hours.set(this.mapHours(item.hours ?? [], activityDay));\n this.stats.set(item.stats);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async loadRegionalFormats(): Promise<void> {\n const [dateFormat, timeFormat] = await Promise.all([\n this.settingsService.get<string>(AXPRegionalSetting.ShortDate),\n this.settingsService.get<string>(AXPRegionalSetting.ShortTime),\n ]);\n this.shortDateFormat.set(dateFormat ?? '');\n this.shortTimeFormat.set(timeFormat || DEFAULT_TIME_FORMAT);\n }\n\n private resetChart(): void {\n this.heatmapLayout.set('days');\n this.weeks.set([]);\n this.hours.set([]);\n this.stats.set({ longestStreak: 0, avgPerDay: 0, avgPerWeek: 0, total: 0 });\n }\n\n private mapHours(hours: AXPUserActivityHour[], activityDay: Date): ActivityHour[] {\n return hours.map((hour) => {\n const date = new Date(activityDay);\n date.setHours(hour.hour, 0, 0, 0);\n return {\n hour: hour.hour,\n date,\n count: hour.count,\n level: hour.level,\n };\n });\n }\n\n //#endregion\n\n //#region ---- UI helpers ----\n\n protected formatCount(value: number): string {\n return formatCompactActivityCount(value);\n }\n\n protected weekdayRowIndex(label: string): number {\n if (label === 'M') {\n return 1;\n }\n if (label === 'W') {\n return 3;\n }\n return 5;\n }\n\n protected showHourLabel(hour: number): boolean {\n return hour % 3 === 0;\n }\n\n protected showDayStripLabel(index: number): boolean {\n const day = this.stripDays()[index];\n if (!day) {\n return false;\n }\n if (this.dayCount() <= 7) {\n return true;\n }\n return day.date.getDate() === 1 || index % 7 === 0;\n }\n\n protected dayStripLabelFormatFor(day: ActivityDay): string {\n if (this.dayCount() <= 7) {\n return 'ddd';\n }\n return day.date.getDate() === 1 ? 'MMM D' : 'D';\n }\n\n protected cellTitle(day: ActivityDay): string {\n const dateText = String(\n this.formatService.format(day.date, 'date', {\n format: this.shortDateFormat(),\n }) ?? '',\n );\n return `${dateText} — ${day.count}`;\n }\n\n protected hourCellTitle(hour: ActivityHour): string {\n const timeText = String(\n this.formatService.format(hour.date, 'datetime', {\n format: this.shortTimeFormat(),\n }) ?? '',\n );\n return `${timeText} — ${hour.count}`;\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"__panel\" *translate=\"let t\">\n <header class=\"__header\">\n <div class=\"__title-row\">\n <h3 class=\"__title\">{{ '@auth:profile-page.components.activity-chart.title' | translate | async }}</h3>\n <ax-icon icon=\"fa-light fa-circle-info\" class=\"__info-icon\"></ax-icon>\n </div>\n </header>\n\n @if (heatmapLayout() === 'calendar') {\n <!-- ----- Calendar heatmap for month and longer ranges ----- -->\n <div class=\"__heatmap-wrap\" [style.--week-count]=\"weekCount()\">\n <div class=\"__month-labels\" aria-hidden=\"true\">\n @for (month of columnLabels(); track month.key) {\n <span class=\"__month-label\" [style.grid-column-start]=\"month.weekIndex + 2\">\n {{ month.date | format: 'date' : 'MMM' | async }}\n </span>\n }\n </div>\n\n <div class=\"__heatmap\">\n <div class=\"__weekday-labels\" aria-hidden=\"true\">\n @for (label of weekdayLabels; track label) {\n <span class=\"__weekday-label\" [style.grid-row]=\"weekdayRowIndex(label)\">{{ label }}</span>\n }\n </div>\n\n <div\n class=\"__grid\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (week of weeks(); track $index) {\n @for (day of week.days; track day.date.getTime()) {\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n }\n }\n </div>\n </div>\n </div>\n }\n <!-- ----- Full-width day or hour strip for short ranges ----- -->\n @else if (heatmapLayout() === 'hours') {\n <!-- ----- Hour cells for a single-day window ----- -->\n <div\n class=\"__strip __strip--hours\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (hour of hours(); track hour.hour) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showHourLabel(hour.hour)) {\n <!-- ----- Hour tick every three hours ----- -->\n {{ hour.date | format: 'datetime' : shortTimeFormat() | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"hour.level === 0\"\n [class.--level-1]=\"hour.level === 1\"\n [class.--level-2]=\"hour.level === 2\"\n [class.--level-3]=\"hour.level === 3\"\n [class.--level-4]=\"hour.level === 4\"\n [attr.title]=\"hourCellTitle(hour)\"\n ></span>\n </div>\n }\n </div>\n }\n <!-- ----- Weekday cells for a seven-day window ----- -->\n @else {\n <div\n class=\"__strip __strip--days\"\n [class.--dense]=\"dayCount() > 14\"\n [style.--day-count]=\"dayCount()\"\n role=\"img\"\n [attr.aria-label]=\"'@auth:profile-page.components.activity-chart.aria-label' | translate | async\"\n >\n @for (day of stripDays(); track day.date.getTime(); let index = $index) {\n <div class=\"__strip-col\">\n <span class=\"__strip-label\">\n @if (showDayStripLabel(index)) {\n <!-- ----- Weekday or day-of-month tick ----- -->\n {{ day.date | format: 'date' : dayStripLabelFormatFor(day) | async }}\n }\n </span>\n <span\n class=\"__cell\"\n [class.--level-0]=\"day.level === 0\"\n [class.--level-1]=\"day.level === 1\"\n [class.--level-2]=\"day.level === 2\"\n [class.--level-3]=\"day.level === 3\"\n [class.--level-4]=\"day.level === 4\"\n [attr.title]=\"cellTitle(day)\"\n ></span>\n </div>\n }\n </div>\n }\n\n <footer class=\"__footer\">\n <div class=\"__legend\" aria-hidden=\"true\">\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.less' | translate | async }}</span>\n @for (level of intensityLevels; track level) {\n <span class=\"__legend-cell\" [class]=\"'--level-' + level\"></span>\n }\n <span class=\"__legend-label\">{{ '@auth:profile-page.components.activity-chart.legend.more' | translate | async }}</span>\n </div>\n\n <!-- ----- Sign-in summaries for the visible heatmap window ----- -->\n <dl class=\"__stats\">\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().total) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.total' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ stats().longestStreak }}</dd>\n <dt>\n @if (stats().longestStreak === 1) {\n <!-- ----- Singular streak unit ----- -->\n {{ '@auth:profile-page.components.activity-chart.stats.day-streak' | translate | async }}\n }\n <!-- ----- Plural streak unit ----- -->\n @else {\n {{ '@auth:profile-page.components.activity-chart.stats.days-streak' | translate | async }}\n }\n </dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerDay) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-day' | translate | async }}</dt>\n </div>\n <div class=\"__stat\">\n <dd>{{ formatCount(stats().avgPerWeek) }}</dd>\n <dt>{{ '@auth:profile-page.components.activity-chart.stats.avg-week' | translate | async }}</dt>\n </div>\n </dl>\n </footer>\n</div>\n"],"names":["i1","i2","i3"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable } from '@angular/core';
3
- import { e as PROFILE_ACTIVITY_CHART_COMPONENT_KEY, f as PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CWE43xt1.mjs';
3
+ import { e as PROFILE_ACTIVITY_CHART_COMPONENT_KEY, f as PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-SkJb5De_.mjs';
4
4
 
5
5
  //#region ---- Profile page component provider ----
6
6
  class AXMProfilePageComponentProvider {
@@ -8,7 +8,7 @@ class AXMProfilePageComponentProvider {
8
8
  return [
9
9
  {
10
10
  key: PROFILE_ACTIVITY_CHART_COMPONENT_KEY,
11
- loader: () => import('./acorex-platform-module-auth-client-profile-activity-chart.component-DUpEusRs.mjs').then((module) => module.AXMProfileActivityChartComponent),
11
+ loader: () => import('./acorex-platform-module-auth-client-profile-activity-chart.component-Dj_K4cZa.mjs').then((module) => module.AXMProfileActivityChartComponent),
12
12
  },
13
13
  {
14
14
  key: PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY,
@@ -24,4 +24,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
24
24
  }] });
25
25
 
26
26
  export { AXMProfilePageComponentProvider };
27
- //# sourceMappingURL=acorex-platform-module-auth-client-profile-page-component.provider-DaFESP6l.mjs.map
27
+ //# sourceMappingURL=acorex-platform-module-auth-client-profile-page-component.provider-BtfflpzH.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-profile-page-component.provider-DaFESP6l.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-component.provider.ts"],"sourcesContent":["import {\n AXPPageComponentDefinition,\n AXPPageComponentProvider,\n} from '@acorex-platform/framework-client/layout/components';\nimport { Injectable } from '@angular/core';\nimport {\n PROFILE_ACTIVITY_CHART_COMPONENT_KEY,\n PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY,\n} from './profile-page.component-keys';\n\n//#region ---- Profile page component provider ----\n\n@Injectable()\nexport class AXMProfilePageComponentProvider implements AXPPageComponentProvider {\n async components(): Promise<AXPPageComponentDefinition[]> {\n return [\n {\n key: PROFILE_ACTIVITY_CHART_COMPONENT_KEY,\n loader: () =>\n import('./components/profile-activity-chart/profile-activity-chart.component').then(\n (module) => module.AXMProfileActivityChartComponent,\n ),\n },\n {\n key: PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY,\n loader: () =>\n import('./components/profile-delete-account-danger-zone/profile-delete-account-danger-zone.component').then(\n (module) => module.AXMProfileDeleteAccountDangerZoneComponent,\n ),\n },\n ];\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;AAUA;MAGa,+BAA+B,CAAA;AAC1C,IAAA,MAAM,UAAU,GAAA;QACd,OAAO;AACL,YAAA;AACE,gBAAA,GAAG,EAAE,oCAAoC;AACzC,gBAAA,MAAM,EAAE,MACN,OAAO,oFAAsE,CAAC,CAAC,IAAI,CACjF,CAAC,MAAM,KAAK,MAAM,CAAC,gCAAgC,CACpD;AACJ,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,gDAAgD;AACrD,gBAAA,MAAM,EAAE,MACN,OAAO,gGAA8F,CAAC,CAAC,IAAI,CACzG,CAAC,MAAM,KAAK,MAAM,CAAC,0CAA0C,CAC9D;AACJ,aAAA;SACF;IACH;8GAlBW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA/B,+BAA+B,EAAA,CAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAD3C;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-profile-page-component.provider-BtfflpzH.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-component.provider.ts"],"sourcesContent":["import {\n AXPPageComponentDefinition,\n AXPPageComponentProvider,\n} from '@acorex-platform/framework-client/layout/components';\nimport { Injectable } from '@angular/core';\nimport {\n PROFILE_ACTIVITY_CHART_COMPONENT_KEY,\n PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY,\n} from './profile-page.component-keys';\n\n//#region ---- Profile page component provider ----\n\n@Injectable()\nexport class AXMProfilePageComponentProvider implements AXPPageComponentProvider {\n async components(): Promise<AXPPageComponentDefinition[]> {\n return [\n {\n key: PROFILE_ACTIVITY_CHART_COMPONENT_KEY,\n loader: () =>\n import('./components/profile-activity-chart/profile-activity-chart.component').then(\n (module) => module.AXMProfileActivityChartComponent,\n ),\n },\n {\n key: PROFILE_DELETE_ACCOUNT_DANGER_ZONE_COMPONENT_KEY,\n loader: () =>\n import('./components/profile-delete-account-danger-zone/profile-delete-account-danger-zone.component').then(\n (module) => module.AXMProfileDeleteAccountDangerZoneComponent,\n ),\n },\n ];\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;AAUA;MAGa,+BAA+B,CAAA;AAC1C,IAAA,MAAM,UAAU,GAAA;QACd,OAAO;AACL,YAAA;AACE,gBAAA,GAAG,EAAE,oCAAoC;AACzC,gBAAA,MAAM,EAAE,MACN,OAAO,oFAAsE,CAAC,CAAC,IAAI,CACjF,CAAC,MAAM,KAAK,MAAM,CAAC,gCAAgC,CACpD;AACJ,aAAA;AACD,YAAA;AACE,gBAAA,GAAG,EAAE,gDAAgD;AACrD,gBAAA,MAAM,EAAE,MACN,OAAO,gGAA8F,CAAC,CAAC,IAAI,CACzG,CAAC,MAAM,KAAK,MAAM,CAAC,0CAA0C,CAC9D;AACJ,aAAA;SACF;IACH;8GAlBW,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;kHAA/B,+BAA+B,EAAA,CAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAD3C;;;"}
@@ -28,7 +28,7 @@ import { filter, distinctUntilChanged } from 'rxjs';
28
28
  import { AXMAuthCommandKeys } from '@acorex-platform/module-auth-client/contracts';
29
29
  import { AXPSessionService } from '@acorex-platform/framework-client/auth';
30
30
  import { defaultTo, orderBy, uniqBy, first, isNil, get } from 'lodash';
31
- import { P as PROFILE_PAGE_GROUPS_HOOK, a as PROFILE_PAGE_SECTIONS_HOOK, b as PROFILE_PAGE_HEADER_META_HOOK, v as visibleUserProfileSectionActions, r as resolveDefaultUserProfileSectionAction, c as resolveUserProfileSectionContent, d as PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CWE43xt1.mjs';
31
+ import { P as PROFILE_PAGE_GROUPS_HOOK, a as PROFILE_PAGE_SECTIONS_HOOK, b as PROFILE_PAGE_HEADER_META_HOOK, v as visibleUserProfileSectionActions, r as resolveDefaultUserProfileSectionAction, c as resolveUserProfileSectionContent, d as PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-SkJb5De_.mjs';
32
32
  import { runtimeQueryPayloadData } from '@acorex-platform/framework-shared/core';
33
33
  import { ENTITY_GET_BY_ID_DEFAULT } from '@acorex-platform/framework-shared/runtime';
34
34
 
@@ -653,4 +653,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
653
653
  }] });
654
654
 
655
655
  export { AXMUserProfilePageComponent };
656
- //# sourceMappingURL=acorex-platform-module-auth-client-profile-page.component-ClNuHd7p.mjs.map
656
+ //# sourceMappingURL=acorex-platform-module-auth-client-profile-page.component-zoMpwrJM.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-auth-client-profile-page.component-ClNuHd7p.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-registry.service.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-user.service.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-header.service.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page.component.html"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPHookService } from '@acorex-platform/framework-client/core';\nimport { defaultTo, first, orderBy, uniqBy } from 'lodash';\nimport {\n AXPUserProfileGroup,\n AXPUserProfileGroupsPayload,\n AXPUserProfileHeaderMetaItem,\n AXPUserProfileHeaderMetaPayload,\n AXPUserProfileSection,\n AXPUserProfileSectionsPayload,\n PROFILE_PAGE_GROUPS_HOOK,\n PROFILE_PAGE_HEADER_META_HOOK,\n PROFILE_PAGE_SECTIONS_HOOK,\n} from './profile-page.types';\n\n//#region ---- Profile page registry ----\n\n/**\n * Aggregates profile page groups, sections, and header meta from distributed hooks.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfilePageRegistryService {\n //#region ---- Services & Dependencies ----\n\n private readonly hooks = inject(AXPHookService);\n private readonly sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n async loadGroups(): Promise<AXPUserProfileGroup[]> {\n const payload = await this.hooks.runAsync<AXPUserProfileGroupsPayload>(PROFILE_PAGE_GROUPS_HOOK, { groups: [] });\n return this.sortGroups(defaultTo(payload.groups, []));\n }\n\n async loadSections(groupId?: string): Promise<AXPUserProfileSection[]> {\n const payload = await this.hooks.runAsync<AXPUserProfileSectionsPayload>(PROFILE_PAGE_SECTIONS_HOOK, {\n sections: [],\n groupId,\n });\n return this.sortSections(this.filterSectionsByFeature(defaultTo(payload.sections, [])));\n }\n\n replaceGroupSections(\n existing: AXPUserProfileSection[],\n groupSections: AXPUserProfileSection[],\n groupId: string,\n ): AXPUserProfileSection[] {\n return this.sortSections([\n ...existing.filter((section) => section.groupId !== groupId),\n ...groupSections.filter((section) => section.groupId === groupId),\n ]);\n }\n\n async loadHeaderMeta(): Promise<AXPUserProfileHeaderMetaItem[]> {\n const payload = await this.hooks.runAsync<AXPUserProfileHeaderMetaPayload>(PROFILE_PAGE_HEADER_META_HOOK, {\n items: [],\n });\n return orderBy(\n uniqBy(defaultTo(payload.items, []), 'id'),\n [(item) => defaultTo(item.priority, 100), 'id'],\n ['asc', 'asc'],\n );\n }\n\n filterSectionsByGroup(sections: AXPUserProfileSection[], groupId: string | null): AXPUserProfileSection[] {\n if (!groupId) {\n return sections;\n }\n return sections.filter((section) => section.groupId === groupId);\n }\n\n resolveDefaultGroup(groups: AXPUserProfileGroup[]): AXPUserProfileGroup | undefined {\n return first(this.sortGroups(groups));\n }\n\n resolveGroupByRoute(groups: AXPUserProfileGroup[], routeSegment: string): AXPUserProfileGroup | undefined {\n const normalized = routeSegment.trim().toLowerCase();\n const resolvedRoute = normalized === 'privacy' ? 'account' : normalized;\n\n return this.sortGroups(groups).find(\n (group) => group.id.toLowerCase() === resolvedRoute || group.route?.toLowerCase() === resolvedRoute,\n );\n }\n\n resolveGroupRoute(group: AXPUserProfileGroup): string {\n return group.route ?? group.id;\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private filterSectionsByFeature(sections: AXPUserProfileSection[]): AXPUserProfileSection[] {\n return sections.filter((section) => !section.feature || this.sessionService.isFeatureEnabled(section.feature));\n }\n\n private sortGroups(groups: AXPUserProfileGroup[]): AXPUserProfileGroup[] {\n return orderBy(uniqBy(groups, 'id'), [(g) => defaultTo(g.priority, 100), 'id'], ['asc', 'asc']);\n }\n\n private sortSections(sections: AXPUserProfileSection[]): AXPUserProfileSection[] {\n return orderBy(uniqBy(sections, 'id'), [(s) => defaultTo(s.priority, 100), 'id'], ['asc', 'asc']);\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeQueryPayloadData } from '@acorex-platform/framework-shared/core';\nimport { ENTITY_GET_BY_ID_DEFAULT } from '@acorex-platform/framework-shared/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { get, isNil } from 'lodash';\n\n//#region ----- Constants -----\n\nconst SECURITY_MANAGEMENT_USER_ENTITY = 'SecurityManagement.User';\n\n//#endregion\n\n//#region ----- Current user record -----\n\nexport interface AXPUserProfileCurrentUserRecord {\n id: string;\n username?: string;\n displayName?: string;\n auditInfo?: {\n created?: { at?: Date | string };\n updated?: { at?: Date | string };\n };\n}\n\n//#endregion\n\n//#region ----- Profile page user service -----\n\n/**\n * Loads the persisted user row for the logged-in session (audit info, display fields).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfileUserService {\n //#region ----- Services & Dependencies -----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly queryService = inject(AXPQueryService);\n\n //#endregion\n\n //#region ----- Public API -----\n\n async loadCurrentUser(): Promise<AXPUserProfileCurrentUserRecord | null> {\n const userId = this.sessionService.user?.id;\n if (!userId || !this.sessionService.isReadyForAppScopedApi) {\n return null;\n }\n\n try {\n const result = await this.queryService.fetch<\n { entity: string; id: string },\n AXPUserProfileCurrentUserRecord\n >(ENTITY_GET_BY_ID_DEFAULT, {\n entity: SECURITY_MANAGEMENT_USER_ENTITY,\n id: userId,\n });\n return runtimeQueryPayloadData(result) ?? null;\n } catch {\n return null;\n }\n }\n\n resolveJoinedAt(record: AXPUserProfileCurrentUserRecord | null): Date | string | undefined {\n if (isNil(record)) {\n return undefined;\n }\n return get(record, 'auditInfo.created.at');\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { Injectable, inject } from '@angular/core';\nimport { defaultTo } from 'lodash';\nimport { AXPUserProfilePageRegistryService } from './profile-page-registry.service';\nimport { AXPUserProfileHeaderMetaItem } from './profile-page.types';\nimport { AXPUserProfileUserService } from './profile-page-user.service';\n\n//#region ---- Header view model ----\n\nexport interface AXPUserProfileHeaderView {\n userId: string;\n displayName: string;\n username?: string;\n joinedAt?: Date | string;\n avatarUserId: string;\n /** Extra header rows contributed via hooks (username/joined are on the view root). */\n meta: AXPUserProfileHeaderMetaItem[];\n}\n\n//#endregion\n\n//#region ---- Profile page header service ----\n\n/**\n * Builds profile page header data from session and optional extended profile sources.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfileHeaderService {\n //#region ---- Services & Dependencies ----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly registry = inject(AXPUserProfilePageRegistryService);\n private readonly userService = inject(AXPUserProfileUserService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n async load(): Promise<AXPUserProfileHeaderView | null> {\n const sessionUser = this.sessionService.user;\n if (!sessionUser?.id) {\n return null;\n }\n\n const userRecord = await this.userService.loadCurrentUser();\n const hookMeta = await this.registry.loadHeaderMeta();\n\n const displayName = defaultTo(\n sessionUser.title,\n defaultTo(userRecord?.displayName, sessionUser.name),\n );\n const username = defaultTo(userRecord?.username, sessionUser.name);\n\n return {\n userId: sessionUser.id,\n displayName,\n username,\n joinedAt: this.userService.resolveJoinedAt(userRecord),\n avatarUserId: sessionUser.id,\n meta: hookMeta.sort((a, b) => defaultTo(a.priority, 100) - defaultTo(b.priority, 100)),\n };\n }\n\n //#endregion\n}\n\n//#endregion\n","\nimport {\n AXPActionMenuItem,\n AXPBackButton,\n AXPExecuteCommand,\n AXPMultiLanguageString,\n AXPRuntimeCommandResult,\n} from '@acorex-platform/framework-shared/core';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTabsModule, AXTabStripChangedEvent } from '@acorex/components/tabs';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { AXPStickyDirective } from '@acorex-platform/framework-client/common';\n\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutListComponent,\n AXPThemeLayoutListItemComponent,\n AXPUserAvatarComponent,\n} from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPPageComponentRendererDirective,\n AXPPageLayoutBase,\n AXPPageLayoutBaseComponent,\n AXPPageLayoutComponent,\n} from '@acorex-platform/framework-client/layout/views';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { distinctUntilChanged, filter } from 'rxjs';\nimport { AXMAuthCommandKeys } from '@acorex-platform/module-auth-client/contracts';\nimport { AXPUserProfileHeaderService, AXPUserProfileHeaderView } from './profile-page-header.service';\nimport { AXPUserProfilePageRegistryService } from './profile-page-registry.service';\nimport {\n PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY,\n type AXPUserProfileSectionInsightsPatch,\n} from './profile-password-insight.util';\nimport {\n AXPUserProfileGroup,\n AXPUserProfileGroupComponentContent,\n AXPUserProfileSection,\n AXPUserProfileSectionInsight,\n AXPUserProfileSectionLayout,\n resolveDefaultUserProfileSectionAction,\n resolveUserProfileSectionContent,\n visibleUserProfileSectionActions,\n} from './profile-page.types';\n\n@Component({\n selector: 'axm-user-profile-page',\n imports: [\n CommonModule,\n AsyncPipe,\n AXFormatPipe,\n RouterModule,\n AXDecoratorModule,\n AXButtonModule,\n AXDropdownModule,\n AXSkeletonModule,\n AXTabsModule,\n AXPStickyDirective,\n AXTranslationModule,\n AXTooltipModule,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutListComponent,\n AXPThemeLayoutListItemComponent,\n AXPUserAvatarComponent,\n AXPPageComponentRendererDirective,\n ],\n templateUrl: './profile-page.component.html',\n styleUrl: './profile-page.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMUserProfilePageComponent,\n },\n ],\n host: {\n class: 'axm-user-profile-page',\n '[class.--mobile-group]': 'isMobileGroupView()',\n },\n})\nexport class AXMUserProfilePageComponent extends AXPPageLayoutBaseComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly registry = inject(AXPUserProfilePageRegistryService);\n private readonly headerService = inject(AXPUserProfileHeaderService);\n private readonly commandService = inject(AXPCommandService);\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly deviceService = inject(AXPDeviceService);\n\n //#endregion\n\n //#region ----- Constants -----\n\n protected readonly pageTabSkeletonPlaceholders = [1, 2, 3, 4];\n protected readonly pageListSkeletonPlaceholders = [1, 2, 3, 4];\n protected readonly sectionSkeletonPlaceholders = [1, 2, 3, 4];\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly groups = signal<AXPUserProfileGroup[]>([]);\n protected readonly sections = signal<AXPUserProfileSection[]>([]);\n protected readonly header = signal<AXPUserProfileHeaderView | null>(null);\n protected readonly activeGroupId = signal<string | null>(null);\n protected readonly visitedGroupIds = signal<ReadonlySet<string>>(new Set());\n protected readonly loadedSectionGroupIds = signal<ReadonlySet<string>>(new Set());\n protected readonly isLoading = signal(true);\n\n private readonly sectionLoadInflight = new Map<string, Promise<void>>();\n\n protected readonly isCompactNav = computed(() => !this.deviceService.isLarge());\n protected readonly isMobileGroupView = computed(() => this.isCompactNav() && !!this.activeGroupId());\n protected readonly showHero = computed(() => !this.isMobileGroupView());\n protected readonly showTabs = computed(() => !this.isCompactNav() && this.groups().length > 0);\n protected readonly showGroupList = computed(() => this.isCompactNav() && !this.activeGroupId());\n protected readonly showGroupContent = computed(() => !this.isCompactNav() || !!this.activeGroupId());\n\n readonly #loadVisitedGroup = effect(() => {\n const groupId = this.activeGroupId();\n if (!groupId) {\n return;\n }\n\n untracked(() => {\n void this.ensureGroupContent(groupId);\n });\n });\n\n readonly #navChromeEffect = effect(() => {\n this.activeGroupId();\n this.deviceService.isLarge();\n untracked(() => this.recompute());\n });\n\n readonly #desktopDefaultGroupEffect = effect(() => {\n const isLarge = this.deviceService.isLarge();\n const groups = this.groups();\n const active = this.activeGroupId();\n const loading = this.isLoading();\n if (!isLarge || active || !groups.length || loading) {\n return;\n }\n\n untracked(() => {\n void this.navigateToDefaultGroup(groups, { replaceUrl: true });\n });\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n await this.loadPage();\n this.bindProfileIdentityUpdates();\n\n this.activatedRoute.paramMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n void this.syncGroupFromRoute();\n });\n }\n\n //#endregion\n\n //#region ----- Page Metadata -----\n\n protected override getPageTitle(): AXPMultiLanguageString {\n if (!this.isMobileGroupView()) {\n return '';\n }\n\n return this.activeGroup()?.title ?? '';\n }\n\n protected override getPageDescription(): null {\n return null;\n }\n\n protected override getPageIcon(): string | null {\n if (!this.isMobileGroupView()) {\n return null;\n }\n\n return this.activeGroup()?.icon ?? null;\n }\n\n protected override getBackButton(): AXPBackButton | null {\n if (!this.isMobileGroupView()) {\n return null;\n }\n\n return { title: '@auth:profile-page.page.title' };\n }\n\n override async onBackButtonClick(): Promise<void> {\n const appName = this.sessionService.application?.name;\n if (!appName) {\n return;\n }\n\n await this.router.navigate([appName, 'profile']);\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected handleSelectGroup(group: AXPUserProfileGroup): void {\n this.activeGroupId.set(group.id);\n\n const appName = this.sessionService.application?.name;\n if (!appName) {\n return;\n }\n\n void this.router.navigate([appName, 'profile', this.registry.resolveGroupRoute(group)]);\n }\n\n protected handleGroupTabChanged(event: AXTabStripChangedEvent): void {\n const group =\n this.groups().find((item) => item.id === event.tab?.key) ?? this.groups()[event.index];\n if (!group || group.id === this.activeGroupId()) {\n return;\n }\n\n this.handleSelectGroup(group);\n }\n\n protected handleEditAvatar(): void {\n void this.executeCommand({\n name: AXMAuthCommandKeys.Profile.ChangePhoto,\n });\n }\n\n protected async handleActionClick(action: AXPActionMenuItem): Promise<void> {\n if (action.disabled || action.visible === false || !action.command) {\n return;\n }\n\n const result = await this.executeCommand(action.command);\n\n if (result?.success && this.isPinRelatedAction(action)) {\n await this.reloadSections();\n }\n\n if (result?.success && this.applyProfileSectionInsightsPatch(result)) {\n // Password card updated from save payload — skip User/sessions reload.\n } else if (result?.success && this.shouldReloadSecuritySections(action.command.name)) {\n await this.reloadSections();\n }\n\n if (result?.success && this.applyHealthProfileSectionPatch(result)) {\n // Medical Summary updated from save payload — skip full section reload (User/sessions/Employee).\n } else if (result?.success && this.shouldReloadHealthSections(action.command.name)) {\n await this.reloadSections();\n }\n\n if (\n result?.success &&\n action.command?.name.startsWith('HumanCapitalManagement.Profile:')\n ) {\n await this.reloadProfileHeader();\n }\n }\n\n protected visibleSectionActions(actions: AXPActionMenuItem[]) {\n return visibleUserProfileSectionActions(actions);\n }\n\n protected defaultSectionAction(actions: AXPActionMenuItem[]) {\n return resolveDefaultUserProfileSectionAction(actions);\n }\n\n protected resolveSectionContent(section: AXPUserProfileSection) {\n return resolveUserProfileSectionContent(section);\n }\n\n protected isGroupVisited(groupId: string): boolean {\n return this.visitedGroupIds().has(groupId);\n }\n\n protected isGroupPanelActive(groupId: string): boolean {\n return this.activeGroupId() === groupId;\n }\n\n protected activeGroup(): AXPUserProfileGroup | undefined {\n const groupId = this.activeGroupId();\n if (!groupId) {\n return undefined;\n }\n\n return this.groups().find((group) => group.id === groupId);\n }\n\n protected isGroupSectionsPending(group: AXPUserProfileGroup): boolean {\n return !this.groupComponentContent(group) && !this.loadedSectionGroupIds().has(group.id);\n }\n\n protected sectionsForGroup(groupId: string): AXPUserProfileSection[] {\n return this.registry.filterSectionsByGroup(this.sections(), groupId);\n }\n\n protected groupComponentContent(group: AXPUserProfileGroup): AXPUserProfileGroupComponentContent | undefined {\n if (group.content?.mode === 'component') {\n return group.content;\n }\n return undefined;\n }\n\n protected sectionLayoutVars(layout?: AXPUserProfileSectionLayout): Record<string, string | number> {\n return {\n '--section-col-span': layout?.colSpan ?? 6,\n '--section-row-span': layout?.rowSpan ?? 1,\n '--section-col-start': layout?.col ?? 'auto',\n };\n }\n\n protected hasSectionColStart(layout?: AXPUserProfileSectionLayout): boolean {\n return layout?.col != null;\n }\n\n protected hasDisplayableInsights(section: AXPUserProfileSection): boolean {\n return this.displayableInsights(section).length > 0;\n }\n\n protected displayableInsights(section: AXPUserProfileSection): AXPUserProfileSectionInsight[] {\n return (section.insights ?? []).filter((insight) => this.isDisplayableInsight(insight));\n }\n\n protected resolveInsightDate(insight: AXPUserProfileSectionInsight): Date | null {\n if (!insight.date) {\n return null;\n }\n\n return Number.isNaN(insight.date.getTime()) ? null : insight.date;\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private isDisplayableInsight(insight: AXPUserProfileSectionInsight): boolean {\n if (insight.text?.trim()) {\n return true;\n }\n\n return this.resolveInsightDate(insight) !== null;\n }\n\n private async loadPage(): Promise<void> {\n this.isLoading.set(true);\n try {\n const [groups, header] = await Promise.all([\n this.registry.loadGroups(),\n this.headerService.load(),\n ]);\n\n this.groups.set(groups);\n this.header.set(header);\n await this.syncGroupFromRoute();\n const groupId = this.activeGroupId();\n if (groupId) {\n await this.ensureGroupContent(groupId);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async syncGroupFromRoute(): Promise<void> {\n const groups = this.groups();\n if (!groups.length) {\n this.activeGroupId.set(null);\n return;\n }\n\n const routeSegment = this.activatedRoute.snapshot.paramMap.get('groupId');\n const appName = this.sessionService.application?.name;\n\n if (!routeSegment) {\n if (this.deviceService.isLarge()) {\n await this.navigateToDefaultGroup(groups, { replaceUrl: true });\n } else {\n this.activeGroupId.set(null);\n }\n return;\n }\n\n const matchedGroup = this.registry.resolveGroupByRoute(groups, routeSegment);\n if (!matchedGroup) {\n if (this.deviceService.isLarge()) {\n await this.navigateToDefaultGroup(groups, { replaceUrl: true });\n } else if (appName) {\n await this.router.navigate([appName, 'profile'], { replaceUrl: true });\n } else {\n this.activeGroupId.set(null);\n }\n return;\n }\n\n const canonicalRoute = this.registry.resolveGroupRoute(matchedGroup);\n if (appName && routeSegment.toLowerCase() !== canonicalRoute.toLowerCase()) {\n await this.router.navigate([appName, 'profile', canonicalRoute], { replaceUrl: true });\n return;\n }\n\n this.activeGroupId.set(matchedGroup.id);\n }\n\n private async navigateToDefaultGroup(\n groups: AXPUserProfileGroup[],\n extras?: { replaceUrl?: boolean },\n ): Promise<void> {\n const defaultGroup = this.registry.resolveDefaultGroup(groups);\n if (!defaultGroup) {\n this.activeGroupId.set(null);\n return;\n }\n\n const appName = this.sessionService.application?.name;\n if (appName) {\n await this.router.navigate([appName, 'profile', this.registry.resolveGroupRoute(defaultGroup)], extras);\n return;\n }\n\n this.activeGroupId.set(defaultGroup.id);\n }\n\n private async reloadSections(): Promise<void> {\n const groupId = this.activeGroupId();\n if (!groupId) {\n return;\n }\n\n const loaded = await this.registry.loadSections(groupId);\n this.sections.set(this.registry.replaceGroupSections(this.sections(), loaded, groupId));\n }\n\n private async ensureGroupContent(groupId: string): Promise<void> {\n this.markGroupVisited(groupId);\n\n const inflight = this.sectionLoadInflight.get(groupId);\n if (inflight) {\n await inflight;\n return;\n }\n\n if (this.loadedSectionGroupIds().has(groupId)) {\n return;\n }\n\n const load = this.loadGroupSections(groupId).finally(() => {\n this.sectionLoadInflight.delete(groupId);\n });\n this.sectionLoadInflight.set(groupId, load);\n await load;\n }\n\n private async loadGroupSections(groupId: string): Promise<void> {\n const loaded = await this.registry.loadSections(groupId);\n this.sections.set(this.registry.replaceGroupSections(this.sections(), loaded, groupId));\n\n const next = new Set(this.loadedSectionGroupIds());\n next.add(groupId);\n this.loadedSectionGroupIds.set(next);\n }\n\n private markGroupVisited(groupId: string): void {\n const visited = this.visitedGroupIds();\n if (visited.has(groupId)) {\n return;\n }\n\n const next = new Set(visited);\n next.add(groupId);\n this.visitedGroupIds.set(next);\n }\n\n private bindProfileIdentityUpdates(): void {\n this.sessionService.user$\n .pipe(\n filter((user) => !!user?.id),\n distinctUntilChanged(\n (previous, current) =>\n previous?.title === current?.title &&\n previous?.name === current?.name,\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n void this.reloadProfileHeader();\n });\n }\n\n private async reloadProfileHeader(): Promise<void> {\n const header = await this.headerService.load();\n this.header.set(header);\n }\n\n private shouldReloadSecuritySections(commandName: string): boolean {\n return (\n commandName === AXMAuthCommandKeys.Session.OpenSessions ||\n commandName === AXMAuthCommandKeys.Profile.EditAccountInfo ||\n commandName === AXMAuthCommandKeys.Security.ManageTwoFactor\n );\n }\n\n private shouldReloadHealthSections(commandName: string): boolean {\n // Only the health-profile editor changes Medical Summary insights; list popups must not reload on close.\n return commandName === 'HealthCore.Profile:EditMyHealthProfile';\n }\n\n private applyProfileSectionInsightsPatch(result: AXPRuntimeCommandResult): boolean {\n const patch = result.metadata?.[PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY] as\n | AXPUserProfileSectionInsightsPatch\n | undefined;\n\n if (!patch?.sectionId) {\n return false;\n }\n\n const sections = this.sections();\n const index = sections.findIndex((section) => section.id === patch.sectionId);\n if (index < 0) {\n return false;\n }\n\n const insights = patch.insights ?? [];\n const nextSections = [...sections];\n nextSections[index] = {\n ...sections[index],\n insights: insights.length ? insights : undefined,\n };\n this.sections.set(nextSections);\n return true;\n }\n\n private applyHealthProfileSectionPatch(result: AXPRuntimeCommandResult): boolean {\n const patch = result.metadata?.['healthProfileSectionPatch'] as\n | {\n sectionId?: string;\n insights?: AXPUserProfileSectionInsight[];\n existingProfileId?: string | null;\n }\n | undefined;\n\n if (!patch?.sectionId) {\n return false;\n }\n\n const sections = this.sections();\n const index = sections.findIndex((section) => section.id === patch.sectionId);\n if (index < 0) {\n return false;\n }\n\n const section = sections[index];\n const insights = patch.insights ?? [];\n const nextSection: AXPUserProfileSection = {\n ...section,\n insights: insights.length ? insights : undefined,\n actions: (section.actions ?? []).map((sectionAction) => {\n if (sectionAction.command?.name !== 'HealthCore.Profile:EditMyHealthProfile') {\n return sectionAction;\n }\n\n return {\n ...sectionAction,\n command: {\n ...sectionAction.command,\n options: {\n ...(sectionAction.command.options ?? {}),\n existingProfileId: patch.existingProfileId ?? null,\n },\n },\n };\n }),\n };\n\n const nextSections = [...sections];\n nextSections[index] = nextSection;\n this.sections.set(nextSections);\n return true;\n }\n\n private isPinRelatedAction(action: AXPActionMenuItem): boolean {\n const commandName = action.command?.name;\n\n return (\n commandName === AXMAuthCommandKeys.Security.SetPinCode ||\n commandName === AXMAuthCommandKeys.Security.RemovePinCode\n );\n }\n\n private async executeCommand(\n command: AXPExecuteCommand,\n ): Promise<AXPRuntimeCommandResult | void> {\n if (this.commandService.exists(command.name)) {\n const result = await this.commandService.execute(command.name, command.options ?? {});\n return result ?? undefined;\n }\n }\n\n //#endregion\n}\n","<axp-page-layout *translate=\"let t\">\n <axp-page-content>\n @if (isLoading()) {\n <!-- ----- Profile page skeleton ----- -->\n <div class=\"__shell\" aria-hidden=\"true\">\n <section class=\"__hero-card\">\n <div class=\"__hero-header\">\n <div class=\"__hero-cover\">\n <span class=\"__hero-wave __hero-wave--primary\"></span>\n <span class=\"__hero-wave __hero-wave--soft\"></span>\n <span class=\"__hero-wave __hero-wave--light\"></span>\n </div>\n <div class=\"__hero-content\">\n <div class=\"__hero-avatar\">\n <ax-skeleton class=\"size-24 rounded-full\" [animated]=\"true\"></ax-skeleton>\n </div>\n <div class=\"__hero-details\">\n <ax-skeleton class=\"h-7 w-48 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"mt-2 h-4 w-32 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </div>\n <!--------------------------------------------------------------->\n @if (!isCompactNav()) {\n <!-- ----- Desktop tab skeletons ----- -->\n <div class=\"__tabs __tabs-skeleton\">\n @for (item of pageTabSkeletonPlaceholders; track item) {\n <ax-skeleton class=\"h-4 w-20 rounded-md\" [animated]=\"true\"></ax-skeleton>\n }\n </div>\n }\n </section>\n <!--------------------------------------------------------------->\n @if (isCompactNav()) {\n <!-- ----- Compact group-list skeletons ----- -->\n <div class=\"__group-nav\">\n @for (item of pageListSkeletonPlaceholders; track item) {\n <div class=\"__group-nav-skeleton-row\">\n <ax-skeleton class=\"size-5 shrink-0 rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"h-4 min-w-0 flex-1 rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"size-4 shrink-0 rounded-md\" [animated]=\"true\"></ax-skeleton>\n </div>\n }\n </div>\n }\n <!-- ----- Desktop section-card skeletons ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"sectionCardsSkeleton\"></ng-container>\n }\n </div>\n } @else if (header(); as profileHeader) {\n <div class=\"__shell\">\n <!--->\n <!-- ----- Profile hero and desktop group tabs ----- -->\n @if (showHero()) {\n <section\n class=\"__hero-card\"\n [axpSticky]=\"'--stuck'\"\n stickyParent=\"#axp-page-layout\"\n [stickyOffset]=\"0\"\n >\n <div class=\"__hero-header\">\n <div class=\"__hero-cover\" aria-hidden=\"true\">\n <span class=\"__hero-wave __hero-wave--primary\" aria-hidden=\"true\"></span>\n <span class=\"__hero-wave __hero-wave--soft\" aria-hidden=\"true\"></span>\n <span class=\"__hero-wave __hero-wave--light\" aria-hidden=\"true\"></span>\n </div>\n\n <div class=\"__hero-content\">\n <div class=\"__hero-avatar\">\n <axp-user-avatar [size]=\"96\" [userId]=\"profileHeader.avatarUserId\"></axp-user-avatar>\n <button type=\"button\" class=\"__avatar-edit\"\n [attr.aria-label]=\"('@auth:profile-page.avatar.edit' | translate | async) ?? ''\"\n (click)=\"handleEditAvatar()\">\n <ax-icon icon=\"fa-light fa-camera\"></ax-icon>\n </button>\n </div>\n\n <div class=\"__hero-details\">\n <h2 class=\"__hero-name\">{{ profileHeader.displayName }}</h2>\n\n @if (profileHeader.username || profileHeader.joinedAt) {\n <p class=\"__hero-subtitle\">\n @if (profileHeader.username) {\n <span class=\"__hero-subtitle-item\">\n <ax-icon icon=\"fa-light fa-user\"></ax-icon>\n <span>{{ profileHeader.username }}</span>\n </span>\n }\n @if (profileHeader.username && profileHeader.joinedAt) {\n <span class=\"__hero-subtitle-separator\" aria-hidden=\"true\">·</span>\n }\n @if (profileHeader.joinedAt) {\n <span class=\"__hero-subtitle-item\">\n <ax-icon icon=\"fa-light fa-calendar\"></ax-icon>\n <span>\n {{ '@auth:profile-page.header.meta.member-since' | translate | async }}\n {{ profileHeader.joinedAt | format: 'date' : { format: 'long' } | async }}\n </span>\n </span>\n }\n </p>\n }\n\n @if (profileHeader.meta.length) {\n <ul class=\"__hero-meta\">\n @for (item of profileHeader.meta; track item.id) {\n <li class=\"__hero-meta-item\">\n @if (item.icon) {\n <ax-icon [icon]=\"item.icon\"></ax-icon>\n }\n <span class=\"__hero-meta-label\">{{ item.label | translate | async }}</span>\n <span class=\"__hero-meta-value\">{{ item.value }}</span>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n\n <!--->\n <!-- ----- Desktop group tabs ----- -->\n @if (showTabs()) {\n <ax-tabs class=\"__tabs\" [look]=\"'with-line'\" [location]=\"'bottom'\" [fitParent]=\"false\"\n (onActiveTabChanged)=\"handleGroupTabChanged($event)\">\n @for (group of groups(); track group.id) {\n <ax-tab-item [key]=\"group.id\" [text]=\"(group.title | translate | async)!\"\n [active]=\"activeGroupId() === group.id\">\n @if (group.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"group.icon\"></ax-icon>\n </ax-prefix>\n }\n </ax-tab-item>\n }\n </ax-tabs>\n }\n </section>\n }\n\n <!--->\n <!-- ----- Profile area list on compact screens ----- -->\n @if (showGroupList()) {\n <axp-layout-list class=\"__group-nav\">\n @for (group of groups(); track group.id) {\n <axp-layout-list-item (click)=\"handleSelectGroup(group)\">\n <!--->\n <!-- ----- Group icon ----- -->\n @if (group.icon) {\n <axp-layout-prefix>\n <ax-icon [icon]=\"group.icon\" class=\"text-gray-500\"></ax-icon>\n </axp-layout-prefix>\n }\n <axp-layout-content>\n <a class=\"font-semibold\">{{ group.title | translate | async }}</a>\n </axp-layout-content>\n <axp-layout-suffix>\n <ax-icon icon=\"far fa-chevron-right rtl:rotate-180\" class=\"text-gray-400\"></ax-icon>\n </axp-layout-suffix>\n </axp-layout-list-item>\n }\n </axp-layout-list>\n }\n\n <ng-template #sectionCopyBody let-section=\"section\">\n @if (section.title) {\n <h3 class=\"__section-title\">{{ section.title | translate | async }}</h3>\n }\n\n @if (hasDisplayableInsights(section)) {\n <ul class=\"__section-insights\">\n @for (insight of displayableInsights(section); track insight.id) {\n <li\n class=\"__section-insight\"\n [axTooltip]=\"insight.title ? ((insight.title | translate | async) ?? '') : ''\"\n [axTooltipDisabled]=\"!insight.title\"\n axTooltipPlacement=\"top\"\n >\n <span class=\"__section-insight-icon-wrap\" aria-hidden=\"true\">\n @if (insight.icon) {\n <ax-icon [icon]=\"insight.icon\"></ax-icon>\n }\n </span>\n <span class=\"__section-insight-text\">\n @if (resolveInsightDate(insight); as insightDate) {\n @if (insight.datePrefix) {\n <span>{{ insight.datePrefix | translate | async }} · </span>\n }\n <span>{{ insightDate | format: 'timeleft' | async }}</span>\n } @else if (insight.text) {\n {{ insight.text | translate | async }}\n }\n </span>\n </li>\n }\n </ul>\n } @else if (section.description) {\n <p class=\"__section-description\">{{ section.description | translate | async }}</p>\n }\n </ng-template>\n\n <!--->\n <!-- ----- Lazy group panels: created on first visit, then shown or hidden ----- -->\n @if (showGroupContent()) {\n @for (group of groups(); track group.id) {\n @if (isGroupVisited(group.id)) {\n <div\n class=\"__group-panel\"\n [class.--inactive]=\"!isGroupPanelActive(group.id)\"\n [attr.aria-hidden]=\"!isGroupPanelActive(group.id)\"\n [attr.inert]=\"isGroupPanelActive(group.id) ? null : ''\"\n >\n @if (isGroupSectionsPending(group)) {\n <!-- ----- Section cards skeleton while group content loads ----- -->\n <ng-container *ngTemplateOutlet=\"sectionCardsSkeleton\"></ng-container>\n } @else if (groupComponentContent(group); as componentContent) {\n <!-- ----- Full-tab page component ----- -->\n <div class=\"__group-content\">\n <div axp-page-component-renderer [componentKey]=\"componentContent.componentKey\"\n [pageConfig]=\"componentContent.pageConfig ?? {}\"></div>\n </div>\n } @else {\n <!-- ----- Section cards for groups that do not replace the tab body ----- -->\n <div class=\"__sections\">\n @for (section of sectionsForGroup(group.id); track section.id) {\n @let sectionContent = resolveSectionContent(section);\n <div class=\"__section-slot\" [class.--has-col-start]=\"hasSectionColStart(section.layout)\"\n [style]=\"sectionLayoutVars(section.layout)\">\n @if (sectionContent.mode === 'component') {\n <div axp-page-component-renderer [componentKey]=\"sectionContent.componentKey\"\n [pageConfig]=\"sectionContent.pageConfig ?? {}\"></div>\n } @else {\n @let visibleActions = visibleSectionActions(sectionContent.actions);\n @let defaultAction = defaultSectionAction(sectionContent.actions);\n <article class=\"__section-card\">\n @if (defaultAction) {\n <div\n class=\"__section-card-action\"\n [class.__section-card-action--with-menu]=\"visibleActions.length > 1\"\n >\n <button\n type=\"button\"\n class=\"__section-card-hit\"\n [disabled]=\"defaultAction.disabled === true\"\n (click)=\"handleActionClick(defaultAction)\"\n >\n @if (section.icon) {\n <div class=\"__section-icon\">\n <ax-icon [icon]=\"section.icon\"></ax-icon>\n </div>\n }\n <div class=\"__section-copy\">\n <ng-container *ngTemplateOutlet=\"sectionCopyBody; context: { section: section }\"></ng-container>\n </div>\n </button>\n\n @if (visibleActions.length > 1) {\n <div class=\"__section-more-actions-wrap\" (click)=\"$event.stopPropagation()\">\n <ax-button\n class=\"__section-more-actions\"\n look=\"blank\"\n color=\"default\"\n [attr.aria-label]=\"('@auth:profile-page.page.sections.actions' | translate | async) ?? ''\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of visibleActions; track action.name ?? action.title) {\n <ax-button-item\n [text]=\"(action.title | translate | async)!\"\n [color]=\"action.color\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"handleActionClick(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n }\n </div>\n } @else {\n <div class=\"__section-card-action __section-card-action--static\">\n @if (section.icon) {\n <div class=\"__section-icon\">\n <ax-icon [icon]=\"section.icon\"></ax-icon>\n </div>\n }\n <div class=\"__section-copy\">\n <ng-container *ngTemplateOutlet=\"sectionCopyBody; context: { section: section }\"></ng-container>\n </div>\n </div>\n }\n </article>\n }\n </div>\n } @empty {\n <p class=\"__sections-empty\">{{ '@auth:profile-page.page.sections.empty' | translate | async }}</p>\n }\n </div>\n }\n </div>\n }\n }\n }\n </div>\n }\n <ng-template #sectionCardsSkeleton>\n <div class=\"__sections\">\n @for (item of sectionSkeletonPlaceholders; track item) {\n <div class=\"__section-slot\">\n <article class=\"__section-card\">\n <div class=\"__section-card-action __section-card-action--static\">\n <ax-skeleton class=\"size-14 shrink-0 rounded-xl\" [animated]=\"true\"></ax-skeleton>\n <div class=\"__section-copy flex flex-col gap-2\">\n <ax-skeleton class=\"h-4 w-40 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"h-3 w-56 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </article>\n </div>\n }\n </div>\n </ng-template>\n </axp-page-content>\n</axp-page-layout>"],"names":["i1","i2","i5","i7"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA;AAEA;;AAEG;MAEU,iCAAiC,CAAA;AAD9C,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAkF5D,IAAA;;;AA5EC,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA8B,wBAAwB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAChH,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvD;IAEA,MAAM,YAAY,CAAC,OAAgB,EAAA;QACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAgC,0BAA0B,EAAE;AACnG,YAAA,QAAQ,EAAE,EAAE;YACZ,OAAO;AACR,SAAA,CAAC;AACF,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IACzF;AAEA,IAAA,oBAAoB,CAClB,QAAiC,EACjC,aAAsC,EACtC,OAAe,EAAA;QAEf,OAAO,IAAI,CAAC,YAAY,CAAC;AACvB,YAAA,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC;AAC5D,YAAA,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC;AAClE,SAAA,CAAC;IACJ;AAEA,IAAA,MAAM,cAAc,GAAA;QAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAkC,6BAA6B,EAAE;AACxG,YAAA,KAAK,EAAE,EAAE;AACV,SAAA,CAAC;AACF,QAAA,OAAO,OAAO,CACZ,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAC1C,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAC/C,CAAC,KAAK,EAAE,KAAK,CAAC,CACf;IACH;IAEA,qBAAqB,CAAC,QAAiC,EAAE,OAAsB,EAAA;QAC7E,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,QAAQ;QACjB;AACA,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC;IAClE;AAEA,IAAA,mBAAmB,CAAC,MAA6B,EAAA;QAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC;IAEA,mBAAmB,CAAC,MAA6B,EAAE,YAAoB,EAAA;QACrE,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AACpD,QAAA,MAAM,aAAa,GAAG,UAAU,KAAK,SAAS,GAAG,SAAS,GAAG,UAAU;AAEvE,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CACjC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa,IAAI,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,aAAa,CACpG;IACH;AAEA,IAAA,iBAAiB,CAAC,KAA0B,EAAA;AAC1C,QAAA,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE;IAChC;;;AAMQ,IAAA,uBAAuB,CAAC,QAAiC,EAAA;QAC/D,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChH;AAEQ,IAAA,UAAU,CAAC,MAA6B,EAAA;AAC9C,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjG;AAEQ,IAAA,YAAY,CAAC,QAAiC,EAAA;AACpD,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACnG;8GAnFW,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAjC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iCAAiC,cADpB,MAAM,EAAA,CAAA,CAAA;;2FACnB,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAD7C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACdlC;AAEA,MAAM,+BAA+B,GAAG,yBAAyB;AAgBjE;AAEA;AAEA;;AAEG;MAEU,yBAAyB,CAAA;AADtC,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC;AAkCxD,IAAA;;;AA5BC,IAAA,MAAM,eAAe,GAAA;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE;QAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,sBAAsB,EAAE;AAC1D,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAG1C,wBAAwB,EAAE;AAC1B,gBAAA,MAAM,EAAE,+BAA+B;AACvC,gBAAA,EAAE,EAAE,MAAM;AACX,aAAA,CAAC;AACF,YAAA,OAAO,uBAAuB,CAAC,MAAM,CAAC,IAAI,IAAI;QAChD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,eAAe,CAAC,MAA8C,EAAA;AAC5D,QAAA,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE;AACjB,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC;IAC5C;8GAnCW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cADZ,MAAM,EAAA,CAAA,CAAA;;2FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACblC;AAEA;AAEA;;AAEG;MAEU,2BAA2B,CAAA;AADxC,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,iCAAiC,CAAC;AACpD,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAgCjE,IAAA;;;AA1BC,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI;AAC5C,QAAA,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE;AACpB,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;AAErD,QAAA,MAAM,WAAW,GAAG,SAAS,CAC3B,WAAW,CAAC,KAAK,EACjB,SAAS,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CACrD;AACD,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC;QAElE,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,EAAE;YACtB,WAAW;YACX,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC;YACtD,YAAY,EAAE,WAAW,CAAC,EAAE;AAC5B,YAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;SACvF;IACH;8GAlCW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cADd,MAAM,EAAA,CAAA,CAAA;;2FACnB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AC4E5B,MAAO,2BAA4B,SAAQ,0BAA0B,CAAA;AArC3E,IAAA,WAAA,GAAA;;;AAwCmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,iCAAiC,CAAC;AACpD,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,2BAA2B,CAAC;AACnD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC7B,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;;;QAMxC,IAAA,CAAA,2BAA2B,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAA,CAAA,4BAA4B,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAA,CAAA,2BAA2B,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;;QAM1C,IAAA,CAAA,MAAM,GAAG,MAAM,CAAwB,EAAE;mFAAC;QAC1C,IAAA,CAAA,QAAQ,GAAG,MAAM,CAA0B,EAAE;qFAAC;QAC9C,IAAA,CAAA,MAAM,GAAG,MAAM,CAAkC,IAAI;mFAAC;QACtD,IAAA,CAAA,aAAa,GAAG,MAAM,CAAgB,IAAI;0FAAC;AAC3C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE;4FAAC;AACxD,QAAA,IAAA,CAAA,qBAAqB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE;kGAAC;QAC9D,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,IAAI;sFAAC;AAE1B,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,GAAG,EAAyB;AAEpD,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;yFAAC;AAC5D,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE;8FAAC;QACjF,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE;qFAAC;AACpD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC;qFAAC;AAC3E,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;0FAAC;AAC5E,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE;6FAAC;AAE3F,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,MAAK;AACvC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;YACpC,IAAI,CAAC,OAAO,EAAE;gBACZ;YACF;YAEA,SAAS,CAAC,MAAK;AACb,gBAAA,KAAK,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;AACvC,YAAA,CAAC,CAAC;QACJ,CAAC;8FAAC;AAEO,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,MAAK;YACtC,IAAI,CAAC,aAAa,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;YAC5B,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACnC,CAAC;6FAAC;AAEO,QAAA,IAAA,CAAA,0BAA0B,GAAG,MAAM,CAAC,MAAK;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAC5C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,OAAO,EAAE;gBACnD;YACF;YAEA,SAAS,CAAC,MAAK;AACb,gBAAA,KAAK,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAChE,YAAA,CAAC,CAAC;QACJ,CAAC;uGAAC;AA0cH,IAAA;AAveU,IAAA,iBAAiB;AAWjB,IAAA,gBAAgB;AAMhB,IAAA,0BAA0B;;;AAkB1B,IAAA,MAAM,QAAQ,GAAA;AACrB,QAAA,MAAM,KAAK,CAAC,QAAQ,EAAE;AACtB,QAAA,MAAM,IAAI,CAAC,QAAQ,EAAE;QACrB,IAAI,CAAC,0BAA0B,EAAE;AAEjC,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;AACpF,YAAA,KAAK,IAAI,CAAC,kBAAkB,EAAE;AAChC,QAAA,CAAC,CAAC;IACJ;;;IAMmB,YAAY,GAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC7B,YAAA,OAAO,EAAE;QACX;QAEA,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,IAAI,EAAE;IACxC;IAEmB,kBAAkB,GAAA;AACnC,QAAA,OAAO,IAAI;IACb;IAEmB,WAAW,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC7B,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,IAAI,IAAI;IACzC;IAEmB,aAAa,GAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;AAC7B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE;IACnD;AAES,IAAA,MAAM,iBAAiB,GAAA;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI;QACrD,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD;;;AAMU,IAAA,iBAAiB,CAAC,KAA0B,EAAA;QACpD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI;QACrD,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IACzF;AAEU,IAAA,qBAAqB,CAAC,KAA6B,EAAA;AAC3D,QAAA,MAAM,KAAK,GACT,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;AACxF,QAAA,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE;YAC/C;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;IAEU,gBAAgB,GAAA;QACxB,KAAK,IAAI,CAAC,cAAc,CAAC;AACvB,YAAA,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC,WAAW;AAC7C,SAAA,CAAC;IACJ;IAEU,MAAM,iBAAiB,CAAC,MAAyB,EAAA;AACzD,QAAA,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAClE;QACF;QAEA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC;QAExD,IAAI,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE;AACtD,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;QAC7B;QAEA,IAAI,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,gCAAgC,CAAC,MAAM,CAAC,EAAE;;QAEtE;AAAO,aAAA,IAAI,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACpF,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;QAC7B;QAEA,IAAI,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC,EAAE;;QAEpE;AAAO,aAAA,IAAI,MAAM,EAAE,OAAO,IAAI,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAClF,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;QAC7B;QAEA,IACE,MAAM,EAAE,OAAO;YACf,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,iCAAiC,CAAC,EAClE;AACA,YAAA,MAAM,IAAI,CAAC,mBAAmB,EAAE;QAClC;IACF;AAEU,IAAA,qBAAqB,CAAC,OAA4B,EAAA;AAC1D,QAAA,OAAO,gCAAgC,CAAC,OAAO,CAAC;IAClD;AAEU,IAAA,oBAAoB,CAAC,OAA4B,EAAA;AACzD,QAAA,OAAO,sCAAsC,CAAC,OAAO,CAAC;IACxD;AAEU,IAAA,qBAAqB,CAAC,OAA8B,EAAA;AAC5D,QAAA,OAAO,gCAAgC,CAAC,OAAO,CAAC;IAClD;AAEU,IAAA,cAAc,CAAC,OAAe,EAAA;QACtC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;IAC5C;AAEU,IAAA,kBAAkB,CAAC,OAAe,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,OAAO;IACzC;IAEU,WAAW,GAAA;AACnB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;QACpC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC;IAC5D;AAEU,IAAA,sBAAsB,CAAC,KAA0B,EAAA;QACzD,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1F;AAEU,IAAA,gBAAgB,CAAC,OAAe,EAAA;AACxC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC;IACtE;AAEU,IAAA,qBAAqB,CAAC,KAA0B,EAAA;QACxD,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,WAAW,EAAE;YACvC,OAAO,KAAK,CAAC,OAAO;QACtB;AACA,QAAA,OAAO,SAAS;IAClB;AAEU,IAAA,iBAAiB,CAAC,MAAoC,EAAA;QAC9D,OAAO;AACL,YAAA,oBAAoB,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC;AAC1C,YAAA,oBAAoB,EAAE,MAAM,EAAE,OAAO,IAAI,CAAC;AAC1C,YAAA,qBAAqB,EAAE,MAAM,EAAE,GAAG,IAAI,MAAM;SAC7C;IACH;AAEU,IAAA,kBAAkB,CAAC,MAAoC,EAAA;AAC/D,QAAA,OAAO,MAAM,EAAE,GAAG,IAAI,IAAI;IAC5B;AAEU,IAAA,sBAAsB,CAAC,OAA8B,EAAA;QAC7D,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;IACrD;AAEU,IAAA,mBAAmB,CAAC,OAA8B,EAAA;QAC1D,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACzF;AAEU,IAAA,kBAAkB,CAAC,OAAqC,EAAA;AAChE,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACjB,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI;IACnE;;;AAMQ,IAAA,oBAAoB,CAAC,OAAqC,EAAA;AAChE,QAAA,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;AACxB,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,IAAI;IAClD;AAEQ,IAAA,MAAM,QAAQ,GAAA;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;YACF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACzC,gBAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AAC1B,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AAC1B,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,YAAA,MAAM,IAAI,CAAC,kBAAkB,EAAE;AAC/B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;YACpC,IAAI,OAAO,EAAE;AACX,gBAAA,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACxC;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEQ,IAAA,MAAM,kBAAkB,GAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAClB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B;QACF;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI;QAErD,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AAChC,gBAAA,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACjE;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;YACA;QACF;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC;QAC5E,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;AAChC,gBAAA,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACjE;iBAAO,IAAI,OAAO,EAAE;AAClB,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACxE;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;YACA;QACF;QAEA,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC;AACpE,QAAA,IAAI,OAAO,IAAI,YAAY,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,WAAW,EAAE,EAAE;YAC1E,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACtF;QACF;QAEA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;IACzC;AAEQ,IAAA,MAAM,sBAAsB,CAClC,MAA6B,EAC7B,MAAiC,EAAA;QAEjC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAC9D,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC5B;QACF;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI;QACrD,IAAI,OAAO,EAAE;YACX,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;YACvG;QACF;QAEA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;IACzC;AAEQ,IAAA,MAAM,cAAc,GAAA;AAC1B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;QACpC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;QAEA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzF;IAEQ,MAAM,kBAAkB,CAAC,OAAe,EAAA;AAC9C,QAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAE9B,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;QACtD,IAAI,QAAQ,EAAE;AACZ,YAAA,MAAM,QAAQ;YACd;QACF;QAEA,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC7C;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAK;AACxD,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;AAC1C,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;AAC3C,QAAA,MAAM,IAAI;IACZ;IAEQ,MAAM,iBAAiB,CAAC,OAAe,EAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;QACxD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAEvF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACjB,QAAA,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC;IACtC;AAEQ,IAAA,gBAAgB,CAAC,OAAe,EAAA;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;AACtC,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YACxB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC;AAC7B,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACjB,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC;IAEQ,0BAA0B,GAAA;QAChC,IAAI,CAAC,cAAc,CAAC;AACjB,aAAA,IAAI,CACH,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAC5B,oBAAoB,CAClB,CAAC,QAAQ,EAAE,OAAO,KAChB,QAAQ,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK;AAClC,YAAA,QAAQ,EAAE,IAAI,KAAK,OAAO,EAAE,IAAI,CACnC,EACD,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAK;AACd,YAAA,KAAK,IAAI,CAAC,mBAAmB,EAAE;AACjC,QAAA,CAAC,CAAC;IACN;AAEQ,IAAA,MAAM,mBAAmB,GAAA;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AAC9C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;IACzB;AAEQ,IAAA,4BAA4B,CAAC,WAAmB,EAAA;AACtD,QAAA,QACE,WAAW,KAAK,kBAAkB,CAAC,OAAO,CAAC,YAAY;AACvD,YAAA,WAAW,KAAK,kBAAkB,CAAC,OAAO,CAAC,eAAe;AAC1D,YAAA,WAAW,KAAK,kBAAkB,CAAC,QAAQ,CAAC,eAAe;IAE/D;AAEQ,IAAA,0BAA0B,CAAC,WAAmB,EAAA;;QAEpD,OAAO,WAAW,KAAK,wCAAwC;IACjE;AAEQ,IAAA,gCAAgC,CAAC,MAA+B,EAAA;QACtE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,GAAG,2CAA2C,CAE9D;AAEb,QAAA,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE;AACrB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC;AAC7E,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE;AACrC,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC;QAClC,YAAY,CAAC,KAAK,CAAC,GAAG;YACpB,GAAG,QAAQ,CAAC,KAAK,CAAC;YAClB,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS;SACjD;AACD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;AAC/B,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,8BAA8B,CAAC,MAA+B,EAAA;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,GAAG,2BAA2B,CAM9C;AAEb,QAAA,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE;AACrB,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,SAAS,CAAC;AAC7E,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;AACb,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC;AAC/B,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE;AACrC,QAAA,MAAM,WAAW,GAA0B;AACzC,YAAA,GAAG,OAAO;YACV,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,QAAQ,GAAG,SAAS;AAChD,YAAA,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,aAAa,KAAI;gBACrD,IAAI,aAAa,CAAC,OAAO,EAAE,IAAI,KAAK,wCAAwC,EAAE;AAC5E,oBAAA,OAAO,aAAa;gBACtB;gBAEA,OAAO;AACL,oBAAA,GAAG,aAAa;AAChB,oBAAA,OAAO,EAAE;wBACP,GAAG,aAAa,CAAC,OAAO;AACxB,wBAAA,OAAO,EAAE;4BACP,IAAI,aAAa,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;AACxC,4BAAA,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,IAAI,IAAI;AACnD,yBAAA;AACF,qBAAA;iBACF;AACH,YAAA,CAAC,CAAC;SACH;AAED,QAAA,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC;AAClC,QAAA,YAAY,CAAC,KAAK,CAAC,GAAG,WAAW;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;AAC/B,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,kBAAkB,CAAC,MAAyB,EAAA;AAClD,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI;AAExC,QAAA,QACE,WAAW,KAAK,kBAAkB,CAAC,QAAQ,CAAC,UAAU;AACtD,YAAA,WAAW,KAAK,kBAAkB,CAAC,QAAQ,CAAC,aAAa;IAE7D;IAEQ,MAAM,cAAc,CAC1B,OAA0B,EAAA;QAE1B,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC5C,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;YACrF,OAAO,MAAM,IAAI,SAAS;QAC5B;IACF;8GA3gBW,2BAA2B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,sBAAA,EAAA,qBAAA,EAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,EAAA,SAAA,EAX3B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,2BAA2B;AACzC,aAAA;AACF,SAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChGH,0/eA8UkB,EAAA,MAAA,EAAA,CAAA,0lqBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1Qd,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAGZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,2BAAA,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,cAAc,mwBACd,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,cAAA,EAAA,cAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,uBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,sBAAsB,4DACtB,4BAA4B,EAAA,QAAA,EAAA,qfAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC5B,2BAA2B,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,+BAA+B,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC/B,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,iCAAiC,yNAfjC,YAAY,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAgCH,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBArCvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,OAAA,EACxB;wBACP,YAAY;wBACZ,SAAS;wBACT,YAAY;wBACZ,YAAY;wBACZ,iBAAiB;wBACjB,cAAc;wBACd,gBAAgB;wBAChB,gBAAgB;wBAChB,YAAY;wBACZ,kBAAkB;wBAClB,mBAAmB;wBACnB,eAAe;wBACf,sBAAsB;wBACtB,4BAA4B;wBAC5B,2BAA2B;wBAC3B,+BAA+B;wBAC/B,sBAAsB;wBACtB,iCAAiC;AAClC,qBAAA,EAAA,eAAA,EAGgB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,SAAA,EAC1B;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAA,2BAA6B;AACzC,yBAAA;qBACF,EAAA,IAAA,EACK;AACJ,wBAAA,KAAK,EAAE,uBAAuB;AAC9B,wBAAA,wBAAwB,EAAE,qBAAqB;AAChD,qBAAA,EAAA,QAAA,EAAA,0/eAAA,EAAA,MAAA,EAAA,CAAA,0lqBAAA,CAAA,EAAA;;;"}
1
+ {"version":3,"file":"acorex-platform-module-auth-client-profile-page.component-zoMpwrJM.mjs","sources":["../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-registry.service.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-user.service.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page-header.service.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page.component.ts","../../../../libs/modules/auth/client/src/lib/pages/account/profile-page/profile-page.component.html"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPHookService } from '@acorex-platform/framework-client/core';\nimport { defaultTo, first, orderBy, uniqBy } from 'lodash';\nimport {\n AXPUserProfileGroup,\n AXPUserProfileGroupsPayload,\n AXPUserProfileHeaderMetaItem,\n AXPUserProfileHeaderMetaPayload,\n AXPUserProfileSection,\n AXPUserProfileSectionsPayload,\n PROFILE_PAGE_GROUPS_HOOK,\n PROFILE_PAGE_HEADER_META_HOOK,\n PROFILE_PAGE_SECTIONS_HOOK,\n} from './profile-page.types';\n\n//#region ---- Profile page registry ----\n\n/**\n * Aggregates profile page groups, sections, and header meta from distributed hooks.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfilePageRegistryService {\n //#region ---- Services & Dependencies ----\n\n private readonly hooks = inject(AXPHookService);\n private readonly sessionService = inject(AXPSessionService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n async loadGroups(): Promise<AXPUserProfileGroup[]> {\n const payload = await this.hooks.runAsync<AXPUserProfileGroupsPayload>(PROFILE_PAGE_GROUPS_HOOK, { groups: [] });\n return this.sortGroups(defaultTo(payload.groups, []));\n }\n\n async loadSections(groupId?: string): Promise<AXPUserProfileSection[]> {\n const payload = await this.hooks.runAsync<AXPUserProfileSectionsPayload>(PROFILE_PAGE_SECTIONS_HOOK, {\n sections: [],\n groupId,\n });\n return this.sortSections(this.filterSectionsByFeature(defaultTo(payload.sections, [])));\n }\n\n replaceGroupSections(\n existing: AXPUserProfileSection[],\n groupSections: AXPUserProfileSection[],\n groupId: string,\n ): AXPUserProfileSection[] {\n return this.sortSections([\n ...existing.filter((section) => section.groupId !== groupId),\n ...groupSections.filter((section) => section.groupId === groupId),\n ]);\n }\n\n async loadHeaderMeta(): Promise<AXPUserProfileHeaderMetaItem[]> {\n const payload = await this.hooks.runAsync<AXPUserProfileHeaderMetaPayload>(PROFILE_PAGE_HEADER_META_HOOK, {\n items: [],\n });\n return orderBy(\n uniqBy(defaultTo(payload.items, []), 'id'),\n [(item) => defaultTo(item.priority, 100), 'id'],\n ['asc', 'asc'],\n );\n }\n\n filterSectionsByGroup(sections: AXPUserProfileSection[], groupId: string | null): AXPUserProfileSection[] {\n if (!groupId) {\n return sections;\n }\n return sections.filter((section) => section.groupId === groupId);\n }\n\n resolveDefaultGroup(groups: AXPUserProfileGroup[]): AXPUserProfileGroup | undefined {\n return first(this.sortGroups(groups));\n }\n\n resolveGroupByRoute(groups: AXPUserProfileGroup[], routeSegment: string): AXPUserProfileGroup | undefined {\n const normalized = routeSegment.trim().toLowerCase();\n const resolvedRoute = normalized === 'privacy' ? 'account' : normalized;\n\n return this.sortGroups(groups).find(\n (group) => group.id.toLowerCase() === resolvedRoute || group.route?.toLowerCase() === resolvedRoute,\n );\n }\n\n resolveGroupRoute(group: AXPUserProfileGroup): string {\n return group.route ?? group.id;\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private filterSectionsByFeature(sections: AXPUserProfileSection[]): AXPUserProfileSection[] {\n return sections.filter((section) => !section.feature || this.sessionService.isFeatureEnabled(section.feature));\n }\n\n private sortGroups(groups: AXPUserProfileGroup[]): AXPUserProfileGroup[] {\n return orderBy(uniqBy(groups, 'id'), [(g) => defaultTo(g.priority, 100), 'id'], ['asc', 'asc']);\n }\n\n private sortSections(sections: AXPUserProfileSection[]): AXPUserProfileSection[] {\n return orderBy(uniqBy(sections, 'id'), [(s) => defaultTo(s.priority, 100), 'id'], ['asc', 'asc']);\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeQueryPayloadData } from '@acorex-platform/framework-shared/core';\nimport { ENTITY_GET_BY_ID_DEFAULT } from '@acorex-platform/framework-shared/runtime';\nimport { Injectable, inject } from '@angular/core';\nimport { get, isNil } from 'lodash';\n\n//#region ----- Constants -----\n\nconst SECURITY_MANAGEMENT_USER_ENTITY = 'SecurityManagement.User';\n\n//#endregion\n\n//#region ----- Current user record -----\n\nexport interface AXPUserProfileCurrentUserRecord {\n id: string;\n username?: string;\n displayName?: string;\n auditInfo?: {\n created?: { at?: Date | string };\n updated?: { at?: Date | string };\n };\n}\n\n//#endregion\n\n//#region ----- Profile page user service -----\n\n/**\n * Loads the persisted user row for the logged-in session (audit info, display fields).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfileUserService {\n //#region ----- Services & Dependencies -----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly queryService = inject(AXPQueryService);\n\n //#endregion\n\n //#region ----- Public API -----\n\n async loadCurrentUser(): Promise<AXPUserProfileCurrentUserRecord | null> {\n const userId = this.sessionService.user?.id;\n if (!userId || !this.sessionService.isReadyForAppScopedApi) {\n return null;\n }\n\n try {\n const result = await this.queryService.fetch<\n { entity: string; id: string },\n AXPUserProfileCurrentUserRecord\n >(ENTITY_GET_BY_ID_DEFAULT, {\n entity: SECURITY_MANAGEMENT_USER_ENTITY,\n id: userId,\n });\n return runtimeQueryPayloadData(result) ?? null;\n } catch {\n return null;\n }\n }\n\n resolveJoinedAt(record: AXPUserProfileCurrentUserRecord | null): Date | string | undefined {\n if (isNil(record)) {\n return undefined;\n }\n return get(record, 'auditInfo.created.at');\n }\n\n //#endregion\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { Injectable, inject } from '@angular/core';\nimport { defaultTo } from 'lodash';\nimport { AXPUserProfilePageRegistryService } from './profile-page-registry.service';\nimport { AXPUserProfileHeaderMetaItem } from './profile-page.types';\nimport { AXPUserProfileUserService } from './profile-page-user.service';\n\n//#region ---- Header view model ----\n\nexport interface AXPUserProfileHeaderView {\n userId: string;\n displayName: string;\n username?: string;\n joinedAt?: Date | string;\n avatarUserId: string;\n /** Extra header rows contributed via hooks (username/joined are on the view root). */\n meta: AXPUserProfileHeaderMetaItem[];\n}\n\n//#endregion\n\n//#region ---- Profile page header service ----\n\n/**\n * Builds profile page header data from session and optional extended profile sources.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXPUserProfileHeaderService {\n //#region ---- Services & Dependencies ----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly registry = inject(AXPUserProfilePageRegistryService);\n private readonly userService = inject(AXPUserProfileUserService);\n\n //#endregion\n\n //#region ---- Public API ----\n\n async load(): Promise<AXPUserProfileHeaderView | null> {\n const sessionUser = this.sessionService.user;\n if (!sessionUser?.id) {\n return null;\n }\n\n const userRecord = await this.userService.loadCurrentUser();\n const hookMeta = await this.registry.loadHeaderMeta();\n\n const displayName = defaultTo(\n sessionUser.title,\n defaultTo(userRecord?.displayName, sessionUser.name),\n );\n const username = defaultTo(userRecord?.username, sessionUser.name);\n\n return {\n userId: sessionUser.id,\n displayName,\n username,\n joinedAt: this.userService.resolveJoinedAt(userRecord),\n avatarUserId: sessionUser.id,\n meta: hookMeta.sort((a, b) => defaultTo(a.priority, 100) - defaultTo(b.priority, 100)),\n };\n }\n\n //#endregion\n}\n\n//#endregion\n","\nimport {\n AXPActionMenuItem,\n AXPBackButton,\n AXPExecuteCommand,\n AXPMultiLanguageString,\n AXPRuntimeCommandResult,\n} from '@acorex-platform/framework-shared/core';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTabsModule, AXTabStripChangedEvent } from '@acorex/components/tabs';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXTooltipModule } from '@acorex/components/tooltip';\nimport { AXPStickyDirective } from '@acorex-platform/framework-client/common';\n\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutListComponent,\n AXPThemeLayoutListItemComponent,\n AXPUserAvatarComponent,\n} from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPPageComponentRendererDirective,\n AXPPageLayoutBase,\n AXPPageLayoutBaseComponent,\n AXPPageLayoutComponent,\n} from '@acorex-platform/framework-client/layout/views';\nimport { AsyncPipe, CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n signal,\n untracked,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, RouterModule } from '@angular/router';\nimport { distinctUntilChanged, filter } from 'rxjs';\nimport { AXMAuthCommandKeys } from '@acorex-platform/module-auth-client/contracts';\nimport { AXPUserProfileHeaderService, AXPUserProfileHeaderView } from './profile-page-header.service';\nimport { AXPUserProfilePageRegistryService } from './profile-page-registry.service';\nimport {\n PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY,\n type AXPUserProfileSectionInsightsPatch,\n} from './profile-password-insight.util';\nimport {\n AXPUserProfileGroup,\n AXPUserProfileGroupComponentContent,\n AXPUserProfileSection,\n AXPUserProfileSectionInsight,\n AXPUserProfileSectionLayout,\n resolveDefaultUserProfileSectionAction,\n resolveUserProfileSectionContent,\n visibleUserProfileSectionActions,\n} from './profile-page.types';\n\n@Component({\n selector: 'axm-user-profile-page',\n imports: [\n CommonModule,\n AsyncPipe,\n AXFormatPipe,\n RouterModule,\n AXDecoratorModule,\n AXButtonModule,\n AXDropdownModule,\n AXSkeletonModule,\n AXTabsModule,\n AXPStickyDirective,\n AXTranslationModule,\n AXTooltipModule,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutListComponent,\n AXPThemeLayoutListItemComponent,\n AXPUserAvatarComponent,\n AXPPageComponentRendererDirective,\n ],\n templateUrl: './profile-page.component.html',\n styleUrl: './profile-page.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMUserProfilePageComponent,\n },\n ],\n host: {\n class: 'axm-user-profile-page',\n '[class.--mobile-group]': 'isMobileGroupView()',\n },\n})\nexport class AXMUserProfilePageComponent extends AXPPageLayoutBaseComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly registry = inject(AXPUserProfilePageRegistryService);\n private readonly headerService = inject(AXPUserProfileHeaderService);\n private readonly commandService = inject(AXPCommandService);\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly deviceService = inject(AXPDeviceService);\n\n //#endregion\n\n //#region ----- Constants -----\n\n protected readonly pageTabSkeletonPlaceholders = [1, 2, 3, 4];\n protected readonly pageListSkeletonPlaceholders = [1, 2, 3, 4];\n protected readonly sectionSkeletonPlaceholders = [1, 2, 3, 4];\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly groups = signal<AXPUserProfileGroup[]>([]);\n protected readonly sections = signal<AXPUserProfileSection[]>([]);\n protected readonly header = signal<AXPUserProfileHeaderView | null>(null);\n protected readonly activeGroupId = signal<string | null>(null);\n protected readonly visitedGroupIds = signal<ReadonlySet<string>>(new Set());\n protected readonly loadedSectionGroupIds = signal<ReadonlySet<string>>(new Set());\n protected readonly isLoading = signal(true);\n\n private readonly sectionLoadInflight = new Map<string, Promise<void>>();\n\n protected readonly isCompactNav = computed(() => !this.deviceService.isLarge());\n protected readonly isMobileGroupView = computed(() => this.isCompactNav() && !!this.activeGroupId());\n protected readonly showHero = computed(() => !this.isMobileGroupView());\n protected readonly showTabs = computed(() => !this.isCompactNav() && this.groups().length > 0);\n protected readonly showGroupList = computed(() => this.isCompactNav() && !this.activeGroupId());\n protected readonly showGroupContent = computed(() => !this.isCompactNav() || !!this.activeGroupId());\n\n readonly #loadVisitedGroup = effect(() => {\n const groupId = this.activeGroupId();\n if (!groupId) {\n return;\n }\n\n untracked(() => {\n void this.ensureGroupContent(groupId);\n });\n });\n\n readonly #navChromeEffect = effect(() => {\n this.activeGroupId();\n this.deviceService.isLarge();\n untracked(() => this.recompute());\n });\n\n readonly #desktopDefaultGroupEffect = effect(() => {\n const isLarge = this.deviceService.isLarge();\n const groups = this.groups();\n const active = this.activeGroupId();\n const loading = this.isLoading();\n if (!isLarge || active || !groups.length || loading) {\n return;\n }\n\n untracked(() => {\n void this.navigateToDefaultGroup(groups, { replaceUrl: true });\n });\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n await this.loadPage();\n this.bindProfileIdentityUpdates();\n\n this.activatedRoute.paramMap.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n void this.syncGroupFromRoute();\n });\n }\n\n //#endregion\n\n //#region ----- Page Metadata -----\n\n protected override getPageTitle(): AXPMultiLanguageString {\n if (!this.isMobileGroupView()) {\n return '';\n }\n\n return this.activeGroup()?.title ?? '';\n }\n\n protected override getPageDescription(): null {\n return null;\n }\n\n protected override getPageIcon(): string | null {\n if (!this.isMobileGroupView()) {\n return null;\n }\n\n return this.activeGroup()?.icon ?? null;\n }\n\n protected override getBackButton(): AXPBackButton | null {\n if (!this.isMobileGroupView()) {\n return null;\n }\n\n return { title: '@auth:profile-page.page.title' };\n }\n\n override async onBackButtonClick(): Promise<void> {\n const appName = this.sessionService.application?.name;\n if (!appName) {\n return;\n }\n\n await this.router.navigate([appName, 'profile']);\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected handleSelectGroup(group: AXPUserProfileGroup): void {\n this.activeGroupId.set(group.id);\n\n const appName = this.sessionService.application?.name;\n if (!appName) {\n return;\n }\n\n void this.router.navigate([appName, 'profile', this.registry.resolveGroupRoute(group)]);\n }\n\n protected handleGroupTabChanged(event: AXTabStripChangedEvent): void {\n const group =\n this.groups().find((item) => item.id === event.tab?.key) ?? this.groups()[event.index];\n if (!group || group.id === this.activeGroupId()) {\n return;\n }\n\n this.handleSelectGroup(group);\n }\n\n protected handleEditAvatar(): void {\n void this.executeCommand({\n name: AXMAuthCommandKeys.Profile.ChangePhoto,\n });\n }\n\n protected async handleActionClick(action: AXPActionMenuItem): Promise<void> {\n if (action.disabled || action.visible === false || !action.command) {\n return;\n }\n\n const result = await this.executeCommand(action.command);\n\n if (result?.success && this.isPinRelatedAction(action)) {\n await this.reloadSections();\n }\n\n if (result?.success && this.applyProfileSectionInsightsPatch(result)) {\n // Password card updated from save payload — skip User/sessions reload.\n } else if (result?.success && this.shouldReloadSecuritySections(action.command.name)) {\n await this.reloadSections();\n }\n\n if (result?.success && this.applyHealthProfileSectionPatch(result)) {\n // Medical Summary updated from save payload — skip full section reload (User/sessions/Employee).\n } else if (result?.success && this.shouldReloadHealthSections(action.command.name)) {\n await this.reloadSections();\n }\n\n if (\n result?.success &&\n action.command?.name.startsWith('HumanCapitalManagement.Profile:')\n ) {\n await this.reloadProfileHeader();\n }\n }\n\n protected visibleSectionActions(actions: AXPActionMenuItem[]) {\n return visibleUserProfileSectionActions(actions);\n }\n\n protected defaultSectionAction(actions: AXPActionMenuItem[]) {\n return resolveDefaultUserProfileSectionAction(actions);\n }\n\n protected resolveSectionContent(section: AXPUserProfileSection) {\n return resolveUserProfileSectionContent(section);\n }\n\n protected isGroupVisited(groupId: string): boolean {\n return this.visitedGroupIds().has(groupId);\n }\n\n protected isGroupPanelActive(groupId: string): boolean {\n return this.activeGroupId() === groupId;\n }\n\n protected activeGroup(): AXPUserProfileGroup | undefined {\n const groupId = this.activeGroupId();\n if (!groupId) {\n return undefined;\n }\n\n return this.groups().find((group) => group.id === groupId);\n }\n\n protected isGroupSectionsPending(group: AXPUserProfileGroup): boolean {\n return !this.groupComponentContent(group) && !this.loadedSectionGroupIds().has(group.id);\n }\n\n protected sectionsForGroup(groupId: string): AXPUserProfileSection[] {\n return this.registry.filterSectionsByGroup(this.sections(), groupId);\n }\n\n protected groupComponentContent(group: AXPUserProfileGroup): AXPUserProfileGroupComponentContent | undefined {\n if (group.content?.mode === 'component') {\n return group.content;\n }\n return undefined;\n }\n\n protected sectionLayoutVars(layout?: AXPUserProfileSectionLayout): Record<string, string | number> {\n return {\n '--section-col-span': layout?.colSpan ?? 6,\n '--section-row-span': layout?.rowSpan ?? 1,\n '--section-col-start': layout?.col ?? 'auto',\n };\n }\n\n protected hasSectionColStart(layout?: AXPUserProfileSectionLayout): boolean {\n return layout?.col != null;\n }\n\n protected hasDisplayableInsights(section: AXPUserProfileSection): boolean {\n return this.displayableInsights(section).length > 0;\n }\n\n protected displayableInsights(section: AXPUserProfileSection): AXPUserProfileSectionInsight[] {\n return (section.insights ?? []).filter((insight) => this.isDisplayableInsight(insight));\n }\n\n protected resolveInsightDate(insight: AXPUserProfileSectionInsight): Date | null {\n if (!insight.date) {\n return null;\n }\n\n return Number.isNaN(insight.date.getTime()) ? null : insight.date;\n }\n\n //#endregion\n\n //#region ---- Private Methods ----\n\n private isDisplayableInsight(insight: AXPUserProfileSectionInsight): boolean {\n if (insight.text?.trim()) {\n return true;\n }\n\n return this.resolveInsightDate(insight) !== null;\n }\n\n private async loadPage(): Promise<void> {\n this.isLoading.set(true);\n try {\n const [groups, header] = await Promise.all([\n this.registry.loadGroups(),\n this.headerService.load(),\n ]);\n\n this.groups.set(groups);\n this.header.set(header);\n await this.syncGroupFromRoute();\n const groupId = this.activeGroupId();\n if (groupId) {\n await this.ensureGroupContent(groupId);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n private async syncGroupFromRoute(): Promise<void> {\n const groups = this.groups();\n if (!groups.length) {\n this.activeGroupId.set(null);\n return;\n }\n\n const routeSegment = this.activatedRoute.snapshot.paramMap.get('groupId');\n const appName = this.sessionService.application?.name;\n\n if (!routeSegment) {\n if (this.deviceService.isLarge()) {\n await this.navigateToDefaultGroup(groups, { replaceUrl: true });\n } else {\n this.activeGroupId.set(null);\n }\n return;\n }\n\n const matchedGroup = this.registry.resolveGroupByRoute(groups, routeSegment);\n if (!matchedGroup) {\n if (this.deviceService.isLarge()) {\n await this.navigateToDefaultGroup(groups, { replaceUrl: true });\n } else if (appName) {\n await this.router.navigate([appName, 'profile'], { replaceUrl: true });\n } else {\n this.activeGroupId.set(null);\n }\n return;\n }\n\n const canonicalRoute = this.registry.resolveGroupRoute(matchedGroup);\n if (appName && routeSegment.toLowerCase() !== canonicalRoute.toLowerCase()) {\n await this.router.navigate([appName, 'profile', canonicalRoute], { replaceUrl: true });\n return;\n }\n\n this.activeGroupId.set(matchedGroup.id);\n }\n\n private async navigateToDefaultGroup(\n groups: AXPUserProfileGroup[],\n extras?: { replaceUrl?: boolean },\n ): Promise<void> {\n const defaultGroup = this.registry.resolveDefaultGroup(groups);\n if (!defaultGroup) {\n this.activeGroupId.set(null);\n return;\n }\n\n const appName = this.sessionService.application?.name;\n if (appName) {\n await this.router.navigate([appName, 'profile', this.registry.resolveGroupRoute(defaultGroup)], extras);\n return;\n }\n\n this.activeGroupId.set(defaultGroup.id);\n }\n\n private async reloadSections(): Promise<void> {\n const groupId = this.activeGroupId();\n if (!groupId) {\n return;\n }\n\n const loaded = await this.registry.loadSections(groupId);\n this.sections.set(this.registry.replaceGroupSections(this.sections(), loaded, groupId));\n }\n\n private async ensureGroupContent(groupId: string): Promise<void> {\n this.markGroupVisited(groupId);\n\n const inflight = this.sectionLoadInflight.get(groupId);\n if (inflight) {\n await inflight;\n return;\n }\n\n if (this.loadedSectionGroupIds().has(groupId)) {\n return;\n }\n\n const load = this.loadGroupSections(groupId).finally(() => {\n this.sectionLoadInflight.delete(groupId);\n });\n this.sectionLoadInflight.set(groupId, load);\n await load;\n }\n\n private async loadGroupSections(groupId: string): Promise<void> {\n const loaded = await this.registry.loadSections(groupId);\n this.sections.set(this.registry.replaceGroupSections(this.sections(), loaded, groupId));\n\n const next = new Set(this.loadedSectionGroupIds());\n next.add(groupId);\n this.loadedSectionGroupIds.set(next);\n }\n\n private markGroupVisited(groupId: string): void {\n const visited = this.visitedGroupIds();\n if (visited.has(groupId)) {\n return;\n }\n\n const next = new Set(visited);\n next.add(groupId);\n this.visitedGroupIds.set(next);\n }\n\n private bindProfileIdentityUpdates(): void {\n this.sessionService.user$\n .pipe(\n filter((user) => !!user?.id),\n distinctUntilChanged(\n (previous, current) =>\n previous?.title === current?.title &&\n previous?.name === current?.name,\n ),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n void this.reloadProfileHeader();\n });\n }\n\n private async reloadProfileHeader(): Promise<void> {\n const header = await this.headerService.load();\n this.header.set(header);\n }\n\n private shouldReloadSecuritySections(commandName: string): boolean {\n return (\n commandName === AXMAuthCommandKeys.Session.OpenSessions ||\n commandName === AXMAuthCommandKeys.Profile.EditAccountInfo ||\n commandName === AXMAuthCommandKeys.Security.ManageTwoFactor\n );\n }\n\n private shouldReloadHealthSections(commandName: string): boolean {\n // Only the health-profile editor changes Medical Summary insights; list popups must not reload on close.\n return commandName === 'HealthCore.Profile:EditMyHealthProfile';\n }\n\n private applyProfileSectionInsightsPatch(result: AXPRuntimeCommandResult): boolean {\n const patch = result.metadata?.[PROFILE_SECTION_INSIGHTS_PATCH_METADATA_KEY] as\n | AXPUserProfileSectionInsightsPatch\n | undefined;\n\n if (!patch?.sectionId) {\n return false;\n }\n\n const sections = this.sections();\n const index = sections.findIndex((section) => section.id === patch.sectionId);\n if (index < 0) {\n return false;\n }\n\n const insights = patch.insights ?? [];\n const nextSections = [...sections];\n nextSections[index] = {\n ...sections[index],\n insights: insights.length ? insights : undefined,\n };\n this.sections.set(nextSections);\n return true;\n }\n\n private applyHealthProfileSectionPatch(result: AXPRuntimeCommandResult): boolean {\n const patch = result.metadata?.['healthProfileSectionPatch'] as\n | {\n sectionId?: string;\n insights?: AXPUserProfileSectionInsight[];\n existingProfileId?: string | null;\n }\n | undefined;\n\n if (!patch?.sectionId) {\n return false;\n }\n\n const sections = this.sections();\n const index = sections.findIndex((section) => section.id === patch.sectionId);\n if (index < 0) {\n return false;\n }\n\n const section = sections[index];\n const insights = patch.insights ?? [];\n const nextSection: AXPUserProfileSection = {\n ...section,\n insights: insights.length ? insights : undefined,\n actions: (section.actions ?? []).map((sectionAction) => {\n if (sectionAction.command?.name !== 'HealthCore.Profile:EditMyHealthProfile') {\n return sectionAction;\n }\n\n return {\n ...sectionAction,\n command: {\n ...sectionAction.command,\n options: {\n ...(sectionAction.command.options ?? {}),\n existingProfileId: patch.existingProfileId ?? null,\n },\n },\n };\n }),\n };\n\n const nextSections = [...sections];\n nextSections[index] = nextSection;\n this.sections.set(nextSections);\n return true;\n }\n\n private isPinRelatedAction(action: AXPActionMenuItem): boolean {\n const commandName = action.command?.name;\n\n return (\n commandName === AXMAuthCommandKeys.Security.SetPinCode ||\n commandName === AXMAuthCommandKeys.Security.RemovePinCode\n );\n }\n\n private async executeCommand(\n command: AXPExecuteCommand,\n ): Promise<AXPRuntimeCommandResult | void> {\n if (this.commandService.exists(command.name)) {\n const result = await this.commandService.execute(command.name, command.options ?? {});\n return result ?? undefined;\n }\n }\n\n //#endregion\n}\n","<axp-page-layout *translate=\"let t\">\n <axp-page-content>\n @if (isLoading()) {\n <!-- ----- Profile page skeleton ----- -->\n <div class=\"__shell\" aria-hidden=\"true\">\n <section class=\"__hero-card\">\n <div class=\"__hero-header\">\n <div class=\"__hero-cover\">\n <span class=\"__hero-wave __hero-wave--primary\"></span>\n <span class=\"__hero-wave __hero-wave--soft\"></span>\n <span class=\"__hero-wave __hero-wave--light\"></span>\n </div>\n <div class=\"__hero-content\">\n <div class=\"__hero-avatar\">\n <ax-skeleton class=\"size-24 rounded-full\" [animated]=\"true\"></ax-skeleton>\n </div>\n <div class=\"__hero-details\">\n <ax-skeleton class=\"h-7 w-48 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"mt-2 h-4 w-32 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </div>\n <!--------------------------------------------------------------->\n @if (!isCompactNav()) {\n <!-- ----- Desktop tab skeletons ----- -->\n <div class=\"__tabs __tabs-skeleton\">\n @for (item of pageTabSkeletonPlaceholders; track item) {\n <ax-skeleton class=\"h-4 w-20 rounded-md\" [animated]=\"true\"></ax-skeleton>\n }\n </div>\n }\n </section>\n <!--------------------------------------------------------------->\n @if (isCompactNav()) {\n <!-- ----- Compact group-list skeletons ----- -->\n <div class=\"__group-nav\">\n @for (item of pageListSkeletonPlaceholders; track item) {\n <div class=\"__group-nav-skeleton-row\">\n <ax-skeleton class=\"size-5 shrink-0 rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"h-4 min-w-0 flex-1 rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"size-4 shrink-0 rounded-md\" [animated]=\"true\"></ax-skeleton>\n </div>\n }\n </div>\n }\n <!-- ----- Desktop section-card skeletons ----- -->\n @else {\n <ng-container *ngTemplateOutlet=\"sectionCardsSkeleton\"></ng-container>\n }\n </div>\n } @else if (header(); as profileHeader) {\n <div class=\"__shell\">\n <!--->\n <!-- ----- Profile hero and desktop group tabs ----- -->\n @if (showHero()) {\n <section\n class=\"__hero-card\"\n [axpSticky]=\"'--stuck'\"\n stickyParent=\"#axp-page-layout\"\n [stickyOffset]=\"0\"\n >\n <div class=\"__hero-header\">\n <div class=\"__hero-cover\" aria-hidden=\"true\">\n <span class=\"__hero-wave __hero-wave--primary\" aria-hidden=\"true\"></span>\n <span class=\"__hero-wave __hero-wave--soft\" aria-hidden=\"true\"></span>\n <span class=\"__hero-wave __hero-wave--light\" aria-hidden=\"true\"></span>\n </div>\n\n <div class=\"__hero-content\">\n <div class=\"__hero-avatar\">\n <axp-user-avatar [size]=\"96\" [userId]=\"profileHeader.avatarUserId\"></axp-user-avatar>\n <button type=\"button\" class=\"__avatar-edit\"\n [attr.aria-label]=\"('@auth:profile-page.avatar.edit' | translate | async) ?? ''\"\n (click)=\"handleEditAvatar()\">\n <ax-icon icon=\"fa-light fa-camera\"></ax-icon>\n </button>\n </div>\n\n <div class=\"__hero-details\">\n <h2 class=\"__hero-name\">{{ profileHeader.displayName }}</h2>\n\n @if (profileHeader.username || profileHeader.joinedAt) {\n <p class=\"__hero-subtitle\">\n @if (profileHeader.username) {\n <span class=\"__hero-subtitle-item\">\n <ax-icon icon=\"fa-light fa-user\"></ax-icon>\n <span>{{ profileHeader.username }}</span>\n </span>\n }\n @if (profileHeader.username && profileHeader.joinedAt) {\n <span class=\"__hero-subtitle-separator\" aria-hidden=\"true\">·</span>\n }\n @if (profileHeader.joinedAt) {\n <span class=\"__hero-subtitle-item\">\n <ax-icon icon=\"fa-light fa-calendar\"></ax-icon>\n <span>\n {{ '@auth:profile-page.header.meta.member-since' | translate | async }}\n {{ profileHeader.joinedAt | format: 'date' : { format: 'long' } | async }}\n </span>\n </span>\n }\n </p>\n }\n\n @if (profileHeader.meta.length) {\n <ul class=\"__hero-meta\">\n @for (item of profileHeader.meta; track item.id) {\n <li class=\"__hero-meta-item\">\n @if (item.icon) {\n <ax-icon [icon]=\"item.icon\"></ax-icon>\n }\n <span class=\"__hero-meta-label\">{{ item.label | translate | async }}</span>\n <span class=\"__hero-meta-value\">{{ item.value }}</span>\n </li>\n }\n </ul>\n }\n </div>\n </div>\n </div>\n\n <!--->\n <!-- ----- Desktop group tabs ----- -->\n @if (showTabs()) {\n <ax-tabs class=\"__tabs\" [look]=\"'with-line'\" [location]=\"'bottom'\" [fitParent]=\"false\"\n (onActiveTabChanged)=\"handleGroupTabChanged($event)\">\n @for (group of groups(); track group.id) {\n <ax-tab-item [key]=\"group.id\" [text]=\"(group.title | translate | async)!\"\n [active]=\"activeGroupId() === group.id\">\n @if (group.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"group.icon\"></ax-icon>\n </ax-prefix>\n }\n </ax-tab-item>\n }\n </ax-tabs>\n }\n </section>\n }\n\n <!--->\n <!-- ----- Profile area list on compact screens ----- -->\n @if (showGroupList()) {\n <axp-layout-list class=\"__group-nav\">\n @for (group of groups(); track group.id) {\n <axp-layout-list-item (click)=\"handleSelectGroup(group)\">\n <!--->\n <!-- ----- Group icon ----- -->\n @if (group.icon) {\n <axp-layout-prefix>\n <ax-icon [icon]=\"group.icon\" class=\"text-gray-500\"></ax-icon>\n </axp-layout-prefix>\n }\n <axp-layout-content>\n <a class=\"font-semibold\">{{ group.title | translate | async }}</a>\n </axp-layout-content>\n <axp-layout-suffix>\n <ax-icon icon=\"far fa-chevron-right rtl:rotate-180\" class=\"text-gray-400\"></ax-icon>\n </axp-layout-suffix>\n </axp-layout-list-item>\n }\n </axp-layout-list>\n }\n\n <ng-template #sectionCopyBody let-section=\"section\">\n @if (section.title) {\n <h3 class=\"__section-title\">{{ section.title | translate | async }}</h3>\n }\n\n @if (hasDisplayableInsights(section)) {\n <ul class=\"__section-insights\">\n @for (insight of displayableInsights(section); track insight.id) {\n <li\n class=\"__section-insight\"\n [axTooltip]=\"insight.title ? ((insight.title | translate | async) ?? '') : ''\"\n [axTooltipDisabled]=\"!insight.title\"\n axTooltipPlacement=\"top\"\n >\n <span class=\"__section-insight-icon-wrap\" aria-hidden=\"true\">\n @if (insight.icon) {\n <ax-icon [icon]=\"insight.icon\"></ax-icon>\n }\n </span>\n <span class=\"__section-insight-text\">\n @if (resolveInsightDate(insight); as insightDate) {\n @if (insight.datePrefix) {\n <span>{{ insight.datePrefix | translate | async }} · </span>\n }\n <span>{{ insightDate | format: 'timeleft' | async }}</span>\n } @else if (insight.text) {\n {{ insight.text | translate | async }}\n }\n </span>\n </li>\n }\n </ul>\n } @else if (section.description) {\n <p class=\"__section-description\">{{ section.description | translate | async }}</p>\n }\n </ng-template>\n\n <!--->\n <!-- ----- Lazy group panels: created on first visit, then shown or hidden ----- -->\n @if (showGroupContent()) {\n @for (group of groups(); track group.id) {\n @if (isGroupVisited(group.id)) {\n <div\n class=\"__group-panel\"\n [class.--inactive]=\"!isGroupPanelActive(group.id)\"\n [attr.aria-hidden]=\"!isGroupPanelActive(group.id)\"\n [attr.inert]=\"isGroupPanelActive(group.id) ? null : ''\"\n >\n @if (isGroupSectionsPending(group)) {\n <!-- ----- Section cards skeleton while group content loads ----- -->\n <ng-container *ngTemplateOutlet=\"sectionCardsSkeleton\"></ng-container>\n } @else if (groupComponentContent(group); as componentContent) {\n <!-- ----- Full-tab page component ----- -->\n <div class=\"__group-content\">\n <div axp-page-component-renderer [componentKey]=\"componentContent.componentKey\"\n [pageConfig]=\"componentContent.pageConfig ?? {}\"></div>\n </div>\n } @else {\n <!-- ----- Section cards for groups that do not replace the tab body ----- -->\n <div class=\"__sections\">\n @for (section of sectionsForGroup(group.id); track section.id) {\n @let sectionContent = resolveSectionContent(section);\n <div class=\"__section-slot\" [class.--has-col-start]=\"hasSectionColStart(section.layout)\"\n [style]=\"sectionLayoutVars(section.layout)\">\n @if (sectionContent.mode === 'component') {\n <div axp-page-component-renderer [componentKey]=\"sectionContent.componentKey\"\n [pageConfig]=\"sectionContent.pageConfig ?? {}\"></div>\n } @else {\n @let visibleActions = visibleSectionActions(sectionContent.actions);\n @let defaultAction = defaultSectionAction(sectionContent.actions);\n <article class=\"__section-card\">\n @if (defaultAction) {\n <div\n class=\"__section-card-action\"\n [class.__section-card-action--with-menu]=\"visibleActions.length > 1\"\n >\n <button\n type=\"button\"\n class=\"__section-card-hit\"\n [disabled]=\"defaultAction.disabled === true\"\n (click)=\"handleActionClick(defaultAction)\"\n >\n @if (section.icon) {\n <div class=\"__section-icon\">\n <ax-icon [icon]=\"section.icon\"></ax-icon>\n </div>\n }\n <div class=\"__section-copy\">\n <ng-container *ngTemplateOutlet=\"sectionCopyBody; context: { section: section }\"></ng-container>\n </div>\n </button>\n\n @if (visibleActions.length > 1) {\n <div class=\"__section-more-actions-wrap\" (click)=\"$event.stopPropagation()\">\n <ax-button\n class=\"__section-more-actions\"\n look=\"blank\"\n color=\"default\"\n [attr.aria-label]=\"('@auth:profile-page.page.sections.actions' | translate | async) ?? ''\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-ellipsis-vertical\"></ax-icon>\n </ax-prefix>\n <ax-dropdown-panel>\n <ax-button-item-list>\n @for (action of visibleActions; track action.name ?? action.title) {\n <ax-button-item\n [text]=\"(action.title | translate | async)!\"\n [color]=\"action.color\"\n [disabled]=\"action.disabled === true\"\n (onClick)=\"handleActionClick(action)\"\n >\n @if (action.icon) {\n <ax-prefix>\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n </ax-prefix>\n }\n </ax-button-item>\n }\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-button>\n </div>\n }\n </div>\n } @else {\n <div class=\"__section-card-action __section-card-action--static\">\n @if (section.icon) {\n <div class=\"__section-icon\">\n <ax-icon [icon]=\"section.icon\"></ax-icon>\n </div>\n }\n <div class=\"__section-copy\">\n <ng-container *ngTemplateOutlet=\"sectionCopyBody; context: { section: section }\"></ng-container>\n </div>\n </div>\n }\n </article>\n }\n </div>\n } @empty {\n <p class=\"__sections-empty\">{{ '@auth:profile-page.page.sections.empty' | translate | async }}</p>\n }\n </div>\n }\n </div>\n }\n }\n }\n </div>\n }\n <ng-template #sectionCardsSkeleton>\n <div class=\"__sections\">\n @for (item of sectionSkeletonPlaceholders; track item) {\n <div class=\"__section-slot\">\n <article class=\"__section-card\">\n <div class=\"__section-card-action __section-card-action--static\">\n <ax-skeleton class=\"size-14 shrink-0 rounded-xl\" [animated]=\"true\"></ax-skeleton>\n <div class=\"__section-copy flex flex-col gap-2\">\n <ax-skeleton class=\"h-4 w-40 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n <ax-skeleton class=\"h-3 w-56 max-w-full rounded-md\" [animated]=\"true\"></ax-skeleton>\n </div>\n </div>\n </article>\n </div>\n }\n </div>\n </ng-template>\n </axp-page-content>\n</axp-page-layout>"],"names":["i1","i2","i5","i7"],"mappings":"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"}
@@ -23,7 +23,7 @@ import * as i0 from '@angular/core';
23
23
  import { inject, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
24
24
  import { RouterModule, Router } from '@angular/router';
25
25
  import { BehaviorSubject, firstValueFrom } from 'rxjs';
26
- import { x as AXMAuthPlatformSettingsService, G as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-CWE43xt1.mjs';
26
+ import { x as AXMAuthPlatformSettingsService, G as AXMAuthenticationTypes } from './acorex-platform-module-auth-client-acorex-platform-module-auth-client-SkJb5De_.mjs';
27
27
 
28
28
  const MODULES = [
29
29
  CommonModule,
@@ -144,4 +144,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
144
144
  }] } });
145
145
 
146
146
  export { AXPRegisterPasswordComponent };
147
- //# sourceMappingURL=acorex-platform-module-auth-client-register-password.component-Cu_R4Y5F.mjs.map
147
+ //# sourceMappingURL=acorex-platform-module-auth-client-register-password.component-DngD3wb3.mjs.map