@memberjunction/ng-dashboards 6.2.0-edge.3 → 6.2.0-edge.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts +4 -3
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.d.ts.map +1 -1
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js +8 -5
- package/dist/AI/components/analytics/realtime/realtime-transcripts-data.js.map +1 -1
- package/dist/AI/components/duplicates/compare-value.component.d.ts +67 -0
- package/dist/AI/components/duplicates/compare-value.component.d.ts.map +1 -0
- package/dist/AI/components/duplicates/compare-value.component.js +168 -0
- package/dist/AI/components/duplicates/compare-value.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +49 -3
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +287 -169
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +77 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +116 -0
- package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +16 -4
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +2 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +12 -6
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-index-auto.d.ts +29 -0
- package/dist/AI/components/vectors/vector-index-auto.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-index-auto.js +59 -0
- package/dist/AI/components/vectors/vector-index-auto.js.map +1 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +9 -0
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.js +65 -20
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +7 -3
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +3 -2
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +1 -0
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts +0 -3
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +5 -14
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +1 -0
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +2 -0
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +12 -10
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts +14 -43
- package/dist/DashboardBrowser/dashboard-browser-agent-context.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js +6 -29
- package/dist/DashboardBrowser/dashboard-browser-agent-context.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +174 -321
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +522 -1195
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts +116 -0
- package/dist/DashboardBrowser/dashboard-library-filter.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js +277 -0
- package/dist/DashboardBrowser/dashboard-library-filter.js.map +1 -0
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts +26 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js +32 -0
- package/dist/DashboardBrowser/dashboards-agent-tools.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts +58 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js +391 -0
- package/dist/DashboardBrowser/dashboards-categories-resource.component.js.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts +37 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.d.ts.map +1 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js +68 -0
- package/dist/DashboardBrowser/dashboards-categories.helpers.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts +295 -0
- package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.component.js +1022 -0
- package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts +23 -0
- package/dist/DashboardEditor/dashboard-editor.types.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-editor.types.js +3 -0
- package/dist/DashboardEditor/dashboard-editor.types.js.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts +11 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.d.ts.map +1 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js +17 -0
- package/dist/DashboardEditor/dashboard-viewer-factory.js.map +1 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +26 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +302 -219
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js +2 -5
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.d.ts +0 -14
- package/dist/FormBuilder/form-builder-resource.component.d.ts.map +1 -1
- package/dist/FormBuilder/form-builder-resource.component.js +7 -29
- package/dist/FormBuilder/form-builder-resource.component.js.map +1 -1
- package/dist/Home/home-agent-context.d.ts +29 -10
- package/dist/Home/home-agent-context.d.ts.map +1 -1
- package/dist/Home/home-agent-context.js +50 -24
- package/dist/Home/home-agent-context.js.map +1 -1
- package/dist/Home/home-dashboard-switcher.component.d.ts +95 -0
- package/dist/Home/home-dashboard-switcher.component.d.ts.map +1 -0
- package/dist/Home/home-dashboard-switcher.component.js +442 -0
- package/dist/Home/home-dashboard-switcher.component.js.map +1 -0
- package/dist/Home/home-dashboard.component.d.ts +330 -17
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +1702 -1014
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Home/home-menus.d.ts +38 -0
- package/dist/Home/home-menus.d.ts.map +1 -0
- package/dist/Home/home-menus.js +53 -0
- package/dist/Home/home-menus.js.map +1 -0
- package/dist/Home/home-pinned-dashboards.d.ts +33 -0
- package/dist/Home/home-pinned-dashboards.d.ts.map +1 -0
- package/dist/Home/home-pinned-dashboards.js +76 -0
- package/dist/Home/home-pinned-dashboards.js.map +1 -0
- package/dist/PredictiveStudio/components/ps-production.component.d.ts +5 -1
- package/dist/PredictiveStudio/components/ps-production.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-production.component.js +64 -41
- package/dist/PredictiveStudio/components/ps-production.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +3 -2
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js +2 -2
- package/dist/RealtimeRecordings/realtime-recordings-dashboard.component.js.map +1 -1
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts +1 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.d.ts.map +1 -1
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js +7 -0
- package/dist/TelephonyOperations/telephony-operations-dashboard.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +7 -7
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +21 -20
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +4 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/core-dashboards.module.d.ts +69 -62
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +22 -2
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +1 -1
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +3 -1
- package/dist/data-explorer-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/shared/dashboard-library-changes.d.ts +23 -0
- package/dist/shared/dashboard-library-changes.d.ts.map +1 -0
- package/dist/shared/dashboard-library-changes.js +26 -0
- package/dist/shared/dashboard-library-changes.js.map +1 -0
- package/dist/shared/dashboard-owner-names.d.ts +17 -0
- package/dist/shared/dashboard-owner-names.d.ts.map +1 -0
- package/dist/shared/dashboard-owner-names.js +65 -0
- package/dist/shared/dashboard-owner-names.js.map +1 -0
- package/dist/shared/dashboard-recents.d.ts +34 -0
- package/dist/shared/dashboard-recents.d.ts.map +1 -0
- package/dist/shared/dashboard-recents.js +87 -0
- package/dist/shared/dashboard-recents.js.map +1 -0
- package/dist/shared/dashboards-app-install.d.ts +59 -0
- package/dist/shared/dashboards-app-install.d.ts.map +1 -0
- package/dist/shared/dashboards-app-install.js +97 -0
- package/dist/shared/dashboards-app-install.js.map +1 -0
- package/dist/shared/dashboards-app.helpers.d.ts +42 -0
- package/dist/shared/dashboards-app.helpers.d.ts.map +1 -0
- package/dist/shared/dashboards-app.helpers.js +143 -0
- package/dist/shared/dashboards-app.helpers.js.map +1 -0
- package/package.json +69 -68
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core';\nimport { RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { Metadata, CompositeKey } from '@memberjunction/core';\nimport { BaseResourceComponent, NavigationService } from '@memberjunction/ng-shared';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, MJDashboardPartTypeEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity, MJDashboardPermissionEntity } from '@memberjunction/core-entities';\nimport { ShareDialogResult } from './dashboard-share-dialog.component';\nimport {\n BuildDashboardBrowserAgentContext,\n IsValidBrowserViewMode,\n OpenedDashboardPanelSummary,\n} from './dashboard-browser-agent-context';\nimport {\n AgentToolResult,\n ValidateStringParam,\n} from '../shared/agent-tool-validation';\nimport {\n DashboardViewerComponent,\n DashboardNavRequestEvent,\n PanelInteractionEvent,\n AddPanelResult,\n createDefaultDashboardConfig,\n extractPanelsFromLayout,\n DashboardConfig,\n DashboardPanel,\n EditPartDialogResult,\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n BreadcrumbNavigateEvent\n} from '@memberjunction/ng-dashboard-viewer';\n/**\n * Mode for the dashboard browser\n */\ntype BrowserMode = 'list' | 'view' | 'edit';\n\n/**\n * Local shape for an agent client tool. Matches the inline array type that\n * `NavigationService.SetAgentClientTools` accepts, so the mode-scoped tool\n * builders can compose typed `AgentClientTool[]` arrays without `any`.\n */\ninterface AgentClientTool {\n Name: string;\n Description: string;\n ParameterSchema: Record<string, unknown>;\n Handler: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Tolerant result shape for the read-only DETAIL tools, which return a data\n * payload on success. Extends the shared {@link AgentToolResult} (Success /\n * ErrorMessage) with an optional `Data` object. Kept local to DashboardBrowser\n * (the shared validation module is intentionally not modified).\n */\ntype AgentToolDataResult = AgentToolResult & { Data?: Record<string, unknown> };\n\n/**\n * Resource component for browsing, creating, and editing dashboards.\n * Uses the generic DashboardBrowserComponent for list mode and handles\n * view/edit mode internally with routing integration.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public Mode: BrowserMode = 'list';\n\n /** @deprecated Use {@link Mode}. */\n public get mode(): BrowserMode {\n return this.Mode;\n }\n /** @deprecated Use {@link Mode}. */\n public set mode(value: BrowserMode) {\n this.Mode = value;\n }\n public isLoading = false;\n public Dashboards: MJDashboardEntity[] = [];\n\n /** @deprecated Use {@link Dashboards}. */\n public get dashboards(): MJDashboardEntity[] {\n return this.Dashboards;\n }\n /** @deprecated Use {@link Dashboards}. */\n public set dashboards(value: MJDashboardEntity[]) {\n this.Dashboards = value;\n }\n public Categories: MJDashboardCategoryEntity[] = [];\n\n /** @deprecated Use {@link Categories}. */\n public get categories(): MJDashboardCategoryEntity[] {\n return this.Categories;\n }\n /** @deprecated Use {@link Categories}. */\n public set categories(value: MJDashboardCategoryEntity[]) {\n this.Categories = value;\n }\n public SelectedDashboard: MJDashboardEntity | null = null;\n\n /** @deprecated Use {@link SelectedDashboard}. */\n public get selectedDashboard(): MJDashboardEntity | null {\n return this.SelectedDashboard;\n }\n /** @deprecated Use {@link SelectedDashboard}. */\n public set selectedDashboard(value: MJDashboardEntity | null) {\n this.SelectedDashboard = value;\n }\n public SelectedCategoryId: string | null = null;\n\n /** @deprecated Use {@link SelectedCategoryId}. */\n public get selectedCategoryId(): string | null {\n return this.SelectedCategoryId;\n }\n /** @deprecated Use {@link SelectedCategoryId}. */\n public set selectedCategoryId(value: string | null) {\n this.SelectedCategoryId = value;\n }\n public ViewMode: DashboardBrowserViewMode = 'cards';\n\n /** @deprecated Use {@link ViewMode}. */\n public get viewMode(): DashboardBrowserViewMode {\n return this.ViewMode;\n }\n /** @deprecated Use {@link ViewMode}. */\n public set viewMode(value: DashboardBrowserViewMode) {\n this.ViewMode = value;\n }\n public ShowAddPanelDialog = false;\n\n /** @deprecated Use {@link ShowAddPanelDialog}. */\n public get showAddPanelDialog() {\n return this.ShowAddPanelDialog;\n }\n /** @deprecated Use {@link ShowAddPanelDialog}. */\n public set showAddPanelDialog(value) {\n this.ShowAddPanelDialog = value;\n }\n\n /**\n * Free-text search the agent has applied to the dashboard list (via the\n * SearchDashboards tool). Reported in the agent context so the agent knows\n * how the visible list is currently narrowed; cleared by ClearDashboardFilters.\n */\n private agentSearchText = '';\n\n /**\n * Which tool-set ('list' vs 'open') is currently registered with the agent.\n * The Dashboard Browser exposes different tools depending on whether the user\n * is browsing the list or has a dashboard open (mirrors the Data Explorer's\n * mode-scoped tools). We only re-register on the flip — see\n * {@link syncAgentToolsForMode}.\n */\n private lastRegisteredToolMode: 'list' | 'open' | null = null;\n\n // Config dialog state\n public ShowConfigDialog = false;\n\n /** @deprecated Use {@link ShowConfigDialog}. */\n public get showConfigDialog() {\n return this.ShowConfigDialog;\n }\n /** @deprecated Use {@link ShowConfigDialog}. */\n public set showConfigDialog(value) {\n this.ShowConfigDialog = value;\n }\n public ConfigDialogPanel: DashboardPanel | null = null;\n\n /** @deprecated Use {@link ConfigDialogPanel}. */\n public get configDialogPanel(): DashboardPanel | null {\n return this.ConfigDialogPanel;\n }\n /** @deprecated Use {@link ConfigDialogPanel}. */\n public set configDialogPanel(value: DashboardPanel | null) {\n this.ConfigDialogPanel = value;\n }\n public ConfigDialogPartType: MJDashboardPartTypeEntity | null = null;\n\n /** @deprecated Use {@link ConfigDialogPartType}. */\n public get configDialogPartType(): MJDashboardPartTypeEntity | null {\n return this.ConfigDialogPartType;\n }\n /** @deprecated Use {@link ConfigDialogPartType}. */\n public set configDialogPartType(value: MJDashboardPartTypeEntity | null) {\n this.ConfigDialogPartType = value;\n }\n public ConfigDialogClass: string = '';\n\n /** @deprecated Use {@link ConfigDialogClass}. */\n public get configDialogClass(): string {\n return this.ConfigDialogClass;\n }\n /** @deprecated Use {@link ConfigDialogClass}. */\n public set configDialogClass(value: string) {\n this.ConfigDialogClass = value;\n }\n\n // Confirm dialog state\n public ShowConfirmDialog = false;\n\n /** @deprecated Use {@link ShowConfirmDialog}. */\n public get showConfirmDialog() {\n return this.ShowConfirmDialog;\n }\n /** @deprecated Use {@link ShowConfirmDialog}. */\n public set showConfirmDialog(value) {\n this.ShowConfirmDialog = value;\n }\n public ConfirmPanelId: string = '';\n\n /** @deprecated Use {@link ConfirmPanelId}. */\n public get confirmPanelId(): string {\n return this.ConfirmPanelId;\n }\n /** @deprecated Use {@link ConfirmPanelId}. */\n public set confirmPanelId(value: string) {\n this.ConfirmPanelId = value;\n }\n public ConfirmPanelTitle: string = '';\n\n /** @deprecated Use {@link ConfirmPanelTitle}. */\n public get confirmPanelTitle(): string {\n return this.ConfirmPanelTitle;\n }\n /** @deprecated Use {@link ConfirmPanelTitle}. */\n public set confirmPanelTitle(value: string) {\n this.ConfirmPanelTitle = value;\n }\n\n // Share dialog state\n public ShowShareDialog = false;\n\n /** @deprecated Use {@link ShowShareDialog}. */\n public get showShareDialog() {\n return this.ShowShareDialog;\n }\n /** @deprecated Use {@link ShowShareDialog}. */\n public set showShareDialog(value) {\n this.ShowShareDialog = value;\n }\n\n // Edit mode state for name/description\n public EditingName = '';\n\n /** @deprecated Use {@link EditingName}. */\n public get editingName() {\n return this.EditingName;\n }\n /** @deprecated Use {@link EditingName}. */\n public set editingName(value) {\n this.EditingName = value;\n }\n public EditingDescription = '';\n\n /** @deprecated Use {@link EditingDescription}. */\n public get editingDescription() {\n return this.EditingDescription;\n }\n /** @deprecated Use {@link EditingDescription}. */\n public set editingDescription(value) {\n this.EditingDescription = value;\n }\n private originalName = '';\n private originalDescription = '';\n private originalConfig = '';\n\n // Permission state for selected dashboard\n public SelectedDashboardPermissions: DashboardUserPermissions = {\n DashboardID: '',\n CanRead: true,\n CanEdit: true,\n CanDelete: true,\n CanShare: true,\n IsOwner: true,\n PermissionSource: 'owner'\n };\n\n /** @deprecated Use {@link SelectedDashboardPermissions}. */\n public get selectedDashboardPermissions(): DashboardUserPermissions {\n return this.SelectedDashboardPermissions;\n }\n /** @deprecated Use {@link SelectedDashboardPermissions}. */\n public set selectedDashboardPermissions(value: DashboardUserPermissions) {\n this.SelectedDashboardPermissions = value;\n }\n\n // Permission map for all dashboards (used by browser component)\n public DashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n /** @deprecated Use {@link DashboardPermissionsMap}. */\n public get dashboardPermissionsMap(): Map<string, DashboardUserPermissions> {\n return this.DashboardPermissionsMap;\n }\n /** @deprecated Use {@link DashboardPermissionsMap}. */\n public set dashboardPermissionsMap(value: Map<string, DashboardUserPermissions>) {\n this.DashboardPermissionsMap = value;\n }\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public EffectiveCategoryMap: Map<string, string | null> = new Map();\n\n /** @deprecated Use {@link EffectiveCategoryMap}. */\n public get effectiveCategoryMap(): Map<string, string | null> {\n return this.EffectiveCategoryMap;\n }\n /** @deprecated Use {@link EffectiveCategoryMap}. */\n public set effectiveCategoryMap(value: Map<string, string | null>) {\n this.EffectiveCategoryMap = value;\n }\n\n // Query params that arrived before the dashboard list finished loading (cold\n // load / deep link / pin navigation). Applied once loadDashboards() completes.\n private _pendingQueryParams: Record<string, string> | null = null;\n\n @ViewChild('dashboardViewer') DashboardViewer!: DashboardViewerComponent;\n\n /** @deprecated Use {@link DashboardViewer}. */\n get dashboardViewer(): DashboardViewerComponent {\n return this.DashboardViewer;\n }\n /** @deprecated Use {@link DashboardViewer}. */\n set dashboardViewer(value: DashboardViewerComponent) {\n this.DashboardViewer = value;\n }\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n super.ngOnInit();\n // super.ngOnInit() wires up the query-param delivery. Any deep-link/pin params\n // that arrive before loadDashboards() finishes are captured by OnQueryParamsChanged\n // into _pendingQueryParams and applied once the dashboard list is available.\n this.loadDashboards();\n this.loadViewPreference();\n this.syncAgentToolsForMode();\n this.emitAgentContext();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n // ========================================\n // Query-Param Round-Trip (back/forward, deep links, Home pins)\n // ========================================\n\n /**\n * React to query-param changes from browser back/forward, deep links, and Home\n * pin navigation. Driven by BaseResourceComponent's reactive tab-param stream,\n * which reaches this component even when it's cached/detached — the path the old\n * ActivatedRoute subscription could not reliably cover.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void {\n // Category is a cheap assignment with no list lookup — apply it eagerly either way.\n this.SelectedCategoryId = params['category'] || null;\n\n if (params['dashboard'] && this.Dashboards.length === 0) {\n // List not loaded yet — defer the dashboard selection until it is.\n this._pendingQueryParams = params;\n this.cdr.detectChanges();\n return;\n }\n this.applyDashboardSelectionFromParams(params);\n }\n\n /**\n * Open/close the dashboard to match the `dashboard` query param. Requires the\n * dashboard list to be loaded. URL pushes from openDashboard()/backToList() are\n * auto-suppressed while delivering, so this reflects URL → state without looping.\n */\n private applyDashboardSelectionFromParams(params: Record<string, string>): void {\n const dashboardId = params['dashboard'] || null;\n const currentDashboardId = this.SelectedDashboard?.ID || null;\n if (dashboardId === currentDashboardId) {\n this.cdr.detectChanges();\n return;\n }\n\n if (dashboardId) {\n const dashboard = this.Dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.OpenDashboard(dashboard);\n }\n } else {\n this.BackToList();\n }\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return 'Dashboards';\n }\n\n async GetResourceIconClass(data: ResourceData): Promise<string> {\n return 'fa-solid fa-gauge-high';\n }\n\n // ========================================\n // Agent Context & Client Tools\n //\n // 🔒 SAFETY BOUNDARY: the Dashboard Browser exposes ONLY read-only /\n // navigational tools to the AI agent. The tool-set is MODE-SCOPED (mirrors\n // the Data Explorer):\n // COMMON (both modes): SearchDashboards, OpenDashboard (by name/id —\n // still useful while viewing, to switch dashboards), RefreshDashboardList.\n // LIST mode only: SelectCategory, FilterByCategory, ClearDashboardFilters,\n // SwitchViewMode.\n // OPEN mode only (a dashboard is open): BackToList, GetDashboardPanels,\n // GetDashboardDetail.\n // READ-ONLY DETAIL (registered in both modes alongside the above):\n // GetCategoryHierarchy, GetDashboardShares (and GetDashboardDetail).\n //\n // Mutating operations — create / delete / save / share / move a dashboard,\n // create / delete a category, add / remove / configure a panel — are\n // intentionally NOT exposed. The agent helps the user find, open, and\n // understand dashboards (including the panels on the open one, its owner,\n // dates, access level, the category tree, and who it's shared with); the\n // user performs every mutation from the UI. Do NOT add a mutating tool here\n // without revisiting this boundary.\n // ========================================\n\n /**\n * Report the current browser state to the AI agent (async chat agent and\n * realtime co-agent). Re-emit whenever mode, selection, category filter,\n * view mode, or loading state changes.\n */\n private emitAgentContext(): void {\n // Keep the registered tool-set aligned with the current mode before we\n // publish context, so the agent's tool manifest and context agree.\n this.syncAgentToolsForMode();\n\n const selectedCategory = this.SelectedCategoryId\n ? this.Categories.find(c => UUIDsEqual(c.ID, this.SelectedCategoryId!)) ?? null\n : null;\n\n const dashboardOpen = this.Mode !== 'list' && this.SelectedDashboard !== null;\n\n this.navigationService.SetAgentContext(this, BuildDashboardBrowserAgentContext({\n Mode: this.Mode,\n SelectedDashboardId: this.SelectedDashboard?.ID ?? null,\n SelectedDashboardName: this.SelectedDashboard?.Name ?? null,\n VisibleDashboardNames: this.Dashboards.map(d => d.Name || '(untitled)'),\n TotalDashboardCount: this.totalAccessibleDashboardCount,\n FilteredDashboardCount: this.Dashboards.length,\n SearchText: this.agentSearchText,\n AvailableCategoryNames: this.Categories.map(c => c.Name),\n SelectedCategoryId: this.SelectedCategoryId,\n SelectedCategoryName: selectedCategory?.Name ?? null,\n ViewMode: this.ViewMode,\n IsLoading: this.isLoading,\n // Opened-dashboard awareness (only meaningful when a dashboard is open)\n OpenedDashboardName: dashboardOpen ? (this.SelectedDashboard?.Name ?? null) : null,\n OpenedDashboardId: dashboardOpen ? (this.SelectedDashboard?.ID ?? null) : null,\n OpenedDashboardIsEditing: this.Mode === 'edit',\n OpenedDashboardCanEdit: dashboardOpen ? this.SelectedDashboardPermissions.CanEdit : false,\n OpenedDashboardPanels: dashboardOpen ? this.readOpenedDashboardPanels() : [],\n }));\n }\n\n /**\n * Read the panels/widgets on the currently-open dashboard from the viewer.\n *\n * The viewer holds the live `DashboardConfig` whose `layout` embeds each\n * panel in Golden Layout's componentState; {@link extractPanelsFromLayout}\n * pulls them out. We resolve each panel's part-type name via the viewer's\n * `getPartTypeForPanel`. Tolerant by design — if the viewer isn't mounted\n * yet (e.g. context emitted before @ViewChild resolves) we return an empty\n * list rather than throwing.\n *\n * @returns a descriptive panel summary list (never null)\n */\n private readOpenedDashboardPanels(): OpenedDashboardPanelSummary[] {\n const viewer = this.DashboardViewer;\n if (!viewer) return [];\n\n try {\n const config = viewer.getConfig();\n const panels = extractPanelsFromLayout(config?.layout ?? null);\n return panels.map(panel => {\n const partType = viewer.getPartTypeForPanel(panel.id);\n const summary: OpenedDashboardPanelSummary = {\n Title: panel.title || '(untitled panel)',\n PartTypeName: partType?.Name || panel.config?.type || 'Unknown',\n };\n const icon = panel.icon || partType?.Icon || undefined;\n if (icon) {\n summary.Icon = icon;\n }\n return summary;\n });\n } catch {\n // Reading panels is best-effort; never let it break context emission.\n return [];\n }\n }\n\n /**\n * The total number of dashboards accessible to the current user, independent\n * of any in-memory search narrowing the agent has applied. `this.dashboards`\n * shrinks when SearchDashboards filters it, so we read the unfiltered count\n * straight from the engine to keep TotalDashboardCount honest.\n */\n private get totalAccessibleDashboardCount(): number {\n const md = this.ProviderToUse;\n return DashboardEngine.Instance.GetAccessibleDashboards(md.CurrentUser.ID).length;\n }\n\n /**\n * Re-register the agent client tools when the effective tool-mode flips.\n *\n * The Dashboard Browser surfaces different tools depending on whether the\n * user is browsing the list ('list') or has a dashboard open ('open' — the\n * view/edit modes collapse to one tool-mode here). We compute the effective\n * mode, and only when it differs from {@link lastRegisteredToolMode} do we\n * call `SetAgentClientTools` with `[...common, ...(list ? list : open)]`.\n * Guarding on the flip avoids re-registering on every context emission.\n *\n * Mirrors the Data Explorer's mode-scoped tool approach.\n */\n private syncAgentToolsForMode(): void {\n const effective: 'list' | 'open' = this.Mode === 'list' ? 'list' : 'open';\n if (effective === this.lastRegisteredToolMode) {\n return;\n }\n this.lastRegisteredToolMode = effective;\n\n const scoped = effective === 'list' ? this.listModeTools() : this.openModeTools();\n this.navigationService.SetAgentClientTools(this, [...this.commonTools(), ...scoped]);\n }\n\n /**\n * Tools available in BOTH modes — find, switch to, and reload dashboards.\n * OpenDashboard stays available while viewing so the agent can switch to\n * another dashboard without first going back to the list.\n */\n private commonTools(): AgentClientTool[] {\n return [\n {\n Name: 'SearchDashboards',\n Description: 'Search/filter the dashboard list by a text query matching dashboard name or description.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['query'], 'query');\n if (!v.ok) return v.result;\n return this.agentSearchDashboards(v.value);\n },\n },\n {\n Name: 'OpenDashboard',\n Description: 'Open a dashboard for viewing (inline). Accepts either the dashboard NAME (as listed in VisibleDashboards) or its ID. Works from the list and while another dashboard is open (to switch).',\n ParameterSchema: { type: 'object', properties: { dashboard: { type: 'string', description: 'The dashboard name or ID to open.' }, dashboardId: { type: 'string', description: 'Deprecated alias for \"dashboard\" — the dashboard ID.' } } },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['dashboard'] ?? params['dashboardId'], 'dashboard');\n if (!v.ok) return v.result;\n return this.agentOpenDashboard(v.value);\n },\n },\n {\n Name: 'RefreshDashboardList',\n Description: 'Reload the list of dashboards and categories from the server.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async (): Promise<AgentToolResult> => {\n // loadDashboards() rebuilds the full list, so any prior agent\n // search no longer applies — clear the tracked search text.\n this.agentSearchText = '';\n await this.loadDashboards();\n this.emitAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'GetCategoryHierarchy',\n Description: 'Get the dashboard category tree the user can access — each category\\'s name, ID, parent ID, and the number of accessible dashboards filed directly under it. Read-only.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async (): Promise<AgentToolResult> => this.agentGetCategoryHierarchy(),\n },\n {\n Name: 'GetDashboardShares',\n Description: 'List who a dashboard is shared with and their access level (read/edit/delete/share). Defaults to the open dashboard; pass a dashboardId (or name) to inspect another accessible dashboard. Read-only — returns no secrets.',\n ParameterSchema: { type: 'object', properties: { dashboardId: { type: 'string', description: 'Optional dashboard ID or name. Defaults to the open dashboard.' } } },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n return this.agentGetDashboardShares(params['dashboardId']);\n },\n },\n ];\n }\n\n /**\n * Tools available only while browsing the LIST — category filtering, clear\n * filters, and view-mode toggling. These have no meaning while a single\n * dashboard is open, so they're scoped out of the OPEN tool-set.\n */\n private listModeTools(): AgentClientTool[] {\n return [\n {\n Name: 'SelectCategory',\n Description: 'Filter the dashboard list to a category. Accepts either the category NAME (as listed in AvailableCategories) or its ID. Pass an empty string to clear the category filter (show root).',\n ParameterSchema: { type: 'object', properties: { category: { type: 'string', description: 'The category name or ID to filter by. Empty string clears the filter.' } }, required: ['category'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['category'], 'category');\n if (!v.ok) return v.result;\n return this.agentSelectCategory(v.value);\n },\n },\n {\n Name: 'FilterByCategory',\n Description: 'Filter the dashboard list to a category by its ID. Pass an empty string to clear the category filter (show root). Prefer SelectCategory, which also accepts a category name.',\n ParameterSchema: { type: 'object', properties: { categoryId: { type: 'string' } }, required: ['categoryId'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['categoryId'], 'categoryId');\n if (!v.ok) return v.result;\n return this.agentSelectCategory(v.value);\n },\n },\n {\n Name: 'ClearDashboardFilters',\n Description: 'Clear all active dashboard-list filters — both the text search and the category filter — and return to the full list at the root category.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async (): Promise<AgentToolResult> => this.agentClearDashboardFilters(),\n },\n {\n Name: 'SwitchViewMode',\n Description: 'Switch the dashboard list view mode between \"cards\" and \"list\".',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['cards', 'list'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n return this.agentSwitchViewMode(params['mode']);\n },\n },\n ];\n }\n\n /**\n * Tools available only while a dashboard is OPEN (view/edit) — go back to\n * the list, inspect the open dashboard's panels, and read its detail\n * (owner, dates, access level). Scoped out of the LIST tool-set because\n * there's no open dashboard there.\n */\n private openModeTools(): AgentClientTool[] {\n return [\n {\n Name: 'BackToList',\n Description: 'Return from a dashboard view/edit back to the dashboard list.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async (): Promise<AgentToolResult> => {\n this.BackToList();\n this.emitAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'GetDashboardPanels',\n Description: 'List the panels/widgets on a dashboard — each panel\\'s title, part-type, and icon. Defaults to the open dashboard; pass a dashboardId (or name) to inspect another accessible dashboard. Read-only.',\n ParameterSchema: { type: 'object', properties: { dashboardId: { type: 'string', description: 'Optional dashboard ID or name. Defaults to the open dashboard.' } } },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n return this.agentGetDashboardPanels(params['dashboardId']);\n },\n },\n {\n Name: 'GetDashboardDetail',\n Description: 'Get detail about a dashboard — owner, created/updated dates, category, and the current user\\'s access level (CanRead/Edit/Delete/Share, IsOwner). Defaults to the open dashboard; pass a dashboardId (or name) for another accessible dashboard. Read-only.',\n ParameterSchema: { type: 'object', properties: { dashboardId: { type: 'string', description: 'Optional dashboard ID or name. Defaults to the open dashboard.' } } },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n return this.agentGetDashboardDetail(params['dashboardId']);\n },\n },\n ];\n }\n\n /**\n * Filter the dashboard list by a text query against name + description.\n * The generic browser owns the category/view chrome; this surfaces a\n * name/description filter via the same selected-category mechanism is not\n * applicable, so we narrow the in-memory list the browser renders.\n */\n private agentSearchDashboards(query: string): AgentToolResult {\n const q = query.trim().toLowerCase();\n const engine = DashboardEngine.Instance;\n const md = this.ProviderToUse;\n const all = [...engine.GetAccessibleDashboards(md.CurrentUser.ID)];\n\n const matched = q\n ? all.filter(d =>\n (d.Name || '').toLowerCase().includes(q) ||\n (d.Description || '').toLowerCase().includes(q))\n : all;\n\n this.agentSearchText = query.trim();\n this.Dashboards = matched.sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime());\n this.Mode = 'list';\n this.SelectedDashboard = null;\n this.emitAgentContext();\n this.cdr.detectChanges();\n return { Success: true };\n }\n\n /**\n * Apply a category filter by NAME or ID (empty string clears it) and return\n * to the list. Resolves a supplied name (case-insensitive) to its id against\n * the loaded, accessible category list — mirroring the Data Explorer's\n * SelectView name→id resolution.\n */\n private agentSelectCategory(categoryNameOrId: string): AgentToolResult {\n const raw = categoryNameOrId.trim();\n\n // Empty string clears the filter.\n if (!raw) {\n this.SelectedCategoryId = null;\n this.Mode = 'list';\n this.SelectedDashboard = null;\n this.updateUrlQueryParams();\n this.emitAgentContext();\n this.cdr.detectChanges();\n return { Success: true };\n }\n\n // Prefer an exact id match, then fall back to a case-insensitive name match.\n const lowered = raw.toLowerCase();\n const match =\n this.Categories.find(c => UUIDsEqual(c.ID, raw)) ??\n this.Categories.find(c => (c.Name || '').toLowerCase() === lowered);\n\n if (!match) {\n const available = this.Categories.map(c => c.Name).join(', ') || '(none)';\n return { Success: false, ErrorMessage: `No accessible category named or identified by \"${raw}\". Available categories: ${available}.` };\n }\n\n this.SelectedCategoryId = match.ID;\n this.Mode = 'list';\n this.SelectedDashboard = null;\n this.updateUrlQueryParams();\n this.emitAgentContext();\n this.cdr.detectChanges();\n return { Success: true };\n }\n\n /** Clear both the text search and the category filter, returning to the full root list. */\n private agentClearDashboardFilters(): AgentToolResult {\n this.agentSearchText = '';\n this.SelectedCategoryId = null;\n this.Mode = 'list';\n this.SelectedDashboard = null;\n\n // Restore the full accessible list (the search may have narrowed this.dashboards).\n const engine = DashboardEngine.Instance;\n const md = this.ProviderToUse;\n this.Dashboards = [...engine.GetAccessibleDashboards(md.CurrentUser.ID)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime());\n\n this.updateUrlQueryParams();\n this.emitAgentContext();\n this.cdr.detectChanges();\n return { Success: true };\n }\n\n /**\n * Open a dashboard for inline viewing by NAME or ID. Resolves a supplied name\n * (case-insensitive) to its dashboard against the loaded, accessible list —\n * mirroring the Data Explorer's SelectView name→id resolution.\n */\n private agentOpenDashboard(dashboardNameOrId: string): AgentToolResult {\n const raw = dashboardNameOrId.trim();\n if (!raw) return { Success: false, ErrorMessage: 'A dashboard name or ID is required.' };\n\n // Search against the full accessible set (not just this.dashboards, which a\n // prior search may have narrowed) so the agent can open any dashboard by name.\n const engine = DashboardEngine.Instance;\n const md = this.ProviderToUse;\n const accessible = engine.GetAccessibleDashboards(md.CurrentUser.ID);\n\n const lowered = raw.toLowerCase();\n const dashboard =\n accessible.find(d => UUIDsEqual(d.ID, raw)) ??\n accessible.find(d => (d.Name || '').toLowerCase() === lowered);\n\n if (!dashboard) {\n const available = accessible.map(d => d.Name || '(untitled)').slice(0, 25).join(', ') || '(none)';\n return { Success: false, ErrorMessage: `No accessible dashboard named or identified by \"${raw}\". Available dashboards include: ${available}.` };\n }\n this.OpenDashboard(dashboard);\n this.emitAgentContext();\n return { Success: true };\n }\n\n /** Switch and persist the list view mode (cards | list). */\n private agentSwitchViewMode(rawMode: unknown): AgentToolResult {\n if (!IsValidBrowserViewMode(rawMode)) {\n return { Success: false, ErrorMessage: 'mode must be one of: cards, list.' };\n }\n this.ViewMode = rawMode;\n this.saveViewPreference(rawMode);\n this.emitAgentContext();\n this.cdr.detectChanges();\n return { Success: true };\n }\n\n // ========================================\n // Read-only detail tools (GetDashboardPanels / GetDashboardDetail /\n // GetCategoryHierarchy / GetDashboardShares).\n // These return descriptive data only — no mutations, never throw.\n // ========================================\n\n /**\n * Resolve an optional `dashboardId` tool param (ID **or** name, or omitted)\n * to a concrete accessible dashboard. When omitted/empty, defaults to the\n * currently-open dashboard. Returns null with a tolerant error result when\n * nothing matches.\n */\n private resolveDashboardForTool(\n rawParam: unknown,\n ): { ok: true; dashboard: MJDashboardEntity } | { ok: false; result: AgentToolResult } {\n const engine = DashboardEngine.Instance;\n const md = this.ProviderToUse;\n const accessible = engine.GetAccessibleDashboards(md.CurrentUser.ID);\n\n const raw = typeof rawParam === 'string' ? rawParam.trim() : '';\n\n // No param → default to the open dashboard.\n if (!raw) {\n if (this.SelectedDashboard) {\n return { ok: true, dashboard: this.SelectedDashboard };\n }\n return {\n ok: false,\n result: { Success: false, ErrorMessage: 'No dashboard is open. Provide a dashboardId (or name) to inspect a specific dashboard.' },\n };\n }\n\n const lowered = raw.toLowerCase();\n const dashboard =\n accessible.find(d => UUIDsEqual(d.ID, raw)) ??\n accessible.find(d => (d.Name || '').toLowerCase() === lowered);\n\n if (!dashboard) {\n const available = accessible.map(d => d.Name || '(untitled)').slice(0, 25).join(', ') || '(none)';\n return {\n ok: false,\n result: { Success: false, ErrorMessage: `No accessible dashboard named or identified by \"${raw}\". Available dashboards include: ${available}.` },\n };\n }\n return { ok: true, dashboard };\n }\n\n /**\n * Return the panel list for the open (or named) dashboard. For the open\n * dashboard we read live panels from the viewer; for another dashboard we\n * parse its persisted UIConfigDetails. Read-only.\n */\n private agentGetDashboardPanels(rawDashboardId: unknown): AgentToolDataResult {\n const resolved = this.resolveDashboardForTool(rawDashboardId);\n if (!resolved.ok) return resolved.result;\n const dashboard = resolved.dashboard;\n\n // If this is the currently-open dashboard, read the viewer's live panels\n // (reflects any in-session, unsaved layout edits).\n const isOpen = this.SelectedDashboard !== null && UUIDsEqual(dashboard.ID, this.SelectedDashboard.ID);\n const panels = isOpen\n ? this.readOpenedDashboardPanels()\n : this.readPanelsFromPersistedConfig(dashboard);\n\n return {\n Success: true,\n Data: {\n DashboardId: dashboard.ID,\n DashboardName: dashboard.Name,\n PanelCount: panels.length,\n Panels: panels,\n },\n };\n }\n\n /**\n * Parse a dashboard's persisted UIConfigDetails into a descriptive panel\n * summary list, resolving each panel's part-type name from the engine's\n * cached part types. Tolerant — returns [] on missing/invalid config.\n */\n private readPanelsFromPersistedConfig(dashboard: MJDashboardEntity): OpenedDashboardPanelSummary[] {\n const raw = dashboard.UIConfigDetails;\n if (!raw) return [];\n\n try {\n const parsed = JSON.parse(raw) as Partial<DashboardConfig> | null;\n const panels = extractPanelsFromLayout(parsed?.layout ?? null);\n const partTypes = DashboardEngine.Instance.DashboardPartTypes;\n\n return panels.map(panel => {\n const partType = partTypes.find(pt => UUIDsEqual(pt.ID, panel.partTypeId)) ?? null;\n const summary: OpenedDashboardPanelSummary = {\n Title: panel.title || '(untitled panel)',\n PartTypeName: partType?.Name || panel.config?.type || 'Unknown',\n };\n const icon = panel.icon || partType?.Icon || undefined;\n if (icon) {\n summary.Icon = icon;\n }\n return summary;\n });\n } catch {\n return [];\n }\n }\n\n /**\n * Return owner / dates / category / access-level detail for the open (or\n * named) dashboard. Access level comes from the DashboardEngine permissions\n * already computed by the browser. Read-only.\n */\n private agentGetDashboardDetail(rawDashboardId: unknown): AgentToolDataResult {\n const resolved = this.resolveDashboardForTool(rawDashboardId);\n if (!resolved.ok) return resolved.result;\n const dashboard = resolved.dashboard;\n\n const md = this.ProviderToUse;\n const perms = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, md.CurrentUser.ID);\n\n return {\n Success: true,\n Data: {\n DashboardId: dashboard.ID,\n DashboardName: dashboard.Name,\n Description: dashboard.Description ?? null,\n Owner: dashboard.User ?? null,\n CategoryName: dashboard.Category ?? null,\n CategoryId: dashboard.CategoryID ?? null,\n CreatedAt: this.toIsoOrNull(dashboard.__mj_CreatedAt),\n UpdatedAt: this.toIsoOrNull(dashboard.__mj_UpdatedAt),\n Access: {\n CanRead: perms.CanRead,\n CanEdit: perms.CanEdit,\n CanDelete: perms.CanDelete,\n CanShare: perms.CanShare,\n IsOwner: perms.IsOwner,\n PermissionSource: perms.PermissionSource,\n },\n },\n };\n }\n\n /**\n * Return the accessible category tree (name, ID, parent ID, and per-category\n * count of accessible dashboards filed directly under it). Read-only.\n */\n private agentGetCategoryHierarchy(): AgentToolDataResult {\n const md = this.ProviderToUse;\n const engine = DashboardEngine.Instance;\n const categories = engine.GetAccessibleCategories(md.CurrentUser.ID);\n const accessible = engine.GetAccessibleDashboards(md.CurrentUser.ID);\n\n const tree = categories.map(cat => ({\n Name: cat.Name,\n Id: cat.ID,\n ParentId: cat.ParentID ?? null,\n DashboardCount: accessible.filter(d => d.CategoryID && UUIDsEqual(d.CategoryID, cat.ID)).length,\n }));\n\n // Dashboards with no (accessible) category sit at the root.\n const rootDashboardCount = accessible.filter(d => !d.CategoryID).length;\n\n return {\n Success: true,\n Data: {\n CategoryCount: tree.length,\n RootDashboardCount: rootDashboardCount,\n Categories: tree,\n },\n };\n }\n\n /**\n * Return who a dashboard is shared with and their access level. Uses\n * DashboardEngine.GetDashboardShares (the real method) over the cached\n * permission records. Returns no secrets. Read-only.\n */\n private agentGetDashboardShares(rawDashboardId: unknown): AgentToolDataResult {\n const resolved = this.resolveDashboardForTool(rawDashboardId);\n if (!resolved.ok) return resolved.result;\n const dashboard = resolved.dashboard;\n\n const shares: MJDashboardPermissionEntity[] = DashboardEngine.Instance.GetDashboardShares(dashboard.ID);\n\n const sharedWith = shares.map(s => ({\n UserName: s.User ?? null,\n CanRead: s.CanRead,\n CanEdit: s.CanEdit,\n CanDelete: s.CanDelete,\n CanShare: s.CanShare,\n SharedByUserName: s.SharedByUser ?? null,\n }));\n\n return {\n Success: true,\n Data: {\n DashboardId: dashboard.ID,\n DashboardName: dashboard.Name,\n Owner: dashboard.User ?? null,\n ShareCount: sharedWith.length,\n SharedWith: sharedWith,\n },\n };\n }\n\n /** Format a date to ISO, tolerant of null/invalid values. */\n private toIsoOrNull(value: Date | null | undefined): string | null {\n if (!value) return null;\n const time = new Date(value).getTime();\n return Number.isFinite(time) ? new Date(time).toISOString() : null;\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser\n */\n public OnDashboardOpen(event: DashboardOpenEvent): void {\n if (event.OpenInNewTab) {\n // Open in a dedicated Explorer tab via NavigationService\n this.navigationService.OpenDashboard(\n event.Dashboard.ID,\n event.Dashboard.Name,\n { forceNewTab: true }\n );\n } else {\n // Open inline in the browser's view pane\n this.OpenDashboard(event.Dashboard);\n }\n }\n\n /** @deprecated Use {@link OnDashboardOpen}. */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n return this.OnDashboardOpen(event);\n }\n\n /**\n * Open the current dashboard in its own dedicated Explorer tab\n */\n public openInNewTab(): void {\n if (this.SelectedDashboard) {\n this.navigationService.OpenDashboard(\n this.SelectedDashboard.ID,\n this.SelectedDashboard.Name,\n { forceNewTab: true }\n );\n }\n }\n\n /**\n * Handle dashboard edit request from generic browser\n */\n public OnDashboardEdit(event: DashboardEditEvent): void {\n this.EditDashboard(event.Dashboard);\n }\n\n /** @deprecated Use {@link OnDashboardEdit}. */\n public onDashboardEdit(event: DashboardEditEvent): void {\n return this.OnDashboardEdit(event);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async OnDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion atomically\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n if (event.Dashboards.length === 0) return;\n\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n for (const dashboard of event.Dashboards) {\n dashboard.TransactionGroup = tg;\n await dashboard.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(event.Dashboards.map(d => d.ID));\n this.Dashboards = this.Dashboards.filter(d => !deletedIds.has(d.ID));\n } else {\n console.error('Failed to delete dashboards — all changes rolled back');\n }\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnDashboardDelete}. */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n return this.OnDashboardDelete(event);\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async OnDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n if (event.Dashboards.length === 0) return;\n\n const md = this.ProviderToUse;\n const currentUserId = md.CurrentUser.ID;\n const tg = await md.CreateTransactionGroup();\n const sharedDashboardIds: string[] = [];\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n dashboard.TransactionGroup = tg;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n const existingLinks = DashboardEngine.Instance.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.DashboardID, dashboard.ID) && UUIDsEqual(link.UserID, currentUserId)\n );\n\n let link: MJDashboardCategoryLinkEntity;\n if (existingLinks.length > 0) {\n link = existingLinks[0];\n link.DashboardCategoryID = event.TargetCategoryId;\n } else {\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboard.ID;\n link.UserID = currentUserId;\n link.DashboardCategoryID = event.TargetCategoryId;\n }\n link.TransactionGroup = tg;\n await link.Save();\n\n sharedDashboardIds.push(dashboard.ID);\n }\n }\n\n if (await tg.Submit()) {\n // Update the effective category map for the shared dashboards now that the server confirmed\n for (const id of sharedDashboardIds) {\n this.EffectiveCategoryMap.set(id, event.TargetCategoryId);\n }\n this.EffectiveCategoryMap = new Map(this.EffectiveCategoryMap);\n this.Dashboards = [...this.Dashboards];\n this.SelectedCategoryId = event.TargetCategoryId;\n this.updateUrlQueryParams();\n } else {\n console.error('Failed to move dashboards — all changes rolled back');\n }\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnDashboardMove}. */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n return this.OnDashboardMove(event);\n }\n\n /**\n * Handle create dashboard request from generic browser\n */\n public async OnDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n await this.CreateDashboard(event.CategoryId);\n }\n\n /** @deprecated Use {@link OnDashboardCreate}. */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n return this.OnDashboardCreate(event);\n }\n\n /**\n * Handle category change from generic browser - update URL\n */\n public OnCategoryChange(event: CategoryChangeEvent): void {\n this.SelectedCategoryId = event.CategoryId;\n this.updateUrlQueryParams();\n this.emitAgentContext();\n }\n\n /** @deprecated Use {@link OnCategoryChange}. */\n public onCategoryChange(event: CategoryChangeEvent): void {\n return this.OnCategoryChange(event);\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public OnViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.ViewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n this.emitAgentContext();\n }\n\n /** @deprecated Use {@link OnViewPreferenceChange}. */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n return this.OnViewPreferenceChange(event);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async OnCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n console.debug('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.debug('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.debug('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.debug('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.debug('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.Categories.push(category);\n this.Categories = [...this.Categories].sort((a, b) => a.Name.localeCompare(b.Name));\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnCategoryCreate}. */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n return this.OnCategoryCreate(event);\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async OnCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all categories in child-first order so parent FKs are satisfied as we delete.\n // getChildCategoriesRecursive returns pre-order (parent before its descendants);\n // reversing that list gives a valid leaves-first order, then we append the root last.\n const descendants = this.getChildCategoriesRecursive(event.Category.ID);\n descendants.reverse();\n const categoriesToDelete = [...descendants, event.Category];\n\n console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n const categoryIds = new Set(categoriesToDelete.map(c => c.ID));\n const dashboardsToUncategorize = this.Dashboards.filter(d =>\n d.CategoryID && categoryIds.has(d.CategoryID)\n );\n\n // Queue dashboard uncategorize saves first, then category deletes — single atomic transaction\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n for (const dashboard of dashboardsToUncategorize) {\n dashboard.CategoryID = null!;\n dashboard.TransactionGroup = tg;\n await dashboard.Save();\n }\n\n for (const cat of categoriesToDelete) {\n cat.TransactionGroup = tg;\n await cat.Delete();\n }\n\n if (await tg.Submit()) {\n this.Categories = this.Categories.filter(c => !categoryIds.has(c.ID));\n this.Dashboards = [...this.Dashboards];\n } else {\n console.error('[DashboardBrowserResource] Failed to delete categories — all changes rolled back');\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnCategoryDelete}. */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n return this.OnCategoryDelete(event);\n }\n\n /**\n * Handle breadcrumb navigation event\n * Navigates back to list view with optional category selection\n */\n public OnBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n console.debug('[DashboardBrowserResource] Breadcrumb navigate:', event);\n\n // CategoryId is null for root, or a category ID string\n this.SelectedCategoryId = event.CategoryId;\n this.BackToList();\n this.updateUrlQueryParams();\n }\n\n /** @deprecated Use {@link OnBreadcrumbNavigate}. */\n public onBreadcrumbNavigate(event: BreadcrumbNavigateEvent): void {\n return this.OnBreadcrumbNavigate(event);\n }\n\n // ========================================\n // Public Methods - Navigation\n // ========================================\n\n /**\n * Open a dashboard for viewing\n */\n public OpenDashboard(dashboard: MJDashboardEntity): void {\n this.SelectedDashboard = dashboard;\n this.Mode = 'view';\n\n // Compute permissions for the selected dashboard\n const md = this.ProviderToUse;\n this.SelectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n this.updateUrlQueryParams();\n this.NotifyDisplayNameChanged(dashboard.Name || 'Dashboard');\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenDashboard}. */\n public openDashboard(dashboard: MJDashboardEntity): void {\n return this.OpenDashboard(dashboard);\n }\n\n /**\n * Open a dashboard for editing\n */\n public EditDashboard(dashboard: MJDashboardEntity): void {\n // Check if user has edit permission\n const md = this.ProviderToUse;\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(\n dashboard.ID,\n md.CurrentUser.ID\n );\n\n if (!permissions.CanEdit) {\n console.warn('User does not have permission to edit this dashboard');\n return;\n }\n\n this.SelectedDashboard = dashboard;\n this.SelectedDashboardPermissions = permissions;\n this.Mode = 'edit';\n\n // Initialize editing fields\n this.EditingName = dashboard.Name;\n this.EditingDescription = dashboard.Description || '';\n\n // Store originals for cancel\n this.originalName = dashboard.Name;\n this.originalDescription = dashboard.Description || '';\n this.originalConfig = dashboard.UIConfigDetails || '';\n\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link EditDashboard}. */\n public editDashboard(dashboard: MJDashboardEntity): void {\n return this.EditDashboard(dashboard);\n }\n\n /**\n * Go back to list view\n */\n public BackToList(): void {\n this.SelectedDashboard = null;\n this.Mode = 'list';\n this.updateUrlQueryParams();\n this.NotifyDisplayNameChanged('Dashboards');\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link BackToList}. */\n public backToList(): void {\n return this.BackToList();\n }\n\n /**\n * Toggle edit mode for current dashboard\n */\n public ToggleEditMode(): void {\n if (this.Mode === 'view' && this.SelectedDashboard) {\n this.EditDashboard(this.SelectedDashboard);\n } else if (this.Mode === 'edit') {\n this.Mode = 'view';\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link ToggleEditMode}. */\n public toggleEditMode(): void {\n return this.ToggleEditMode();\n }\n\n /**\n * Open the share dialog for the current dashboard\n */\n public OpenShareDialog(): void {\n if (!this.SelectedDashboard) return;\n\n // Verify user has share permission\n if (!this.SelectedDashboardPermissions.CanShare) {\n console.warn('User does not have permission to share this dashboard');\n return;\n }\n\n this.ShowShareDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenShareDialog}. */\n public openShareDialog(): void {\n return this.OpenShareDialog();\n }\n\n /**\n * Close the share dialog\n */\n public CloseShareDialog(): void {\n this.ShowShareDialog = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CloseShareDialog}. */\n public closeShareDialog(): void {\n return this.CloseShareDialog();\n }\n\n /**\n * Handle share dialog result\n */\n public OnShareDialogResult(result: ShareDialogResult): void {\n this.ShowShareDialog = false;\n\n if (result.Action === 'save' && this.SelectedDashboard) {\n // Recompute permissions after sharing changes\n const md = this.ProviderToUse;\n this.SelectedDashboardPermissions = DashboardEngine.Instance.GetDashboardPermissions(\n this.SelectedDashboard.ID,\n md.CurrentUser.ID\n );\n }\n\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnShareDialogResult}. */\n public onShareDialogResult(result: ShareDialogResult): void {\n return this.OnShareDialogResult(result);\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Create a new dashboard\n */\n public async CreateDashboard(categoryId?: string | null): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n const dashboard = await md.GetEntityObject<MJDashboardEntity>('MJ: Dashboards');\n\n dashboard.Name = 'New Dashboard';\n dashboard.Description = '';\n dashboard.UserID = md.CurrentUser.ID;\n dashboard.UIConfigDetails = JSON.stringify(createDefaultDashboardConfig());\n\n if (categoryId) {\n dashboard.CategoryID = categoryId;\n } else if (this.SelectedCategoryId) {\n dashboard.CategoryID = this.SelectedCategoryId;\n }\n\n const saved = await dashboard.Save();\n\n if (saved) {\n this.Dashboards.unshift(dashboard);\n this.Dashboards = [...this.Dashboards];\n this.EditDashboard(dashboard);\n } else {\n console.error('Failed to save dashboard:', dashboard.LatestResult);\n }\n } catch (err) {\n console.error('Failed to create dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link CreateDashboard}. */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n return this.CreateDashboard(categoryId);\n }\n\n /**\n * Save the current dashboard\n */\n public async SaveDashboard(): Promise<void> {\n if (!this.SelectedDashboard) return;\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n this.SelectedDashboard.Name = this.EditingName;\n this.SelectedDashboard.Description = this.EditingDescription;\n\n if (this.DashboardViewer) {\n await this.DashboardViewer.save();\n }\n\n this.originalName = this.EditingName;\n this.originalDescription = this.EditingDescription;\n this.originalConfig = this.SelectedDashboard.UIConfigDetails || '';\n\n // Update the dashboard in the list\n this.Dashboards = [...this.Dashboards];\n\n this.Mode = 'view';\n } catch (err) {\n console.error('Failed to save dashboard:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link SaveDashboard}. */\n public async saveDashboard(): Promise<void> {\n return this.SaveDashboard();\n }\n\n /**\n * Cancel editing and revert changes\n */\n public CancelEdit(): void {\n if (!this.SelectedDashboard) {\n this.BackToList();\n return;\n }\n\n this.SelectedDashboard.Name = this.originalName;\n this.SelectedDashboard.Description = this.originalDescription;\n this.SelectedDashboard.UIConfigDetails = this.originalConfig;\n\n this.EditingName = '';\n this.EditingDescription = '';\n\n this.Mode = 'view';\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link CancelEdit}. */\n public cancelEdit(): void {\n return this.CancelEdit();\n }\n\n /**\n * Handle name input blur - validate name is not empty\n */\n public OnNameBlur(): void {\n if (!this.EditingName.trim()) {\n this.EditingName = this.originalName || 'Untitled Dashboard';\n }\n }\n\n /** @deprecated Use {@link OnNameBlur}. */\n public onNameBlur(): void {\n return this.OnNameBlur();\n }\n\n // ========================================\n // Public Methods - Part Management\n // ========================================\n\n /**\n * Open the Add Part dialog\n */\n public OpenAddPartDialog(): void {\n this.ShowAddPanelDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenAddPartDialog}. */\n public openAddPartDialog(): void {\n return this.OpenAddPartDialog();\n }\n\n /**\n * Handle panel interaction events from the viewer\n */\n public OnPanelInteraction(event: PanelInteractionEvent): void {\n if (event.interactionType !== 'custom') return;\n\n const action = event.payload?.['action'];\n\n switch (action) {\n case 'add-panel-requested':\n this.OpenAddPartDialog();\n break;\n\n case 'configure-part-requested':\n this.OpenConfigDialog(event.panelId);\n break;\n\n case 'remove-part-requested':\n this.OpenRemoveConfirmDialog(\n event.panelId,\n event.payload?.['panelTitle'] as string || 'this part'\n );\n break;\n }\n }\n\n /** @deprecated Use {@link OnPanelInteraction}. */\n public onPanelInteraction(event: PanelInteractionEvent): void {\n return this.OnPanelInteraction(event);\n }\n\n /**\n * Handle navigation events from panels\n */\n public OnNavigationRequested(event: DashboardNavRequestEvent): void {\n const request = event.request;\n const openInNewTab = request.openInNewTab || false;\n\n switch (request.type) {\n case 'OpenEntityRecord': {\n // Navigate to entity record\n // recordId is either a full \"F1|v1||F2|v2\" segment or a bare value; a bare value maps onto\n // the entity's real key column, whatever it is called\n const entity = this.ProviderToUse.Entities.find(e => e.Name === request.entityName);\n const compositeKey = CompositeKey.FromURLSegment(entity, request.recordId);\n this.navigationService.OpenEntityRecord(\n request.entityName,\n compositeKey,\n { forceNewTab: openInNewTab }\n );\n break;\n }\n case 'OpenDashboard': {\n // Navigate to another dashboard\n const targetDashboard = this.Dashboards.find(d => UUIDsEqual(d.ID, request.dashboardId));\n if (targetDashboard) {\n if (openInNewTab) {\n this.navigationService.OpenDashboard(\n targetDashboard.ID,\n targetDashboard.Name,\n { forceNewTab: true }\n );\n } else {\n this.OpenDashboard(targetDashboard);\n }\n }\n break;\n }\n case 'OpenQuery': {\n // Navigate to query viewer\n const md = this.ProviderToUse;\n const queryInfo = md.Queries.find(q => UUIDsEqual(q.ID, request.queryId));\n if (queryInfo) {\n this.navigationService.OpenQuery(\n request.queryId,\n queryInfo.Name,\n { forceNewTab: openInNewTab }\n );\n }\n break;\n }\n case 'OpenNavItem': {\n // Navigate to a specific nav item within an application\n const appId = request.appName ? this.resolveAppId(request.appName) : undefined;\n this.navigationService.OpenNavItemByName(request.navItemName, undefined, appId, {\n queryParams: request.queryParams\n });\n break;\n }\n }\n }\n\n /** @deprecated Use {@link OnNavigationRequested}. */\n public onNavigationRequested(event: DashboardNavRequestEvent): void {\n return this.OnNavigationRequested(event);\n }\n\n /**\n * Resolve an application name to its ID\n */\n private resolveAppId(appName: string): string | undefined {\n const md = this.ProviderToUse;\n const app = md.Applications.find(a => a.Name.toLowerCase() === appName.toLowerCase());\n return app?.ID;\n }\n\n /**\n * Handle add panel dialog result\n */\n public async OnPanelAdded(result: AddPanelResult): Promise<void> {\n if (this.DashboardViewer) {\n await this.DashboardViewer.addPanel(\n result.PartType.ID,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.ShowAddPanelDialog = false;\n // Panel set changed — refresh opened-dashboard context for the agent.\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnPanelAdded}. */\n public async onPanelAdded(result: AddPanelResult): Promise<void> {\n return this.OnPanelAdded(result);\n }\n\n /**\n * Handle add panel dialog cancel\n */\n public OnAddPanelCancelled(): void {\n this.ShowAddPanelDialog = false;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OnAddPanelCancelled}. */\n public onAddPanelCancelled(): void {\n return this.OnAddPanelCancelled();\n }\n\n // ========================================\n // Public Methods - Config Dialog\n // ========================================\n\n /**\n * Open the config dialog for a panel\n */\n public OpenConfigDialog(panelId: string): void {\n if (!this.DashboardViewer) return;\n\n const panel = this.DashboardViewer.getPanel(panelId);\n const partType = this.DashboardViewer.getPartTypeForPanel(panelId);\n\n if (!panel || !partType) {\n console.warn('Could not find panel or part type for config dialog');\n return;\n }\n\n this.ConfigDialogPanel = panel;\n this.ConfigDialogPartType = partType;\n this.ConfigDialogClass = partType.ConfigDialogClass || '';\n this.ShowConfigDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenConfigDialog}. */\n public openConfigDialog(panelId: string): void {\n return this.OpenConfigDialog(panelId);\n }\n\n /**\n * Handle config dialog save\n */\n public OnConfigDialogSaved(result: EditPartDialogResult): void {\n if (this.DashboardViewer && this.ConfigDialogPanel) {\n this.DashboardViewer.updatePanelConfig(\n this.ConfigDialogPanel.id,\n result.Config,\n result.Title,\n result.Icon\n );\n }\n this.closeConfigDialog();\n // A panel's title/icon/config may have changed — refresh agent context.\n this.emitAgentContext();\n }\n\n /** @deprecated Use {@link OnConfigDialogSaved}. */\n public onConfigDialogSaved(result: EditPartDialogResult): void {\n return this.OnConfigDialogSaved(result);\n }\n\n /**\n * Handle config dialog cancel\n */\n public OnConfigDialogCancelled(): void {\n this.closeConfigDialog();\n }\n\n /** @deprecated Use {@link OnConfigDialogCancelled}. */\n public onConfigDialogCancelled(): void {\n return this.OnConfigDialogCancelled();\n }\n\n /**\n * Close the config dialog\n */\n private closeConfigDialog(): void {\n this.ShowConfigDialog = false;\n this.ConfigDialogPanel = null;\n this.ConfigDialogPartType = null;\n this.ConfigDialogClass = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Public Methods - Remove Confirm Dialog\n // ========================================\n\n /**\n * Open the remove confirmation dialog\n */\n public OpenRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n this.ConfirmPanelId = panelId;\n this.ConfirmPanelTitle = panelTitle;\n this.ShowConfirmDialog = true;\n this.cdr.detectChanges();\n }\n\n /** @deprecated Use {@link OpenRemoveConfirmDialog}. */\n public openRemoveConfirmDialog(panelId: string, panelTitle: string): void {\n return this.OpenRemoveConfirmDialog(panelId, panelTitle);\n }\n\n /**\n * Handle remove confirmation\n */\n public OnRemoveConfirmed(): void {\n if (this.DashboardViewer && this.ConfirmPanelId) {\n this.DashboardViewer.confirmRemovePanel(this.ConfirmPanelId);\n }\n this.closeRemoveConfirmDialog();\n // Panel set changed — refresh opened-dashboard context for the agent.\n this.emitAgentContext();\n }\n\n /** @deprecated Use {@link OnRemoveConfirmed}. */\n public onRemoveConfirmed(): void {\n return this.OnRemoveConfirmed();\n }\n\n /**\n * Handle remove cancel\n */\n public OnRemoveCancelled(): void {\n this.closeRemoveConfirmDialog();\n }\n\n /** @deprecated Use {@link OnRemoveCancelled}. */\n public onRemoveCancelled(): void {\n return this.OnRemoveCancelled();\n }\n\n /**\n * Close the remove confirm dialog\n */\n private closeRemoveConfirmDialog(): void {\n this.ShowConfirmDialog = false;\n this.ConfirmPanelId = '';\n this.ConfirmPanelTitle = '';\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data\n const engine = DashboardEngine.Instance;\n await engine.Config(false); // Wait for engine to load data\n\n const md = this.ProviderToUse;\n const currentUserId = md.CurrentUser.ID;\n\n // Get data from engine - sort dashboards by updated date, categories by name\n // Filter dashboards to only those accessible to the current user\n this.Dashboards = [...engine.GetAccessibleDashboards(currentUserId)].sort((a, b) =>\n new Date(b.__mj_UpdatedAt).getTime() - new Date(a.__mj_UpdatedAt).getTime()\n );\n // Filter categories to only those owned by or shared with the current user\n this.Categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Build permissions map and effective category map for all dashboards\n this.DashboardPermissionsMap = new Map();\n this.EffectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinks = engine.DashboardCategoryLinks.filter(\n link => UUIDsEqual(link.UserID, currentUserId)\n );\n\n for (const dashboard of this.Dashboards) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.DashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinks.find(\n link => UUIDsEqual(link.DashboardID, dashboard.ID)\n );\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.EffectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.EffectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n\n console.debug('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.Dashboards.length,\n categoryCount: this.Categories.length,\n sharedDashboardsInEffectiveMap: this.EffectiveCategoryMap.size,\n categories: this.Categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n // List is now loaded — apply any query-param selection. Use params deferred by\n // OnQueryParamsChanged during the cold load if present, otherwise read the tab's\n // current params (covers deep links and Home pin navigation).\n const params = this._pendingQueryParams ?? this.GetQueryParams();\n this._pendingQueryParams = null;\n if (params && Object.keys(params).length > 0) {\n this.SelectedCategoryId = params['category'] || this.SelectedCategoryId;\n this.applyDashboardSelectionFromParams(params);\n }\n\n this.emitAgentContext();\n this.NotifyLoadComplete();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n /**\n * Update the URL query params for the current tab.\n * Routes through BaseResourceComponent.UpdateQueryParams, which updates the tab\n * configuration (triggering the shell's URL sync while respecting app-scoped\n * routes) and is auto-suppressed while delivering OnQueryParamsChanged so\n * reflecting URL → state never loops back into a redundant URL push.\n */\n private updateUrlQueryParams(): void {\n const queryParams: Record<string, string | null> = {};\n\n // Track category\n if (this.SelectedCategoryId) {\n queryParams['category'] = this.SelectedCategoryId;\n } else {\n queryParams['category'] = null;\n }\n\n // Track dashboard (for browser back/forward support)\n if (this.SelectedDashboard) {\n queryParams['dashboard'] = this.SelectedDashboard.ID;\n } else {\n queryParams['dashboard'] = null;\n }\n\n // Push via the base-class method (auto-suppressed during OnQueryParamsChanged\n // delivery) so the URL update respects app-scoped routes without loop-back.\n this.UpdateQueryParams(queryParams);\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.Categories.filter(c => UUIDsEqual(c.ParentID, parentId));\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.ViewMode = stored;\n }\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Dashboard Browser Resource -->\n<div class=\"dashboard-browser-resource\">\n <!-- List Mode - Uses Generic DashboardBrowserComponent -->\n @if (mode === 'list') {\n <mj-dashboard-browser\n [Dashboards]=\"dashboards\"\n [Categories]=\"categories\"\n [SelectedCategoryId]=\"selectedCategoryId\"\n [ViewMode]=\"viewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"dashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"effectiveCategoryMap\"\n (DashboardOpen)=\"onDashboardOpen($event)\"\n (DashboardEdit)=\"onDashboardEdit($event)\"\n (DashboardDelete)=\"onDashboardDelete($event)\"\n (DashboardMove)=\"onDashboardMove($event)\"\n (DashboardCreate)=\"onDashboardCreate($event)\"\n (CategoryCreate)=\"onCategoryCreate($event)\"\n (CategoryDelete)=\"onCategoryDelete($event)\"\n (CategoryChange)=\"onCategoryChange($event)\"\n (ViewPreferenceChange)=\"onViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n }\n\n <!-- View/Edit Mode -->\n @if (mode === 'view' || mode === 'edit') {\n <!-- View Mode Toolbar - matches browser toolbar structure -->\n @if (mode === 'view') {\n <div class=\"viewer-toolbar\">\n <!-- Breadcrumb navigation (includes its own padding/styling) -->\n <mj-dashboard-breadcrumb\n [Categories]=\"categories\"\n [CurrentCategoryId]=\"selectedDashboard?.CategoryID || null\"\n [CurrentDashboard]=\"selectedDashboard\"\n [ShowDashboardName]=\"true\"\n [AllowDragDrop]=\"false\"\n Size=\"large\"\n RootIcon=\"fa-solid fa-gauge-high\"\n RootLabel=\"Dashboards\"\n (Navigate)=\"onBreadcrumbNavigate($event)\">\n </mj-dashboard-breadcrumb>\n <!-- Right-side Actions -->\n <div class=\"toolbar-actions\">\n <!-- Shared indicator for non-owned dashboards -->\n @if (!selectedDashboardPermissions.IsOwner && selectedDashboardPermissions.CanRead) {\n <span class=\"shared-indicator\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared with you\n </span>\n }\n <button\n class=\"btn-icon\"\n title=\"Open in its own tab\"\n (click)=\"openInNewTab()\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n <!-- Share button - only shown if user can share -->\n @if (selectedDashboardPermissions.CanShare) {\n <button\n class=\"btn-icon\"\n title=\"Share Dashboard\"\n (click)=\"openShareDialog()\">\n <i class=\"fa-solid fa-user-plus\"></i>\n </button>\n }\n <!-- Edit button - only shown if user can edit -->\n @if (selectedDashboardPermissions.CanEdit) {\n <button\n class=\"btn-icon\"\n title=\"Edit Dashboard\"\n (click)=\"toggleEditMode()\">\n <i class=\"fa-solid fa-edit\"></i>\n </button>\n }\n </div>\n </div>\n }\n <!-- Edit Mode Header - different layout -->\n @if (mode === 'edit') {\n <div class=\"viewer-header editing\">\n <div class=\"header-left\">\n <!-- Add Part button on the left -->\n <button\n class=\"btn-add-part\"\n (click)=\"openAddPartDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Part\n </button>\n <!-- Separator -->\n <div class=\"header-separator\"></div>\n <!-- Editable name/description -->\n <div class=\"dashboard-info-edit\">\n <input\n type=\"text\"\n class=\"dashboard-name-input\"\n [(ngModel)]=\"editingName\"\n placeholder=\"Dashboard name\"\n (blur)=\"onNameBlur()\">\n <input\n type=\"text\"\n class=\"dashboard-description-input\"\n [(ngModel)]=\"editingDescription\"\n placeholder=\"Add a description...\">\n </div>\n </div>\n <div class=\"header-right\">\n <!-- Save, Cancel buttons -->\n <button\n class=\"btn-primary\"\n (click)=\"saveDashboard()\">\n <i class=\"fa-solid fa-save\"></i>\n Save\n </button>\n <button\n class=\"btn-cancel\"\n (click)=\"cancelEdit()\">\n Cancel\n </button>\n </div>\n </div>\n }\n <!-- Dashboard Viewer -->\n <div class=\"viewer-content\">\n <mj-dashboard-viewer\n #dashboardViewer\n [dashboard]=\"selectedDashboard\"\n [isEditing]=\"mode === 'edit'\"\n [showToolbar]=\"false\"\n [showBreadcrumb]=\"false\"\n (panelInteraction)=\"onPanelInteraction($event)\"\n (navigationRequested)=\"onNavigationRequested($event)\">\n </mj-dashboard-viewer>\n </div>\n <!-- Add Panel Dialog -->\n @if (dashboardViewer) {\n <mj-add-panel-dialog\n [visible]=\"showAddPanelDialog\"\n [partTypes]=\"dashboardViewer.getPartTypes()\"\n (panelAdded)=\"onPanelAdded($event)\"\n (cancelled)=\"onAddPanelCancelled()\">\n </mj-add-panel-dialog>\n }\n <!-- Generic Edit Part Dialog - dynamically loads config panels via ClassFactory -->\n <mj-edit-part-dialog\n [Visible]=\"showConfigDialog\"\n [PartType]=\"configDialogPartType\"\n [Panel]=\"configDialogPanel\"\n [Config]=\"configDialogPanel?.config || null\"\n (Saved)=\"onConfigDialogSaved($event)\"\n (Cancelled)=\"onConfigDialogCancelled()\">\n </mj-edit-part-dialog>\n <!-- Remove Part Confirmation Dialog -->\n <mj-confirm-dialog\n [visible]=\"showConfirmDialog\"\n type=\"danger\"\n title=\"Remove Part\"\n [message]=\"'Are you sure you want to remove \\'' + confirmPanelTitle + '\\' from this dashboard?'\"\n confirmText=\"Remove\"\n cancelText=\"Cancel\"\n (confirmed)=\"onRemoveConfirmed()\"\n (cancelled)=\"onRemoveCancelled()\">\n </mj-confirm-dialog>\n <!-- Share Dashboard Dialog -->\n <mj-dashboard-share-dialog\n [Visible]=\"showShareDialog\"\n [Dashboard]=\"selectedDashboard\"\n (Result)=\"onShareDialogResult($event)\">\n </mj-dashboard-share-dialog>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"dashboard-browser-resource.component.js","sourceRoot":"","sources":["../../src/DashboardBrowser/dashboard-browser-resource.component.ts","../../src/DashboardBrowser/dashboard-browser-resource.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef, ChangeDetectionStrategy, inject } from '@angular/core';\nimport { skip, takeUntil } from 'rxjs/operators';\nimport { LogError } from '@memberjunction/core';\nimport { CountByUUID, GroupByUUID, IndexByUUID, RegisterClass , UUIDsEqual } from '@memberjunction/global';\nimport { BaseResourceComponent, DashboardFavoritesService } from '@memberjunction/ng-shared';\nimport { RecentAccessService } from '@memberjunction/ng-shared-generic';\nimport { ApplicationManager } from '@memberjunction/ng-base-application';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport type { MJLeftNavItem, MJLeftNavSection } from '@memberjunction/ng-ui-components';\nimport { ResourceData, MJDashboardEntity, MJDashboardCategoryEntity, DashboardEngine, DashboardUserPermissions, MJDashboardCategoryLinkEntity, MJDashboardPermissionEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport {\n BuildDashboardBrowserAgentContext,\n IsValidBrowserViewMode,\n} from './dashboard-browser-agent-context';\nimport {\n BrowseLocation,\n BuildLibraryRailSections,\n CountDashboardsByCategory,\n CountLibraryDashboards,\n DASHBOARD_LIBRARY_FILTERS,\n DashboardLibraryFilter,\n FilterDashboardsForLibrary,\n IsBrowsableDashboard,\n IsCategoryFolderLocation,\n IsDashboardLibraryFilter,\n LibraryEmptyState,\n LibraryEmptyStateText,\n LibraryFilterContext,\n LocationQueryParams,\n ParseRailItemId,\n RailActiveItemId,\n ResolveBrowseLocation,\n SameBrowseLocation,\n ToggleExpandedId,\n UNCATEGORIZED_CATEGORY_ID,\n VisibleLibraryDashboards,\n WithExpandedAncestors,\n} from './dashboard-library-filter';\nimport { LoadRecentDashboardIds, ObserveRecentDashboardIds } from '../shared/dashboard-recents';\nimport { ObserveDashboardLibraryChanges } from '../shared/dashboard-library-changes';\nimport { BuildOwnerLabels, LoadDashboardOwnerNames, OwnerIdsToLoad } from '../shared/dashboard-owner-names';\nimport { CreateBlankDashboard, DashboardNameMaxLength, DashboardsAppOpenOptions } from '../shared/dashboards-app.helpers';\nimport {\n AgentToolResult,\n ValidateStringParam,\n} from '../shared/agent-tool-validation';\nimport type {\n // Browser event types from generic component\n DashboardOpenEvent,\n DashboardEditEvent,\n DashboardDeleteEvent,\n DashboardMoveEvent,\n DashboardCreateEvent,\n CategoryCreateEvent,\n CategoryDeleteEvent,\n CategoryChangeEvent,\n ViewPreferenceChangeEvent,\n DashboardBrowserViewMode,\n DashboardFavoriteToggleEvent,\n} from '@memberjunction/ng-dashboard-viewer';\nimport { DASHBOARD_NAME_MAX_LENGTH } from '@memberjunction/ng-dashboard-viewer';\n\n/**\n * Local shape for an agent client tool. Matches the inline array type that\n * `NavigationService.SetAgentClientTools` accepts, so the tool builders can\n * compose typed `AgentClientTool[]` arrays without `any`.\n */\ninterface AgentClientTool {\n Name: string;\n Description: string;\n ParameterSchema: Record<string, unknown>;\n Handler: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Tolerant result shape for the read-only DETAIL tools, which return a data\n * payload on success. Extends the shared {@link AgentToolResult} (Success /\n * ErrorMessage) with an optional `Data` object. Kept local to DashboardBrowser\n * (the shared validation module is intentionally not modified).\n */\ntype AgentToolDataResult = AgentToolResult & { Data?: Record<string, unknown> };\n\n/**\n * Library page of the Dashboards app. A left rail picks a Library filter (All, Mine, Shared with\n * me, Favorites, Recently opened), a category or Uncategorized; the generic\n * DashboardBrowserComponent lists the result. Every list is flat, favorites first, then the\n * dashboards opened last, then the rest; a category opens as a folder. Cards show a star the user\n * can toggle and the owner (\"You\" or the owner's name). A click opens the dashboard in a tab of the\n * Dashboards app, in place of the preview tab, so Back returns to the Library. A Shift, Ctrl or Cmd\n * click opens it in a separate tab. New dashboard asks for the name first, then opens the new\n * dashboard in edit mode.\n */\n@RegisterClass(BaseResourceComponent, 'DashboardBrowserResource')\n@Component({\n standalone: false,\n selector: 'mj-dashboard-browser-resource',\n templateUrl: './dashboard-browser-resource.component.html',\n styleUrls: ['./dashboard-browser-resource.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DashboardBrowserResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n // ========================================\n // State\n // ========================================\n\n public isLoading = false;\n public Dashboards: MJDashboardEntity[] = [];\n\n /** @deprecated Use {@link Dashboards}. */\n public get dashboards(): MJDashboardEntity[] {\n return this.Dashboards;\n }\n /** @deprecated Use {@link Dashboards}. */\n public set dashboards(value: MJDashboardEntity[]) {\n this.Dashboards = value;\n }\n public Categories: MJDashboardCategoryEntity[] = [];\n\n /** @deprecated Use {@link Categories}. */\n public get categories(): MJDashboardCategoryEntity[] {\n return this.Categories;\n }\n /** @deprecated Use {@link Categories}. */\n public set categories(value: MJDashboardCategoryEntity[]) {\n this.Categories = value;\n }\n public SelectedCategoryId: string | null = null;\n\n /** @deprecated Use {@link SelectedCategoryId}. */\n public get selectedCategoryId(): string | null {\n return this.SelectedCategoryId;\n }\n /** @deprecated Use {@link SelectedCategoryId}. */\n public set selectedCategoryId(value: string | null) {\n this.SelectedCategoryId = value;\n }\n public ViewMode: DashboardBrowserViewMode = 'cards';\n\n /** @deprecated Use {@link ViewMode}. */\n public get viewMode(): DashboardBrowserViewMode {\n return this.ViewMode;\n }\n /** @deprecated Use {@link ViewMode}. */\n public set viewMode(value: DashboardBrowserViewMode) {\n this.ViewMode = value;\n }\n\n /**\n * Free-text search the agent has applied to the dashboard list (via the\n * SearchDashboards tool). Reported in the agent context so the agent knows\n * how the visible list is currently narrowed; cleared by ClearDashboardFilters.\n */\n private agentSearchText = '';\n\n // Permission map for all dashboards (used by browser component)\n public DashboardPermissionsMap: Map<string, DashboardUserPermissions> = new Map();\n\n /** @deprecated Use {@link DashboardPermissionsMap}. */\n public get dashboardPermissionsMap(): Map<string, DashboardUserPermissions> {\n return this.DashboardPermissionsMap;\n }\n /** @deprecated Use {@link DashboardPermissionsMap}. */\n public set dashboardPermissionsMap(value: Map<string, DashboardUserPermissions>) {\n this.DashboardPermissionsMap = value;\n }\n\n // Effective category map for shared dashboards (maps dashboard ID to effective category for display)\n public EffectiveCategoryMap: Map<string, string | null> = new Map();\n\n /** @deprecated Use {@link EffectiveCategoryMap}. */\n public get effectiveCategoryMap(): Map<string, string | null> {\n return this.EffectiveCategoryMap;\n }\n /** @deprecated Use {@link EffectiveCategoryMap}. */\n public set effectiveCategoryMap(value: Map<string, string | null>) {\n this.EffectiveCategoryMap = value;\n }\n\n // Query params that arrived before the dashboard list finished loading (cold\n // load / deep link / pin navigation). Applied once loadDashboards() completes.\n private _pendingQueryParams: Record<string, string> | null = null;\n\n // True once a load has applied the tab's creation-time query params. That\n // snapshot never changes, so later loads must not apply it again.\n private _initialQueryParamsApplied = false;\n\n /** The ids of the dashboards the user opened, most recent first, as last read from the record logs. */\n private recentDashboardIds: string[] = [];\n\n private favorites = inject(DashboardFavoritesService);\n private recentAccess = inject(RecentAccessService);\n private appManager = inject(ApplicationManager);\n private notifications = inject(MJNotificationService);\n\n /** The active Library filter. A category is only selected under `all`. */\n public LibraryFilter: DashboardLibraryFilter = 'all';\n\n /** The dashboards given to the browser: the loaded list for the current location, in the Library order. */\n public VisibleDashboards: MJDashboardEntity[] = [];\n\n /** IDs of the user's favorite dashboards, for the card stars. */\n public FavoriteIds: string[] = [];\n\n /** Each dashboard's owner text (\"You\" or the owner's name), keyed by dashboard ID. */\n public OwnerLabels = new Map<string, string>();\n\n /** What an empty flat list shows at the current location. */\n public EmptyState: LibraryEmptyStateText = LibraryEmptyState({ Filter: 'all', CategoryId: null });\n\n /** Owner names read so far, keyed by normalized user ID. '' = the read did not return the user. */\n private ownerNames = new Map<string, string>();\n\n /** Normalized IDs of the owners whose names are being read. */\n private ownerReadsInFlight = new Set<string>();\n\n /** How many dashboards the browser shows for each Library filter. */\n public LibraryCounts: Record<DashboardLibraryFilter, number> = { all: 0, mine: 0, shared: 0, favorites: 0, recent: 0 };\n\n /** The rail's Library and Categories sections. */\n public RailSections: MJLeftNavSection[] = [];\n\n /** Rail ids of the expanded category tree items. */\n public RailExpandedIds: string[] = [];\n\n /** Whether the rail is collapsed to icons. Saved per user. */\n public RailCollapsed = false;\n\n /** True while the New dashboard dialog is open. */\n public ShowNewDashboardDialog = false;\n\n /** True while the dashboard named in the New dashboard dialog is being created. */\n public IsCreatingDashboard = false;\n\n /** The longest name the New dashboard dialog accepts. */\n public NewDashboardNameMaxLength = DASHBOARD_NAME_MAX_LENGTH;\n\n /** The category the dashboard named in the dialog is filed in; null for no category. */\n private newDashboardCategoryId: string | null = null;\n\n private static readonly RAIL_COLLAPSED_SETTING = 'mj.dashboards.browseRailCollapsed';\n\n // True once the top-level categories have been expanded on first load.\n private railExpansionInitialized = false;\n\n // ========================================\n // Constructor\n // ========================================\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n // ========================================\n // Lifecycle\n // ========================================\n\n ngOnInit(): void {\n super.ngOnInit();\n // super.ngOnInit() wires up the query-param delivery. Any deep-link/pin params\n // that arrive before loadDashboards() finishes are captured by OnQueryParamsChanged\n // into _pendingQueryParams and applied once the dashboard list is available.\n\n // Favorites and recents change while the Library is also a background tab. RecentItems emits\n // right after a dashboard open is logged, and each emission reads the recently opened\n // dashboards again. It also replays its current list on subscribe; loadDashboards() reads\n // the first list, so that replay is skipped.\n this.favorites.Changed$\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.onLibrarySourcesChanged());\n ObserveRecentDashboardIds(this.ProviderToUse, this.recentAccess.RecentItems.pipe(skip(1)))\n .pipe(takeUntil(this.destroy$))\n .subscribe(ids => this.onRecentDashboardIdsChanged(ids));\n // The dashboard cache also changes while the Library is a background tab (saves and deletes\n // in other tabs or sessions), so the Library re-reads it and refreshes the view.\n ObserveDashboardLibraryChanges()\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this.onLibraryCacheChanged());\n this.loadDashboards();\n this.loadViewPreference();\n this.registerAgentTools();\n this.emitAgentContext();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n // ========================================\n // Query-Param Round-Trip (back/forward, deep links, Home pins)\n // ========================================\n\n /**\n * React to query-param changes from browser back/forward, deep links, and Home\n * pin navigation. Driven by BaseResourceComponent's reactive tab-param stream,\n * which reaches this component even when it's cached/detached — the path the old\n * ActivatedRoute subscription could not reliably cover.\n */\n protected override OnQueryParamsChanged(params: Record<string, string>, _source: 'popstate' | 'deeplink'): void {\n // The Library filter and category need no list lookup — apply them eagerly either way.\n // Only a location change is reported to the agent, so the delivery that only removes the\n // `dashboard` param (after a `?dashboard=` link opens its dashboard) reports nothing.\n const previous = this.currentLocation;\n this.applyLocation(ResolveBrowseLocation(params) ?? { Filter: 'all', CategoryId: null });\n if (!SameBrowseLocation(previous, this.currentLocation)) {\n this.emitAgentContext();\n }\n\n if (params['dashboard'] && this.Dashboards.length === 0) {\n // List not loaded yet — defer the dashboard open until it is.\n this._pendingQueryParams = params;\n this.cdr.detectChanges();\n return;\n }\n this.applyDashboardSelectionFromParams(params);\n }\n\n /**\n * Opens the dashboard named by the `dashboard` query param,\n * then removes the param, so a reload does not open it again and the same\n * link opens it next time. Requires the dashboard list to be loaded.\n */\n private applyDashboardSelectionFromParams(params: Record<string, string>): void {\n const dashboardId = params['dashboard'] || null;\n if (dashboardId) {\n const dashboard = this.Dashboards.find(d => UUIDsEqual(d.ID, dashboardId));\n if (dashboard) {\n this.openDashboard(dashboard);\n }\n this.clearDashboardQueryParam();\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Removes the `dashboard` query param from this tab. Deferred to a microtask\n * because UpdateQueryParams does nothing while OnQueryParamsChanged is being\n * delivered.\n */\n private clearDashboardQueryParam(): void {\n queueMicrotask(() => this.UpdateQueryParams({ dashboard: null }));\n }\n\n /**\n * Opens a dashboard in a tab of the Dashboards app (see DashboardsAppOpenOptions), in edit mode\n * when `openInEditMode` is set, and in a separate tab when `openInNewTab` is set. The Library\n * itself stays on the list.\n */\n private openDashboard(dashboard: MJDashboardEntity, openInEditMode = false, openInNewTab = false): void {\n this.navigationService.OpenDashboard(dashboard.ID, dashboard.Name, DashboardsAppOpenOptions(this.appManager, openInEditMode, openInNewTab));\n }\n\n // ========================================\n // BaseResourceComponent Implementation\n // ========================================\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Library';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-layer-group';\n }\n\n // ========================================\n // Library Rail\n // ========================================\n\n /** The rail item for the current Library filter or category. */\n public get RailActiveId(): string {\n return RailActiveItemId(this.currentLocation, this.Categories);\n }\n\n /** True unless one category's folder is open: every other location is a flat list. */\n public get IsFlatView(): boolean {\n return !IsCategoryFolderLocation(this.currentLocation);\n }\n\n /** Moves the Library to the Library filter, category or Uncategorized of the clicked rail item. */\n public OnRailItemClicked(item: MJLeftNavItem): void {\n const location = ParseRailItemId(item.id);\n if (location) {\n this.moveTo(location);\n }\n }\n\n /** Expands or collapses a category in the rail tree. */\n public OnRailItemToggled(item: MJLeftNavItem): void {\n this.RailExpandedIds = ToggleExpandedId(this.RailExpandedIds, item.id);\n this.cdr.detectChanges();\n }\n\n /** Collapses or expands the whole rail and saves the choice for the user. */\n public OnRailCollapsedChange(collapsed: boolean): void {\n this.RailCollapsed = collapsed;\n UserInfoEngine.Instance.SetSettingDebounced(DashboardBrowserResourceComponent.RAIL_COLLAPSED_SETTING, String(collapsed));\n }\n\n private get currentLocation(): BrowseLocation {\n return { Filter: this.LibraryFilter, CategoryId: this.SelectedCategoryId };\n }\n\n /** Applies a location the user chose, writes it to the URL, and reports it to the agent. */\n private moveTo(location: BrowseLocation): void {\n this.applyLocation(location);\n this.updateUrlQueryParams();\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n\n /** Sets the Library filter and category, then recomputes what the browser and the rail show. */\n private applyLocation(location: BrowseLocation): void {\n this.LibraryFilter = location.Filter;\n this.SelectedCategoryId = location.CategoryId;\n this.refreshLibraryView();\n }\n\n /**\n * Recomputes what the browser and the rail show from the current state: the visible dashboards,\n * the stars, the owners, the empty state, the counts and the rail sections.\n */\n private refreshLibraryView(): void {\n const context = this.libraryContext();\n this.VisibleDashboards = VisibleLibraryDashboards(this.Dashboards, this.currentLocation, context, this.EffectiveCategoryMap);\n this.FavoriteIds = context.FavoriteIds;\n this.OwnerLabels = BuildOwnerLabels(this.Dashboards, context.CurrentUserId, this.ownerNames);\n this.EmptyState = LibraryEmptyState(this.currentLocation);\n this.LibraryCounts = CountLibraryDashboards(this.Dashboards, context);\n const categoryCounts = CountDashboardsByCategory(this.Dashboards, this.Categories, this.EffectiveCategoryMap);\n this.RailSections = BuildLibraryRailSections(this.LibraryCounts, this.Categories, categoryCounts.ByCategory, categoryCounts.Uncategorized);\n this.refreshRailExpansion();\n }\n\n /**\n * Expands the top-level categories the first time there are any, then keeps the user's\n * choices, adding only the folders above the selected category so it stays visible.\n */\n private refreshRailExpansion(): void {\n if (!this.railExpansionInitialized && this.Categories.length > 0) {\n const topLevelItems = this.RailSections.flatMap(section => section.items);\n this.RailExpandedIds = topLevelItems.filter(item => item.children?.length).map(item => item.id);\n this.railExpansionInitialized = true;\n }\n this.RailExpandedIds = WithExpandedAncestors(this.RailExpandedIds, this.SelectedCategoryId, this.Categories);\n }\n\n private libraryContext(): LibraryFilterContext {\n return {\n CurrentUserId: this.ProviderToUse.CurrentUser.ID,\n FavoriteIds: this.favorites.FavoriteIds(),\n RecentIds: this.recentDashboardIds,\n };\n }\n\n /**\n * Favorites or recents changed: recompute the view, which re-sorts it, and re-render. Does not\n * report to the agent, because these changes also arrive while the Library is a background tab\n * and the agent context belongs to the active tab.\n */\n private onLibrarySourcesChanged(): void {\n this.refreshLibraryView();\n this.cdr.detectChanges();\n }\n\n /** The recently opened dashboards were read again: keep them, then refresh as {@link onLibrarySourcesChanged} does. */\n private onRecentDashboardIdsChanged(ids: string[]): void {\n this.recentDashboardIds = ids;\n this.onLibrarySourcesChanged();\n }\n\n /**\n * The dashboard cache changed: re-read it, refresh the view and read the names of new owners.\n * Does not report to the agent, because this also runs while the Library is a background tab.\n */\n private onLibraryCacheChanged(): void {\n this.readLibraryFromEngine();\n this.refreshLibraryView();\n this.cdr.detectChanges();\n void this.refreshOwnerNames();\n }\n\n // ========================================\n // Agent Context & Client Tools\n //\n // 🔒 SAFETY BOUNDARY: the Library page exposes ONLY read-only /\n // navigational tools to the AI agent: SearchDashboards, OpenDashboard (opens\n // the dashboard), RefreshDashboardList, SelectLibraryFilter,\n // SelectCategory, FilterByCategory, ClearDashboardFilters, SwitchViewMode, and\n // the read-only detail tools GetCategoryHierarchy and GetDashboardShares.\n //\n // Mutating operations — create / delete / save / share / move a dashboard,\n // create / delete a category, add or remove a favorite — are intentionally\n // NOT exposed. The agent helps the user find, open, and understand dashboards\n // (the category tree and who a dashboard is shared with); the user performs\n // every mutation from the UI, including the star on a card. Do NOT add a\n // mutating tool here without revisiting this boundary.\n // ========================================\n\n /**\n * Report the current browser state to the AI agent (async chat agent and\n * realtime co-agent). Re-emit whenever the list, search, category filter,\n * view mode, or loading state changes.\n */\n private emitAgentContext(): void {\n const context = this.libraryContext();\n this.navigationService.SetAgentContext(this, BuildDashboardBrowserAgentContext({\n VisibleDashboardNames: this.VisibleDashboards.map(d => d.Name || '(untitled)'),\n TotalDashboardCount: this.totalAccessibleDashboardCount,\n FilteredDashboardCount: this.VisibleDashboards.length,\n LibraryFilter: this.LibraryFilter,\n LibraryCounts: this.LibraryCounts,\n RecentlyOpenedNames: FilterDashboardsForLibrary(this.Dashboards.filter(IsBrowsableDashboard), 'recent', context).map(d => d.Name),\n SearchText: this.agentSearchText,\n AvailableCategoryNames: this.Categories.map(c => c.Name),\n SelectedCategoryId: this.SelectedCategoryId,\n SelectedCategoryName: this.selectedCategoryName,\n ViewMode: this.ViewMode,\n IsLoading: this.isLoading,\n }));\n }\n\n /** The name of the selected category, \"Uncategorized\" for that list, or null for none. */\n private get selectedCategoryName(): string | null {\n if (this.SelectedCategoryId === UNCATEGORIZED_CATEGORY_ID) {\n return 'Uncategorized';\n }\n const selectedCategory = this.SelectedCategoryId\n ? this.Categories.find(c => UUIDsEqual(c.ID, this.SelectedCategoryId)) ?? null\n : null;\n return selectedCategory?.Name ?? null;\n }\n\n /**\n * The total number of dashboards accessible to the current user, independent\n * of any in-memory search narrowing the agent has applied. `this.dashboards`\n * shrinks when SearchDashboards filters it, so we read the unfiltered count\n * straight from the engine to keep TotalDashboardCount honest.\n */\n private get totalAccessibleDashboardCount(): number {\n const md = this.ProviderToUse;\n return DashboardEngine.Instance.GetAccessibleDashboards(md.CurrentUser.ID).length;\n }\n\n /**\n * Registers the agent client tools. The Library always shows the list, so the\n * tool set never changes and is registered once.\n */\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [...this.commonTools(), ...this.listModeTools()]);\n }\n\n /**\n * Tools to find, open, and reload dashboards, plus the read-only detail\n * tools (category tree, shares).\n */\n private commonTools(): AgentClientTool[] {\n return [\n {\n Name: 'SearchDashboards',\n Description: 'Search/filter the dashboard list by a text query matching dashboard name or description.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['query'], 'query');\n if (!v.ok) return v.result;\n return this.agentSearchDashboards(v.value);\n },\n },\n {\n Name: 'OpenDashboard',\n Description: 'Open a dashboard. Accepts either the dashboard NAME (as listed in VisibleDashboards) or its ID.',\n ParameterSchema: { type: 'object', properties: { dashboard: { type: 'string', description: 'The dashboard name or ID to open.' }, dashboardId: { type: 'string', description: 'Deprecated alias for \"dashboard\" — the dashboard ID.' } } },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['dashboard'] ?? params['dashboardId'], 'dashboard');\n if (!v.ok) return v.result;\n return this.agentOpenDashboard(v.value);\n },\n },\n {\n Name: 'RefreshDashboardList',\n Description: 'Reload the list of dashboards and categories from the server.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async (): Promise<AgentToolResult> => {\n // loadDashboards() rebuilds the full list, so any prior agent\n // search no longer applies — clear the tracked search text.\n this.agentSearchText = '';\n await this.loadDashboards();\n this.emitAgentContext();\n return { Success: true };\n },\n },\n {\n Name: 'GetCategoryHierarchy',\n Description: 'Get the dashboard category tree the user can access — each category\\'s name, ID, parent ID, and the number of accessible dashboards filed directly under it. Read-only.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async (): Promise<AgentToolResult> => this.agentGetCategoryHierarchy(),\n },\n {\n Name: 'GetDashboardShares',\n Description: 'List who a dashboard is shared with and their access level (read/edit/delete/share). Pass the dashboard ID or name. Read-only — returns no secrets.',\n ParameterSchema: { type: 'object', properties: { dashboardId: { type: 'string', description: 'The dashboard ID or name.' } }, required: ['dashboardId'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n return this.agentGetDashboardShares(params['dashboardId']);\n },\n },\n ];\n }\n\n /**\n * Tools that shape the list — the Library filter, category filtering, clear\n * filters, and view-mode toggling.\n */\n private listModeTools(): AgentClientTool[] {\n return [\n {\n Name: 'SelectLibraryFilter',\n Description: 'Show one Library list from the rail: \"all\" (every dashboard: favorites first, then the ones opened last, then the rest), \"mine\" (dashboards the user owns), \"shared\" (dashboards shared with the user), \"favorites\", or \"recent\" (recently opened, the most recent first). Clears any category filter.',\n ParameterSchema: { type: 'object', properties: { filter: { type: 'string', enum: [...DASHBOARD_LIBRARY_FILTERS] } }, required: ['filter'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n return this.agentSelectLibraryFilter(params['filter']);\n },\n },\n {\n Name: 'SelectCategory',\n Description: 'Filter the dashboard list to a category. Accepts either the category NAME (as listed in AvailableCategories) or its ID, or \"Uncategorized\" for the dashboards in no category. Pass an empty string to clear the category filter (show the whole list).',\n ParameterSchema: { type: 'object', properties: { category: { type: 'string', description: 'The category name or ID to filter by, or \"Uncategorized\". Empty string clears the filter.' } }, required: ['category'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['category'], 'category');\n if (!v.ok) return v.result;\n return this.agentSelectCategory(v.value);\n },\n },\n {\n Name: 'FilterByCategory',\n Description: 'Filter the dashboard list to a category by its ID. Pass an empty string to clear the category filter (show the whole list). Prefer SelectCategory, which also accepts a category name.',\n ParameterSchema: { type: 'object', properties: { categoryId: { type: 'string' } }, required: ['categoryId'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n const v = ValidateStringParam(params['categoryId'], 'categoryId');\n if (!v.ok) return v.result;\n return this.agentSelectCategory(v.value);\n },\n },\n {\n Name: 'ClearDashboardFilters',\n Description: 'Clear all active dashboard-list filters — the text search, the Library filter and the category filter — and return to the full list (All dashboards).',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async (): Promise<AgentToolResult> => this.agentClearDashboardFilters(),\n },\n {\n Name: 'SwitchViewMode',\n Description: 'Switch the dashboard list view mode between \"cards\" and \"list\".',\n ParameterSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['cards', 'list'] } }, required: ['mode'] },\n Handler: async (params: Record<string, unknown>): Promise<AgentToolResult> => {\n return this.agentSwitchViewMode(params['mode']);\n },\n },\n ];\n }\n\n /**\n * Filter the dashboard list by a text query against name + description.\n * The generic browser owns the category/view chrome; this surfaces a\n * name/description filter via the same selected-category mechanism is not\n * applicable, so we narrow the in-memory list the browser renders.\n */\n private agentSearchDashboards(query: string): AgentToolResult {\n this.agentSearchText = query.trim();\n this.Dashboards = this.readSearchedDashboards();\n this.refreshLibraryView();\n this.emitAgentContext();\n this.cdr.detectChanges();\n return { Success: true };\n }\n\n /** Show one Library list; clears any category filter. */\n private agentSelectLibraryFilter(rawFilter: unknown): AgentToolResult {\n if (!IsDashboardLibraryFilter(rawFilter)) {\n return { Success: false, ErrorMessage: `filter must be one of: ${DASHBOARD_LIBRARY_FILTERS.join(', ')}.` };\n }\n this.moveTo({ Filter: rawFilter, CategoryId: null });\n return { Success: true };\n }\n\n /**\n * Apply a category filter by NAME or ID (empty string clears it). Resolves a\n * supplied name (case-insensitive) to its id against the loaded, accessible\n * category list — mirroring the Data Explorer's SelectView name→id resolution.\n * \"Uncategorized\" (when no category has that name) shows the dashboards in no\n * category. A category is shown under the All Library filter.\n */\n private agentSelectCategory(categoryNameOrId: string): AgentToolResult {\n const raw = categoryNameOrId.trim();\n\n // Empty string clears the filter.\n if (!raw) {\n this.moveTo({ Filter: this.LibraryFilter, CategoryId: null });\n return { Success: true };\n }\n\n // Prefer an exact id match, then fall back to a case-insensitive name match.\n const lowered = raw.toLowerCase();\n const match =\n this.Categories.find(c => UUIDsEqual(c.ID, raw)) ??\n this.Categories.find(c => (c.Name || '').toLowerCase() === lowered);\n\n if (!match && lowered === UNCATEGORIZED_CATEGORY_ID) {\n this.moveTo({ Filter: 'all', CategoryId: UNCATEGORIZED_CATEGORY_ID });\n return { Success: true };\n }\n\n if (!match) {\n const available = this.Categories.map(c => c.Name).join(', ') || '(none)';\n return { Success: false, ErrorMessage: `No accessible category named or identified by \"${raw}\". Available categories: ${available}.` };\n }\n\n this.moveTo({ Filter: 'all', CategoryId: match.ID });\n return { Success: true };\n }\n\n /** Clear the text search, the Library filter and the category filter, returning to All dashboards. */\n private agentClearDashboardFilters(): AgentToolResult {\n this.agentSearchText = '';\n\n // Restore the full accessible list (the search may have narrowed this.dashboards).\n this.Dashboards = this.readSearchedDashboards();\n\n this.moveTo({ Filter: 'all', CategoryId: null });\n return { Success: true };\n }\n\n /**\n * Open a dashboard by NAME or ID. Resolves against the full\n * accessible list (see {@link resolveDashboardForTool}), so a prior search\n * that narrowed the visible list does not hide it.\n */\n private agentOpenDashboard(dashboardNameOrId: string): AgentToolResult {\n const resolved = this.resolveDashboardForTool(dashboardNameOrId);\n if (!resolved.ok) return resolved.result;\n this.openDashboard(resolved.dashboard);\n return { Success: true };\n }\n\n /** Switch and persist the list view mode (cards | list). */\n private agentSwitchViewMode(rawMode: unknown): AgentToolResult {\n if (!IsValidBrowserViewMode(rawMode)) {\n return { Success: false, ErrorMessage: 'mode must be one of: cards, list.' };\n }\n this.ViewMode = rawMode;\n this.saveViewPreference(rawMode);\n this.emitAgentContext();\n this.cdr.detectChanges();\n return { Success: true };\n }\n\n // ========================================\n // Read-only detail tools (GetCategoryHierarchy / GetDashboardShares).\n // These return descriptive data only — no mutations, never throw.\n // ========================================\n\n /**\n * Resolve a tool's dashboard param (ID **or** name) to an accessible\n * dashboard: an exact ID match first, then a case-insensitive name match.\n * Returns a tolerant error result when the param is missing or nothing\n * matches.\n */\n private resolveDashboardForTool(\n rawParam: unknown,\n ): { ok: true; dashboard: MJDashboardEntity } | { ok: false; result: AgentToolResult } {\n const raw = typeof rawParam === 'string' ? rawParam.trim() : '';\n if (!raw) {\n return { ok: false, result: { Success: false, ErrorMessage: 'A dashboard ID or name is required.' } };\n }\n\n // Search the full accessible set (not this.Dashboards, which a prior\n // search may have narrowed).\n const md = this.ProviderToUse;\n const accessible = DashboardEngine.Instance.GetAccessibleDashboards(md.CurrentUser.ID);\n\n const lowered = raw.toLowerCase();\n const dashboard =\n accessible.find(d => UUIDsEqual(d.ID, raw)) ??\n accessible.find(d => (d.Name || '').toLowerCase() === lowered);\n\n if (!dashboard) {\n const available = accessible.map(d => d.Name || '(untitled)').slice(0, 25).join(', ') || '(none)';\n return {\n ok: false,\n result: { Success: false, ErrorMessage: `No accessible dashboard named or identified by \"${raw}\". Available dashboards include: ${available}.` },\n };\n }\n return { ok: true, dashboard };\n }\n\n /**\n * Return the accessible category tree (name, ID, parent ID, and per-category\n * count of accessible dashboards filed directly under it). Read-only.\n */\n private agentGetCategoryHierarchy(): AgentToolDataResult {\n const md = this.ProviderToUse;\n const engine = DashboardEngine.Instance;\n const categories = engine.GetAccessibleCategories(md.CurrentUser.ID);\n const accessible = engine.GetAccessibleDashboards(md.CurrentUser.ID);\n const dashboardCountByCategory = CountByUUID(accessible.filter(d => d.CategoryID), d => d.CategoryID);\n\n const tree = categories.map(cat => ({\n Name: cat.Name,\n Id: cat.ID,\n ParentId: cat.ParentID ?? null,\n DashboardCount: dashboardCountByCategory.Get(cat.ID) ?? 0,\n }));\n\n // Dashboards with no (accessible) category sit at the root.\n const rootDashboardCount = accessible.filter(d => !d.CategoryID).length;\n\n return {\n Success: true,\n Data: {\n CategoryCount: tree.length,\n RootDashboardCount: rootDashboardCount,\n Categories: tree,\n },\n };\n }\n\n /**\n * Return who a dashboard is shared with and their access level. Uses\n * DashboardEngine.GetDashboardShares (the real method) over the cached\n * permission records. Returns no secrets. Read-only.\n */\n private agentGetDashboardShares(rawDashboardId: unknown): AgentToolDataResult {\n const resolved = this.resolveDashboardForTool(rawDashboardId);\n if (!resolved.ok) return resolved.result;\n const dashboard = resolved.dashboard;\n\n const shares: MJDashboardPermissionEntity[] = DashboardEngine.Instance.GetDashboardShares(dashboard.ID);\n\n const sharedWith = shares.map(s => ({\n UserName: s.User ?? null,\n CanRead: s.CanRead,\n CanEdit: s.CanEdit,\n CanDelete: s.CanDelete,\n CanShare: s.CanShare,\n SharedByUserName: s.SharedByUser ?? null,\n }));\n\n return {\n Success: true,\n Data: {\n DashboardId: dashboard.ID,\n DashboardName: dashboard.Name,\n Owner: dashboard.User ?? null,\n ShareCount: sharedWith.length,\n SharedWith: sharedWith,\n },\n };\n }\n\n // ========================================\n // Event Handlers from Generic Browser\n // ========================================\n\n /**\n * Handle dashboard open request from generic browser: open the dashboard, in a separate tab for a\n * Shift, Ctrl or Cmd click.\n */\n public OnDashboardOpen(event: DashboardOpenEvent): void {\n this.openDashboard(event.Dashboard, false, event.OpenInNewTab);\n }\n\n /** @deprecated Use {@link OnDashboardOpen}. */\n public onDashboardOpen(event: DashboardOpenEvent): void {\n return this.OnDashboardOpen(event);\n }\n\n /**\n * Handle dashboard edit request from generic browser: open it in edit mode.\n */\n public OnDashboardEdit(event: DashboardEditEvent): void {\n this.openDashboard(event.Dashboard, true);\n }\n\n /** @deprecated Use {@link OnDashboardEdit}. */\n public onDashboardEdit(event: DashboardEditEvent): void {\n return this.OnDashboardEdit(event);\n }\n\n /**\n * Handle dashboard delete request from generic browser\n */\n public async OnDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n // The generic browser handles the confirmation dialog\n // We just need to perform the actual deletion atomically\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n if (event.Dashboards.length === 0) return;\n\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n for (const dashboard of event.Dashboards) {\n dashboard.TransactionGroup = tg;\n await dashboard.Delete();\n }\n\n if (await tg.Submit()) {\n const deletedIds = new Set(event.Dashboards.map(d => d.ID));\n this.Dashboards = this.Dashboards.filter(d => !deletedIds.has(d.ID));\n this.refreshLibraryView();\n } else {\n console.error('Failed to delete dashboards — all changes rolled back');\n }\n } catch (err) {\n console.error('Failed to delete dashboards:', err);\n } finally {\n this.isLoading = false;\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnDashboardDelete}. */\n public async onDashboardDelete(event: DashboardDeleteEvent): Promise<void> {\n return this.OnDashboardDelete(event);\n }\n\n /**\n * Handle dashboard move request from generic browser.\n * For owned dashboards: updates the dashboard's CategoryID directly.\n * For shared dashboards: creates/updates a DashboardCategoryLink to organize without modifying the original.\n */\n public async OnDashboardMove(event: DashboardMoveEvent): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n if (event.Dashboards.length === 0) return;\n\n const md = this.ProviderToUse;\n const currentUserId = md.CurrentUser.ID;\n const tg = await md.CreateTransactionGroup();\n const sharedDashboardIds: string[] = [];\n // The user's links, grouped once. Links created below are queued in the transaction group,\n // not added to the engine's list, so the grouping matches the per-dashboard filter it replaces.\n const userLinksByDashboard = GroupByUUID(\n DashboardEngine.Instance.DashboardCategoryLinks.filter(link => UUIDsEqual(link.UserID, currentUserId)),\n link => link.DashboardID\n );\n\n for (const dashboard of event.Dashboards) {\n const permissions = DashboardEngine.Instance.GetDashboardPermissions(dashboard.ID, currentUserId);\n\n if (permissions.IsOwner) {\n // Owner can modify the dashboard directly\n dashboard.CategoryID = event.TargetCategoryId;\n dashboard.TransactionGroup = tg;\n await dashboard.Save();\n } else {\n // Non-owner: create or update a category link instead\n const existingLinks = userLinksByDashboard.Get(dashboard.ID) ?? [];\n\n let link: MJDashboardCategoryLinkEntity;\n if (existingLinks.length > 0) {\n link = existingLinks[0];\n link.DashboardCategoryID = event.TargetCategoryId;\n } else {\n link = await md.GetEntityObject<MJDashboardCategoryLinkEntity>('MJ: Dashboard Category Links');\n link.DashboardID = dashboard.ID;\n link.UserID = currentUserId;\n link.DashboardCategoryID = event.TargetCategoryId;\n }\n link.TransactionGroup = tg;\n await link.Save();\n\n sharedDashboardIds.push(dashboard.ID);\n }\n }\n\n if (await tg.Submit()) {\n // Update the effective category map for the shared dashboards now that the server confirmed\n for (const id of sharedDashboardIds) {\n this.EffectiveCategoryMap.set(id, event.TargetCategoryId);\n }\n this.EffectiveCategoryMap = new Map(this.EffectiveCategoryMap);\n this.Dashboards = [...this.Dashboards];\n // The folder view follows the moved dashboards; a flat Library list still shows them.\n this.applyLocation(this.IsFlatView ? this.currentLocation : { Filter: 'all', CategoryId: event.TargetCategoryId });\n this.updateUrlQueryParams();\n } else {\n console.error('Failed to move dashboards — all changes rolled back');\n }\n } catch (err) {\n console.error('Failed to move dashboards:', err);\n } finally {\n this.isLoading = false;\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnDashboardMove}. */\n public async onDashboardMove(event: DashboardMoveEvent): Promise<void> {\n return this.OnDashboardMove(event);\n }\n\n /** The generic browser asks for a new dashboard (its New menu or an empty state): asks for the name first. */\n public async OnDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n this.OpenNewDashboardDialog(event.CategoryId);\n }\n\n /** @deprecated Use {@link OnDashboardCreate}. */\n public async onDashboardCreate(event: DashboardCreateEvent): Promise<void> {\n return this.OnDashboardCreate(event);\n }\n\n /** Stars or unstars a dashboard from its card. Changed$ then re-sorts the Library. */\n public async OnDashboardFavoriteToggle(event: DashboardFavoriteToggleEvent): Promise<void> {\n const dashboard = event.Dashboard;\n try {\n const isFavorite = await this.favorites.Toggle(dashboard.ID);\n const message = isFavorite ? `Added \"${dashboard.Name}\" to favorites` : `Removed \"${dashboard.Name}\" from favorites`;\n this.notifications.CreateSimpleNotification(message, 'success', 2000);\n this.emitAgentContext();\n } catch (error) {\n LogError(`Dashboards Library: could not change the favorite: ${error instanceof Error ? error.message : String(error)}`);\n this.notifications.CreateSimpleNotification('Could not change the favorite', 'error', 3000);\n }\n }\n\n /**\n * Handle folder navigation in the generic browser and update the URL. Entering a\n * folder shows it under the All Library filter; going back to the root shows the\n * current Library filter's flat list.\n */\n public OnCategoryChange(event: CategoryChangeEvent): void {\n this.moveTo({ Filter: event.CategoryId ? 'all' : this.LibraryFilter, CategoryId: event.CategoryId });\n }\n\n /** @deprecated Use {@link OnCategoryChange}. */\n public onCategoryChange(event: CategoryChangeEvent): void {\n return this.OnCategoryChange(event);\n }\n\n /**\n * Handle view preference change from generic browser - persist\n */\n public OnViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n this.ViewMode = event.ViewMode;\n this.saveViewPreference(event.ViewMode);\n this.emitAgentContext();\n }\n\n /** @deprecated Use {@link OnViewPreferenceChange}. */\n public onViewPreferenceChange(event: ViewPreferenceChangeEvent): void {\n return this.OnViewPreferenceChange(event);\n }\n\n /**\n * Handle category create request from generic browser\n * Includes extensive logging for debugging category creation issues\n */\n public async OnCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category create requested:', {\n name: event.Name,\n parentCategoryId: event.ParentCategoryId\n });\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n const md = this.ProviderToUse;\n console.debug('[DashboardBrowserResource] Current user:', {\n userId: md.CurrentUser?.ID,\n userName: md.CurrentUser?.Name,\n email: md.CurrentUser?.Email\n });\n\n const category = await md.GetEntityObject<MJDashboardCategoryEntity>('MJ: Dashboard Categories');\n console.debug('[DashboardBrowserResource] Created category entity object');\n\n // Set required fields\n category.Name = event.Name;\n category.UserID = md.CurrentUser.ID;\n\n if (event.ParentCategoryId) {\n category.ParentID = event.ParentCategoryId;\n }\n\n console.debug('[DashboardBrowserResource] Category fields before save:', {\n name: category.Name,\n userId: category.UserID,\n parentId: category.ParentID,\n allFields: category.Fields.map(f => ({ name: f.Name, value: f.Value, dirty: f.Dirty }))\n });\n\n const saved = await category.Save();\n\n console.debug('[DashboardBrowserResource] Save result:', {\n success: saved,\n latestResult: category.LatestResult,\n message: category.LatestResult?.Message,\n success2: category.LatestResult?.Success,\n id: category.ID\n });\n\n if (saved) {\n console.debug('[DashboardBrowserResource] Category saved successfully, ID:', category.ID);\n // Add to local array - engine will self-update\n this.Categories.push(category);\n this.Categories = [...this.Categories].sort((a, b) => a.Name.localeCompare(b.Name));\n this.refreshLibraryView();\n } else {\n const errorMessage = category.LatestResult?.Message || 'Unknown error saving category';\n console.error('[DashboardBrowserResource] Failed to save category:', errorMessage);\n console.error('[DashboardBrowserResource] Full LatestResult:', JSON.stringify(category.LatestResult, null, 2));\n\n // Show toast or alert for user\n alert(`Failed to create category: ${errorMessage}`);\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception creating category:', err);\n alert(`Error creating category: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.isLoading = false;\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnCategoryCreate}. */\n public async onCategoryCreate(event: CategoryCreateEvent): Promise<void> {\n return this.OnCategoryCreate(event);\n }\n\n /**\n * Handle category delete request from generic browser\n * Performs recursive deletion of category and all children\n */\n public async OnCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n console.debug('[DashboardBrowserResource] Category delete requested:', event.Category.Name);\n\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Get all categories in child-first order so parent FKs are satisfied as we delete.\n // getChildCategoriesRecursive returns pre-order (parent before its descendants);\n // reversing that list gives a valid leaves-first order, then we append the root last.\n const descendants = this.getChildCategoriesRecursive(event.Category.ID);\n descendants.reverse();\n const categoriesToDelete = [...descendants, event.Category];\n\n console.debug('[DashboardBrowserResource] Deleting categories:', categoriesToDelete.map(c => c.Name));\n\n const categoryIds = new Set(categoriesToDelete.map(c => c.ID));\n const dashboardsToUncategorize = this.Dashboards.filter(d =>\n d.CategoryID && categoryIds.has(d.CategoryID)\n );\n\n // Queue dashboard uncategorize saves first, then category deletes — single atomic transaction\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n\n for (const dashboard of dashboardsToUncategorize) {\n dashboard.CategoryID = null!;\n dashboard.TransactionGroup = tg;\n await dashboard.Save();\n }\n\n for (const cat of categoriesToDelete) {\n cat.TransactionGroup = tg;\n await cat.Delete();\n }\n\n if (await tg.Submit()) {\n this.Categories = this.Categories.filter(c => !categoryIds.has(c.ID));\n this.Dashboards = [...this.Dashboards];\n this.refreshLibraryView();\n } else {\n console.error('[DashboardBrowserResource] Failed to delete categories — all changes rolled back');\n }\n } catch (err) {\n console.error('[DashboardBrowserResource] Exception deleting category:', err);\n } finally {\n this.isLoading = false;\n this.emitAgentContext();\n this.cdr.detectChanges();\n }\n }\n\n /** @deprecated Use {@link OnCategoryDelete}. */\n public async onCategoryDelete(event: CategoryDeleteEvent): Promise<void> {\n return this.OnCategoryDelete(event);\n }\n\n // ========================================\n // Public Methods - Dashboard CRUD\n // ========================================\n\n /**\n * Opens the New dashboard dialog. The dashboard is filed in `categoryId`, else in the open\n * category folder, else in no category.\n */\n public OpenNewDashboardDialog(categoryId?: string | null): void {\n this.newDashboardCategoryId = categoryId ?? (IsCategoryFolderLocation(this.currentLocation) ? this.SelectedCategoryId : null);\n this.NewDashboardNameMaxLength = DashboardNameMaxLength(this.ProviderToUse);\n this.ShowNewDashboardDialog = true;\n this.cdr.detectChanges();\n }\n\n /** Closes the New dashboard dialog and creates nothing. */\n public OnNewDashboardCancelled(): void {\n this.ShowNewDashboardDialog = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Creates the dashboard named in the dialog, reloads the cache the dashboard tab reads from, puts\n * the dashboard first in the list, and opens it in edit mode in a tab of the Dashboards app. When\n * the save fails, the dialog stays open with the name and the user is told. A second call while\n * the dashboard is being created does nothing.\n */\n public async OnNewDashboardNamed(name: string): Promise<void> {\n if (this.IsCreatingDashboard) return;\n this.setCreatingDashboard(true);\n try {\n const dashboard = await CreateBlankDashboard(this.ProviderToUse, name, this.newDashboardCategoryId);\n if (!dashboard) {\n this.notifications.CreateSimpleNotification('Could not create the dashboard', 'error', 3000);\n return;\n }\n await this.reloadDashboardCache();\n this.ShowNewDashboardDialog = false;\n this.Dashboards = [dashboard, ...this.Dashboards.filter(d => !UUIDsEqual(d.ID, dashboard.ID))];\n this.refreshLibraryView();\n this.emitAgentContext();\n this.openDashboard(dashboard, true);\n } finally {\n this.setCreatingDashboard(false);\n }\n }\n\n /** @deprecated Use {@link OpenNewDashboardDialog}. */\n public async CreateDashboard(categoryId?: string | null): Promise<void> {\n this.OpenNewDashboardDialog(categoryId);\n }\n\n /** @deprecated Use {@link OpenNewDashboardDialog}. */\n public async createDashboard(categoryId?: string | null): Promise<void> {\n return this.CreateDashboard(categoryId);\n }\n\n /** Sets whether the named dashboard is being created, and re-renders the dialog. */\n private setCreatingDashboard(creating: boolean): void {\n this.IsCreatingDashboard = creating;\n this.cdr.detectChanges();\n }\n\n // ========================================\n // Private Methods - Data Loading\n // ========================================\n\n /** Reloads the dashboard cache before the new dashboard's tab opens: the tab reads the dashboard from it. A failure is only logged. */\n private async reloadDashboardCache(): Promise<void> {\n try {\n await DashboardEngine.Instance.Config(true, this.ProviderToUse.CurrentUser, this.ProviderToUse);\n } catch (error) {\n LogError(`Dashboards Library: could not reload the dashboards: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n private async loadDashboards(): Promise<void> {\n try {\n this.isLoading = true;\n this.cdr.detectChanges();\n\n // Use DashboardEngine for consistent cached data. Recently opened reads the user's dashboard\n // record logs (LoadRecentDashboardIds); RecentAccessService is only its change trigger.\n const engine = DashboardEngine.Instance;\n const [, recentDashboardIds] = await Promise.all([\n engine.Config(false),\n LoadRecentDashboardIds(this.ProviderToUse),\n ]);\n this.recentDashboardIds = recentDashboardIds;\n\n this.readLibraryFromEngine();\n\n console.debug('[DashboardBrowserResource] Loaded from DashboardEngine:', {\n dashboardCount: this.Dashboards.length,\n categoryCount: this.Categories.length,\n sharedDashboardsInEffectiveMap: this.EffectiveCategoryMap.size,\n categories: this.Categories.map(c => ({ id: c.ID, name: c.Name, parentId: c.ParentID }))\n });\n\n // List is now loaded — apply any query-param selection. Use params deferred by\n // OnQueryParamsChanged during the load if present. Otherwise the first load reads\n // the tab's creation-time params (covers hosts that give no tab id); later loads\n // skip that snapshot, which would reopen a dashboard that was already opened.\n const params = this._pendingQueryParams ?? (this._initialQueryParamsApplied ? null : this.GetQueryParams());\n this._pendingQueryParams = null;\n this._initialQueryParamsApplied = true;\n // Params without `lib` or `category` keep the current location.\n this.applyLocation((params && ResolveBrowseLocation(params)) ?? this.currentLocation);\n if (params && Object.keys(params).length > 0) {\n this.applyDashboardSelectionFromParams(params);\n }\n\n this.emitAgentContext();\n void this.refreshOwnerNames();\n } catch (err) {\n console.error('Failed to load dashboards:', err);\n } finally {\n this.isLoading = false;\n this.NotifyLoadComplete();\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Reads the library from the engine cache: the dashboards the user can access (narrowed by an\n * agent search), the categories owned by or shared with the user (by name), and the permission\n * and effective-category maps.\n */\n private readLibraryFromEngine(): void {\n const engine = DashboardEngine.Instance;\n const currentUserId = this.ProviderToUse.CurrentUser.ID;\n this.Dashboards = this.readSearchedDashboards();\n this.Categories = [...engine.GetAccessibleCategories(currentUserId)].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n this.buildPermissionMaps(engine, currentUserId);\n }\n\n /**\n * The dashboards the user can access whose name or description contains the agent's search text\n * (all when there is none). The Library order is applied when the view is refreshed.\n */\n private readSearchedDashboards(): MJDashboardEntity[] {\n const accessible = DashboardEngine.Instance.GetAccessibleDashboards(this.ProviderToUse.CurrentUser.ID);\n const q = this.agentSearchText.toLowerCase();\n return q\n ? accessible.filter(d =>\n (d.Name || '').toLowerCase().includes(q) ||\n (d.Description || '').toLowerCase().includes(q))\n : [...accessible];\n }\n\n /**\n * Reads the names of owners not read yet and not being read, then shows them on the cards.\n * Never throws.\n */\n private async refreshOwnerNames(): Promise<void> {\n const provider = this.ProviderToUse;\n const userId = provider.CurrentUser.ID;\n const missing = OwnerIdsToLoad(DashboardEngine.Instance.GetAccessibleDashboards(userId), userId, this.ownerNames)\n .filter(id => !this.ownerReadsInFlight.has(id));\n if (missing.length === 0) return;\n missing.forEach(id => this.ownerReadsInFlight.add(id));\n try {\n const loaded = await LoadDashboardOwnerNames(provider, missing);\n for (const id of missing) this.ownerNames.set(id, loaded.get(id) ?? '');\n this.refreshLibraryView();\n this.cdr.detectChanges();\n } catch (error) {\n LogError(`Dashboards Library: could not read the dashboard owners: ${error instanceof Error ? error.message : String(error)}`);\n } finally {\n missing.forEach(id => this.ownerReadsInFlight.delete(id));\n }\n }\n\n /**\n * Builds the permission map, and the effective category of each shared dashboard, for every\n * dashboard the user can access. An agent search that narrows the list does not narrow the maps.\n */\n private buildPermissionMaps(engine: DashboardEngine, currentUserId: string): void {\n this.DashboardPermissionsMap = new Map();\n this.EffectiveCategoryMap = new Map();\n\n // Get category links for current user (from engine's cached data)\n const userCategoryLinksByDashboard = IndexByUUID(\n engine.DashboardCategoryLinks.filter(link => UUIDsEqual(link.UserID, currentUserId)),\n link => link.DashboardID\n );\n\n for (const dashboard of engine.GetAccessibleDashboards(currentUserId)) {\n const perms = engine.GetDashboardPermissions(dashboard.ID, currentUserId);\n this.DashboardPermissionsMap.set(dashboard.ID, perms);\n\n // For shared dashboards (not owned), determine effective category\n if (!perms.IsOwner) {\n // Look for a category link for this dashboard\n const categoryLink = userCategoryLinksByDashboard.Get(dashboard.ID);\n\n if (categoryLink) {\n // User has explicitly organized this shared dashboard\n this.EffectiveCategoryMap.set(dashboard.ID, categoryLink.DashboardCategoryID);\n } else {\n // No link exists - show in root (null category)\n this.EffectiveCategoryMap.set(dashboard.ID, null);\n }\n }\n // For owned dashboards, we don't add to effectiveCategoryMap\n // so the browser will use the dashboard's actual CategoryID\n }\n }\n\n // ========================================\n // Private Methods - URL Query Params\n // ========================================\n\n /**\n * Update the URL query params for the current tab: the Library filter (`lib`,\n * omitted for All), the category filter, and no `dashboard` param (the Library\n * never shows a dashboard itself).\n * Routes through BaseResourceComponent.UpdateQueryParams, which updates the tab\n * configuration (triggering the shell's URL sync while respecting app-scoped\n * routes) and is auto-suppressed while delivering OnQueryParamsChanged so\n * reflecting URL → state never loops back into a redundant URL push.\n */\n private updateUrlQueryParams(): void {\n this.UpdateQueryParams({\n ...LocationQueryParams(this.currentLocation),\n dashboard: null,\n });\n }\n\n // ========================================\n // Private Methods - Category Helpers\n // ========================================\n\n /**\n * Get all child categories of a parent category recursively\n */\n private getChildCategoriesRecursive(parentId: string): MJDashboardCategoryEntity[] {\n const children: MJDashboardCategoryEntity[] = [];\n const directChildren = this.Categories.filter(c => UUIDsEqual(c.ParentID, parentId));\n\n for (const child of directChildren) {\n children.push(child);\n children.push(...this.getChildCategoriesRecursive(child.ID));\n }\n\n return children;\n }\n\n // ========================================\n // Private Methods - View Preference\n // ========================================\n\n private loadViewPreference(): void {\n // TODO: Load from User Settings entity\n const stored = localStorage.getItem('dashboard-browser-view-mode');\n if (stored === 'cards' || stored === 'list') {\n this.ViewMode = stored;\n }\n this.RailCollapsed = UserInfoEngine.Instance.GetSetting(DashboardBrowserResourceComponent.RAIL_COLLAPSED_SETTING) === 'true';\n }\n\n private saveViewPreference(mode: DashboardBrowserViewMode): void {\n // TODO: Save to User Settings entity\n localStorage.setItem('dashboard-browser-view-mode', mode);\n }\n}\n","<!-- Library page of the Dashboards app -->\n<mj-page-layout>\n <mj-page-header Title=\"Library\" Icon=\"fa-solid fa-layer-group\" Subtitle=\"Every dashboard you own or that is shared with you\">\n <div meta>\n <mj-stat-badge [Count]=\"LibraryCounts[LibraryFilter]\" [Total]=\"LibraryCounts.all\" Label=\"dashboards\"></mj-stat-badge>\n </div>\n </mj-page-header>\n\n <mj-page-body [Flex]=\"true\" [Padding]=\"false\" Direction=\"row\">\n <!-- Library filters and the category tree -->\n <mj-left-nav\n MobileTitle=\"Dashboards\"\n [Sections]=\"RailSections\"\n [ActiveId]=\"RailActiveId\"\n [ExpandedIds]=\"RailExpandedIds\"\n [Collapsible]=\"true\"\n [Collapsed]=\"RailCollapsed\"\n (CollapsedChange)=\"OnRailCollapsedChange($event)\"\n (ItemClicked)=\"OnRailItemClicked($event)\"\n (ItemToggled)=\"OnRailItemToggled($event)\">\n </mj-left-nav>\n\n <mj-left-nav-content>\n <!-- Generic browser: a flat list for every Library filter and Uncategorized, a folder for a category. A click opens the dashboard in the preview tab; a Shift, Ctrl or Cmd click opens it in a separate tab. -->\n <mj-dashboard-browser\n [Dashboards]=\"VisibleDashboards\"\n [Categories]=\"Categories\"\n [SelectedCategoryId]=\"IsFlatView ? null : SelectedCategoryId\"\n [FlatMode]=\"IsFlatView\"\n [ViewMode]=\"ViewMode\"\n [IsLoading]=\"isLoading\"\n [ShowCreateButton]=\"true\"\n [AllowMultiSelect]=\"true\"\n [AllowDragDrop]=\"true\"\n [DashboardPermissions]=\"DashboardPermissionsMap\"\n [EffectiveCategoryMap]=\"EffectiveCategoryMap\"\n [FavoriteIds]=\"FavoriteIds\"\n [ShowFavorites]=\"true\"\n [OwnerLabels]=\"OwnerLabels\"\n [FlatEmptyIcon]=\"EmptyState.Icon\"\n [FlatEmptyTitle]=\"EmptyState.Title\"\n [FlatEmptyMessage]=\"EmptyState.Message\"\n [FlatEmptyWelcome]=\"EmptyState.Welcome\"\n (DashboardOpen)=\"OnDashboardOpen($event)\"\n (DashboardEdit)=\"OnDashboardEdit($event)\"\n (DashboardDelete)=\"OnDashboardDelete($event)\"\n (DashboardMove)=\"OnDashboardMove($event)\"\n (DashboardCreate)=\"OnDashboardCreate($event)\"\n (DashboardFavoriteToggle)=\"OnDashboardFavoriteToggle($event)\"\n (CategoryCreate)=\"OnCategoryCreate($event)\"\n (CategoryDelete)=\"OnCategoryDelete($event)\"\n (CategoryChange)=\"OnCategoryChange($event)\"\n (ViewPreferenceChange)=\"OnViewPreferenceChange($event)\">\n </mj-dashboard-browser>\n </mj-left-nav-content>\n </mj-page-body>\n</mj-page-layout>\n\n<!-- New dashboard: asks for the name first; Cancel creates nothing -->\n<mj-dashboard-name-dialog\n [Visible]=\"ShowNewDashboardDialog\"\n [MaxLength]=\"NewDashboardNameMaxLength\"\n [Processing]=\"IsCreatingDashboard\"\n (Confirmed)=\"OnNewDashboardNamed($event)\"\n (Cancelled)=\"OnNewDashboardCancelled()\">\n</mj-dashboard-name-dialog>\n"]}
|