@memberjunction/ng-dashboards 5.24.0 → 5.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/agents/agent-configuration.component.d.ts +15 -33
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +233 -493
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +2 -2
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +7 -7
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +43 -6
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1135 -864
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +4 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +4 -5
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +14 -15
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +4 -4
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +5 -5
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +4 -4
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +5 -5
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts +2 -1
- package/dist/AI/components/requests/agent-requests-resource.component.d.ts.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +1 -0
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +2 -3
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +9 -11
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +44 -8
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +648 -384
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +2 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +2 -0
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +4 -5
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +11 -12
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +2 -3
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +4 -6
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +2 -3
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +4 -6
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +4 -5
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +10 -11
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +13 -12
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +39 -66
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +2 -3
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +4 -6
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +2 -3
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +4 -6
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts +112 -0
- package/dist/ApplicationRoles/application-roles-resource.component.d.ts.map +1 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js +532 -0
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -0
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +1 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +4 -1
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +4 -1
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +4 -1
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +4 -1
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +4 -1
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +2 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +10 -11
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +4 -4
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +8 -9
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +2 -3
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +11 -12
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +1 -0
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +2 -3
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +9 -10
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +2 -2
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts +23 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +167 -213
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +68 -32
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +453 -420
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +10 -3
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +35 -11
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +12 -3
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js +5 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +4 -4
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +4 -5
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +1 -0
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.d.ts.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +2 -0
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.d.ts.map +1 -1
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js +1 -0
- package/dist/Integration/components/mapping-workspace/mapping-workspace.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.d.ts.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -0
- package/dist/Integration/components/overview/overview.component.js.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.d.ts.map +1 -1
- package/dist/Integration/components/pipelines/pipelines.component.js +2 -0
- package/dist/Integration/components/pipelines/pipelines.component.js.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.d.ts.map +1 -1
- package/dist/Integration/components/schedules/schedules.component.js +2 -0
- package/dist/Integration/components/schedules/schedules.component.js.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts +13 -3
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +220 -138
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts +4 -3
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +1 -0
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/index.d.ts +0 -1
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +0 -1
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +2 -0
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +2 -0
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +2 -0
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +2 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +2 -0
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +7 -28
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +25 -107
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +1 -0
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +10 -23
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +41 -103
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-activity-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +1 -0
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +1 -0
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +4 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +9 -10
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +2 -0
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +2 -0
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +2 -0
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +2 -0
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts +2 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +2 -0
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +2 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +1 -0
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.js +9 -10
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/graph-resource.component.js +2 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.d.ts +4 -4
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +10 -11
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +2 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +2 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +19 -19
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -5
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +19 -18
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +8 -0
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +2 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +7 -3
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +49 -48
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts +0 -166
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.d.ts.map +0 -1
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.component.js +0 -991
- package/dist/KnowledgeHub/components/search/knowledge-search-resource.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 } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, CompositeKey, EntityRecordNameInput, RunView } from '@memberjunction/core';\nimport { ResourceData, MJUserFavoriteEntity, MJUserNotificationEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { UserAppConfigComponent } from '@memberjunction/ng-explorer-settings';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\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 private destroy$ = new Subject<void>();\n private metadata = new Metadata();\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 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 AvailableApps: { appId: string; appName: string; icon: string; color: string; navItems: { label: string; icon: string; pinned: boolean }[] }[] = [];\n public AddPanelLoading = false;\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 navigationService: NavigationService,\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 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.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.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 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.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\n ngOnDestroy(): void {\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 this.navigationService.SwitchToApp(deApp.ID, 'Dashboards').then(() => {\n this.navigationService.UpdateActiveTabQueryParams({ dashboard: dashboardId });\n });\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 this.navigationService.SwitchToApp(deApp.ID, 'Queries').then(() => {\n this.navigationService.UpdateActiveTabQueryParams({ queryId: queryId });\n });\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 this.navigationService.SwitchToApp(app.ID, navItemName).then(() => {\n // Apply query params after the tab is created/activated\n if (queryParams && Object.keys(queryParams).length > 0) {\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n });\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 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'];\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['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 * 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 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 default: return pin.ResourceType;\n }\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 const rv = new RunView();\n\n // Load dashboards, views, queries in parallel\n const [dashboards, views, queries] = await Promise.all([\n rv.RunView<{ID: string; Name: string}>({\n EntityName: 'MJ: Dashboards',\n Fields: ['ID', 'Name'],\n ExtraFilter: `Type='Config'`,\n OrderBy: 'Name',\n ResultType: 'simple'\n }),\n rv.RunView<{ID: string; Name: string; Entity: string}>({\n EntityName: 'MJ: User Views',\n Fields: ['ID', 'Name', 'Entity'],\n ExtraFilter: `UserID='${this.metadata.CurrentUser.ID}'`,\n OrderBy: 'Name',\n ResultType: 'simple'\n }),\n rv.RunView<{ID: string; Name: string}>({\n EntityName: 'MJ: Queries',\n Fields: ['ID', 'Name'],\n OrderBy: 'Name',\n ResultType: 'simple'\n })\n ]);\n\n this.AvailableDashboards = (dashboards.Results || []).map(d => ({\n id: d.ID, name: d.Name,\n pinned: this.pinService.IsPinned('Dashboards', { dashboardId: d.ID })\n }));\n\n this.AvailableViews = (views.Results || []).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 = (queries.Results || []).map(q => ({\n id: q.ID, name: q.Name,\n pinned: this.pinService.IsPinned('Queries', { queryId: q.ID })\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 * Toggle a section's collapsed state in the Add Pin panel\n */\n TogglePanelSection(section: string): void {\n this.PanelSectionCollapsed[section] = !this.PanelSectionCollapsed[section];\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 * 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) {\n <div class=\"pin-empty-state\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n <h3>No pinned items yet</h3>\n <p>Pin your favorite dashboards, views, queries, and reports for quick access.</p>\n <button class=\"pin-action-btn primary\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add your first pin\n </button>\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\" (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 {\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\" (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\" (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 {\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\" (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 <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('apps')\">\n <i class=\"fa-solid fa-grid-2\"></i> Applications\n <span class=\"panel-count\">{{ FilterApps().length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['apps']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['apps']\"></i>\n </div>\n @if (!PanelSectionCollapsed['apps']) {\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 }\n </div>\n }\n\n <!-- Dashboards (metadata-driven Config type only) -->\n @if (FilterPanelItems(AvailableDashboards).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('dashboards')\">\n <i class=\"fa-solid fa-gauge-high\"></i> Dashboards\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableDashboards).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['dashboards']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['dashboards']\"></i>\n </div>\n @if (!PanelSectionCollapsed['dashboards']) {\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 }\n </div>\n }\n\n <!-- Views -->\n @if (FilterPanelItems(AvailableViews).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('views')\">\n <i class=\"fa-solid fa-table-list\"></i> Views\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableViews).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['views']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['views']\"></i>\n </div>\n @if (!PanelSectionCollapsed['views']) {\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 }\n </div>\n }\n\n <!-- Queries -->\n @if (FilterPanelItems(AvailableQueries).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('queries')\">\n <i class=\"fa-solid fa-database\"></i> Queries\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableQueries).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['queries']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['queries']\"></i>\n </div>\n @if (!PanelSectionCollapsed['queries']) {\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 }\n </div>\n }\n }\n </div>\n </div>\n }\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 [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 <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Applications Available</h3>\n <p>You don't have any applications configured yet.</p>\n <button mjButton\n variant=\"primary\"\n (click)=\"openConfigDialog()\">\n <i class=\"fa-solid fa-gear\"></i>\n Configure Applications\n </button>\n </div>\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 (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 (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 (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 <div class=\"sidebar-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No quick access items</p>\n </div>\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 } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { Metadata, CompositeKey, EntityRecordNameInput, RunView } from '@memberjunction/core';\nimport { ResourceData, MJUserFavoriteEntity, MJUserNotificationEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { UserAppConfigComponent } from '@memberjunction/ng-explorer-settings';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\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 = new Metadata();\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 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 AvailableApps: { appId: string; appName: string; icon: string; color: string; navItems: { label: string; icon: string; pinned: boolean }[] }[] = [];\n public AddPanelLoading = false;\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 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.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.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 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.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\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 this.navigationService.SwitchToApp(deApp.ID, 'Dashboards').then(() => {\n this.navigationService.UpdateActiveTabQueryParams({ dashboard: dashboardId });\n });\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 this.navigationService.SwitchToApp(deApp.ID, 'Queries').then(() => {\n this.navigationService.UpdateActiveTabQueryParams({ queryId: queryId });\n });\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 this.navigationService.SwitchToApp(app.ID, navItemName).then(() => {\n // Apply query params after the tab is created/activated\n if (queryParams && Object.keys(queryParams).length > 0) {\n this.navigationService.UpdateActiveTabQueryParams(queryParams);\n }\n });\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 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'];\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['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 * 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 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 default: return pin.ResourceType;\n }\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 const rv = new RunView();\n\n // Load dashboards, views, queries in parallel\n const [dashboards, views, queries] = await Promise.all([\n rv.RunView<{ID: string; Name: string}>({\n EntityName: 'MJ: Dashboards',\n Fields: ['ID', 'Name'],\n ExtraFilter: `Type='Config'`,\n OrderBy: 'Name',\n ResultType: 'simple'\n }),\n rv.RunView<{ID: string; Name: string; Entity: string}>({\n EntityName: 'MJ: User Views',\n Fields: ['ID', 'Name', 'Entity'],\n ExtraFilter: `UserID='${this.metadata.CurrentUser.ID}'`,\n OrderBy: 'Name',\n ResultType: 'simple'\n }),\n rv.RunView<{ID: string; Name: string}>({\n EntityName: 'MJ: Queries',\n Fields: ['ID', 'Name'],\n OrderBy: 'Name',\n ResultType: 'simple'\n })\n ]);\n\n this.AvailableDashboards = (dashboards.Results || []).map(d => ({\n id: d.ID, name: d.Name,\n pinned: this.pinService.IsPinned('Dashboards', { dashboardId: d.ID })\n }));\n\n this.AvailableViews = (views.Results || []).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 = (queries.Results || []).map(q => ({\n id: q.ID, name: q.Name,\n pinned: this.pinService.IsPinned('Queries', { queryId: q.ID })\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 * Toggle a section's collapsed state in the Add Pin panel\n */\n TogglePanelSection(section: string): void {\n this.PanelSectionCollapsed[section] = !this.PanelSectionCollapsed[section];\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 * 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) {\n <div class=\"pin-empty-state\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n <h3>No pinned items yet</h3>\n <p>Pin your favorite dashboards, views, queries, and reports for quick access.</p>\n <button class=\"pin-action-btn primary\" (click)=\"OpenAddPinPanel()\">\n <i class=\"fa-solid fa-plus\"></i> Add your first pin\n </button>\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\" (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 {\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\" (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\" (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 {\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\" (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 <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('apps')\">\n <i class=\"fa-solid fa-grid-2\"></i> Applications\n <span class=\"panel-count\">{{ FilterApps().length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['apps']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['apps']\"></i>\n </div>\n @if (!PanelSectionCollapsed['apps']) {\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 }\n </div>\n }\n\n <!-- Dashboards (metadata-driven Config type only) -->\n @if (FilterPanelItems(AvailableDashboards).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('dashboards')\">\n <i class=\"fa-solid fa-gauge-high\"></i> Dashboards\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableDashboards).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['dashboards']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['dashboards']\"></i>\n </div>\n @if (!PanelSectionCollapsed['dashboards']) {\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 }\n </div>\n }\n\n <!-- Views -->\n @if (FilterPanelItems(AvailableViews).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('views')\">\n <i class=\"fa-solid fa-table-list\"></i> Views\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableViews).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['views']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['views']\"></i>\n </div>\n @if (!PanelSectionCollapsed['views']) {\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 }\n </div>\n }\n\n <!-- Queries -->\n @if (FilterPanelItems(AvailableQueries).length > 0) {\n <div class=\"panel-section\">\n <div class=\"panel-section-title collapsible\" (click)=\"TogglePanelSection('queries')\">\n <i class=\"fa-solid fa-database\"></i> Queries\n <span class=\"panel-count\">{{ FilterPanelItems(AvailableQueries).length }}</span>\n <i class=\"section-chevron fa-solid\" [class.fa-chevron-down]=\"!PanelSectionCollapsed['queries']\" [class.fa-chevron-right]=\"PanelSectionCollapsed['queries']\"></i>\n </div>\n @if (!PanelSectionCollapsed['queries']) {\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 }\n </div>\n }\n }\n </div>\n </div>\n }\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 [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 <div class=\"empty-state\">\n <div class=\"empty-icon\">\n <i class=\"fa-solid fa-folder-open\"></i>\n </div>\n <h3>No Applications Available</h3>\n <p>You don't have any applications configured yet.</p>\n <button mjButton\n variant=\"primary\"\n (click)=\"openConfigDialog()\">\n <i class=\"fa-solid fa-gear\"></i>\n Configure Applications\n </button>\n </div>\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 (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 (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 (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 <div class=\"sidebar-empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n <p>No quick access items</p>\n </div>\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"]}
|