@memberjunction/ng-dashboards 5.38.0 → 5.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -7
- package/dist/AI/components/agents/agent-configuration.component.js +199 -198
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +20 -17
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +15 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +166 -58
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +2 -1
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +55 -36
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +9 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +158 -117
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -1
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +22 -8
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +217 -860
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +1717 -7802
- package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
- package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
- package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
- package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
- package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
- package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
- package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts +87 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js +475 -0
- package/dist/AI/components/autotagging/dialogs/dry-run-preview.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts +29 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js +208 -0
- package/dist/AI/components/autotagging/dialogs/item-detail.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts +21 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js +70 -0
- package/dist/AI/components/autotagging/dialogs/no-content-type-warning.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +333 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +2125 -0
- package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts +61 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js +78 -0
- package/dist/AI/components/autotagging/shared/classify.dryrun.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts +58 -0
- package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.format.js +260 -0
- package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts +319 -0
- package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -0
- package/dist/AI/components/autotagging/shared/classify.types.js +6 -0
- package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts +103 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js +571 -0
- package/dist/AI/components/autotagging/tabs/health-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +77 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js +519 -0
- package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts +107 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js +719 -0
- package/dist/AI/components/autotagging/tabs/inbox-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +131 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +813 -0
- package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +177 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js +1465 -0
- package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +78 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js +492 -0
- package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts +397 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js +3490 -0
- package/dist/AI/components/autotagging/tabs/taxonomy-tab.component.js.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +56 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js +271 -0
- package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +306 -290
- package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +1 -1
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.js +209 -208
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +130 -128
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/requests/agent-requests-resource.component.js +61 -61
- package/dist/AI/components/requests/agent-requests-resource.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +17 -17
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
- package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
- package/dist/AI/components/tags/tags-resource.component.js +578 -538
- package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
- package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -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 +331 -303
- package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.d.ts +5 -0
- package/dist/AI/services/ai-instrumentation.service.d.ts.map +1 -1
- package/dist/AI/services/ai-instrumentation.service.js +14 -2
- package/dist/AI/services/ai-instrumentation.service.js.map +1 -1
- package/dist/AI/services/cache-metrics.d.ts +50 -0
- package/dist/AI/services/cache-metrics.d.ts.map +1 -0
- package/dist/AI/services/cache-metrics.js +43 -0
- package/dist/AI/services/cache-metrics.js.map +1 -0
- package/dist/APIKeys/api-applications-panel.component.js +2 -2
- package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
- package/dist/APIKeys/api-key-edit-panel.component.js +2 -2
- package/dist/APIKeys/api-keys-resource.component.js +132 -131
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +141 -141
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +15 -15
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -5
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +139 -212
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Admin/admin-data-schema.component.js +2 -2
- package/dist/Admin/admin-data-schema.component.js.map +1 -1
- package/dist/Admin/admin-dev-tools-resource.component.js +2 -2
- package/dist/Admin/admin-dev-tools-resource.component.js.map +1 -1
- package/dist/Admin/admin-identity-access.component.js +2 -2
- package/dist/Admin/admin-identity-access.component.js.map +1 -1
- package/dist/Admin/admin-monitoring.component.js +2 -2
- package/dist/Admin/admin-monitoring.component.js.map +1 -1
- package/dist/ApplicationRoles/application-roles-resource.component.js +54 -49
- package/dist/ApplicationRoles/application-roles-resource.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +6 -0
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +72 -50
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +103 -102
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +52 -51
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +39 -38
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +6 -0
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +92 -89
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +136 -135
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +155 -152
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +119 -118
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +129 -128
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +107 -106
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DatabaseDesigner/components/database-designer-dashboard.component.js +1 -1
- package/dist/DatabaseDesigner/components/entity-list.component.js +115 -114
- package/dist/DatabaseDesigner/components/entity-list.component.js.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts +5 -6
- package/dist/DatabaseDesigner/database-designer-dashboards.module.d.ts.map +1 -1
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js +4 -5
- package/dist/DatabaseDesigner/database-designer-dashboards.module.js.map +1 -1
- package/dist/DevTools/app-state-inspector.component.js +18 -17
- package/dist/DevTools/app-state-inspector.component.js.map +1 -1
- package/dist/DevTools/class-registry.component.js +88 -85
- package/dist/DevTools/class-registry.component.js.map +1 -1
- package/dist/DevTools/event-monitor.component.js +155 -150
- package/dist/DevTools/event-monitor.component.js.map +1 -1
- package/dist/DevTools/graphql-console.component.js +245 -243
- package/dist/DevTools/graphql-console.component.js.map +1 -1
- package/dist/DevTools/layout-inspector.component.js +18 -17
- package/dist/DevTools/layout-inspector.component.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +20 -19
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/Integration/components/activity/activity.component.d.ts.map +1 -1
- package/dist/Integration/components/activity/activity.component.js +236 -229
- package/dist/Integration/components/activity/activity.component.js.map +1 -1
- package/dist/Integration/components/connections/connections.component.js +390 -389
- package/dist/Integration/components/connections/connections.component.js.map +1 -1
- package/dist/Integration/components/overview/overview.component.js +2 -2
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +14 -11
- package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -119
- package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js +293 -291
- package/dist/KnowledgeHub/components/config/knowledge-config-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js +62 -61
- package/dist/KnowledgeHub/components/scheduling/scheduling-resource.component.js.map +1 -1
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
- package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
- package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
- package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
- package/dist/KnowledgeHub/index.d.ts +3 -0
- package/dist/KnowledgeHub/index.d.ts.map +1 -1
- package/dist/KnowledgeHub/index.js +3 -0
- package/dist/KnowledgeHub/index.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +6 -2
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +525 -566
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +135 -134
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +199 -198
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
- package/dist/MCP/mcp-dashboard.component.js +443 -438
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity.component.js +146 -147
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +76 -75
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +97 -96
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +24 -22
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts +2 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.d.ts.map +1 -1
- package/dist/Scheduling/services/scheduling-instrumentation.service.js +1 -0
- package/dist/Scheduling/services/scheduling-instrumentation.service.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts +14 -4
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +436 -427
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +1 -1
- package/dist/Testing/components/testing-runs.component.js +116 -115
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +6 -7
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/labels-resource.component.js +173 -172
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.d.ts +6 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -1
- package/dist/VersionHistory/components/restore-resource.component.js +116 -92
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +57 -35
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +80 -1
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/communication-dashboards.module.d.ts +1 -1
- package/dist/communication-dashboards.module.d.ts.map +1 -1
- package/dist/communication-dashboards.module.js +7 -1
- package/dist/communication-dashboards.module.js.map +1 -1
- package/dist/data-explorer-dashboards.module.d.ts +12 -14
- package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
- package/dist/data-explorer-dashboards.module.js +5 -14
- 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 +3 -0
- package/dist/public-api.js.map +1 -1
- package/dist/testing-dashboards.module.d.ts +4 -5
- package/dist/testing-dashboards.module.d.ts.map +1 -1
- package/dist/testing-dashboards.module.js +7 -5
- package/dist/testing-dashboards.module.js.map +1 -1
- package/package.json +57 -54
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
|
@@ -10,15 +10,15 @@ import { RegisterClass, MJGlobal } from '@memberjunction/global';
|
|
|
10
10
|
import { DevToolsPrefs } from './dev-tools-prefs';
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
import * as i1 from "@memberjunction/ng-ui-components";
|
|
13
|
-
function
|
|
13
|
+
function ClassRegistryInspectorComponent_Conditional_36_Template(rf, ctx) { if (rf & 1) {
|
|
14
14
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
15
|
-
i0.ɵɵelementStart(0, "button",
|
|
16
|
-
i0.ɵɵlistener("click", function
|
|
17
|
-
i0.ɵɵelement(1, "i",
|
|
15
|
+
i0.ɵɵelementStart(0, "button", 24);
|
|
16
|
+
i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Conditional_36_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchChange("")); });
|
|
17
|
+
i0.ɵɵelement(1, "i", 25);
|
|
18
18
|
i0.ɵɵelementEnd();
|
|
19
19
|
} }
|
|
20
|
-
function
|
|
21
|
-
i0.ɵɵelementStart(0, "span",
|
|
20
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelementStart(0, "span", 32);
|
|
22
22
|
i0.ɵɵtext(1);
|
|
23
23
|
i0.ɵɵelementEnd();
|
|
24
24
|
} if (rf & 2) {
|
|
@@ -26,13 +26,13 @@ function ClassRegistryInspectorComponent_For_36_Conditional_8_Template(rf, ctx)
|
|
|
26
26
|
i0.ɵɵadvance();
|
|
27
27
|
i0.ɵɵtextInterpolate1("", group_r4.uniqueKeys, " keys");
|
|
28
28
|
} }
|
|
29
|
-
function
|
|
30
|
-
i0.ɵɵelementStart(0, "span",
|
|
31
|
-
i0.ɵɵelement(1, "i",
|
|
29
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
30
|
+
i0.ɵɵelementStart(0, "span", 33);
|
|
31
|
+
i0.ɵɵelement(1, "i", 35);
|
|
32
32
|
i0.ɵɵtext(2, " overrides ");
|
|
33
33
|
i0.ɵɵelementEnd();
|
|
34
34
|
} }
|
|
35
|
-
function
|
|
35
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
36
36
|
i0.ɵɵelementStart(0, "code");
|
|
37
37
|
i0.ɵɵtext(1);
|
|
38
38
|
i0.ɵɵelementEnd();
|
|
@@ -41,34 +41,34 @@ function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Conditiona
|
|
|
41
41
|
i0.ɵɵadvance();
|
|
42
42
|
i0.ɵɵtextInterpolate(reg_r5.Key);
|
|
43
43
|
} }
|
|
44
|
-
function
|
|
45
|
-
i0.ɵɵelementStart(0, "span",
|
|
44
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
45
|
+
i0.ɵɵelementStart(0, "span", 42);
|
|
46
46
|
i0.ɵɵtext(1, "(no key)");
|
|
47
47
|
i0.ɵɵelementEnd();
|
|
48
48
|
} }
|
|
49
|
-
function
|
|
50
|
-
i0.ɵɵelementStart(0, "span",
|
|
51
|
-
i0.ɵɵelement(1, "i",
|
|
49
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
+
i0.ɵɵelementStart(0, "span", 46);
|
|
51
|
+
i0.ɵɵelement(1, "i", 48);
|
|
52
52
|
i0.ɵɵtext(2, " winner ");
|
|
53
53
|
i0.ɵɵelementEnd();
|
|
54
54
|
} }
|
|
55
|
-
function
|
|
56
|
-
i0.ɵɵelementStart(0, "span",
|
|
55
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
56
|
+
i0.ɵɵelementStart(0, "span", 47);
|
|
57
57
|
i0.ɵɵtext(1, " shadowed ");
|
|
58
58
|
i0.ɵɵelementEnd();
|
|
59
59
|
} }
|
|
60
|
-
function
|
|
61
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
62
|
-
i0.ɵɵconditionalCreate(2,
|
|
60
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
61
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 41);
|
|
62
|
+
i0.ɵɵconditionalCreate(2, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_2_Template, 2, 1, "code")(3, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_3_Template, 2, 0, "span", 42);
|
|
63
63
|
i0.ɵɵelementEnd();
|
|
64
|
-
i0.ɵɵelementStart(4, "td",
|
|
64
|
+
i0.ɵɵelementStart(4, "td", 43);
|
|
65
65
|
i0.ɵɵtext(5);
|
|
66
66
|
i0.ɵɵelementEnd();
|
|
67
|
-
i0.ɵɵelementStart(6, "td",
|
|
67
|
+
i0.ɵɵelementStart(6, "td", 44);
|
|
68
68
|
i0.ɵɵtext(7);
|
|
69
69
|
i0.ɵɵelementEnd();
|
|
70
|
-
i0.ɵɵelementStart(8, "td",
|
|
71
|
-
i0.ɵɵconditionalCreate(9,
|
|
70
|
+
i0.ɵɵelementStart(8, "td", 45);
|
|
71
|
+
i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_9_Template, 3, 0, "span", 46)(10, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Conditional_10_Template, 2, 0, "span", 47);
|
|
72
72
|
i0.ɵɵelementEnd()();
|
|
73
73
|
} if (rf & 2) {
|
|
74
74
|
const reg_r5 = ctx.$implicit;
|
|
@@ -84,41 +84,41 @@ function ClassRegistryInspectorComponent_For_36_Conditional_10_For_12_Template(r
|
|
|
84
84
|
i0.ɵɵadvance(2);
|
|
85
85
|
i0.ɵɵconditional(ctx_r1.IsWinningRow(group_r4, reg_r5) ? 9 : ctx_r1.IsConflictRow(group_r4, reg_r5) ? 10 : -1);
|
|
86
86
|
} }
|
|
87
|
-
function
|
|
88
|
-
i0.ɵɵelementStart(0, "table",
|
|
87
|
+
function ClassRegistryInspectorComponent_For_39_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
88
|
+
i0.ɵɵelementStart(0, "table", 34)(1, "thead")(2, "tr")(3, "th", 36);
|
|
89
89
|
i0.ɵɵtext(4, "Key");
|
|
90
90
|
i0.ɵɵelementEnd();
|
|
91
|
-
i0.ɵɵelementStart(5, "th",
|
|
91
|
+
i0.ɵɵelementStart(5, "th", 37);
|
|
92
92
|
i0.ɵɵtext(6, "Subclass");
|
|
93
93
|
i0.ɵɵelementEnd();
|
|
94
|
-
i0.ɵɵelementStart(7, "th",
|
|
94
|
+
i0.ɵɵelementStart(7, "th", 38);
|
|
95
95
|
i0.ɵɵtext(8, "Priority");
|
|
96
96
|
i0.ɵɵelementEnd();
|
|
97
|
-
i0.ɵɵelement(9, "th",
|
|
97
|
+
i0.ɵɵelement(9, "th", 39);
|
|
98
98
|
i0.ɵɵelementEnd()();
|
|
99
99
|
i0.ɵɵelementStart(10, "tbody");
|
|
100
|
-
i0.ɵɵrepeaterCreate(11,
|
|
100
|
+
i0.ɵɵrepeaterCreate(11, ClassRegistryInspectorComponent_For_39_Conditional_10_For_12_Template, 11, 8, "tr", 40, i0.ɵɵcomponentInstance().TrackByReg, true);
|
|
101
101
|
i0.ɵɵelementEnd()();
|
|
102
102
|
} if (rf & 2) {
|
|
103
103
|
const group_r4 = i0.ɵɵnextContext().$implicit;
|
|
104
104
|
i0.ɵɵadvance(11);
|
|
105
105
|
i0.ɵɵrepeater(group_r4.registrations);
|
|
106
106
|
} }
|
|
107
|
-
function
|
|
107
|
+
function ClassRegistryInspectorComponent_For_39_Template(rf, ctx) { if (rf & 1) {
|
|
108
108
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
109
|
-
i0.ɵɵelementStart(0, "div",
|
|
110
|
-
i0.ɵɵlistener("click", function
|
|
111
|
-
i0.ɵɵelement(2, "i",
|
|
112
|
-
i0.ɵɵelementStart(3, "span",
|
|
109
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "button", 27);
|
|
110
|
+
i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_For_39_Template_button_click_1_listener() { const group_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ToggleGroup(group_r4)); });
|
|
111
|
+
i0.ɵɵelement(2, "i", 28);
|
|
112
|
+
i0.ɵɵelementStart(3, "span", 29);
|
|
113
113
|
i0.ɵɵtext(4);
|
|
114
114
|
i0.ɵɵelementEnd();
|
|
115
|
-
i0.ɵɵelementStart(5, "span",
|
|
115
|
+
i0.ɵɵelementStart(5, "span", 30)(6, "span", 31);
|
|
116
116
|
i0.ɵɵtext(7);
|
|
117
117
|
i0.ɵɵelementEnd();
|
|
118
|
-
i0.ɵɵconditionalCreate(8,
|
|
119
|
-
i0.ɵɵconditionalCreate(9,
|
|
118
|
+
i0.ɵɵconditionalCreate(8, ClassRegistryInspectorComponent_For_39_Conditional_8_Template, 2, 1, "span", 32);
|
|
119
|
+
i0.ɵɵconditionalCreate(9, ClassRegistryInspectorComponent_For_39_Conditional_9_Template, 3, 0, "span", 33);
|
|
120
120
|
i0.ɵɵelementEnd()();
|
|
121
|
-
i0.ɵɵconditionalCreate(10,
|
|
121
|
+
i0.ɵɵconditionalCreate(10, ClassRegistryInspectorComponent_For_39_Conditional_10_Template, 13, 0, "table", 34);
|
|
122
122
|
i0.ɵɵelementEnd();
|
|
123
123
|
} if (rf & 2) {
|
|
124
124
|
const group_r4 = ctx.$implicit;
|
|
@@ -136,9 +136,9 @@ function ClassRegistryInspectorComponent_For_36_Template(rf, ctx) { if (rf & 1)
|
|
|
136
136
|
i0.ɵɵadvance();
|
|
137
137
|
i0.ɵɵconditional(group_r4.expanded ? 10 : -1);
|
|
138
138
|
} }
|
|
139
|
-
function
|
|
140
|
-
i0.ɵɵelementStart(0, "div",
|
|
141
|
-
i0.ɵɵelement(1, "i",
|
|
139
|
+
function ClassRegistryInspectorComponent_Conditional_40_Template(rf, ctx) { if (rf & 1) {
|
|
140
|
+
i0.ɵɵelementStart(0, "div", 22);
|
|
141
|
+
i0.ɵɵelement(1, "i", 49);
|
|
142
142
|
i0.ɵɵelementStart(2, "span");
|
|
143
143
|
i0.ɵɵtext(3);
|
|
144
144
|
i0.ɵɵelementEnd()();
|
|
@@ -319,66 +319,69 @@ let ClassRegistryInspectorComponent = class ClassRegistryInspectorComponent exte
|
|
|
319
319
|
TrackByBase = (_i, g) => g.baseClassName;
|
|
320
320
|
TrackByReg = (_i, r) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;
|
|
321
321
|
static ɵfac = function ClassRegistryInspectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ClassRegistryInspectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
322
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassRegistryInspectorComponent, selectors: [["mj-class-registry-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
322
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ClassRegistryInspectorComponent, selectors: [["mj-class-registry-inspector"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 43, vars: 17, consts: [[1, "mj-inspector", "mj-inspector--solo"], ["Role", "region", "AriaLabel", "Class registry inspector", "Title", "Class Registry", "Subtitle", "Every class registered with @RegisterClass"], ["actions", ""], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Expand all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-expand"], [1, "mj-action-label"], ["mjButton", "", "variant", "secondary", "size", "sm", "title", "Collapse all groups", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-compress"], [3, "Clicked", "Loading"], ["mjButton", "", "size", "sm", 3, "click", "variant", "title"], ["aria-hidden", "true", 1, "fa-solid"], [1, "cr-stats-row"], [1, "cr-stat"], [1, "cr-stat__value"], [1, "cr-stat__label"], [1, "cr-stat", "cr-stat--inline"], [1, "cr-search-wrap"], [1, "fa-solid", "fa-search", "cr-search-icon"], ["type", "search", "placeholder", "Search base class, subclass, or key\u2026", 1, "cr-search", 3, "input", "value"], ["title", "Clear", 1, "cr-search-clear"], [1, "cr-groups"], [1, "cr-group", 3, "cr-group--expanded"], [1, "cr-empty"], [1, "mj-inspector__footer-meta"], ["title", "Clear", 1, "cr-search-clear", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "cr-group"], ["type", "button", 1, "cr-group-head", 3, "click"], [1, "fa-solid", "fa-chevron-right", "cr-group-chev"], [1, "cr-group-name"], [1, "cr-group-meta"], [1, "cr-pill", "cr-pill--neutral"], [1, "cr-pill", "cr-pill--info"], [1, "cr-pill", "cr-pill--warn"], [1, "cr-table"], [1, "fa-solid", "fa-bolt"], [1, "cr-th-key"], [1, "cr-th-class"], [1, "cr-th-prio"], [1, "cr-th-status"], [3, "cr-row--conflict", "cr-row--winning"], [1, "cr-td-key"], [1, "cr-td-empty"], [1, "cr-td-class"], [1, "cr-td-prio"], [1, "cr-td-status"], ["title", "Highest priority among same-key registrations", 1, "cr-status", "cr-status--win"], ["title", "Outranked by another registration with the same key", 1, "cr-status", "cr-status--shadowed"], [1, "fa-solid", "fa-crown"], [1, "fa-solid", "fa-magnifying-glass"]], template: function ClassRegistryInspectorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
323
323
|
i0.ɵɵelementStart(0, "div", 0)(1, "mj-page-header-interior", 1)(2, "div", 2)(3, "button", 3);
|
|
324
324
|
i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_3_listener() { return ctx.ExpandAll(); });
|
|
325
325
|
i0.ɵɵelement(4, "i", 4);
|
|
326
|
-
i0.ɵɵ
|
|
327
|
-
i0.ɵɵ
|
|
328
|
-
i0.ɵɵ
|
|
329
|
-
i0.ɵɵ
|
|
330
|
-
i0.ɵɵ
|
|
331
|
-
i0.ɵɵ
|
|
332
|
-
i0.ɵɵ
|
|
333
|
-
i0.ɵɵ
|
|
334
|
-
i0.ɵɵ
|
|
326
|
+
i0.ɵɵelementStart(5, "span", 5);
|
|
327
|
+
i0.ɵɵtext(6, "Expand");
|
|
328
|
+
i0.ɵɵelementEnd()();
|
|
329
|
+
i0.ɵɵelementStart(7, "button", 6);
|
|
330
|
+
i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_7_listener() { return ctx.CollapseAll(); });
|
|
331
|
+
i0.ɵɵelement(8, "i", 7);
|
|
332
|
+
i0.ɵɵelementStart(9, "span", 5);
|
|
333
|
+
i0.ɵɵtext(10, "Collapse");
|
|
334
|
+
i0.ɵɵelementEnd()();
|
|
335
|
+
i0.ɵɵelementStart(11, "mj-refresh-button", 8);
|
|
336
|
+
i0.ɵɵlistener("Clicked", function ClassRegistryInspectorComponent_Template_mj_refresh_button_Clicked_11_listener() { return ctx.refresh(); });
|
|
335
337
|
i0.ɵɵelementEnd();
|
|
336
|
-
i0.ɵɵelementStart(
|
|
337
|
-
i0.ɵɵlistener("click", function
|
|
338
|
-
i0.ɵɵelement(
|
|
339
|
-
i0.ɵɵ
|
|
340
|
-
i0.ɵɵ
|
|
341
|
-
i0.ɵɵ
|
|
342
|
-
i0.ɵɵ
|
|
338
|
+
i0.ɵɵelementStart(12, "button", 9);
|
|
339
|
+
i0.ɵɵlistener("click", function ClassRegistryInspectorComponent_Template_button_click_12_listener() { return ctx.OnCopy(); });
|
|
340
|
+
i0.ɵɵelement(13, "i", 10);
|
|
341
|
+
i0.ɵɵelementStart(14, "span", 5);
|
|
342
|
+
i0.ɵɵtext(15);
|
|
343
|
+
i0.ɵɵelementEnd()()()();
|
|
344
|
+
i0.ɵɵelementStart(16, "div", 11)(17, "div", 12)(18, "div", 13);
|
|
345
|
+
i0.ɵɵtext(19);
|
|
343
346
|
i0.ɵɵelementEnd();
|
|
344
|
-
i0.ɵɵelementStart(
|
|
345
|
-
i0.ɵɵtext(
|
|
347
|
+
i0.ɵɵelementStart(20, "div", 14);
|
|
348
|
+
i0.ɵɵtext(21, "Total registrations");
|
|
346
349
|
i0.ɵɵelementEnd()();
|
|
347
|
-
i0.ɵɵelementStart(
|
|
348
|
-
i0.ɵɵtext(
|
|
350
|
+
i0.ɵɵelementStart(22, "div", 12)(23, "div", 13);
|
|
351
|
+
i0.ɵɵtext(24);
|
|
349
352
|
i0.ɵɵelementEnd();
|
|
350
|
-
i0.ɵɵelementStart(
|
|
351
|
-
i0.ɵɵtext(
|
|
353
|
+
i0.ɵɵelementStart(25, "div", 14);
|
|
354
|
+
i0.ɵɵtext(26, "Base classes");
|
|
352
355
|
i0.ɵɵelementEnd()();
|
|
353
|
-
i0.ɵɵelementStart(
|
|
354
|
-
i0.ɵɵtext(
|
|
356
|
+
i0.ɵɵelementStart(27, "div", 12)(28, "div", 13);
|
|
357
|
+
i0.ɵɵtext(29);
|
|
355
358
|
i0.ɵɵelementEnd();
|
|
356
|
-
i0.ɵɵelementStart(
|
|
357
|
-
i0.ɵɵtext(
|
|
359
|
+
i0.ɵɵelementStart(30, "div", 14);
|
|
360
|
+
i0.ɵɵtext(31, "With overrides");
|
|
358
361
|
i0.ɵɵelementEnd()();
|
|
359
|
-
i0.ɵɵelementStart(
|
|
360
|
-
i0.ɵɵelement(
|
|
361
|
-
i0.ɵɵelementStart(
|
|
362
|
-
i0.ɵɵlistener("input", function
|
|
362
|
+
i0.ɵɵelementStart(32, "div", 15)(33, "div", 16);
|
|
363
|
+
i0.ɵɵelement(34, "i", 17);
|
|
364
|
+
i0.ɵɵelementStart(35, "input", 18);
|
|
365
|
+
i0.ɵɵlistener("input", function ClassRegistryInspectorComponent_Template_input_input_35_listener($event) { return ctx.OnSearchChange($event.target.value); });
|
|
363
366
|
i0.ɵɵelementEnd();
|
|
364
|
-
i0.ɵɵconditionalCreate(
|
|
367
|
+
i0.ɵɵconditionalCreate(36, ClassRegistryInspectorComponent_Conditional_36_Template, 2, 0, "button", 19);
|
|
365
368
|
i0.ɵɵelementEnd()()();
|
|
366
|
-
i0.ɵɵelementStart(
|
|
367
|
-
i0.ɵɵrepeaterCreate(
|
|
368
|
-
i0.ɵɵconditionalCreate(
|
|
369
|
+
i0.ɵɵelementStart(37, "div", 20);
|
|
370
|
+
i0.ɵɵrepeaterCreate(38, ClassRegistryInspectorComponent_For_39_Template, 11, 9, "div", 21, ctx.TrackByBase, true);
|
|
371
|
+
i0.ɵɵconditionalCreate(40, ClassRegistryInspectorComponent_Conditional_40_Template, 4, 1, "div", 22);
|
|
369
372
|
i0.ɵɵelementEnd();
|
|
370
|
-
i0.ɵɵelementStart(
|
|
371
|
-
i0.ɵɵtext(
|
|
373
|
+
i0.ɵɵelementStart(41, "div", 23);
|
|
374
|
+
i0.ɵɵtext(42);
|
|
372
375
|
i0.ɵɵelementEnd()();
|
|
373
376
|
} if (rf & 2) {
|
|
374
|
-
i0.ɵɵadvance(
|
|
377
|
+
i0.ɵɵadvance(11);
|
|
375
378
|
i0.ɵɵproperty("Loading", false);
|
|
376
379
|
i0.ɵɵadvance();
|
|
377
380
|
i0.ɵɵproperty("variant", ctx.CopyConfirmed ? "success" : "secondary")("title", ctx.CopyConfirmed ? "Copied" : "Copy as JSON");
|
|
378
381
|
i0.ɵɵadvance();
|
|
379
382
|
i0.ɵɵclassProp("fa-clipboard", !ctx.CopyConfirmed)("fa-check", ctx.CopyConfirmed);
|
|
380
|
-
i0.ɵɵadvance();
|
|
381
|
-
i0.ɵɵ
|
|
383
|
+
i0.ɵɵadvance(2);
|
|
384
|
+
i0.ɵɵtextInterpolate(ctx.CopyConfirmed ? "Copied" : "Copy");
|
|
382
385
|
i0.ɵɵadvance(4);
|
|
383
386
|
i0.ɵɵtextInterpolate(ctx.Stats.total);
|
|
384
387
|
i0.ɵɵadvance(5);
|
|
@@ -390,11 +393,11 @@ let ClassRegistryInspectorComponent = class ClassRegistryInspectorComponent exte
|
|
|
390
393
|
i0.ɵɵadvance(6);
|
|
391
394
|
i0.ɵɵproperty("value", ctx.SearchQuery);
|
|
392
395
|
i0.ɵɵadvance();
|
|
393
|
-
i0.ɵɵconditional(ctx.SearchQuery ?
|
|
396
|
+
i0.ɵɵconditional(ctx.SearchQuery ? 36 : -1);
|
|
394
397
|
i0.ɵɵadvance(2);
|
|
395
398
|
i0.ɵɵrepeater(ctx.FilteredGroups);
|
|
396
399
|
i0.ɵɵadvance(2);
|
|
397
|
-
i0.ɵɵconditional(ctx.FilteredGroups.length === 0 ?
|
|
400
|
+
i0.ɵɵconditional(ctx.FilteredGroups.length === 0 ? 40 : -1);
|
|
398
401
|
i0.ɵɵadvance(2);
|
|
399
402
|
i0.ɵɵtextInterpolate1("Refreshed ", ctx.LastRefreshedLabel);
|
|
400
403
|
} }, dependencies: [i1.MJButtonDirective, i1.MJPageHeaderInteriorComponent, i1.MJRefreshButtonComponent], styles: ["[_nghost-%COMP%] { display: block; height: 100%; }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.mj-inspector[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n\n\n.mj-inspector__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head[_ngcontent-%COMP%] {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor[_ngcontent-%COMP%] mj-code-editor[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n\n\n.mj-inspector__empty[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}", "\n\n\n.mj-inspector--solo[_ngcontent-%COMP%] {\n background: var(--mj-bg-page);\n}\n\n\n\n.cr-stats-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(3, max-content) 1fr;\n gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n align-items: center;\n}\n.cr-stat[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 16px;\n min-width: 120px;\n transition: border-color 0.15s;\n}\n.cr-stat--warn[_ngcontent-%COMP%] {\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n background: color-mix(in srgb, var(--mj-status-warning) 4%, var(--mj-bg-surface-card));\n}\n.cr-stat--inline[_ngcontent-%COMP%] {\n background: transparent;\n border: none;\n padding: 0;\n min-width: 0;\n}\n.cr-stat__value[_ngcontent-%COMP%] {\n font-size: 22px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.5px;\n color: var(--mj-text-primary);\n}\n.cr-stat--warn[_ngcontent-%COMP%] .cr-stat__value[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n.cr-stat__label[_ngcontent-%COMP%] {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n\n\n.cr-search-wrap[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n max-width: 420px;\n margin-left: auto;\n}\n.cr-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.cr-search[_ngcontent-%COMP%] {\n width: 100%;\n padding: 9px 32px 9px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.cr-search[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.cr-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.cr-search-clear[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n\n\n.cr-groups[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 12px 20px;\n}\n.cr-group[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s;\n}\n.cr-group--expanded[_ngcontent-%COMP%] {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n.cr-group-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n width: 100%;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n transition: background 0.12s;\n}\n.cr-group-head[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n.cr-group-chev[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: transform 0.2s;\n width: 12px;\n}\n.cr-group-chev--down[_ngcontent-%COMP%] { transform: rotate(90deg); }\n.cr-group-name[_ngcontent-%COMP%] {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n letter-spacing: -0.2px;\n}\n.cr-group-meta[_ngcontent-%COMP%] { display: inline-flex; gap: 6px; }\n\n.cr-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n line-height: 1.4;\n}\n.cr-pill--neutral[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.cr-pill--info[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.cr-pill--warn[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 16%, transparent);\n color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary));\n}\n\n\n\n.cr-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-subtle);\n}\n.cr-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n}\n.cr-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n text-align: left;\n padding: 8px 14px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.cr-th-prio[_ngcontent-%COMP%] { text-align: right; width: 90px; }\n.cr-th-status[_ngcontent-%COMP%] { width: 110px; }\n.cr-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 7px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.cr-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:first-child td[_ngcontent-%COMP%] { border-top: none; }\n.cr-td-key[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.cr-td-empty[_ngcontent-%COMP%] { color: var(--mj-text-muted); font-style: italic; font-size: 11.5px; }\n.cr-td-class[_ngcontent-%COMP%] {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n}\n.cr-td-prio[_ngcontent-%COMP%] {\n text-align: right;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n.cr-td-status[_ngcontent-%COMP%] { text-align: left; }\n\n.cr-row--conflict[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-warning) 5%, transparent); }\n.cr-row--winning[_ngcontent-%COMP%] { background: color-mix(in srgb, var(--mj-status-success) 5%, transparent); }\n\n.cr-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n}\n.cr-status--win[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary));\n}\n.cr-status--shadowed[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n}\n\n.cr-empty[_ngcontent-%COMP%] {\n padding: 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.mj-inspector__footer-meta[_ngcontent-%COMP%] {\n padding: 8px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: right;\n flex-shrink: 0;\n}\n\n@media (max-width: 700px) {\n .cr-stats-row[_ngcontent-%COMP%] { grid-template-columns: repeat(2, 1fr); }\n .cr-stat--inline[_ngcontent-%COMP%] { grid-column: 1 / -1; }\n .cr-search-wrap[_ngcontent-%COMP%] { max-width: 100%; }\n .cr-groups[_ngcontent-%COMP%] { padding: 10px 14px; }\n .cr-th-status[_ngcontent-%COMP%] { display: none; }\n .cr-td-status[_ngcontent-%COMP%] { display: none; }\n}"] });
|
|
@@ -405,7 +408,7 @@ ClassRegistryInspectorComponent = __decorate([
|
|
|
405
408
|
export { ClassRegistryInspectorComponent };
|
|
406
409
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ClassRegistryInspectorComponent, [{
|
|
407
410
|
type: Component,
|
|
408
|
-
args: [{ standalone: false, selector: 'mj-class-registry-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> Expand\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> Collapse\n </button>\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 as JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key\u2026\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n/*\n Inspector shell \u2014 each Dev Tools sub-page wraps its body in .mj-inspector. The\n chrome (title icon, title, subtitle, action buttons) was previously rendered\n via .mj-inspector__header*, but that's been replaced by <mj-page-header-interior>\n in every inspector template. Action buttons now use the mjButton directive\n (variant=\"secondary\" / \"success\") so they inherit global button styling. App\n State + Layout inspectors used to carry an inner left rail (.mj-inspector__body\n + __sidebar + __nav-item) for L2 sections; that rail was retired 2026-05-19 in\n favor of <mj-tab-nav> projected into the chrome's [toolbar] slot, matching\n SystemDiagnostics and the API Keys tab strip. All inspectors are now \"solo\"\n mode (no sidebar).\n*/\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n", "/* Class Registry Browser \u2014 overlays + extends inspector-shared.css */\n\n.mj-inspector--solo {\n background: var(--mj-bg-page);\n}\n\n/* Stats row */\n.cr-stats-row {\n display: grid;\n grid-template-columns: repeat(3, max-content) 1fr;\n gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n align-items: center;\n}\n.cr-stat {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 16px;\n min-width: 120px;\n transition: border-color 0.15s;\n}\n.cr-stat--warn {\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n background: color-mix(in srgb, var(--mj-status-warning) 4%, var(--mj-bg-surface-card));\n}\n.cr-stat--inline {\n background: transparent;\n border: none;\n padding: 0;\n min-width: 0;\n}\n.cr-stat__value {\n font-size: 22px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.5px;\n color: var(--mj-text-primary);\n}\n.cr-stat--warn .cr-stat__value { color: var(--mj-status-warning); }\n.cr-stat__label {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n/* Search */\n.cr-search-wrap {\n position: relative;\n width: 100%;\n max-width: 420px;\n margin-left: auto;\n}\n.cr-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.cr-search {\n width: 100%;\n padding: 9px 32px 9px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.cr-search:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.cr-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.cr-search-clear:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n/* Groups */\n.cr-groups {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 12px 20px;\n}\n.cr-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s;\n}\n.cr-group--expanded {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n.cr-group-head {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n width: 100%;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n transition: background 0.12s;\n}\n.cr-group-head:hover { background: var(--mj-bg-surface-hover); }\n.cr-group-chev {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: transform 0.2s;\n width: 12px;\n}\n.cr-group-chev--down { transform: rotate(90deg); }\n.cr-group-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n letter-spacing: -0.2px;\n}\n.cr-group-meta { display: inline-flex; gap: 6px; }\n\n.cr-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n line-height: 1.4;\n}\n.cr-pill--neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.cr-pill--info {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.cr-pill--warn {\n background: color-mix(in srgb, var(--mj-status-warning) 16%, transparent);\n color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary));\n}\n\n/* Table */\n.cr-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-subtle);\n}\n.cr-table thead {\n background: var(--mj-bg-surface-sunken);\n}\n.cr-table th {\n text-align: left;\n padding: 8px 14px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.cr-th-prio { text-align: right; width: 90px; }\n.cr-th-status { width: 110px; }\n.cr-table td {\n padding: 7px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.cr-table tbody tr:first-child td { border-top: none; }\n.cr-td-key code {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.cr-td-empty { color: var(--mj-text-muted); font-style: italic; font-size: 11.5px; }\n.cr-td-class {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n}\n.cr-td-prio {\n text-align: right;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n.cr-td-status { text-align: left; }\n\n.cr-row--conflict { background: color-mix(in srgb, var(--mj-status-warning) 5%, transparent); }\n.cr-row--winning { background: color-mix(in srgb, var(--mj-status-success) 5%, transparent); }\n\n.cr-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n}\n.cr-status--win {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary));\n}\n.cr-status--shadowed {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n}\n\n.cr-empty {\n padding: 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.mj-inspector__footer-meta {\n padding: 8px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: right;\n flex-shrink: 0;\n}\n\n@media (max-width: 700px) {\n .cr-stats-row { grid-template-columns: repeat(2, 1fr); }\n .cr-stat--inline { grid-column: 1 / -1; }\n .cr-search-wrap { max-width: 100%; }\n .cr-groups { padding: 10px 14px; }\n .cr-th-status { display: none; }\n .cr-td-status { display: none; }\n}\n"] }]
|
|
411
|
+
args: [{ standalone: false, selector: 'mj-class-registry-inspector', template: "<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Expand</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Collapse</span>\n </button>\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 as 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 </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key\u2026\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n", styles: [":host { display: block; height: 100%; }\n\n/*\n Inspector shell \u2014 each Dev Tools sub-page wraps its body in .mj-inspector. The\n chrome (title icon, title, subtitle, action buttons) was previously rendered\n via .mj-inspector__header*, but that's been replaced by <mj-page-header-interior>\n in every inspector template. Action buttons now use the mjButton directive\n (variant=\"secondary\" / \"success\") so they inherit global button styling. App\n State + Layout inspectors used to carry an inner left rail (.mj-inspector__body\n + __sidebar + __nav-item) for L2 sections; that rail was retired 2026-05-19 in\n favor of <mj-tab-nav> projected into the chrome's [toolbar] slot, matching\n SystemDiagnostics and the API Keys tab strip. All inspectors are now \"solo\"\n mode (no sidebar).\n*/\n.mj-inspector {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-page);\n color: var(--mj-text-primary);\n font-family: inherit;\n}\n\n/* Content area */\n.mj-inspector__content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-page);\n}\n.mj-inspector__content-head {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n display: flex;\n align-items: center;\n justify-content: space-between;\n background: var(--mj-bg-surface-card);\n}\n.mj-inspector__content-title {\n margin: 0;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n.mj-inspector__content-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.mj-inspector__editor {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n.mj-inspector__editor mj-code-editor {\n flex: 1;\n min-height: 0;\n display: block;\n}\n\n/* Empty state */\n.mj-inspector__empty {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n", "/* Class Registry Browser \u2014 overlays + extends inspector-shared.css */\n\n.mj-inspector--solo {\n background: var(--mj-bg-page);\n}\n\n/* Stats row */\n.cr-stats-row {\n display: grid;\n grid-template-columns: repeat(3, max-content) 1fr;\n gap: 12px;\n padding: 14px 20px;\n border-bottom: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n align-items: center;\n}\n.cr-stat {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 10px 16px;\n min-width: 120px;\n transition: border-color 0.15s;\n}\n.cr-stat--warn {\n border-color: color-mix(in srgb, var(--mj-status-warning) 30%, var(--mj-border-subtle));\n background: color-mix(in srgb, var(--mj-status-warning) 4%, var(--mj-bg-surface-card));\n}\n.cr-stat--inline {\n background: transparent;\n border: none;\n padding: 0;\n min-width: 0;\n}\n.cr-stat__value {\n font-size: 22px;\n font-weight: 700;\n line-height: 1;\n letter-spacing: -0.5px;\n color: var(--mj-text-primary);\n}\n.cr-stat--warn .cr-stat__value { color: var(--mj-status-warning); }\n.cr-stat__label {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n font-weight: 600;\n letter-spacing: 0.5px;\n margin-top: 4px;\n}\n\n/* Search */\n.cr-search-wrap {\n position: relative;\n width: 100%;\n max-width: 420px;\n margin-left: auto;\n}\n.cr-search-icon {\n position: absolute;\n left: 12px;\n top: 50%;\n transform: translateY(-50%);\n color: var(--mj-text-muted);\n font-size: 12px;\n pointer-events: none;\n}\n.cr-search {\n width: 100%;\n padding: 9px 32px 9px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n font-size: 13px;\n font-family: inherit;\n transition: border-color 0.15s, box-shadow 0.15s;\n}\n.cr-search:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n.cr-search-clear {\n position: absolute;\n right: 8px;\n top: 50%;\n transform: translateY(-50%);\n background: transparent;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 11px;\n}\n.cr-search-clear:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-primary); }\n\n/* Groups */\n.cr-groups {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 12px 20px;\n}\n.cr-group {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n margin-bottom: 8px;\n overflow: hidden;\n transition: box-shadow 0.15s;\n}\n.cr-group--expanded {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n}\n.cr-group-head {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n width: 100%;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n font-family: inherit;\n transition: background 0.12s;\n}\n.cr-group-head:hover { background: var(--mj-bg-surface-hover); }\n.cr-group-chev {\n color: var(--mj-text-muted);\n font-size: 11px;\n transition: transform 0.2s;\n width: 12px;\n}\n.cr-group-chev--down { transform: rotate(90deg); }\n.cr-group-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n letter-spacing: -0.2px;\n}\n.cr-group-meta { display: inline-flex; gap: 6px; }\n\n.cr-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n line-height: 1.4;\n}\n.cr-pill--neutral {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n.cr-pill--info {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n color: var(--mj-brand-primary);\n}\n.cr-pill--warn {\n background: color-mix(in srgb, var(--mj-status-warning) 16%, transparent);\n color: color-mix(in srgb, var(--mj-status-warning) 70%, var(--mj-text-primary));\n}\n\n/* Table */\n.cr-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--mj-bg-surface-card);\n border-top: 1px solid var(--mj-border-subtle);\n}\n.cr-table thead {\n background: var(--mj-bg-surface-sunken);\n}\n.cr-table th {\n text-align: left;\n padding: 8px 14px;\n font-size: 10px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n border-bottom: 1px solid var(--mj-border-subtle);\n}\n.cr-th-prio { text-align: right; width: 90px; }\n.cr-th-status { width: 110px; }\n.cr-table td {\n padding: 7px 14px;\n border-top: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n vertical-align: middle;\n}\n.cr-table tbody tr:first-child td { border-top: none; }\n.cr-td-key code {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-subtle);\n padding: 2px 7px;\n border-radius: 5px;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-primary);\n}\n.cr-td-empty { color: var(--mj-text-muted); font-style: italic; font-size: 11.5px; }\n.cr-td-class {\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 12px;\n}\n.cr-td-prio {\n text-align: right;\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n color: var(--mj-text-secondary);\n}\n.cr-td-status { text-align: left; }\n\n.cr-row--conflict { background: color-mix(in srgb, var(--mj-status-warning) 5%, transparent); }\n.cr-row--winning { background: color-mix(in srgb, var(--mj-status-success) 5%, transparent); }\n\n.cr-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10.5px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 100px;\n}\n.cr-status--win {\n background: color-mix(in srgb, var(--mj-status-success) 14%, transparent);\n color: color-mix(in srgb, var(--mj-status-success) 70%, var(--mj-text-primary));\n}\n.cr-status--shadowed {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n text-decoration: line-through;\n}\n\n.cr-empty {\n padding: 40px;\n text-align: center;\n color: var(--mj-text-muted);\n font-size: 13px;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n}\n\n.mj-inspector__footer-meta {\n padding: 8px 20px;\n border-top: 1px solid var(--mj-border-subtle);\n background: var(--mj-bg-surface);\n font-size: 11px;\n color: var(--mj-text-muted);\n text-align: right;\n flex-shrink: 0;\n}\n\n@media (max-width: 700px) {\n .cr-stats-row { grid-template-columns: repeat(2, 1fr); }\n .cr-stat--inline { grid-column: 1 / -1; }\n .cr-search-wrap { max-width: 100%; }\n .cr-groups { padding: 10px 14px; }\n .cr-th-status { display: none; }\n .cr-td-status { display: none; }\n}\n"] }]
|
|
409
412
|
}], () => [{ type: i0.ChangeDetectorRef }], null); })();
|
|
410
413
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ClassRegistryInspectorComponent, { className: "ClassRegistryInspectorComponent", filePath: "src/DevTools/class-registry.component.ts", lineNumber: 37 }); })();
|
|
411
414
|
//# sourceMappingURL=class-registry.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class-registry.component.js","sourceRoot":"","sources":["../../src/DevTools/class-registry.component.ts","../../src/DevTools/class-registry.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass, MJGlobal } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\n/** Local mirror of MJGlobal's ClassRegistration shape (avoids importing the type). */\ninterface ClassRegistration {\n BaseClass: { name?: string };\n SubClass: { name?: string };\n Key: string | null;\n Priority: number;\n}\n\ninterface RegistrationGroup {\n baseClassName: string;\n count: number;\n registrations: ClassRegistration[];\n expanded: boolean;\n /** Number of distinct keys (some keys can have multiple registrations at different priorities). */\n uniqueKeys: number;\n /** True when at least one key in this group has multiple registrations (priority resolution applies). */\n hasOverrides: boolean;\n}\n\n/**\n * Class Registry Browser — read-only inspector of every `@RegisterClass`\n * registration tracked by `MJGlobal.Instance.ClassFactory`. Groups by base\n * class, surfaces priority/override conflicts, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'ClassRegistryInspector')\n@Component({\n standalone: false,\n selector: 'mj-class-registry-inspector',\n templateUrl: './class-registry.component.html',\n styleUrls: ['./inspector-shared.css', './class-registry.component.css']\n})\nexport class ClassRegistryInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Groups: RegistrationGroup[] = [];\n public Stats = { total: 0, baseClasses: 0, withOverrides: 0 };\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ search?: string; expanded?: string[] }>('classRegistry');\n if (prefs?.search) this.SearchQuery = prefs.search;\n this.refresh();\n // Restore expansion after groups are built\n if (prefs?.expanded) {\n for (const g of this.Groups) {\n g.expanded = prefs.expanded.includes(g.baseClassName);\n }\n }\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n this.savePrefs();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('classRegistry', {\n search: this.SearchQuery,\n expanded: this.Groups.filter(g => g.expanded).map(g => g.baseClassName)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Class Registry'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-cubes'; }\n\n public refresh(): void {\n const factory = MJGlobal.Instance.ClassFactory as unknown as { _registrations: ClassRegistration[] };\n const all = factory._registrations ?? [];\n\n // Group by base class name\n const byBase = new Map<string, ClassRegistration[]>();\n for (const reg of all) {\n const baseName = reg.BaseClass?.name ?? '(unknown)';\n const arr = byBase.get(baseName) ?? [];\n arr.push(reg);\n byBase.set(baseName, arr);\n }\n\n // Build groups\n const groups: RegistrationGroup[] = [];\n for (const [baseClassName, registrations] of byBase) {\n const keyCounts = new Map<string, number>();\n for (const r of registrations) {\n const k = r.Key ?? '';\n keyCounts.set(k, (keyCounts.get(k) ?? 0) + 1);\n }\n let hasOverrides = false;\n for (const c of keyCounts.values()) {\n if (c > 1) { hasOverrides = true; break; }\n }\n groups.push({\n baseClassName,\n count: registrations.length,\n registrations: registrations.sort((a, b) => {\n const ak = a.Key ?? '';\n const bk = b.Key ?? '';\n if (ak !== bk) return ak.localeCompare(bk);\n return b.Priority - a.Priority;\n }),\n expanded: false,\n uniqueKeys: keyCounts.size,\n hasOverrides\n });\n }\n\n this.Groups = groups.sort((a, b) => b.count - a.count);\n\n this.Stats = {\n total: all.length,\n baseClasses: byBase.size,\n withOverrides: groups.filter(g => g.hasOverrides).length\n };\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public ToggleGroup(group: RegistrationGroup): void {\n group.expanded = !group.expanded;\n this.savePrefs();\n }\n\n public ExpandAll(): void {\n for (const g of this.FilteredGroups) g.expanded = true;\n this.savePrefs();\n }\n\n public CollapseAll(): void {\n for (const g of this.Groups) g.expanded = false;\n this.savePrefs();\n }\n\n public OnSearchChange(value: string): void {\n this.SearchQuery = value;\n this.savePrefs();\n }\n\n public get FilteredGroups(): RegistrationGroup[] {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return this.Groups;\n return this.Groups\n .map(g => ({\n ...g,\n expanded: true,\n registrations: g.registrations.filter(r => {\n const sub = r.SubClass?.name?.toLowerCase() ?? '';\n const key = r.Key?.toLowerCase() ?? '';\n return g.baseClassName.toLowerCase().includes(q) || sub.includes(q) || key.includes(q);\n })\n }))\n .filter(g => g.registrations.length > 0);\n }\n\n public IsConflictRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n if (!group.hasOverrides) return false;\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n return sameKey.length > 1;\n }\n\n public IsWinningRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n if (sameKey.length === 1) return false;\n const max = Math.max(...sameKey.map(r => r.Priority));\n // If multiple share max priority, the LAST registered wins (matches ClassFactory behavior).\n const top = sameKey.filter(r => r.Priority === max);\n return top[top.length - 1] === reg;\n }\n\n public async OnCopy(): Promise<void> {\n const payload = {\n stats: this.Stats,\n groups: this.FilteredGroups.map(g => ({\n baseClass: g.baseClassName,\n count: g.count,\n registrations: g.registrations.map(r => ({\n key: r.Key,\n subClass: r.SubClass?.name ?? '(anonymous)',\n priority: r.Priority\n }))\n }))\n };\n try {\n await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => { this.CopyConfirmed = false; this.cdr.markForCheck(); }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByBase = (_i: number, g: RegistrationGroup) => g.baseClassName;\n public TrackByReg = (_i: number, r: ClassRegistration) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> Expand\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> Collapse\n </button>\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 as JSON'\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\" aria-hidden=\"true\"></i>\n {{ CopyConfirmed ? 'Copied' : 'Copy' }}\n </button>\n </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key…\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"class-registry.component.js","sourceRoot":"","sources":["../../src/DevTools/class-registry.component.ts","../../src/DevTools/class-registry.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { RegisterClass, MJGlobal } from '@memberjunction/global';\nimport { DevToolsPrefs } from './dev-tools-prefs';\n\n/** Local mirror of MJGlobal's ClassRegistration shape (avoids importing the type). */\ninterface ClassRegistration {\n BaseClass: { name?: string };\n SubClass: { name?: string };\n Key: string | null;\n Priority: number;\n}\n\ninterface RegistrationGroup {\n baseClassName: string;\n count: number;\n registrations: ClassRegistration[];\n expanded: boolean;\n /** Number of distinct keys (some keys can have multiple registrations at different priorities). */\n uniqueKeys: number;\n /** True when at least one key in this group has multiple registrations (priority resolution applies). */\n hasOverrides: boolean;\n}\n\n/**\n * Class Registry Browser — read-only inspector of every `@RegisterClass`\n * registration tracked by `MJGlobal.Instance.ClassFactory`. Groups by base\n * class, surfaces priority/override conflicts, supports search + copy.\n */\n@RegisterClass(BaseResourceComponent, 'ClassRegistryInspector')\n@Component({\n standalone: false,\n selector: 'mj-class-registry-inspector',\n templateUrl: './class-registry.component.html',\n styleUrls: ['./inspector-shared.css', './class-registry.component.css']\n})\nexport class ClassRegistryInspectorComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n\n public Groups: RegistrationGroup[] = [];\n public Stats = { total: 0, baseClasses: 0, withOverrides: 0 };\n public SearchQuery = '';\n public CopyConfirmed = false;\n public LastRefreshed = new Date();\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n const prefs = DevToolsPrefs.Get<{ search?: string; expanded?: string[] }>('classRegistry');\n if (prefs?.search) this.SearchQuery = prefs.search;\n this.refresh();\n // Restore expansion after groups are built\n if (prefs?.expanded) {\n for (const g of this.Groups) {\n g.expanded = prefs.expanded.includes(g.baseClassName);\n }\n }\n this.NotifyLoadComplete();\n }\n\n public override ngOnDestroy(): void {\n this.savePrefs();\n super.ngOnDestroy();\n }\n\n public PersistPrefs(): void {\n this.savePrefs();\n }\n\n private savePrefs(): void {\n DevToolsPrefs.Save('classRegistry', {\n search: this.SearchQuery,\n expanded: this.Groups.filter(g => g.expanded).map(g => g.baseClassName)\n });\n }\n\n public override async GetResourceDisplayName(): Promise<string> { return 'Class Registry'; }\n public override async GetResourceIconClass(): Promise<string> { return 'fa-solid fa-cubes'; }\n\n public refresh(): void {\n const factory = MJGlobal.Instance.ClassFactory as unknown as { _registrations: ClassRegistration[] };\n const all = factory._registrations ?? [];\n\n // Group by base class name\n const byBase = new Map<string, ClassRegistration[]>();\n for (const reg of all) {\n const baseName = reg.BaseClass?.name ?? '(unknown)';\n const arr = byBase.get(baseName) ?? [];\n arr.push(reg);\n byBase.set(baseName, arr);\n }\n\n // Build groups\n const groups: RegistrationGroup[] = [];\n for (const [baseClassName, registrations] of byBase) {\n const keyCounts = new Map<string, number>();\n for (const r of registrations) {\n const k = r.Key ?? '';\n keyCounts.set(k, (keyCounts.get(k) ?? 0) + 1);\n }\n let hasOverrides = false;\n for (const c of keyCounts.values()) {\n if (c > 1) { hasOverrides = true; break; }\n }\n groups.push({\n baseClassName,\n count: registrations.length,\n registrations: registrations.sort((a, b) => {\n const ak = a.Key ?? '';\n const bk = b.Key ?? '';\n if (ak !== bk) return ak.localeCompare(bk);\n return b.Priority - a.Priority;\n }),\n expanded: false,\n uniqueKeys: keyCounts.size,\n hasOverrides\n });\n }\n\n this.Groups = groups.sort((a, b) => b.count - a.count);\n\n this.Stats = {\n total: all.length,\n baseClasses: byBase.size,\n withOverrides: groups.filter(g => g.hasOverrides).length\n };\n\n this.LastRefreshed = new Date();\n this.cdr.markForCheck();\n }\n\n public ToggleGroup(group: RegistrationGroup): void {\n group.expanded = !group.expanded;\n this.savePrefs();\n }\n\n public ExpandAll(): void {\n for (const g of this.FilteredGroups) g.expanded = true;\n this.savePrefs();\n }\n\n public CollapseAll(): void {\n for (const g of this.Groups) g.expanded = false;\n this.savePrefs();\n }\n\n public OnSearchChange(value: string): void {\n this.SearchQuery = value;\n this.savePrefs();\n }\n\n public get FilteredGroups(): RegistrationGroup[] {\n const q = this.SearchQuery.trim().toLowerCase();\n if (!q) return this.Groups;\n return this.Groups\n .map(g => ({\n ...g,\n expanded: true,\n registrations: g.registrations.filter(r => {\n const sub = r.SubClass?.name?.toLowerCase() ?? '';\n const key = r.Key?.toLowerCase() ?? '';\n return g.baseClassName.toLowerCase().includes(q) || sub.includes(q) || key.includes(q);\n })\n }))\n .filter(g => g.registrations.length > 0);\n }\n\n public IsConflictRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n if (!group.hasOverrides) return false;\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n return sameKey.length > 1;\n }\n\n public IsWinningRow(group: RegistrationGroup, reg: ClassRegistration): boolean {\n const sameKey = group.registrations.filter(r => (r.Key ?? '') === (reg.Key ?? ''));\n if (sameKey.length === 1) return false;\n const max = Math.max(...sameKey.map(r => r.Priority));\n // If multiple share max priority, the LAST registered wins (matches ClassFactory behavior).\n const top = sameKey.filter(r => r.Priority === max);\n return top[top.length - 1] === reg;\n }\n\n public async OnCopy(): Promise<void> {\n const payload = {\n stats: this.Stats,\n groups: this.FilteredGroups.map(g => ({\n baseClass: g.baseClassName,\n count: g.count,\n registrations: g.registrations.map(r => ({\n key: r.Key,\n subClass: r.SubClass?.name ?? '(anonymous)',\n priority: r.Priority\n }))\n }))\n };\n try {\n await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));\n this.CopyConfirmed = true;\n this.cdr.markForCheck();\n setTimeout(() => { this.CopyConfirmed = false; this.cdr.markForCheck(); }, 1800);\n } catch {\n // clipboard unavailable\n }\n }\n\n public get LastRefreshedLabel(): string {\n return this.LastRefreshed.toLocaleTimeString();\n }\n\n public TrackByBase = (_i: number, g: RegistrationGroup) => g.baseClassName;\n public TrackByReg = (_i: number, r: ClassRegistration) => `${r.SubClass?.name ?? ''}|${r.Key ?? ''}|${r.Priority}`;\n}\n","<div class=\"mj-inspector mj-inspector--solo\">\n <mj-page-header-interior\n Role=\"region\"\n AriaLabel=\"Class registry inspector\"\n Title=\"Class Registry\"\n Subtitle=\"Every class registered with @RegisterClass\">\n <div actions>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"ExpandAll()\" title=\"Expand all groups\">\n <i class=\"fa-solid fa-expand\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Expand</span>\n </button>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"CollapseAll()\" title=\"Collapse all groups\">\n <i class=\"fa-solid fa-compress\" aria-hidden=\"true\"></i> <span class=\"mj-action-label\">Collapse</span>\n </button>\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 as 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 </div>\n </mj-page-header-interior>\n\n <div class=\"cr-stats-row\">\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.total }}</div>\n <div class=\"cr-stat__label\">Total registrations</div>\n </div>\n <div class=\"cr-stat\">\n <div class=\"cr-stat__value\">{{ Stats.baseClasses }}</div>\n <div class=\"cr-stat__label\">Base classes</div>\n </div>\n <div class=\"cr-stat\" [class.cr-stat--warn]=\"Stats.withOverrides > 0\">\n <div class=\"cr-stat__value\">{{ Stats.withOverrides }}</div>\n <div class=\"cr-stat__label\">With overrides</div>\n </div>\n <div class=\"cr-stat cr-stat--inline\">\n <div class=\"cr-search-wrap\">\n <i class=\"fa-solid fa-search cr-search-icon\"></i>\n <input type=\"search\"\n class=\"cr-search\"\n placeholder=\"Search base class, subclass, or key…\"\n [value]=\"SearchQuery\"\n (input)=\"OnSearchChange($any($event.target).value)\" />\n @if (SearchQuery) {\n <button class=\"cr-search-clear\" (click)=\"OnSearchChange('')\" title=\"Clear\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n </div>\n </div>\n\n <div class=\"cr-groups\">\n @for (group of FilteredGroups; track TrackByBase($index, group)) {\n <div class=\"cr-group\" [class.cr-group--expanded]=\"group.expanded\">\n <button type=\"button\" class=\"cr-group-head\" (click)=\"ToggleGroup(group)\">\n <i class=\"fa-solid fa-chevron-right cr-group-chev\"\n [class.cr-group-chev--down]=\"group.expanded\"></i>\n <span class=\"cr-group-name\">{{ group.baseClassName }}</span>\n <span class=\"cr-group-meta\">\n <span class=\"cr-pill cr-pill--neutral\">{{ group.count }}</span>\n @if (group.uniqueKeys !== group.count) {\n <span class=\"cr-pill cr-pill--info\">{{ group.uniqueKeys }} keys</span>\n }\n @if (group.hasOverrides) {\n <span class=\"cr-pill cr-pill--warn\">\n <i class=\"fa-solid fa-bolt\"></i> overrides\n </span>\n }\n </span>\n </button>\n @if (group.expanded) {\n <table class=\"cr-table\">\n <thead>\n <tr>\n <th class=\"cr-th-key\">Key</th>\n <th class=\"cr-th-class\">Subclass</th>\n <th class=\"cr-th-prio\">Priority</th>\n <th class=\"cr-th-status\"></th>\n </tr>\n </thead>\n <tbody>\n @for (reg of group.registrations; track TrackByReg($index, reg)) {\n <tr [class.cr-row--conflict]=\"IsConflictRow(group, reg)\"\n [class.cr-row--winning]=\"IsWinningRow(group, reg)\">\n <td class=\"cr-td-key\">\n @if (reg.Key) {\n <code>{{ reg.Key }}</code>\n } @else {\n <span class=\"cr-td-empty\">(no key)</span>\n }\n </td>\n <td class=\"cr-td-class\">{{ reg.SubClass.name || '(anonymous)' }}</td>\n <td class=\"cr-td-prio\">{{ reg.Priority }}</td>\n <td class=\"cr-td-status\">\n @if (IsWinningRow(group, reg)) {\n <span class=\"cr-status cr-status--win\" title=\"Highest priority among same-key registrations\">\n <i class=\"fa-solid fa-crown\"></i> winner\n </span>\n } @else if (IsConflictRow(group, reg)) {\n <span class=\"cr-status cr-status--shadowed\" title=\"Outranked by another registration with the same key\">\n shadowed\n </span>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n @if (FilteredGroups.length === 0) {\n <div class=\"cr-empty\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>No registrations match \"{{ SearchQuery }}\"</span>\n </div>\n }\n </div>\n\n <div class=\"mj-inspector__footer-meta\">Refreshed {{ LastRefreshedLabel }}</div>\n</div>\n"]}
|