@memberjunction/ng-dashboards 6.2.0-edge.2 → 6.2.0-edge.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +4 -3
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +8 -5
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
- package/dist/AI/components/duplicates/compare-value.component.d.ts +67 -0
- package/dist/AI/components/duplicates/compare-value.component.d.ts.map +1 -0
- package/dist/AI/components/duplicates/compare-value.component.js +168 -0
- package/dist/AI/components/duplicates/compare-value.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +49 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +287 -169
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +77 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +116 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +16 -4
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +2 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +12 -6
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-index-auto.d.ts +29 -0
- package/dist/AI/components/vectors/vector-index-auto.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-index-auto.js +59 -0
- package/dist/AI/components/vectors/vector-index-auto.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +9 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +65 -20
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +7 -3
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +3 -2
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +0 -3
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +5 -14
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts +12 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/form-override-dialog.component.js +128 -81
- package/dist/ComponentStudio/components/form-override-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +12 -10
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts +14 -43
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js +6 -29
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +174 -321
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +522 -1195
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts +116 -0
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js +277 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts +26 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js +32 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts +58 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js +391 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts +37 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js +68 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts +295 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.js +1022 -0
- package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts +23 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.js +3 -0
- package/dist/DashboardEditor/dashboard-editor.types.js.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts +11 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js +17 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js.map +1 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +30 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +349 -232
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +2 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +0 -14
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +7 -29
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Home/home-agent-context.d.ts +29 -10
- package/dist/Home/home-agent-context.d.ts.map +1 -1
- package/dist/Home/home-agent-context.js +50 -24
- package/dist/Home/home-agent-context.js.map +1 -1
- package/dist/Home/home-dashboard-switcher.component.d.ts +95 -0
- package/dist/Home/home-dashboard-switcher.component.d.ts.map +1 -0
- package/dist/Home/home-dashboard-switcher.component.js +442 -0
- package/dist/Home/home-dashboard-switcher.component.js.map +1 -0
- package/dist/Home/home-dashboard.component.d.ts +330 -17
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +1702 -1014
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Home/home-menus.d.ts +38 -0
- package/dist/Home/home-menus.d.ts.map +1 -0
- package/dist/Home/home-menus.js +53 -0
- package/dist/Home/home-menus.js.map +1 -0
- package/dist/Home/home-pinned-dashboards.d.ts +33 -0
- package/dist/Home/home-pinned-dashboards.d.ts.map +1 -0
- package/dist/Home/home-pinned-dashboards.js +76 -0
- package/dist/Home/home-pinned-dashboards.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-production.component.d.ts +5 -1
- package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-production.component.js +64 -41
- package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +3 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js +2 -2
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js.map +1 -1
- package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts +107 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.d.ts.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.js +216 -0
- package/dist/TelephonyOperations/telephony-operations-agent-context.js.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +58 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +812 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -0
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +7 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/WorkQueue/components/work-queue-bindings.component.d.ts +37 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.js +210 -0
- package/dist/WorkQueue/components/work-queue-bindings.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts +70 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.js +496 -0
- package/dist/WorkQueue/components/work-queue-dead-letters.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts +22 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.js +99 -0
- package/dist/WorkQueue/components/work-queue-discard-dialog.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-overview.component.d.ts +29 -0
- package/dist/WorkQueue/components/work-queue-overview.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-overview.component.js +278 -0
- package/dist/WorkQueue/components/work-queue-overview.component.js.map +1 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.d.ts +59 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.d.ts.map +1 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.js +359 -0
- package/dist/WorkQueue/components/work-queue-partitions.component.js.map +1 -0
- package/dist/WorkQueue/services/work-queue-operator.service.d.ts +22 -0
- package/dist/WorkQueue/services/work-queue-operator.service.d.ts.map +1 -0
- package/dist/WorkQueue/services/work-queue-operator.service.js +44 -0
- package/dist/WorkQueue/services/work-queue-operator.service.js.map +1 -0
- package/dist/WorkQueue/work-queue-agent-context.d.ts +67 -0
- package/dist/WorkQueue/work-queue-agent-context.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-agent-context.js +119 -0
- package/dist/WorkQueue/work-queue-agent-context.js.map +1 -0
- package/dist/WorkQueue/work-queue-dashboard.component.d.ts +94 -0
- package/dist/WorkQueue/work-queue-dashboard.component.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-dashboard.component.js +545 -0
- package/dist/WorkQueue/work-queue-dashboard.component.js.map +1 -0
- package/dist/WorkQueue/work-queue-types.d.ts +40 -0
- package/dist/WorkQueue/work-queue-types.d.ts.map +1 -0
- package/dist/WorkQueue/work-queue-types.js +2 -0
- package/dist/WorkQueue/work-queue-types.js.map +1 -0
- package/dist/ai-dashboards.module.d.ts +21 -20
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +69 -61
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +29 -2
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +1 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +3 -1
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/module.d.ts +14 -13
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +7 -0
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +6 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +9 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/dashboard-library-changes.d.ts +23 -0
- package/dist/shared/dashboard-library-changes.d.ts.map +1 -0
- package/dist/shared/dashboard-library-changes.js +26 -0
- package/dist/shared/dashboard-library-changes.js.map +1 -0
- package/dist/shared/dashboard-owner-names.d.ts +17 -0
- package/dist/shared/dashboard-owner-names.d.ts.map +1 -0
- package/dist/shared/dashboard-owner-names.js +65 -0
- package/dist/shared/dashboard-owner-names.js.map +1 -0
- package/dist/shared/dashboard-recents.d.ts +34 -0
- package/dist/shared/dashboard-recents.d.ts.map +1 -0
- package/dist/shared/dashboard-recents.js +87 -0
- package/dist/shared/dashboard-recents.js.map +1 -0
- package/dist/shared/dashboards-app-install.d.ts +59 -0
- package/dist/shared/dashboards-app-install.d.ts.map +1 -0
- package/dist/shared/dashboards-app-install.js +97 -0
- package/dist/shared/dashboards-app-install.js.map +1 -0
- package/dist/shared/dashboards-app.helpers.d.ts +42 -0
- package/dist/shared/dashboards-app.helpers.d.ts.map +1 -0
- package/dist/shared/dashboards-app.helpers.js +143 -0
- package/dist/shared/dashboards-app.helpers.js.map +1 -0
- package/dist/work-queue-dashboards.module.d.ts +23 -0
- package/dist/work-queue-dashboards.module.d.ts.map +1 -0
- package/dist/work-queue-dashboards.module.js +92 -0
- package/dist/work-queue-dashboards.module.js.map +1 -0
- package/package.json +73 -66
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home-dashboard.component.js","sourceRoot":"","sources":["../../src/Home/home-dashboard.component.ts","../../src/Home/home-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseResourceComponent, NavigationService, RecentAccessService, RecentAccessItem, HomeAppPinService, HomeAppPinnedItem, HomeAppPinInput, ActionPinConfiguration } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, CompositeKey, EntityRecordNameInput, RunView, PermissionConstrainedError } from '@memberjunction/core';\nimport { ResourceData, MJUserFavoriteEntity, MJUserNotificationEntity, UserInfoEngine, DashboardEngine, UserViewEngine, QueryEngine } from '@memberjunction/core-entities';\nimport { ActionEngineBase } from '@memberjunction/actions-base';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { UserAppConfigComponent } from '@memberjunction/ng-explorer-settings';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ActionPinConfigResult } from './action-pin-config-dialog.component';\nimport { ActionPinRunResult } from './action-pin-runner-dialog.component';\nimport { BuildHomeAgentContext, BuildHomeNotFoundError, ResolveNamedRecord, NamedRecord, RecentItemSummary } from './home-agent-context';\nimport { AgentToolResult, ValidateStringParam } from '../shared/agent-tool-validation';\n\n/**\n * Cached app data with pre-computed values for optimal rendering performance\n */\ninterface AppDisplayData {\n app: BaseApplication;\n color: string;\n icon: string;\n navItemsCount: number;\n navItemsPreview: { Label: string; Icon: string }[];\n showMoreItems: boolean;\n moreItemsCount: number;\n}\n\n/**\n * Home Dashboard - Personalized home screen showing all available applications\n * with quick access navigation and configuration options.\n *\n * Uses OnPush change detection and cached computed values for optimal performance.\n * Registered as a BaseResourceComponent so it can be used as a Custom resource type\n * in nav items, allowing users to return to the Home dashboard after viewing orphan resources.\n */\n@Component({\n standalone: false,\n selector: 'mj-home-dashboard',\n templateUrl: './home-dashboard.component.html',\n styleUrls: ['./home-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseResourceComponent, 'HomeDashboard')\nexport class HomeDashboardComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private metadata = this.ProviderToUse;\n private pinService = inject(HomeAppPinService);\n\n @ViewChild('appConfigDialog') AppConfigDialog!: UserAppConfigComponent;\n\n /** @deprecated Use {@link AppConfigDialog}. */\n get appConfigDialog(): UserAppConfigComponent {\n return this.AppConfigDialog;\n }\n /** @deprecated Use {@link AppConfigDialog}. */\n set appConfigDialog(value: UserAppConfigComponent) {\n this.AppConfigDialog = value;\n }\n\n // State\n public isLoading = true;\n public Apps: BaseApplication[] = [];\n\n /** @deprecated Use {@link Apps}. */\n public get apps(): BaseApplication[] {\n return this.Apps;\n }\n /** @deprecated Use {@link Apps}. */\n public set apps(value: BaseApplication[]) {\n this.Apps = value;\n }\n public AppsDisplayData: AppDisplayData[] = [];\n\n /** @deprecated Use {@link AppsDisplayData}. */\n public get appsDisplayData(): AppDisplayData[] {\n return this.AppsDisplayData;\n }\n /** @deprecated Use {@link AppsDisplayData}. */\n public set appsDisplayData(value: AppDisplayData[]) {\n this.AppsDisplayData = value;\n } // Pre-computed display data\n public CurrentUser: { Name: string; Email: string } | null = null;\n\n /** @deprecated Use {@link CurrentUser}. */\n public get currentUser(): { Name: string; Email: string } | null {\n return this.CurrentUser;\n }\n /** @deprecated Use {@link CurrentUser}. */\n public set currentUser(value: { Name: string; Email: string } | null) {\n this.CurrentUser = value;\n }\n public ShowConfigDialog = false;\n\n /** @deprecated Use {@link ShowConfigDialog}. */\n public get showConfigDialog() {\n return this.ShowConfigDialog;\n }\n /** @deprecated Use {@link ShowConfigDialog}. */\n public set showConfigDialog(value) {\n this.ShowConfigDialog = value;\n }\n\n // Favorites\n public Favorites: MJUserFavoriteEntity[] = [];\n\n /** @deprecated Use {@link Favorites}. */\n public get favorites(): MJUserFavoriteEntity[] {\n return this.Favorites;\n }\n /** @deprecated Use {@link Favorites}. */\n public set favorites(value: MJUserFavoriteEntity[]) {\n this.Favorites = value;\n }\n public FavoritesLoading = true;\n\n /** @deprecated Use {@link FavoritesLoading}. */\n public get favoritesLoading() {\n return this.FavoritesLoading;\n }\n /** @deprecated Use {@link FavoritesLoading}. */\n public set favoritesLoading(value) {\n this.FavoritesLoading = value;\n }\n\n // Recents\n public RecentItems: RecentAccessItem[] = [];\n\n /** @deprecated Use {@link RecentItems}. */\n public get recentItems(): RecentAccessItem[] {\n return this.RecentItems;\n }\n /** @deprecated Use {@link RecentItems}. */\n public set recentItems(value: RecentAccessItem[]) {\n this.RecentItems = value;\n }\n public RecentsLoading = true;\n\n /** @deprecated Use {@link RecentsLoading}. */\n public get recentsLoading() {\n return this.RecentsLoading;\n }\n /** @deprecated Use {@link RecentsLoading}. */\n public set recentsLoading(value) {\n this.RecentsLoading = value;\n }\n\n // Notifications\n public UnreadNotifications: MJUserNotificationEntity[] = [];\n\n /** @deprecated Use {@link UnreadNotifications}. */\n public get unreadNotifications(): MJUserNotificationEntity[] {\n return this.UnreadNotifications;\n }\n /** @deprecated Use {@link UnreadNotifications}. */\n public set unreadNotifications(value: MJUserNotificationEntity[]) {\n this.UnreadNotifications = value;\n }\n public NotificationsLoading = true;\n\n /** @deprecated Use {@link NotificationsLoading}. */\n public get notificationsLoading() {\n return this.NotificationsLoading;\n }\n /** @deprecated Use {@link NotificationsLoading}. */\n public set notificationsLoading(value) {\n this.NotificationsLoading = value;\n }\n\n // Sidebar state - default closed on all screen sizes\n public SidebarOpen = false;\n\n /** @deprecated Use {@link SidebarOpen}. */\n public get sidebarOpen() {\n return this.SidebarOpen;\n }\n /** @deprecated Use {@link SidebarOpen}. */\n public set sidebarOpen(value) {\n this.SidebarOpen = value;\n }\n\n // Pin empty-state dismissal preference (persisted in UserSettings via UserInfoEngine)\n public HidePinEmptyState = false;\n\n // Pin state\n public PinnedItems: HomeAppPinnedItem[] = [];\n public UngroupedPins: HomeAppPinnedItem[] = [];\n public PinGroups: string[] = [];\n public EditMode = false;\n public AddPanelOpen = false;\n public AddPanelSearchQuery = '';\n public AddPanelSelectedGroup = '';\n public AddPanelNewGroupName = '';\n public EditingPinId: string | null = null;\n public EditingGroupName: string | null = null;\n\n // Add pin panel - available resources\n public AvailableDashboards: { id: string; name: string; pinned: boolean }[] = [];\n public AvailableViews: { id: string; name: string; entityName: string; pinned: boolean }[] = [];\n public AvailableQueries: { id: string; name: string; pinned: boolean }[] = [];\n public AvailableActions: { id: string; name: string; description: string; pinned: boolean }[] = [];\n public AvailableApps: { appId: string; appName: string; icon: string; color: string; navItems: { label: string; icon: string; pinned: boolean }[] }[] = [];\n public AddPanelLoading = false;\n\n // Action pin dialog state\n public ActionConfigDialogVisible = false;\n public ActionConfigActionId: string | null = null;\n public ActionConfigActionName: string | null = null;\n public ActionConfigActionDescription: string | null = null;\n\n public ActionRunnerDialogVisible = false;\n public ActionRunnerPin: HomeAppPinnedItem | null = null;\n\n // Collapsible section state for Add Pin panel\n public PanelSectionCollapsed: Record<string, boolean> = {};\n\n // Pin context menu (ellipsis)\n public PinMenuVisible = false;\n public PinMenuX = 0;\n public PinMenuY = 0;\n public PinMenuPin: HomeAppPinnedItem | null = null;\n\n // Whether Data Explorer app is available (if so, dashboards/queries/views are accessible via its nav items)\n public HasDataExplorerApp = false;\n\n // Drag state\n public DraggingPinId: string | null = null;\n public DragOverPinId: string | null = null;\n\n // Cached icon lookups to avoid repeated method calls\n private favoriteIconCache = new Map<string, string>();\n private resourceIconCache = new Map<string, string>();\n\n // Resolved display names for favorites (keyed by favorite ID)\n public FavoriteDisplayNames = new Map<string, string>();\n\n /** @deprecated Use {@link FavoriteDisplayNames}. */\n public get favoriteDisplayNames() {\n return this.FavoriteDisplayNames;\n }\n /** @deprecated Use {@link FavoriteDisplayNames}. */\n public set favoriteDisplayNames(value) {\n this.FavoriteDisplayNames = value;\n }\n\n /**\n * Check if sidebar has any content to show\n */\n get HasSidebarContent(): boolean {\n return this.UnreadNotifications.length > 0 ||\n this.Favorites.length > 0 ||\n this.RecentItems.length > 0 ||\n this.FavoritesLoading ||\n this.RecentsLoading;\n }\n\n /** @deprecated Use {@link HasSidebarContent}. */\n get hasSidebarContent(): boolean {\n return this.HasSidebarContent;\n }\n\n /**\n * Toggle sidebar visibility\n */\n ToggleSidebar(): void {\n this.SidebarOpen = !this.SidebarOpen;\n }\n\n /** @deprecated Use {@link ToggleSidebar}. */\n toggleSidebar(): void {\n return this.ToggleSidebar();\n }\n\n /**\n * Check if current device is mobile (width <= 768px)\n */\n private isMobileDevice(): boolean {\n return typeof window !== 'undefined' && window.innerWidth <= 768;\n }\n\n constructor(\n private appManager: ApplicationManager,\n private recentAccessService: RecentAccessService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Home';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return '';\n }\n\n async ngAfterViewInit(): Promise<void> {\n // Get current user info\n this.CurrentUser = {\n Name: this.metadata.CurrentUser?.Name || 'User',\n Email: this.metadata.CurrentUser?.Email || ''\n };\n\n // Subscribe to loading state from ApplicationManager\n this.appManager.Loading\n .pipe(takeUntil(this.destroy$))\n .subscribe(loading => {\n // Only update isLoading if manager is actively loading\n // (we start with isLoading=true and only set to false when we have apps)\n if (loading) {\n this.isLoading = true;\n this.cdr.markForCheck();\n }\n });\n\n // Subscribe to applications list, filtering out the Home app\n this.appManager.Applications\n .pipe(takeUntil(this.destroy$))\n .subscribe(async apps => {\n // Exclude the Home app from the list (users are already on Home)\n this.Apps = apps.filter(app => app.Name !== 'Home');\n\n // Pre-compute display data for all apps\n await this.computeAppsDisplayData();\n\n this.isLoading = false;\n this.NotifyLoadComplete();\n\n // Apps changed → keep the agent's view of the launcher in sync.\n this.publishAgentContext();\n\n this.cdr.markForCheck();\n });\n\n // Subscribe to unread notifications\n MJNotificationService.Notifications$\n .pipe(takeUntil(this.destroy$))\n .subscribe(notifications => {\n this.UnreadNotifications = notifications.filter(n => n.Unread).slice(0, 5);\n this.NotificationsLoading = false;\n this.publishAgentContext();\n this.cdr.markForCheck();\n });\n\n // Subscribe to recent items\n this.recentAccessService.RecentItems\n .pipe(takeUntil(this.destroy$))\n .subscribe(items => {\n this.RecentItems = this.deduplicateRecents(items).slice(0, 5);\n this.RecentsLoading = false;\n this.publishAgentContext();\n this.cdr.markForCheck();\n });\n\n // Favorites and recents load asynchronously in the sidebar\n this.NotifyLoadComplete();\n\n // Load favorites and recents asynchronously (don't block rendering)\n this.loadFavorites();\n this.loadRecents();\n\n // Load pin empty-state dismissal preference\n const hideSetting = UserInfoEngine.Instance.GetSetting('HomeApp.HidePinEmptyState');\n this.HidePinEmptyState = hideSetting === 'true';\n\n // Load pinned items\n await this.pinService.LoadPins();\n this.pinService.Pins$\n .pipe(takeUntil(this.destroy$))\n .subscribe(pins => {\n this.PinnedItems = pins;\n this.UngroupedPins = this.pinService.GetUngroupedPins();\n this.PinGroups = this.pinService.GetGroups();\n this.publishAgentContext();\n this.cdr.markForCheck();\n });\n\n // Resolve display names for record-type pins that have raw ID titles\n this.resolveRecordPinNames();\n\n // Resolve missing icons for Custom pins\n this.resolveCustomPinIcons();\n\n // Pre-warm engines used by the Add Pin panel so the first click feels instant.\n // DashboardEngine and QueryEngine already auto-start; UserViewEngine and ActionEngineBase\n // don't, so kick them off in the background (fire-and-forget — Config(false) is idempotent\n // and they cache their results, so a subsequent OpenAddPinPanel() call will be a no-op).\n UserViewEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse)\n .catch(err => console.warn('[Home] UserViewEngine pre-warm failed', err));\n ActionEngineBase.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse)\n .catch(err => console.warn('[Home] ActionEngineBase pre-warm failed', err));\n\n // Publish the initial agent context and register the client tools the AI agent\n // can invoke against the Home surface. Ongoing re-emits happen in the subscriptions\n // above (apps, notifications, recents, pins).\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n // ========================================\n //\n // 🚨 SAFETY BOUNDARY: the Home dashboard exposes ONLY navigation / discovery /\n // panel-toggle operations to the agent. No pin create, no pin delete, no pin\n // rename, no group mutation, no reordering — those are user-confirm-driven or\n // destructive and stay in the UI. Every tool below maps to the exact same\n // component method a user click would call (OpenApp→onAppClick, OpenPin→OnPinClick,\n // search→AddPanel search field, panel/sidebar/edit-mode toggles). Handlers are\n // tolerant: they never throw, returning { Success, Data?, ErrorMessage? }.\n\n /**\n * Publish the current Home dashboard state to the AI agent via NavigationService.\n * The shaping lives in the pure {@link buildHomeAgentContext} helper so it stays\n * unit-testable. Called on init and on every meaningful state change.\n */\n private publishAgentContext(): void {\n const context = BuildHomeAgentContext({\n AppCount: this.Apps.length,\n VisibleAppCount: this.AppsDisplayData.length,\n AppNames: this.Apps.map(a => a.Name),\n PinnedItemCount: this.PinnedItems.length,\n PinGroupCount: this.PinGroups.length,\n PinGroupNames: this.PinGroups,\n PinNames: this.PinnedItems.map(p => p.DisplayName),\n UnreadNotifications: this.UnreadNotifications.length,\n NotificationTitles: this.UnreadNotifications.map(n => n.Title ?? '(untitled)'),\n RecentItemsCount: this.RecentItems.length,\n RecentItems: this.buildRecentItemSummaries(),\n EditMode: this.EditMode,\n AddPanelOpen: this.AddPanelOpen,\n SidebarOpen: this.SidebarOpen,\n AddPanelSearchQuery: this.AddPanelSearchQuery,\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /** Structured recent-item summaries (display name + resource type) for the agent context. */\n private buildRecentItemSummaries(): RecentItemSummary[] {\n return this.RecentItems.map(item => ({\n Name: item.recordName || item.entityName || item.recordId,\n ResourceType: item.resourceType,\n }));\n }\n\n /**\n * Register the client tools the AI agent can invoke against the Home dashboard.\n * All are navigation / discovery / panel-toggle operations (see SAFETY BOUNDARY\n * above). Each handler delegates to the same component method a user interaction\n * would call and returns a tolerant result.\n *\n * Tools:\n * - OpenApp: switch to an application by name (exact or partial match).\n * - OpenPin: open a pinned item by its display name (exact or partial match).\n * - SearchPins: find pinned items by a name query (read-only — returns matches).\n * - OpenRecent: open a recently-accessed item by display name (read-only navigation).\n * - SearchAddPinPanel: open the Add Pin panel (if needed) and apply a search query.\n * - ClearAddPinPanelSearch: clear the Add Pin panel search query.\n * - OpenAddPinPanel / CloseAddPinPanel: toggle the Add Pin panel.\n * - ToggleSidebar: toggle the notifications/favorites/recents sidebar.\n * - TogglePinEditMode: toggle pin edit mode (reorder/rename UI affordances).\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenApp',\n Description: 'Switch to an application by its name (e.g. \"Data Explorer\", \"Knowledge Hub\").',\n ParameterSchema: { type: 'object', properties: { appName: { type: 'string' } }, required: ['appName'] },\n Handler: async (params: Record<string, unknown>) => this.toolOpenApp(params),\n },\n {\n Name: 'OpenPin',\n Description: 'Open a pinned item on the Home screen by its display name (exact or partial match).',\n ParameterSchema: { type: 'object', properties: { pinName: { type: 'string' } }, required: ['pinName'] },\n Handler: async (params: Record<string, unknown>) => this.toolOpenPin(params),\n },\n {\n Name: 'SearchPins',\n Description: 'Find pinned items on the Home screen whose display name matches a query (case-insensitive contains). Read-only — returns the matching pin names; does not open anything.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearchPins(params),\n },\n {\n Name: 'OpenRecent',\n Description: 'Open a recently-accessed item from the Home sidebar by its display name (exact or partial match). Read-only navigation.',\n ParameterSchema: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },\n Handler: async (params: Record<string, unknown>) => this.toolOpenRecent(params),\n },\n {\n Name: 'SearchAddPinPanel',\n Description: 'Open the Add Pin panel (if not already open) and filter its available resources by a search query.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearchAddPinPanel(params),\n },\n {\n Name: 'ClearAddPinPanelSearch',\n Description: 'Clear the search query in the Add Pin panel.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.toolClearAddPinPanelSearch(),\n },\n {\n Name: 'OpenAddPinPanel',\n Description: 'Open the Add Pin panel so the user can browse pinnable resources.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.OpenAddPinPanel();\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'CloseAddPinPanel',\n Description: 'Close the Add Pin panel.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.CloseAddPinPanel();\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'ToggleSidebar',\n Description: 'Toggle the Home sidebar (unread notifications, favorites, and recent items).',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ToggleSidebar();\n this.publishAgentContext();\n return { Success: true, Data: { SidebarOpen: this.SidebarOpen } };\n },\n },\n {\n Name: 'TogglePinEditMode',\n Description: 'Toggle pin edit mode on the Home screen (lets the user rename/reorder pins). This only changes the UI mode — it does not modify any pins.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.ToggleEditMode();\n this.publishAgentContext();\n return { Success: true, Data: { EditMode: this.EditMode } };\n },\n },\n ]);\n }\n\n /** Resolve an app by name (exact then partial, case-insensitive) and switch to it. */\n private async toolOpenApp(params: Record<string, unknown>): Promise<AgentToolResult & { Data?: Record<string, unknown> }> {\n const parsed = ValidateStringParam(params['appName'], 'appName');\n if (!parsed.ok) {\n return parsed.result;\n }\n const appName = parsed.value.trim();\n if (!appName) {\n return { Success: false, ErrorMessage: 'appName is required.' };\n }\n const candidates: NamedRecord[] = this.Apps.map(a => ({ Name: a.Name }));\n const match = ResolveNamedRecord(appName, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(appName, 'app', candidates) };\n }\n const app = this.Apps.find(a => a.Name === match.Name);\n if (!app) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(appName, 'app', candidates) };\n }\n await this.OnAppClick(app);\n return { Success: true, Data: { AppName: app.Name } };\n }\n\n /** The pinned items narrowed to the resolver's structural shape (Name == DisplayName). */\n private get pinNamedRecords(): NamedRecord[] {\n return this.PinnedItems.map(p => ({ Name: p.DisplayName }));\n }\n\n /** Resolve a pinned item by display name (exact then partial, case-insensitive) and open it. */\n private toolOpenPin(params: Record<string, unknown>): AgentToolResult & { Data?: Record<string, unknown> } {\n const parsed = ValidateStringParam(params['pinName'], 'pinName');\n if (!parsed.ok) {\n return parsed.result;\n }\n const pinName = parsed.value.trim();\n if (!pinName) {\n return { Success: false, ErrorMessage: 'pinName is required.' };\n }\n const match = ResolveNamedRecord(pinName, this.pinNamedRecords);\n if (!match) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(pinName, 'pinned item', this.pinNamedRecords) };\n }\n const pin = this.PinnedItems.find(p => p.DisplayName === match.Name);\n if (!pin) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(pinName, 'pinned item', this.pinNamedRecords) };\n }\n // OnPinClick is a no-op while in edit mode; clear edit mode so the open succeeds.\n if (this.EditMode) {\n this.EditMode = false;\n }\n this.OnPinClick(pin);\n return { Success: true, Data: { PinName: pin.DisplayName } };\n }\n\n /** Find pinned items whose display name matches a query (read-only — returns matches). */\n private toolSearchPins(params: Record<string, unknown>): AgentToolResult & { Data?: Record<string, unknown> } {\n const parsed = ValidateStringParam(params['query'], 'query');\n if (!parsed.ok) {\n return parsed.result;\n }\n const query = parsed.value.trim().toLowerCase();\n const matches = query\n ? this.PinnedItems.filter(p => p.DisplayName.toLowerCase().includes(query))\n : [...this.PinnedItems];\n return { Success: true, Data: { Matches: matches.map(p => p.DisplayName), MatchCount: matches.length } };\n }\n\n /** Resolve a recent item by display name (exact then partial) and navigate to it. */\n private toolOpenRecent(params: Record<string, unknown>): AgentToolResult & { Data?: Record<string, unknown> } {\n const parsed = ValidateStringParam(params['name'], 'name');\n if (!parsed.ok) {\n return parsed.result;\n }\n const name = parsed.value.trim();\n if (!name) {\n return { Success: false, ErrorMessage: 'name is required.' };\n }\n // Build the same display name the context publishes, then resolve against it.\n const named: NamedRecord[] = this.RecentItems.map(item => ({\n Name: item.recordName || item.entityName || item.recordId,\n }));\n const match = ResolveNamedRecord(name, named);\n if (!match) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(name, 'recent item', named) };\n }\n const idx = named.findIndex(n => n.Name === match.Name);\n const item = this.RecentItems[idx];\n if (!item) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(name, 'recent item', named) };\n }\n this.OnRecentClick(item);\n return { Success: true, Data: { Name: match.Name, ResourceType: item.resourceType } };\n }\n\n /** Open the Add Pin panel (if needed) and apply a search query. */\n private async toolSearchAddPinPanel(params: Record<string, unknown>): Promise<AgentToolResult & { Data?: Record<string, unknown> }> {\n const parsed = ValidateStringParam(params['query'], 'query');\n if (!parsed.ok) {\n return parsed.result;\n }\n if (!this.AddPanelOpen) {\n await this.OpenAddPinPanel();\n }\n this.AddPanelSearchQuery = parsed.value;\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true, Data: { Query: parsed.value } };\n }\n\n /** Clear the Add Pin panel search query. */\n private toolClearAddPinPanelSearch(): AgentToolResult {\n this.AddPanelSearchQuery = '';\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true };\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get a greeting based on time of day\n */\n get Greeting(): string {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good morning';\n if (hour < 17) return 'Good afternoon';\n return 'Good evening';\n }\n\n /** @deprecated Use {@link Greeting}. */\n get greeting(): string {\n return this.Greeting;\n }\n\n /**\n * Get formatted date string\n */\n get FormattedDate(): string {\n return new Date().toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric'\n });\n }\n\n /** @deprecated Use {@link FormattedDate}. */\n get formattedDate(): string {\n return this.FormattedDate;\n }\n\n /**\n * Navigate to an application\n */\n async OnAppClick(app: BaseApplication): Promise<void> {\n // Use NavigationService to switch to the app (handles tab creation if needed)\n await this.navigationService.SwitchToApp(app.ID);\n }\n\n /** @deprecated Use {@link OnAppClick}. */\n async onAppClick(app: BaseApplication): Promise<void> {\n return this.OnAppClick(app);\n }\n\n /**\n * Open app configuration dialog\n */\n OpenConfigDialog(): void {\n this.ShowConfigDialog = true;\n setTimeout(() => {\n if (this.AppConfigDialog) {\n this.AppConfigDialog.Open();\n }\n }, 0);\n }\n\n /** @deprecated Use {@link OpenConfigDialog}. */\n openConfigDialog(): void {\n return this.OpenConfigDialog();\n }\n\n /**\n * Handle when config is saved\n */\n OnConfigSaved(): void {\n this.ShowConfigDialog = false;\n }\n\n /** @deprecated Use {@link OnConfigSaved}. */\n onConfigSaved(): void {\n return this.OnConfigSaved();\n }\n\n /**\n * Pre-compute display data for all apps to avoid repeated calculations during change detection\n */\n private async computeAppsDisplayData(): Promise<void> {\n this.AppsDisplayData = await Promise.all(this.Apps.map(async app => {\n const navItems = await app.GetNavItems();\n const navItemsCount = navItems.length;\n const navItemsPreview = navItems.slice(0, 3).map(item => ({\n Label: item.Label,\n Icon: item.Icon || 'fa-solid fa-circle'\n }));\n\n return {\n app,\n color: app.GetColor() || '#1976d2',\n icon: app.Icon || 'fa-solid fa-cube',\n navItemsCount,\n navItemsPreview,\n showMoreItems: navItemsCount > 3,\n moreItemsCount: navItemsCount - 3\n };\n }));\n }\n\n /**\n * Track function for apps loop\n */\n TrackByApp(_index: number, item: AppDisplayData): string {\n return item.app.ID;\n }\n\n /** @deprecated Use {@link TrackByApp}. */\n trackByApp(_index: number, item: AppDisplayData): string {\n return this.TrackByApp(_index, item);\n }\n\n /**\n * Track function for nav items preview\n */\n TrackByNavItem(_index: number, item: { Label: string; Icon: string }): string {\n return item.Label;\n }\n\n /** @deprecated Use {@link TrackByNavItem}. */\n trackByNavItem(_index: number, item: { Label: string; Icon: string }): string {\n return this.TrackByNavItem(_index, item);\n }\n\n /**\n * Load user favorites from UserInfoEngine (cached) and resolve record display names\n */\n private async loadFavorites(): Promise<void> {\n try {\n this.FavoritesLoading = true;\n\n // Get first 10 favorites (already ordered by __mj_CreatedAt DESC in engine)\n this.Favorites = UserInfoEngine.Instance.UserFavorites.slice(0, 10);\n\n // Batch-resolve record names for all favorites\n await this.resolveFavoriteNames();\n } catch (error) {\n console.error('Error loading favorites:', error);\n } finally {\n this.FavoritesLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Batch-resolve record display names for favorites using GetEntityRecordNames()\n */\n private async resolveFavoriteNames(): Promise<void> {\n const nameInputs: EntityRecordNameInput[] = [];\n const favoriteIdByKey = new Map<string, string>(); // map key -> favorite ID\n\n for (const fav of this.Favorites) {\n if (!fav.Entity || !fav.RecordID) continue;\n const compositeKey = this.buildCompositeKeyForRecord(fav.Entity, fav.RecordID);\n if (!compositeKey) continue;\n\n nameInputs.push({ EntityName: fav.Entity, CompositeKey: compositeKey });\n favoriteIdByKey.set(`${fav.Entity}||${compositeKey.ToConcatenatedString()}`, fav.ID);\n }\n\n if (nameInputs.length === 0) return;\n\n try {\n const nameResults = await this.metadata.GetEntityRecordNames(nameInputs);\n for (const result of nameResults) {\n if (result.Success && result.RecordName) {\n const key = `${result.EntityName}||${result.CompositeKey.ToConcatenatedString()}`;\n const favId = favoriteIdByKey.get(key);\n if (favId) {\n this.FavoriteDisplayNames.set(favId, result.RecordName);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to resolve favorite record names:', error);\n }\n }\n\n /**\n * Build a CompositeKey for a record. RecordID may be stored as either:\n * - Concatenated format: \"FieldName|Value\" or \"Field1|Val1||Field2|Val2\"\n * - Plain value: just the raw value (e.g. a GUID)\n */\n private buildCompositeKeyForRecord(entityName: string, recordId: string): CompositeKey | null {\n if (!recordId) return null;\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n // A plain value can only be resolved against the entity's real key column(s)\n if (!entityInfo && !recordId.includes(CompositeKey.DefaultValueDelimiter)) return null;\n const compositeKey = CompositeKey.FromURLSegment(entityInfo, recordId);\n return compositeKey.KeyValuePairs.length > 0 ? compositeKey : null;\n }\n\n /**\n * Get the display name for a favorite (resolved name or entity name fallback)\n */\n GetFavoriteDisplayName(favorite: MJUserFavoriteEntity): string {\n return this.FavoriteDisplayNames.get(favorite.ID) || favorite.Entity || favorite.RecordID;\n }\n\n /** @deprecated Use {@link GetFavoriteDisplayName}. */\n getFavoriteDisplayName(favorite: MJUserFavoriteEntity): string {\n return this.GetFavoriteDisplayName(favorite);\n }\n\n /**\n * Load recent items via the RecentAccessService\n */\n private async loadRecents(): Promise<void> {\n try {\n this.RecentsLoading = true;\n this.cdr.markForCheck();\n await this.recentAccessService.loadRecentItems(10);\n } catch (error) {\n console.error('Error loading recents:', error);\n } finally {\n this.RecentsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Navigate to a favorite item using NavigationService\n */\n OnFavoriteClick(favorite: MJUserFavoriteEntity): void {\n // Navigate based on entity type using NavigationService\n const entityName = favorite.Entity?.toLowerCase();\n const recordId = favorite.RecordID;\n\n if (entityName === 'dashboards') {\n this.navigationService.OpenDashboard(recordId, 'Dashboard');\n } else if (entityName === 'user views') {\n this.navigationService.OpenView(recordId, 'View');\n } else if (entityName?.includes('artifact')) {\n this.navigationService.OpenArtifact(recordId, 'Artifact');\n } else {\n // Default: navigate to record\n const compositeKey = this.buildCompositeKeyForRecord(favorite.Entity, recordId);\n if (compositeKey) {\n this.navigationService.OpenEntityRecord(favorite.Entity, compositeKey);\n }\n }\n }\n\n /** @deprecated Use {@link OnFavoriteClick}. */\n onFavoriteClick(favorite: MJUserFavoriteEntity): void {\n return this.OnFavoriteClick(favorite);\n }\n\n /**\n * Navigate to a recent item using NavigationService\n */\n OnRecentClick(item: RecentAccessItem): void {\n // Use recordName if available, otherwise fall back to generic titles\n const name = item.recordName;\n\n switch (item.resourceType) {\n case 'view':\n this.navigationService.OpenView(item.recordId, name || 'View');\n break;\n case 'dashboard':\n this.navigationService.OpenDashboard(item.recordId, name || 'Dashboard');\n break;\n case 'artifact':\n this.navigationService.OpenArtifact(item.recordId, name || 'Artifact');\n break;\n default: {\n // Regular record\n const compositeKey = this.buildCompositeKeyForRecord(item.entityName, item.recordId);\n if (compositeKey) {\n this.navigationService.OpenEntityRecord(item.entityName, compositeKey);\n }\n }\n }\n }\n\n /** @deprecated Use {@link OnRecentClick}. */\n onRecentClick(item: RecentAccessItem): void {\n return this.OnRecentClick(item);\n }\n\n /**\n * Navigate to a notification using NavigationService\n */\n OnNotificationClick(notification: MJUserNotificationEntity): void {\n // Navigate to the notifications view using NavigationService\n this.navigationService.OpenDynamicView('MJ: User Notifications');\n }\n\n /** @deprecated Use {@link OnNotificationClick}. */\n onNotificationClick(notification: MJUserNotificationEntity): void {\n return this.OnNotificationClick(notification);\n }\n\n /**\n * Get icon for an entity by name, using entity metadata Icon field (cached)\n */\n GetEntityIconByName(entityName: string): string {\n if (!entityName) return 'fa-solid fa-file';\n\n const cached = this.resourceIconCache.get(entityName);\n if (cached) return cached;\n\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n const icon = entityInfo ? this.resolveEntityIcon(entityInfo.Icon) : 'fa-solid fa-file';\n\n this.resourceIconCache.set(entityName, icon);\n return icon;\n }\n\n /** @deprecated Use {@link GetEntityIconByName}. */\n getEntityIconByName(entityName: string): string {\n return this.GetEntityIconByName(entityName);\n }\n\n /**\n * Resolve an entity's Icon field to a full Font Awesome class string\n */\n private resolveEntityIcon(icon: string | undefined): string {\n if (!icon) return 'fa-solid fa-table';\n\n // Already has a style prefix\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n // Has fa- prefix but no style\n if (icon.startsWith('fa-')) {\n return `fa-solid ${icon}`;\n }\n // Just an icon name like \"table\" or \"users\"\n return `fa-solid fa-${icon}`;\n }\n\n /**\n * Format a date for display (pure function, safe to call in template)\n */\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Track function for favorites\n */\n TrackByFavorite(_index: number, item: MJUserFavoriteEntity): string {\n return item.ID;\n }\n\n /** @deprecated Use {@link TrackByFavorite}. */\n trackByFavorite(_index: number, item: MJUserFavoriteEntity): string {\n return this.TrackByFavorite(_index, item);\n }\n\n /**\n * Remove duplicate recent items (same entity + recordId). Keeps the first occurrence.\n */\n private deduplicateRecents(items: RecentAccessItem[]): RecentAccessItem[] {\n const seen = new Set<string>();\n return items.filter(item => {\n const key = `${item.entityName}-${item.recordId}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }\n\n /**\n * Track function for recent items\n */\n TrackByRecent(_index: number, item: RecentAccessItem): string {\n return `${item.entityName}-${item.recordId}`;\n }\n\n /** @deprecated Use {@link TrackByRecent}. */\n trackByRecent(_index: number, item: RecentAccessItem): string {\n return this.TrackByRecent(_index, item);\n }\n\n /**\n * Track function for notifications\n */\n TrackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return item.ID;\n }\n\n /** @deprecated Use {@link TrackByNotification}. */\n trackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return this.TrackByNotification(_index, item);\n }\n\n // =============================================\n // PIN NAME RESOLUTION\n // =============================================\n\n /**\n * Resolve display names for record-type pins that have raw \"Entity - ID|...\" titles.\n * Uses batch GetEntityRecordNames() for efficiency, same pattern as favorites.\n */\n private async resolveRecordPinNames(): Promise<void> {\n // Find pins that need name resolution: records with raw ID titles,\n // or any pin whose DisplayName contains \"ID|\" (raw composite key)\n const pinsNeedingNames = this.PinnedItems.filter(pin => {\n const rt = this.resolveStoredResourceType(pin);\n if (rt !== 'Records') return false;\n // Check if the name looks like a raw ID format\n return pin.DisplayName.includes('ID|') || pin.DisplayName.includes(' - ID');\n });\n\n if (pinsNeedingNames.length === 0) return;\n\n const nameInputs: EntityRecordNameInput[] = [];\n const pinIdByKey = new Map<string, string>();\n\n for (const pin of pinsNeedingNames) {\n const entityName = (pin.Configuration['Entity'] || pin.Configuration['entity']) as string;\n const recordId = pin.Configuration['recordId'] as string;\n if (!entityName || !recordId) continue;\n\n const compositeKey = this.buildCompositeKeyForRecord(entityName, recordId);\n if (!compositeKey) continue;\n\n nameInputs.push({ EntityName: entityName, CompositeKey: compositeKey });\n pinIdByKey.set(`${entityName}||${compositeKey.ToConcatenatedString()}`, pin.Id);\n }\n\n if (nameInputs.length === 0) return;\n\n try {\n const nameResults = await this.metadata.GetEntityRecordNames(nameInputs);\n for (const result of nameResults) {\n if (result.Success && result.RecordName) {\n const key = `${result.EntityName}||${result.CompositeKey.ToConcatenatedString()}`;\n const pinId = pinIdByKey.get(key);\n if (pinId) {\n this.pinService.UpdatePin(pinId, { DisplayName: result.RecordName });\n }\n }\n }\n } catch (error) {\n console.warn('[Pin Names] Failed to resolve record names:', error);\n }\n }\n\n /**\n * Resolve missing icons for Custom (app nav item) pins by looking up nav items.\n */\n private async resolveCustomPinIcons(): Promise<void> {\n const pinsNeedingIcons = this.PinnedItems.filter(pin =>\n this.resolveStoredResourceType(pin) === 'Custom' && !pin.Icon\n );\n\n if (pinsNeedingIcons.length === 0) return;\n\n for (const pin of pinsNeedingIcons) {\n const appName = pin.ApplicationName || pin.Configuration['appName'] as string;\n const navItemName = pin.Configuration['navItemName'] as string;\n if (!appName || !navItemName) continue;\n\n const app = this.appManager.GetAllApps().find(a => a.Name === appName);\n if (!app) continue;\n\n const navItems = await app.GetNavItems();\n const navItem = navItems.find(ni => ni.Label === navItemName);\n if (navItem?.Icon) {\n this.pinService.UpdatePin(pin.Id, { Icon: navItem.Icon });\n }\n }\n }\n\n // =============================================\n // PIN MANAGEMENT\n // =============================================\n\n /**\n * Navigate to a pinned resource\n */\n OnPinClick(pin: HomeAppPinnedItem): void {\n if (this.EditMode) return;\n const config = pin.Configuration;\n const rt = this.resolveStoredResourceType(pin);\n\n // For Dashboards, Views, Queries — route through Data Explorer if available\n const deApp = this.HasDataExplorerApp\n ? this.appManager.GetAllApps().find(a => a.Name === 'Data Explorer')\n : null;\n\n switch (rt) {\n case 'Dashboards': {\n const dashboardId = config['dashboardId'] as string;\n if (!dashboardId) break;\n if (deApp) {\n void this.navigationService.SwitchToApp(deApp.ID, 'Dashboards', { dashboard: dashboardId });\n } else {\n this.navigationService.OpenDashboard(dashboardId, pin.DisplayName);\n }\n break;\n }\n case 'User Views':\n if (config['isDynamic']) {\n this.navigationService.OpenDynamicView(\n (config['Entity'] || config['entity']) as string,\n config['extraFilter'] as string | undefined\n );\n } else {\n const viewId = config['viewId'] as string;\n if (viewId) {\n this.navigationService.OpenView(viewId, pin.DisplayName);\n }\n }\n break;\n case 'Queries': {\n const queryId = config['queryId'] as string;\n if (!queryId) break;\n if (deApp) {\n void this.navigationService.SwitchToApp(deApp.ID, 'Queries', { queryId: queryId });\n } else {\n this.navigationService.OpenQuery(queryId, pin.DisplayName);\n }\n break;\n }\n case 'Records': {\n const entityName = (config['Entity'] || config['entity']) as string;\n const recordId = config['recordId'] as string;\n if (entityName && recordId) {\n const compositeKey = this.buildCompositeKeyForRecord(entityName, recordId);\n if (compositeKey) {\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n }\n } else {\n console.warn('[Pin Click] Records pin missing Entity or recordId', config);\n }\n break;\n }\n case 'Custom': {\n // Custom resources are nav items within apps — always use app name, never ID\n const navItemName = config['navItemName'] as string;\n const appName = config['appName'] as string;\n const queryParams = config['queryParams'] as Record<string, string> | undefined;\n if (appName) {\n const app = this.appManager.GetAllApps().find(a => a.Name === appName);\n if (app) {\n // Pass query params INTO SwitchToApp so they're applied synchronously when the\n // target tab activates — before a cached resource component reattaches. The old\n // post-hoc UpdateActiveTabQueryParams() in a .then() raced the cache reattach and\n // lost: e.g. two conversation pins both landed on whatever chat was already open.\n void this.navigationService.SwitchToApp(app.ID, navItemName, queryParams);\n } else {\n console.warn(`[Pin Click] Custom pin: app \"${appName}\" not found`, config);\n }\n } else {\n console.warn('[Pin Click] Custom pin missing appName', config);\n }\n break;\n }\n case 'Actions': {\n const actionId = config['actionId'] as string;\n if (!actionId) {\n console.warn('[Pin Click] Action pin missing actionId', config);\n break;\n }\n this.ActionRunnerPin = pin;\n this.ActionRunnerDialogVisible = true;\n this.cdr.markForCheck();\n break;\n }\n default:\n console.warn('[Pin Click] Unrecognized resource type', rt, 'for pin', pin.DisplayName, config);\n break;\n }\n }\n\n /**\n * Resolve a pin's resource type from its stored ResourceType and config keys.\n * Handles legacy pins that may have stored a UUID resourceTypeId or\n * a raw config.resourceType string instead of the canonical type names.\n */\n private resolveStoredResourceType(pin: HomeAppPinnedItem): string {\n const rt = pin.ResourceType;\n const config = pin.Configuration;\n\n // Already a known canonical type\n const knownTypes = ['Dashboards', 'User Views', 'Queries', 'Reports', 'Records', 'Custom', 'Actions'];\n if (knownTypes.includes(rt)) return rt;\n\n // Check the config's own resourceType field\n const configRt = config['resourceType'] as string;\n if (configRt && knownTypes.includes(configRt)) return configRt;\n\n // Fall back to detecting by config keys\n if (config['dashboardId']) return 'Dashboards';\n if (config['viewId']) return 'User Views';\n if (config['queryId']) return 'Queries';\n if (config['reportId']) return 'Reports';\n if ((config['Entity'] || config['entity']) && config['recordId']) return 'Records';\n if (config['actionId']) return 'Actions';\n if (config['navItemName']) return 'Custom';\n\n return rt; // Give up and return whatever was stored\n }\n\n /**\n * Toggle edit mode for pins\n */\n ToggleEditMode(): void {\n this.EditMode = !this.EditMode;\n if (!this.EditMode) {\n this.EditingPinId = null;\n this.EditingGroupName = null;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Permanently hide the \"No pinned items yet\" empty state for this user.\n * Persisted in UserSettings via UserInfoEngine.\n */\n DismissPinEmptyState(): void {\n this.HidePinEmptyState = true;\n UserInfoEngine.Instance.SetSettingDebounced('HomeApp.HidePinEmptyState', 'true');\n this.cdr.markForCheck();\n }\n\n /**\n * Remove a pin\n */\n RemovePin(pinId: string): void {\n this.pinService.RemovePin(pinId);\n }\n\n /**\n * Start inline editing of a pin's display name\n */\n StartEditingPin(pinId: string, event: Event): void {\n event.stopPropagation();\n this.EditingPinId = pinId;\n this.cdr.markForCheck();\n }\n\n /**\n * Save edited pin name\n */\n SavePinName(pinId: string, newName: string): void {\n if (newName.trim()) {\n this.pinService.UpdatePin(pinId, { DisplayName: newName.trim() });\n }\n this.EditingPinId = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Extract input value from a DOM event (strict template helper)\n */\n GetInputValue(event: Event): string {\n return (event.target as HTMLInputElement).value;\n }\n\n /**\n * Start editing a group name\n */\n StartEditingGroup(groupName: string): void {\n this.EditingGroupName = groupName;\n this.cdr.markForCheck();\n }\n\n /**\n * Save edited group name - updates all pins in the group\n */\n SaveGroupName(oldName: string, newName: string): void {\n if (newName.trim() && newName.trim() !== oldName) {\n const pinsInGroup = this.pinService.GetPinsInGroup(oldName);\n for (const pin of pinsInGroup) {\n this.pinService.UpdatePin(pin.Id, { Group: newName.trim() });\n }\n }\n this.EditingGroupName = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Remove a group - moves all pins to ungrouped\n */\n RemoveGroup(groupName: string): void {\n const pinsInGroup = this.pinService.GetPinsInGroup(groupName);\n for (const pin of pinsInGroup) {\n this.pinService.UpdatePin(pin.Id, { Group: undefined });\n }\n }\n\n /**\n * Get pins in a specific group\n */\n GetPinsInGroup(groupName: string): HomeAppPinnedItem[] {\n return this.pinService.GetPinsInGroup(groupName);\n }\n\n /**\n * Get icon for a pin based on resource type and metadata\n */\n GetPinIcon(pin: HomeAppPinnedItem): string {\n if (pin.Icon) return pin.Icon;\n const entity = (pin.Configuration['Entity'] || pin.Configuration['entity'] || '') as string;\n switch (pin.ResourceType) {\n case 'Dashboards': return 'fa-solid fa-gauge-high';\n case 'User Views': return entity ? this.GetEntityIconByName(entity) : 'fa-solid fa-table-list';\n case 'Queries': return 'fa-solid fa-database';\n case 'Reports': return 'fa-solid fa-chart-bar';\n case 'Records': return entity ? this.GetEntityIconByName(entity) : 'fa-solid fa-file';\n case 'Custom': return this.getNavItemIcon(pin) || this.getAppIcon(pin) || 'fa-solid fa-cube';\n case 'Actions': return 'fa-solid fa-bolt';\n default: return 'fa-solid fa-thumbtack';\n }\n }\n\n /**\n * Get display label for a resource type\n */\n GetResourceTypeLabel(pin: HomeAppPinnedItem): string {\n switch (pin.ResourceType) {\n case 'Dashboards': return 'Dashboard';\n case 'User Views': return 'View';\n case 'Queries': return 'Query';\n case 'Reports': return 'Report';\n case 'Records': return (pin.Configuration?.['Entity'] as string) || (pin.Configuration?.['entity'] as string) || 'Record';\n case 'Custom': return pin.ApplicationName || (pin.Configuration['appName'] as string) || 'App';\n case 'Actions': return 'Quick Action';\n default: return pin.ResourceType;\n }\n }\n\n /** Accent color for a pin — prefers the stored accentColor in Configuration, falls back to Color, then CSS var */\n GetPinAccentColor(pin: HomeAppPinnedItem): string {\n const fromConfig = (pin.Configuration as unknown as ActionPinConfiguration).accentColor;\n return fromConfig || pin.Color || 'var(--mj-text-muted)';\n }\n\n /**\n * Get the app icon for a pin by looking up the app by name\n */\n private getAppIcon(pin: HomeAppPinnedItem): string | undefined {\n const appName = pin.ApplicationName || pin.Configuration['appName'] as string;\n if (!appName) return undefined;\n const app = this.appManager.GetAllApps().find(a => a.Name === appName);\n return app?.Icon || undefined;\n }\n\n /**\n * Look up the nav item icon for a Custom pin from the app's nav items cache.\n * Uses the pre-computed appsDisplayData to avoid async lookups.\n */\n private getNavItemIcon(pin: HomeAppPinnedItem): string | undefined {\n const appName = pin.ApplicationName || pin.Configuration['appName'] as string;\n const navItemName = pin.Configuration['navItemName'] as string;\n if (!appName || !navItemName) return undefined;\n\n // Check the pre-computed display data first (fast)\n const appData = this.AppsDisplayData.find(d => d.app.Name === appName);\n if (appData) {\n const navItem = appData.navItemsPreview.find(ni => ni.Label === navItemName);\n if (navItem) return navItem.Icon;\n }\n\n // Fall back to AvailableApps data (if Add Panel was loaded)\n const panelApp = this.AvailableApps.find(a => a.appName === appName);\n if (panelApp) {\n const ni = panelApp.navItems.find(n => n.label === navItemName);\n if (ni) return ni.icon;\n }\n\n return undefined;\n }\n\n // =============================================\n // PIN CONTEXT MENU (ELLIPSIS)\n // =============================================\n\n /**\n * Show the pin context menu (triggered by ellipsis button)\n */\n ShowPinMenu(event: MouseEvent, pin: HomeAppPinnedItem): void {\n event.stopPropagation();\n event.preventDefault();\n this.PinMenuPin = pin;\n this.PinMenuX = event.clientX;\n this.PinMenuY = event.clientY;\n this.PinMenuVisible = true;\n this.cdr.markForCheck();\n\n // Close on click outside or Escape\n setTimeout(() => {\n const clickHandler = () => {\n this.HidePinMenu();\n document.removeEventListener('click', clickHandler);\n document.removeEventListener('keydown', keyHandler);\n };\n const keyHandler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.HidePinMenu();\n document.removeEventListener('click', clickHandler);\n document.removeEventListener('keydown', keyHandler);\n }\n };\n document.addEventListener('click', clickHandler);\n document.addEventListener('keydown', keyHandler);\n }, 0);\n }\n\n /**\n * Hide the pin context menu\n */\n HidePinMenu(): void {\n this.PinMenuVisible = false;\n this.PinMenuPin = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Edit a pin (enters edit mode focused on this pin)\n */\n OnPinMenuEdit(): void {\n if (this.PinMenuPin) {\n this.EditMode = true;\n this.EditingPinId = this.PinMenuPin.Id;\n this.cdr.markForCheck();\n }\n this.HidePinMenu();\n }\n\n /**\n * Move a pin to a different group\n */\n OnPinMenuMoveToGroup(groupName: string | undefined): void {\n if (this.PinMenuPin) {\n this.pinService.UpdatePin(this.PinMenuPin.Id, { Group: groupName });\n }\n this.HidePinMenu();\n }\n\n /**\n * Unpin a resource from the pin context menu\n */\n OnPinMenuUnpin(): void {\n if (this.PinMenuPin) {\n this.pinService.RemovePin(this.PinMenuPin.Id);\n }\n this.HidePinMenu();\n }\n\n // =============================================\n // DRAG AND DROP\n // =============================================\n\n OnDragStart(event: DragEvent, pin: HomeAppPinnedItem): void {\n this.DraggingPinId = pin.Id;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', pin.Id);\n }\n }\n\n OnDragOver(event: DragEvent, targetPin: HomeAppPinnedItem): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n this.DragOverPinId = targetPin.Id;\n }\n\n OnDragLeave(): void {\n this.DragOverPinId = null;\n }\n\n OnDrop(event: DragEvent, targetPin: HomeAppPinnedItem): void {\n event.preventDefault();\n this.DragOverPinId = null;\n\n if (!this.DraggingPinId || this.DraggingPinId === targetPin.Id) {\n this.DraggingPinId = null;\n return;\n }\n\n const pins = [...this.PinnedItems];\n const dragIndex = pins.findIndex(p => p.Id === this.DraggingPinId);\n const dropIndex = pins.findIndex(p => p.Id === targetPin.Id);\n\n if (dragIndex === -1 || dropIndex === -1) {\n this.DraggingPinId = null;\n return;\n }\n\n // Move the dragged pin to the target position and adopt target's group\n const [draggedPin] = pins.splice(dragIndex, 1);\n draggedPin.Group = targetPin.Group;\n pins.splice(dropIndex, 0, draggedPin);\n\n this.pinService.ReorderPins(pins);\n this.DraggingPinId = null;\n }\n\n OnDragEnd(): void {\n this.DraggingPinId = null;\n this.DragOverPinId = null;\n }\n\n TrackByPin(_index: number, pin: HomeAppPinnedItem): string {\n return pin.Id;\n }\n\n /** @deprecated Use {@link TrackByPin}. */\n trackByPin(_index: number, pin: HomeAppPinnedItem): string {\n return this.TrackByPin(_index, pin);\n }\n\n TrackByGroup(_index: number, group: string): string {\n return group;\n }\n\n /** @deprecated Use {@link TrackByGroup}. */\n trackByGroup(_index: number, group: string): string {\n return this.TrackByGroup(_index, group);\n }\n\n // =============================================\n // ADD PIN PANEL\n // =============================================\n\n async OpenAddPinPanel(): Promise<void> {\n this.AddPanelOpen = true;\n this.AddPanelSearchQuery = '';\n this.AddPanelSelectedGroup = '';\n this.AddPanelLoading = true;\n this.cdr.markForCheck();\n\n await this.loadAvailableResources();\n this.AddPanelLoading = false;\n this.cdr.markForCheck();\n }\n\n CloseAddPinPanel(): void {\n this.AddPanelOpen = false;\n this.cdr.markForCheck();\n }\n\n private async loadAvailableResources(): Promise<void> {\n // All four engines are singletons that cache their data in memory. Config(false) is a no-op\n // after first init — DashboardEngine and QueryEngine auto-start at app startup, UserViewEngine\n // and ActionEngineBase initialize on first call. Running them in parallel means whichever\n // ones still need to load do so concurrently, and the already-initialized ones return immediately.\n await Promise.all([\n DashboardEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse),\n UserViewEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse),\n QueryEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse),\n ActionEngineBase.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse)\n ]);\n\n const cachedDashboards = DashboardEngine.Instance.IsPermissionConstrained\n ? []\n : DashboardEngine.Instance.Dashboards\n .filter(d => d.Type === 'Config')\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n const cachedViews = UserViewEngine.Instance.IsPermissionConstrained\n ? []\n : UserViewEngine.Instance.GetViewsForCurrentUser()\n .slice()\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n const cachedQueries = QueryEngine.Instance.IsPermissionConstrained\n ? []\n : QueryEngine.Instance.Queries\n .slice()\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n const cachedActions = ActionEngineBase.Instance.Actions\n .filter(a => a.Status === 'Active')\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n this.AvailableDashboards = cachedDashboards.map(d => ({\n id: d.ID, name: d.Name,\n pinned: this.pinService.IsPinned('Dashboards', { dashboardId: d.ID })\n }));\n\n this.AvailableViews = cachedViews.map(v => ({\n id: v.ID, name: v.Name, entityName: v.Entity || '',\n pinned: this.pinService.IsPinned('User Views', { viewId: v.ID })\n }));\n\n this.AvailableQueries = cachedQueries.map(q => ({\n id: q.ID, name: q.Name,\n pinned: this.pinService.IsPinned('Queries', { queryId: q.ID })\n }));\n\n // Actions can be pinned multiple times with different configs, so we treat them\n // as always \"not pinned\" in the panel — the checkmark would be misleading.\n this.AvailableActions = cachedActions.map(a => ({\n id: a.ID, name: a.Name, description: a.Description || '',\n pinned: false\n }));\n\n // Load apps with their nav items\n await this.loadAvailableApps();\n\n // Check if Data Explorer is available — if so, dashboards/queries/views\n // are accessible through its nav items, no need for standalone sections\n this.HasDataExplorerApp = this.AvailableApps.some(a => a.appName === 'Data Explorer');\n }\n\n /**\n * Filter panel items by search query\n */\n FilterPanelItems<T extends { name: string }>(items: T[]): T[] {\n if (!this.AddPanelSearchQuery) return items;\n const q = this.AddPanelSearchQuery.toLowerCase();\n return items.filter(item => item.name.toLowerCase().includes(q));\n }\n\n /**\n * Load available apps with their nav items for the Add Pin panel\n */\n private async loadAvailableApps(): Promise<void> {\n const allApps = this.appManager.GetAllApps().filter(a => a.Name !== 'Home');\n this.AvailableApps = await Promise.all(allApps.map(async app => {\n const navItems = await app.GetNavItems();\n return {\n appId: app.ID,\n appName: app.Name,\n icon: app.Icon || 'fa-solid fa-cube',\n color: app.GetColor() || '#1976d2',\n navItems: navItems.map(ni => ({\n label: ni.Label,\n icon: ni.Icon || 'fa-solid fa-circle',\n pinned: this.pinService.IsPinned('Custom', { appName: app.Name, navItemName: ni.Label })\n }))\n };\n }));\n }\n\n /**\n * Set a section's collapsed state in the Add Pin panel from the accordion\n * panel's (ExpandedChange) output. The accordion reports the EXPANDED state,\n * which is the inverse of our stored COLLAPSED flag. OnPush component, so\n * mark for check after mutating the map.\n */\n OnPanelSectionExpandedChange(section: string, expanded: boolean): void {\n this.PanelSectionCollapsed[section] = !expanded;\n this.cdr.markForCheck();\n }\n\n /**\n * Pin an app nav item from the Add Panel\n */\n PinAppNavItem(appName: string, _appIcon: string, appColor: string, navItemLabel: string, navItemIcon: string): void {\n const input: HomeAppPinInput = {\n DisplayName: navItemLabel,\n ResourceType: 'Custom',\n ApplicationName: appName,\n Icon: navItemIcon,\n Color: appColor,\n Configuration: {\n resourceType: 'Custom',\n appName: appName,\n navItemName: navItemLabel,\n },\n Group: this.getSelectedGroup() || undefined,\n };\n\n const added = this.pinService.AddPin(input);\n if (added) {\n // Update pinned state in the panel\n this.AvailableApps = this.AvailableApps.map(app => {\n if (app.appName !== appName) return app;\n return {\n ...app,\n navItems: app.navItems.map(ni =>\n ni.label === navItemLabel ? { ...ni, pinned: true } : ni\n )\n };\n });\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${navItemLabel}\" pinned to Home`, 'success', 3000\n );\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Pin a resource from the Add Panel\n */\n PinFromPanel(resourceType: string, id: string, name: string): void {\n let config: Record<string, unknown> = {};\n switch (resourceType) {\n case 'Dashboards':\n config = { dashboardId: id };\n break;\n case 'User Views':\n config = { viewId: id };\n break;\n case 'Queries':\n config = { queryId: id };\n break;\n case 'Reports':\n config = { reportId: id };\n break;\n }\n\n const input: HomeAppPinInput = {\n DisplayName: name,\n ResourceType: resourceType,\n Configuration: config,\n Group: this.getSelectedGroup() || undefined,\n };\n\n const added = this.pinService.AddPin(input);\n if (added) {\n this.updatePanelPinnedState(resourceType, id, true);\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${name}\" pinned to Home`, 'success', 3000\n );\n }\n }\n\n // =============================================\n // ACTION PIN DIALOGS\n // =============================================\n\n /**\n * Open the Configure Action Pin dialog — triggered when the user clicks an Action\n * in the Add Pin panel. Actions need extra configuration (preset params, runtime\n * params, title, theming) before they can be pinned.\n */\n OpenActionPinConfig(actionId: string, actionName: string, description: string): void {\n this.ActionConfigActionId = actionId;\n this.ActionConfigActionName = actionName;\n this.ActionConfigActionDescription = description || null;\n this.ActionConfigDialogVisible = true;\n this.cdr.markForCheck();\n }\n\n /** Callback from the Configure Action Pin dialog */\n OnActionConfigResult(result: ActionPinConfigResult): void {\n this.ActionConfigDialogVisible = false;\n this.cdr.markForCheck();\n if (result.Action !== 'save' || !result.Pin) return;\n\n const p = result.Pin;\n const config: ActionPinConfiguration = {\n actionId: p.ActionID,\n actionName: p.ActionName,\n presetParams: p.PresetParams,\n runtimeParamNames: p.RuntimeParamNames,\n accentColor: p.AccentColor,\n displayName: p.DisplayName\n };\n\n const input: HomeAppPinInput = {\n DisplayName: p.DisplayName,\n ResourceType: 'Actions',\n Icon: p.FaIcon,\n Color: p.AccentColor,\n Configuration: config as unknown as Record<string, unknown>,\n Group: this.getSelectedGroup() || undefined\n };\n\n const added = this.pinService.AddPin(input);\n if (added) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${p.DisplayName}\" pinned to Home`, 'success', 3000\n );\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'A pin with the same title and config already exists.', 'warning', 3000\n );\n }\n }\n\n /** Callback from the Run Action Pin dialog */\n OnActionRunnerResult(_result: ActionPinRunResult): void {\n this.ActionRunnerDialogVisible = false;\n this.ActionRunnerPin = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Resolve the selected group — handles the \"new group\" option\n */\n private getSelectedGroup(): string {\n if (this.AddPanelSelectedGroup === '__new__') {\n return this.AddPanelNewGroupName.trim();\n }\n return this.AddPanelSelectedGroup;\n }\n\n private updatePanelPinnedState(resourceType: string, id: string, pinned: boolean): void {\n switch (resourceType) {\n case 'Dashboards':\n this.AvailableDashboards = this.AvailableDashboards.map(d =>\n d.id === id ? { ...d, pinned } : d\n );\n break;\n case 'User Views':\n this.AvailableViews = this.AvailableViews.map(v =>\n v.id === id ? { ...v, pinned } : v\n );\n break;\n case 'Queries':\n this.AvailableQueries = this.AvailableQueries.map(q =>\n q.id === id ? { ...q, pinned } : q\n );\n break;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Filter apps by search query (matches app name or nav item labels)\n */\n FilterApps(): typeof this.AvailableApps {\n if (!this.AddPanelSearchQuery) return this.AvailableApps;\n const q = this.AddPanelSearchQuery.toLowerCase();\n return this.AvailableApps\n .map(app => ({\n ...app,\n navItems: app.navItems.filter(ni => ni.label.toLowerCase().includes(q))\n }))\n .filter(app => app.appName.toLowerCase().includes(q) || app.navItems.length > 0);\n }\n}\n","<div class=\"home-dashboard\" [class.sidebar-open]=\"sidebarOpen && hasSidebarContent\">\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Header Section -->\n <div class=\"home-header\">\n <div class=\"greeting-section\">\n <h1>{{ greeting }}, {{ currentUser?.Name }}</h1>\n <p class=\"date\">{{ formattedDate }}</p>\n </div>\n </div>\n\n <!-- Pinned Section -->\n @if (!isLoading) {\n <div class=\"pinned-section\">\n <div class=\"pinned-header\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n Pinned\n </h2>\n <div class=\"pinned-actions\">\n @if (EditMode) {\n <button class=\"pin-action-btn done\" (click)=\"ToggleEditMode()\">\n <i class=\"fa-solid fa-check\"></i> Done\n </button>\n } @else {\n <button class=\"pin-action-btn primary\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add Pin\n </button>\n @if (PinnedItems.length > 0) {\n <button class=\"pin-action-btn\" (click)=\"ToggleEditMode()\">\n <i class=\"fa-solid fa-pen\"></i> Edit\n </button>\n }\n }\n </div>\n </div>\n\n @if (EditMode) {\n <div class=\"edit-mode-banner\">\n <i class=\"fa-solid fa-arrows-up-down-left-right\"></i>\n <span><strong>Edit mode</strong> — Drag cards to reorder. Click names to rename.</span>\n </div>\n }\n\n <!-- Empty State -->\n @if (PinnedItems.length === 0 && (EditMode || !HidePinEmptyState)) {\n <div class=\"pin-empty-state\">\n @if (!EditMode) {\n <button type=\"button\" class=\"pin-empty-close\" (click)=\"DismissPinEmptyState()\" title=\"Hide this\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n <mj-empty-state Icon=\"fa-solid fa-thumbtack\"\n Title=\"No pinned items yet\"\n Message=\"Pin your favorite dashboards, views, queries, and reports for quick access.\">\n <button actions mjButton variant=\"primary\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add your first pin\n </button>\n @if (!EditMode && !HidePinEmptyState) {\n <button actions mjButton variant=\"flat\" (click)=\"DismissPinEmptyState()\">\n Don't show this again\n </button>\n }\n </mj-empty-state>\n </div>\n }\n\n <!-- Pin Grid -->\n @if (PinnedItems.length > 0) {\n <div class=\"pin-grid\">\n <!-- Ungrouped Pins -->\n @for (pin of UngroupedPins; track trackByPin($index, pin)) {\n <div class=\"pin-card\"\n [class.edit-mode]=\"EditMode\"\n [class.dragging]=\"DraggingPinId === pin.Id\"\n [class.drag-over]=\"DragOverPinId === pin.Id\"\n [draggable]=\"EditMode\"\n (dragstart)=\"OnDragStart($event, pin)\"\n (dragover)=\"OnDragOver($event, pin)\"\n (dragleave)=\"OnDragLeave()\"\n (drop)=\"OnDrop($event, pin)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OnPinClick(pin)\">\n\n <!-- Edit mode controls -->\n @if (EditMode) {\n <div class=\"edit-controls\">\n <div class=\"drag-handle\"><i class=\"fa-solid fa-grip-vertical\"></i></div>\n <div class=\"edit-card-actions\">\n <button class=\"edit-card-btn delete\" aria-label=\"Remove pin\" title=\"Remove pin\" (click)=\"RemovePin(pin.Id); $event.stopPropagation()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n <!-- Thumbnail / Icon -->\n @if (pin.Thumbnail) {\n <div class=\"pin-thumbnail\">\n <img [src]=\"pin.Thumbnail\" [alt]=\"pin.DisplayName\" />\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n } @else if (pin.ResourceType === 'Actions') {\n <div class=\"pin-thumbnail action-mode\"\n [style.background]=\"'linear-gradient(135deg, ' + GetPinAccentColor(pin) + ' 0%, ' + GetPinAccentColor(pin) + 'cc 100%)'\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Run</button>\n </div>\n }\n </div>\n } @else {\n <div class=\"pin-thumbnail icon-mode\" [style.--pin-icon-color]=\"pin.Color || 'var(--mj-text-muted)'\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n }\n\n <!-- Pin Info -->\n <div class=\"pin-info\">\n @if (EditMode && EditingPinId === pin.Id) {\n <input class=\"pin-name-input\"\n [value]=\"pin.DisplayName\"\n (blur)=\"SavePinName(pin.Id, GetInputValue($event))\"\n (keydown.enter)=\"SavePinName(pin.Id, GetInputValue($event))\"\n (click)=\"$event.stopPropagation()\" />\n } @else {\n <div class=\"pin-name\" (click)=\"EditMode ? StartEditingPin(pin.Id, $event) : null\">\n {{ pin.DisplayName }}\n @if (!EditMode) {\n <button class=\"more-btn\" aria-label=\"Pin options\" title=\"Pin options\" (click)=\"ShowPinMenu($event, pin)\">\n <i class=\"fa-solid fa-ellipsis\"></i>\n </button>\n }\n </div>\n }\n <div class=\"pin-meta\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n {{ GetResourceTypeLabel(pin) }}\n @if (pin.ApplicationName && pin.ResourceType !== 'Custom') {\n <span class=\"pin-app-badge\">{{ pin.ApplicationName }}</span>\n }\n </div>\n </div>\n </div>\n }\n\n <!-- Grouped Pins -->\n @for (group of PinGroups; track trackByGroup($index, group)) {\n <!-- Group Header -->\n <div class=\"group-header\">\n @if (EditMode && EditingGroupName === group) {\n <input class=\"group-name-input\"\n [value]=\"group\"\n (blur)=\"SaveGroupName(group, GetInputValue($event))\"\n (keydown.enter)=\"SaveGroupName(group, GetInputValue($event))\" />\n } @else {\n <span class=\"group-name\" (click)=\"EditMode ? StartEditingGroup(group) : null\">{{ group }}</span>\n }\n <div class=\"group-line\"></div>\n <span class=\"group-count\">{{ GetPinsInGroup(group).length }} pins</span>\n @if (EditMode) {\n <div class=\"group-edit-controls\">\n <button class=\"group-edit-btn danger\" (click)=\"RemoveGroup(group)\">\n <i class=\"fa-solid fa-folder-minus\"></i> Remove Group\n </button>\n </div>\n }\n </div>\n\n <!-- Pins in Group -->\n @for (pin of GetPinsInGroup(group); track trackByPin($index, pin)) {\n <div class=\"pin-card\"\n [class.edit-mode]=\"EditMode\"\n [class.dragging]=\"DraggingPinId === pin.Id\"\n [class.drag-over]=\"DragOverPinId === pin.Id\"\n [draggable]=\"EditMode\"\n (dragstart)=\"OnDragStart($event, pin)\"\n (dragover)=\"OnDragOver($event, pin)\"\n (dragleave)=\"OnDragLeave()\"\n (drop)=\"OnDrop($event, pin)\"\n (dragend)=\"OnDragEnd()\"\n (click)=\"OnPinClick(pin)\">\n\n @if (EditMode) {\n <div class=\"edit-controls\">\n <div class=\"drag-handle\"><i class=\"fa-solid fa-grip-vertical\"></i></div>\n <div class=\"edit-card-actions\">\n <button class=\"edit-card-btn delete\" aria-label=\"Remove pin\" title=\"Remove pin\" (click)=\"RemovePin(pin.Id); $event.stopPropagation()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </div>\n }\n\n @if (pin.Thumbnail) {\n <div class=\"pin-thumbnail\">\n <img [src]=\"pin.Thumbnail\" [alt]=\"pin.DisplayName\" />\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n } @else if (pin.ResourceType === 'Actions') {\n <div class=\"pin-thumbnail action-mode\"\n [style.background]=\"'linear-gradient(135deg, ' + GetPinAccentColor(pin) + ' 0%, ' + GetPinAccentColor(pin) + 'cc 100%)'\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Run</button>\n </div>\n }\n </div>\n } @else {\n <div class=\"pin-thumbnail icon-mode\" [style.--pin-icon-color]=\"pin.Color || 'var(--mj-text-muted)'\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button class=\"open-btn\" (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n }\n\n <div class=\"pin-info\">\n @if (EditMode && EditingPinId === pin.Id) {\n <input class=\"pin-name-input\"\n [value]=\"pin.DisplayName\"\n (blur)=\"SavePinName(pin.Id, $event.target.value)\"\n (keydown.enter)=\"SavePinName(pin.Id, $event.target.value)\"\n (click)=\"$event.stopPropagation()\" />\n } @else {\n <div class=\"pin-name\" (click)=\"EditMode ? StartEditingPin(pin.Id, $event) : null\">\n {{ pin.DisplayName }}\n @if (!EditMode) {\n <button class=\"more-btn\" aria-label=\"Pin options\" title=\"Pin options\" (click)=\"$event.stopPropagation()\">\n <i class=\"fa-solid fa-ellipsis\"></i>\n </button>\n }\n </div>\n }\n <div class=\"pin-meta\">\n <i [class]=\"GetPinIcon(pin)\"></i>\n {{ GetResourceTypeLabel(pin) }}\n @if (pin.ApplicationName) {\n <span class=\"pin-app-badge\">{{ pin.ApplicationName }}</span>\n }\n </div>\n </div>\n </div>\n }\n }\n\n <!-- Add Pin card (edit mode) -->\n @if (EditMode) {\n <div class=\"add-pin-card\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Pin</span>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Pin Context Menu (ellipsis) -->\n @if (PinMenuVisible && PinMenuPin) {\n <div class=\"pin-context-menu\"\n [style.left.px]=\"PinMenuX\"\n [style.top.px]=\"PinMenuY\">\n <div class=\"pin-context-item\" (click)=\"OnPinMenuEdit()\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Edit</span>\n </div>\n <div class=\"pin-context-divider\"></div>\n <div class=\"pin-context-submenu\">\n <div class=\"pin-context-item submenu-header\">\n <i class=\"fa-solid fa-folder\"></i>\n <span>Move to Group</span>\n </div>\n @if (PinMenuPin.Group) {\n <div class=\"pin-context-item submenu-item\" (click)=\"OnPinMenuMoveToGroup(undefined)\">\n <span>(No group)</span>\n </div>\n }\n @for (group of PinGroups; track group) {\n @if (group !== PinMenuPin.Group) {\n <div class=\"pin-context-item submenu-item\" (click)=\"OnPinMenuMoveToGroup(group)\">\n <span>{{ group }}</span>\n </div>\n }\n }\n </div>\n <div class=\"pin-context-divider\"></div>\n <div class=\"pin-context-item danger\" (click)=\"OnPinMenuUnpin()\">\n <i class=\"fa-solid fa-thumbtack-slash\"></i>\n <span>Unpin</span>\n </div>\n </div>\n }\n\n <!-- Add Pin Slide-In Panel -->\n @if (AddPanelOpen) {\n <div class=\"slide-panel-backdrop\" (click)=\"CloseAddPinPanel()\"></div>\n <div class=\"slide-panel\">\n <div class=\"slide-panel-header\">\n <h3><i class=\"fa-solid fa-thumbtack\"></i> Add Pin</h3>\n <button class=\"slide-panel-close\" (click)=\"CloseAddPinPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"search-box\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input type=\"text\"\n placeholder=\"Search apps, dashboards, views, queries...\"\n [(ngModel)]=\"AddPanelSearchQuery\" />\n </div>\n </div>\n\n <div class=\"group-selector\">\n <label><i class=\"fa-solid fa-folder\"></i> Add to group:</label>\n <select [(ngModel)]=\"AddPanelSelectedGroup\">\n <option value=\"\">(No group)</option>\n @for (group of PinGroups; track group) {\n <option [value]=\"group\">{{ group }}</option>\n }\n <option value=\"__new__\">+ New group...</option>\n </select>\n </div>\n @if (AddPanelSelectedGroup === '__new__') {\n <div class=\"new-group-row\">\n <input class=\"new-group-input\"\n type=\"text\"\n placeholder=\"Enter new group name...\"\n [(ngModel)]=\"AddPanelNewGroupName\" />\n </div>\n }\n\n <div class=\"panel-results\">\n @if (AddPanelLoading) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading resources...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <!-- Apps with Nav Items -->\n @if (FilterApps().length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['apps']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('apps', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grid-2\"></i> Applications\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterApps().length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (app of FilterApps(); track app.appId) {\n <div class=\"panel-app-header\" [style.--panel-app-color]=\"app.color\">\n <div class=\"panel-app-icon\">\n <i [class]=\"app.icon\"></i>\n </div>\n <span class=\"panel-app-name\">{{ app.appName }}</span>\n </div>\n @for (ni of app.navItems; track ni.label) {\n <div class=\"panel-item panel-nav-item\">\n <div class=\"panel-item-icon\" [style.background]=\"'color-mix(in srgb, ' + app.color + ' 10%, var(--mj-bg-surface-card))'\">\n <i [class]=\"ni.icon\" [style.color]=\"app.color\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ ni.label }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (ni.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinAppNavItem(app.appName, app.icon, app.color, ni.label, ni.icon)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Dashboards (metadata-driven Config type only) -->\n @if (FilterPanelItems(AvailableDashboards).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['dashboards']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('dashboards', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-gauge-high\"></i> Dashboards\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableDashboards).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableDashboards); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-gauge-high\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('Dashboards', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Views -->\n @if (FilterPanelItems(AvailableViews).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['views']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('views', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-table-list\"></i> Views\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableViews).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableViews); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n <div class=\"panel-item-sub\">{{ item.entityName }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('User Views', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Queries -->\n @if (FilterPanelItems(AvailableQueries).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['queries']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('queries', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-database\"></i> Queries\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableQueries).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableQueries); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-database\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('Queries', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Quick Actions -->\n @if (FilterPanelItems(AvailableActions).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['actions']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('actions', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-bolt\"></i> Quick Actions\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableActions).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableActions); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-bolt\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n @if (item.description) {\n <div class=\"panel-item-sub\">{{ item.description }}</div>\n }\n </div>\n <div class=\"panel-item-action\">\n <button class=\"pin-btn\" (click)=\"OpenActionPinConfig(item.id, item.name, item.description)\">\n <i class=\"fa-solid fa-sliders\"></i> Configure\n </button>\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n }\n </div>\n </div>\n }\n\n <!-- Action Pin Dialogs -->\n <mj-action-pin-config-dialog\n [Visible]=\"ActionConfigDialogVisible\"\n [ActionID]=\"ActionConfigActionId\"\n [ActionName]=\"ActionConfigActionName\"\n [ActionDescription]=\"ActionConfigActionDescription\"\n (Result)=\"OnActionConfigResult($event)\">\n </mj-action-pin-config-dialog>\n\n <mj-action-pin-runner-dialog\n [Visible]=\"ActionRunnerDialogVisible\"\n [Pin]=\"ActionRunnerPin\"\n (Result)=\"OnActionRunnerResult($event)\">\n </mj-action-pin-runner-dialog>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading your applications...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Apps Grid -->\n @if (!isLoading) {\n <div class=\"apps-section\">\n <h2 class=\"section-title\">\n <i class=\"fa-solid fa-grid-2\"></i>\n My Applications\n </h2>\n <div class=\"apps-grid\">\n @for (appData of appsDisplayData; track trackByApp($index, appData)) {\n <div\n class=\"app-card\"\n [mjClickable]=\"appData.app.Name\"\n [testId]=\"'app-tile-' + appData.app.Name\"\n [style.--app-color]=\"appData.color\"\n (click)=\"onAppClick(appData.app)\">\n <!-- App Icon -->\n <div class=\"app-icon-wrapper\">\n <div class=\"app-icon\">\n <i [class]=\"appData.icon\"></i>\n </div>\n </div>\n <!-- App Info -->\n <div class=\"app-info\">\n <h3 class=\"app-name\">{{ appData.app.Name }}</h3>\n @if (appData.app.Description) {\n <p class=\"app-description\">{{ appData.app.Description }}</p>\n }\n <!-- Nav Items Preview -->\n @if (appData.navItemsCount > 0) {\n <div class=\"nav-preview\">\n @for (item of appData.navItemsPreview; track trackByNavItem($index, item)) {\n <div class=\"nav-item-chip\">\n <i [class]=\"item.Icon\"></i>\n <span>{{ item.Label }}</span>\n </div>\n }\n @if (appData.showMoreItems) {\n <span class=\"more-items\">\n +{{ appData.moreItemsCount }} more\n </span>\n }\n </div>\n }\n </div>\n <!-- Hover Arrow -->\n <div class=\"app-arrow\">\n <i class=\"fa-solid fa-arrow-right\"></i>\n </div>\n </div>\n }\n </div>\n <!-- Empty State -->\n @if (apps.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-folder-open\"\n Title=\"No Applications Available\"\n Message=\"You don't have any applications configured yet.\"\n ActionText=\"Configure Applications\"\n ActionIcon=\"fa-solid fa-gear\"\n (Action)=\"openConfigDialog()\" />\n }\n </div>\n }\n </div>\n\n <!-- Collapsible Right Sidebar -->\n @if (hasSidebarContent) {\n <div class=\"quick-access-sidebar\">\n <div class=\"sidebar-header\">\n <h3>\n <i class=\"fa-solid fa-bolt\"></i>\n Quick Access\n </h3>\n <button class=\"sidebar-close-btn\" (click)=\"toggleSidebar()\" title=\"Close panel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sidebar-content\">\n <!-- Unread Notifications Section -->\n @if (unreadNotifications.length > 0) {\n <div class=\"sidebar-section notifications-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-bell\"></i>\n Notifications\n <span class=\"section-badge\">{{ unreadNotifications.length }}</span>\n </h4>\n <div class=\"sidebar-items\">\n @for (notification of unreadNotifications; track trackByNotification($index, notification)) {\n <div\n class=\"sidebar-item notification-item\"\n [mjClickable]=\"notification.Title\"\n testId=\"notification-item\"\n (click)=\"onNotificationClick(notification)\">\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ notification.Title }}</span>\n <span class=\"sidebar-item-subtitle\">{{ notification.Message | slice:0:40 }}{{ (notification.Message?.length || 0) > 40 ? '...' : '' }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Favorites Section -->\n @if (favorites.length > 0 || favoritesLoading) {\n <div class=\"sidebar-section favorites-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-star\"></i>\n Favorites\n </h4>\n @if (!favoritesLoading) {\n <div class=\"sidebar-items\">\n @for (favorite of favorites; track trackByFavorite($index, favorite)) {\n <div\n class=\"sidebar-item favorite-item\"\n [mjClickable]=\"getFavoriteDisplayName(favorite)\"\n testId=\"favorite-item\"\n (click)=\"onFavoriteClick(favorite)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(favorite.Entity)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ getFavoriteDisplayName(favorite) }}</span>\n <span class=\"sidebar-item-subtitle\">{{ favorite.Entity }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (favoritesLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Recents Section -->\n @if (recentItems.length > 0 || recentsLoading) {\n <div class=\"sidebar-section recents-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent\n </h4>\n @if (!recentsLoading) {\n <div class=\"sidebar-items\">\n @for (item of recentItems; track trackByRecent($index, item)) {\n <div\n class=\"sidebar-item recent-item\"\n [mjClickable]=\"item.recordName || item.recordId\"\n testId=\"recent-item\"\n (click)=\"onRecentClick(item)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(item.entityName)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ item.recordName || item.recordId }}</span>\n <span class=\"sidebar-item-subtitle\">{{ item.entityName }} · {{ formatDate(item.latestAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (recentsLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Empty sidebar state -->\n @if (!favoritesLoading && !recentsLoading && unreadNotifications.length === 0 && favorites.length === 0 && recentItems.length === 0) {\n <mj-empty-state class=\"sidebar-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"No quick access items\" />\n }\n </div>\n </div>\n }\n\n <!-- Quick Access FAB Toggle (Fixed Button) -->\n @if (hasSidebarContent && !sidebarOpen) {\n <button class=\"sidebar-fab-toggle\"\n (click)=\"toggleSidebar()\"\n title=\"Quick Access\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (unreadNotifications.length > 0) {\n <span class=\"fab-badge\">{{ unreadNotifications.length }}</span>\n }\n </button>\n }\n\n <!-- App Configuration Dialog -->\n <mj-user-app-config\n #appConfigDialog\n [(ShowDialog)]=\"showConfigDialog\"\n (ConfigSaved)=\"onConfigSaved()\">\n </mj-user-app-config>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"home-dashboard.component.js","sourceRoot":"","sources":["../../src/Home/home-dashboard.component.ts","../../src/Home/home-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, AfterViewInit, OnDestroy, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy, ElementRef, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { BaseResourceComponent, NavigationService, RecentAccessService, RecentAccessItem, HomeAppPinService, HomeAppPinnedItem, HomeAppPinInput, ActionPinConfiguration, IsDashboardEntity, SafeDetectChanges, BuildDashboardPinInput } from '@memberjunction/ng-shared';\nimport { ResourceTypeForEntity } from '@memberjunction/ng-shared-generic';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey, EntityRecordNameInput, RunView, PermissionConstrainedError, LogError } from '@memberjunction/core';\nimport { ResourceData, MJUserFavoriteEntity, MJUserNotificationEntity, UserInfoEngine, DashboardEngine, UserViewEngine, QueryEngine } from '@memberjunction/core-entities';\nimport type { MJDashboardEntity } from '@memberjunction/core-entities';\nimport { ActionEngineBase } from '@memberjunction/actions-base';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { DASHBOARD_NAME_MAX_LENGTH } from '@memberjunction/ng-dashboard-viewer';\nimport type { DashboardNavRequestEvent } from '@memberjunction/ng-dashboard-viewer';\nimport { UserAppConfigComponent } from '@memberjunction/ng-explorer-settings';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { MJConfirmService } from '@memberjunction/ng-ui-components';\nimport type { DashboardEditorComponent } from '../DashboardEditor/dashboard-editor.component';\nimport { ActionPinConfigResult } from './action-pin-config-dialog.component';\nimport { ActionPinRunResult } from './action-pin-runner-dialog.component';\nimport { BuildHomeAgentContext, BuildHomeNotFoundError, ResolveNamedRecord, NamedRecord, RecentItemSummary } from './home-agent-context';\nimport { MenuAnchor, MenuAnchorOf, NextMenuFocusIndex, PlaceMenu } from './home-menus';\nimport {\n BuildPinDashboardNames,\n BuildPinnedDashboards,\n CanShowInHome,\n DashboardIdOfPin,\n FindDashboard,\n HomeSwitcherDashboard,\n ResolvePinnedDashboardReference,\n ResolvePinResourceType,\n} from './home-pinned-dashboards';\nimport { AgentToolResult, ValidateStringParam } from '../shared/agent-tool-validation';\nimport { ObserveDashboardLibraryChanges } from '../shared/dashboard-library-changes';\nimport { AutoInstallDashboardsApp, CreateBlankDashboard, DashboardNameMaxLength, EnsureDashboardsApp } from '../shared/dashboards-app.helpers';\n\n/** User setting for the Pinned section: 'true' when collapsed, 'false' when open. A missing setting means open. */\nconst PINNED_COLLAPSED_SETTING = 'HomeApp.PinnedCollapsed';\n\n/** The query param that names the dashboard Home shows in place of its overview. */\nconst DASHBOARD_QUERY_PARAM = 'dashboard';\n\n/** The dashboard view's title: the switcher button that names the open dashboard. */\nconst DASHBOARD_TITLE_SELECTOR = '.dashboard-title .switcher-title';\n\n/** The notice when Home cannot show the dashboard the URL or the editor names. */\nconst DASHBOARD_NOT_AVAILABLE = 'That dashboard is not available';\n\n/** The name the SwitchHomeDashboard agent tool takes for Home's overview (any letter case). */\nconst HOME_OVERVIEW_NAME = 'Home';\n\n/** Width of the pin options menu, in pixels. */\nconst PIN_MENU_WIDTH = 220;\n\n/** Process-wide counter for the ids that label each Home's pin menu groups. */\nlet nextPinMenuUid = 0;\n\n/** One run of pins in the grid: the ungrouped pins (Group null), or the pins of one group. */\ninterface HomePinSection {\n Key: string;\n Group: string | null;\n Pins: HomeAppPinnedItem[];\n}\n\n/** A pin and the name it shows, for the agent's name resolver. */\ninterface PinRecord extends NamedRecord {\n Pin: HomeAppPinnedItem;\n}\n\n/**\n * Cached app data with pre-computed values for optimal rendering performance\n */\ninterface AppDisplayData {\n app: BaseApplication;\n color: string;\n icon: string;\n navItemsCount: number;\n navItemsPreview: { Label: string; Icon: string }[];\n showMoreItems: boolean;\n moreItemsCount: number;\n}\n\n/**\n * Home Dashboard - Personalized home screen showing all available applications\n * with quick access navigation and configuration options.\n *\n * Uses OnPush change detection and cached computed values for optimal performance.\n * Registered as a BaseResourceComponent so it can be used as a Custom resource type\n * in nav items, allowing users to return to the Home dashboard after viewing orphan resources.\n */\n@Component({\n standalone: false,\n selector: 'mj-home-dashboard',\n templateUrl: './home-dashboard.component.html',\n styleUrls: ['./home-dashboard.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\n@RegisterClass(BaseResourceComponent, 'HomeDashboard')\nexport class HomeDashboardComponent extends BaseResourceComponent implements AfterViewInit, OnDestroy {\n protected override destroy$ = new Subject<void>();\n private metadata = this.ProviderToUse;\n private pinService = inject(HomeAppPinService);\n private confirmService = inject(MJConfirmService);\n private hostElement = inject<ElementRef<HTMLElement>>(ElementRef);\n\n @ViewChild('appConfigDialog') AppConfigDialog!: UserAppConfigComponent;\n @ViewChild('pinMenu') private pinMenuEl?: ElementRef<HTMLElement>;\n @ViewChild('dashboardEditor') private dashboardEditor?: DashboardEditorComponent;\n\n /** @deprecated Use {@link AppConfigDialog}. */\n get appConfigDialog(): UserAppConfigComponent {\n return this.AppConfigDialog;\n }\n /** @deprecated Use {@link AppConfigDialog}. */\n set appConfigDialog(value: UserAppConfigComponent) {\n this.AppConfigDialog = value;\n }\n\n // State\n /** True until Home's first load finishes; the page shows its loading view meanwhile. A later app-list reload does not set it. */\n public isLoading = true;\n public Apps: BaseApplication[] = [];\n\n /** @deprecated Use {@link Apps}. */\n public get apps(): BaseApplication[] {\n return this.Apps;\n }\n /** @deprecated Use {@link Apps}. */\n public set apps(value: BaseApplication[]) {\n this.Apps = value;\n }\n public AppsDisplayData: AppDisplayData[] = [];\n\n /** @deprecated Use {@link AppsDisplayData}. */\n public get appsDisplayData(): AppDisplayData[] {\n return this.AppsDisplayData;\n }\n /** @deprecated Use {@link AppsDisplayData}. */\n public set appsDisplayData(value: AppDisplayData[]) {\n this.AppsDisplayData = value;\n } // Pre-computed display data\n public CurrentUser: { Name: string; Email: string; FirstName?: string } | null = null;\n\n /** @deprecated Use {@link CurrentUser}. */\n public get currentUser(): { Name: string; Email: string; FirstName?: string } | null {\n return this.CurrentUser;\n }\n /** @deprecated Use {@link CurrentUser}. */\n public set currentUser(value: { Name: string; Email: string; FirstName?: string } | null) {\n this.CurrentUser = value;\n }\n public ShowConfigDialog = false;\n\n /** @deprecated Use {@link ShowConfigDialog}. */\n public get showConfigDialog() {\n return this.ShowConfigDialog;\n }\n /** @deprecated Use {@link ShowConfigDialog}. */\n public set showConfigDialog(value) {\n this.ShowConfigDialog = value;\n }\n\n // Favorites\n public Favorites: MJUserFavoriteEntity[] = [];\n\n /** @deprecated Use {@link Favorites}. */\n public get favorites(): MJUserFavoriteEntity[] {\n return this.Favorites;\n }\n /** @deprecated Use {@link Favorites}. */\n public set favorites(value: MJUserFavoriteEntity[]) {\n this.Favorites = value;\n }\n public FavoritesLoading = true;\n\n /** @deprecated Use {@link FavoritesLoading}. */\n public get favoritesLoading() {\n return this.FavoritesLoading;\n }\n /** @deprecated Use {@link FavoritesLoading}. */\n public set favoritesLoading(value) {\n this.FavoritesLoading = value;\n }\n\n // Recents\n public RecentItems: RecentAccessItem[] = [];\n\n /** @deprecated Use {@link RecentItems}. */\n public get recentItems(): RecentAccessItem[] {\n return this.RecentItems;\n }\n /** @deprecated Use {@link RecentItems}. */\n public set recentItems(value: RecentAccessItem[]) {\n this.RecentItems = value;\n }\n public RecentsLoading = true;\n\n /** @deprecated Use {@link RecentsLoading}. */\n public get recentsLoading() {\n return this.RecentsLoading;\n }\n /** @deprecated Use {@link RecentsLoading}. */\n public set recentsLoading(value) {\n this.RecentsLoading = value;\n }\n\n // Notifications\n public UnreadNotifications: MJUserNotificationEntity[] = [];\n\n /** @deprecated Use {@link UnreadNotifications}. */\n public get unreadNotifications(): MJUserNotificationEntity[] {\n return this.UnreadNotifications;\n }\n /** @deprecated Use {@link UnreadNotifications}. */\n public set unreadNotifications(value: MJUserNotificationEntity[]) {\n this.UnreadNotifications = value;\n }\n public NotificationsLoading = true;\n\n /** @deprecated Use {@link NotificationsLoading}. */\n public get notificationsLoading() {\n return this.NotificationsLoading;\n }\n /** @deprecated Use {@link NotificationsLoading}. */\n public set notificationsLoading(value) {\n this.NotificationsLoading = value;\n }\n\n // Sidebar state - default closed on all screen sizes\n public SidebarOpen = false;\n\n /** @deprecated Use {@link SidebarOpen}. */\n public get sidebarOpen() {\n return this.SidebarOpen;\n }\n /** @deprecated Use {@link SidebarOpen}. */\n public set sidebarOpen(value) {\n this.SidebarOpen = value;\n }\n\n // Pin empty-state dismissal preference (persisted in UserSettings via UserInfoEngine)\n public HidePinEmptyState = false;\n\n /** Whether the Pinned section is open. Saved for each user in the HomeApp.PinnedCollapsed setting. */\n public PinnedExpanded = true;\n\n // Pin state\n public PinnedItems: HomeAppPinnedItem[] = [];\n public UngroupedPins: HomeAppPinnedItem[] = [];\n public PinGroups: string[] = [];\n /** The pin grid's runs: ungrouped pins first, then each group in group order. */\n public PinSections: HomePinSection[] = [];\n public EditMode = false;\n public AddPanelOpen = false;\n public AddPanelSearchQuery = '';\n public AddPanelSelectedGroup = '';\n public AddPanelNewGroupName = '';\n public EditingPinId: string | null = null;\n public EditingGroupName: string | null = null;\n\n // Add pin panel - available resources\n public AvailableDashboards: { id: string; name: string; pinned: boolean }[] = [];\n public AvailableViews: { id: string; name: string; entityName: string; pinned: boolean }[] = [];\n public AvailableQueries: { id: string; name: string; pinned: boolean }[] = [];\n public AvailableActions: { id: string; name: string; description: string; pinned: boolean }[] = [];\n public AvailableApps: { appId: string; appName: string; icon: string; color: string; navItems: { label: string; icon: string; pinned: boolean }[] }[] = [];\n public AddPanelLoading = false;\n\n // Action pin dialog state\n public ActionConfigDialogVisible = false;\n public ActionConfigActionId: string | null = null;\n public ActionConfigActionName: string | null = null;\n public ActionConfigActionDescription: string | null = null;\n\n public ActionRunnerDialogVisible = false;\n public ActionRunnerPin: HomeAppPinnedItem | null = null;\n\n // Collapsible section state for Add Pin panel\n public PanelSectionCollapsed: Record<string, boolean> = {};\n\n // Pin context menu (ellipsis)\n public PinMenuVisible = false;\n public PinMenuX = 0;\n public PinMenuY = 0;\n /** The pin menu's max height in pixels: the room on its side of the button. Null while the menu is measured. */\n public PinMenuMaxHeight: number | null = null;\n public PinMenuPin: HomeAppPinnedItem | null = null;\n /** Id of the menu's \"Move to Group\" header, which names the group rows. */\n public readonly PinMenuGroupLabelId = `home-pin-menu-groups-${nextPinMenuUid++}`;\n /** The ellipsis button that opened the pin options menu. Escape and Tab put focus back on it. */\n private pinMenuTrigger: HTMLElement | null = null;\n\n // Whether the Add Pin panel found the Data Explorer app. Query pins then open in its Queries nav item.\n public HasDataExplorerApp = false;\n\n // Dashboard view: a pinned dashboard shown in place of the overview\n /** The dashboard Home shows in place of its overview, or null on the overview. */\n public CurrentDashboard: MJDashboardEntity | null = null;\n /** ID of that dashboard, or null. */\n public CurrentDashboardId: string | null = null;\n /** True when the dashboard view opens in edit mode. The editor reads it once, then sets it back to false. */\n public DashboardStartsInEditMode = false;\n /** True while the dashboard Home shows is in edit mode. */\n public IsDashboardEditing = false;\n /** The pinned Config dashboards, in pin order, for the Dashboards switcher. */\n public PinnedDashboards: HomeSwitcherDashboard[] = [];\n /** The names dashboard pins show, by pin id: their dashboards' names from the dashboard cache. */\n private pinDashboardNames = new Map<string, string>();\n /** True once the first load of the dashboard cache has finished, also when it failed. */\n private dashboardCacheLoaded = false;\n /** The dashboard the URL asks for; shown once the dashboard cache has loaded. */\n private requestedDashboardId: string | null = null;\n /**\n * The dashboard Home shows because a URL change named it: back, forward or a deep link into the open tab. When the\n * editor cannot show it, Home leaves the URL as it is. Home's first load does not set it, and any other change of the\n * shown dashboard clears it.\n */\n private urlShownDashboardId: string | null = null;\n /**\n * The dashboard whose title gets focus when the editor has shown it: one the user picked in a switcher or opened from a\n * pin, or one an agent showed after its switch removed the part of Home that had focus.\n */\n private focusTitleOnLoad: string | null = null;\n\n // New dashboard: the name dialog\n /** True while the New dashboard name dialog is open. */\n public ShowNewDashboardDialog = false;\n /** True while the named dashboard is being created. */\n public IsCreatingDashboard = false;\n /** The longest name the dialog accepts. */\n public NewDashboardNameMaxLength = DASHBOARD_NAME_MAX_LENGTH;\n\n // Drag state\n public DraggingPinId: string | null = null;\n public DragOverPinId: string | null = null;\n\n // Cached icon lookups to avoid repeated method calls\n private favoriteIconCache = new Map<string, string>();\n private resourceIconCache = new Map<string, string>();\n\n // Resolved display names for favorites (keyed by favorite ID)\n public FavoriteDisplayNames = new Map<string, string>();\n\n /** @deprecated Use {@link FavoriteDisplayNames}. */\n public get favoriteDisplayNames() {\n return this.FavoriteDisplayNames;\n }\n /** @deprecated Use {@link FavoriteDisplayNames}. */\n public set favoriteDisplayNames(value) {\n this.FavoriteDisplayNames = value;\n }\n\n /** True when Home shows its overview: the greeting, Pinned and My applications. */\n public get ShowOverview(): boolean {\n return !this.isLoading && !this.CurrentDashboard;\n }\n\n /** True when Home shows a dashboard in place of its overview. */\n public get ShowDashboardView(): boolean {\n return !this.isLoading && this.CurrentDashboard !== null;\n }\n\n /** The Quick Access button and sidebar show on the overview only: in the dashboard view the button would cover the header's actions. */\n public get ShowQuickAccess(): boolean {\n return this.HasSidebarContent && !this.CurrentDashboard;\n }\n\n /** The name of the dashboard Home shows, from the dashboard cache; null on the overview. */\n public get CurrentDashboardName(): string | null {\n return this.CurrentDashboardId ? this.cachedDashboardName(this.CurrentDashboardId) : null;\n }\n\n /** True while the dashboard Home shows is in edit mode (see BaseResourceComponent.IsEditing). */\n public override IsEditing(): boolean {\n return this.IsDashboardEditing;\n }\n\n /**\n * Check if sidebar has any content to show\n */\n get HasSidebarContent(): boolean {\n return this.UnreadNotifications.length > 0 ||\n this.Favorites.length > 0 ||\n this.RecentItems.length > 0 ||\n this.FavoritesLoading ||\n this.RecentsLoading;\n }\n\n /** @deprecated Use {@link HasSidebarContent}. */\n get hasSidebarContent(): boolean {\n return this.HasSidebarContent;\n }\n\n /**\n * Opens or closes the Quick Access sidebar and marks Home for check, so the change shows at the next render also\n * when the agent's ToggleSidebar tool calls this outside a template event.\n */\n ToggleSidebar(): void {\n this.SidebarOpen = !this.SidebarOpen;\n this.cdr.markForCheck();\n }\n\n /** @deprecated Use {@link ToggleSidebar}. */\n toggleSidebar(): void {\n return this.ToggleSidebar();\n }\n\n /**\n * Check if current device is mobile (width <= 768px)\n */\n private isMobileDevice(): boolean {\n return typeof window !== 'undefined' && window.innerWidth <= 768;\n }\n\n constructor(\n private appManager: ApplicationManager,\n private recentAccessService: RecentAccessService,\n private cdr: ChangeDetectorRef\n ) {\n super();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Home';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return '';\n }\n\n async ngAfterViewInit(): Promise<void> {\n // Get current user info\n this.CurrentUser = {\n Name: this.metadata.CurrentUser?.Name || 'User',\n Email: this.metadata.CurrentUser?.Email || '',\n FirstName: this.metadata.CurrentUser?.FirstName || ''\n };\n this.loadSectionStates();\n\n // The dashboard the tab's data names, for when the query-param stream has not delivered one\n const initialDashboard = this.GetQueryParams()[DASHBOARD_QUERY_PARAM]?.trim();\n if (initialDashboard && !this.requestedDashboardId) {\n this.requestedDashboardId = initialDashboard;\n }\n\n // The Dashboards part of the first load: the automatic app install and the dashboard cache\n const dashboardsLoad = this.loadDashboards();\n\n // Subscribe to applications list, filtering out the Home app. The loading view shows during the first load\n // only: a later reload of the list (an app install) keeps the page as it is, so an open dashboard and its edit\n // stay, and the overview keeps its apps until the new list arrives.\n this.appManager.Applications\n .pipe(takeUntil(this.destroy$))\n .subscribe(async apps => {\n // Exclude the Home app from the list (users are already on Home)\n this.Apps = apps.filter(app => app.Name !== 'Home');\n\n // Pre-compute display data for all apps\n await this.computeAppsDisplayData();\n\n // The page shows once the Dashboards part of the first load is done (see loadDashboards)\n await dashboardsLoad;\n\n this.isLoading = false;\n this.NotifyLoadComplete();\n\n // Apps changed → keep the agent's view of the launcher in sync.\n this.publishAgentContext();\n\n this.cdr.markForCheck();\n });\n\n // Subscribe to unread notifications\n MJNotificationService.Notifications$\n .pipe(takeUntil(this.destroy$))\n .subscribe(notifications => {\n this.UnreadNotifications = notifications.filter(n => n.Unread).slice(0, 5);\n this.NotificationsLoading = false;\n this.publishAgentContext();\n this.cdr.markForCheck();\n });\n\n // Subscribe to recent items\n this.recentAccessService.RecentItems\n .pipe(takeUntil(this.destroy$))\n .subscribe(items => {\n this.RecentItems = this.deduplicateRecents(items).slice(0, 5);\n this.RecentsLoading = false;\n this.publishAgentContext();\n this.cdr.markForCheck();\n });\n\n // The switcher, the dashboard pin names and the open dashboard follow changes to the dashboard cache\n ObserveDashboardLibraryChanges()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.refreshPinnedDashboards());\n\n // Favorites and recents load asynchronously in the sidebar\n this.NotifyLoadComplete();\n\n // Load favorites and recents asynchronously (don't block rendering)\n this.loadFavorites();\n this.loadRecents();\n\n // Load pin empty-state dismissal preference\n const hideSetting = UserInfoEngine.Instance.GetSetting('HomeApp.HidePinEmptyState');\n this.HidePinEmptyState = hideSetting === 'true';\n\n // Load pinned items\n await this.pinService.LoadPins();\n this.pinService.Pins$\n .pipe(takeUntil(this.destroy$))\n .subscribe(pins => {\n this.PinnedItems = pins;\n this.UngroupedPins = this.pinService.GetUngroupedPins();\n this.PinGroups = this.pinService.GetGroups();\n this.PinSections = [\n { Key: 'ungrouped', Group: null, Pins: this.UngroupedPins },\n ...this.PinGroups.map(group => ({ Key: `group:${group}`, Group: group, Pins: this.pinService.GetPinsInGroup(group) })),\n ];\n this.refreshPinnedDashboards();\n });\n\n // Resolve display names for record-type pins that have raw ID titles\n this.resolveRecordPinNames();\n\n // Resolve missing icons for Custom pins\n this.resolveCustomPinIcons();\n\n // Pre-warm engines used by the Add Pin panel so the first click feels instant.\n // DashboardEngine and QueryEngine already auto-start; UserViewEngine and ActionEngineBase\n // don't, so kick them off in the background (fire-and-forget — Config(false) is idempotent\n // and they cache their results, so a subsequent OpenAddPinPanel() call will be a no-op).\n UserViewEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse)\n .catch(err => console.warn('[Home] UserViewEngine pre-warm failed', err));\n ActionEngineBase.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse)\n .catch(err => console.warn('[Home] ActionEngineBase pre-warm failed', err));\n\n // Publish the initial agent context and register the client tools the AI agent\n // can invoke against the Home surface. Ongoing re-emits happen in the subscriptions\n // above (apps, notifications, recents, pins).\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n // ========================================\n //\n // 🚨 SAFETY BOUNDARY: the Home dashboard exposes ONLY navigation / discovery /\n // panel-toggle operations to the agent. No pin create, no pin delete, no pin\n // rename, no group mutation, no reordering, and no dashboard create, rename,\n // edit, save or delete — those are user-confirm-driven or destructive and stay\n // in the UI. Home registers no dashboard edit tools for the dashboard it shows\n // (those are on the dashboard tab). Every tool below maps to the exact same\n // component method a user click would call (OpenApp→OnAppClick, OpenPin→openPin,\n // which a pin click calls, SwitchHomeDashboard→OpenDashboardInHome / GoHome,\n // which a switcher pick calls, search→AddPanel search field, panel/sidebar/\n // edit-mode toggles). Leaving a dashboard with unsaved changes asks the user\n // first, as it does for a click. Handlers are tolerant: they never throw,\n // returning { Success, Data?, ErrorMessage? }.\n\n /**\n * Publish the current Home dashboard state to the AI agent via NavigationService.\n * The shaping lives in the pure {@link buildHomeAgentContext} helper so it stays\n * unit-testable. Called on init and on every meaningful state change.\n */\n private publishAgentContext(): void {\n const context = BuildHomeAgentContext({\n AppCount: this.Apps.length,\n VisibleAppCount: this.AppsDisplayData.length,\n AppNames: this.Apps.map(a => a.Name),\n PinnedItemCount: this.PinnedItems.length,\n PinGroupCount: this.PinGroups.length,\n PinGroupNames: this.PinGroups,\n PinNames: this.PinnedItems.map(p => this.PinName(p)),\n UnreadNotifications: this.UnreadNotifications.length,\n NotificationTitles: this.UnreadNotifications.map(n => n.Title ?? '(untitled)'),\n RecentItemsCount: this.RecentItems.length,\n RecentItems: this.buildRecentItemSummaries(),\n EditMode: this.EditMode,\n AddPanelOpen: this.AddPanelOpen,\n SidebarOpen: this.SidebarOpen,\n AddPanelSearchQuery: this.AddPanelSearchQuery,\n PinnedCollapsed: !this.PinnedExpanded,\n CurrentDashboardName: this.CurrentDashboardName,\n CurrentDashboardID: this.CurrentDashboardId,\n IsEditingDashboard: this.IsDashboardEditing,\n PinnedDashboardNames: this.PinnedDashboards.map(d => d.Name),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /** Structured recent-item summaries (display name + resource type) for the agent context. */\n private buildRecentItemSummaries(): RecentItemSummary[] {\n return this.RecentItems.map(item => ({\n Name: item.recordName || item.entityName || item.recordId,\n ResourceType: item.resourceType,\n }));\n }\n\n /**\n * Register the client tools the AI agent can invoke against the Home dashboard.\n * All are navigation / discovery / panel-toggle operations (see SAFETY BOUNDARY\n * above). Each handler delegates to the same component method a user interaction\n * would call and returns a tolerant result.\n *\n * Tools:\n * - OpenApp: switch to an application by name (exact or partial match).\n * - OpenPin: open a pinned item by the name it shows (exact or partial match). A pinned dashboard opens inside Home.\n * - SearchPins: find pinned items by a name query (read-only — returns matches).\n * - OpenRecent: open a recently-accessed item by display name (read-only navigation).\n * - SearchAddPinPanel: open the Add Pin panel (if needed) and apply a search query.\n * - ClearAddPinPanelSearch: clear the Add Pin panel search query.\n * - OpenAddPinPanel / CloseAddPinPanel: toggle the Add Pin panel.\n * - ToggleSidebar: toggle the notifications/favorites/recents sidebar (on the overview only).\n * - TogglePinEditMode: toggle pin edit mode (reorder/rename UI affordances; on the overview only).\n * - SwitchHomeDashboard: show a pinned dashboard inside Home by its name (exact or partial match) or id, or \"Home\"\n * for the overview.\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenApp',\n Description: 'Switch to an application by its name (e.g. \"Data Explorer\", \"Knowledge Hub\").',\n ParameterSchema: { type: 'object', properties: { appName: { type: 'string' } }, required: ['appName'] },\n Handler: async (params: Record<string, unknown>) => this.toolOpenApp(params),\n },\n {\n Name: 'OpenPin',\n Description: 'Open a pinned item on the Home screen by the name it shows (exact or partial match). A pinned dashboard opens inside Home; other pins open as before.',\n ParameterSchema: { type: 'object', properties: { pinName: { type: 'string' } }, required: ['pinName'] },\n Handler: async (params: Record<string, unknown>) => this.toolOpenPin(params),\n },\n {\n Name: 'SearchPins',\n Description: 'Find pinned items on the Home screen whose name, as the pin shows it, matches a query (case-insensitive contains). Read-only — returns the matching pin names; does not open anything.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearchPins(params),\n },\n {\n Name: 'OpenRecent',\n Description: 'Open a recently-accessed item from the Home sidebar by its display name (exact or partial match). Read-only navigation.',\n ParameterSchema: { type: 'object', properties: { name: { type: 'string' } }, required: ['name'] },\n Handler: async (params: Record<string, unknown>) => this.toolOpenRecent(params),\n },\n {\n Name: 'SearchAddPinPanel',\n Description: 'Open the Add Pin panel (if not already open) and filter its available resources by a search query.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearchAddPinPanel(params),\n },\n {\n Name: 'ClearAddPinPanelSearch',\n Description: 'Clear the search query in the Add Pin panel.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.toolClearAddPinPanelSearch(),\n },\n {\n Name: 'OpenAddPinPanel',\n Description: 'Open the Add Pin panel so the user can browse pinnable resources.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.OpenAddPinPanel();\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'CloseAddPinPanel',\n Description: 'Close the Add Pin panel.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.CloseAddPinPanel();\n this.publishAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'ToggleSidebar',\n Description: `Toggle the Home sidebar (unread notifications, favorites, and recent items). Quick Access shows on the ${HOME_OVERVIEW_NAME} overview only: while Home shows a dashboard, use SwitchHomeDashboard with \"${HOME_OVERVIEW_NAME}\" first.`,\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.toolToggleSidebar(),\n },\n {\n Name: 'TogglePinEditMode',\n Description: `Toggle pin edit mode on the Home overview (lets the user rename/reorder pins). This only changes the UI mode — it does not modify any pins. Pin edit mode shows on the ${HOME_OVERVIEW_NAME} overview only: while Home shows a dashboard, use SwitchHomeDashboard with \"${HOME_OVERVIEW_NAME}\" first.`,\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => this.toolTogglePinEditMode(),\n },\n {\n Name: 'SwitchHomeDashboard',\n Description: `Show a pinned dashboard inside Home by its name (exact or partial match) or id, or \"${HOME_OVERVIEW_NAME}\" to return to the Home overview. Navigation only — it does not pin, unpin, rename or edit dashboards. When the open dashboard has unsaved changes, the user is asked first.`,\n ParameterSchema: { type: 'object', properties: { dashboard: { type: 'string' } }, required: ['dashboard'] },\n Handler: async (params: Record<string, unknown>) => this.toolSwitchHomeDashboard(params),\n },\n ]);\n }\n\n /** Resolve an app by name (exact then partial, case-insensitive) and switch to it. */\n private async toolOpenApp(params: Record<string, unknown>): Promise<AgentToolResult & { Data?: Record<string, unknown> }> {\n const parsed = ValidateStringParam(params['appName'], 'appName');\n if (!parsed.ok) {\n return parsed.result;\n }\n const appName = parsed.value.trim();\n if (!appName) {\n return { Success: false, ErrorMessage: 'appName is required.' };\n }\n const candidates: NamedRecord[] = this.Apps.map(a => ({ Name: a.Name }));\n const match = ResolveNamedRecord(appName, candidates);\n if (!match) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(appName, 'app', candidates) };\n }\n const app = this.Apps.find(a => a.Name === match.Name);\n if (!app) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(appName, 'app', candidates) };\n }\n await this.OnAppClick(app);\n return { Success: true, Data: { AppName: app.Name } };\n }\n\n /** The pinned items with the names they show, for the resolver. */\n private get pinNamedRecords(): PinRecord[] {\n return this.PinnedItems.map(pin => ({ Name: this.PinName(pin), Pin: pin }));\n }\n\n /**\n * Resolve a pinned item by the name it shows (exact then partial, case-insensitive) and open it. A pinned dashboard\n * opens inside Home. Focus stays where it is unless the change removed it (see refocusIfRemoved).\n */\n private async toolOpenPin(params: Record<string, unknown>): Promise<AgentToolResult & { Data?: Record<string, unknown> }> {\n const parsed = ValidateStringParam(params['pinName'], 'pinName');\n if (!parsed.ok) {\n return parsed.result;\n }\n const pinName = parsed.value.trim();\n if (!pinName) {\n return { Success: false, ErrorMessage: 'pinName is required.' };\n }\n const records = this.pinNamedRecords;\n const match = ResolveNamedRecord(pinName, records);\n if (!match) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(pinName, 'pinned item', records) };\n }\n const opened = await this.switchViewForAgent(() => this.leaveEditModeAndOpenPin(match.Pin));\n if (!opened) {\n return { Success: false, ErrorMessage: `\"${match.Name}\" did not open. The pin may be broken, or the user kept editing the open dashboard.` };\n }\n return { Success: true, Data: { PinName: match.Name } };\n }\n\n /** Opens a pin for the agent. A pin does not open in edit mode: Home leaves it first, as Done does, and tells the agent. */\n private leaveEditModeAndOpenPin(pin: HomeAppPinnedItem): Promise<boolean> {\n if (this.EditMode) {\n this.ToggleEditMode();\n this.publishAgentContext();\n }\n return this.openPin(pin);\n }\n\n /** Find pinned items whose shown name matches a query (read-only — returns matches). */\n private toolSearchPins(params: Record<string, unknown>): AgentToolResult & { Data?: Record<string, unknown> } {\n const parsed = ValidateStringParam(params['query'], 'query');\n if (!parsed.ok) {\n return parsed.result;\n }\n const query = parsed.value.trim().toLowerCase();\n const names = this.PinnedItems.map(p => this.PinName(p));\n const matches = query ? names.filter(name => name.toLowerCase().includes(query)) : names;\n return { Success: true, Data: { Matches: matches, MatchCount: matches.length } };\n }\n\n /** Resolve a recent item by display name (exact then partial) and navigate to it. */\n private toolOpenRecent(params: Record<string, unknown>): AgentToolResult & { Data?: Record<string, unknown> } {\n const parsed = ValidateStringParam(params['name'], 'name');\n if (!parsed.ok) {\n return parsed.result;\n }\n const name = parsed.value.trim();\n if (!name) {\n return { Success: false, ErrorMessage: 'name is required.' };\n }\n // Build the same display name the context publishes, then resolve against it.\n const named: NamedRecord[] = this.RecentItems.map(item => ({\n Name: item.recordName || item.entityName || item.recordId,\n }));\n const match = ResolveNamedRecord(name, named);\n if (!match) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(name, 'recent item', named) };\n }\n const idx = named.findIndex(n => n.Name === match.Name);\n const item = this.RecentItems[idx];\n if (!item) {\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(name, 'recent item', named) };\n }\n this.OnRecentClick(item);\n return { Success: true, Data: { Name: match.Name, ResourceType: item.resourceType } };\n }\n\n /**\n * Shows a pinned dashboard in Home by id (any letter case) or name (exact, then partial), or the overview for\n * \"Home\". It uses the methods a switcher pick uses, so the user is asked first about unsaved changes. Unlike a pick,\n * it moves focus only when the switch removed it (see refocusIfRemoved).\n */\n private async toolSwitchHomeDashboard(params: Record<string, unknown>): Promise<AgentToolResult & { Data?: Record<string, unknown> }> {\n const parsed = ValidateStringParam(params['dashboard'], 'dashboard');\n if (!parsed.ok) {\n return parsed.result;\n }\n const reference = parsed.value.trim();\n if (!reference) {\n return { Success: false, ErrorMessage: 'dashboard is required.' };\n }\n if (reference.toLowerCase() === HOME_OVERVIEW_NAME.toLowerCase()) {\n return (await this.switchViewForAgent(() => this.GoHome()))\n ? { Success: true, Data: { HomeView: 'Overview' } }\n : { Success: false, ErrorMessage: `The ${HOME_OVERVIEW_NAME} overview did not open. The user kept editing the open dashboard.` };\n }\n const target = ResolvePinnedDashboardReference(reference, this.PinnedDashboards);\n if (!target) {\n const candidates: NamedRecord[] = [{ Name: HOME_OVERVIEW_NAME }, ...this.PinnedDashboards.map(d => ({ Name: d.Name }))];\n return { Success: false, ErrorMessage: BuildHomeNotFoundError(reference, 'pinned dashboard', candidates) };\n }\n // The switcher's list can trail the dashboard cache by a moment\n if (!this.findHomeDashboard(target.ID)) {\n return { Success: false, ErrorMessage: `\"${target.Name}\" did not open. The dashboard is not available.` };\n }\n if (!(await this.switchViewForAgent(() => this.OpenDashboardInHome(target.ID)))) {\n return { Success: false, ErrorMessage: `\"${target.Name}\" did not open. The user kept editing the open dashboard.` };\n }\n return { Success: true, Data: { CurrentDashboardName: target.Name } };\n }\n\n /** Opens or closes Quick Access. While a dashboard shows, where Quick Access does not show, it changes nothing. */\n private toolToggleSidebar(): AgentToolResult & { Data?: Record<string, unknown> } {\n if (this.CurrentDashboardId) {\n return { Success: false, ErrorMessage: overviewOnlyError('Quick Access') };\n }\n this.ToggleSidebar();\n this.publishAgentContext();\n return { Success: true, Data: { SidebarOpen: this.SidebarOpen } };\n }\n\n /**\n * Turns pin edit mode on or off. While a dashboard shows, where the pins do not show, it changes nothing: it neither\n * opens a collapsed Pinned section nor saves that.\n */\n private toolTogglePinEditMode(): AgentToolResult & { Data?: Record<string, unknown> } {\n if (this.CurrentDashboardId) {\n return { Success: false, ErrorMessage: overviewOnlyError('Pin edit mode') };\n }\n this.ToggleEditMode();\n this.publishAgentContext();\n return { Success: true, Data: { EditMode: this.EditMode } };\n }\n\n /** Open the Add Pin panel (if needed) and apply a search query. */\n private async toolSearchAddPinPanel(params: Record<string, unknown>): Promise<AgentToolResult & { Data?: Record<string, unknown> }> {\n const parsed = ValidateStringParam(params['query'], 'query');\n if (!parsed.ok) {\n return parsed.result;\n }\n if (!this.AddPanelOpen) {\n await this.OpenAddPinPanel();\n }\n this.AddPanelSearchQuery = parsed.value;\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true, Data: { Query: parsed.value } };\n }\n\n /** Clear the Add Pin panel search query. */\n private toolClearAddPinPanelSearch(): AgentToolResult {\n this.AddPanelSearchQuery = '';\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true };\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get a greeting based on time of day\n */\n get Greeting(): string {\n const hour = new Date().getHours();\n if (hour < 12) return 'Good morning';\n if (hour < 17) return 'Good afternoon';\n return 'Good evening';\n }\n\n /** @deprecated Use {@link Greeting}. */\n get greeting(): string {\n return this.Greeting;\n }\n\n /** The first name the greeting uses, or the user's display name. */\n public get GreetingName(): string {\n return this.CurrentUser?.FirstName || this.CurrentUser?.Name || 'User';\n }\n\n /**\n * Get formatted date string\n */\n get FormattedDate(): string {\n return new Date().toLocaleDateString('en-US', {\n weekday: 'long',\n month: 'long',\n day: 'numeric'\n });\n }\n\n /** @deprecated Use {@link FormattedDate}. */\n get formattedDate(): string {\n return this.FormattedDate;\n }\n\n /**\n * Navigate to an application\n */\n async OnAppClick(app: BaseApplication): Promise<void> {\n // Use NavigationService to switch to the app (handles tab creation if needed)\n await this.navigationService.SwitchToApp(app.ID);\n }\n\n /** @deprecated Use {@link OnAppClick}. */\n async onAppClick(app: BaseApplication): Promise<void> {\n return this.OnAppClick(app);\n }\n\n /**\n * Open app configuration dialog\n */\n OpenConfigDialog(): void {\n this.ShowConfigDialog = true;\n setTimeout(() => {\n if (this.AppConfigDialog) {\n this.AppConfigDialog.Open();\n }\n }, 0);\n }\n\n /** @deprecated Use {@link OpenConfigDialog}. */\n openConfigDialog(): void {\n return this.OpenConfigDialog();\n }\n\n /**\n * Handle when config is saved\n */\n OnConfigSaved(): void {\n this.ShowConfigDialog = false;\n }\n\n /** @deprecated Use {@link OnConfigSaved}. */\n onConfigSaved(): void {\n return this.OnConfigSaved();\n }\n\n /**\n * Pre-compute display data for all apps to avoid repeated calculations during change detection\n */\n private async computeAppsDisplayData(): Promise<void> {\n this.AppsDisplayData = await Promise.all(this.Apps.map(async app => {\n const navItems = await app.GetNavItems();\n const navItemsCount = navItems.length;\n const navItemsPreview = navItems.slice(0, 3).map(item => ({\n Label: item.Label,\n Icon: item.Icon || 'fa-solid fa-circle'\n }));\n\n return {\n app,\n color: app.GetColor() || 'var(--mj-brand-primary)',\n icon: app.Icon || 'fa-solid fa-cube',\n navItemsCount,\n navItemsPreview,\n showMoreItems: navItemsCount > 3,\n moreItemsCount: navItemsCount - 3\n };\n }));\n }\n\n /**\n * Track function for apps loop\n */\n TrackByApp(_index: number, item: AppDisplayData): string {\n return item.app.ID;\n }\n\n /** @deprecated Use {@link TrackByApp}. */\n trackByApp(_index: number, item: AppDisplayData): string {\n return this.TrackByApp(_index, item);\n }\n\n /**\n * Track function for nav items preview\n */\n TrackByNavItem(_index: number, item: { Label: string; Icon: string }): string {\n return item.Label;\n }\n\n /** @deprecated Use {@link TrackByNavItem}. */\n trackByNavItem(_index: number, item: { Label: string; Icon: string }): string {\n return this.TrackByNavItem(_index, item);\n }\n\n /**\n * Load user favorites from UserInfoEngine (cached) and resolve record display names\n */\n private async loadFavorites(): Promise<void> {\n try {\n this.FavoritesLoading = true;\n\n // Get first 10 favorites (already ordered by __mj_CreatedAt DESC in engine)\n this.Favorites = UserInfoEngine.Instance.UserFavorites.slice(0, 10);\n\n // Batch-resolve record names for all favorites\n await this.resolveFavoriteNames();\n } catch (error) {\n console.error('Error loading favorites:', error);\n } finally {\n this.FavoritesLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Batch-resolve record display names for favorites using GetEntityRecordNames()\n */\n private async resolveFavoriteNames(): Promise<void> {\n const nameInputs: EntityRecordNameInput[] = [];\n const favoriteIdByKey = new Map<string, string>(); // map key -> favorite ID\n\n for (const fav of this.Favorites) {\n if (!fav.Entity || !fav.RecordID) continue;\n const compositeKey = this.buildCompositeKeyForRecord(fav.Entity, fav.RecordID);\n if (!compositeKey) continue;\n\n nameInputs.push({ EntityName: fav.Entity, CompositeKey: compositeKey });\n favoriteIdByKey.set(`${fav.Entity}||${compositeKey.ToConcatenatedString()}`, fav.ID);\n }\n\n if (nameInputs.length === 0) return;\n\n try {\n const nameResults = await this.metadata.GetEntityRecordNames(nameInputs);\n for (const result of nameResults) {\n if (result.Success && result.RecordName) {\n const key = `${result.EntityName}||${result.CompositeKey.ToConcatenatedString()}`;\n const favId = favoriteIdByKey.get(key);\n if (favId) {\n this.FavoriteDisplayNames.set(favId, result.RecordName);\n }\n }\n }\n } catch (error) {\n console.warn('Failed to resolve favorite record names:', error);\n }\n }\n\n /**\n * Build a CompositeKey for a record. RecordID may be stored as either:\n * - Concatenated format: \"FieldName|Value\" or \"Field1|Val1||Field2|Val2\"\n * - Plain value: just the raw value (e.g. a GUID)\n */\n private buildCompositeKeyForRecord(entityName: string, recordId: string): CompositeKey | null {\n if (!recordId) return null;\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n // A plain value can only be resolved against the entity's real key column(s)\n if (!entityInfo && !recordId.includes(CompositeKey.DefaultValueDelimiter)) return null;\n const compositeKey = CompositeKey.FromURLSegment(entityInfo, recordId);\n return compositeKey.KeyValuePairs.length > 0 ? compositeKey : null;\n }\n\n /**\n * Get the display name for a favorite (resolved name or entity name fallback)\n */\n GetFavoriteDisplayName(favorite: MJUserFavoriteEntity): string {\n return this.FavoriteDisplayNames.get(favorite.ID) || favorite.Entity || favorite.RecordID;\n }\n\n /** @deprecated Use {@link GetFavoriteDisplayName}. */\n getFavoriteDisplayName(favorite: MJUserFavoriteEntity): string {\n return this.GetFavoriteDisplayName(favorite);\n }\n\n /**\n * Load recent items via the RecentAccessService\n */\n private async loadRecents(): Promise<void> {\n try {\n this.RecentsLoading = true;\n this.cdr.markForCheck();\n await this.recentAccessService.loadRecentItems(10);\n } catch (error) {\n console.error('Error loading recents:', error);\n } finally {\n this.RecentsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Navigate to a favorite item using NavigationService\n */\n OnFavoriteClick(favorite: MJUserFavoriteEntity): void {\n // Navigate based on entity type using NavigationService\n const entityName = favorite.Entity?.toLowerCase();\n const recordId = favorite.RecordID;\n\n if (IsDashboardEntity(favorite.Entity)) {\n this.openDashboard(recordId, 'Dashboard');\n } else if (ResourceTypeForEntity(favorite.Entity) === 'view') {\n this.navigationService.OpenView(recordId, 'View');\n } else if (entityName?.includes('artifact')) {\n this.navigationService.OpenArtifact(recordId, 'Artifact');\n } else {\n // Default: navigate to record\n const compositeKey = this.buildCompositeKeyForRecord(favorite.Entity, recordId);\n if (compositeKey) {\n this.navigationService.OpenEntityRecord(favorite.Entity, compositeKey);\n }\n }\n }\n\n /** @deprecated Use {@link OnFavoriteClick}. */\n onFavoriteClick(favorite: MJUserFavoriteEntity): void {\n return this.OnFavoriteClick(favorite);\n }\n\n /**\n * Navigate to a recent item using NavigationService\n */\n OnRecentClick(item: RecentAccessItem): void {\n // Use recordName if available, otherwise fall back to generic titles\n const name = item.recordName;\n\n switch (item.resourceType) {\n case 'view':\n this.navigationService.OpenView(item.recordId, name || 'View');\n break;\n case 'dashboard':\n this.openDashboard(item.recordId, name || 'Dashboard');\n break;\n case 'artifact':\n this.navigationService.OpenArtifact(item.recordId, name || 'Artifact');\n break;\n default: {\n // Regular record\n const compositeKey = this.buildCompositeKeyForRecord(item.entityName, item.recordId);\n if (compositeKey) {\n this.navigationService.OpenEntityRecord(item.entityName, compositeKey);\n }\n }\n }\n }\n\n /** @deprecated Use {@link OnRecentClick}. */\n onRecentClick(item: RecentAccessItem): void {\n return this.OnRecentClick(item);\n }\n\n /**\n * Navigate to a notification using NavigationService\n */\n OnNotificationClick(notification: MJUserNotificationEntity): void {\n // Navigate to the notifications view using NavigationService\n this.navigationService.OpenDynamicView('MJ: User Notifications');\n }\n\n /** @deprecated Use {@link OnNotificationClick}. */\n onNotificationClick(notification: MJUserNotificationEntity): void {\n return this.OnNotificationClick(notification);\n }\n\n /**\n * Get icon for an entity by name, using entity metadata Icon field (cached)\n */\n GetEntityIconByName(entityName: string): string {\n if (!entityName) return 'fa-solid fa-file';\n\n const cached = this.resourceIconCache.get(entityName);\n if (cached) return cached;\n\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n const icon = entityInfo ? this.resolveEntityIcon(entityInfo.Icon) : 'fa-solid fa-file';\n\n this.resourceIconCache.set(entityName, icon);\n return icon;\n }\n\n /** @deprecated Use {@link GetEntityIconByName}. */\n getEntityIconByName(entityName: string): string {\n return this.GetEntityIconByName(entityName);\n }\n\n /**\n * Resolve an entity's Icon field to a full Font Awesome class string\n */\n private resolveEntityIcon(icon: string | undefined): string {\n if (!icon) return 'fa-solid fa-table';\n\n // Already has a style prefix\n if (icon.startsWith('fa-solid') || icon.startsWith('fa-regular') ||\n icon.startsWith('fa-light') || icon.startsWith('fa-brands') ||\n icon.startsWith('fa ')) {\n return icon;\n }\n // Has fa- prefix but no style\n if (icon.startsWith('fa-')) {\n return `fa-solid ${icon}`;\n }\n // Just an icon name like \"table\" or \"users\"\n return `fa-solid fa-${icon}`;\n }\n\n /**\n * Format a date for display (pure function, safe to call in template)\n */\n formatDate(date: Date): string {\n if (!date) return '';\n const now = new Date();\n const diff = now.getTime() - new Date(date).getTime();\n const days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n if (days === 0) return 'Today';\n if (days === 1) return 'Yesterday';\n if (days < 7) return `${days} days ago`;\n return new Date(date).toLocaleDateString();\n }\n\n /**\n * Track function for favorites\n */\n TrackByFavorite(_index: number, item: MJUserFavoriteEntity): string {\n return item.ID;\n }\n\n /** @deprecated Use {@link TrackByFavorite}. */\n trackByFavorite(_index: number, item: MJUserFavoriteEntity): string {\n return this.TrackByFavorite(_index, item);\n }\n\n /**\n * Remove duplicate recent items (same entity + recordId). Keeps the first occurrence.\n */\n private deduplicateRecents(items: RecentAccessItem[]): RecentAccessItem[] {\n const seen = new Set<string>();\n return items.filter(item => {\n const key = `${item.entityName}-${item.recordId}`;\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n return true;\n });\n }\n\n /**\n * Track function for recent items\n */\n TrackByRecent(_index: number, item: RecentAccessItem): string {\n return `${item.entityName}-${item.recordId}`;\n }\n\n /** @deprecated Use {@link TrackByRecent}. */\n trackByRecent(_index: number, item: RecentAccessItem): string {\n return this.TrackByRecent(_index, item);\n }\n\n /**\n * Track function for notifications\n */\n TrackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return item.ID;\n }\n\n /** @deprecated Use {@link TrackByNotification}. */\n trackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return this.TrackByNotification(_index, item);\n }\n\n // =============================================\n // DASHBOARDS APP AND CACHE\n // =============================================\n\n /**\n * The Dashboards part of Home's first load: the automatic Dashboards app install (at most once\n * per user) and the dashboard cache. Home stays on its loading view until both finish, so the\n * app-list reload that an install causes does not show a second loading view. Each install step\n * gives up after DASHBOARDS_APP_INSTALL_STEP_TIMEOUT_MS. The cache load has no time limit: Home\n * shows its loading view until the server answers or the load fails. Never rejects.\n */\n private async loadDashboards(): Promise<void> {\n await Promise.allSettled([AutoInstallDashboardsApp(this.appManager), this.loadDashboardCache()]);\n }\n\n /**\n * Loads the dashboard cache if it is not loaded yet, then reads the switcher's list and the dashboard pin names\n * from it and shows the dashboard the URL asks for (one Home cannot show is removed from the URL). A failed load is\n * only logged. Never rejects.\n */\n private async loadDashboardCache(): Promise<void> {\n try {\n await DashboardEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse);\n } catch (error) {\n LogError(`Home: could not load the dashboards: ${errorMessage(error)}`);\n }\n this.dashboardCacheLoaded = true;\n this.refreshPinnedDashboards();\n this.applyRequestedDashboard(true);\n }\n\n /** Reloads the dashboard cache, so a dashboard saved a moment ago is in it. A failure is only logged. */\n private async reloadDashboardCache(): Promise<void> {\n try {\n await DashboardEngine.Instance.Config(true, this.ProviderToUse.CurrentUser, this.ProviderToUse);\n } catch (error) {\n LogError(`Home: could not reload the dashboards: ${errorMessage(error)}`);\n }\n }\n\n /** The dashboards the user can open, from the dashboard cache; none when the user cannot read the cache. */\n private accessibleDashboards(): MJDashboardEntity[] {\n const engine = DashboardEngine.Instance;\n return engine.IsPermissionConstrained ? [] : engine.GetAccessibleDashboards(this.ProviderToUse.CurrentUser.ID);\n }\n\n /** Re-reads the switcher's list and the names dashboard pins show, and keeps the open dashboard in step with the cache. */\n private refreshPinnedDashboards(): void {\n const dashboards = this.accessibleDashboards();\n this.PinnedDashboards = BuildPinnedDashboards(this.PinnedItems, dashboards);\n this.pinDashboardNames = BuildPinDashboardNames(this.PinnedItems, dashboards);\n this.syncCurrentDashboard(dashboards);\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /**\n * Opens a dashboard in place of the preview tab, which is usually the tab that shows Home, so Back\n * returns to Home. A Shift-click opens it in a separate tab.\n */\n private openDashboard(dashboardId: string, dashboardName: string): void {\n this.navigationService.OpenDashboard(dashboardId, dashboardName);\n }\n\n /**\n * Follows a link from a panel of the dashboard Home shows: a record, a dashboard or a query, as the\n * dashboard tab does. Other link types are only logged.\n */\n public OnDashboardNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n switch (request.type) {\n case 'OpenEntityRecord': {\n const key = CompositeKey.FromURLSegment(this.ProviderToUse.EntityByName(request.entityName), request.recordId);\n this.navigationService.OpenEntityRecord(request.entityName, key);\n break;\n }\n case 'OpenDashboard':\n this.openDashboard(request.dashboardId, this.cachedDashboardName(request.dashboardId));\n break;\n case 'OpenQuery':\n this.navigationService.OpenQuery(request.queryId, 'Query');\n break;\n default:\n console.warn(`[Home] A dashboard panel asked for a link type that Home does not open: ${request.type}`);\n }\n }\n\n /** The dashboard's name from the dashboard cache, or 'Dashboard' when the cache does not have it. */\n private cachedDashboardName(dashboardId: string): string {\n const engine = DashboardEngine.Instance;\n if (engine.IsPermissionConstrained) {\n return 'Dashboard';\n }\n return engine.Dashboards.find(d => UUIDsEqual(d.ID, dashboardId))?.Name ?? 'Dashboard';\n }\n\n // =============================================\n // DASHBOARD VIEW\n // =============================================\n\n /**\n * Shows a dashboard inside Home in place of the overview and writes it to the URL (?dashboard=<id>). Only a Config\n * dashboard the user can open shows in Home. Asks first when the open dashboard has unsaved changes. Returns false\n * when the dashboard did not open.\n */\n public async OpenDashboardInHome(dashboardId: string, startInEditMode = false): Promise<boolean> {\n const dashboard = this.findHomeDashboard(dashboardId);\n if (!dashboard) return false;\n if (UUIDsEqual(dashboard.ID, this.CurrentDashboardId)) return true;\n if (!(await this.confirmLeaveDashboard())) return false;\n // Another open of the same dashboard (a double click) finished meanwhile\n if (UUIDsEqual(dashboard.ID, this.CurrentDashboardId)) return true;\n this.requestedDashboardId = dashboard.ID;\n this.setCurrentDashboard(dashboard, startInEditMode);\n this.UpdateQueryParams({ [DASHBOARD_QUERY_PARAM]: dashboard.ID });\n void this.recentAccessService.LogAccess('MJ: Dashboards', dashboard.ID, 'dashboard');\n return true;\n }\n\n /**\n * Returns to the overview (switcher Home, breadcrumb Home) and removes the dashboard from the URL. Asks first when\n * the open dashboard has unsaved changes. Returns false when the user keeps editing.\n */\n public async GoHome(): Promise<boolean> {\n if (!this.CurrentDashboardId) return true;\n if (!(await this.confirmLeaveDashboard())) return false;\n this.closeDashboardView();\n return true;\n }\n\n /**\n * A pick in a Dashboards switcher, or the breadcrumb's Home: null returns to the overview, an id opens that\n * dashboard in Home. Focus then moves to what shows.\n */\n public OnSwitcherPick(dashboardId: string | null): void {\n void this.followSwitcherPick(dashboardId);\n }\n\n /**\n * Manage pins (switcher): the overview with the pins in edit mode, and focus on the Pinned header. When the user\n * keeps editing the open dashboard, Home stays on it and focus goes to its title.\n */\n public async ManagePins(): Promise<void> {\n const home = await this.GoHome();\n if (home && !this.EditMode) {\n this.ToggleEditMode();\n }\n this.focusShownView();\n }\n\n /** The switcher's New dashboard: asks to leave unsaved changes first, then asks for the name. */\n public async OpenNewDashboardDialog(): Promise<void> {\n if (!(await this.confirmLeaveDashboard())) return;\n this.NewDashboardNameMaxLength = DashboardNameMaxLength(this.ProviderToUse);\n this.ShowNewDashboardDialog = true;\n this.cdr.markForCheck();\n }\n\n /** Closes the name dialog; nothing is created. */\n public OnNewDashboardCancelled(): void {\n this.ShowNewDashboardDialog = false;\n this.cdr.markForCheck();\n }\n\n /**\n * Creates the named dashboard, pins it to Home and shows it in Home in edit mode. When the save fails, the\n * dialog stays open with the name and the user is told. A second Create while one runs is ignored.\n */\n public async OnNewDashboardNamed(name: string): Promise<void> {\n if (this.IsCreatingDashboard) return;\n this.IsCreatingDashboard = true;\n this.cdr.markForCheck();\n try {\n const dashboard = await CreateBlankDashboard(this.ProviderToUse, name);\n if (!dashboard) {\n MJNotificationService.Instance.CreateSimpleNotification('Could not create the dashboard', 'error', 3000);\n return;\n }\n await this.reloadDashboardCache();\n this.pinService.AddPin(BuildDashboardPinInput(dashboard));\n this.ShowNewDashboardDialog = false;\n if (!(await this.OpenDashboardInHome(dashboard.ID, true))) {\n this.openDashboard(dashboard.ID, dashboard.Name);\n }\n } catch (error) {\n LogError(`Home: could not open the new dashboard: ${errorMessage(error)}`);\n MJNotificationService.Instance.CreateSimpleNotification('Could not open the new dashboard', 'error', 3000);\n } finally {\n this.IsCreatingDashboard = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Opens the dashboard in a tab of the Dashboards app, installing the app first when the user lacks it. */\n public async OpenDashboardInDashboardsApp(dashboard: MJDashboardEntity): Promise<void> {\n const app = await EnsureDashboardsApp(this.appManager);\n this.navigationService.OpenDashboard(dashboard.ID, dashboard.Name, app ? { applicationId: app.ID } : undefined);\n }\n\n /**\n * The editor entered or left edit mode. The editor can report leaving it while Home renders (it drops an edit when\n * it gets another dashboard), so this sets no state the template reads, and tells the agent after the render.\n */\n public OnDashboardEditingChange(editing: boolean): void {\n this.IsDashboardEditing = editing;\n queueMicrotask(() => this.publishAgentContext());\n }\n\n /**\n * The editor saved the dashboard, or its saved name changed: the switcher and the pin names read the new name from\n * the cache.\n */\n public OnDashboardSaved(): void {\n this.refreshPinnedDashboards();\n }\n\n /** The editor has shown a dashboard. Its title gets focus when Home asked for that (see focusTitleOnLoad). */\n public OnDashboardViewLoaded(dashboard: MJDashboardEntity): void {\n if (this.focusTitleOnLoad && UUIDsEqual(dashboard.ID, this.focusTitleOnLoad)) {\n this.focusTitleOnLoad = null;\n this.focusInHome(DASHBOARD_TITLE_SELECTOR);\n }\n }\n\n /**\n * The editor could not show the dashboard: Home returns to its overview and tells the user. A dashboard that a URL\n * change named stays in the URL, since a write would add a history entry that every later Back lands on again. Any\n * other dashboard is removed from the URL: one the user opened in Home, or the one Home opened with on its first load,\n * so the tab does not keep it.\n */\n public OnDashboardViewLoadFailed(): void {\n const namedByUrl = this.urlShownDashboardId !== null && UUIDsEqual(this.urlShownDashboardId, this.CurrentDashboardId);\n this.closeDashboardView(DASHBOARD_NOT_AVAILABLE, !namedByUrl);\n }\n\n /** Applies the dashboard the URL names, for back and forward, deep links and pins of Home. */\n protected override OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void {\n const requested = params[DASHBOARD_QUERY_PARAM]?.trim() || null;\n if (UUIDsEqual(requested, this.requestedDashboardId)) return;\n if (this.hasUnsavedDashboardChanges()) {\n void this.followDashboardParamAfterConfirm(requested);\n return;\n }\n this.requestedDashboardId = requested;\n this.applyRequestedDashboard(false);\n }\n\n /**\n * Asks before a URL change leaves unsaved changes. When the user keeps editing, writes the open dashboard back to the\n * URL.\n */\n private async followDashboardParamAfterConfirm(requested: string | null): Promise<void> {\n if (!(await this.confirmLeaveDashboard())) {\n this.UpdateQueryParams({ [DASHBOARD_QUERY_PARAM]: this.CurrentDashboardId });\n return;\n }\n this.requestedDashboardId = requested;\n this.applyRequestedDashboard(false);\n }\n\n /**\n * Shows the dashboard the URL asks for, once the dashboard cache has loaded: the dashboard view for a Config\n * dashboard the user can open, else the overview. For a dashboard Home cannot show, the user is told, and\n * `removeFromUrl` removes it from the URL. After a URL change (back, forward, a deep link into the open tab) the URL\n * stays as it is: a write then would add a history entry that every later Back lands on again. After a URL change,\n * Home also notes that the URL named the dashboard it shows (see OnDashboardViewLoadFailed).\n */\n private applyRequestedDashboard(removeFromUrl: boolean): void {\n if (!this.dashboardCacheLoaded) return;\n const requested = this.requestedDashboardId;\n const dashboard = requested ? this.findHomeDashboard(requested) : null;\n if (requested && !dashboard) {\n this.closeDashboardView(DASHBOARD_NOT_AVAILABLE, removeFromUrl);\n return;\n }\n this.setCurrentDashboard(dashboard, false);\n this.urlShownDashboardId = removeFromUrl ? null : dashboard?.ID ?? null;\n }\n\n /**\n * Keeps the open dashboard in step with the cache: one that is gone, or that the user can no longer open, returns\n * Home to the overview.\n */\n private syncCurrentDashboard(dashboards: readonly MJDashboardEntity[]): void {\n if (!this.dashboardCacheLoaded || !this.CurrentDashboardId || FindDashboard(dashboards, this.CurrentDashboardId)) return;\n this.closeDashboardView('The dashboard is no longer available');\n }\n\n /**\n * Returns Home to its overview and, with a notice, tells the user. `removeFromUrl` also removes the dashboard from\n * the URL; that write runs after the current call stack, and only when no dashboard shows by then.\n */\n private closeDashboardView(notice?: string, removeFromUrl = true): void {\n this.requestedDashboardId = null;\n this.setCurrentDashboard(null, false);\n if (removeFromUrl) {\n queueMicrotask(() => {\n if (!this.CurrentDashboardId) {\n this.UpdateQueryParams({ [DASHBOARD_QUERY_PARAM]: null });\n }\n });\n }\n if (notice) {\n MJNotificationService.Instance.CreateSimpleNotification(notice, 'warning', 3000);\n }\n }\n\n /**\n * Shows `dashboard` (or the overview for null). Home keeps the object it was given for the same dashboard: the\n * editor follows the dashboard cache itself after a save, so a new copy of the same dashboard is not pushed to it.\n */\n private setCurrentDashboard(dashboard: MJDashboardEntity | null, startInEditMode: boolean): void {\n if (UUIDsEqual(dashboard?.ID, this.CurrentDashboardId)) return;\n this.CurrentDashboard = dashboard;\n this.CurrentDashboardId = dashboard?.ID ?? null;\n this.DashboardStartsInEditMode = dashboard !== null && startInEditMode;\n this.IsDashboardEditing = false;\n this.focusTitleOnLoad = null;\n this.urlShownDashboardId = null;\n this.EditingPinId = null;\n this.SidebarOpen = false;\n this.HidePinMenu();\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** A Config dashboard the user can open, by id (any letter case), or null. */\n private findHomeDashboard(dashboardId: string): MJDashboardEntity | null {\n const dashboard = FindDashboard(this.accessibleDashboards(), dashboardId);\n return dashboard && CanShowInHome(dashboard) ? dashboard : null;\n }\n\n /** True while the open dashboard is in edit mode with changes the editor has not saved. */\n private hasUnsavedDashboardChanges(): boolean {\n return this.IsDashboardEditing && (this.dashboardEditor?.HasUnsavedChanges ?? false);\n }\n\n /**\n * True when Home may leave the open dashboard: it is not being edited, its changes are saved, or the user chose to\n * discard them (the editor then cancels its edit). False when the user keeps editing.\n */\n private async confirmLeaveDashboard(): Promise<boolean> {\n const editor = this.dashboardEditor;\n if (!editor || !this.IsDashboardEditing) return true;\n if (editor.HasUnsavedChanges && !(await this.confirmDiscardDashboardChanges())) return false;\n editor.CancelEdit();\n return true;\n }\n\n /**\n * Asks whether to discard the open dashboard's unsaved changes. Resolves true for Discard changes, false for Keep\n * editing.\n */\n private confirmDiscardDashboardChanges(): Promise<boolean> {\n return this.confirmService.Confirm({\n title: 'Discard changes?',\n message: `Leave \"${this.CurrentDashboardName}\" without saving?`,\n detail: 'Your changes to this dashboard will be lost.',\n type: 'warning',\n confirmText: 'Discard changes',\n cancelText: 'Keep editing',\n });\n }\n\n /**\n * Follows a switcher pick, then moves focus to what shows: a dashboard Home switched to gets focus on its title once\n * the editor has shown it; otherwise focus goes to the open dashboard's title, or to the Pinned header.\n */\n private async followSwitcherPick(dashboardId: string | null): Promise<void> {\n const switching = dashboardId !== null && !UUIDsEqual(dashboardId, this.CurrentDashboardId);\n const moved = dashboardId ? await this.OpenDashboardInHome(dashboardId) : await this.GoHome();\n if (moved && switching) {\n this.focusTitleOnLoad = this.CurrentDashboardId;\n } else {\n this.focusShownView();\n }\n }\n\n /** Runs an agent's change of Home's view, then moves focus when the change removed it (see refocusIfRemoved). */\n private async switchViewForAgent(switchView: () => Promise<boolean>): Promise<boolean> {\n const focused = this.focusedElementInHome();\n const switched = await switchView();\n this.refocusIfRemoved(focused);\n return switched;\n }\n\n /** The element in Home that has focus, or null when focus is outside Home. */\n private focusedElementInHome(): HTMLElement | null {\n const focused = document.activeElement;\n return focused instanceof HTMLElement && this.hostElement.nativeElement.contains(focused) ? focused : null;\n }\n\n /**\n * After an agent changed Home's view: renders Home, and when `focused` is gone (the change removed the part of Home it\n * was in), moves focus as a switcher pick does, to the title of the dashboard Home shows once the editor has shown it,\n * or on the overview to the Pinned header. Focus that is still on the page stays where it is.\n */\n private refocusIfRemoved(focused: HTMLElement | null): void {\n if (!focused) return;\n SafeDetectChanges(this.cdr);\n if (focused.isConnected) return;\n if (this.CurrentDashboardId) {\n this.focusTitleOnLoad = this.CurrentDashboardId;\n } else {\n this.focusShownView();\n }\n }\n\n /**\n * Moves focus to the open dashboard's title, or on the overview to the Pinned header: its Dashboards button, or Done\n * while the pins are in edit mode.\n */\n private focusShownView(): void {\n if (this.CurrentDashboardId) {\n this.focusInHome(DASHBOARD_TITLE_SELECTOR);\n } else {\n this.focusInHome(this.EditMode ? '.pinned-actions > button' : '.pinned-actions .switcher-button');\n }\n }\n\n /**\n * Renders Home, then focuses the first element in it that matches `selector`, and returns that element. Returns null,\n * and focuses nothing, when none shows.\n */\n private focusInHome<T extends HTMLElement = HTMLElement>(selector: string): T | null {\n SafeDetectChanges(this.cdr);\n const element = this.hostElement.nativeElement.querySelector<T>(selector);\n element?.focus();\n return element;\n }\n\n // =============================================\n // PIN NAME RESOLUTION\n // =============================================\n\n /**\n * Resolve display names for record-type pins that have raw \"Entity - ID|...\" titles.\n * Uses batch GetEntityRecordNames() for efficiency, same pattern as favorites.\n */\n private async resolveRecordPinNames(): Promise<void> {\n // Find pins that need name resolution: records with raw ID titles,\n // or any pin whose DisplayName contains \"ID|\" (raw composite key)\n const pinsNeedingNames = this.PinnedItems.filter(pin => {\n const rt = ResolvePinResourceType(pin);\n if (rt !== 'Records') return false;\n // Check if the name looks like a raw ID format\n return pin.DisplayName.includes('ID|') || pin.DisplayName.includes(' - ID');\n });\n\n if (pinsNeedingNames.length === 0) return;\n\n const nameInputs: EntityRecordNameInput[] = [];\n const pinIdByKey = new Map<string, string>();\n\n for (const pin of pinsNeedingNames) {\n const entityName = (pin.Configuration['Entity'] || pin.Configuration['entity']) as string;\n const recordId = pin.Configuration['recordId'] as string;\n if (!entityName || !recordId) continue;\n\n const compositeKey = this.buildCompositeKeyForRecord(entityName, recordId);\n if (!compositeKey) continue;\n\n nameInputs.push({ EntityName: entityName, CompositeKey: compositeKey });\n pinIdByKey.set(`${entityName}||${compositeKey.ToConcatenatedString()}`, pin.Id);\n }\n\n if (nameInputs.length === 0) return;\n\n try {\n const nameResults = await this.metadata.GetEntityRecordNames(nameInputs);\n for (const result of nameResults) {\n if (result.Success && result.RecordName) {\n const key = `${result.EntityName}||${result.CompositeKey.ToConcatenatedString()}`;\n const pinId = pinIdByKey.get(key);\n if (pinId) {\n this.pinService.UpdatePin(pinId, { DisplayName: result.RecordName });\n }\n }\n }\n } catch (error) {\n console.warn('[Pin Names] Failed to resolve record names:', error);\n }\n }\n\n /**\n * Resolve missing icons for Custom (app nav item) pins by looking up nav items.\n */\n private async resolveCustomPinIcons(): Promise<void> {\n const pinsNeedingIcons = this.PinnedItems.filter(pin =>\n ResolvePinResourceType(pin) === 'Custom' && !pin.Icon\n );\n\n if (pinsNeedingIcons.length === 0) return;\n\n for (const pin of pinsNeedingIcons) {\n const appName = pin.ApplicationName || pin.Configuration['appName'] as string;\n const navItemName = pin.Configuration['navItemName'] as string;\n if (!appName || !navItemName) continue;\n\n const app = this.appManager.GetAllApps().find(a => a.Name === appName);\n if (!app) continue;\n\n const navItems = await app.GetNavItems();\n const navItem = navItems.find(ni => ni.Label === navItemName);\n if (navItem?.Icon) {\n this.pinService.UpdatePin(pin.Id, { Icon: navItem.Icon });\n }\n }\n }\n\n // =============================================\n // PIN MANAGEMENT\n // =============================================\n\n /**\n * Opens a pinned resource. A click in edit mode does nothing. A dashboard the click shows in Home gets focus on its\n * title once the editor has shown it.\n */\n OnPinClick(pin: HomeAppPinnedItem): void {\n void this.openPinForUser(pin);\n }\n\n /** Opens a pin the user clicked. When it shows a dashboard in Home, that dashboard's title gets focus once the editor has shown it. */\n private async openPinForUser(pin: HomeAppPinnedItem): Promise<void> {\n const shown = this.CurrentDashboardId;\n if ((await this.openPin(pin)) && this.CurrentDashboardId && !UUIDsEqual(this.CurrentDashboardId, shown)) {\n this.focusTitleOnLoad = this.CurrentDashboardId;\n }\n }\n\n /**\n * Opens a pin: a dashboard pin as openDashboardPin describes, other pins as Home always has. Returns false when\n * nothing opened: in edit mode, for a broken pin, or when the user kept editing the open dashboard.\n */\n private async openPin(pin: HomeAppPinnedItem): Promise<boolean> {\n if (this.EditMode) return false;\n const resourceType = ResolvePinResourceType(pin);\n return resourceType === 'Dashboards' ? this.openDashboardPin(pin) : this.openResourcePin(pin, resourceType);\n }\n\n /**\n * Opens a dashboard pin: a Config dashboard the user can open shows inside Home; a Code dashboard, or one the cache\n * does not have, opens in a tab under the name the pin shows. Returns false when nothing opened.\n */\n private async openDashboardPin(pin: HomeAppPinnedItem): Promise<boolean> {\n const dashboardId = DashboardIdOfPin(pin);\n if (!dashboardId) {\n console.warn('[Pin Click] Dashboards pin missing dashboardId and recordId', pin.Configuration);\n return false;\n }\n if (this.findHomeDashboard(dashboardId)) {\n return this.OpenDashboardInHome(dashboardId);\n }\n this.openDashboard(dashboardId, this.PinName(pin));\n return true;\n }\n\n /**\n * Opens a pin that is not a dashboard pin: a view, a query, a record, an app page or an action. Returns false when\n * the pin is broken and nothing opened.\n */\n private openResourcePin(pin: HomeAppPinnedItem, resourceType: string): boolean {\n const config = pin.Configuration;\n switch (resourceType) {\n case 'User Views': {\n if (config['isDynamic']) {\n const entityName = (config['Entity'] || config['entity']) as string | undefined;\n if (!entityName) {\n console.warn('[Pin Click] Dynamic view pin missing Entity', config);\n return false;\n }\n this.navigationService.OpenDynamicView(entityName, config['extraFilter'] as string | undefined);\n return true;\n }\n const viewId = config['viewId'] as string;\n if (!viewId) return false;\n this.navigationService.OpenView(viewId, pin.DisplayName);\n return true;\n }\n case 'Queries': {\n const queryId = config['queryId'] as string;\n if (!queryId) return false;\n // Opens in Data Explorer's Queries nav item once the Add Pin panel has found that app\n const deApp = this.HasDataExplorerApp\n ? this.appManager.GetAllApps().find(a => a.Name === 'Data Explorer')\n : null;\n if (deApp) {\n void this.navigationService.SwitchToApp(deApp.ID, 'Queries', { queryId: queryId });\n } else {\n this.navigationService.OpenQuery(queryId, pin.DisplayName);\n }\n return true;\n }\n case 'Records': {\n const entityName = (config['Entity'] || config['entity']) as string;\n const recordId = config['recordId'] as string;\n if (!entityName || !recordId) {\n console.warn('[Pin Click] Records pin missing Entity or recordId', config);\n return false;\n }\n const compositeKey = this.buildCompositeKeyForRecord(entityName, recordId);\n if (!compositeKey) return false;\n this.navigationService.OpenEntityRecord(entityName, compositeKey);\n return true;\n }\n case 'Custom':\n return this.openAppPagePin(config);\n case 'Actions': {\n const actionId = config['actionId'] as string;\n if (!actionId) {\n console.warn('[Pin Click] Action pin missing actionId', config);\n return false;\n }\n this.ActionRunnerPin = pin;\n this.ActionRunnerDialogVisible = true;\n this.cdr.markForCheck();\n return true;\n }\n default:\n console.warn('[Pin Click] Unrecognized resource type', resourceType, 'for pin', pin.DisplayName, config);\n return false;\n }\n }\n\n /** Opens an app page pin (a Custom pin): a nav item of an app, found by the app's name. Returns false when the pin is broken. */\n private openAppPagePin(config: Record<string, unknown>): boolean {\n // Custom resources are nav items within apps — always use app name, never ID\n const navItemName = config['navItemName'] as string;\n const appName = config['appName'] as string;\n const queryParams = config['queryParams'] as Record<string, string> | undefined;\n if (!appName) {\n console.warn('[Pin Click] Custom pin missing appName', config);\n return false;\n }\n const app = this.appManager.GetAllApps().find(a => a.Name === appName);\n if (!app) {\n console.warn(`[Pin Click] Custom pin: app \"${appName}\" not found`, config);\n return false;\n }\n // SwitchToApp gets the query params, so the target tab has them when it activates, before a cached resource\n // component reattaches: the page opens on the state the pin names.\n void this.navigationService.SwitchToApp(app.ID, navItemName, queryParams);\n return true;\n }\n\n /**\n * Toggle edit mode for pins. Entering edit mode opens a collapsed Pinned section.\n */\n ToggleEditMode(): void {\n this.EditMode = !this.EditMode;\n if (this.EditMode) {\n this.openPinnedSection();\n } else {\n this.EditingPinId = null;\n this.EditingGroupName = null;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Permanently hide the \"No pinned items yet\" empty state for this user.\n * Persisted in UserSettings via UserInfoEngine.\n */\n DismissPinEmptyState(): void {\n this.HidePinEmptyState = true;\n UserInfoEngine.Instance.SetSettingDebounced('HomeApp.HidePinEmptyState', 'true');\n this.cdr.markForCheck();\n }\n\n /** Opens or collapses the Pinned section, saves the choice for the user and reports it to the agent. */\n OnPinnedExpandedChange(expanded: boolean): void {\n this.PinnedExpanded = expanded;\n this.sectionStateChanged(PINNED_COLLAPSED_SETTING, expanded);\n }\n\n /** Reads whether the Pinned section is open. 'true' means collapsed; a missing setting means open. */\n private loadSectionStates(): void {\n this.PinnedExpanded = UserInfoEngine.Instance.GetSetting(PINNED_COLLAPSED_SETTING) !== 'true';\n }\n\n /** Saves a section's state for the user ('true' when collapsed), reports it to the agent and renders. */\n private sectionStateChanged(settingKey: string, expanded: boolean): void {\n UserInfoEngine.Instance.SetSettingDebounced(settingKey, expanded ? 'false' : 'true');\n this.publishAgentContext();\n this.cdr.markForCheck();\n }\n\n /** Opens the Pinned section when it is collapsed, so edit mode or a new pin shows. */\n private openPinnedSection(): void {\n if (!this.PinnedExpanded) {\n this.OnPinnedExpandedChange(true);\n }\n }\n\n /**\n * Remove a pin\n */\n RemovePin(pinId: string): void {\n this.pinService.RemovePin(pinId);\n }\n\n /**\n * Starts renaming a pin: shows its rename box, with focus in it and the name selected. A dashboard pin is renamed\n * only by a user who can edit its dashboard; other users are told why not.\n */\n StartEditingPin(pinId: string, event: Event): void {\n event.stopPropagation();\n const pin = this.PinnedItems.find(p => p.Id === pinId);\n if (pin && !this.canRenamePin(pin)) {\n this.notifyCannotRename(pin);\n return;\n }\n this.EditingPinId = pinId;\n this.focusPinNameInput();\n }\n\n /**\n * Saves the name typed in a pin's rename box and closes the box. A dashboard pin renames its dashboard, since it\n * shows the dashboard's name; other pins rename only the pin. An empty or unchanged name changes nothing. A call\n * after the rename has ended does nothing: the browser can blur the box as it goes away.\n */\n SavePinName(pinId: string, newName: string): void {\n if (this.EditingPinId !== pinId) return;\n this.EditingPinId = null;\n this.cdr.markForCheck();\n const pin = this.PinnedItems.find(p => p.Id === pinId);\n const name = newName.trim();\n if (!pin || !name || name === this.PinName(pin)) return;\n const dashboard = this.pinDashboard(pin);\n if (dashboard) {\n void this.renameDashboard(dashboard, pin, name);\n return;\n }\n this.pinService.UpdatePin(pinId, { DisplayName: name });\n }\n\n /** Enter in a pin's rename box: saves the name, then moves focus to Done, since the box goes away. */\n public OnPinNameEnter(pinId: string, event: Event): void {\n this.SavePinName(pinId, this.GetInputValue(event));\n this.focusShownView();\n }\n\n /** Renders Home, then puts focus in the open rename box and selects the name, so typing replaces it. */\n private focusPinNameInput(): void {\n this.focusInHome<HTMLInputElement>('.pin-card .pin-name-input')?.select();\n }\n\n /** The dashboard a dashboard pin shows, from the dashboard cache. Null for other pins, and when the cache lacks it. */\n private pinDashboard(pin: HomeAppPinnedItem): MJDashboardEntity | null {\n return FindDashboard(this.accessibleDashboards(), DashboardIdOfPin(pin));\n }\n\n /** True when the user may rename the pin: a pin that shows no cached dashboard, or a dashboard pin whose dashboard the user can edit. */\n private canRenamePin(pin: HomeAppPinnedItem): boolean {\n const dashboard = this.pinDashboard(pin);\n return !dashboard || DashboardEngine.Instance.CanUserEditDashboard(dashboard.ID, this.ProviderToUse.CurrentUser.ID);\n }\n\n /** Tells the user that only people who can edit the pin's dashboard can rename the pin. */\n private notifyCannotRename(pin: HomeAppPinnedItem): void {\n MJNotificationService.Instance.CreateSimpleNotification(`Only people who can edit \"${this.PinName(pin)}\" can rename it`, 'info', 3000);\n }\n\n /**\n * Renames the dashboard a pin shows, and keeps the pin's stored name in step: the name the pin shows when the cache\n * lacks the dashboard. It renames the cache's own dashboard object, so the switcher, the pin names and an editor that\n * shows the dashboard have the new name at once. While a save of that object runs (an editor's Save, for example),\n * it renames nothing and tells the user: its own save would join the running one and write nothing. A failed save\n * puts the old name back and tells the user.\n */\n private async renameDashboard(dashboard: MJDashboardEntity, pin: HomeAppPinnedItem, name: string): Promise<void> {\n if (dashboard.IsSaving) {\n MJNotificationService.Instance.CreateSimpleNotification(`\"${dashboard.Name}\" is being saved. Rename it again in a moment.`, 'info', 3000);\n return;\n }\n const previous = dashboard.Name;\n dashboard.Name = name;\n this.refreshPinnedDashboards();\n const failure = await this.saveRenamedDashboard(dashboard);\n if (failure !== null) {\n dashboard.Name = previous;\n this.refreshPinnedDashboards();\n LogError(`Home: could not rename the dashboard \"${previous}\": ${failure}`);\n MJNotificationService.Instance.CreateSimpleNotification(`Could not rename \"${previous}\"`, 'error', 3000);\n return;\n }\n this.pinService.UpdatePin(pin.Id, { DisplayName: name });\n MJNotificationService.Instance.CreateSimpleNotification(`Renamed the dashboard to \"${name}\"`, 'success', 2000);\n }\n\n /** Saves a renamed dashboard. Returns null when it saved, else why not. Never throws. */\n private async saveRenamedDashboard(dashboard: MJDashboardEntity): Promise<string | null> {\n try {\n return (await dashboard.Save()) ? null : dashboard.LatestResult?.CompleteMessage ?? 'unknown error';\n } catch (error) {\n return errorMessage(error);\n }\n }\n\n /**\n * Extract input value from a DOM event (strict template helper)\n */\n GetInputValue(event: Event): string {\n return (event.target as HTMLInputElement).value;\n }\n\n /**\n * Start editing a group name\n */\n StartEditingGroup(groupName: string): void {\n this.EditingGroupName = groupName;\n this.cdr.markForCheck();\n }\n\n /**\n * Save edited group name - updates all pins in the group\n */\n SaveGroupName(oldName: string, newName: string): void {\n if (newName.trim() && newName.trim() !== oldName) {\n const pinsInGroup = this.pinService.GetPinsInGroup(oldName);\n for (const pin of pinsInGroup) {\n this.pinService.UpdatePin(pin.Id, { Group: newName.trim() });\n }\n }\n this.EditingGroupName = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Remove a group - moves all pins to ungrouped\n */\n RemoveGroup(groupName: string): void {\n const pinsInGroup = this.pinService.GetPinsInGroup(groupName);\n for (const pin of pinsInGroup) {\n this.pinService.UpdatePin(pin.Id, { Group: undefined });\n }\n }\n\n /**\n * Get pins in a specific group\n */\n GetPinsInGroup(groupName: string): HomeAppPinnedItem[] {\n return this.pinService.GetPinsInGroup(groupName);\n }\n\n /** The name a pin shows: a dashboard pin shows its dashboard's name from the cache; other pins show their own. */\n public PinName(pin: HomeAppPinnedItem): string {\n return this.pinDashboardNames.get(pin.Id) ?? pin.DisplayName;\n }\n\n /**\n * Get icon for a pin based on resource type and metadata\n */\n GetPinIcon(pin: HomeAppPinnedItem): string {\n if (pin.Icon) return pin.Icon;\n const entity = (pin.Configuration['Entity'] || pin.Configuration['entity'] || '') as string;\n switch (pin.ResourceType) {\n case 'Dashboards': return 'fa-solid fa-gauge-high';\n case 'User Views': return entity ? this.GetEntityIconByName(entity) : 'fa-solid fa-table-list';\n case 'Queries': return 'fa-solid fa-database';\n case 'Reports': return 'fa-solid fa-chart-bar';\n case 'Records': return entity ? this.GetEntityIconByName(entity) : 'fa-solid fa-file';\n case 'Custom': return this.getNavItemIcon(pin) || this.getAppIcon(pin) || 'fa-solid fa-cube';\n case 'Actions': return 'fa-solid fa-bolt';\n default: return 'fa-solid fa-thumbtack';\n }\n }\n\n /**\n * Get display label for a resource type\n */\n GetResourceTypeLabel(pin: HomeAppPinnedItem): string {\n switch (pin.ResourceType) {\n case 'Dashboards': return 'Dashboard';\n case 'User Views': return 'View';\n case 'Queries': return 'Query';\n case 'Reports': return 'Report';\n case 'Records': return (pin.Configuration?.['Entity'] as string) || (pin.Configuration?.['entity'] as string) || 'Record';\n case 'Custom': return pin.ApplicationName || (pin.Configuration['appName'] as string) || 'App';\n case 'Actions': return 'Quick Action';\n default: return pin.ResourceType;\n }\n }\n\n /** Accent color for a pin — prefers the stored accentColor in Configuration, falls back to Color, then CSS var */\n GetPinAccentColor(pin: HomeAppPinnedItem): string {\n const fromConfig = (pin.Configuration as unknown as ActionPinConfiguration).accentColor;\n return fromConfig || pin.Color || 'var(--mj-text-muted)';\n }\n\n /**\n * Get the app icon for a pin by looking up the app by name\n */\n private getAppIcon(pin: HomeAppPinnedItem): string | undefined {\n const appName = pin.ApplicationName || pin.Configuration['appName'] as string;\n if (!appName) return undefined;\n const app = this.appManager.GetAllApps().find(a => a.Name === appName);\n return app?.Icon || undefined;\n }\n\n /**\n * Look up the nav item icon for a Custom pin from the app's nav items cache.\n * Uses the pre-computed appsDisplayData to avoid async lookups.\n */\n private getNavItemIcon(pin: HomeAppPinnedItem): string | undefined {\n const appName = pin.ApplicationName || pin.Configuration['appName'] as string;\n const navItemName = pin.Configuration['navItemName'] as string;\n if (!appName || !navItemName) return undefined;\n\n // Check the pre-computed display data first (fast)\n const appData = this.AppsDisplayData.find(d => d.app.Name === appName);\n if (appData) {\n const navItem = appData.navItemsPreview.find(ni => ni.Label === navItemName);\n if (navItem) return navItem.Icon;\n }\n\n // Fall back to AvailableApps data (if Add Panel was loaded)\n const panelApp = this.AvailableApps.find(a => a.appName === appName);\n if (panelApp) {\n const ni = panelApp.navItems.find(n => n.label === navItemName);\n if (ni) return ni.icon;\n }\n\n return undefined;\n }\n\n // =============================================\n // PIN CONTEXT MENU (ELLIPSIS)\n // =============================================\n\n /**\n * Opens the pin options menu under the pin's ellipsis button, right-aligned and inside the viewport, and moves\n * focus to its first row. A click elsewhere, Escape or Tab closes it.\n */\n ShowPinMenu(event: MouseEvent, pin: HomeAppPinnedItem): void {\n event.stopPropagation();\n event.preventDefault();\n const trigger = event.currentTarget;\n if (!(trigger instanceof HTMLElement)) {\n return;\n }\n const anchor = MenuAnchorOf(trigger);\n this.pinMenuTrigger = trigger;\n this.PinMenuPin = pin;\n this.PinMenuVisible = true;\n this.placePinMenu(anchor, 0);\n // Render the menu with no max height to measure its full height, then place it again with that height\n this.PinMenuMaxHeight = null;\n this.cdr.detectChanges();\n this.placePinMenu(anchor, this.pinMenuEl?.nativeElement.offsetHeight ?? 0);\n this.cdr.detectChanges();\n this.pinMenuRows()[0]?.focus({ preventScroll: true });\n this.watchPinMenuDismiss();\n }\n\n /**\n * Keys in the pin options menu: ArrowDown, ArrowUp, Home and End move between the rows. Escape closes the menu\n * and puts focus back on its button. Tab closes it too, and the browser moves focus on from the button.\n */\n public OnPinMenuKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closePinMenuToTrigger();\n } else if (event.key === 'Tab') {\n this.closePinMenuToTrigger();\n } else {\n this.focusPinMenuRow(event);\n }\n }\n\n /** Moves focus to the menu row that ArrowDown, ArrowUp, Home or End picks. Other keys do nothing. */\n private focusPinMenuRow(event: KeyboardEvent): void {\n const rows = this.pinMenuRows();\n const next = NextMenuFocusIndex(event.key, rows.findIndex(row => row === document.activeElement), rows.length);\n if (next !== null) {\n event.preventDefault();\n rows[next].focus();\n }\n }\n\n /** The menu's rows, in order: its menuitem buttons. */\n private pinMenuRows(): HTMLElement[] {\n return Array.from(this.pinMenuEl?.nativeElement.querySelectorAll<HTMLElement>('[role=\"menuitem\"]') ?? []);\n }\n\n /** Closes the pin options menu and puts focus back on the button that opened it. */\n private closePinMenuToTrigger(): void {\n const trigger = this.pinMenuTrigger;\n this.HidePinMenu();\n trigger?.focus();\n }\n\n /**\n * Places the pin options menu next to its button and limits its height to the room on that side. A height of 0\n * places it below the button.\n */\n private placePinMenu(anchor: MenuAnchor, height: number): void {\n const place = PlaceMenu(anchor, PIN_MENU_WIDTH, height, 'right', { Width: window.innerWidth, Height: window.innerHeight });\n this.PinMenuX = place.Left;\n this.PinMenuY = place.Top;\n this.PinMenuMaxHeight = place.MaxHeight;\n }\n\n /** Closes the pin options menu on the next click anywhere or on Escape. */\n private watchPinMenuDismiss(): void {\n setTimeout(() => {\n const close = () => {\n this.HidePinMenu();\n document.removeEventListener('click', close);\n document.removeEventListener('keydown', onKeydown);\n };\n const onKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n close();\n }\n };\n document.addEventListener('click', close);\n document.addEventListener('keydown', onKeydown);\n }, 0);\n }\n\n /**\n * Hide the pin context menu\n */\n HidePinMenu(): void {\n this.PinMenuVisible = false;\n this.PinMenuPin = null;\n this.pinMenuTrigger = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Edit in a pin's menu: closes the menu, puts the pins in edit mode (opening a collapsed Pinned section) and starts\n * renaming the pin, with focus in its rename box. For a dashboard pin the user cannot rename, it says why and moves\n * focus to Done instead.\n */\n OnPinMenuEdit(): void {\n const pin = this.PinMenuPin;\n this.HidePinMenu();\n if (!pin) return;\n this.EditMode = true;\n this.openPinnedSection();\n if (this.canRenamePin(pin)) {\n this.EditingPinId = pin.Id;\n this.focusPinNameInput();\n } else {\n this.EditingPinId = null;\n this.notifyCannotRename(pin);\n this.focusShownView();\n }\n }\n\n /**\n * Move a pin to a different group\n */\n OnPinMenuMoveToGroup(groupName: string | undefined): void {\n if (this.PinMenuPin) {\n this.pinService.UpdatePin(this.PinMenuPin.Id, { Group: groupName });\n }\n this.HidePinMenu();\n }\n\n /**\n * Unpin a resource from the pin context menu\n */\n OnPinMenuUnpin(): void {\n if (this.PinMenuPin) {\n this.pinService.RemovePin(this.PinMenuPin.Id);\n }\n this.HidePinMenu();\n }\n\n // =============================================\n // DRAG AND DROP\n // =============================================\n\n OnDragStart(event: DragEvent, pin: HomeAppPinnedItem): void {\n this.DraggingPinId = pin.Id;\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', pin.Id);\n }\n }\n\n OnDragOver(event: DragEvent, targetPin: HomeAppPinnedItem): void {\n event.preventDefault();\n if (event.dataTransfer) {\n event.dataTransfer.dropEffect = 'move';\n }\n this.DragOverPinId = targetPin.Id;\n }\n\n OnDragLeave(): void {\n this.DragOverPinId = null;\n }\n\n OnDrop(event: DragEvent, targetPin: HomeAppPinnedItem): void {\n event.preventDefault();\n this.DragOverPinId = null;\n\n if (!this.DraggingPinId || this.DraggingPinId === targetPin.Id) {\n this.DraggingPinId = null;\n return;\n }\n\n const pins = [...this.PinnedItems];\n const dragIndex = pins.findIndex(p => p.Id === this.DraggingPinId);\n const dropIndex = pins.findIndex(p => p.Id === targetPin.Id);\n\n if (dragIndex === -1 || dropIndex === -1) {\n this.DraggingPinId = null;\n return;\n }\n\n // Move the dragged pin to the target position and adopt target's group\n const [draggedPin] = pins.splice(dragIndex, 1);\n draggedPin.Group = targetPin.Group;\n pins.splice(dropIndex, 0, draggedPin);\n\n this.pinService.ReorderPins(pins);\n this.DraggingPinId = null;\n }\n\n OnDragEnd(): void {\n this.DraggingPinId = null;\n this.DragOverPinId = null;\n }\n\n TrackByPin(_index: number, pin: HomeAppPinnedItem): string {\n return pin.Id;\n }\n\n /** @deprecated Use {@link TrackByPin}. */\n trackByPin(_index: number, pin: HomeAppPinnedItem): string {\n return this.TrackByPin(_index, pin);\n }\n\n TrackByGroup(_index: number, group: string): string {\n return group;\n }\n\n /** @deprecated Use {@link TrackByGroup}. */\n trackByGroup(_index: number, group: string): string {\n return this.TrackByGroup(_index, group);\n }\n\n // =============================================\n // ADD PIN PANEL\n // =============================================\n\n async OpenAddPinPanel(): Promise<void> {\n this.AddPanelOpen = true;\n this.AddPanelSearchQuery = '';\n this.AddPanelSelectedGroup = '';\n this.AddPanelLoading = true;\n this.cdr.markForCheck();\n\n await this.loadAvailableResources();\n this.AddPanelLoading = false;\n this.cdr.markForCheck();\n }\n\n CloseAddPinPanel(): void {\n this.AddPanelOpen = false;\n this.cdr.markForCheck();\n }\n\n private async loadAvailableResources(): Promise<void> {\n // All four engines are singletons that cache their data in memory. Config(false) is a no-op\n // after first init — DashboardEngine and QueryEngine auto-start at app startup, UserViewEngine\n // and ActionEngineBase initialize on first call. Running them in parallel means whichever\n // ones still need to load do so concurrently, and the already-initialized ones return immediately.\n await Promise.all([\n DashboardEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse),\n UserViewEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse),\n QueryEngine.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse),\n ActionEngineBase.Instance.Config(false, this.ProviderToUse.CurrentUser, this.ProviderToUse)\n ]);\n\n const cachedDashboards = DashboardEngine.Instance.IsPermissionConstrained\n ? []\n : DashboardEngine.Instance.Dashboards\n .filter(d => d.Type === 'Config')\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n const cachedViews = UserViewEngine.Instance.IsPermissionConstrained\n ? []\n : UserViewEngine.Instance.GetViewsForCurrentUser()\n .slice()\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n const cachedQueries = QueryEngine.Instance.IsPermissionConstrained\n ? []\n : QueryEngine.Instance.Queries\n .slice()\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n const cachedActions = ActionEngineBase.Instance.Actions\n .filter(a => a.Status === 'Active')\n .sort((a, b) => a.Name.localeCompare(b.Name));\n\n this.AvailableDashboards = cachedDashboards.map(d => ({\n id: d.ID, name: d.Name,\n pinned: this.pinService.IsPinned('Dashboards', { dashboardId: d.ID })\n }));\n\n this.AvailableViews = cachedViews.map(v => ({\n id: v.ID, name: v.Name, entityName: v.Entity || '',\n pinned: this.pinService.IsPinned('User Views', { viewId: v.ID })\n }));\n\n this.AvailableQueries = cachedQueries.map(q => ({\n id: q.ID, name: q.Name,\n pinned: this.pinService.IsPinned('Queries', { queryId: q.ID })\n }));\n\n // Actions can be pinned multiple times with different configs, so we treat them\n // as always \"not pinned\" in the panel — the checkmark would be misleading.\n this.AvailableActions = cachedActions.map(a => ({\n id: a.ID, name: a.Name, description: a.Description || '',\n pinned: false\n }));\n\n // Load apps with their nav items\n await this.loadAvailableApps();\n\n // Query pins open in Data Explorer when the user has that app (see OnPinClick)\n this.HasDataExplorerApp = this.AvailableApps.some(a => a.appName === 'Data Explorer');\n }\n\n /**\n * Filter panel items by search query\n */\n FilterPanelItems<T extends { name: string }>(items: T[]): T[] {\n if (!this.AddPanelSearchQuery) return items;\n const q = this.AddPanelSearchQuery.toLowerCase();\n return items.filter(item => item.name.toLowerCase().includes(q));\n }\n\n /**\n * Load available apps with their nav items for the Add Pin panel\n */\n private async loadAvailableApps(): Promise<void> {\n const allApps = this.appManager.GetAllApps().filter(a => a.Name !== 'Home');\n this.AvailableApps = await Promise.all(allApps.map(async app => {\n const navItems = await app.GetNavItems();\n return {\n appId: app.ID,\n appName: app.Name,\n icon: app.Icon || 'fa-solid fa-cube',\n color: app.GetColor() || '#1976d2',\n navItems: navItems.map(ni => ({\n label: ni.Label,\n icon: ni.Icon || 'fa-solid fa-circle',\n pinned: this.pinService.IsPinned('Custom', { appName: app.Name, navItemName: ni.Label })\n }))\n };\n }));\n }\n\n /**\n * Set a section's collapsed state in the Add Pin panel from the accordion\n * panel's (ExpandedChange) output. The accordion reports the EXPANDED state,\n * which is the inverse of our stored COLLAPSED flag. OnPush component, so\n * mark for check after mutating the map.\n */\n OnPanelSectionExpandedChange(section: string, expanded: boolean): void {\n this.PanelSectionCollapsed[section] = !expanded;\n this.cdr.markForCheck();\n }\n\n /**\n * Pin an app nav item from the Add Panel\n */\n PinAppNavItem(appName: string, _appIcon: string, appColor: string, navItemLabel: string, navItemIcon: string): void {\n const input: HomeAppPinInput = {\n DisplayName: navItemLabel,\n ResourceType: 'Custom',\n ApplicationName: appName,\n Icon: navItemIcon,\n Color: appColor,\n Configuration: {\n resourceType: 'Custom',\n appName: appName,\n navItemName: navItemLabel,\n },\n Group: this.getSelectedGroup() || undefined,\n };\n\n const added = this.pinService.AddPin(input);\n if (added) {\n // Update pinned state in the panel\n this.AvailableApps = this.AvailableApps.map(app => {\n if (app.appName !== appName) return app;\n return {\n ...app,\n navItems: app.navItems.map(ni =>\n ni.label === navItemLabel ? { ...ni, pinned: true } : ni\n )\n };\n });\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${navItemLabel}\" pinned to Home`, 'success', 3000\n );\n this.openPinnedSection();\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Pin a resource from the Add Panel\n */\n PinFromPanel(resourceType: string, id: string, name: string): void {\n let config: Record<string, unknown> = {};\n switch (resourceType) {\n case 'Dashboards':\n config = { dashboardId: id };\n break;\n case 'User Views':\n config = { viewId: id };\n break;\n case 'Queries':\n config = { queryId: id };\n break;\n case 'Reports':\n config = { reportId: id };\n break;\n }\n\n const input: HomeAppPinInput = {\n DisplayName: name,\n ResourceType: resourceType,\n Configuration: config,\n Group: this.getSelectedGroup() || undefined,\n };\n\n const added = this.pinService.AddPin(input);\n if (added) {\n this.updatePanelPinnedState(resourceType, id, true);\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${name}\" pinned to Home`, 'success', 3000\n );\n this.openPinnedSection();\n }\n }\n\n // =============================================\n // ACTION PIN DIALOGS\n // =============================================\n\n /**\n * Open the Configure Action Pin dialog — triggered when the user clicks an Action\n * in the Add Pin panel. Actions need extra configuration (preset params, runtime\n * params, title, theming) before they can be pinned.\n */\n OpenActionPinConfig(actionId: string, actionName: string, description: string): void {\n this.ActionConfigActionId = actionId;\n this.ActionConfigActionName = actionName;\n this.ActionConfigActionDescription = description || null;\n this.ActionConfigDialogVisible = true;\n this.cdr.markForCheck();\n }\n\n /** Callback from the Configure Action Pin dialog */\n OnActionConfigResult(result: ActionPinConfigResult): void {\n this.ActionConfigDialogVisible = false;\n this.cdr.markForCheck();\n if (result.Action !== 'save' || !result.Pin) return;\n\n const p = result.Pin;\n const config: ActionPinConfiguration = {\n actionId: p.ActionID,\n actionName: p.ActionName,\n presetParams: p.PresetParams,\n runtimeParamNames: p.RuntimeParamNames,\n accentColor: p.AccentColor,\n displayName: p.DisplayName\n };\n\n const input: HomeAppPinInput = {\n DisplayName: p.DisplayName,\n ResourceType: 'Actions',\n Icon: p.FaIcon,\n Color: p.AccentColor,\n Configuration: config as unknown as Record<string, unknown>,\n Group: this.getSelectedGroup() || undefined\n };\n\n const added = this.pinService.AddPin(input);\n if (added) {\n MJNotificationService.Instance.CreateSimpleNotification(\n `\"${p.DisplayName}\" pinned to Home`, 'success', 3000\n );\n this.openPinnedSection();\n } else {\n MJNotificationService.Instance.CreateSimpleNotification(\n 'A pin with the same title and config already exists.', 'warning', 3000\n );\n }\n }\n\n /** Callback from the Run Action Pin dialog */\n OnActionRunnerResult(_result: ActionPinRunResult): void {\n this.ActionRunnerDialogVisible = false;\n this.ActionRunnerPin = null;\n this.cdr.markForCheck();\n }\n\n /**\n * Resolve the selected group — handles the \"new group\" option\n */\n private getSelectedGroup(): string {\n if (this.AddPanelSelectedGroup === '__new__') {\n return this.AddPanelNewGroupName.trim();\n }\n return this.AddPanelSelectedGroup;\n }\n\n private updatePanelPinnedState(resourceType: string, id: string, pinned: boolean): void {\n switch (resourceType) {\n case 'Dashboards':\n this.AvailableDashboards = this.AvailableDashboards.map(d =>\n d.id === id ? { ...d, pinned } : d\n );\n break;\n case 'User Views':\n this.AvailableViews = this.AvailableViews.map(v =>\n v.id === id ? { ...v, pinned } : v\n );\n break;\n case 'Queries':\n this.AvailableQueries = this.AvailableQueries.map(q =>\n q.id === id ? { ...q, pinned } : q\n );\n break;\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Filter apps by search query (matches app name or nav item labels)\n */\n FilterApps(): typeof this.AvailableApps {\n if (!this.AddPanelSearchQuery) return this.AvailableApps;\n const q = this.AddPanelSearchQuery.toLowerCase();\n return this.AvailableApps\n .map(app => ({\n ...app,\n navItems: app.navItems.filter(ni => ni.label.toLowerCase().includes(q))\n }))\n .filter(app => app.appName.toLowerCase().includes(q) || app.navItems.length > 0);\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** What a Home agent tool for a part of the overview says while a dashboard shows: the part shows on the overview only. */\nfunction overviewOnlyError(part: string): string {\n return `${part} shows on the ${HOME_OVERVIEW_NAME} overview only. Use SwitchHomeDashboard with \"${HOME_OVERVIEW_NAME}\" first.`;\n}\n","<div class=\"home-dashboard\" [class.sidebar-open]=\"SidebarOpen && ShowQuickAccess\">\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Overview: the greeting, Pinned and My applications in one centered column -->\n @if (ShowOverview) {\n <div class=\"home-overview\">\n <!-- Header Section -->\n <div class=\"home-header\">\n <div class=\"greeting-section\">\n <h1>{{ Greeting }}, {{ GreetingName }}</h1>\n <p class=\"date\">{{ FormattedDate }}</p>\n </div>\n </div>\n\n <!-- Pinned Section: collapses to its header (title, Add Pin / Dashboards / Edit, or Done) -->\n <mj-accordion-panel class=\"pinned-section\" [Bare]=\"true\" [TitleIconMuted]=\"true\" [HeadingLevel]=\"2\" [FlushBody]=\"true\"\n [Expanded]=\"PinnedExpanded\" (ExpandedChange)=\"OnPinnedExpandedChange($event)\">\n <ng-template mjAccordionTitle>\n <span class=\"pinned-title\"><i class=\"fa-solid fa-thumbtack\" aria-hidden=\"true\"></i> Pinned</span>\n </ng-template>\n <ng-template mjAccordionActions>\n <div class=\"pinned-actions\">\n @if (EditMode) {\n <button type=\"button\" mjButton Variant=\"success\" Size=\"sm\" (click)=\"ToggleEditMode()\">\n <i class=\"fa-solid fa-check\" aria-hidden=\"true\"></i> <span class=\"pin-action-label\">Done</span>\n </button>\n } @else {\n <button type=\"button\" mjButton Variant=\"primary\" Size=\"sm\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i> <span class=\"pin-action-label\">Add Pin</span>\n </button>\n <mj-home-dashboard-switcher Look=\"button\" Align=\"right\" Label=\"Dashboards\"\n [Dashboards]=\"PinnedDashboards\" [CurrentId]=\"null\"\n (Pick)=\"OnSwitcherPick($event)\" (New)=\"OpenNewDashboardDialog()\" (ManagePins)=\"ManagePins()\">\n </mj-home-dashboard-switcher>\n @if (PinnedItems.length > 0) {\n <button type=\"button\" mjButton Variant=\"secondary\" Size=\"sm\" (click)=\"ToggleEditMode()\">\n <i class=\"fa-solid fa-pen\" aria-hidden=\"true\"></i> <span class=\"pin-action-label\">Edit</span>\n </button>\n }\n }\n </div>\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"pinned-body\">\n @if (EditMode) {\n <div class=\"edit-mode-banner\">\n <i class=\"fa-solid fa-arrows-up-down-left-right\"></i>\n <span><strong>Edit mode</strong> — Drag cards to reorder. Click names to rename.</span>\n </div>\n }\n\n <!-- Empty State -->\n @if (PinnedItems.length === 0 && (EditMode || !HidePinEmptyState)) {\n <div class=\"pin-empty-state\">\n @if (!EditMode) {\n <button type=\"button\" class=\"pin-empty-close\" (click)=\"DismissPinEmptyState()\" title=\"Hide this\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n <mj-empty-state Icon=\"fa-solid fa-thumbtack\"\n Title=\"No pinned items yet\"\n Message=\"Pin your favorite dashboards, views, queries, and reports for quick access.\">\n <button actions mjButton variant=\"primary\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add your first pin\n </button>\n @if (!EditMode && !HidePinEmptyState) {\n <button actions mjButton variant=\"flat\" (click)=\"DismissPinEmptyState()\">\n Don't show this again\n </button>\n }\n </mj-empty-state>\n </div>\n }\n\n <!-- Pin Grid: the ungrouped pins, then each group under its header, from one card markup -->\n @if (PinnedItems.length > 0) {\n <div class=\"pin-grid\">\n @for (section of PinSections; track section.Key) {\n @if (section.Group !== null) {\n <div class=\"group-header\">\n @if (EditMode && EditingGroupName === section.Group) {\n <input class=\"group-name-input\" [value]=\"section.Group\"\n (blur)=\"SaveGroupName(section.Group, GetInputValue($event))\"\n (keydown.enter)=\"SaveGroupName(section.Group, GetInputValue($event))\" />\n } @else {\n <span class=\"group-name\" (click)=\"EditMode ? StartEditingGroup(section.Group) : null\">{{ section.Group }}</span>\n }\n <div class=\"group-line\"></div>\n <span class=\"group-count\">{{ section.Pins.length }} pins</span>\n @if (EditMode) {\n <div class=\"group-edit-controls\">\n <button type=\"button\" class=\"group-edit-btn danger\" (click)=\"RemoveGroup(section.Group)\">\n <i class=\"fa-solid fa-folder-minus\" aria-hidden=\"true\"></i> Remove Group\n </button>\n </div>\n }\n </div>\n }\n @for (pin of section.Pins; track pin.Id) {\n <div class=\"pin-card\"\n [class.edit-mode]=\"EditMode\"\n [class.dragging]=\"DraggingPinId === pin.Id\"\n [class.drag-over]=\"DragOverPinId === pin.Id\"\n [class.menu-open]=\"PinMenuPin?.Id === pin.Id\"\n [draggable]=\"EditMode\"\n (dragstart)=\"OnDragStart($event, pin)\" (dragover)=\"OnDragOver($event, pin)\" (dragleave)=\"OnDragLeave()\"\n (drop)=\"OnDrop($event, pin)\" (dragend)=\"OnDragEnd()\"\n (click)=\"OnPinClick(pin)\">\n\n <!-- Edit mode controls -->\n @if (EditMode) {\n <div class=\"edit-controls\">\n <div class=\"drag-handle\"><i class=\"fa-solid fa-grip-vertical\" aria-hidden=\"true\"></i></div>\n <div class=\"edit-card-actions\">\n <button type=\"button\" class=\"edit-card-btn delete\" aria-label=\"Remove pin\" title=\"Remove pin\"\n (click)=\"RemovePin(pin.Id); $event.stopPropagation()\"><i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i></button>\n </div>\n </div>\n }\n\n <!-- Thumbnail: the pin's image, the action accent, or the brand icon tile -->\n @if (pin.Thumbnail) {\n <div class=\"pin-thumbnail\">\n <img [src]=\"pin.Thumbnail\" [alt]=\"PinName(pin)\" />\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button type=\"button\" mjButton Variant=\"secondary\" Size=\"sm\" [attr.aria-label]=\"'Open ' + PinName(pin)\"\n (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n } @else if (pin.ResourceType === 'Actions') {\n <div class=\"pin-thumbnail action-mode\"\n [style.background]=\"'linear-gradient(135deg, ' + GetPinAccentColor(pin) + ' 0%, ' + GetPinAccentColor(pin) + 'cc 100%)'\">\n <i [class]=\"GetPinIcon(pin)\" aria-hidden=\"true\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button type=\"button\" mjButton Variant=\"secondary\" Size=\"sm\" [attr.aria-label]=\"'Run ' + PinName(pin)\"\n (click)=\"OnPinClick(pin); $event.stopPropagation()\">Run</button>\n </div>\n }\n </div>\n } @else {\n <div class=\"pin-thumbnail icon-mode\">\n <i [class]=\"GetPinIcon(pin)\" aria-hidden=\"true\"></i>\n @if (!EditMode) {\n <div class=\"pin-overlay\">\n <button type=\"button\" mjButton Variant=\"secondary\" Size=\"sm\" [attr.aria-label]=\"'Open ' + PinName(pin)\"\n (click)=\"OnPinClick(pin); $event.stopPropagation()\">Open</button>\n </div>\n }\n </div>\n }\n\n <!-- Pin Info: the name with the pin options button, and the kind line -->\n <div class=\"pin-info\">\n @if (EditMode && EditingPinId === pin.Id) {\n <input class=\"pin-name-input\" [value]=\"PinName(pin)\" [attr.aria-label]=\"'Name of ' + PinName(pin)\"\n (blur)=\"SavePinName(pin.Id, GetInputValue($event))\"\n (keydown.enter)=\"OnPinNameEnter(pin.Id, $event)\"\n (click)=\"$event.stopPropagation()\" />\n } @else {\n <div class=\"pin-name\" (click)=\"EditMode ? StartEditingPin(pin.Id, $event) : null\">\n <span class=\"pin-name-text\">{{ PinName(pin) }}</span>\n @if (!EditMode) {\n <button type=\"button\" class=\"more-btn\" [attr.aria-label]=\"'Pin options for ' + PinName(pin)\" title=\"Pin options\" aria-haspopup=\"menu\"\n [attr.aria-expanded]=\"PinMenuPin?.Id === pin.Id\" (click)=\"ShowPinMenu($event, pin)\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n }\n <div class=\"pin-meta\">\n @if (pin.ResourceType === 'Dashboards') {\n <i class=\"fa-solid fa-gauge-high\" aria-hidden=\"true\"></i>\n }\n <span class=\"pin-kind\">{{ GetResourceTypeLabel(pin) }}</span>\n </div>\n </div>\n </div>\n }\n }\n\n <!-- Add Pin card (edit mode) -->\n @if (EditMode) {\n <div class=\"add-pin-card\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span>Add Pin</span>\n </div>\n }\n </div>\n }\n </div>\n </ng-template>\n </mj-accordion-panel>\n\n <!-- My applications -->\n <section class=\"apps-section\">\n <h2 class=\"section-title\">My applications</h2>\n <div class=\"apps-grid\">\n @for (appData of AppsDisplayData; track TrackByApp($index, appData)) {\n <div class=\"app-card\" [mjClickable]=\"appData.app.Name\" [TestId]=\"'app-tile-' + appData.app.Name\"\n [style.--app-color]=\"appData.color\" (click)=\"OnAppClick(appData.app)\">\n <div class=\"app-icon\" aria-hidden=\"true\"><i [class]=\"appData.icon\"></i></div>\n <div class=\"app-info\">\n <h3 class=\"app-name\">{{ appData.app.Name }}</h3>\n @if (appData.app.Description) {\n <p class=\"app-description\">{{ appData.app.Description }}</p>\n }\n </div>\n </div>\n }\n </div>\n <!-- Empty State -->\n @if (Apps.length === 0) {\n <mj-empty-state Icon=\"fa-solid fa-folder-open\"\n Title=\"No Applications Available\"\n Message=\"You don't have any applications configured yet.\"\n ActionText=\"Configure Applications\"\n ActionIcon=\"fa-solid fa-gear\"\n (Action)=\"OpenConfigDialog()\" />\n }\n </section>\n </div>\n }\n\n <!-- Dashboard view: a pinned dashboard at full size in place of the overview, in the shared dashboard editor -->\n @if (ShowDashboardView && CurrentDashboardId) {\n <mj-dashboard-editor #dashboardEditor class=\"home-dashboard-view\"\n [Provider]=\"Provider\" [DashboardId]=\"CurrentDashboardId\"\n [(StartInEditMode)]=\"DashboardStartsInEditMode\"\n [TitleTemplate]=\"homeDashboardTitle\" [ShowOpenInDashboards]=\"true\" BodyStyle=\"card\"\n (Loaded)=\"OnDashboardViewLoaded($event)\"\n (EditingChange)=\"OnDashboardEditingChange($event)\" (NameChanged)=\"OnDashboardSaved()\" (Saved)=\"OnDashboardSaved()\"\n (LoadFailed)=\"OnDashboardViewLoadFailed()\"\n (OpenInDashboardsRequested)=\"OpenDashboardInDashboardsApp($event)\"\n (NavigationRequested)=\"OnDashboardNavigationRequested($event)\">\n </mj-dashboard-editor>\n }\n\n <!-- The dashboard view's title in view mode: the breadcrumb over the Dashboards switcher, whose trigger is the view's heading -->\n <ng-template #homeDashboardTitle let-dashboard>\n <div class=\"dashboard-title\">\n <nav class=\"dashboard-crumb\" aria-label=\"Breadcrumb\">\n <button type=\"button\" class=\"crumb-home\" (click)=\"OnSwitcherPick(null)\"><i class=\"fa-solid fa-house\" aria-hidden=\"true\"></i> Home</button>\n <span aria-hidden=\"true\">/</span>\n <span>Pinned dashboards</span>\n </nav>\n <mj-home-dashboard-switcher Look=\"title\" Align=\"left\" [HeadingLevel]=\"1\" [Label]=\"dashboard.Name\"\n [Dashboards]=\"PinnedDashboards\" [CurrentId]=\"dashboard.ID\"\n (Pick)=\"OnSwitcherPick($event)\" (New)=\"OpenNewDashboardDialog()\" (ManagePins)=\"ManagePins()\">\n </mj-home-dashboard-switcher>\n </div>\n </ng-template>\n\n <!-- Pin options menu (ellipsis): fixed next to its button (below it, or above it when there is no room below), outside the cards so it stacks above them -->\n @if (PinMenuVisible && PinMenuPin) {\n <div #pinMenu class=\"pin-context-menu\" role=\"menu\" [attr.aria-label]=\"'Options for ' + PinName(PinMenuPin)\"\n [style.left.px]=\"PinMenuX\" [style.top.px]=\"PinMenuY\" [style.max-height.px]=\"PinMenuMaxHeight\" (keydown)=\"OnPinMenuKeydown($event)\">\n <button type=\"button\" role=\"menuitem\" class=\"pin-context-item\" (click)=\"OnPinMenuEdit()\">\n <i class=\"fa-solid fa-pen\" aria-hidden=\"true\"></i><span>Edit</span>\n </button>\n <div class=\"pin-context-divider\" role=\"separator\"></div>\n <div role=\"group\" [attr.aria-labelledby]=\"PinMenuGroupLabelId\">\n <div class=\"pin-context-item submenu-header\" [id]=\"PinMenuGroupLabelId\"><i class=\"fa-solid fa-folder\" aria-hidden=\"true\"></i><span>Move to Group</span></div>\n @if (PinMenuPin.Group) {\n <button type=\"button\" role=\"menuitem\" class=\"pin-context-item submenu-item\" (click)=\"OnPinMenuMoveToGroup(undefined)\"><span>(No group)</span></button>\n }\n @for (group of PinGroups; track group) {\n @if (group !== PinMenuPin.Group) {\n <button type=\"button\" role=\"menuitem\" class=\"pin-context-item submenu-item\" (click)=\"OnPinMenuMoveToGroup(group)\"><span>{{ group }}</span></button>\n }\n }\n </div>\n <div class=\"pin-context-divider\" role=\"separator\"></div>\n <button type=\"button\" role=\"menuitem\" class=\"pin-context-item danger\" (click)=\"OnPinMenuUnpin()\">\n <i class=\"fa-solid fa-thumbtack-slash\" aria-hidden=\"true\"></i><span>Unpin</span>\n </button>\n </div>\n }\n\n <!-- Add Pin Slide-In Panel -->\n @if (AddPanelOpen) {\n <div class=\"slide-panel-backdrop\" (click)=\"CloseAddPinPanel()\"></div>\n <div class=\"slide-panel\">\n <div class=\"slide-panel-header\">\n <h3><i class=\"fa-solid fa-thumbtack\"></i> Add Pin</h3>\n <button class=\"slide-panel-close\" (click)=\"CloseAddPinPanel()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"search-box\">\n <div class=\"search-input-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input type=\"text\"\n placeholder=\"Search apps, dashboards, views, queries...\"\n [(ngModel)]=\"AddPanelSearchQuery\" />\n </div>\n </div>\n\n <div class=\"group-selector\">\n <label><i class=\"fa-solid fa-folder\"></i> Add to group:</label>\n <select [(ngModel)]=\"AddPanelSelectedGroup\">\n <option value=\"\">(No group)</option>\n @for (group of PinGroups; track group) {\n <option [value]=\"group\">{{ group }}</option>\n }\n <option value=\"__new__\">+ New group...</option>\n </select>\n </div>\n @if (AddPanelSelectedGroup === '__new__') {\n <div class=\"new-group-row\">\n <input class=\"new-group-input\"\n type=\"text\"\n placeholder=\"Enter new group name...\"\n [(ngModel)]=\"AddPanelNewGroupName\" />\n </div>\n }\n\n <div class=\"panel-results\">\n @if (AddPanelLoading) {\n <div class=\"panel-loading\">\n <mj-loading text=\"Loading resources...\" size=\"small\"></mj-loading>\n </div>\n } @else {\n <!-- Apps with Nav Items -->\n @if (FilterApps().length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['apps']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('apps', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-grid-2\"></i> Applications\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterApps().length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (app of FilterApps(); track app.appId) {\n <div class=\"panel-app-header\" [style.--panel-app-color]=\"app.color\">\n <div class=\"panel-app-icon\">\n <i [class]=\"app.icon\"></i>\n </div>\n <span class=\"panel-app-name\">{{ app.appName }}</span>\n </div>\n @for (ni of app.navItems; track ni.label) {\n <div class=\"panel-item panel-nav-item\">\n <div class=\"panel-item-icon\" [style.background]=\"'color-mix(in srgb, ' + app.color + ' 10%, var(--mj-bg-surface-card))'\">\n <i [class]=\"ni.icon\" [style.color]=\"app.color\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ ni.label }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (ni.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinAppNavItem(app.appName, app.icon, app.color, ni.label, ni.icon)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Dashboards (metadata-driven Config type only) -->\n @if (FilterPanelItems(AvailableDashboards).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['dashboards']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('dashboards', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-gauge-high\"></i> Dashboards\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableDashboards).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableDashboards); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-gauge-high\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('Dashboards', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Views -->\n @if (FilterPanelItems(AvailableViews).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['views']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('views', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-table-list\"></i> Views\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableViews).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableViews); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-table-list\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n <div class=\"panel-item-sub\">{{ item.entityName }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('User Views', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Queries -->\n @if (FilterPanelItems(AvailableQueries).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['queries']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('queries', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-database\"></i> Queries\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableQueries).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableQueries); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-database\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n </div>\n <div class=\"panel-item-action\">\n @if (item.pinned) {\n <button class=\"pinned-badge\"><i class=\"fa-solid fa-check\"></i> Pinned</button>\n } @else {\n <button class=\"pin-btn\" (click)=\"PinFromPanel('Queries', item.id, item.name)\">\n <i class=\"fa-solid fa-plus\"></i> Pin\n </button>\n }\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n\n <!-- Quick Actions -->\n @if (FilterPanelItems(AvailableActions).length > 0) {\n <mj-accordion-panel class=\"panel-section\" Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"!PanelSectionCollapsed['actions']\"\n (ExpandedChange)=\"OnPanelSectionExpandedChange('actions', $event)\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-bolt\"></i> Quick Actions\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ FilterPanelItems(AvailableActions).length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\n @for (item of FilterPanelItems(AvailableActions); track item.id) {\n <div class=\"panel-item\">\n <div class=\"panel-item-icon\" style=\"background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface-card))\">\n <i class=\"fa-solid fa-bolt\" style=\"color: var(--mj-brand-primary)\"></i>\n </div>\n <div class=\"panel-item-info\">\n <div class=\"panel-item-name\">{{ item.name }}</div>\n @if (item.description) {\n <div class=\"panel-item-sub\">{{ item.description }}</div>\n }\n </div>\n <div class=\"panel-item-action\">\n <button class=\"pin-btn\" (click)=\"OpenActionPinConfig(item.id, item.name, item.description)\">\n <i class=\"fa-solid fa-sliders\"></i> Configure\n </button>\n </div>\n </div>\n }\n </ng-template>\n </mj-accordion-panel>\n }\n }\n </div>\n </div>\n }\n\n <!-- Action Pin Dialogs -->\n <mj-action-pin-config-dialog\n [Visible]=\"ActionConfigDialogVisible\"\n [ActionID]=\"ActionConfigActionId\"\n [ActionName]=\"ActionConfigActionName\"\n [ActionDescription]=\"ActionConfigActionDescription\"\n (Result)=\"OnActionConfigResult($event)\">\n </mj-action-pin-config-dialog>\n\n <mj-action-pin-runner-dialog\n [Visible]=\"ActionRunnerDialogVisible\"\n [Pin]=\"ActionRunnerPin\"\n (Result)=\"OnActionRunnerResult($event)\">\n </mj-action-pin-runner-dialog>\n\n <!-- New dashboard: asks for the name; Cancel creates nothing -->\n <mj-dashboard-name-dialog [Visible]=\"ShowNewDashboardDialog\" [MaxLength]=\"NewDashboardNameMaxLength\"\n [Processing]=\"IsCreatingDashboard\" (Confirmed)=\"OnNewDashboardNamed($event)\" (Cancelled)=\"OnNewDashboardCancelled()\">\n </mj-dashboard-name-dialog>\n\n <!-- Loading State -->\n @if (isLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading your applications...\" size=\"large\"></mj-loading>\n </div>\n }\n </div>\n\n <!-- Collapsible Right Sidebar (the overview only) -->\n @if (ShowQuickAccess) {\n <div class=\"quick-access-sidebar\">\n <div class=\"sidebar-header\">\n <h3>\n <i class=\"fa-solid fa-bolt\"></i>\n Quick Access\n </h3>\n <button class=\"sidebar-close-btn\" (click)=\"toggleSidebar()\" title=\"Close panel\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n <div class=\"sidebar-content\">\n <!-- Unread Notifications Section -->\n @if (unreadNotifications.length > 0) {\n <div class=\"sidebar-section notifications-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-bell\"></i>\n Notifications\n <span class=\"section-badge\">{{ unreadNotifications.length }}</span>\n </h4>\n <div class=\"sidebar-items\">\n @for (notification of unreadNotifications; track trackByNotification($index, notification)) {\n <div\n class=\"sidebar-item notification-item\"\n [mjClickable]=\"notification.Title\"\n testId=\"notification-item\"\n (click)=\"onNotificationClick(notification)\">\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ notification.Title }}</span>\n <span class=\"sidebar-item-subtitle\">{{ notification.Message | slice:0:40 }}{{ (notification.Message?.length || 0) > 40 ? '...' : '' }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n }\n <!-- Favorites Section -->\n @if (favorites.length > 0 || favoritesLoading) {\n <div class=\"sidebar-section favorites-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-star\"></i>\n Favorites\n </h4>\n @if (!favoritesLoading) {\n <div class=\"sidebar-items\">\n @for (favorite of favorites; track trackByFavorite($index, favorite)) {\n <div\n class=\"sidebar-item favorite-item\"\n [mjClickable]=\"getFavoriteDisplayName(favorite)\"\n testId=\"favorite-item\"\n (click)=\"onFavoriteClick(favorite)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(favorite.Entity)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ getFavoriteDisplayName(favorite) }}</span>\n <span class=\"sidebar-item-subtitle\">{{ favorite.Entity }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (favoritesLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Recents Section -->\n @if (recentItems.length > 0 || recentsLoading) {\n <div class=\"sidebar-section recents-section\">\n <h4 class=\"sidebar-section-title\">\n <i class=\"fa-solid fa-clock-rotate-left\"></i>\n Recent\n </h4>\n @if (!recentsLoading) {\n <div class=\"sidebar-items\">\n @for (item of recentItems; track trackByRecent($index, item)) {\n <div\n class=\"sidebar-item recent-item\"\n [mjClickable]=\"item.recordName || item.recordId\"\n testId=\"recent-item\"\n (click)=\"onRecentClick(item)\">\n <div class=\"sidebar-item-icon\">\n <i [class]=\"getEntityIconByName(item.entityName)\"></i>\n </div>\n <div class=\"sidebar-item-info\">\n <span class=\"sidebar-item-title\">{{ item.recordName || item.recordId }}</span>\n <span class=\"sidebar-item-subtitle\">{{ item.entityName }} · {{ formatDate(item.latestAt) }}</span>\n </div>\n </div>\n }\n </div>\n }\n @if (recentsLoading) {\n <div class=\"sidebar-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading...</span>\n </div>\n }\n </div>\n }\n <!-- Empty sidebar state -->\n @if (!favoritesLoading && !recentsLoading && unreadNotifications.length === 0 && favorites.length === 0 && recentItems.length === 0) {\n <mj-empty-state class=\"sidebar-empty\" Size=\"compact\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"No quick access items\" />\n }\n </div>\n </div>\n }\n\n <!-- Quick Access FAB Toggle (Fixed Button; the overview only) -->\n @if (ShowQuickAccess && !SidebarOpen) {\n <button class=\"sidebar-fab-toggle\"\n (click)=\"toggleSidebar()\"\n title=\"Quick Access\">\n <i class=\"fa-solid fa-bolt\"></i>\n @if (unreadNotifications.length > 0) {\n <span class=\"fab-badge\">{{ unreadNotifications.length }}</span>\n }\n </button>\n }\n\n <!-- App Configuration Dialog -->\n <mj-user-app-config\n #appConfigDialog\n [(ShowDialog)]=\"showConfigDialog\"\n (ConfigSaved)=\"onConfigSaved()\">\n </mj-user-app-config>\n</div>\n"]}
|