@memberjunction/ng-dashboards 5.51.0 → 6.1.0-edge.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/LICENSE +7 -0
  2. package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
  3. package/dist/AI/components/agents/agent-configuration.component.js +59 -63
  4. package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +7 -7
  6. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  7. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +21 -21
  8. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  9. package/dist/AI/components/autotagging/shared/classify.types.d.ts +4 -4
  10. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  11. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  12. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +14 -19
  13. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  14. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +53 -77
  15. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  16. package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
  17. package/dist/AI/components/models/model-management.component.js +67 -70
  18. package/dist/AI/components/models/model-management.component.js.map +1 -1
  19. package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
  20. package/dist/AI/components/prompts/prompt-management.component.js +55 -59
  21. package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
  22. package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
  23. package/dist/AI/components/system/system-configuration.component.js +59 -63
  24. package/dist/AI/components/system/system-configuration.component.js.map +1 -1
  25. package/dist/AI/components/tags/tags-resource.component.d.ts +15 -20
  26. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  27. package/dist/AI/components/tags/tags-resource.component.js +51 -77
  28. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  29. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +1 -3
  30. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  31. package/dist/AI/components/vectors/vector-management-resource.component.js +22 -43
  32. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  33. package/dist/Actions/components/explorer/action-card.component.js +6 -6
  34. package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
  35. package/dist/Actions/components/explorer/action-list-item.component.js +3 -3
  36. package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
  37. package/dist/Actions/index.d.ts +0 -1
  38. package/dist/Actions/index.d.ts.map +1 -1
  39. package/dist/Actions/index.js +0 -1
  40. package/dist/Actions/index.js.map +1 -1
  41. package/dist/Admin/admin-dev-tools-resource.component.d.ts.map +1 -1
  42. package/dist/Admin/admin-dev-tools-resource.component.js +14 -0
  43. package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
  44. package/dist/Admin/base-admin-container.component.d.ts.map +1 -1
  45. package/dist/Admin/base-admin-container.component.js +15 -0
  46. package/dist/Admin/base-admin-container.component.js.map +1 -1
  47. package/dist/DevTools/grid-width-lab.component.d.ts +78 -0
  48. package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -0
  49. package/dist/DevTools/grid-width-lab.component.js +248 -0
  50. package/dist/DevTools/grid-width-lab.component.js.map +1 -0
  51. package/dist/DevTools/index.d.ts +2 -0
  52. package/dist/DevTools/index.d.ts.map +1 -1
  53. package/dist/DevTools/index.js +2 -0
  54. package/dist/DevTools/index.js.map +1 -1
  55. package/dist/DevTools/tab-strip-lab.component.d.ts +76 -0
  56. package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -0
  57. package/dist/DevTools/tab-strip-lab.component.js +247 -0
  58. package/dist/DevTools/tab-strip-lab.component.js.map +1 -0
  59. package/dist/Home/home-application.d.ts +5 -0
  60. package/dist/Home/home-application.d.ts.map +1 -1
  61. package/dist/Home/home-application.js +9 -0
  62. package/dist/Home/home-application.js.map +1 -1
  63. package/dist/Home/home-dashboard.component.d.ts.map +1 -1
  64. package/dist/Home/home-dashboard.component.js +0 -6
  65. package/dist/Home/home-dashboard.component.js.map +1 -1
  66. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +7 -3
  67. package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
  68. package/dist/SystemDiagnostics/system-diagnostics.component.js +22 -21
  69. package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
  70. package/dist/Testing/components/testing-explorer.component.d.ts +9 -0
  71. package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
  72. package/dist/Testing/components/testing-explorer.component.js +28 -5
  73. package/dist/Testing/components/testing-explorer.component.js.map +1 -1
  74. package/dist/actions-dashboards.module.d.ts +23 -24
  75. package/dist/actions-dashboards.module.d.ts.map +1 -1
  76. package/dist/actions-dashboards.module.js +0 -5
  77. package/dist/actions-dashboards.module.js.map +1 -1
  78. package/dist/ai-dashboards.module.d.ts +1 -1
  79. package/dist/ai-dashboards.module.d.ts.map +1 -1
  80. package/dist/ai-dashboards.module.js +4 -1
  81. package/dist/ai-dashboards.module.js.map +1 -1
  82. package/dist/core-dashboards.module.d.ts +46 -42
  83. package/dist/core-dashboards.module.d.ts.map +1 -1
  84. package/dist/core-dashboards.module.js +22 -0
  85. package/dist/core-dashboards.module.js.map +1 -1
  86. package/dist/public-api.d.ts +1 -1
  87. package/dist/public-api.d.ts.map +1 -1
  88. package/dist/public-api.js +1 -1
  89. package/dist/public-api.js.map +1 -1
  90. package/dist/shared/action-scheduled-job.d.ts +58 -0
  91. package/dist/shared/action-scheduled-job.d.ts.map +1 -0
  92. package/dist/shared/action-scheduled-job.js +77 -0
  93. package/dist/shared/action-scheduled-job.js.map +1 -0
  94. package/package.json +73 -70
  95. package/dist/Actions/components/scheduled-actions.component.d.ts +0 -16
  96. package/dist/Actions/components/scheduled-actions.component.d.ts.map +0 -1
  97. package/dist/Actions/components/scheduled-actions.component.js +0 -57
  98. package/dist/Actions/components/scheduled-actions.component.js.map +0 -1
@@ -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 // State\n public isLoading = true;\n public apps: BaseApplication[] = [];\n public appsDisplayData: AppDisplayData[] = []; // Pre-computed display data\n public currentUser: { Name: string; Email: string } | null = null;\n public showConfigDialog = false;\n\n // Favorites\n public favorites: MJUserFavoriteEntity[] = [];\n public favoritesLoading = true;\n\n // Recents\n public recentItems: RecentAccessItem[] = [];\n public recentsLoading = true;\n\n // Notifications\n public unreadNotifications: MJUserNotificationEntity[] = [];\n public notificationsLoading = true;\n\n // Sidebar state - default closed on all screen sizes\n public sidebarOpen = false;\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 /**\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 /**\n * Toggle sidebar visibility\n */\n toggleSidebar(): void {\n this.sidebarOpen = !this.sidebarOpen;\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 /**\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 /**\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 /**\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 /**\n * Handle when config is saved\n */\n onConfigSaved(): void {\n this.showConfigDialog = false;\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 /**\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 /**\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\n // If recordId contains '|', it's in concatenated format\n if (recordId.includes('|')) {\n try {\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(recordId);\n if (compositeKey.KeyValuePairs.length > 0) return compositeKey;\n } catch {\n // Fall through to entity-based lookup\n }\n }\n\n // Plain value — look up entity primary key field(s) to construct the key\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) return null;\n\n const pkField = entityInfo.FirstPrimaryKey;\n if (!pkField) return null;\n\n const compositeKey = new CompositeKey();\n compositeKey.KeyValuePairs = [{ FieldName: pkField.Name, Value: recordId }];\n return compositeKey;\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 /**\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 === 'reports') {\n this.navigationService.OpenReport(recordId, 'Report');\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 /**\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 case 'report':\n this.navigationService.OpenReport(item.recordId, name || 'Report');\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 /**\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 /**\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 /**\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 /**\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 /**\n * Track function for notifications\n */\n trackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return item.ID;\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 trackByGroup(_index: number, group: string): string {\n return 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, 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 // State\n public isLoading = true;\n public apps: BaseApplication[] = [];\n public appsDisplayData: AppDisplayData[] = []; // Pre-computed display data\n public currentUser: { Name: string; Email: string } | null = null;\n public showConfigDialog = false;\n\n // Favorites\n public favorites: MJUserFavoriteEntity[] = [];\n public favoritesLoading = true;\n\n // Recents\n public recentItems: RecentAccessItem[] = [];\n public recentsLoading = true;\n\n // Notifications\n public unreadNotifications: MJUserNotificationEntity[] = [];\n public notificationsLoading = true;\n\n // Sidebar state - default closed on all screen sizes\n public sidebarOpen = false;\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 /**\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 /**\n * Toggle sidebar visibility\n */\n toggleSidebar(): void {\n this.sidebarOpen = !this.sidebarOpen;\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 /**\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 /**\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 /**\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 /**\n * Handle when config is saved\n */\n onConfigSaved(): void {\n this.showConfigDialog = false;\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 /**\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 /**\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\n // If recordId contains '|', it's in concatenated format\n if (recordId.includes('|')) {\n try {\n const compositeKey = new CompositeKey();\n compositeKey.LoadFromConcatenatedString(recordId);\n if (compositeKey.KeyValuePairs.length > 0) return compositeKey;\n } catch {\n // Fall through to entity-based lookup\n }\n }\n\n // Plain value — look up entity primary key field(s) to construct the key\n const entityInfo = this.metadata.Entities.find(e => e.Name === entityName);\n if (!entityInfo) return null;\n\n const pkField = entityInfo.FirstPrimaryKey;\n if (!pkField) return null;\n\n const compositeKey = new CompositeKey();\n compositeKey.KeyValuePairs = [{ FieldName: pkField.Name, Value: recordId }];\n return compositeKey;\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 /**\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 /**\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 /**\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 /**\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 /**\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 /**\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 /**\n * Track function for notifications\n */\n trackByNotification(_index: number, item: MJUserNotificationEntity): string {\n return item.ID;\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 trackByGroup(_index: number, group: string): string {\n return 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"]}