@memberjunction/ng-dashboards 6.2.0-edge.3 → 6.2.0-edge.5
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/sensitive-fields.d.ts +53 -0
- package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -0
- package/dist/AI/components/vectors/sensitive-fields.js +226 -0
- package/dist/AI/components/vectors/sensitive-fields.js.map +1 -0
- package/dist/AI/components/vectors/vector-document-rules.d.ts +126 -0
- package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -0
- package/dist/AI/components/vectors/vector-document-rules.js +168 -0
- package/dist/AI/components/vectors/vector-document-rules.js.map +1 -0
- 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 +58 -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 +493 -250
- 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/Communication/communication-agent-context.d.ts +11 -1
- package/dist/Communication/communication-agent-context.d.ts.map +1 -1
- package/dist/Communication/communication-agent-context.js +15 -0
- package/dist/Communication/communication-agent-context.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +5 -0
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts +27 -1
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +722 -78
- package/dist/Communication/communication-providers-resource.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 +51 -0
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +375 -223
- 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/DevTools/app-state-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +1 -0
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.d.ts.map +1 -1
- package/dist/DevTools/class-registry.component.js +1 -0
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.d.ts.map +1 -1
- package/dist/DevTools/event-monitor.component.js +2 -0
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.d.ts.map +1 -1
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/grid-width-lab.component.d.ts.map +1 -1
- package/dist/DevTools/grid-width-lab.component.js +1 -0
- package/dist/DevTools/grid-width-lab.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.d.ts.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +1 -0
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/DevTools/lazy-module-status.component.d.ts.map +1 -1
- package/dist/DevTools/lazy-module-status.component.js +1 -0
- package/dist/DevTools/lazy-module-status.component.js.map +1 -1
- package/dist/DevTools/settings-explorer.component.d.ts.map +1 -1
- package/dist/DevTools/settings-explorer.component.js +1 -0
- package/dist/DevTools/settings-explorer.component.js.map +1 -1
- package/dist/DevTools/tab-strip-lab.component.d.ts.map +1 -1
- package/dist/DevTools/tab-strip-lab.component.js +1 -0
- package/dist/DevTools/tab-strip-lab.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +5 -0
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +8 -5
- package/dist/EntityAdmin/entity-admin-dashboard.component.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/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts +11 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js +24 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipeline.engine.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts +16 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +87 -33
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/LoginStudio/login-studio-inspector.component.d.ts +130 -0
- package/dist/LoginStudio/login-studio-inspector.component.d.ts.map +1 -0
- package/dist/LoginStudio/login-studio-inspector.component.js +781 -0
- package/dist/LoginStudio/login-studio-inspector.component.js.map +1 -0
- package/dist/LoginStudio/login-studio-resource.component.d.ts +153 -0
- package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -0
- package/dist/LoginStudio/login-studio-resource.component.js +857 -0
- package/dist/LoginStudio/login-studio-resource.component.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/Workflows/components/workflow-runs-resource.component.js +4 -4
- package/dist/Workflows/components/workflow-runs-resource.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 +70 -62
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +33 -5
- 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 +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -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 +73 -69
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/layout-inspector.component.ts","../../src/DevTools/layout-inspector.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { TabConfig } from '@memberjunction/ng-ui-components';\nimport { WorkspaceStateManager, GoldenLayoutManager } from '@memberjunction/ng-base-application';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { BuildLayoutInspectorAgentContext } from './dev-tools-agent-context';\nimport { AgentToolResult, ValidateEnumParam } from '../shared/agent-tool-validation';\n\ninterface LayoutSection {\n id: 'workspace' | 'golden';\n label: string;\n icon: string;\n description: string;\n}\n\n/**\n * Layout Inspector — read-only view of the current workspace + Golden Layout\n * configuration. Replaces the legacy \"Log Layout (Debug)\" user-menu item that\n * only printed to console.\n */\n@RegisterClass(BaseResourceComponent, 'LayoutInspector')\n@Component({\n standalone: false,\n selector: 'mj-layout-inspector',\n templateUrl: './layout-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class LayoutInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Sections: LayoutSection[] = [\n { id: 'workspace', label: 'Workspace State', icon: 'fa-solid fa-table-columns', description: 'Tabs, active tab, app state' },\n { id: 'golden', label: 'Golden Layout', icon: 'fa-solid fa-window-restore', description: 'Active layout JSON config' }\n ];\n\n public ActiveSection: 'workspace' | 'golden' = 'workspace';\n public LayoutJson = '{}';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private layout: GoldenLayoutManager\n ) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ activeSection?: 'workspace' | 'golden' }>('layoutInspector');\n if (p?.activeSection) this.ActiveSection = p.activeSection;\n this.Refresh();\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context + register the read-only client tools.\n // Re-emit happens on every section change (OnSectionClick → refresh).\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Layout Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-table-columns'; }\n\n /** Sections rendered as horizontal tabs in the chrome's [toolbar] slot. */\n public get TabsConfig(): TabConfig[] {\n return this.Sections.map(s => ({\n key: s.id,\n label: s.label,\n icon: s.icon\n }));\n }\n\n /** @deprecated Use {@link TabsConfig}. */\n public get tabsConfig(): TabConfig[] {\n return this.TabsConfig;\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public OnTabChange(key: string): void {\n const section = this.Sections.find(s => s.id === key);\n if (section) {\n this.OnSectionClick(section);\n }\n }\n\n /** @deprecated Use {@link OnTabChange}. */\n public onTabChange(key: string): void {\n return this.OnTabChange(key);\n }\n\n public OnSectionClick(section: LayoutSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n this.Refresh();\n }\n\n public Refresh(): void {\n this.LayoutJson = JSON.stringify(this.computeData(), this.jsonReplacer, 2);\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\n }\n\n public async OnCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.LayoutJson);\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public OnDownload(): void {\n const blob = new Blob([this.LayoutJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n a.download = `mj-layout-${this.ActiveSection}-${stamp}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get SectionLabel(): string {\n return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';\n }\n\n // ---------- private ----------\n\n private computeData(): unknown {\n if (this.ActiveSection === 'workspace') {\n return this.workspace.GetConfiguration();\n }\n // Golden Layout: GoldenLayoutManager exposes its raw config when active\n const layoutAny = this.layout as unknown as { GetCurrentLayoutConfig?: () => unknown; CurrentConfig?: unknown };\n if (typeof layoutAny.GetCurrentLayoutConfig === 'function') {\n return layoutAny.GetCurrentLayoutConfig();\n }\n if (layoutAny.CurrentConfig !== undefined) {\n return layoutAny.CurrentConfig;\n }\n return { note: 'Golden Layout config is not currently exposed by GoldenLayoutManager.' };\n }\n\n private jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Map) return Object.fromEntries(value.entries());\n if (value instanceof Set) return Array.from(value);\n if (typeof value === 'function') return `[Function ${(value as { name: string }).name || 'anonymous'}]`;\n return value;\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: SAFE developer diagnostic.\n // The Layout Inspector is a read-only view of the workspace + Golden Layout\n // configuration. Context reports which section is selected and how many\n // sections exist; tools only refresh the snapshot and switch the inspected\n // section. No application data is read or mutated.\n // ========================================\n\n /** Publish the current Layout Inspector selection to the AI agent. */\n private publishAgentContext(): void {\n const context = BuildLayoutInspectorAgentContext({\n SelectedSection: this.ActiveSection,\n SelectedSectionLabel: this.SectionLabel,\n SectionCount: this.Sections.length,\n SectionIds: this.Sections.map(s => s.id),\n SnapshotSize: this.LayoutJson.length,\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /**\n * Register the read-only client tools the AI agent can invoke against the\n * Layout Inspector: RefreshLayoutSnapshot, InspectElement (switch section).\n */\n private registerAgentClientTools(): void {\n const sectionIds = this.Sections.map(s => s.id);\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RefreshLayoutSnapshot',\n Description: 'Re-read the current workspace / Golden Layout configuration snapshot.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.Refresh();\n return { Success: true };\n },\n },\n {\n Name: 'InspectElement',\n Description: 'Switch the inspected layout section. One of: ' + sectionIds.join(', ') + '.',\n ParameterSchema: {\n type: 'object',\n properties: { section: { type: 'string', enum: sectionIds } },\n required: ['section'],\n },\n Handler: async (params: Record<string, unknown>) => this.toolInspectElement(params),\n },\n ]);\n }\n\n /** Switch the inspected section (the inspector's \"elements\") by id. */\n private toolInspectElement(params: Record<string, unknown>): AgentToolResult {\n const validated = ValidateEnumParam<'workspace' | 'golden'>(\n params['section'],\n ['workspace', 'golden'],\n 'section',\n );\n if (!validated.ok) {\n return validated.result;\n }\n const section = this.Sections.find(s => s.id === validated.value);\n if (!section) {\n return { Success: false, ErrorMessage: `Section \"${validated.value}\" is not available.` };\n }\n this.OnSectionClick(section);\n return { Success: true };\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Layout inspector\"\n Title=\"Layout Inspector\"\n Subtitle=\"Workspace + Golden Layout configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"LayoutJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"layout-inspector.component.js","sourceRoot":"","sources":["../../src/DevTools/layout-inspector.component.ts","../../src/DevTools/layout-inspector.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { TabConfig } from '@memberjunction/ng-ui-components';\nimport { WorkspaceStateManager, GoldenLayoutManager } from '@memberjunction/ng-base-application';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { BuildLayoutInspectorAgentContext } from './dev-tools-agent-context';\nimport { AgentToolResult, ValidateEnumParam } from '../shared/agent-tool-validation';\n\ninterface LayoutSection {\n id: 'workspace' | 'golden';\n label: string;\n icon: string;\n description: string;\n}\n\n/**\n * Layout Inspector — read-only view of the current workspace + Golden Layout\n * configuration. Replaces the legacy \"Log Layout (Debug)\" user-menu item that\n * only printed to console.\n */\n@RegisterClass(BaseResourceComponent, 'LayoutInspector')\n@Component({\n standalone: false,\n selector: 'mj-layout-inspector',\n templateUrl: './layout-inspector.component.html',\n styleUrls: ['./inspector-shared.css']\n})\nexport class LayoutInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Sections: LayoutSection[] = [\n { id: 'workspace', label: 'Workspace State', icon: 'fa-solid fa-table-columns', description: 'Tabs, active tab, app state' },\n { id: 'golden', label: 'Golden Layout', icon: 'fa-solid fa-window-restore', description: 'Active layout JSON config' }\n ];\n\n public ActiveSection: 'workspace' | 'golden' = 'workspace';\n public LayoutJson = '{}';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(\n private cdr: ChangeDetectorRef,\n private workspace: WorkspaceStateManager,\n private layout: GoldenLayoutManager\n ) {\n super();\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n const p = DevToolsPrefs.Get<{ activeSection?: 'workspace' | 'golden' }>('layoutInspector');\n if (p?.activeSection) this.ActiveSection = p.activeSection;\n this.Refresh();\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context + register the read-only client tools.\n // Re-emit happens on every section change (OnSectionClick → refresh).\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n super.ngOnDestroy();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Layout Inspector'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-table-columns'; }\n\n /** Sections rendered as horizontal tabs in the chrome's [toolbar] slot. */\n public get TabsConfig(): TabConfig[] {\n return this.Sections.map(s => ({\n key: s.id,\n label: s.label,\n icon: s.icon\n }));\n }\n\n /** @deprecated Use {@link TabsConfig}. */\n public get tabsConfig(): TabConfig[] {\n return this.TabsConfig;\n }\n\n /** Adapter for `<mj-tab-nav>`'s string-typed `(TabChange)` output. */\n public OnTabChange(key: string): void {\n const section = this.Sections.find(s => s.id === key);\n if (section) {\n this.OnSectionClick(section);\n }\n }\n\n /** @deprecated Use {@link OnTabChange}. */\n public onTabChange(key: string): void {\n return this.OnTabChange(key);\n }\n\n public OnSectionClick(section: LayoutSection): void {\n if (this.ActiveSection === section.id) return;\n this.ActiveSection = section.id;\n DevToolsPrefs.Save('layoutInspector', { activeSection: this.ActiveSection });\n this.Refresh();\n }\n\n public Refresh(): void {\n this.LayoutJson = JSON.stringify(this.computeData(), this.jsonReplacer, 2);\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\n }\n\n public async OnCopy(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.LayoutJson);\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public OnDownload(): void {\n const blob = new Blob([this.LayoutJson], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n a.download = `mj-layout-${this.ActiveSection}-${stamp}.json`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get SectionLabel(): string {\n return this.Sections.find(s => s.id === this.ActiveSection)?.label ?? '';\n }\n\n // ---------- private ----------\n\n private computeData(): unknown {\n if (this.ActiveSection === 'workspace') {\n return this.workspace.GetConfiguration();\n }\n // Golden Layout: GoldenLayoutManager exposes its raw config when active\n const layoutAny = this.layout as unknown as { GetCurrentLayoutConfig?: () => unknown; CurrentConfig?: unknown };\n if (typeof layoutAny.GetCurrentLayoutConfig === 'function') {\n return layoutAny.GetCurrentLayoutConfig();\n }\n if (layoutAny.CurrentConfig !== undefined) {\n return layoutAny.CurrentConfig;\n }\n return { note: 'Golden Layout config is not currently exposed by GoldenLayoutManager.' };\n }\n\n private jsonReplacer(_key: string, value: unknown): unknown {\n if (value instanceof Date) return value.toISOString();\n if (value instanceof Map) return Object.fromEntries(value.entries());\n if (value instanceof Set) return Array.from(value);\n if (typeof value === 'function') return `[Function ${(value as { name: string }).name || 'anonymous'}]`;\n return value;\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: SAFE developer diagnostic.\n // The Layout Inspector is a read-only view of the workspace + Golden Layout\n // configuration. Context reports which section is selected and how many\n // sections exist; tools only refresh the snapshot and switch the inspected\n // section. No application data is read or mutated.\n // ========================================\n\n /** Publish the current Layout Inspector selection to the AI agent. */\n private publishAgentContext(): void {\n const context = BuildLayoutInspectorAgentContext({\n SelectedSection: this.ActiveSection,\n SelectedSectionLabel: this.SectionLabel,\n SectionCount: this.Sections.length,\n SectionIds: this.Sections.map(s => s.id),\n SnapshotSize: this.LayoutJson.length,\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /**\n * Register the read-only client tools the AI agent can invoke against the\n * Layout Inspector: RefreshLayoutSnapshot, InspectElement (switch section).\n */\n private registerAgentClientTools(): void {\n const sectionIds = this.Sections.map(s => s.id);\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RefreshLayoutSnapshot',\n Description: 'Re-read the current workspace / Golden Layout configuration snapshot.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.Refresh();\n return { Success: true };\n },\n },\n {\n Name: 'InspectElement',\n Description: 'Switch the inspected layout section. One of: ' + sectionIds.join(', ') + '.',\n ParameterSchema: {\n type: 'object',\n properties: { section: { type: 'string', enum: sectionIds } },\n required: ['section'],\n },\n Handler: async (params: Record<string, unknown>) => this.toolInspectElement(params),\n },\n ]);\n }\n\n /** Switch the inspected section (the inspector's \"elements\") by id. */\n private toolInspectElement(params: Record<string, unknown>): AgentToolResult {\n const validated = ValidateEnumParam<'workspace' | 'golden'>(\n params['section'],\n ['workspace', 'golden'],\n 'section',\n );\n if (!validated.ok) {\n return validated.result;\n }\n const section = this.Sections.find(s => s.id === validated.value);\n if (!section) {\n return { Success: false, ErrorMessage: `Section \"${validated.value}\" is not available.` };\n }\n this.OnSectionClick(section);\n return { Success: true };\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Layout inspector\"\n Title=\"Layout Inspector\"\n Subtitle=\"Workspace + Golden Layout configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n <button mjButton\n [variant]=\"CopyConfirmed ? 'success' : 'secondary'\"\n size=\"sm\"\n (click)=\"OnCopy()\"\n [title]=\"CopyConfirmed ? 'Copied' : 'Copy JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">{{ CopyConfirmed ? 'Copied' : 'Copy' }}</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnDownload()\" title=\"Download as JSON\" aria-label=\"Download as JSON\">\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\n </button>\n </div>\n <div toolbar>\n <mj-tab-nav\n [Tabs]=\"tabsConfig\"\n [ActiveKey]=\"ActiveSection\"\n (TabChange)=\"onTabChange($event)\">\n </mj-tab-nav>\n </div>\n </mj-page-header-interior>\n\n <div class=\"mj-inspector__content\">\n <div class=\"mj-inspector__content-head\">\n <h4 class=\"mj-inspector__content-title\">{{ SectionLabel }}</h4>\n <span class=\"mj-inspector__content-meta\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n <div class=\"mj-inspector__editor\">\n <mj-code-editor\n [(ngModel)]=\"LayoutJson\"\n [language]=\"'json'\"\n [readonly]=\"true\"\n [lineWrapping]=\"true\">\n </mj-code-editor>\n </div>\n </div>\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-module-status.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAMlE,UAAU,SAAS;IACf,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,0FAA0F;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;CACrB;AAeD;;;;;;;GAOG;AACH,qBAOa,yBAA0B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS,EAAE,aAAa;IAUhG,OAAO,CAAC,GAAG;IARhB,KAAK;;;;;;MAA+E;IACpF,MAAM,EAAE,SAAS,EAAE,CAAM;IACzB,SAAS,UAAS;IAClB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,CAAS;IACvD,sEAAsE;IAC/D,WAAW,SAAM;IACjB,aAAa,OAAc;gBAEd,GAAG,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"lazy-module-status.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAMlE,UAAU,SAAS;IACf,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,0FAA0F;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;CACrB;AAeD;;;;;;;GAOG;AACH,qBAOa,yBAA0B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS,EAAE,aAAa;IAUhG,OAAO,CAAC,GAAG;IARhB,KAAK;;;;;;MAA+E;IACpF,MAAM,EAAE,SAAS,EAAE,CAAM;IACzB,SAAS,UAAS;IAClB,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,CAAS;IACvD,sEAAsE;IAC/D,WAAW,SAAM;IACjB,aAAa,OAAc;gBAEd,GAAG,EAAE,iBAAiB;IAI1B,QAAQ,IAAI,IAAI;IAWzB,eAAe,IAAI,IAAI;IAOd,WAAW,IAAI,IAAI;IAKnC,OAAO,CAAC,SAAS;IAOK,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAEtD,OAAO,IAAI,IAAI;IAmCtB,uCAAuC;IAChC,OAAO,IAAI,IAAI;IAIf,aAAa,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,YAAY,GAAG,IAAI;IAMnE,IAAW,cAAc,IAAI,SAAS,EAAE,CAevC;IAEY,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzD,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAEM,YAAY,GAAI,IAAI,MAAM,EAAE,GAAG,SAAS,YAAe;IAC9D,SAAgB,iBAAiB,KAAuB;IAEjD,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKzC,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE;IAIvC,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM;IAI5C;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAyBxB,8DAA8D;IAC9D,OAAO,CAAC,mBAAmB;IAc3B;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAoBhC,sEAAsE;IACtE,OAAO,CAAC,UAAU;yCAzNT,yBAAyB;2CAAzB,yBAAyB;CAoOrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy-module-status.component.js","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts","../../src/DevTools/lazy-module-status.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { BuildLazyModuleStatusAgentContext } from './dev-tools-agent-context';\nimport { AgentToolResult, ValidateStringParam } from '../shared/agent-tool-validation';\n\ninterface LazyChunk {\n /** A friendly label derived from the chunk id. */\n label: string;\n /** The chunk's stable id — its dynamic import specifier. */\n chunkId: string;\n loaded: boolean;\n keys: string[];\n /** True when the user clicks \"Force Load\" — used to disable the button + show spinner. */\n loading?: boolean;\n /** UI state — false initially, user can expand to see all keys. */\n expanded: boolean;\n}\n\n/** How many entry pills to show in the collapsed card before \"Show all\". */\nconst COLLAPSED_KEY_LIMIT = 8;\n\ninterface LazyRegistryShape {\n GetSnapshot(): {\n registered: string[];\n loaded: string[];\n chunks: Array<{ chunkId: string; loaded: boolean; keys: string[] }>;\n loadedChunkCount: number;\n };\n ForceLoad(compoundKey: string): Promise<boolean>;\n}\n\n/**\n * Lazy Module Status — visualizes the Explorer's lazy-loading registry.\n * Shows each chunk, its status (loaded vs not), the registrations it\n * brings in, and offers a \"Force Load\" button to preload on demand.\n *\n * Reads from the global `__mj_lazy_registry__` published by `LazyModuleRegistry`\n * — no hard package dep on explorer-core.\n */\n@RegisterClass(BaseResourceComponent, 'LazyModuleStatusInspector')\n@Component({\n standalone: false,\n selector: 'mj-lazy-module-status',\n templateUrl: './lazy-module-status.component.html',\n styleUrls: ['./inspector-shared.css', './lazy-module-status.component.css']\n})\nexport class LazyModuleStatusComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Stats = { totalKeys: 0, loadedKeys: 0, chunkCount: 0, loadedChunks: 0, percent: 0 };\n public Chunks: LazyChunk[] = [];\n public Available = false;\n public Filter: 'all' | 'loaded' | 'not-loaded' = 'all';\n /** Free-text search narrowing chunks by label or registration key. */\n public SearchQuery = '';\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ filter?: 'all' | 'loaded' | 'not-loaded'; expanded?: string[] }>('lazyModule');\n if (prefs?.filter) this.Filter = prefs.filter;\n this.Refresh();\n if (prefs?.expanded) {\n for (const c of this.Chunks) c.expanded = prefs.expanded.includes(c.chunkId);\n }\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context + register the read-only client tools.\n // Re-emit happens on refresh, filter change, and the search tool.\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('lazyModule', {\n filter: this.Filter,\n expanded: this.Chunks.filter(c => c.expanded).map(c => c.chunkId)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Lazy Loading'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-puzzle-piece'; }\n\n public Refresh(): void {\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || typeof reg.GetSnapshot !== 'function') {\n this.Available = false;\n this.cdr.markForCheck();\n return;\n }\n this.Available = true;\n const snap = reg.GetSnapshot();\n // Preserve expansion state across refreshes\n const prevExpansion = new Map(this.Chunks.map(c => [c.chunkId, c.expanded] as const));\n this.Chunks = snap.chunks.map(c => ({\n label: this.deriveChunkLabel(c.chunkId, c.keys),\n chunkId: c.chunkId,\n loaded: c.loaded,\n keys: c.keys,\n expanded: prevExpansion.get(c.chunkId) ?? false\n })).sort((a, b) => {\n if (a.loaded !== b.loaded) return a.loaded ? -1 : 1; // loaded first\n return a.label.localeCompare(b.label);\n });\n\n const loadedChunks = this.Chunks.filter(c => c.loaded).length;\n this.Stats = {\n totalKeys: snap.registered.length,\n loadedKeys: snap.loaded.length,\n chunkCount: snap.chunks.length,\n loadedChunks,\n percent: snap.chunks.length === 0 ? 0 : Math.round((loadedChunks / snap.chunks.length) * 100)\n };\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\n }\n\n public OnFilterClick(filter: 'all' | 'loaded' | 'not-loaded'): void {\n this.Filter = filter;\n this.savePrefs();\n this.publishAgentContext();\n }\n\n public get FilteredChunks(): LazyChunk[] {\n let list: LazyChunk[];\n switch (this.Filter) {\n case 'loaded': list = this.Chunks.filter(c => c.loaded); break;\n case 'not-loaded': list = this.Chunks.filter(c => !c.loaded); break;\n default: list = this.Chunks; break;\n }\n const q = this.SearchQuery.trim().toLowerCase();\n if (q) {\n list = list.filter(c =>\n c.label.toLowerCase().includes(q) ||\n c.keys.some(k => k.toLowerCase().includes(q))\n );\n }\n return list;\n }\n\n public async OnForceLoad(chunk: LazyChunk): Promise<void> {\n if (chunk.loaded || chunk.loading) return;\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || chunk.keys.length === 0) return;\n\n chunk.loading = true;\n this.cdr.markForCheck();\n try {\n await reg.ForceLoad(chunk.keys[0]); // any key in the chunk loads the same chunk\n // Re-read snapshot to get authoritative state\n this.Refresh();\n } catch {\n chunk.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByChunk = (_i: number, c: LazyChunk) => c.chunkId;\n public readonly CollapsedKeyLimit = COLLAPSED_KEY_LIMIT;\n\n public ToggleChunkExpand(chunk: LazyChunk): void {\n chunk.expanded = !chunk.expanded;\n this.savePrefs();\n }\n\n public VisibleKeys(chunk: LazyChunk): string[] {\n return chunk.expanded ? chunk.keys : chunk.keys.slice(0, COLLAPSED_KEY_LIMIT);\n }\n\n public HiddenCount(chunk: LazyChunk): number {\n return Math.max(0, chunk.keys.length - COLLAPSED_KEY_LIMIT);\n }\n\n /**\n * Derive a friendly chunk label from the chunk id, which is the dynamic import\n * specifier the generated `LAZY_FEATURE_CONFIG` declared for the chunk\n * (e.g. '@memberjunction/ng-dashboards/ai-dashboards.module').\n */\n private deriveChunkLabel(chunkId: string, keys: string[]): string {\n if (chunkId) {\n // Strip the @memberjunction/ prefix for brevity\n return chunkId.replace(/^@memberjunction\\//, '');\n }\n // Fallback: derive from a representative key\n if (keys.length > 0) {\n const first = keys[0];\n const parts = first.split('::');\n return parts.length === 2 ? parts[1] : first;\n }\n return '(unknown chunk)';\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: SAFE developer diagnostic.\n // The Lazy Module Status inspector is a read-only view of the Explorer's\n // lazy-loading registry. Context reports module counts; tools only search the\n // chunk list and refresh the snapshot. No application data is read or mutated.\n // (Note: the existing in-UI \"Force Load\" button is intentionally NOT exposed\n // as an agent tool — preloading chunks is a user-driven action.)\n // ========================================\n\n /** Publish the current lazy-module status to the AI agent. */\n private publishAgentContext(): void {\n const visible = this.FilteredChunks;\n const context = BuildLazyModuleStatusAgentContext({\n Available: this.Available,\n TotalModules: this.Stats.chunkCount,\n LoadedModules: this.Stats.loadedChunks,\n Filter: this.Filter,\n SearchQuery: this.SearchQuery,\n VisibleModuleCount: visible.length,\n VisibleModuleNames: visible.map(c => c.label),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /**\n * Register the read-only client tools the AI agent can invoke against the\n * Lazy Module Status inspector: SearchLazyModules, RefreshModuleStatus.\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SearchLazyModules',\n Description: 'Search lazy modules by label or registration key. Pass an empty string to clear the search.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearch(params),\n },\n {\n Name: 'RefreshModuleStatus',\n Description: 'Re-read the lazy-loading registry snapshot to reflect any modules loaded since the last refresh.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.Refresh();\n return { Success: true };\n },\n },\n ]);\n }\n\n /** Apply (or clear, on empty string) the lazy-module search query. */\n private toolSearch(params: Record<string, unknown>): AgentToolResult {\n const validated = ValidateStringParam(params['query'], 'query');\n if (!validated.ok) {\n return validated.result;\n }\n this.SearchQuery = validated.value;\n this.savePrefs();\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true };\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Lazy loading inspector\"\n Title=\"Lazy Loading\"\n Subtitle=\"Code-split chunks: registered, loaded, and on-demand\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n @if (!Available) {\n <div class=\"lz-unavailable\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>Lazy registry not available.</strong>\n The shell hasn't published the LazyModuleRegistry to globalThis yet, or you're viewing this in an environment that doesn't use it.\n </div>\n </div>\n } @else {\n <div class=\"lz-summary\">\n <div class=\"lz-progress\">\n <div class=\"lz-progress-bar\">\n <div class=\"lz-progress-fill\" [style.width.%]=\"Stats.percent\"></div>\n </div>\n <div class=\"lz-progress-meta\">\n <span class=\"lz-progress-pct\">{{ Stats.percent }}%</span>\n <span class=\"lz-progress-label\">{{ Stats.loadedChunks }} of {{ Stats.chunkCount }} chunks loaded</span>\n </div>\n </div>\n <div class=\"lz-summary-stats\">\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.totalKeys }}</div>\n <div class=\"lz-summary-label\">Registered keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.loadedKeys }}</div>\n <div class=\"lz-summary-label\">Loaded keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.chunkCount }}</div>\n <div class=\"lz-summary-label\">Total chunks</div>\n </div>\n </div>\n </div>\n\n <div class=\"lz-filter-bar\">\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'all'\"\n (click)=\"OnFilterClick('all')\">\n All <span class=\"lz-filter-count\">{{ Stats.chunkCount }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'loaded'\"\n (click)=\"OnFilterClick('loaded')\">\n <i class=\"fa-solid fa-check-circle\"></i> Loaded <span class=\"lz-filter-count\">{{ Stats.loadedChunks }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'not-loaded'\"\n (click)=\"OnFilterClick('not-loaded')\">\n <i class=\"fa-regular fa-circle\"></i> Not loaded <span class=\"lz-filter-count\">{{ Stats.chunkCount - Stats.loadedChunks }}</span>\n </button>\n <span class=\"lz-spacer\"></span>\n <span class=\"lz-refreshed\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n\n <div class=\"lz-grid\">\n @for (chunk of FilteredChunks; track TrackByChunk($index, chunk)) {\n <div class=\"lz-card\" [class.lz-card--loaded]=\"chunk.loaded\">\n <div class=\"lz-card-head\">\n <div class=\"lz-card-status\" [class.lz-card-status--loaded]=\"chunk.loaded\">\n @if (chunk.loaded) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n <div class=\"lz-card-title\">\n <code>{{ chunk.label }}</code>\n <span class=\"lz-card-kcount\">{{ chunk.keys.length }} entries</span>\n </div>\n @if (!chunk.loaded) {\n <button type=\"button\"\n class=\"lz-load-btn\"\n [disabled]=\"chunk.loading\"\n (click)=\"OnForceLoad(chunk)\"\n title=\"Force-load this chunk now\">\n @if (chunk.loading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading\n } @else {\n <i class=\"fa-solid fa-bolt\"></i> Load\n }\n </button>\n }\n </div>\n <div class=\"lz-card-keys\" [class.lz-card-keys--expanded]=\"chunk.expanded\">\n @for (k of VisibleKeys(chunk); track k) {\n <span class=\"lz-key\">{{ k }}</span>\n }\n </div>\n @if (HiddenCount(chunk) > 0 || chunk.expanded) {\n <button class=\"lz-card-expand\"\n type=\"button\"\n (click)=\"ToggleChunkExpand(chunk)\">\n @if (chunk.expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show all {{ chunk.keys.length }} entries\n }\n </button>\n }\n </div>\n }\n @if (FilteredChunks.length === 0) {\n <mj-empty-state class=\"lz-empty\" Variant=\"no-results\" Size=\"compact\" Icon=\"fa-solid fa-circle-info\"\n Title=\"No chunks match the current filter.\" />\n }\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"lazy-module-status.component.js","sourceRoot":"","sources":["../../src/DevTools/lazy-module-status.component.ts","../../src/DevTools/lazy-module-status.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { BuildLazyModuleStatusAgentContext } from './dev-tools-agent-context';\nimport { AgentToolResult, ValidateStringParam } from '../shared/agent-tool-validation';\n\ninterface LazyChunk {\n /** A friendly label derived from the chunk id. */\n label: string;\n /** The chunk's stable id — its dynamic import specifier. */\n chunkId: string;\n loaded: boolean;\n keys: string[];\n /** True when the user clicks \"Force Load\" — used to disable the button + show spinner. */\n loading?: boolean;\n /** UI state — false initially, user can expand to see all keys. */\n expanded: boolean;\n}\n\n/** How many entry pills to show in the collapsed card before \"Show all\". */\nconst COLLAPSED_KEY_LIMIT = 8;\n\ninterface LazyRegistryShape {\n GetSnapshot(): {\n registered: string[];\n loaded: string[];\n chunks: Array<{ chunkId: string; loaded: boolean; keys: string[] }>;\n loadedChunkCount: number;\n };\n ForceLoad(compoundKey: string): Promise<boolean>;\n}\n\n/**\n * Lazy Module Status — visualizes the Explorer's lazy-loading registry.\n * Shows each chunk, its status (loaded vs not), the registrations it\n * brings in, and offers a \"Force Load\" button to preload on demand.\n *\n * Reads from the global `__mj_lazy_registry__` published by `LazyModuleRegistry`\n * — no hard package dep on explorer-core.\n */\n@RegisterClass(BaseResourceComponent, 'LazyModuleStatusInspector')\n@Component({\n standalone: false,\n selector: 'mj-lazy-module-status',\n templateUrl: './lazy-module-status.component.html',\n styleUrls: ['./inspector-shared.css', './lazy-module-status.component.css']\n})\nexport class LazyModuleStatusComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Stats = { totalKeys: 0, loadedKeys: 0, chunkCount: 0, loadedChunks: 0, percent: 0 };\n public Chunks: LazyChunk[] = [];\n public Available = false;\n public Filter: 'all' | 'loaded' | 'not-loaded' = 'all';\n /** Free-text search narrowing chunks by label or registration key. */\n public SearchQuery = '';\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n const prefs = DevToolsPrefs.Get<{ filter?: 'all' | 'loaded' | 'not-loaded'; expanded?: string[] }>('lazyModule');\n if (prefs?.filter) this.Filter = prefs.filter;\n this.Refresh();\n if (prefs?.expanded) {\n for (const c of this.Chunks) c.expanded = prefs.expanded.includes(c.chunkId);\n }\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context + register the read-only client tools.\n // Re-emit happens on refresh, filter change, and the search tool.\n this.publishAgentContext();\n this.registerAgentClientTools();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('lazyModule', {\n filter: this.Filter,\n expanded: this.Chunks.filter(c => c.expanded).map(c => c.chunkId)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Lazy Loading'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-puzzle-piece'; }\n\n public Refresh(): void {\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || typeof reg.GetSnapshot !== 'function') {\n this.Available = false;\n this.cdr.markForCheck();\n return;\n }\n this.Available = true;\n const snap = reg.GetSnapshot();\n // Preserve expansion state across refreshes\n const prevExpansion = new Map(this.Chunks.map(c => [c.chunkId, c.expanded] as const));\n this.Chunks = snap.chunks.map(c => ({\n label: this.deriveChunkLabel(c.chunkId, c.keys),\n chunkId: c.chunkId,\n loaded: c.loaded,\n keys: c.keys,\n expanded: prevExpansion.get(c.chunkId) ?? false\n })).sort((a, b) => {\n if (a.loaded !== b.loaded) return a.loaded ? -1 : 1; // loaded first\n return a.label.localeCompare(b.label);\n });\n\n const loadedChunks = this.Chunks.filter(c => c.loaded).length;\n this.Stats = {\n totalKeys: snap.registered.length,\n loadedKeys: snap.loaded.length,\n chunkCount: snap.chunks.length,\n loadedChunks,\n percent: snap.chunks.length === 0 ? 0 : Math.round((loadedChunks / snap.chunks.length) * 100)\n };\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\n }\n\n public OnFilterClick(filter: 'all' | 'loaded' | 'not-loaded'): void {\n this.Filter = filter;\n this.savePrefs();\n this.publishAgentContext();\n }\n\n public get FilteredChunks(): LazyChunk[] {\n let list: LazyChunk[];\n switch (this.Filter) {\n case 'loaded': list = this.Chunks.filter(c => c.loaded); break;\n case 'not-loaded': list = this.Chunks.filter(c => !c.loaded); break;\n default: list = this.Chunks; break;\n }\n const q = this.SearchQuery.trim().toLowerCase();\n if (q) {\n list = list.filter(c =>\n c.label.toLowerCase().includes(q) ||\n c.keys.some(k => k.toLowerCase().includes(q))\n );\n }\n return list;\n }\n\n public async OnForceLoad(chunk: LazyChunk): Promise<void> {\n if (chunk.loaded || chunk.loading) return;\n const reg = (globalThis as { __mj_lazy_registry__?: LazyRegistryShape }).__mj_lazy_registry__;\n if (!reg || chunk.keys.length === 0) return;\n\n chunk.loading = true;\n this.cdr.markForCheck();\n try {\n await reg.ForceLoad(chunk.keys[0]); // any key in the chunk loads the same chunk\n // Re-read snapshot to get authoritative state\n this.Refresh();\n } catch {\n chunk.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByChunk = (_i: number, c: LazyChunk) => c.chunkId;\n public readonly CollapsedKeyLimit = COLLAPSED_KEY_LIMIT;\n\n public ToggleChunkExpand(chunk: LazyChunk): void {\n chunk.expanded = !chunk.expanded;\n this.savePrefs();\n }\n\n public VisibleKeys(chunk: LazyChunk): string[] {\n return chunk.expanded ? chunk.keys : chunk.keys.slice(0, COLLAPSED_KEY_LIMIT);\n }\n\n public HiddenCount(chunk: LazyChunk): number {\n return Math.max(0, chunk.keys.length - COLLAPSED_KEY_LIMIT);\n }\n\n /**\n * Derive a friendly chunk label from the chunk id, which is the dynamic import\n * specifier the generated `LAZY_FEATURE_CONFIG` declared for the chunk\n * (e.g. '@memberjunction/ng-dashboards/ai-dashboards.module').\n */\n private deriveChunkLabel(chunkId: string, keys: string[]): string {\n if (chunkId) {\n // Strip the @memberjunction/ prefix for brevity\n return chunkId.replace(/^@memberjunction\\//, '');\n }\n // Fallback: derive from a representative key\n if (keys.length > 0) {\n const first = keys[0];\n const parts = first.split('::');\n return parts.length === 2 ? parts[1] : first;\n }\n return '(unknown chunk)';\n }\n\n // ========================================\n // AI AGENT CONTEXT & CLIENT TOOLS\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: SAFE developer diagnostic.\n // The Lazy Module Status inspector is a read-only view of the Explorer's\n // lazy-loading registry. Context reports module counts; tools only search the\n // chunk list and refresh the snapshot. No application data is read or mutated.\n // (Note: the existing in-UI \"Force Load\" button is intentionally NOT exposed\n // as an agent tool — preloading chunks is a user-driven action.)\n // ========================================\n\n /** Publish the current lazy-module status to the AI agent. */\n private publishAgentContext(): void {\n const visible = this.FilteredChunks;\n const context = BuildLazyModuleStatusAgentContext({\n Available: this.Available,\n TotalModules: this.Stats.chunkCount,\n LoadedModules: this.Stats.loadedChunks,\n Filter: this.Filter,\n SearchQuery: this.SearchQuery,\n VisibleModuleCount: visible.length,\n VisibleModuleNames: visible.map(c => c.label),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n\n /**\n * Register the read-only client tools the AI agent can invoke against the\n * Lazy Module Status inspector: SearchLazyModules, RefreshModuleStatus.\n */\n private registerAgentClientTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'SearchLazyModules',\n Description: 'Search lazy modules by label or registration key. Pass an empty string to clear the search.',\n ParameterSchema: { type: 'object', properties: { query: { type: 'string' } }, required: ['query'] },\n Handler: async (params: Record<string, unknown>) => this.toolSearch(params),\n },\n {\n Name: 'RefreshModuleStatus',\n Description: 'Re-read the lazy-loading registry snapshot to reflect any modules loaded since the last refresh.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.Refresh();\n return { Success: true };\n },\n },\n ]);\n }\n\n /** Apply (or clear, on empty string) the lazy-module search query. */\n private toolSearch(params: Record<string, unknown>): AgentToolResult {\n const validated = ValidateStringParam(params['query'], 'query');\n if (!validated.ok) {\n return validated.result;\n }\n this.SearchQuery = validated.value;\n this.savePrefs();\n this.publishAgentContext();\n this.cdr.markForCheck();\n return { Success: true };\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Lazy loading inspector\"\n Title=\"Lazy Loading\"\n Subtitle=\"Code-split chunks: registered, loaded, and on-demand\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n @if (!Available) {\n <div class=\"lz-unavailable\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <div>\n <strong>Lazy registry not available.</strong>\n The shell hasn't published the LazyModuleRegistry to globalThis yet, or you're viewing this in an environment that doesn't use it.\n </div>\n </div>\n } @else {\n <div class=\"lz-summary\">\n <div class=\"lz-progress\">\n <div class=\"lz-progress-bar\">\n <div class=\"lz-progress-fill\" [style.width.%]=\"Stats.percent\"></div>\n </div>\n <div class=\"lz-progress-meta\">\n <span class=\"lz-progress-pct\">{{ Stats.percent }}%</span>\n <span class=\"lz-progress-label\">{{ Stats.loadedChunks }} of {{ Stats.chunkCount }} chunks loaded</span>\n </div>\n </div>\n <div class=\"lz-summary-stats\">\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.totalKeys }}</div>\n <div class=\"lz-summary-label\">Registered keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.loadedKeys }}</div>\n <div class=\"lz-summary-label\">Loaded keys</div>\n </div>\n <div class=\"lz-summary-stat\">\n <div class=\"lz-summary-value\">{{ Stats.chunkCount }}</div>\n <div class=\"lz-summary-label\">Total chunks</div>\n </div>\n </div>\n </div>\n\n <div class=\"lz-filter-bar\">\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'all'\"\n (click)=\"OnFilterClick('all')\">\n All <span class=\"lz-filter-count\">{{ Stats.chunkCount }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'loaded'\"\n (click)=\"OnFilterClick('loaded')\">\n <i class=\"fa-solid fa-check-circle\"></i> Loaded <span class=\"lz-filter-count\">{{ Stats.loadedChunks }}</span>\n </button>\n <button type=\"button\"\n class=\"lz-filter\"\n [class.lz-filter--active]=\"Filter === 'not-loaded'\"\n (click)=\"OnFilterClick('not-loaded')\">\n <i class=\"fa-regular fa-circle\"></i> Not loaded <span class=\"lz-filter-count\">{{ Stats.chunkCount - Stats.loadedChunks }}</span>\n </button>\n <span class=\"lz-spacer\"></span>\n <span class=\"lz-refreshed\">Refreshed {{ LastRefreshedLabel }}</span>\n </div>\n\n <div class=\"lz-grid\">\n @for (chunk of FilteredChunks; track TrackByChunk($index, chunk)) {\n <div class=\"lz-card\" [class.lz-card--loaded]=\"chunk.loaded\">\n <div class=\"lz-card-head\">\n <div class=\"lz-card-status\" [class.lz-card-status--loaded]=\"chunk.loaded\">\n @if (chunk.loaded) {\n <i class=\"fa-solid fa-circle-check\"></i>\n } @else {\n <i class=\"fa-regular fa-circle\"></i>\n }\n </div>\n <div class=\"lz-card-title\">\n <code>{{ chunk.label }}</code>\n <span class=\"lz-card-kcount\">{{ chunk.keys.length }} entries</span>\n </div>\n @if (!chunk.loaded) {\n <button type=\"button\"\n class=\"lz-load-btn\"\n [disabled]=\"chunk.loading\"\n (click)=\"OnForceLoad(chunk)\"\n title=\"Force-load this chunk now\">\n @if (chunk.loading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Loading\n } @else {\n <i class=\"fa-solid fa-bolt\"></i> Load\n }\n </button>\n }\n </div>\n <div class=\"lz-card-keys\" [class.lz-card-keys--expanded]=\"chunk.expanded\">\n @for (k of VisibleKeys(chunk); track k) {\n <span class=\"lz-key\">{{ k }}</span>\n }\n </div>\n @if (HiddenCount(chunk) > 0 || chunk.expanded) {\n <button class=\"lz-card-expand\"\n type=\"button\"\n (click)=\"ToggleChunkExpand(chunk)\">\n @if (chunk.expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i> Show less\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i> Show all {{ chunk.keys.length }} entries\n }\n </button>\n }\n </div>\n }\n @if (FilteredChunks.length === 0) {\n <mj-empty-state class=\"lz-empty\" Variant=\"no-results\" Size=\"compact\" Icon=\"fa-solid fa-circle-info\"\n Title=\"No chunks match the current filter.\" />\n }\n </div>\n }\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-explorer.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/settings-explorer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAWlE,UAAU,UAAU;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9D,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,KAAK,aAAa,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,qBAOa,yBAA0B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS,EAAE,aAAa;IAWhG,OAAO,CAAC,GAAG;IAThB,KAAK,EAAE,aAAa,CAAU;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAM;IAC5B,YAAY,EAAE,UAAU,EAAE,CAAM;IAChC,WAAW,SAAM;IACjB,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAQ;IACnC,aAAa,OAAc;IAE3B,MAAM;;;MAA4B;gBAErB,GAAG,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"settings-explorer.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/settings-explorer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;;AAWlE,UAAU,UAAU;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9D,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,KAAK,aAAa,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,qBAOa,yBAA0B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS,EAAE,aAAa;IAWhG,OAAO,CAAC,GAAG;IAThB,KAAK,EAAE,aAAa,CAAU;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAM;IAC5B,YAAY,EAAE,UAAU,EAAE,CAAM;IAChC,WAAW,SAAM;IACjB,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAQ;IACnC,aAAa,OAAc;IAE3B,MAAM;;;MAA4B;gBAErB,GAAG,EAAE,iBAAiB;IAI1B,QAAQ,IAAI,IAAI;IASzB,eAAe,IAAI,IAAI;IAOd,WAAW,IAAI,IAAI;IAK5B,YAAY,IAAI,IAAI;IAKL,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAEtD,OAAO,IAAI,IAAI;IA6BtB,uCAAuC;IAChC,OAAO,IAAI,IAAI;IAIf,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAMhD,IAAW,YAAY,IAAI,UAAU,EAAE,CAKtC;IAEM,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAI3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5C,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,IAAW,iBAAiB,IAAI,MAAM,CAMrC;IAEM,UAAU,GAAI,IAAI,MAAM,EAAE,GAAG,UAAU,YAAW;IAIzD,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,KAAK;IAsCb,OAAO,CAAC,aAAa;IAuBrB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;yCArMlB,yBAAyB;2CAAzB,yBAAyB;CAoNrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-explorer.component.js","sourceRoot":"","sources":["../../src/DevTools/settings-explorer.component.ts","../../src/DevTools/settings-explorer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport {\n UserInfoEngine,\n InstanceConfigEngine,\n MJUserSettingEntity,\n MJInstanceConfigurationEntity\n} from '@memberjunction/core-entities';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { BuildSettingsExplorerAgentContext } from './dev-tools-agent-context';\n\ninterface SettingRow {\n key: string;\n rawValue: string;\n parsedValue: unknown;\n valueType: 'string' | 'number' | 'boolean' | 'json' | 'empty';\n /** Pretty preview shown in the table cell. */\n preview: string;\n /** Optional secondary metadata shown next to the key. */\n meta?: string;\n updated?: Date | null;\n}\n\ntype SettingsScope = 'user' | 'instance';\n\n/**\n * Settings Explorer — read-only browser for both `MJ: User Settings` (the\n * current user's per-app key/value bag) and `MJ: Instance Configurations`\n * (instance-level feature flags). Auto-detects JSON values, formats them\n * nicely, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'SettingsExplorerInspector')\n@Component({\n standalone: false,\n selector: 'mj-settings-explorer',\n templateUrl: './settings-explorer.component.html',\n styleUrls: ['./inspector-shared.css', './settings-explorer.component.css']\n})\nexport class SettingsExplorerComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Scope: SettingsScope = 'user';\n public UserRows: SettingRow[] = [];\n public InstanceRows: SettingRow[] = [];\n public SearchQuery = '';\n public Selected: SettingRow | null = null;\n public LastRefreshed = new Date();\n\n public Counts = { user: 0, instance: 0 };\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const p = DevToolsPrefs.Get<{ scope?: SettingsScope; search?: string }>('settingsExplorer');\n if (p?.scope) this.Scope = p.scope;\n if (p?.search) this.SearchQuery = p.search;\n this.Refresh();\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context. Re-emit happens in refresh(), OnScopeChange,\n // and PersistPrefs (search ngModelChange).\n // 🔒 METADATA-ONLY surface — NO client tools are registered (see SAFETY note below).\n this.publishAgentContext();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n this.publishAgentContext();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Settings Explorer'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-sliders'; }\n\n public Refresh(): void {\n const userSettings = UserInfoEngine.Instance.UserSettings ?? [];\n this.UserRows = userSettings.map(s => this.toRow(s.Setting ?? '(no key)', s.Value ?? '', s.User ? `User: ${s.User}` : undefined, s.__mj_UpdatedAt));\n\n const instanceConfigs = InstanceConfigEngine.Instance.InstanceConfigs ?? [];\n this.InstanceRows = instanceConfigs.map(c => this.toRow(\n c.FeatureKey ?? '(no key)',\n c.Value ?? '',\n this.buildInstanceMeta(c),\n c.__mj_UpdatedAt\n ));\n\n this.Counts = { user: this.UserRows.length, instance: this.InstanceRows.length };\n\n // Sort each list by key\n this.UserRows.sort((a, b) => a.key.localeCompare(b.key));\n this.InstanceRows.sort((a, b) => a.key.localeCompare(b.key));\n\n // Re-resolve selection if it still exists\n if (this.Selected) {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n this.Selected = list.find(r => r.key === this.Selected!.key) ?? null;\n }\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\n }\n\n public OnScopeChange(scope: SettingsScope): void {\n this.Scope = scope;\n this.Selected = null;\n this.PersistPrefs();\n }\n\n public get FilteredRows(): SettingRow[] {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return list;\n return list.filter(r => r.key.toLowerCase().includes(q) || r.rawValue.toLowerCase().includes(q));\n }\n\n public OnRowClick(row: SettingRow): void {\n this.Selected = this.Selected?.key === row.key ? null : row;\n }\n\n public async OnCopySelected(): Promise<void> {\n if (!this.Selected) return;\n const text = this.Selected.valueType === 'json'\n ? JSON.stringify(this.Selected.parsedValue, null, 2)\n : this.Selected.rawValue;\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get FormattedSelected(): string {\n if (!this.Selected) return '';\n if (this.Selected.valueType === 'json') {\n return JSON.stringify(this.Selected.parsedValue, null, 2);\n }\n return this.Selected.rawValue;\n }\n\n public TrackByKey = (_i: number, r: SettingRow) => r.key;\n\n // ---------- private ----------\n\n private buildInstanceMeta(c: MJInstanceConfigurationEntity): string | undefined {\n const parts: string[] = [];\n if (c.Category) parts.push(c.Category);\n if (c.DisplayName && c.DisplayName !== c.FeatureKey) parts.push(c.DisplayName);\n return parts.length ? parts.join(' · ') : undefined;\n }\n\n private toRow(key: string, rawValue: string, meta: string | undefined, updated: Date | string | null | undefined): SettingRow {\n const raw = rawValue ?? '';\n let valueType: SettingRow['valueType'] = 'string';\n let parsedValue: unknown = raw;\n let preview = raw;\n\n if (raw === '') {\n valueType = 'empty';\n preview = '(empty)';\n } else if (raw === 'true' || raw === 'false') {\n valueType = 'boolean';\n parsedValue = raw === 'true';\n } else if (/^-?\\d+(\\.\\d+)?$/.test(raw) && raw.length < 20) {\n valueType = 'number';\n parsedValue = Number(raw);\n } else if ((raw.startsWith('{') && raw.endsWith('}')) || (raw.startsWith('[') && raw.endsWith(']'))) {\n try {\n parsedValue = JSON.parse(raw);\n valueType = 'json';\n preview = this.summarizeJson(parsedValue);\n } catch {\n // not actually JSON — leave as string\n }\n }\n\n if (preview.length > 80) preview = preview.slice(0, 77) + '…';\n\n return {\n key,\n rawValue: raw,\n parsedValue,\n valueType,\n preview,\n meta,\n updated: updated ? (updated instanceof Date ? updated : new Date(updated)) : null\n };\n }\n\n private summarizeJson(value: unknown): string {\n if (Array.isArray(value)) return `[ ${value.length} item${value.length === 1 ? '' : 's'} ]`;\n if (value && typeof value === 'object') {\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.length === 0) return '{ }';\n return `{ ${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', …' : ''} }`;\n }\n return String(value);\n }\n\n // ========================================\n // AI AGENT CONTEXT (METADATA-ONLY)\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: METADATA-ONLY.\n // The Settings Explorer browses MJ: User Settings and MJ: Instance\n // Configurations, whose VALUES can include credentials, API keys, and other\n // secrets. We therefore expose to the AI agent ONLY metadata: how many\n // settings exist (per scope) and the search QUERY the user typed — NEVER the\n // setting values. For the same reason, NO client tools are registered here:\n // there is no value-returning operation the agent may invoke against this\n // surface.\n // ========================================\n\n /**\n * Publish METADATA-ONLY context for the Settings Explorer. Reports setting\n * counts (current scope + per-scope), the active search term, the\n * post-filter count, and the setting KEY NAMES — never any setting value.\n * See SAFETY BOUNDARY above.\n */\n private publishAgentContext(): void {\n const currentScopeCount = this.Scope === 'user' ? this.Counts.user : this.Counts.instance;\n const filtered = this.FilteredRows;\n const context = BuildSettingsExplorerAgentContext({\n SettingCount: currentScopeCount,\n UserSettingCount: this.Counts.user,\n InstanceSettingCount: this.Counts.instance,\n Scope: this.Scope,\n SearchTerm: this.SearchQuery,\n FilteredCount: filtered.length,\n // 🔒 KEY NAMES only (e.g. \"mj.formBuilder.…\") — never the .rawValue.\n SettingKeys: filtered.map(r => r.key),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Settings explorer\"\n Title=\"Settings Explorer\"\n Subtitle=\"User settings and instance-level configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"se-toolbar\">\n <div class=\"se-tabs\">\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'user'\"\n (click)=\"OnScopeChange('user')\">\n <i class=\"fa-solid fa-user\"></i>\n User Settings\n <span class=\"se-count\">{{ Counts.user }}</span>\n </button>\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'instance'\"\n (click)=\"OnScopeChange('instance')\">\n <i class=\"fa-solid fa-server\"></i>\n Instance Configurations\n <span class=\"se-count\">{{ Counts.instance }}</span>\n </button>\n </div>\n <div class=\"se-search-wrap\">\n <i class=\"fa-solid fa-search se-search-icon\"></i>\n <input type=\"search\"\n class=\"se-search\"\n placeholder=\"Search keys or values…\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"PersistPrefs()\" />\n @if (SearchQuery) {\n <button class=\"se-search-clear\" (click)=\"SearchQuery = ''\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"se-body\">\n <div class=\"se-list\">\n @if (FilteredRows.length === 0) {\n @if (SearchQuery) {\n <mj-empty-state class=\"se-empty\" Variant=\"no-results\" Icon=\"fa-solid fa-magnifying-glass\"\n [Title]=\"'No matches for “' + SearchQuery + '”'\" />\n } @else {\n <mj-empty-state class=\"se-empty\" Icon=\"fa-regular fa-folder-open\"\n [Title]=\"'No ' + (Scope === 'user' ? 'user settings' : 'instance configurations') + ' are defined.'\" />\n }\n } @else {\n <table class=\"se-table\">\n <thead>\n <tr>\n <th class=\"se-th-key\">Key</th>\n <th class=\"se-th-type\">Type</th>\n <th class=\"se-th-value\">Value</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRows; track TrackByKey($index, row)) {\n <tr [class.se-row--selected]=\"Selected?.key === row.key\"\n (click)=\"OnRowClick(row)\">\n <td class=\"se-td-key\">\n <code>{{ row.key }}</code>\n @if (row.meta) {\n <div class=\"se-td-meta\">{{ row.meta }}</div>\n }\n </td>\n <td class=\"se-td-type\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + row.valueType\">\n {{ row.valueType }}\n </span>\n </td>\n <td class=\"se-td-value\">{{ row.preview }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n\n @if (Selected) {\n <aside class=\"se-detail\">\n <div class=\"se-detail-head\">\n <div>\n <div class=\"se-detail-key\">{{ Selected.key }}</div>\n @if (Selected.meta) {\n <div class=\"se-detail-meta\">{{ Selected.meta }}</div>\n }\n </div>\n <div class=\"se-detail-actions\">\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnCopySelected()\" title=\"Copy value\">\n <i class=\"fa-solid fa-clipboard\" aria-hidden=\"true\"></i> Copy\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"Selected = null\" title=\"Close\" aria-label=\"Close detail\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"se-detail-body\">\n <div class=\"se-detail-meta-row\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + Selected.valueType\">{{ Selected.valueType }}</span>\n @if (Selected.updated) {\n <span class=\"se-detail-updated\">Updated {{ Selected.updated.toLocaleString() }}</span>\n }\n </div>\n <pre class=\"se-detail-value\"><code>{{ FormattedSelected || '(empty)' }}</code></pre>\n </div>\n </aside>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"settings-explorer.component.js","sourceRoot":"","sources":["../../src/DevTools/settings-explorer.component.ts","../../src/DevTools/settings-explorer.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport {\n UserInfoEngine,\n InstanceConfigEngine,\n MJUserSettingEntity,\n MJInstanceConfigurationEntity\n} from '@memberjunction/core-entities';\nimport { DevToolsPrefs } from './dev-tools-prefs';\nimport { BuildSettingsExplorerAgentContext } from './dev-tools-agent-context';\n\ninterface SettingRow {\n key: string;\n rawValue: string;\n parsedValue: unknown;\n valueType: 'string' | 'number' | 'boolean' | 'json' | 'empty';\n /** Pretty preview shown in the table cell. */\n preview: string;\n /** Optional secondary metadata shown next to the key. */\n meta?: string;\n updated?: Date | null;\n}\n\ntype SettingsScope = 'user' | 'instance';\n\n/**\n * Settings Explorer — read-only browser for both `MJ: User Settings` (the\n * current user's per-app key/value bag) and `MJ: Instance Configurations`\n * (instance-level feature flags). Auto-detects JSON values, formats them\n * nicely, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'SettingsExplorerInspector')\n@Component({\n standalone: false,\n selector: 'mj-settings-explorer',\n templateUrl: './settings-explorer.component.html',\n styleUrls: ['./inspector-shared.css', './settings-explorer.component.css']\n})\nexport class SettingsExplorerComponent extends BaseResourceComponent implements OnInit, OnDestroy, AfterViewInit {\n\n public Scope: SettingsScope = 'user';\n public UserRows: SettingRow[] = [];\n public InstanceRows: SettingRow[] = [];\n public SearchQuery = '';\n public Selected: SettingRow | null = null;\n public LastRefreshed = new Date();\n\n public Counts = { user: 0, instance: 0 };\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public override ngOnInit(): void {\n super.ngOnInit();\n const p = DevToolsPrefs.Get<{ scope?: SettingsScope; search?: string }>('settingsExplorer');\n if (p?.scope) this.Scope = p.scope;\n if (p?.search) this.SearchQuery = p.search;\n this.Refresh();\n this.NotifyLoadComplete();\n }\n\n public ngAfterViewInit(): void {\n // Publish initial agent context. Re-emit happens in refresh(), OnScopeChange,\n // and PersistPrefs (search ngModelChange).\n // 🔒 METADATA-ONLY surface — NO client tools are registered (see SAFETY note below).\n this.publishAgentContext();\n }\n\n public override ngOnDestroy(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n DevToolsPrefs.Save('settingsExplorer', { scope: this.Scope, search: this.SearchQuery });\n this.publishAgentContext();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Settings Explorer'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-sliders'; }\n\n public Refresh(): void {\n const userSettings = UserInfoEngine.Instance.UserSettings ?? [];\n this.UserRows = userSettings.map(s => this.toRow(s.Setting ?? '(no key)', s.Value ?? '', s.User ? `User: ${s.User}` : undefined, s.__mj_UpdatedAt));\n\n const instanceConfigs = InstanceConfigEngine.Instance.InstanceConfigs ?? [];\n this.InstanceRows = instanceConfigs.map(c => this.toRow(\n c.FeatureKey ?? '(no key)',\n c.Value ?? '',\n this.buildInstanceMeta(c),\n c.__mj_UpdatedAt\n ));\n\n this.Counts = { user: this.UserRows.length, instance: this.InstanceRows.length };\n\n // Sort each list by key\n this.UserRows.sort((a, b) => a.key.localeCompare(b.key));\n this.InstanceRows.sort((a, b) => a.key.localeCompare(b.key));\n\n // Re-resolve selection if it still exists\n if (this.Selected) {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n this.Selected = list.find(r => r.key === this.Selected!.key) ?? null;\n }\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n this.publishAgentContext();\n }\n\n /** @deprecated Use {@link Refresh}. */\n public refresh(): void {\n return this.Refresh();\n }\n\n public OnScopeChange(scope: SettingsScope): void {\n this.Scope = scope;\n this.Selected = null;\n this.PersistPrefs();\n }\n\n public get FilteredRows(): SettingRow[] {\n const list = this.Scope === 'user' ? this.UserRows : this.InstanceRows;\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return list;\n return list.filter(r => r.key.toLowerCase().includes(q) || r.rawValue.toLowerCase().includes(q));\n }\n\n public OnRowClick(row: SettingRow): void {\n this.Selected = this.Selected?.key === row.key ? null : row;\n }\n\n public async OnCopySelected(): Promise<void> {\n if (!this.Selected) return;\n const text = this.Selected.valueType === 'json'\n ? JSON.stringify(this.Selected.parsedValue, null, 2)\n : this.Selected.rawValue;\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public get FormattedSelected(): string {\n if (!this.Selected) return '';\n if (this.Selected.valueType === 'json') {\n return JSON.stringify(this.Selected.parsedValue, null, 2);\n }\n return this.Selected.rawValue;\n }\n\n public TrackByKey = (_i: number, r: SettingRow) => r.key;\n\n // ---------- private ----------\n\n private buildInstanceMeta(c: MJInstanceConfigurationEntity): string | undefined {\n const parts: string[] = [];\n if (c.Category) parts.push(c.Category);\n if (c.DisplayName && c.DisplayName !== c.FeatureKey) parts.push(c.DisplayName);\n return parts.length ? parts.join(' · ') : undefined;\n }\n\n private toRow(key: string, rawValue: string, meta: string | undefined, updated: Date | string | null | undefined): SettingRow {\n const raw = rawValue ?? '';\n let valueType: SettingRow['valueType'] = 'string';\n let parsedValue: unknown = raw;\n let preview = raw;\n\n if (raw === '') {\n valueType = 'empty';\n preview = '(empty)';\n } else if (raw === 'true' || raw === 'false') {\n valueType = 'boolean';\n parsedValue = raw === 'true';\n } else if (/^-?\\d+(\\.\\d+)?$/.test(raw) && raw.length < 20) {\n valueType = 'number';\n parsedValue = Number(raw);\n } else if ((raw.startsWith('{') && raw.endsWith('}')) || (raw.startsWith('[') && raw.endsWith(']'))) {\n try {\n parsedValue = JSON.parse(raw);\n valueType = 'json';\n preview = this.summarizeJson(parsedValue);\n } catch {\n // not actually JSON — leave as string\n }\n }\n\n if (preview.length > 80) preview = preview.slice(0, 77) + '…';\n\n return {\n key,\n rawValue: raw,\n parsedValue,\n valueType,\n preview,\n meta,\n updated: updated ? (updated instanceof Date ? updated : new Date(updated)) : null\n };\n }\n\n private summarizeJson(value: unknown): string {\n if (Array.isArray(value)) return `[ ${value.length} item${value.length === 1 ? '' : 's'} ]`;\n if (value && typeof value === 'object') {\n const keys = Object.keys(value as Record<string, unknown>);\n if (keys.length === 0) return '{ }';\n return `{ ${keys.slice(0, 3).join(', ')}${keys.length > 3 ? ', …' : ''} }`;\n }\n return String(value);\n }\n\n // ========================================\n // AI AGENT CONTEXT (METADATA-ONLY)\n //\n // 🔒 SAFETY BOUNDARY — CLASSIFICATION: METADATA-ONLY.\n // The Settings Explorer browses MJ: User Settings and MJ: Instance\n // Configurations, whose VALUES can include credentials, API keys, and other\n // secrets. We therefore expose to the AI agent ONLY metadata: how many\n // settings exist (per scope) and the search QUERY the user typed — NEVER the\n // setting values. For the same reason, NO client tools are registered here:\n // there is no value-returning operation the agent may invoke against this\n // surface.\n // ========================================\n\n /**\n * Publish METADATA-ONLY context for the Settings Explorer. Reports setting\n * counts (current scope + per-scope), the active search term, the\n * post-filter count, and the setting KEY NAMES — never any setting value.\n * See SAFETY BOUNDARY above.\n */\n private publishAgentContext(): void {\n const currentScopeCount = this.Scope === 'user' ? this.Counts.user : this.Counts.instance;\n const filtered = this.FilteredRows;\n const context = BuildSettingsExplorerAgentContext({\n SettingCount: currentScopeCount,\n UserSettingCount: this.Counts.user,\n InstanceSettingCount: this.Counts.instance,\n Scope: this.Scope,\n SearchTerm: this.SearchQuery,\n FilteredCount: filtered.length,\n // 🔒 KEY NAMES only (e.g. \"mj.formBuilder.…\") — never the .rawValue.\n SettingKeys: filtered.map(r => r.key),\n });\n this.navigationService.SetAgentContext(this, context);\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Settings explorer\"\n Title=\"Settings Explorer\"\n Subtitle=\"User settings and instance-level configuration\">\n <div actions>\n <mj-refresh-button [Loading]=\"false\" (Clicked)=\"refresh()\"></mj-refresh-button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"se-toolbar\">\n <div class=\"se-tabs\">\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'user'\"\n (click)=\"OnScopeChange('user')\">\n <i class=\"fa-solid fa-user\"></i>\n User Settings\n <span class=\"se-count\">{{ Counts.user }}</span>\n </button>\n <button type=\"button\"\n class=\"se-tab\"\n [class.se-tab--active]=\"Scope === 'instance'\"\n (click)=\"OnScopeChange('instance')\">\n <i class=\"fa-solid fa-server\"></i>\n Instance Configurations\n <span class=\"se-count\">{{ Counts.instance }}</span>\n </button>\n </div>\n <div class=\"se-search-wrap\">\n <i class=\"fa-solid fa-search se-search-icon\"></i>\n <input type=\"search\"\n class=\"se-search\"\n placeholder=\"Search keys or values…\"\n [(ngModel)]=\"SearchQuery\"\n (ngModelChange)=\"PersistPrefs()\" />\n @if (SearchQuery) {\n <button class=\"se-search-clear\" (click)=\"SearchQuery = ''\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n\n <div class=\"se-body\">\n <div class=\"se-list\">\n @if (FilteredRows.length === 0) {\n @if (SearchQuery) {\n <mj-empty-state class=\"se-empty\" Variant=\"no-results\" Icon=\"fa-solid fa-magnifying-glass\"\n [Title]=\"'No matches for “' + SearchQuery + '”'\" />\n } @else {\n <mj-empty-state class=\"se-empty\" Icon=\"fa-regular fa-folder-open\"\n [Title]=\"'No ' + (Scope === 'user' ? 'user settings' : 'instance configurations') + ' are defined.'\" />\n }\n } @else {\n <table class=\"se-table\">\n <thead>\n <tr>\n <th class=\"se-th-key\">Key</th>\n <th class=\"se-th-type\">Type</th>\n <th class=\"se-th-value\">Value</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredRows; track TrackByKey($index, row)) {\n <tr [class.se-row--selected]=\"Selected?.key === row.key\"\n (click)=\"OnRowClick(row)\">\n <td class=\"se-td-key\">\n <code>{{ row.key }}</code>\n @if (row.meta) {\n <div class=\"se-td-meta\">{{ row.meta }}</div>\n }\n </td>\n <td class=\"se-td-type\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + row.valueType\">\n {{ row.valueType }}\n </span>\n </td>\n <td class=\"se-td-value\">{{ row.preview }}</td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n\n @if (Selected) {\n <aside class=\"se-detail\">\n <div class=\"se-detail-head\">\n <div>\n <div class=\"se-detail-key\">{{ Selected.key }}</div>\n @if (Selected.meta) {\n <div class=\"se-detail-meta\">{{ Selected.meta }}</div>\n }\n </div>\n <div class=\"se-detail-actions\">\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"OnCopySelected()\" title=\"Copy value\">\n <i class=\"fa-solid fa-clipboard\" aria-hidden=\"true\"></i> Copy\n </button>\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"Selected = null\" title=\"Close\" aria-label=\"Close detail\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n <div class=\"se-detail-body\">\n <div class=\"se-detail-meta-row\">\n <span class=\"se-type-pill\" [class]=\"'se-type-pill--' + Selected.valueType\">{{ Selected.valueType }}</span>\n @if (Selected.updated) {\n <span class=\"se-detail-updated\">Updated {{ Selected.updated.toLocaleString() }}</span>\n }\n </div>\n <pre class=\"se-detail-value\"><code>{{ FormattedSelected || '(empty)' }}</code></pre>\n </div>\n </aside>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-strip-lab.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/tab-strip-lab.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;;AAE7D;;;;;;;;;;;;;;;GAeG;AACH,qBAOa,oBAAqB,SAAQ,qBAAsB,YAAW,MAAM;IAoBjE,OAAO,CAAC,GAAG;IAnBvB,yFAAyF;IACzF,SAAgB,MAAM,EAAE,MAAM,EAAE,CAA4F;IAE5H;;;;OAIG;IACI,eAAe,EAAE,MAAM,EAAE,CAAoB;IAEpD,kCAAkC;IAC3B,cAAc,SAAK;IAE1B;;;OAGG;IACH,SAAgB,KAAK;cAAmC,MAAM;OAAM;gBAEhD,GAAG,EAAE,iBAAiB;IAIpB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAE7D;;;;OAIG;IACI,SAAS,EAAE,cAAc,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAM;
|
|
1
|
+
{"version":3,"file":"tab-strip-lab.component.d.ts","sourceRoot":"","sources":["../../src/DevTools/tab-strip-lab.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;;AAE7D;;;;;;;;;;;;;;;GAeG;AACH,qBAOa,oBAAqB,SAAQ,qBAAsB,YAAW,MAAM;IAoBjE,OAAO,CAAC,GAAG;IAnBvB,yFAAyF;IACzF,SAAgB,MAAM,EAAE,MAAM,EAAE,CAA4F;IAE5H;;;;OAIG;IACI,eAAe,EAAE,MAAM,EAAE,CAAoB;IAEpD,kCAAkC;IAC3B,cAAc,SAAK;IAE1B;;;OAGG;IACH,SAAgB,KAAK;cAAmC,MAAM;OAAM;gBAEhD,GAAG,EAAE,iBAAiB;IAIpB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IACzC,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC;IAE7D;;;;OAIG;IACI,SAAS,EAAE,cAAc,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAM;IAE1C,QAAQ,IAAI,IAAI;IAMhC;;;;OAIG;IACI,cAAc,IAAI,IAAI;IAiBtB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMjC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM/B,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAM1C,UAAU,IAAI,IAAI;IAOlB,oBAAoB,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAK3D;;;;;OAKG;IACI,oBAAoB,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;yCAlG/C,oBAAoB;2CAApB,oBAAoB;CAuGhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-strip-lab.component.js","sourceRoot":"","sources":["../../src/DevTools/tab-strip-lab.component.ts","../../src/DevTools/tab-strip-lab.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { MJWorkspaceTab, MJWorkspaceTabStore, MJTabReorder } from '@memberjunction/ng-ui-components';\nimport { TabClosedEvent } from '@memberjunction/ng-tabstrip';\n\n/**\n * Tab Strip Lab — MJ's two tab strips, rendered side by side over the SAME labels.\n *\n * They are two components on purpose: `mj-tabstrip` takes tabs as projected children and addresses\n * them by position (it owns their bodies), while `mj-workspace-tab-strip` takes a data array and\n * addresses it by stable id (it projects nothing). Those are genuinely different API contracts.\n * What they must NEVER differ on is how a tab looks or how it responds to a keyboard — and that is\n * exactly the kind of drift no unit test catches and nobody notices until two screens sit side by\n * side. Hence this page: the same four labels through both, so any divergence is immediate.\n *\n * Both get their chrome from the one global `.mj-tabs*` stylesheet and their keyboard behaviour\n * from the one `mjTabList` directive, so a difference visible here is a bug in that sharing.\n *\n * 🚨 SAFETY BOUNDARY: deliberately unwired from agent context and client tools, as a developer\n * fixture rather than a data surface (the GraphQL Console precedent). It reads and writes nothing.\n */\n@RegisterClass(BaseResourceComponent, 'TabStripLabInspector')\n@Component({\n standalone: false,\n selector: 'mj-tab-strip-lab',\n templateUrl: './tab-strip-lab.component.html',\n styleUrls: ['./inspector-shared.css', './tab-strip-lab.component.css']\n})\nexport class TabStripLabComponent extends BaseResourceComponent implements OnInit {\n /** One source of labels for both strips — the comparison is worthless if they differ. */\n public readonly Labels: string[] = ['Overview', 'Line items', 'A deliberately long tab label that must ellipsize', 'Audit'];\n\n /**\n * The projected strip's tabs, as mutable state: `mj-tabstrip` owns no tab array, so CLOSING a\n * tab means the host removing it from the list it renders — a close with no `(BeforeTabClosed)`\n * handler waits forever on the strip's cancelable-close contract and silently does nothing.\n */\n public ProjectedLabels: string[] = [...this.Labels];\n\n /** Drives the projected strip. */\n public ProjectedIndex = 0;\n\n /**\n * Drives the data-driven strip. Uses the real store rather than a hand-rolled array so the\n * fixture also exercises open/close/reorder/neighbour-activation as shipped.\n */\n public readonly Store = new MJWorkspaceTabStore<{ Note: string }>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Tab Strip Lab'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-folder-tree'; }\n\n /**\n * Snapshot of `Store.Tabs`, reassigned by every handler. A getter delegating to the store\n * returns a FRESH array per read, which both defeats the strip's OnPush change detection and\n * trips dev-mode `ExpressionChanged` under default CD — the classic unstable-binding bug.\n */\n public DraftTabs: MJWorkspaceTab<{ Note: string }>[] = [];\n\n public ngOnInit(): void {\n this.ResetDraftTabs();\n this.NotifyLoadComplete();\n }\n\n /**\n * Seeded so every per-tab state the chrome can express is on screen at once — a plain tab, one\n * with unsaved edits (dot), one rejected (warning tint + icon), one complete. Otherwise the\n * states that only appear mid-workflow are the ones that quietly drift.\n */\n public ResetDraftTabs(): void {\n this.ProjectedLabels = [...this.Labels];\n this.Store.Clear();\n this.Labels.forEach((label, i) => {\n this.Store.Open({\n Id: `t${i}`,\n Label: label,\n Status: i === 2 ? 'rejected' : i === 3 ? 'complete' : 'draft',\n Dirty: i === 1,\n State: { Note: label },\n });\n });\n this.Store.Activate('t0');\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftSelected(id: string): void {\n this.Store.Activate(id);\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftClosed(id: string): void {\n this.Store.Close(id);\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftReordered(move: MJTabReorder): void {\n this.Store.Reorder(move.previousIndex, move.currentIndex);\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftNew(): void {\n const n = this.Store.Count + 1;\n this.Store.Open({ Id: `new-${n}-${this.Labels.length}`, Label: `Draft ${n}`, Status: 'draft', State: { Note: '' } });\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnProjectedTabSelect(event: { index: number }): void {\n this.ProjectedIndex = event.index;\n this.cdr.detectChanges();\n }\n\n /**\n * Complete the strip's close contract: `(TabClosed)` hands the host a `done` callback and the\n * strip's `CloseTab` awaits it — the host removes the tab from ITS list (the strip owns no tab\n * array) and signals done. Without a handler the promise never settles and the close button\n * (and the Delete key) silently do nothing — the exact contract this page exists to demonstrate.\n */\n public OnProjectedTabClosed(props: TabClosedEvent): void {\n this.ProjectedLabels = this.ProjectedLabels.filter((_, i) => i !== props.index);\n this.cdr.detectChanges();\n props.done();\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Tab strip lab\"\n Title=\"Tab Strip Lab\"\n Subtitle=\"MJ's two tab strips over the same labels — they must be indistinguishable\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ResetDraftTabs()\" title=\"Restore the seeded tabs\">\n <i class=\"fa-solid fa-rotate-left\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">Reset</span>\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"mj-inspector__content\">\n <p class=\"tsl-note\">\n Both strips draw from the one global <code>.mj-tabs*</code> stylesheet and get their keyboard\n behaviour from the one <code>mjTabList</code> directive. Any visual or behavioural difference\n between the two below is a bug in that sharing, not a styling choice.\n <strong>Keyboard:</strong> Tab into a strip (it is a single tab stop), then\n <kbd>←</kbd>/<kbd>→</kbd> to move, <kbd>Home</kbd>/<kbd>End</kbd> for the ends,\n <kbd>Delete</kbd> to close a closeable tab.\n </p>\n\n <!-- 1. Projected-children strip ------------------------------------------------------ -->\n <section class=\"tsl-case\">\n <header class=\"tsl-case__head\">\n <h4 class=\"tsl-case__title\"><mj-tabstrip></h4>\n <span class=\"tsl-case__meta\">projected children · addressed by index · owns its bodies</span>\n </header>\n <div class=\"tsl-case__stage\">\n <mj-tabstrip (TabSelected)=\"OnProjectedTabSelect($event)\" (TabClosed)=\"OnProjectedTabClosed($event)\">\n @for (label of ProjectedLabels; track label) {\n <mj-tab [TabCloseable]=\"true\">{{ label }}</mj-tab>\n }\n @for (label of ProjectedLabels; track label) {\n <mj-tab-body>\n <div class=\"tsl-body\">Body for <strong>{{ label }}</strong></div>\n </mj-tab-body>\n }\n </mj-tabstrip>\n </div>\n </section>\n\n <!-- 2. Data-driven strip -------------------------------------------------------------- -->\n <section class=\"tsl-case\">\n <header class=\"tsl-case__head\">\n <h4 class=\"tsl-case__title\"><mj-workspace-tab-strip></h4>\n <span class=\"tsl-case__meta\">data array · addressed by id · projects nothing · drag to reorder</span>\n </header>\n <div class=\"tsl-case__stage\">\n <mj-workspace-tab-strip\n [Tabs]=\"DraftTabs\"\n [ActiveId]=\"Store.ActiveId\"\n NewTabLabel=\"New draft\"\n (TabSelected)=\"OnDraftSelected($event)\"\n (TabClosed)=\"OnDraftClosed($event)\"\n (TabReordered)=\"OnDraftReordered($event)\"\n (NewTabRequested)=\"OnDraftNew()\">\n </mj-workspace-tab-strip>\n <!-- This strip projects no bodies: the host renders whatever the active tab means.\n Shown here so the two cases are visually comparable end to end. -->\n <div class=\"tsl-body\">\n @if (Store.ActiveTab) {\n Body for <strong>{{ Store.ActiveTab.Label }}</strong>\n <span class=\"tsl-state\">status: {{ Store.ActiveTab.Status }}{{ Store.ActiveTab.Dirty ? ' · unsaved' : '' }}</span>\n } @else {\n <em>No tab selected — close them all to see the empty state.</em>\n }\n </div>\n </div>\n </section>\n </div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"tab-strip-lab.component.js","sourceRoot":"","sources":["../../src/DevTools/tab-strip-lab.component.ts","../../src/DevTools/tab-strip-lab.component.html"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,SAAS,EAA6B,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAkB,mBAAmB,EAAgB,MAAM,kCAAkC,CAAC;;;;;IC8B7E,kCAA8B;IAAA,YAAW;IAAA,iBAAS;;;IAA1C,mCAAqB;IAAC,cAAW;IAAX,8BAAW;;;IAIrC,AADJ,mCAAa,cACa;IAAA,yBAAS;IAAA,8BAAQ;IAAA,YAAW;IACtD,AAD+D,AAAT,iBAAS,EAAM,EACvD;;;IAD6B,eAAW;IAAX,8BAAW;;;IA2BtD,0BAAS;IAAA,8BAAQ;IAAA,YAA2B;IAAA,iBAAS;IACrD,gCAAwB;IAAA,YAAmF;IAAA,iBAAO;;;IADjG,eAA2B;IAA3B,kDAA2B;IACpB,eAAmF;IAAnF,2HAAmF;;;IAE3G,0BAAI;IAAA,6EAAwD;IAAA,iBAAK;;AD7DzF;;;;;;;;;;;;;;;GAeG;AAQI,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,qBAAqB;IAoBvC;IAnBpB,yFAAyF;IACzE,MAAM,GAAa,CAAC,UAAU,EAAE,YAAY,EAAE,mDAAmD,EAAE,OAAO,CAAC,CAAC;IAE5H;;;;OAIG;IACI,eAAe,GAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpD,kCAAkC;IAC3B,cAAc,GAAG,CAAC,CAAC;IAE1B;;;OAGG;IACa,KAAK,GAAG,IAAI,mBAAmB,EAAoB,CAAC;IAEpE,YAAoB,GAAsB;QACtC,KAAK,EAAE,CAAC;QADQ,QAAG,GAAH,GAAG,CAAmB;IAE1C,CAAC;IAEe,KAAK,CAAC,sBAAsB,KAAsB,OAAO,eAAe,CAAC,CAAC,CAAC;IAC3E,KAAK,CAAC,oBAAoB,KAAsB,OAAO,yBAAyB,CAAC,CAAC,CAAC;IAEnG;;;;OAIG;IACI,SAAS,GAAuC,EAAE,CAAC;IAE1C,QAAQ;QACpB,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,cAAc;QACjB,IAAI,CAAC,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;gBAC7D,KAAK,EAAE,CAAC,KAAK,CAAC;gBACd,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;aACzB,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,eAAe,CAAC,EAAU;QAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,aAAa,CAAC,EAAU;QAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,gBAAgB,CAAC,IAAkB;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,UAAU;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACrH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,oBAAoB,CAAC,KAAwB;QAChD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACI,oBAAoB,CAAC,KAAqB;QAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC;QAChF,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;8GAtGQ,oBAAoB;6DAApB,oBAAoB;YCtBrB,AADJ,AALJ,AADJ,8BAA6C,iCAKgD,aACxE,gBACiG;YAA3D,iGAAS,oBAAgB,IAAC;YACrE,uBAA0D;YAC1D,+BAA8B;YAAA,qBAAK;YAG/C,AADI,AADI,AADuC,iBAAO,EACrC,EACP,EACgB;YAGtB,AADJ,8BAAmC,WACX;YAChB,sDAAqC;YAAA,6BAAM;YAAA,0BAAS;YAAA,iBAAO;YAAC,2EACrC;YAAA,6BAAM;YAAA,0BAAS;YAAA,iBAAO;YAAC,wIAE9C;YAAA,+BAAQ;YAAA,0BAAS;YAAA,iBAAS;YAAC,mEAC3B;YAAA,4BAAK;YAAA,uBAAC;YAAA,iBAAM;YAAA,kBAAC;YAAA,4BAAK;YAAA,uBAAC;YAAA,iBAAM;YAAC,2BAAS;YAAA,4BAAK;YAAA,qBAAI;YAAA,iBAAM;YAAA,kBAAC;YAAA,4BAAK;YAAA,oBAAG;YAAA,iBAAM;YAAC,gCAClE;YAAA,4BAAK;YAAA,uBAAM;YAAA,iBAAM;YAAC,4CACtB;YAAA,iBAAI;YAKI,AADJ,AADJ,mCAA0B,iBACS,cACC;YAAA,8BAAmB;YAAA,iBAAK;YACpD,iCAA6B;YAAA,oFAAyD;YAC1F,AAD0F,iBAAO,EACxF;YAEL,AADJ,gCAA6B,uBAC4E;YAA3C,AAA7C,yHAAe,gCAA4B,IAAC,wGAAc,gCAA4B,IAAC;YAChG,+GAEC;YACD,sHAIC;YAGb,AADI,AADI,iBAAc,EACZ,EACA;YAKF,AADJ,AADJ,mCAA0B,iBACS,cACC;YAAA,yCAA8B;YAAA,iBAAK;YAC/D,iCAA6B;YAAA,iGAAiE;YAClG,AADkG,iBAAO,EAChG;YAEL,AADJ,gCAA6B,kCAQY;YAAjC,AADA,AADA,AADA,oIAAe,2BAAuB,IAAC,mHAC1B,yBAAqB,IAAC,yHACnB,4BAAwB,IAAC,yHACtB,gBAAY,IAAC;YACpC,iBAAyB;YAGzB,gCAAsB;YAIhB,AAHF,8EAAuB,8DAGd;YAO7B,AADI,AADI,AADI,AADI,iBAAM,EACJ,EACA,EACR,EACJ;;YAzCc,gBAEC;YAFD,kCAEC;YACD,eAIC;YAJD,kCAIC;YAaD,eAAkB;YAClB,AADA,oCAAkB,gCACS;YAU3B,eAKC;YALD,+CAKC;;;ADvCR,oBAAoB;IAPhC,aAAa,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;GAOhD,oBAAoB,CAuGhC;;iFAvGY,oBAAoB;cANhC,SAAS;6BACM,KAAK,YACP,kBAAkB;;kFAInB,oBAAoB","sourcesContent":["import { Component, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass } from '@memberjunction/global';\nimport { MJWorkspaceTab, MJWorkspaceTabStore, MJTabReorder } from '@memberjunction/ng-ui-components';\nimport { TabClosedEvent } from '@memberjunction/ng-tabstrip';\n\n/**\n * Tab Strip Lab — MJ's two tab strips, rendered side by side over the SAME labels.\n *\n * They are two components on purpose: `mj-tabstrip` takes tabs as projected children and addresses\n * them by position (it owns their bodies), while `mj-workspace-tab-strip` takes a data array and\n * addresses it by stable id (it projects nothing). Those are genuinely different API contracts.\n * What they must NEVER differ on is how a tab looks or how it responds to a keyboard — and that is\n * exactly the kind of drift no unit test catches and nobody notices until two screens sit side by\n * side. Hence this page: the same four labels through both, so any divergence is immediate.\n *\n * Both get their chrome from the one global `.mj-tabs*` stylesheet and their keyboard behaviour\n * from the one `mjTabList` directive, so a difference visible here is a bug in that sharing.\n *\n * 🚨 SAFETY BOUNDARY: deliberately unwired from agent context and client tools, as a developer\n * fixture rather than a data surface (the GraphQL Console precedent). It reads and writes nothing.\n */\n@RegisterClass(BaseResourceComponent, 'TabStripLabInspector')\n@Component({\n standalone: false,\n selector: 'mj-tab-strip-lab',\n templateUrl: './tab-strip-lab.component.html',\n styleUrls: ['./inspector-shared.css', './tab-strip-lab.component.css']\n})\nexport class TabStripLabComponent extends BaseResourceComponent implements OnInit {\n /** One source of labels for both strips — the comparison is worthless if they differ. */\n public readonly Labels: string[] = ['Overview', 'Line items', 'A deliberately long tab label that must ellipsize', 'Audit'];\n\n /**\n * The projected strip's tabs, as mutable state: `mj-tabstrip` owns no tab array, so CLOSING a\n * tab means the host removing it from the list it renders — a close with no `(BeforeTabClosed)`\n * handler waits forever on the strip's cancelable-close contract and silently does nothing.\n */\n public ProjectedLabels: string[] = [...this.Labels];\n\n /** Drives the projected strip. */\n public ProjectedIndex = 0;\n\n /**\n * Drives the data-driven strip. Uses the real store rather than a hand-rolled array so the\n * fixture also exercises open/close/reorder/neighbour-activation as shipped.\n */\n public readonly Store = new MJWorkspaceTabStore<{ Note: string }>();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Tab Strip Lab'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-folder-tree'; }\n\n /**\n * Snapshot of `Store.Tabs`, reassigned by every handler. A getter delegating to the store\n * returns a FRESH array per read, which both defeats the strip's OnPush change detection and\n * trips dev-mode `ExpressionChanged` under default CD — the classic unstable-binding bug.\n */\n public DraftTabs: MJWorkspaceTab<{ Note: string }>[] = [];\n\n public override ngOnInit(): void {\n super.ngOnInit();\n this.ResetDraftTabs();\n this.NotifyLoadComplete();\n }\n\n /**\n * Seeded so every per-tab state the chrome can express is on screen at once — a plain tab, one\n * with unsaved edits (dot), one rejected (warning tint + icon), one complete. Otherwise the\n * states that only appear mid-workflow are the ones that quietly drift.\n */\n public ResetDraftTabs(): void {\n this.ProjectedLabels = [...this.Labels];\n this.Store.Clear();\n this.Labels.forEach((label, i) => {\n this.Store.Open({\n Id: `t${i}`,\n Label: label,\n Status: i === 2 ? 'rejected' : i === 3 ? 'complete' : 'draft',\n Dirty: i === 1,\n State: { Note: label },\n });\n });\n this.Store.Activate('t0');\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftSelected(id: string): void {\n this.Store.Activate(id);\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftClosed(id: string): void {\n this.Store.Close(id);\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftReordered(move: MJTabReorder): void {\n this.Store.Reorder(move.previousIndex, move.currentIndex);\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnDraftNew(): void {\n const n = this.Store.Count + 1;\n this.Store.Open({ Id: `new-${n}-${this.Labels.length}`, Label: `Draft ${n}`, Status: 'draft', State: { Note: '' } });\n this.DraftTabs = this.Store.Tabs;\n this.cdr.detectChanges();\n }\n\n public OnProjectedTabSelect(event: { index: number }): void {\n this.ProjectedIndex = event.index;\n this.cdr.detectChanges();\n }\n\n /**\n * Complete the strip's close contract: `(TabClosed)` hands the host a `done` callback and the\n * strip's `CloseTab` awaits it — the host removes the tab from ITS list (the strip owns no tab\n * array) and signals done. Without a handler the promise never settles and the close button\n * (and the Delete key) silently do nothing — the exact contract this page exists to demonstrate.\n */\n public OnProjectedTabClosed(props: TabClosedEvent): void {\n this.ProjectedLabels = this.ProjectedLabels.filter((_, i) => i !== props.index);\n this.cdr.detectChanges();\n props.done();\n }\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Tab strip lab\"\n Title=\"Tab Strip Lab\"\n Subtitle=\"MJ's two tab strips over the same labels — they must be indistinguishable\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ResetDraftTabs()\" title=\"Restore the seeded tabs\">\n <i class=\"fa-solid fa-rotate-left\" aria-hidden=\"true\"></i>\n <span class=\"mj-action-label\">Reset</span>\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"mj-inspector__content\">\n <p class=\"tsl-note\">\n Both strips draw from the one global <code>.mj-tabs*</code> stylesheet and get their keyboard\n behaviour from the one <code>mjTabList</code> directive. Any visual or behavioural difference\n between the two below is a bug in that sharing, not a styling choice.\n <strong>Keyboard:</strong> Tab into a strip (it is a single tab stop), then\n <kbd>←</kbd>/<kbd>→</kbd> to move, <kbd>Home</kbd>/<kbd>End</kbd> for the ends,\n <kbd>Delete</kbd> to close a closeable tab.\n </p>\n\n <!-- 1. Projected-children strip ------------------------------------------------------ -->\n <section class=\"tsl-case\">\n <header class=\"tsl-case__head\">\n <h4 class=\"tsl-case__title\"><mj-tabstrip></h4>\n <span class=\"tsl-case__meta\">projected children · addressed by index · owns its bodies</span>\n </header>\n <div class=\"tsl-case__stage\">\n <mj-tabstrip (TabSelected)=\"OnProjectedTabSelect($event)\" (TabClosed)=\"OnProjectedTabClosed($event)\">\n @for (label of ProjectedLabels; track label) {\n <mj-tab [TabCloseable]=\"true\">{{ label }}</mj-tab>\n }\n @for (label of ProjectedLabels; track label) {\n <mj-tab-body>\n <div class=\"tsl-body\">Body for <strong>{{ label }}</strong></div>\n </mj-tab-body>\n }\n </mj-tabstrip>\n </div>\n </section>\n\n <!-- 2. Data-driven strip -------------------------------------------------------------- -->\n <section class=\"tsl-case\">\n <header class=\"tsl-case__head\">\n <h4 class=\"tsl-case__title\"><mj-workspace-tab-strip></h4>\n <span class=\"tsl-case__meta\">data array · addressed by id · projects nothing · drag to reorder</span>\n </header>\n <div class=\"tsl-case__stage\">\n <mj-workspace-tab-strip\n [Tabs]=\"DraftTabs\"\n [ActiveId]=\"Store.ActiveId\"\n NewTabLabel=\"New draft\"\n (TabSelected)=\"OnDraftSelected($event)\"\n (TabClosed)=\"OnDraftClosed($event)\"\n (TabReordered)=\"OnDraftReordered($event)\"\n (NewTabRequested)=\"OnDraftNew()\">\n </mj-workspace-tab-strip>\n <!-- This strip projects no bodies: the host renders whatever the active tab means.\n Shown here so the two cases are visually comparable end to end. -->\n <div class=\"tsl-body\">\n @if (Store.ActiveTab) {\n Body for <strong>{{ Store.ActiveTab.Label }}</strong>\n <span class=\"tsl-state\">status: {{ Store.ActiveTab.Status }}{{ Store.ActiveTab.Dirty ? ' · unsaved' : '' }}</span>\n } @else {\n <em>No tab selected — close them all to see the empty state.</em>\n }\n </div>\n </div>\n </section>\n </div>\n</div>\n"]}
|
|
@@ -60,6 +60,11 @@ export declare class EntityAdminDashboardComponent extends BaseDashboard impleme
|
|
|
60
60
|
OnEntityOpened(entity: EntityInfo): void;
|
|
61
61
|
/** @deprecated Use {@link OnEntityOpened}. */
|
|
62
62
|
onEntityOpened(entity: EntityInfo): void;
|
|
63
|
+
/**
|
|
64
|
+
* Opens a record the ERD asked for (the details panel's Open button sends the entity's own
|
|
65
|
+
* `MJ: Entities` record). Navigates directly rather than emitting `OpenEntityRecord`: not every
|
|
66
|
+
* Explorer host subscribes to that output, and where none does the button silently did nothing.
|
|
67
|
+
*/
|
|
63
68
|
OnOpenRecord(event: {
|
|
64
69
|
EntityName: string;
|
|
65
70
|
RecordID: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-admin-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,UAAU,EAA0B,MAAM,sBAAsB,CAAC;AAI1E,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAuC,MAAM,+BAA+B,CAAC;;AAgBlG,qBAOa,6BAA8B,SAAQ,aAAc,YAAW,aAAa,EAAE,SAAS;IACpD,YAAY,EAAG,qBAAqB,CAAC;IAEnF,4CAA4C;IAC5C,IAAI,YAAY,IAAI,qBAAqB,CAExC;IACD,4CAA4C;IAC5C,IAAI,YAAY,CAAC,KAAK,EAAE,qBAAqB,EAE5C;IAEM,SAAS,UAAS;IAClB,eAAe,UAAS;IAE/B,+CAA+C;IAC/C,IAAW,eAAe,YAEzB;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAK,SAAA,EAE/B;IACM,cAAc,SAAM;IAE3B,8CAA8C;IAC9C,IAAW,cAAc,WAExB;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAK,QAAA,EAE9B;IACM,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,kBAAkB,UAAQ;IAEjC,kDAAkD;IAClD,IAAW,kBAAkB,YAE5B;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAK,SAAA,EAElC;IACM,cAAc,EAAE,UAAU,GAAG,IAAI,CAAQ;IAEhD,8CAA8C;IAC9C,IAAW,cAAc,IAAI,UAAU,GAAG,IAAI,CAE7C;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAEjD;IACM,gBAAgB,EAAE,UAAU,EAAE,CAAM;IAE3C,gDAAgD;IAChD,IAAW,gBAAgB,IAAI,UAAU,EAAE,CAE1C;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,EAE9C;IAED,uEAAuE;IACvE,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAGD,OAAO,CAAC,sBAAsB,CAAoC;IAClE,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,iBAAiB,CAAoC;IAE7D,eAAe,IAAI,IAAI;IAejB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxD,WAAW,IAAI,IAAI;IAK5B,SAAS,CAAC,aAAa,IAAI,IAAI;IAI/B,SAAS,CAAC,QAAQ,IAAI,IAAI;IAInB,iBAAiB,IAAI,IAAI;IAOhC,iDAAiD;IAC1C,iBAAiB,IAAI,IAAI;IAIzB,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAsBpD,6CAA6C;IACtC,aAAa,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAI7C,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAKxD,iDAAiD;IAC1C,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAIjD,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAI/C,8CAA8C;IACvC,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"entity-admin-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/EntityAdmin/entity-admin-dashboard.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -187,12 +187,15 @@ let EntityAdminDashboardComponent = class EntityAdminDashboardComponent extends
|
|
|
187
187
|
onEntityOpened(entity) {
|
|
188
188
|
return this.OnEntityOpened(entity);
|
|
189
189
|
}
|
|
190
|
+
/**
|
|
191
|
+
* Opens a record the ERD asked for (the details panel's Open button sends the entity's own
|
|
192
|
+
* `MJ: Entities` record). Navigates directly rather than emitting `OpenEntityRecord`: not every
|
|
193
|
+
* Explorer host subscribes to that output, and where none does the button silently did nothing.
|
|
194
|
+
*/
|
|
190
195
|
OnOpenRecord(event) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
RecordPKey: CompositeKey.FromURLSegment(this.metadata.EntityByName(event.EntityName), event.RecordID)
|
|
195
|
-
});
|
|
196
|
+
// The ERD emits records of arbitrary entities — resolve the key against the entity's metadata
|
|
197
|
+
const recordKey = CompositeKey.FromURLSegment(this.metadata.EntityByName(event.EntityName), event.RecordID);
|
|
198
|
+
this.navigationService.OpenEntityRecord(event.EntityName, recordKey);
|
|
196
199
|
}
|
|
197
200
|
/** @deprecated Use {@link OnOpenRecord}. */
|
|
198
201
|
onOpenRecord(event) {
|