@memberjunction/ng-dashboards 3.4.0 → 4.1.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 +102 -339
- package/dist/AI/components/agents/agent-configuration.component.d.ts +12 -5
- package/dist/AI/components/agents/agent-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-configuration.component.js +103 -44
- package/dist/AI/components/agents/agent-configuration.component.js.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.d.ts +14 -5
- package/dist/AI/components/agents/agent-editor.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-editor.component.js +149 -211
- package/dist/AI/components/agents/agent-editor.component.js.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/agents/agent-filter-panel.component.js +4 -4
- package/dist/AI/components/agents/agent-filter-panel.component.js.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.d.ts.map +1 -1
- package/dist/AI/components/charts/performance-heatmap.component.js +4 -6
- package/dist/AI/components/charts/performance-heatmap.component.js.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.d.ts.map +1 -1
- package/dist/AI/components/charts/time-series-chart.component.js +6 -7
- package/dist/AI/components/charts/time-series-chart.component.js.map +1 -1
- package/dist/AI/components/execution-monitoring.component.d.ts +0 -4
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +33 -37
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/models/model-management.component.d.ts +3 -6
- package/dist/AI/components/models/model-management.component.d.ts.map +1 -1
- package/dist/AI/components/models/model-management.component.js +34 -27
- package/dist/AI/components/models/model-management.component.js.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +22 -17
- package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-filter-panel.component.js +4 -4
- package/dist/AI/components/prompts/prompt-filter-panel.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.d.ts +3 -6
- package/dist/AI/components/prompts/prompt-management.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js +34 -32
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.d.ts.map +1 -1
- package/dist/AI/components/prompts/prompt-version-control.component.js +33 -28
- package/dist/AI/components/prompts/prompt-version-control.component.js.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-config-filter-panel.component.js +4 -4
- package/dist/AI/components/system/system-config-filter-panel.component.js.map +1 -1
- package/dist/AI/components/system/system-configuration.component.d.ts +0 -4
- package/dist/AI/components/system/system-configuration.component.d.ts.map +1 -1
- package/dist/AI/components/system/system-configuration.component.js +26 -27
- package/dist/AI/components/system/system-configuration.component.js.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/kpi-card.component.js +52 -42
- package/dist/AI/components/widgets/kpi-card.component.js.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.d.ts.map +1 -1
- package/dist/AI/components/widgets/live-execution-widget.component.js +7 -7
- package/dist/AI/components/widgets/live-execution-widget.component.js.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-applications-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-applications-panel.component.js +193 -189
- package/dist/APIKeys/api-applications-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.d.ts +0 -2
- package/dist/APIKeys/api-key-create-dialog.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-create-dialog.component.js +175 -180
- package/dist/APIKeys/api-key-create-dialog.component.js.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-key-edit-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-edit-panel.component.js +231 -225
- package/dist/APIKeys/api-key-edit-panel.component.js.map +1 -1
- package/dist/APIKeys/api-key-list.component.d.ts +0 -2
- package/dist/APIKeys/api-key-list.component.d.ts.map +1 -1
- package/dist/APIKeys/api-key-list.component.js +113 -114
- package/dist/APIKeys/api-key-list.component.js.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.d.ts +0 -2
- package/dist/APIKeys/api-keys-resource.component.d.ts.map +1 -1
- package/dist/APIKeys/api-keys-resource.component.js +294 -302
- package/dist/APIKeys/api-keys-resource.component.js.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-scopes-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-scopes-panel.component.js +151 -155
- package/dist/APIKeys/api-scopes-panel.component.js.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.d.ts +0 -2
- package/dist/APIKeys/api-usage-panel.component.d.ts.map +1 -1
- package/dist/APIKeys/api-usage-panel.component.js +237 -234
- package/dist/APIKeys/api-usage-panel.component.js.map +1 -1
- package/dist/Actions/components/actions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-list-view.component.js +15 -14
- package/dist/Actions/components/actions-list-view.component.js.map +1 -1
- package/dist/Actions/components/actions-overview.component.d.ts +3 -6
- package/dist/Actions/components/actions-overview.component.d.ts.map +1 -1
- package/dist/Actions/components/actions-overview.component.js +17 -19
- package/dist/Actions/components/actions-overview.component.js.map +1 -1
- package/dist/Actions/components/categories-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/categories-list-view.component.js +6 -6
- package/dist/Actions/components/categories-list-view.component.js.map +1 -1
- package/dist/Actions/components/code-management.component.d.ts +0 -4
- package/dist/Actions/components/code-management.component.d.ts.map +1 -1
- package/dist/Actions/components/code-management.component.js +3 -9
- package/dist/Actions/components/code-management.component.js.map +1 -1
- package/dist/Actions/components/entity-integration.component.d.ts +0 -4
- package/dist/Actions/components/entity-integration.component.d.ts.map +1 -1
- package/dist/Actions/components/entity-integration.component.js +3 -9
- package/dist/Actions/components/entity-integration.component.js.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.d.ts +3 -6
- package/dist/Actions/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/Actions/components/execution-monitoring.component.js +13 -16
- package/dist/Actions/components/execution-monitoring.component.js.map +1 -1
- package/dist/Actions/components/executions-list-view.component.d.ts.map +1 -1
- package/dist/Actions/components/executions-list-view.component.js +3 -3
- package/dist/Actions/components/executions-list-view.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-breadcrumb.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-breadcrumb.component.js +6 -6
- package/dist/Actions/components/explorer/action-breadcrumb.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-card.component.js +11 -10
- package/dist/Actions/components/explorer/action-card.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.d.ts +0 -4
- package/dist/Actions/components/explorer/action-explorer.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-explorer.component.js +10 -14
- package/dist/Actions/components/explorer/action-explorer.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-list-item.component.js +8 -8
- package/dist/Actions/components/explorer/action-list-item.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-toolbar.component.js +15 -14
- package/dist/Actions/components/explorer/action-toolbar.component.js.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/action-tree-panel.component.js +11 -10
- package/dist/Actions/components/explorer/action-tree-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/index.d.ts +0 -1
- package/dist/Actions/components/explorer/index.d.ts.map +1 -1
- package/dist/Actions/components/explorer/index.js +0 -4
- package/dist/Actions/components/explorer/index.js.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-action-panel.component.js +10 -10
- package/dist/Actions/components/explorer/new-action-panel.component.js.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.d.ts.map +1 -1
- package/dist/Actions/components/explorer/new-category-panel.component.js +8 -8
- package/dist/Actions/components/explorer/new-category-panel.component.js.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.d.ts +0 -4
- package/dist/Actions/components/scheduled-actions.component.d.ts.map +1 -1
- package/dist/Actions/components/scheduled-actions.component.js +3 -9
- package/dist/Actions/components/scheduled-actions.component.js.map +1 -1
- package/dist/Actions/components/security-permissions.component.d.ts +0 -4
- package/dist/Actions/components/security-permissions.component.d.ts.map +1 -1
- package/dist/Actions/components/security-permissions.component.js +3 -9
- package/dist/Actions/components/security-permissions.component.js.map +1 -1
- package/dist/Actions/index.d.ts +0 -7
- package/dist/Actions/index.d.ts.map +1 -1
- package/dist/Actions/index.js +0 -8
- package/dist/Actions/index.js.map +1 -1
- package/dist/Communication/communication-dashboard.component.d.ts +0 -1
- package/dist/Communication/communication-dashboard.component.d.ts.map +1 -1
- package/dist/Communication/communication-dashboard.component.js +38 -51
- package/dist/Communication/communication-dashboard.component.js.map +1 -1
- package/dist/Communication/communication-logs-resource.component.d.ts +0 -4
- package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-logs-resource.component.js +112 -108
- package/dist/Communication/communication-logs-resource.component.js.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.d.ts +0 -4
- package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-monitor-resource.component.js +210 -201
- package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
- package/dist/Communication/communication-providers-resource.component.d.ts +0 -4
- package/dist/Communication/communication-providers-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-providers-resource.component.js +136 -124
- package/dist/Communication/communication-providers-resource.component.js.map +1 -1
- package/dist/Communication/communication-runs-resource.component.d.ts +0 -4
- package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-runs-resource.component.js +91 -88
- package/dist/Communication/communication-runs-resource.component.js.map +1 -1
- package/dist/Communication/communication-templates-resource.component.d.ts +0 -4
- package/dist/Communication/communication-templates-resource.component.d.ts.map +1 -1
- package/dist/Communication/communication-templates-resource.component.js +139 -122
- package/dist/Communication/communication-templates-resource.component.js.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts +0 -4
- package/dist/ComponentStudio/component-studio-dashboard.component.d.ts.map +1 -1
- package/dist/ComponentStudio/component-studio-dashboard.component.js +21 -20
- package/dist/ComponentStudio/component-studio-dashboard.component.js.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js +11 -12
- package/dist/ComponentStudio/components/ai-assistant/ai-assistant-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +25 -22
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js +16 -16
- package/dist/ComponentStudio/components/artifact-selection-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/browser/component-browser.component.js +23 -21
- package/dist/ComponentStudio/components/browser/component-browser.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js +10 -10
- package/dist/ComponentStudio/components/editors/code-editor-panel.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js +13 -13
- package/dist/ComponentStudio/components/editors/data-requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js +7 -7
- package/dist/ComponentStudio/components/editors/requirements-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/editors/spec-editor.component.js +5 -5
- package/dist/ComponentStudio/components/editors/spec-editor.component.js.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js +4 -4
- package/dist/ComponentStudio/components/new-component-dialog/new-component-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js +9 -9
- package/dist/ComponentStudio/components/save-version-dialog/save-version-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/text-import-dialog.component.js +4 -4
- package/dist/ComponentStudio/components/text-import-dialog.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/component-preview.component.js +10 -9
- package/dist/ComponentStudio/components/workspace/component-preview.component.js.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js +4 -4
- package/dist/ComponentStudio/components/workspace/editor-tabs.component.js.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-audit-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-audit-resource.component.js +200 -196
- package/dist/Credentials/components/credentials-audit-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-categories-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-categories-resource.component.js +195 -190
- package/dist/Credentials/components/credentials-categories-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-list-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-list-resource.component.js +251 -240
- package/dist/Credentials/components/credentials-list-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-overview-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-overview-resource.component.js +228 -226
- package/dist/Credentials/components/credentials-overview-resource.component.js.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts +0 -1
- package/dist/Credentials/components/credentials-types-resource.component.d.ts.map +1 -1
- package/dist/Credentials/components/credentials-types-resource.component.js +214 -210
- package/dist/Credentials/components/credentials-types-resource.component.js.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts +0 -1
- package/dist/Credentials/credentials-dashboard.component.d.ts.map +1 -1
- package/dist/Credentials/credentials-dashboard.component.js +31 -44
- package/dist/Credentials/credentials-dashboard.component.js.map +1 -1
- package/dist/Credentials/pipes/group-by.pipe.d.ts.map +1 -1
- package/dist/Credentials/pipes/group-by.pipe.js +2 -1
- package/dist/Credentials/pipes/group-by.pipe.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts +0 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js +73 -80
- package/dist/DashboardBrowser/dashboard-browser-resource.component.js.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.d.ts.map +1 -1
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js +46 -45
- package/dist/DashboardBrowser/dashboard-share-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +7 -7
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js +15 -15
- package/dist/DataExplorer/components/navigation-panel/navigation-panel.component.js.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-selector/view-selector.component.js +17 -11
- package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +2 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +83 -64
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts +0 -1
- package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-resource.component.js +3 -6
- package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
- package/dist/DataExplorer/index.d.ts +2 -2
- package/dist/DataExplorer/index.d.ts.map +1 -1
- package/dist/DataExplorer/index.js +2 -2
- package/dist/DataExplorer/index.js.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts +0 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.d.ts.map +1 -1
- package/dist/EntityAdmin/entity-admin-dashboard.component.js +6 -7
- package/dist/EntityAdmin/entity-admin-dashboard.component.js.map +1 -1
- package/dist/Home/home-application.d.ts +109 -27
- package/dist/Home/home-application.d.ts.map +1 -1
- package/dist/Home/home-application.js +351 -75
- package/dist/Home/home-application.js.map +1 -1
- package/dist/Home/home-dashboard.component.d.ts +48 -12
- package/dist/Home/home-dashboard.component.d.ts.map +1 -1
- package/dist/Home/home-dashboard.component.js +267 -187
- package/dist/Home/home-dashboard.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +0 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +761 -685
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts +0 -1
- package/dist/Lists/components/lists-categories-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-categories-resource.component.js +340 -316
- package/dist/Lists/components/lists-categories-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts +0 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +530 -482
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts +0 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +508 -455
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.d.ts.map +1 -1
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js +44 -39
- package/dist/Lists/components/venn-diagram/venn-diagram.component.js.map +1 -1
- package/dist/Lists/index.d.ts +0 -1
- package/dist/Lists/index.d.ts.map +1 -1
- package/dist/Lists/index.js +0 -11
- package/dist/Lists/index.js.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts +0 -4
- package/dist/MCP/components/mcp-connection-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-connection-dialog.component.js +33 -39
- package/dist/MCP/components/mcp-connection-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.d.ts +0 -4
- package/dist/MCP/components/mcp-log-detail-panel.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-log-detail-panel.component.js +42 -44
- package/dist/MCP/components/mcp-log-detail-panel.component.js.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.d.ts +3 -4
- package/dist/MCP/components/mcp-server-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-server-dialog.component.js +186 -77
- package/dist/MCP/components/mcp-server-dialog.component.js.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts +0 -4
- package/dist/MCP/components/mcp-test-tool-dialog.component.d.ts.map +1 -1
- package/dist/MCP/components/mcp-test-tool-dialog.component.js +187 -187
- package/dist/MCP/components/mcp-test-tool-dialog.component.js.map +1 -1
- package/dist/MCP/index.d.ts +5 -5
- package/dist/MCP/index.d.ts.map +1 -1
- package/dist/MCP/index.js +5 -5
- package/dist/MCP/index.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +65 -7
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +976 -697
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-filter-panel.component.d.ts +54 -0
- package/dist/MCP/mcp-filter-panel.component.d.ts.map +1 -0
- package/dist/MCP/mcp-filter-panel.component.js +288 -0
- package/dist/MCP/mcp-filter-panel.component.js.map +1 -0
- package/dist/MCP/mcp-resource.component.d.ts +11 -5
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +8 -9
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/MCP/mcp.module.d.ts +16 -19
- package/dist/MCP/mcp.module.d.ts.map +1 -1
- package/dist/MCP/mcp.module.js +17 -26
- package/dist/MCP/mcp.module.js.map +1 -1
- package/dist/MCP/services/mcp-tools.service.d.ts +10 -4
- package/dist/MCP/services/mcp-tools.service.d.ts.map +1 -1
- package/dist/MCP/services/mcp-tools.service.js +5 -6
- package/dist/MCP/services/mcp-tools.service.js.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts +0 -1
- package/dist/QueryBrowser/query-browser-resource.component.d.ts.map +1 -1
- package/dist/QueryBrowser/query-browser-resource.component.js +79 -88
- package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
- package/dist/Scheduling/components/job-slideout.component.d.ts.map +1 -1
- package/dist/Scheduling/components/job-slideout.component.js +117 -116
- package/dist/Scheduling/components/job-slideout.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts +0 -4
- package/dist/Scheduling/components/scheduling-activity-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-activity-resource.component.js +3 -9
- package/dist/Scheduling/components/scheduling-activity-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 +134 -134
- package/dist/Scheduling/components/scheduling-activity.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts +0 -4
- package/dist/Scheduling/components/scheduling-jobs-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js +3 -9
- package/dist/Scheduling/components/scheduling-jobs-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-jobs.component.js +102 -97
- package/dist/Scheduling/components/scheduling-jobs.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts +0 -4
- package/dist/Scheduling/components/scheduling-overview-resource.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview-resource.component.js +3 -9
- package/dist/Scheduling/components/scheduling-overview-resource.component.js.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.d.ts.map +1 -1
- package/dist/Scheduling/components/scheduling-overview.component.js +127 -122
- package/dist/Scheduling/components/scheduling-overview.component.js.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts +0 -1
- package/dist/Scheduling/scheduling-dashboard.component.d.ts.map +1 -1
- package/dist/Scheduling/scheduling-dashboard.component.js +35 -43
- package/dist/Scheduling/scheduling-dashboard.component.js.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts +0 -4
- package/dist/SystemDiagnostics/system-diagnostics.component.d.ts.map +1 -1
- package/dist/SystemDiagnostics/system-diagnostics.component.js +1552 -1534
- package/dist/SystemDiagnostics/system-diagnostics.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics-resource.component.js +3 -3
- package/dist/Testing/components/testing-analytics-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-analytics.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-analytics.component.js +30 -30
- package/dist/Testing/components/testing-analytics.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js +3 -3
- package/dist/Testing/components/testing-dashboard-tab-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-dashboard-tab.component.js +7 -7
- package/dist/Testing/components/testing-dashboard-tab.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer-resource.component.js +3 -3
- package/dist/Testing/components/testing-explorer-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-explorer.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-explorer.component.js +42 -35
- package/dist/Testing/components/testing-explorer.component.js.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review-resource.component.js +3 -3
- package/dist/Testing/components/testing-review-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-review.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-review.component.js +16 -16
- package/dist/Testing/components/testing-review.component.js.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs-resource.component.js +3 -3
- package/dist/Testing/components/testing-runs-resource.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +15 -15
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.d.ts.map +1 -1
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js +73 -61
- package/dist/Testing/components/widgets/oracle-breakdown-table.component.js.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.d.ts.map +1 -1
- package/dist/Testing/components/widgets/suite-tree.component.js +34 -31
- package/dist/Testing/components/widgets/suite-tree.component.js.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.d.ts.map +1 -1
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js +180 -171
- package/dist/Testing/components/widgets/test-run-detail-panel.component.js.map +1 -1
- package/dist/Testing/testing-dashboard.component.d.ts +0 -1
- package/dist/Testing/testing-dashboard.component.d.ts.map +1 -1
- package/dist/Testing/testing-dashboard.component.js +9 -8
- package/dist/Testing/testing-dashboard.component.js.map +1 -1
- package/dist/VersionHistory/components/diff-resource.component.d.ts +119 -0
- package/dist/VersionHistory/components/diff-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/diff-resource.component.js +1162 -0
- package/dist/VersionHistory/components/diff-resource.component.js.map +1 -0
- package/dist/VersionHistory/components/graph-resource.component.d.ts +67 -0
- package/dist/VersionHistory/components/graph-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/graph-resource.component.js +521 -0
- package/dist/VersionHistory/components/graph-resource.component.js.map +1 -0
- package/dist/VersionHistory/components/index.d.ts +5 -0
- package/dist/VersionHistory/components/index.d.ts.map +1 -0
- package/dist/VersionHistory/components/index.js +5 -0
- package/dist/VersionHistory/components/index.js.map +1 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts +89 -0
- package/dist/VersionHistory/components/labels-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/labels-resource.component.js +968 -0
- package/dist/VersionHistory/components/labels-resource.component.js.map +1 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts +40 -0
- package/dist/VersionHistory/components/restore-resource.component.d.ts.map +1 -0
- package/dist/VersionHistory/components/restore-resource.component.js +472 -0
- package/dist/VersionHistory/components/restore-resource.component.js.map +1 -0
- package/dist/VersionHistory/index.d.ts +2 -0
- package/dist/VersionHistory/index.d.ts.map +1 -0
- package/dist/VersionHistory/index.js +2 -0
- package/dist/VersionHistory/index.js.map +1 -0
- package/dist/module.d.ts +42 -36
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +41 -7
- package/dist/module.js.map +1 -1
- package/dist/public-api.d.ts +20 -19
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +22 -120
- package/dist/public-api.js.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.d.ts.map +1 -1
- package/dist/shared/pipes/highlight-search.pipe.js +2 -1
- package/dist/shared/pipes/highlight-search.pipe.js.map +1 -1
- package/package.json +64 -62
|
@@ -18,7 +18,7 @@ import { Component } from '@angular/core';
|
|
|
18
18
|
import { NavigationEnd } from '@angular/router';
|
|
19
19
|
import { Subject, BehaviorSubject } from 'rxjs';
|
|
20
20
|
import { takeUntil, debounceTime, distinctUntilChanged, filter } from 'rxjs/operators';
|
|
21
|
-
import { RunView, Metadata
|
|
21
|
+
import { RunView, Metadata } from '@memberjunction/core';
|
|
22
22
|
import { BaseDashboard } from '@memberjunction/ng-shared';
|
|
23
23
|
import { MCPEngine, UserInfoEngine } from '@memberjunction/core-entities';
|
|
24
24
|
import { RegisterClass } from '@memberjunction/global';
|
|
@@ -28,200 +28,107 @@ import * as i2 from "@memberjunction/ng-shared";
|
|
|
28
28
|
import * as i3 from "./services/mcp-tools.service";
|
|
29
29
|
const _forTrack0 = ($index, $item) => $item.ID;
|
|
30
30
|
const _forTrack1 = ($index, $item) => $item.server.ID;
|
|
31
|
-
function
|
|
32
|
-
i0.ɵɵ
|
|
33
|
-
i0.ɵɵtext(2, "Failed (7d)");
|
|
34
|
-
i0.ɵɵelementEnd();
|
|
35
|
-
i0.ɵɵelementStart(3, "span", 16);
|
|
36
|
-
i0.ɵɵtext(4);
|
|
37
|
-
i0.ɵɵelementEnd()();
|
|
38
|
-
} if (rf & 2) {
|
|
39
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
40
|
-
i0.ɵɵadvance(4);
|
|
41
|
-
i0.ɵɵtextInterpolate(ctx_r0.stats.failedExecutions);
|
|
42
|
-
} }
|
|
43
|
-
function MCPDashboardComponent_Conditional_52_Template(rf, ctx) { if (rf & 1) {
|
|
44
|
-
const _r2 = i0.ɵɵgetCurrentView();
|
|
45
|
-
i0.ɵɵelementStart(0, "div", 22);
|
|
46
|
-
i0.ɵɵelement(1, "i", 36);
|
|
47
|
-
i0.ɵɵtext(2);
|
|
48
|
-
i0.ɵɵelementStart(3, "button", 37);
|
|
49
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_52_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ErrorMessage = null); });
|
|
50
|
-
i0.ɵɵelement(4, "i", 38);
|
|
51
|
-
i0.ɵɵelementEnd()();
|
|
52
|
-
} if (rf & 2) {
|
|
53
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
54
|
-
i0.ɵɵadvance(2);
|
|
55
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r0.ErrorMessage, " ");
|
|
31
|
+
function MCPDashboardComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
32
|
+
i0.ɵɵtext(0, " Hide Filters ");
|
|
56
33
|
} }
|
|
57
|
-
function
|
|
58
|
-
i0.ɵɵtext(0, "
|
|
34
|
+
function MCPDashboardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
35
|
+
i0.ɵɵtext(0, " Show Filters ");
|
|
59
36
|
} }
|
|
60
|
-
function
|
|
61
|
-
i0.ɵɵ
|
|
62
|
-
|
|
63
|
-
function
|
|
64
|
-
i0.ɵɵ
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
i0.ɵɵtext(0, " Execution Logs ");
|
|
37
|
+
function MCPDashboardComponent_Case_38_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
39
|
+
i0.ɵɵelementStart(0, "button", 31);
|
|
40
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_38_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createServer()); });
|
|
41
|
+
i0.ɵɵelement(1, "i", 32);
|
|
42
|
+
i0.ɵɵtext(2, " Add Server ");
|
|
43
|
+
i0.ɵɵelementEnd();
|
|
68
44
|
} }
|
|
69
|
-
function
|
|
45
|
+
function MCPDashboardComponent_Case_39_Template(rf, ctx) { if (rf & 1) {
|
|
70
46
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
71
|
-
i0.ɵɵelementStart(0, "
|
|
72
|
-
i0.ɵɵ
|
|
73
|
-
i0.ɵɵ
|
|
74
|
-
i0.ɵɵ
|
|
75
|
-
i0.ɵɵtext(3, "All Status");
|
|
76
|
-
i0.ɵɵelementEnd();
|
|
77
|
-
i0.ɵɵelementStart(4, "option", 41);
|
|
78
|
-
i0.ɵɵtext(5, "Active");
|
|
79
|
-
i0.ɵɵelementEnd();
|
|
80
|
-
i0.ɵɵelementStart(6, "option", 42);
|
|
81
|
-
i0.ɵɵtext(7, "Inactive");
|
|
82
|
-
i0.ɵɵelementEnd()();
|
|
83
|
-
i0.ɵɵelementStart(8, "button", 43);
|
|
84
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_64_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.createServer()); });
|
|
85
|
-
i0.ɵɵelement(9, "i", 44);
|
|
86
|
-
i0.ɵɵtext(10, " Add Server ");
|
|
47
|
+
i0.ɵɵelementStart(0, "button", 31);
|
|
48
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_39_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.createConnection()); });
|
|
49
|
+
i0.ɵɵelement(1, "i", 32);
|
|
50
|
+
i0.ɵɵtext(2, " Add Connection ");
|
|
87
51
|
i0.ɵɵelementEnd();
|
|
88
|
-
} if (rf & 2) {
|
|
89
|
-
let tmp_1_0;
|
|
90
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
91
|
-
i0.ɵɵproperty("ngModel", (tmp_1_0 = i0.ɵɵpipeBind1(1, 1, ctx_r0.filters$)) == null ? null : tmp_1_0.serverStatus);
|
|
92
52
|
} }
|
|
93
|
-
function
|
|
53
|
+
function MCPDashboardComponent_Case_40_Template(rf, ctx) { if (rf & 1) {
|
|
94
54
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
95
|
-
i0.ɵɵelementStart(0, "
|
|
96
|
-
i0.ɵɵ
|
|
97
|
-
i0.ɵɵ
|
|
98
|
-
i0.ɵɵelementStart(2, "option", 40);
|
|
99
|
-
i0.ɵɵtext(3, "All Status");
|
|
100
|
-
i0.ɵɵelementEnd();
|
|
101
|
-
i0.ɵɵelementStart(4, "option", 41);
|
|
102
|
-
i0.ɵɵtext(5, "Active");
|
|
103
|
-
i0.ɵɵelementEnd();
|
|
104
|
-
i0.ɵɵelementStart(6, "option", 42);
|
|
105
|
-
i0.ɵɵtext(7, "Inactive");
|
|
55
|
+
i0.ɵɵelementStart(0, "div", 33)(1, "button", 34);
|
|
56
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode("card")); });
|
|
57
|
+
i0.ɵɵelement(2, "i", 35);
|
|
106
58
|
i0.ɵɵelementEnd();
|
|
107
|
-
i0.ɵɵelementStart(
|
|
108
|
-
i0.ɵɵ
|
|
59
|
+
i0.ɵɵelementStart(3, "button", 36);
|
|
60
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.setToolsViewMode("list")); });
|
|
61
|
+
i0.ɵɵelement(4, "i", 37);
|
|
109
62
|
i0.ɵɵelementEnd()();
|
|
110
|
-
i0.ɵɵelementStart(
|
|
111
|
-
i0.ɵɵlistener("click", function
|
|
112
|
-
i0.ɵɵelement(
|
|
113
|
-
i0.ɵɵtext(
|
|
63
|
+
i0.ɵɵelementStart(5, "button", 31);
|
|
64
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_40_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.openTestToolDialog()); });
|
|
65
|
+
i0.ɵɵelement(6, "i", 38);
|
|
66
|
+
i0.ɵɵtext(7, " Test Tool ");
|
|
114
67
|
i0.ɵɵelementEnd();
|
|
115
68
|
} if (rf & 2) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
i0.ɵɵ
|
|
69
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
70
|
+
i0.ɵɵadvance();
|
|
71
|
+
i0.ɵɵclassProp("active", ctx_r1.ToolsViewMode === "card");
|
|
72
|
+
i0.ɵɵadvance(2);
|
|
73
|
+
i0.ɵɵclassProp("active", ctx_r1.ToolsViewMode === "list");
|
|
119
74
|
} }
|
|
120
|
-
function
|
|
75
|
+
function MCPDashboardComponent_Case_41_Template(rf, ctx) { if (rf & 1) {
|
|
121
76
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
122
|
-
i0.ɵɵelementStart(0, "
|
|
123
|
-
i0.ɵɵ
|
|
124
|
-
i0.ɵɵ
|
|
125
|
-
i0.ɵɵ
|
|
126
|
-
i0.ɵɵtext(3, "All Status");
|
|
127
|
-
i0.ɵɵelementEnd();
|
|
128
|
-
i0.ɵɵelementStart(4, "option", 41);
|
|
129
|
-
i0.ɵɵtext(5, "Active");
|
|
130
|
-
i0.ɵɵelementEnd();
|
|
131
|
-
i0.ɵɵelementStart(6, "option", 46);
|
|
132
|
-
i0.ɵɵtext(7, "Deprecated");
|
|
133
|
-
i0.ɵɵelementEnd()();
|
|
134
|
-
i0.ɵɵelementStart(8, "div", 47)(9, "button", 48);
|
|
135
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_66_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setToolsViewMode("card")); });
|
|
136
|
-
i0.ɵɵelement(10, "i", 49);
|
|
137
|
-
i0.ɵɵelementEnd();
|
|
138
|
-
i0.ɵɵelementStart(11, "button", 50);
|
|
139
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_66_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setToolsViewMode("list")); });
|
|
140
|
-
i0.ɵɵelement(12, "i", 51);
|
|
141
|
-
i0.ɵɵelementEnd()();
|
|
142
|
-
i0.ɵɵelementStart(13, "select", 39);
|
|
143
|
-
i0.ɵɵtwoWayListener("ngModelChange", function MCPDashboardComponent_Case_66_Template_select_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.ToolsSortBy, $event) || (ctx_r0.ToolsSortBy = $event); return i0.ɵɵresetView($event); });
|
|
144
|
-
i0.ɵɵlistener("ngModelChange", function MCPDashboardComponent_Case_66_Template_select_ngModelChange_13_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.setToolsSort($event)); });
|
|
145
|
-
i0.ɵɵelementStart(14, "option", 52);
|
|
146
|
-
i0.ɵɵtext(15, "Sort by Server");
|
|
147
|
-
i0.ɵɵelementEnd();
|
|
148
|
-
i0.ɵɵelementStart(16, "option", 53);
|
|
149
|
-
i0.ɵɵtext(17, "Sort by Name");
|
|
150
|
-
i0.ɵɵelementEnd();
|
|
151
|
-
i0.ɵɵelementStart(18, "option", 54);
|
|
152
|
-
i0.ɵɵtext(19, "Sort by Discovered");
|
|
153
|
-
i0.ɵɵelementEnd();
|
|
154
|
-
i0.ɵɵelementStart(20, "option", 55);
|
|
155
|
-
i0.ɵɵtext(21, "Sort by Last Seen");
|
|
156
|
-
i0.ɵɵelementEnd()();
|
|
157
|
-
i0.ɵɵelementStart(22, "button", 43);
|
|
158
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_66_Template_button_click_22_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.openTestToolDialog()); });
|
|
159
|
-
i0.ɵɵelement(23, "i", 56);
|
|
160
|
-
i0.ɵɵtext(24, " Test Tool ");
|
|
77
|
+
i0.ɵɵelementStart(0, "button", 39);
|
|
78
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Case_41_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.loadAllData()); });
|
|
79
|
+
i0.ɵɵelement(1, "i", 40);
|
|
80
|
+
i0.ɵɵtext(2, " Refresh ");
|
|
161
81
|
i0.ɵɵelementEnd();
|
|
162
82
|
} if (rf & 2) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
i0.ɵɵ
|
|
166
|
-
i0.ɵɵ
|
|
167
|
-
i0.ɵɵclassProp("active", ctx_r0.ToolsViewMode === "card");
|
|
168
|
-
i0.ɵɵadvance(2);
|
|
169
|
-
i0.ɵɵclassProp("active", ctx_r0.ToolsViewMode === "list");
|
|
170
|
-
i0.ɵɵadvance(2);
|
|
171
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.ToolsSortBy);
|
|
83
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
84
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsLoading);
|
|
85
|
+
i0.ɵɵadvance();
|
|
86
|
+
i0.ɵɵclassProp("fa-spin", ctx_r1.IsLoading);
|
|
172
87
|
} }
|
|
173
|
-
function
|
|
88
|
+
function MCPDashboardComponent_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
174
89
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
175
|
-
i0.ɵɵelementStart(0, "
|
|
176
|
-
i0.ɵɵ
|
|
177
|
-
i0.ɵɵ
|
|
178
|
-
i0.ɵɵelementStart(
|
|
179
|
-
i0.ɵɵ
|
|
180
|
-
i0.ɵɵ
|
|
181
|
-
i0.ɵɵelementStart(4, "option", 57);
|
|
182
|
-
i0.ɵɵtext(5, "Success");
|
|
183
|
-
i0.ɵɵelementEnd();
|
|
184
|
-
i0.ɵɵelementStart(6, "option", 45);
|
|
185
|
-
i0.ɵɵtext(7, "Error");
|
|
186
|
-
i0.ɵɵelementEnd();
|
|
187
|
-
i0.ɵɵelementStart(8, "option", 58);
|
|
188
|
-
i0.ɵɵtext(9, "Running");
|
|
90
|
+
i0.ɵɵelementStart(0, "div", 24);
|
|
91
|
+
i0.ɵɵelement(1, "i", 41);
|
|
92
|
+
i0.ɵɵtext(2);
|
|
93
|
+
i0.ɵɵelementStart(3, "button", 42);
|
|
94
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_47_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.ErrorMessage = null); });
|
|
95
|
+
i0.ɵɵelement(4, "i", 43);
|
|
189
96
|
i0.ɵɵelementEnd()();
|
|
190
97
|
} if (rf & 2) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
i0.ɵɵ
|
|
98
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
99
|
+
i0.ɵɵadvance(2);
|
|
100
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.ErrorMessage, " ");
|
|
194
101
|
} }
|
|
195
|
-
function
|
|
196
|
-
i0.ɵɵelement(0, "mj-loading",
|
|
102
|
+
function MCPDashboardComponent_Conditional_49_Template(rf, ctx) { if (rf & 1) {
|
|
103
|
+
i0.ɵɵelement(0, "mj-loading", 26);
|
|
197
104
|
} }
|
|
198
|
-
function
|
|
105
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
199
106
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
200
|
-
i0.ɵɵelementStart(0, "div",
|
|
201
|
-
i0.ɵɵelement(1, "i",
|
|
107
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
108
|
+
i0.ɵɵelement(1, "i", 11);
|
|
202
109
|
i0.ɵɵelementStart(2, "p");
|
|
203
110
|
i0.ɵɵtext(3, "No MCP servers configured");
|
|
204
111
|
i0.ɵɵelementEnd();
|
|
205
|
-
i0.ɵɵelementStart(4, "button",
|
|
206
|
-
i0.ɵɵlistener("click", function
|
|
112
|
+
i0.ɵɵelementStart(4, "button", 31);
|
|
113
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createServer()); });
|
|
207
114
|
i0.ɵɵtext(5, " Add Your First Server ");
|
|
208
115
|
i0.ɵɵelementEnd()();
|
|
209
116
|
} }
|
|
210
|
-
function
|
|
211
|
-
i0.ɵɵelement(0, "p",
|
|
117
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
118
|
+
i0.ɵɵelement(0, "p", 61);
|
|
212
119
|
i0.ɵɵpipe(1, "async");
|
|
213
120
|
i0.ɵɵpipe(2, "highlightSearch");
|
|
214
121
|
} if (rf & 2) {
|
|
215
122
|
let tmp_14_0;
|
|
216
123
|
const server_r9 = i0.ɵɵnextContext().$implicit;
|
|
217
|
-
const
|
|
218
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, server_r9.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1,
|
|
124
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
125
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, server_r9.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1, ctx_r1.filters$)) == null ? null : tmp_14_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
219
126
|
} }
|
|
220
|
-
function
|
|
221
|
-
i0.ɵɵelementStart(0, "div",
|
|
127
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_38_Template(rf, ctx) { if (rf & 1) {
|
|
128
|
+
i0.ɵɵelementStart(0, "div", 66)(1, "span", 64);
|
|
222
129
|
i0.ɵɵtext(2, "URL");
|
|
223
130
|
i0.ɵɵelementEnd();
|
|
224
|
-
i0.ɵɵelementStart(3, "span",
|
|
131
|
+
i0.ɵɵelementStart(3, "span", 68);
|
|
225
132
|
i0.ɵɵtext(4);
|
|
226
133
|
i0.ɵɵelementEnd()();
|
|
227
134
|
} if (rf & 2) {
|
|
@@ -229,11 +136,11 @@ function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditi
|
|
|
229
136
|
i0.ɵɵadvance(4);
|
|
230
137
|
i0.ɵɵtextInterpolate(server_r9.ServerURL);
|
|
231
138
|
} }
|
|
232
|
-
function
|
|
233
|
-
i0.ɵɵelementStart(0, "div",
|
|
139
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_39_Template(rf, ctx) { if (rf & 1) {
|
|
140
|
+
i0.ɵɵelementStart(0, "div", 66)(1, "span", 64);
|
|
234
141
|
i0.ɵɵtext(2, "Command");
|
|
235
142
|
i0.ɵɵelementEnd();
|
|
236
|
-
i0.ɵɵelementStart(3, "span",
|
|
143
|
+
i0.ɵɵelementStart(3, "span", 69);
|
|
237
144
|
i0.ɵɵtext(4);
|
|
238
145
|
i0.ɵɵelementEnd()();
|
|
239
146
|
} if (rf & 2) {
|
|
@@ -241,128 +148,129 @@ function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Conditi
|
|
|
241
148
|
i0.ɵɵadvance(4);
|
|
242
149
|
i0.ɵɵtextInterpolate(server_r9.Command);
|
|
243
150
|
} }
|
|
244
|
-
function
|
|
245
|
-
i0.ɵɵelementStart(0, "div",
|
|
246
|
-
i0.ɵɵelement(1, "i",
|
|
151
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
152
|
+
i0.ɵɵelementStart(0, "div", 71);
|
|
153
|
+
i0.ɵɵelement(1, "i", 73);
|
|
247
154
|
i0.ɵɵtext(2, " No tools discovered yet. Sync a connection to discover tools. ");
|
|
248
155
|
i0.ɵɵelementEnd();
|
|
249
156
|
} }
|
|
250
|
-
function
|
|
157
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
251
158
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
252
|
-
i0.ɵɵelementStart(0, "div",
|
|
159
|
+
i0.ɵɵelementStart(0, "div", 74)(1, "div", 75)(2, "span", 76);
|
|
253
160
|
i0.ɵɵtext(3);
|
|
254
161
|
i0.ɵɵelementEnd();
|
|
255
|
-
i0.ɵɵelementStart(4, "span",
|
|
256
|
-
i0.ɵɵelement(5, "i",
|
|
162
|
+
i0.ɵɵelementStart(4, "span", 77);
|
|
163
|
+
i0.ɵɵelement(5, "i", 78);
|
|
257
164
|
i0.ɵɵtext(6);
|
|
258
165
|
i0.ɵɵelementEnd()();
|
|
259
|
-
i0.ɵɵelementStart(7, "button",
|
|
260
|
-
i0.ɵɵlistener("click", function
|
|
261
|
-
i0.ɵɵelement(8, "i",
|
|
166
|
+
i0.ɵɵelementStart(7, "button", 79);
|
|
167
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r11 = i0.ɵɵrestoreView(_r10).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); ctx_r1.runToolFromCard(tool_r11); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
168
|
+
i0.ɵɵelement(8, "i", 38);
|
|
262
169
|
i0.ɵɵelementEnd()();
|
|
263
170
|
} if (rf & 2) {
|
|
264
171
|
const tool_r11 = ctx.$implicit;
|
|
265
|
-
const
|
|
172
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
266
173
|
i0.ɵɵadvance(3);
|
|
267
174
|
i0.ɵɵtextInterpolate(tool_r11.ToolTitle || tool_r11.ToolName);
|
|
268
175
|
i0.ɵɵadvance(3);
|
|
269
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
176
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r11), " params ");
|
|
270
177
|
} }
|
|
271
|
-
function
|
|
272
|
-
i0.ɵɵelementStart(0, "div",
|
|
273
|
-
i0.ɵɵrepeaterCreate(1,
|
|
178
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
179
|
+
i0.ɵɵelementStart(0, "div", 72);
|
|
180
|
+
i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_For_2_Template, 9, 2, "div", 74, _forTrack0);
|
|
274
181
|
i0.ɵɵelementEnd();
|
|
275
182
|
} if (rf & 2) {
|
|
276
183
|
const server_r9 = i0.ɵɵnextContext(2).$implicit;
|
|
277
|
-
const
|
|
184
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
278
185
|
i0.ɵɵadvance();
|
|
279
|
-
i0.ɵɵrepeater(
|
|
186
|
+
i0.ɵɵrepeater(ctx_r1.getToolsForServer(server_r9.ID));
|
|
280
187
|
} }
|
|
281
|
-
function
|
|
282
|
-
i0.ɵɵelementStart(0, "div",
|
|
283
|
-
i0.ɵɵelement(2, "i",
|
|
188
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Template(rf, ctx) { if (rf & 1) {
|
|
189
|
+
i0.ɵɵelementStart(0, "div", 67)(1, "div", 70);
|
|
190
|
+
i0.ɵɵelement(2, "i", 15);
|
|
284
191
|
i0.ɵɵelementStart(3, "span");
|
|
285
192
|
i0.ɵɵtext(4);
|
|
286
193
|
i0.ɵɵelementEnd()();
|
|
287
|
-
i0.ɵɵ
|
|
194
|
+
i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_5_Template, 3, 0, "div", 71)(6, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Conditional_6_Template, 3, 0, "div", 72);
|
|
288
195
|
i0.ɵɵelementEnd();
|
|
289
196
|
} if (rf & 2) {
|
|
290
197
|
const server_r9 = i0.ɵɵnextContext().$implicit;
|
|
291
|
-
const
|
|
198
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
292
199
|
i0.ɵɵadvance(4);
|
|
293
|
-
i0.ɵɵtextInterpolate1("Available Tools (",
|
|
200
|
+
i0.ɵɵtextInterpolate1("Available Tools (", ctx_r1.getToolsForServer(server_r9.ID).length, ")");
|
|
294
201
|
i0.ɵɵadvance();
|
|
295
|
-
i0.ɵɵconditional(
|
|
202
|
+
i0.ɵɵconditional(ctx_r1.getToolsForServer(server_r9.ID).length === 0 ? 5 : 6);
|
|
296
203
|
} }
|
|
297
|
-
function
|
|
204
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
298
205
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
299
|
-
i0.ɵɵelementStart(0, "div",
|
|
300
|
-
i0.ɵɵlistener("click", function
|
|
301
|
-
i0.ɵɵelementStart(2, "div",
|
|
302
|
-
i0.ɵɵelement(3, "i",
|
|
206
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 50);
|
|
207
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_div_click_1_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerExpand(server_r9)); });
|
|
208
|
+
i0.ɵɵelementStart(2, "div", 51);
|
|
209
|
+
i0.ɵɵelement(3, "i", 52)(4, "i")(5, "span", 53);
|
|
303
210
|
i0.ɵɵpipe(6, "async");
|
|
304
211
|
i0.ɵɵpipe(7, "highlightSearch");
|
|
305
|
-
i0.ɵɵelementStart(8, "span",
|
|
212
|
+
i0.ɵɵelementStart(8, "span", 54);
|
|
306
213
|
i0.ɵɵtext(9);
|
|
307
214
|
i0.ɵɵelementEnd()();
|
|
308
|
-
i0.ɵɵelementStart(10, "div",
|
|
309
|
-
i0.ɵɵlistener("click", function
|
|
310
|
-
i0.ɵɵelementStart(11, "button",
|
|
311
|
-
i0.ɵɵlistener("click", function
|
|
312
|
-
i0.ɵɵelement(12, "i",
|
|
313
|
-
i0.ɵɵelementEnd();
|
|
314
|
-
i0.ɵɵelementStart(13, "button",
|
|
315
|
-
i0.ɵɵlistener("click", function
|
|
316
|
-
i0.ɵɵelement(14, "i",
|
|
215
|
+
i0.ɵɵelementStart(10, "div", 55);
|
|
216
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r8); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
217
|
+
i0.ɵɵelementStart(11, "button", 56);
|
|
218
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_button_click_11_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editServer(server_r9)); });
|
|
219
|
+
i0.ɵɵelement(12, "i", 57);
|
|
220
|
+
i0.ɵɵelementEnd();
|
|
221
|
+
i0.ɵɵelementStart(13, "button", 58);
|
|
222
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template_button_click_13_listener() { const server_r9 = i0.ɵɵrestoreView(_r8).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteServer(server_r9)); });
|
|
223
|
+
i0.ɵɵelement(14, "i", 59);
|
|
317
224
|
i0.ɵɵelementEnd()()();
|
|
318
|
-
i0.ɵɵelementStart(15, "div",
|
|
319
|
-
i0.ɵɵ
|
|
320
|
-
i0.ɵɵelementStart(17, "div",
|
|
225
|
+
i0.ɵɵelementStart(15, "div", 60);
|
|
226
|
+
i0.ɵɵconditionalCreate(16, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_16_Template, 3, 6, "p", 61);
|
|
227
|
+
i0.ɵɵelementStart(17, "div", 62)(18, "div", 63)(19, "span", 64);
|
|
321
228
|
i0.ɵɵtext(20, "Transport");
|
|
322
229
|
i0.ɵɵelementEnd();
|
|
323
|
-
i0.ɵɵelementStart(21, "span",
|
|
230
|
+
i0.ɵɵelementStart(21, "span", 65);
|
|
324
231
|
i0.ɵɵtext(22);
|
|
325
232
|
i0.ɵɵelementEnd()();
|
|
326
|
-
i0.ɵɵelementStart(23, "div",
|
|
233
|
+
i0.ɵɵelementStart(23, "div", 63)(24, "span", 64);
|
|
327
234
|
i0.ɵɵtext(25, "Auth");
|
|
328
235
|
i0.ɵɵelementEnd();
|
|
329
|
-
i0.ɵɵelementStart(26, "span",
|
|
236
|
+
i0.ɵɵelementStart(26, "span", 65);
|
|
330
237
|
i0.ɵɵtext(27);
|
|
331
238
|
i0.ɵɵelementEnd()();
|
|
332
|
-
i0.ɵɵelementStart(28, "div",
|
|
239
|
+
i0.ɵɵelementStart(28, "div", 63)(29, "span", 64);
|
|
333
240
|
i0.ɵɵtext(30, "Connections");
|
|
334
241
|
i0.ɵɵelementEnd();
|
|
335
|
-
i0.ɵɵelementStart(31, "span",
|
|
242
|
+
i0.ɵɵelementStart(31, "span", 65);
|
|
336
243
|
i0.ɵɵtext(32);
|
|
337
244
|
i0.ɵɵelementEnd()();
|
|
338
|
-
i0.ɵɵelementStart(33, "div",
|
|
245
|
+
i0.ɵɵelementStart(33, "div", 63)(34, "span", 64);
|
|
339
246
|
i0.ɵɵtext(35, "Tools");
|
|
340
247
|
i0.ɵɵelementEnd();
|
|
341
|
-
i0.ɵɵelementStart(36, "span",
|
|
248
|
+
i0.ɵɵelementStart(36, "span", 65);
|
|
342
249
|
i0.ɵɵtext(37);
|
|
343
250
|
i0.ɵɵelementEnd()();
|
|
344
|
-
i0.ɵɵ
|
|
345
|
-
i0.ɵɵ
|
|
251
|
+
i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_38_Template, 5, 1, "div", 66);
|
|
252
|
+
i0.ɵɵconditionalCreate(39, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_39_Template, 5, 1, "div", 66);
|
|
253
|
+
i0.ɵɵelementStart(40, "div", 63)(41, "span", 64);
|
|
346
254
|
i0.ɵɵtext(42, "Last Sync");
|
|
347
255
|
i0.ɵɵelementEnd();
|
|
348
|
-
i0.ɵɵelementStart(43, "span",
|
|
256
|
+
i0.ɵɵelementStart(43, "span", 65);
|
|
349
257
|
i0.ɵɵtext(44);
|
|
350
258
|
i0.ɵɵelementEnd()()()();
|
|
351
|
-
i0.ɵɵ
|
|
259
|
+
i0.ɵɵconditionalCreate(45, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Conditional_45_Template, 7, 2, "div", 67);
|
|
352
260
|
i0.ɵɵelementEnd();
|
|
353
261
|
} if (rf & 2) {
|
|
354
262
|
let tmp_16_0;
|
|
355
263
|
const server_r9 = ctx.$implicit;
|
|
356
|
-
const
|
|
357
|
-
i0.ɵɵclassProp("expanded",
|
|
264
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
265
|
+
i0.ɵɵclassProp("expanded", ctx_r1.isServerExpanded(server_r9));
|
|
358
266
|
i0.ɵɵadvance(3);
|
|
359
|
-
i0.ɵɵclassProp("rotated",
|
|
267
|
+
i0.ɵɵclassProp("rotated", ctx_r1.isServerExpanded(server_r9));
|
|
360
268
|
i0.ɵɵadvance();
|
|
361
|
-
i0.ɵɵclassMap(
|
|
269
|
+
i0.ɵɵclassMap(ctx_r1.getTransportIcon(server_r9.TransportType));
|
|
362
270
|
i0.ɵɵadvance();
|
|
363
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, server_r9.Name, (tmp_16_0 = i0.ɵɵpipeBind1(6, 18,
|
|
271
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, server_r9.Name, (tmp_16_0 = i0.ɵɵpipeBind1(6, 18, ctx_r1.filters$)) == null ? null : tmp_16_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
364
272
|
i0.ɵɵadvance(3);
|
|
365
|
-
i0.ɵɵproperty("ngClass",
|
|
273
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(server_r9.Status));
|
|
366
274
|
i0.ɵɵadvance();
|
|
367
275
|
i0.ɵɵtextInterpolate1(" ", server_r9.Status, " ");
|
|
368
276
|
i0.ɵɵadvance(7);
|
|
@@ -380,108 +288,108 @@ function MCPDashboardComponent_Conditional_70_Case_0_Conditional_2_For_1_Templat
|
|
|
380
288
|
i0.ɵɵadvance();
|
|
381
289
|
i0.ɵɵconditional(server_r9.Command ? 39 : -1);
|
|
382
290
|
i0.ɵɵadvance(5);
|
|
383
|
-
i0.ɵɵtextInterpolate(
|
|
291
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(server_r9.LastSyncAt));
|
|
384
292
|
i0.ɵɵadvance();
|
|
385
|
-
i0.ɵɵconditional(
|
|
293
|
+
i0.ɵɵconditional(ctx_r1.isServerExpanded(server_r9) ? 45 : -1);
|
|
386
294
|
} }
|
|
387
|
-
function
|
|
388
|
-
i0.ɵɵrepeaterCreate(0,
|
|
295
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
296
|
+
i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_For_1_Template, 46, 23, "div", 48, _forTrack0);
|
|
389
297
|
} if (rf & 2) {
|
|
390
|
-
const
|
|
391
|
-
i0.ɵɵrepeater(
|
|
298
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
299
|
+
i0.ɵɵrepeater(ctx_r1.filteredServers);
|
|
392
300
|
} }
|
|
393
|
-
function
|
|
394
|
-
i0.ɵɵelementStart(0, "div",
|
|
395
|
-
i0.ɵɵ
|
|
301
|
+
function MCPDashboardComponent_Conditional_50_Case_0_Template(rf, ctx) { if (rf & 1) {
|
|
302
|
+
i0.ɵɵelementStart(0, "div", 44);
|
|
303
|
+
i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_0_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_0_Conditional_2_Template, 2, 0);
|
|
396
304
|
i0.ɵɵelementEnd();
|
|
397
305
|
} if (rf & 2) {
|
|
398
|
-
const
|
|
306
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
399
307
|
i0.ɵɵadvance();
|
|
400
|
-
i0.ɵɵconditional(
|
|
308
|
+
i0.ɵɵconditional(ctx_r1.filteredServers.length === 0 ? 1 : 2);
|
|
401
309
|
} }
|
|
402
|
-
function
|
|
310
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
403
311
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
404
|
-
i0.ɵɵelementStart(0, "div",
|
|
405
|
-
i0.ɵɵelement(1, "i",
|
|
312
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
313
|
+
i0.ɵɵelement(1, "i", 14);
|
|
406
314
|
i0.ɵɵelementStart(2, "p");
|
|
407
315
|
i0.ɵɵtext(3, "No connections configured");
|
|
408
316
|
i0.ɵɵelementEnd();
|
|
409
|
-
i0.ɵɵelementStart(4, "button",
|
|
410
|
-
i0.ɵɵlistener("click", function
|
|
317
|
+
i0.ɵɵelementStart(4, "button", 31);
|
|
318
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.createConnection()); });
|
|
411
319
|
i0.ɵɵtext(5, " Add Your First Connection ");
|
|
412
320
|
i0.ɵɵelementEnd()();
|
|
413
321
|
} }
|
|
414
|
-
function
|
|
415
|
-
i0.ɵɵelement(0, "i",
|
|
322
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
323
|
+
i0.ɵɵelement(0, "i", 81);
|
|
416
324
|
} }
|
|
417
|
-
function
|
|
418
|
-
i0.ɵɵelement(0, "i",
|
|
325
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
326
|
+
i0.ɵɵelement(0, "i", 40);
|
|
419
327
|
} }
|
|
420
|
-
function
|
|
421
|
-
i0.ɵɵelementStart(0, "div",
|
|
422
|
-
i0.ɵɵelement(1, "i",
|
|
423
|
-
i0.ɵɵelementStart(2, "span",
|
|
328
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
329
|
+
i0.ɵɵelementStart(0, "div", 82);
|
|
330
|
+
i0.ɵɵelement(1, "i", 85);
|
|
331
|
+
i0.ɵɵelementStart(2, "span", 86);
|
|
424
332
|
i0.ɵɵtext(3);
|
|
425
333
|
i0.ɵɵelementEnd()();
|
|
426
334
|
} if (rf & 2) {
|
|
427
335
|
const conn_r14 = i0.ɵɵnextContext().$implicit;
|
|
428
|
-
const
|
|
336
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
429
337
|
i0.ɵɵadvance(3);
|
|
430
|
-
i0.ɵɵtextInterpolate(
|
|
338
|
+
i0.ɵɵtextInterpolate(ctx_r1.getSyncProgressMessage(conn_r14.ID) || "Syncing...");
|
|
431
339
|
} }
|
|
432
|
-
function
|
|
433
|
-
i0.ɵɵelement(0, "i",
|
|
340
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
341
|
+
i0.ɵɵelement(0, "i", 88);
|
|
434
342
|
i0.ɵɵelementStart(1, "span");
|
|
435
343
|
i0.ɵɵtext(2);
|
|
436
344
|
i0.ɵɵelementEnd();
|
|
437
345
|
} if (rf & 2) {
|
|
438
346
|
let tmp_15_0;
|
|
439
347
|
const conn_r14 = i0.ɵɵnextContext(2).$implicit;
|
|
440
|
-
const
|
|
348
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
441
349
|
i0.ɵɵadvance(2);
|
|
442
|
-
i0.ɵɵtextInterpolate3("Synced: ", (tmp_15_0 =
|
|
350
|
+
i0.ɵɵtextInterpolate3("Synced: ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Added, " added, ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Updated, " updated, ", (tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Deprecated, " deprecated ");
|
|
443
351
|
} }
|
|
444
|
-
function
|
|
445
|
-
i0.ɵɵelement(0, "i",
|
|
352
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
353
|
+
i0.ɵɵelement(0, "i", 89);
|
|
446
354
|
i0.ɵɵelementStart(1, "span");
|
|
447
355
|
i0.ɵɵtext(2);
|
|
448
356
|
i0.ɵɵelementEnd();
|
|
449
357
|
} if (rf & 2) {
|
|
450
358
|
let tmp_15_0;
|
|
451
359
|
const conn_r14 = i0.ɵɵnextContext(2).$implicit;
|
|
452
|
-
const
|
|
360
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
453
361
|
i0.ɵɵadvance(2);
|
|
454
|
-
i0.ɵɵtextInterpolate((tmp_15_0 =
|
|
362
|
+
i0.ɵɵtextInterpolate((tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.ErrorMessage);
|
|
455
363
|
} }
|
|
456
|
-
function
|
|
457
|
-
i0.ɵɵelementStart(0, "div",
|
|
458
|
-
i0.ɵɵ
|
|
364
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
365
|
+
i0.ɵɵelementStart(0, "div", 87);
|
|
366
|
+
i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_1_Template, 3, 3)(2, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Conditional_2_Template, 3, 1);
|
|
459
367
|
i0.ɵɵelementEnd();
|
|
460
368
|
} if (rf & 2) {
|
|
461
369
|
let tmp_14_0;
|
|
462
370
|
let tmp_15_0;
|
|
463
371
|
let tmp_16_0;
|
|
464
372
|
const conn_r14 = i0.ɵɵnextContext().$implicit;
|
|
465
|
-
const
|
|
466
|
-
i0.ɵɵclassProp("success", (tmp_14_0 =
|
|
373
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
374
|
+
i0.ɵɵclassProp("success", (tmp_14_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_14_0.lastResult == null ? null : tmp_14_0.lastResult.Success)("error", !((tmp_15_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_15_0.lastResult == null ? null : tmp_15_0.lastResult.Success));
|
|
467
375
|
i0.ɵɵadvance();
|
|
468
|
-
i0.ɵɵconditional(((tmp_16_0 =
|
|
376
|
+
i0.ɵɵconditional(((tmp_16_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_16_0.lastResult == null ? null : tmp_16_0.lastResult.Success) ? 1 : 2);
|
|
469
377
|
} }
|
|
470
|
-
function
|
|
471
|
-
i0.ɵɵelement(0, "p",
|
|
378
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
379
|
+
i0.ɵɵelement(0, "p", 61);
|
|
472
380
|
i0.ɵɵpipe(1, "async");
|
|
473
381
|
i0.ɵɵpipe(2, "highlightSearch");
|
|
474
382
|
} if (rf & 2) {
|
|
475
383
|
let tmp_14_0;
|
|
476
384
|
const conn_r14 = i0.ɵɵnextContext().$implicit;
|
|
477
|
-
const
|
|
478
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, conn_r14.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1,
|
|
385
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
386
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, conn_r14.Description, (tmp_14_0 = i0.ɵɵpipeBind1(1, 1, ctx_r1.filters$)) == null ? null : tmp_14_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
479
387
|
} }
|
|
480
|
-
function
|
|
481
|
-
i0.ɵɵelementStart(0, "div",
|
|
388
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_43_Template(rf, ctx) { if (rf & 1) {
|
|
389
|
+
i0.ɵɵelementStart(0, "div", 84)(1, "span", 64);
|
|
482
390
|
i0.ɵɵtext(2, "Last Error");
|
|
483
391
|
i0.ɵɵelementEnd();
|
|
484
|
-
i0.ɵɵelementStart(3, "span",
|
|
392
|
+
i0.ɵɵelementStart(3, "span", 65);
|
|
485
393
|
i0.ɵɵtext(4);
|
|
486
394
|
i0.ɵɵelementEnd()();
|
|
487
395
|
} if (rf & 2) {
|
|
@@ -489,137 +397,138 @@ function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Conditi
|
|
|
489
397
|
i0.ɵɵadvance(4);
|
|
490
398
|
i0.ɵɵtextInterpolate(conn_r14.LastErrorMessage);
|
|
491
399
|
} }
|
|
492
|
-
function
|
|
493
|
-
i0.ɵɵelementStart(0, "div",
|
|
494
|
-
i0.ɵɵelement(1, "i",
|
|
400
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
401
|
+
i0.ɵɵelementStart(0, "div", 71);
|
|
402
|
+
i0.ɵɵelement(1, "i", 73);
|
|
495
403
|
i0.ɵɵtext(2, " No tools discovered yet. Click the sync button to discover tools. ");
|
|
496
404
|
i0.ɵɵelementEnd();
|
|
497
405
|
} }
|
|
498
|
-
function
|
|
406
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
499
407
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
500
|
-
i0.ɵɵelementStart(0, "div",
|
|
408
|
+
i0.ɵɵelementStart(0, "div", 74)(1, "div", 75)(2, "span", 76);
|
|
501
409
|
i0.ɵɵtext(3);
|
|
502
410
|
i0.ɵɵelementEnd();
|
|
503
|
-
i0.ɵɵelementStart(4, "span",
|
|
504
|
-
i0.ɵɵelement(5, "i",
|
|
411
|
+
i0.ɵɵelementStart(4, "span", 77);
|
|
412
|
+
i0.ɵɵelement(5, "i", 78);
|
|
505
413
|
i0.ɵɵtext(6);
|
|
506
414
|
i0.ɵɵelementEnd()();
|
|
507
|
-
i0.ɵɵelementStart(7, "button",
|
|
508
|
-
i0.ɵɵlistener("click", function
|
|
509
|
-
i0.ɵɵelement(8, "i",
|
|
415
|
+
i0.ɵɵelementStart(7, "button", 90);
|
|
416
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template_button_click_7_listener($event) { const tool_r16 = i0.ɵɵrestoreView(_r15).$implicit; const conn_r14 = i0.ɵɵnextContext(3).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); ctx_r1.runToolFromCard(tool_r16, conn_r14); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
417
|
+
i0.ɵɵelement(8, "i", 38);
|
|
510
418
|
i0.ɵɵelementEnd()();
|
|
511
419
|
} if (rf & 2) {
|
|
512
420
|
const tool_r16 = ctx.$implicit;
|
|
513
|
-
const
|
|
421
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
514
422
|
i0.ɵɵadvance(3);
|
|
515
423
|
i0.ɵɵtextInterpolate(tool_r16.ToolTitle || tool_r16.ToolName);
|
|
516
424
|
i0.ɵɵadvance(3);
|
|
517
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
425
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r16), " params ");
|
|
518
426
|
} }
|
|
519
|
-
function
|
|
520
|
-
i0.ɵɵelementStart(0, "div",
|
|
521
|
-
i0.ɵɵrepeaterCreate(1,
|
|
427
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
428
|
+
i0.ɵɵelementStart(0, "div", 72);
|
|
429
|
+
i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_For_2_Template, 9, 2, "div", 74, _forTrack0);
|
|
522
430
|
i0.ɵɵelementEnd();
|
|
523
431
|
} if (rf & 2) {
|
|
524
432
|
const conn_r14 = i0.ɵɵnextContext(2).$implicit;
|
|
525
|
-
const
|
|
433
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
526
434
|
i0.ɵɵadvance();
|
|
527
|
-
i0.ɵɵrepeater(
|
|
435
|
+
i0.ɵɵrepeater(ctx_r1.getToolsForConnection(conn_r14.ID));
|
|
528
436
|
} }
|
|
529
|
-
function
|
|
530
|
-
i0.ɵɵelementStart(0, "div",
|
|
531
|
-
i0.ɵɵelement(2, "i",
|
|
437
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Template(rf, ctx) { if (rf & 1) {
|
|
438
|
+
i0.ɵɵelementStart(0, "div", 67)(1, "div", 70);
|
|
439
|
+
i0.ɵɵelement(2, "i", 15);
|
|
532
440
|
i0.ɵɵelementStart(3, "span");
|
|
533
441
|
i0.ɵɵtext(4);
|
|
534
442
|
i0.ɵɵelementEnd()();
|
|
535
|
-
i0.ɵɵ
|
|
443
|
+
i0.ɵɵconditionalCreate(5, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_5_Template, 3, 0, "div", 71)(6, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Conditional_6_Template, 3, 0, "div", 72);
|
|
536
444
|
i0.ɵɵelementEnd();
|
|
537
445
|
} if (rf & 2) {
|
|
538
446
|
const conn_r14 = i0.ɵɵnextContext().$implicit;
|
|
539
|
-
const
|
|
447
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
540
448
|
i0.ɵɵadvance(4);
|
|
541
|
-
i0.ɵɵtextInterpolate1("Available Tools (",
|
|
449
|
+
i0.ɵɵtextInterpolate1("Available Tools (", ctx_r1.getToolsForConnection(conn_r14.ID).length, ")");
|
|
542
450
|
i0.ɵɵadvance();
|
|
543
|
-
i0.ɵɵconditional(
|
|
451
|
+
i0.ɵɵconditional(ctx_r1.getToolsForConnection(conn_r14.ID).length === 0 ? 5 : 6);
|
|
544
452
|
} }
|
|
545
|
-
function
|
|
453
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template(rf, ctx) { if (rf & 1) {
|
|
546
454
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
547
|
-
i0.ɵɵelementStart(0, "div",
|
|
548
|
-
i0.ɵɵlistener("click", function
|
|
549
|
-
i0.ɵɵelementStart(2, "div",
|
|
550
|
-
i0.ɵɵelement(3, "i",
|
|
455
|
+
i0.ɵɵelementStart(0, "div", 49)(1, "div", 50);
|
|
456
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_div_click_1_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleConnectionExpand(conn_r14)); });
|
|
457
|
+
i0.ɵɵelementStart(2, "div", 51);
|
|
458
|
+
i0.ɵɵelement(3, "i", 52)(4, "i", 14)(5, "span", 53);
|
|
551
459
|
i0.ɵɵpipe(6, "async");
|
|
552
460
|
i0.ɵɵpipe(7, "highlightSearch");
|
|
553
|
-
i0.ɵɵelementStart(8, "span",
|
|
461
|
+
i0.ɵɵelementStart(8, "span", 54);
|
|
554
462
|
i0.ɵɵtext(9);
|
|
555
463
|
i0.ɵɵelementEnd()();
|
|
556
|
-
i0.ɵɵelementStart(10, "div",
|
|
557
|
-
i0.ɵɵlistener("click", function
|
|
558
|
-
i0.ɵɵelementStart(11, "button",
|
|
559
|
-
i0.ɵɵlistener("click", function
|
|
560
|
-
i0.ɵɵ
|
|
561
|
-
i0.ɵɵelementEnd();
|
|
562
|
-
i0.ɵɵelementStart(14, "button",
|
|
563
|
-
i0.ɵɵlistener("click", function
|
|
564
|
-
i0.ɵɵelement(15, "i",
|
|
565
|
-
i0.ɵɵelementEnd();
|
|
566
|
-
i0.ɵɵelementStart(16, "button",
|
|
567
|
-
i0.ɵɵlistener("click", function
|
|
568
|
-
i0.ɵɵelement(17, "i",
|
|
464
|
+
i0.ɵɵelementStart(10, "div", 55);
|
|
465
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_div_click_10_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
466
|
+
i0.ɵɵelementStart(11, "button", 80);
|
|
467
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_11_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.syncConnectionTools(conn_r14)); });
|
|
468
|
+
i0.ɵɵconditionalCreate(12, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_12_Template, 1, 0, "i", 81)(13, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_13_Template, 1, 0, "i", 40);
|
|
469
|
+
i0.ɵɵelementEnd();
|
|
470
|
+
i0.ɵɵelementStart(14, "button", 56);
|
|
471
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_14_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.editConnection(conn_r14)); });
|
|
472
|
+
i0.ɵɵelement(15, "i", 57);
|
|
473
|
+
i0.ɵɵelementEnd();
|
|
474
|
+
i0.ɵɵelementStart(16, "button", 58);
|
|
475
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template_button_click_16_listener() { const conn_r14 = i0.ɵɵrestoreView(_r13).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.deleteConnection(conn_r14)); });
|
|
476
|
+
i0.ɵɵelement(17, "i", 59);
|
|
569
477
|
i0.ɵɵelementEnd()()();
|
|
570
|
-
i0.ɵɵ
|
|
571
|
-
i0.ɵɵ
|
|
572
|
-
i0.ɵɵ
|
|
573
|
-
i0.ɵɵ
|
|
478
|
+
i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_18_Template, 4, 1, "div", 82);
|
|
479
|
+
i0.ɵɵconditionalCreate(19, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_19_Template, 3, 5, "div", 83);
|
|
480
|
+
i0.ɵɵelementStart(20, "div", 60);
|
|
481
|
+
i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_21_Template, 3, 6, "p", 61);
|
|
482
|
+
i0.ɵɵelementStart(22, "div", 62)(23, "div", 63)(24, "span", 64);
|
|
574
483
|
i0.ɵɵtext(25, "Server");
|
|
575
484
|
i0.ɵɵelementEnd();
|
|
576
|
-
i0.ɵɵelementStart(26, "span",
|
|
485
|
+
i0.ɵɵelementStart(26, "span", 65);
|
|
577
486
|
i0.ɵɵtext(27);
|
|
578
487
|
i0.ɵɵelementEnd()();
|
|
579
|
-
i0.ɵɵelementStart(28, "div",
|
|
488
|
+
i0.ɵɵelementStart(28, "div", 63)(29, "span", 64);
|
|
580
489
|
i0.ɵɵtext(30, "Auto Sync");
|
|
581
490
|
i0.ɵɵelementEnd();
|
|
582
|
-
i0.ɵɵelementStart(31, "span",
|
|
491
|
+
i0.ɵɵelementStart(31, "span", 65);
|
|
583
492
|
i0.ɵɵtext(32);
|
|
584
493
|
i0.ɵɵelementEnd()();
|
|
585
|
-
i0.ɵɵelementStart(33, "div",
|
|
494
|
+
i0.ɵɵelementStart(33, "div", 63)(34, "span", 64);
|
|
586
495
|
i0.ɵɵtext(35, "Logging");
|
|
587
496
|
i0.ɵɵelementEnd();
|
|
588
|
-
i0.ɵɵelementStart(36, "span",
|
|
497
|
+
i0.ɵɵelementStart(36, "span", 65);
|
|
589
498
|
i0.ɵɵtext(37);
|
|
590
499
|
i0.ɵɵelementEnd()();
|
|
591
|
-
i0.ɵɵelementStart(38, "div",
|
|
500
|
+
i0.ɵɵelementStart(38, "div", 63)(39, "span", 64);
|
|
592
501
|
i0.ɵɵtext(40, "Last Connected");
|
|
593
502
|
i0.ɵɵelementEnd();
|
|
594
|
-
i0.ɵɵelementStart(41, "span",
|
|
503
|
+
i0.ɵɵelementStart(41, "span", 65);
|
|
595
504
|
i0.ɵɵtext(42);
|
|
596
505
|
i0.ɵɵelementEnd()();
|
|
597
|
-
i0.ɵɵ
|
|
506
|
+
i0.ɵɵconditionalCreate(43, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_43_Template, 5, 1, "div", 84);
|
|
598
507
|
i0.ɵɵelementEnd()();
|
|
599
|
-
i0.ɵɵ
|
|
508
|
+
i0.ɵɵconditionalCreate(44, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Conditional_44_Template, 7, 2, "div", 67);
|
|
600
509
|
i0.ɵɵelementEnd();
|
|
601
510
|
} if (rf & 2) {
|
|
602
511
|
let tmp_15_0;
|
|
603
512
|
let tmp_21_0;
|
|
604
513
|
const conn_r14 = ctx.$implicit;
|
|
605
|
-
const
|
|
606
|
-
i0.ɵɵclassProp("expanded",
|
|
514
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
515
|
+
i0.ɵɵclassProp("expanded", ctx_r1.isConnectionExpanded(conn_r14));
|
|
607
516
|
i0.ɵɵadvance(3);
|
|
608
|
-
i0.ɵɵclassProp("rotated",
|
|
517
|
+
i0.ɵɵclassProp("rotated", ctx_r1.isConnectionExpanded(conn_r14));
|
|
609
518
|
i0.ɵɵadvance(2);
|
|
610
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, conn_r14.Name, (tmp_15_0 = i0.ɵɵpipeBind1(6, 18,
|
|
519
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(7, 20, conn_r14.Name, (tmp_15_0 = i0.ɵɵpipeBind1(6, 18, ctx_r1.filters$)) == null ? null : tmp_15_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
611
520
|
i0.ɵɵadvance(3);
|
|
612
|
-
i0.ɵɵproperty("ngClass",
|
|
521
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(conn_r14.Status));
|
|
613
522
|
i0.ɵɵadvance();
|
|
614
523
|
i0.ɵɵtextInterpolate1(" ", conn_r14.Status, " ");
|
|
615
524
|
i0.ɵɵadvance(2);
|
|
616
|
-
i0.ɵɵproperty("disabled",
|
|
525
|
+
i0.ɵɵproperty("disabled", ctx_r1.isSyncing(conn_r14.ID));
|
|
617
526
|
i0.ɵɵadvance();
|
|
618
|
-
i0.ɵɵconditional(
|
|
527
|
+
i0.ɵɵconditional(ctx_r1.isSyncing(conn_r14.ID) ? 12 : 13);
|
|
619
528
|
i0.ɵɵadvance(6);
|
|
620
|
-
i0.ɵɵconditional(
|
|
529
|
+
i0.ɵɵconditional(ctx_r1.isSyncing(conn_r14.ID) ? 18 : -1);
|
|
621
530
|
i0.ɵɵadvance();
|
|
622
|
-
i0.ɵɵconditional(((tmp_21_0 =
|
|
531
|
+
i0.ɵɵconditional(((tmp_21_0 = ctx_r1.getSyncState(conn_r14.ID)) == null ? null : tmp_21_0.lastResult) && !ctx_r1.isSyncing(conn_r14.ID) ? 19 : -1);
|
|
623
532
|
i0.ɵɵadvance(2);
|
|
624
533
|
i0.ɵɵconditional(conn_r14.Description ? 21 : -1);
|
|
625
534
|
i0.ɵɵadvance(6);
|
|
@@ -629,163 +538,163 @@ function MCPDashboardComponent_Conditional_70_Case_1_Conditional_2_For_1_Templat
|
|
|
629
538
|
i0.ɵɵadvance(5);
|
|
630
539
|
i0.ɵɵtextInterpolate(conn_r14.LogToolCalls ? "Enabled" : "Disabled");
|
|
631
540
|
i0.ɵɵadvance(5);
|
|
632
|
-
i0.ɵɵtextInterpolate(
|
|
541
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(conn_r14.LastConnectedAt));
|
|
633
542
|
i0.ɵɵadvance();
|
|
634
543
|
i0.ɵɵconditional(conn_r14.LastErrorMessage ? 43 : -1);
|
|
635
544
|
i0.ɵɵadvance();
|
|
636
|
-
i0.ɵɵconditional(
|
|
545
|
+
i0.ɵɵconditional(ctx_r1.isConnectionExpanded(conn_r14) ? 44 : -1);
|
|
637
546
|
} }
|
|
638
|
-
function
|
|
639
|
-
i0.ɵɵrepeaterCreate(0,
|
|
547
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
548
|
+
i0.ɵɵrepeaterCreate(0, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_For_1_Template, 45, 23, "div", 48, _forTrack0);
|
|
640
549
|
} if (rf & 2) {
|
|
641
|
-
const
|
|
642
|
-
i0.ɵɵrepeater(
|
|
550
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
551
|
+
i0.ɵɵrepeater(ctx_r1.filteredConnections);
|
|
643
552
|
} }
|
|
644
|
-
function
|
|
645
|
-
i0.ɵɵelementStart(0, "div",
|
|
646
|
-
i0.ɵɵ
|
|
553
|
+
function MCPDashboardComponent_Conditional_50_Case_1_Template(rf, ctx) { if (rf & 1) {
|
|
554
|
+
i0.ɵɵelementStart(0, "div", 45);
|
|
555
|
+
i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_1_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_1_Conditional_2_Template, 2, 0);
|
|
647
556
|
i0.ɵɵelementEnd();
|
|
648
557
|
} if (rf & 2) {
|
|
649
|
-
const
|
|
558
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
650
559
|
i0.ɵɵadvance();
|
|
651
|
-
i0.ɵɵconditional(
|
|
560
|
+
i0.ɵɵconditional(ctx_r1.filteredConnections.length === 0 ? 1 : 2);
|
|
652
561
|
} }
|
|
653
|
-
function
|
|
654
|
-
i0.ɵɵelementStart(0, "div",
|
|
655
|
-
i0.ɵɵelement(1, "i",
|
|
562
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
563
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
564
|
+
i0.ɵɵelement(1, "i", 15);
|
|
656
565
|
i0.ɵɵelementStart(2, "p");
|
|
657
566
|
i0.ɵɵtext(3, "No tools discovered yet");
|
|
658
567
|
i0.ɵɵelementEnd();
|
|
659
|
-
i0.ɵɵelementStart(4, "span",
|
|
568
|
+
i0.ɵɵelementStart(4, "span", 92);
|
|
660
569
|
i0.ɵɵtext(5, "Tools are discovered when connections sync with MCP servers");
|
|
661
570
|
i0.ɵɵelementEnd()();
|
|
662
571
|
} }
|
|
663
|
-
function
|
|
664
|
-
i0.ɵɵelement(0, "p",
|
|
572
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
573
|
+
i0.ɵɵelement(0, "p", 111);
|
|
665
574
|
i0.ɵɵpipe(1, "async");
|
|
666
575
|
i0.ɵɵpipe(2, "highlightSearch");
|
|
667
576
|
} if (rf & 2) {
|
|
668
577
|
let tmp_26_0;
|
|
669
578
|
const tool_r20 = i0.ɵɵnextContext().$implicit;
|
|
670
|
-
const
|
|
671
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, tool_r20.ToolDescription, (tmp_26_0 = i0.ɵɵpipeBind1(1, 1,
|
|
579
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
580
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(2, 3, tool_r20.ToolDescription, (tmp_26_0 = i0.ɵɵpipeBind1(1, 1, ctx_r1.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
672
581
|
} }
|
|
673
|
-
function
|
|
674
|
-
i0.ɵɵelementStart(0, "div",
|
|
582
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
583
|
+
i0.ɵɵelementStart(0, "div", 120)(1, "span", 117);
|
|
675
584
|
i0.ɵɵtext(2, "Input Schema:");
|
|
676
585
|
i0.ɵɵelementEnd();
|
|
677
|
-
i0.ɵɵelementStart(3, "pre",
|
|
586
|
+
i0.ɵɵelementStart(3, "pre", 121);
|
|
678
587
|
i0.ɵɵtext(4);
|
|
679
588
|
i0.ɵɵelementEnd()();
|
|
680
589
|
} if (rf & 2) {
|
|
681
590
|
const tool_r20 = i0.ɵɵnextContext(2).$implicit;
|
|
682
|
-
const
|
|
591
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
683
592
|
i0.ɵɵadvance(4);
|
|
684
|
-
i0.ɵɵtextInterpolate(
|
|
593
|
+
i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r20));
|
|
685
594
|
} }
|
|
686
|
-
function
|
|
687
|
-
i0.ɵɵelementStart(0, "div",
|
|
595
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
596
|
+
i0.ɵɵelementStart(0, "div", 115)(1, "div", 116)(2, "span", 117);
|
|
688
597
|
i0.ɵɵtext(3, "Tool Name:");
|
|
689
598
|
i0.ɵɵelementEnd();
|
|
690
|
-
i0.ɵɵelementStart(4, "span",
|
|
599
|
+
i0.ɵɵelementStart(4, "span", 118);
|
|
691
600
|
i0.ɵɵtext(5);
|
|
692
601
|
i0.ɵɵelementEnd()();
|
|
693
|
-
i0.ɵɵelementStart(6, "div",
|
|
602
|
+
i0.ɵɵelementStart(6, "div", 116)(7, "span", 117);
|
|
694
603
|
i0.ɵɵtext(8, "Parameters:");
|
|
695
604
|
i0.ɵɵelementEnd();
|
|
696
|
-
i0.ɵɵelementStart(9, "span",
|
|
605
|
+
i0.ɵɵelementStart(9, "span", 119);
|
|
697
606
|
i0.ɵɵtext(10);
|
|
698
607
|
i0.ɵɵelementEnd()();
|
|
699
|
-
i0.ɵɵelementStart(11, "div",
|
|
608
|
+
i0.ɵɵelementStart(11, "div", 116)(12, "span", 117);
|
|
700
609
|
i0.ɵɵtext(13, "Discovered:");
|
|
701
610
|
i0.ɵɵelementEnd();
|
|
702
|
-
i0.ɵɵelementStart(14, "span",
|
|
611
|
+
i0.ɵɵelementStart(14, "span", 119);
|
|
703
612
|
i0.ɵɵtext(15);
|
|
704
613
|
i0.ɵɵelementEnd()();
|
|
705
|
-
i0.ɵɵelementStart(16, "div",
|
|
614
|
+
i0.ɵɵelementStart(16, "div", 116)(17, "span", 117);
|
|
706
615
|
i0.ɵɵtext(18, "Last Seen:");
|
|
707
616
|
i0.ɵɵelementEnd();
|
|
708
|
-
i0.ɵɵelementStart(19, "span",
|
|
617
|
+
i0.ɵɵelementStart(19, "span", 119);
|
|
709
618
|
i0.ɵɵtext(20);
|
|
710
619
|
i0.ɵɵelementEnd()();
|
|
711
|
-
i0.ɵɵ
|
|
620
|
+
i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Conditional_21_Template, 5, 1, "div", 120);
|
|
712
621
|
i0.ɵɵelementEnd();
|
|
713
622
|
} if (rf & 2) {
|
|
714
623
|
const tool_r20 = i0.ɵɵnextContext().$implicit;
|
|
715
|
-
const
|
|
624
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
716
625
|
i0.ɵɵadvance(5);
|
|
717
626
|
i0.ɵɵtextInterpolate(tool_r20.ToolName);
|
|
718
627
|
i0.ɵɵadvance(5);
|
|
719
|
-
i0.ɵɵtextInterpolate2(" ",
|
|
628
|
+
i0.ɵɵtextInterpolate2(" ", ctx_r1.getParamCount(tool_r20), " total, ", ctx_r1.getRequiredParamCount(tool_r20), " required ");
|
|
720
629
|
i0.ɵɵadvance(5);
|
|
721
|
-
i0.ɵɵtextInterpolate(
|
|
630
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r20.DiscoveredAt));
|
|
722
631
|
i0.ɵɵadvance(5);
|
|
723
|
-
i0.ɵɵtextInterpolate(
|
|
632
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r20.LastSeenAt));
|
|
724
633
|
i0.ɵɵadvance();
|
|
725
634
|
i0.ɵɵconditional(tool_r20.InputSchema ? 21 : -1);
|
|
726
635
|
} }
|
|
727
|
-
function
|
|
636
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
728
637
|
const _r19 = i0.ɵɵgetCurrentView();
|
|
729
|
-
i0.ɵɵelementStart(0, "div",
|
|
730
|
-
i0.ɵɵlistener("click", function
|
|
731
|
-
i0.ɵɵelementStart(2, "div",
|
|
732
|
-
i0.ɵɵelement(3, "i",
|
|
638
|
+
i0.ɵɵelementStart(0, "div", 106)(1, "div", 107);
|
|
639
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_div_click_1_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r20)); });
|
|
640
|
+
i0.ɵɵelementStart(2, "div", 108);
|
|
641
|
+
i0.ɵɵelement(3, "i", 15)(4, "span", 53);
|
|
733
642
|
i0.ɵɵpipe(5, "async");
|
|
734
643
|
i0.ɵɵpipe(6, "highlightSearch");
|
|
735
644
|
i0.ɵɵelementEnd();
|
|
736
|
-
i0.ɵɵelementStart(7, "div",
|
|
737
|
-
i0.ɵɵelement(9, "i",
|
|
645
|
+
i0.ɵɵelementStart(7, "div", 109)(8, "span", 110);
|
|
646
|
+
i0.ɵɵelement(9, "i", 78);
|
|
738
647
|
i0.ɵɵtext(10);
|
|
739
648
|
i0.ɵɵelementEnd();
|
|
740
|
-
i0.ɵɵelementStart(11, "span",
|
|
649
|
+
i0.ɵɵelementStart(11, "span", 100);
|
|
741
650
|
i0.ɵɵtext(12);
|
|
742
651
|
i0.ɵɵelementEnd()()();
|
|
743
|
-
i0.ɵɵ
|
|
744
|
-
i0.ɵɵelementStart(14, "div",
|
|
745
|
-
i0.ɵɵlistener("click", function
|
|
746
|
-
i0.ɵɵelement(16, "i",
|
|
652
|
+
i0.ɵɵconditionalCreate(13, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_13_Template, 3, 6, "p", 111);
|
|
653
|
+
i0.ɵɵelementStart(14, "div", 112)(15, "button", 79);
|
|
654
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_15_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r20)); });
|
|
655
|
+
i0.ɵɵelement(16, "i", 38);
|
|
747
656
|
i0.ɵɵtext(17, " Test ");
|
|
748
657
|
i0.ɵɵelementEnd();
|
|
749
|
-
i0.ɵɵelementStart(18, "button",
|
|
750
|
-
i0.ɵɵlistener("click", function
|
|
751
|
-
i0.ɵɵelement(19, "i",
|
|
658
|
+
i0.ɵɵelementStart(18, "button", 113);
|
|
659
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template_button_click_18_listener() { const tool_r20 = i0.ɵɵrestoreView(_r19).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r20)); });
|
|
660
|
+
i0.ɵɵelement(19, "i", 114);
|
|
752
661
|
i0.ɵɵtext(20);
|
|
753
662
|
i0.ɵɵelementEnd()();
|
|
754
|
-
i0.ɵɵ
|
|
663
|
+
i0.ɵɵconditionalCreate(21, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Conditional_21_Template, 22, 6, "div", 115);
|
|
755
664
|
i0.ɵɵelementEnd();
|
|
756
665
|
} if (rf & 2) {
|
|
757
666
|
let tmp_26_0;
|
|
758
667
|
const tool_r20 = ctx.$implicit;
|
|
759
|
-
const
|
|
760
|
-
i0.ɵɵclassProp("expanded",
|
|
668
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
669
|
+
i0.ɵɵclassProp("expanded", ctx_r1.isToolExpanded(tool_r20));
|
|
761
670
|
i0.ɵɵadvance(4);
|
|
762
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 15, tool_r20.ToolTitle || tool_r20.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 13,
|
|
671
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 15, tool_r20.ToolTitle || tool_r20.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 13, ctx_r1.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
763
672
|
i0.ɵɵadvance(6);
|
|
764
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
673
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.getParamCount(tool_r20), " ");
|
|
765
674
|
i0.ɵɵadvance();
|
|
766
|
-
i0.ɵɵproperty("ngClass",
|
|
675
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(tool_r20.Status));
|
|
767
676
|
i0.ɵɵadvance();
|
|
768
677
|
i0.ɵɵtextInterpolate1(" ", tool_r20.Status, " ");
|
|
769
678
|
i0.ɵɵadvance();
|
|
770
679
|
i0.ɵɵconditional(tool_r20.ToolDescription ? 13 : -1);
|
|
771
680
|
i0.ɵɵadvance(6);
|
|
772
|
-
i0.ɵɵclassProp("fa-chevron-down", !
|
|
681
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.isToolExpanded(tool_r20))("fa-chevron-up", ctx_r1.isToolExpanded(tool_r20));
|
|
773
682
|
i0.ɵɵadvance();
|
|
774
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
683
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.isToolExpanded(tool_r20) ? "Less" : "More", " ");
|
|
775
684
|
i0.ɵɵadvance();
|
|
776
|
-
i0.ɵɵconditional(
|
|
685
|
+
i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r20) ? 21 : -1);
|
|
777
686
|
} }
|
|
778
|
-
function
|
|
779
|
-
i0.ɵɵelementStart(0, "div",
|
|
780
|
-
i0.ɵɵrepeaterCreate(1,
|
|
687
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
688
|
+
i0.ɵɵelementStart(0, "div", 103);
|
|
689
|
+
i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_For_2_Template, 22, 18, "div", 105, _forTrack0);
|
|
781
690
|
i0.ɵɵelementEnd();
|
|
782
691
|
} if (rf & 2) {
|
|
783
692
|
const group_r18 = i0.ɵɵnextContext(2).$implicit;
|
|
784
693
|
i0.ɵɵadvance();
|
|
785
694
|
i0.ɵɵrepeater(group_r18.tools);
|
|
786
695
|
} }
|
|
787
|
-
function
|
|
788
|
-
i0.ɵɵelementStart(0, "span",
|
|
696
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
697
|
+
i0.ɵɵelementStart(0, "span", 125);
|
|
789
698
|
i0.ɵɵtext(1);
|
|
790
699
|
i0.ɵɵelementEnd();
|
|
791
700
|
} if (rf & 2) {
|
|
@@ -793,110 +702,110 @@ function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditi
|
|
|
793
702
|
i0.ɵɵadvance();
|
|
794
703
|
i0.ɵɵtextInterpolate(tool_r22.ToolName);
|
|
795
704
|
} }
|
|
796
|
-
function
|
|
797
|
-
i0.ɵɵelementStart(0, "div",
|
|
705
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
706
|
+
i0.ɵɵelementStart(0, "div", 135)(1, "span", 117);
|
|
798
707
|
i0.ɵɵtext(2, "Input Schema:");
|
|
799
708
|
i0.ɵɵelementEnd();
|
|
800
|
-
i0.ɵɵelementStart(3, "pre",
|
|
709
|
+
i0.ɵɵelementStart(3, "pre", 121);
|
|
801
710
|
i0.ɵɵtext(4);
|
|
802
711
|
i0.ɵɵelementEnd()();
|
|
803
712
|
} if (rf & 2) {
|
|
804
713
|
const tool_r22 = i0.ɵɵnextContext(2).$implicit;
|
|
805
|
-
const
|
|
714
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
806
715
|
i0.ɵɵadvance(4);
|
|
807
|
-
i0.ɵɵtextInterpolate(
|
|
716
|
+
i0.ɵɵtextInterpolate(ctx_r1.getFormattedInputSchema(tool_r22));
|
|
808
717
|
} }
|
|
809
|
-
function
|
|
810
|
-
i0.ɵɵelementStart(0, "tr",
|
|
718
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
|
|
719
|
+
i0.ɵɵelementStart(0, "tr", 131)(1, "td", 132)(2, "div", 133)(3, "div", 134)(4, "span", 117);
|
|
811
720
|
i0.ɵɵtext(5, "Tool Name:");
|
|
812
721
|
i0.ɵɵelementEnd();
|
|
813
|
-
i0.ɵɵelementStart(6, "span",
|
|
722
|
+
i0.ɵɵelementStart(6, "span", 118);
|
|
814
723
|
i0.ɵɵtext(7);
|
|
815
724
|
i0.ɵɵelementEnd()();
|
|
816
|
-
i0.ɵɵelementStart(8, "div",
|
|
725
|
+
i0.ɵɵelementStart(8, "div", 134)(9, "span", 117);
|
|
817
726
|
i0.ɵɵtext(10, "Discovered:");
|
|
818
727
|
i0.ɵɵelementEnd();
|
|
819
|
-
i0.ɵɵelementStart(11, "span",
|
|
728
|
+
i0.ɵɵelementStart(11, "span", 119);
|
|
820
729
|
i0.ɵɵtext(12);
|
|
821
730
|
i0.ɵɵelementEnd()();
|
|
822
|
-
i0.ɵɵelementStart(13, "div",
|
|
731
|
+
i0.ɵɵelementStart(13, "div", 134)(14, "span", 117);
|
|
823
732
|
i0.ɵɵtext(15, "Required Params:");
|
|
824
733
|
i0.ɵɵelementEnd();
|
|
825
|
-
i0.ɵɵelementStart(16, "span",
|
|
734
|
+
i0.ɵɵelementStart(16, "span", 119);
|
|
826
735
|
i0.ɵɵtext(17);
|
|
827
736
|
i0.ɵɵelementEnd()();
|
|
828
|
-
i0.ɵɵ
|
|
737
|
+
i0.ɵɵconditionalCreate(18, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Conditional_18_Template, 5, 1, "div", 135);
|
|
829
738
|
i0.ɵɵelementEnd()()();
|
|
830
739
|
} if (rf & 2) {
|
|
831
740
|
const tool_r22 = i0.ɵɵnextContext().$implicit;
|
|
832
|
-
const
|
|
741
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
833
742
|
i0.ɵɵadvance(7);
|
|
834
743
|
i0.ɵɵtextInterpolate(tool_r22.ToolName);
|
|
835
744
|
i0.ɵɵadvance(5);
|
|
836
|
-
i0.ɵɵtextInterpolate(
|
|
745
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r22.DiscoveredAt));
|
|
837
746
|
i0.ɵɵadvance(5);
|
|
838
|
-
i0.ɵɵtextInterpolate(
|
|
747
|
+
i0.ɵɵtextInterpolate(ctx_r1.getRequiredParamCount(tool_r22));
|
|
839
748
|
i0.ɵɵadvance();
|
|
840
749
|
i0.ɵɵconditional(tool_r22.InputSchema ? 18 : -1);
|
|
841
750
|
} }
|
|
842
|
-
function
|
|
751
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template(rf, ctx) { if (rf & 1) {
|
|
843
752
|
const _r21 = i0.ɵɵgetCurrentView();
|
|
844
|
-
i0.ɵɵelementStart(0, "tr")(1, "td",
|
|
845
|
-
i0.ɵɵelement(2, "i",
|
|
846
|
-
i0.ɵɵelementStart(3, "div",
|
|
847
|
-
i0.ɵɵelement(4, "span",
|
|
753
|
+
i0.ɵɵelementStart(0, "tr")(1, "td", 122);
|
|
754
|
+
i0.ɵɵelement(2, "i", 15);
|
|
755
|
+
i0.ɵɵelementStart(3, "div", 123);
|
|
756
|
+
i0.ɵɵelement(4, "span", 124);
|
|
848
757
|
i0.ɵɵpipe(5, "async");
|
|
849
758
|
i0.ɵɵpipe(6, "highlightSearch");
|
|
850
|
-
i0.ɵɵ
|
|
759
|
+
i0.ɵɵconditionalCreate(7, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_7_Template, 2, 1, "span", 125);
|
|
851
760
|
i0.ɵɵelementEnd()();
|
|
852
|
-
i0.ɵɵelement(8, "td",
|
|
761
|
+
i0.ɵɵelement(8, "td", 126);
|
|
853
762
|
i0.ɵɵpipe(9, "async");
|
|
854
763
|
i0.ɵɵpipe(10, "highlightSearch");
|
|
855
|
-
i0.ɵɵelementStart(11, "td")(12, "span",
|
|
764
|
+
i0.ɵɵelementStart(11, "td")(12, "span", 127);
|
|
856
765
|
i0.ɵɵtext(13);
|
|
857
766
|
i0.ɵɵelementEnd()();
|
|
858
|
-
i0.ɵɵelementStart(14, "td")(15, "span",
|
|
767
|
+
i0.ɵɵelementStart(14, "td")(15, "span", 100);
|
|
859
768
|
i0.ɵɵtext(16);
|
|
860
769
|
i0.ɵɵelementEnd()();
|
|
861
770
|
i0.ɵɵelementStart(17, "td");
|
|
862
771
|
i0.ɵɵtext(18);
|
|
863
772
|
i0.ɵɵelementEnd();
|
|
864
|
-
i0.ɵɵelementStart(19, "td",
|
|
865
|
-
i0.ɵɵlistener("click", function
|
|
866
|
-
i0.ɵɵelement(21, "i",
|
|
773
|
+
i0.ɵɵelementStart(19, "td", 128)(20, "button", 129);
|
|
774
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_20_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(tool_r22)); });
|
|
775
|
+
i0.ɵɵelement(21, "i", 38);
|
|
867
776
|
i0.ɵɵelementEnd();
|
|
868
|
-
i0.ɵɵelementStart(22, "button",
|
|
869
|
-
i0.ɵɵlistener("click", function
|
|
870
|
-
i0.ɵɵelement(23, "i",
|
|
777
|
+
i0.ɵɵelementStart(22, "button", 130);
|
|
778
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template_button_click_22_listener() { const tool_r22 = i0.ɵɵrestoreView(_r21).$implicit; const ctx_r1 = i0.ɵɵnextContext(7); return i0.ɵɵresetView(ctx_r1.toggleToolExpand(tool_r22)); });
|
|
779
|
+
i0.ɵɵelement(23, "i", 114);
|
|
871
780
|
i0.ɵɵelementEnd()()();
|
|
872
|
-
i0.ɵɵ
|
|
781
|
+
i0.ɵɵconditionalCreate(24, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Conditional_24_Template, 19, 4, "tr", 131);
|
|
873
782
|
} if (rf & 2) {
|
|
874
783
|
let tmp_26_0;
|
|
875
784
|
let tmp_28_0;
|
|
876
785
|
const tool_r22 = ctx.$implicit;
|
|
877
|
-
const
|
|
878
|
-
i0.ɵɵclassProp("expanded",
|
|
786
|
+
const ctx_r1 = i0.ɵɵnextContext(7);
|
|
787
|
+
i0.ɵɵclassProp("expanded", ctx_r1.isToolExpanded(tool_r22));
|
|
879
788
|
i0.ɵɵadvance(4);
|
|
880
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 16, tool_r22.ToolTitle || tool_r22.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 14,
|
|
789
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(6, 16, tool_r22.ToolTitle || tool_r22.ToolName, (tmp_26_0 = i0.ɵɵpipeBind1(5, 14, ctx_r1.filters$)) == null ? null : tmp_26_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
881
790
|
i0.ɵɵadvance(3);
|
|
882
791
|
i0.ɵɵconditional(tool_r22.ToolTitle ? 7 : -1);
|
|
883
792
|
i0.ɵɵadvance();
|
|
884
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(10, 21, tool_r22.ToolDescription || "-", (tmp_28_0 = i0.ɵɵpipeBind1(9, 19,
|
|
793
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind2(10, 21, tool_r22.ToolDescription || "-", (tmp_28_0 = i0.ɵɵpipeBind1(9, 19, ctx_r1.filters$)) == null ? null : tmp_28_0.searchTerm), i0.ɵɵsanitizeHtml);
|
|
885
794
|
i0.ɵɵadvance(5);
|
|
886
|
-
i0.ɵɵtextInterpolate(
|
|
795
|
+
i0.ɵɵtextInterpolate(ctx_r1.getParamCount(tool_r22));
|
|
887
796
|
i0.ɵɵadvance(2);
|
|
888
|
-
i0.ɵɵproperty("ngClass",
|
|
797
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(tool_r22.Status));
|
|
889
798
|
i0.ɵɵadvance();
|
|
890
799
|
i0.ɵɵtextInterpolate1(" ", tool_r22.Status, " ");
|
|
891
800
|
i0.ɵɵadvance(2);
|
|
892
|
-
i0.ɵɵtextInterpolate(
|
|
801
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(tool_r22.LastSeenAt));
|
|
893
802
|
i0.ɵɵadvance(5);
|
|
894
|
-
i0.ɵɵclassProp("fa-chevron-down", !
|
|
803
|
+
i0.ɵɵclassProp("fa-chevron-down", !ctx_r1.isToolExpanded(tool_r22))("fa-chevron-up", ctx_r1.isToolExpanded(tool_r22));
|
|
895
804
|
i0.ɵɵadvance();
|
|
896
|
-
i0.ɵɵconditional(
|
|
805
|
+
i0.ɵɵconditional(ctx_r1.isToolExpanded(tool_r22) ? 24 : -1);
|
|
897
806
|
} }
|
|
898
|
-
function
|
|
899
|
-
i0.ɵɵelementStart(0, "div",
|
|
807
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
808
|
+
i0.ɵɵelementStart(0, "div", 104)(1, "table")(2, "thead")(3, "tr")(4, "th");
|
|
900
809
|
i0.ɵɵtext(5, "Tool");
|
|
901
810
|
i0.ɵɵelementEnd();
|
|
902
811
|
i0.ɵɵelementStart(6, "th");
|
|
@@ -915,110 +824,110 @@ function MCPDashboardComponent_Conditional_70_Case_2_Conditional_1_For_2_Conditi
|
|
|
915
824
|
i0.ɵɵtext(15, "Actions");
|
|
916
825
|
i0.ɵɵelementEnd()()();
|
|
917
826
|
i0.ɵɵelementStart(16, "tbody");
|
|
918
|
-
i0.ɵɵrepeaterCreate(17,
|
|
827
|
+
i0.ɵɵrepeaterCreate(17, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_For_18_Template, 25, 24, null, null, _forTrack0);
|
|
919
828
|
i0.ɵɵelementEnd()()();
|
|
920
829
|
} if (rf & 2) {
|
|
921
830
|
const group_r18 = i0.ɵɵnextContext(2).$implicit;
|
|
922
831
|
i0.ɵɵadvance(17);
|
|
923
832
|
i0.ɵɵrepeater(group_r18.tools);
|
|
924
833
|
} }
|
|
925
|
-
function
|
|
926
|
-
i0.ɵɵ
|
|
834
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
835
|
+
i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_0_Template, 3, 0, "div", 103)(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Conditional_1_Template, 19, 0, "div", 104);
|
|
927
836
|
} if (rf & 2) {
|
|
928
|
-
const
|
|
929
|
-
i0.ɵɵconditional(
|
|
837
|
+
const ctx_r1 = i0.ɵɵnextContext(5);
|
|
838
|
+
i0.ɵɵconditional(ctx_r1.ToolsViewMode === "card" ? 0 : 1);
|
|
930
839
|
} }
|
|
931
|
-
function
|
|
840
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
932
841
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
933
|
-
i0.ɵɵelementStart(0, "div",
|
|
934
|
-
i0.ɵɵlistener("click", function
|
|
935
|
-
i0.ɵɵelementStart(2, "div",
|
|
936
|
-
i0.ɵɵelement(3, "i",
|
|
937
|
-
i0.ɵɵelementStart(5, "span",
|
|
842
|
+
i0.ɵɵelementStart(0, "div", 94)(1, "div", 95);
|
|
843
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_div_click_1_listener() { const group_r18 = i0.ɵɵrestoreView(_r17).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.toggleServerGroup(group_r18)); });
|
|
844
|
+
i0.ɵɵelementStart(2, "div", 96);
|
|
845
|
+
i0.ɵɵelement(3, "i", 97)(4, "i");
|
|
846
|
+
i0.ɵɵelementStart(5, "span", 98);
|
|
938
847
|
i0.ɵɵtext(6);
|
|
939
848
|
i0.ɵɵelementEnd();
|
|
940
|
-
i0.ɵɵelementStart(7, "span",
|
|
849
|
+
i0.ɵɵelementStart(7, "span", 99);
|
|
941
850
|
i0.ɵɵtext(8);
|
|
942
851
|
i0.ɵɵelementEnd();
|
|
943
|
-
i0.ɵɵelementStart(9, "span",
|
|
852
|
+
i0.ɵɵelementStart(9, "span", 100);
|
|
944
853
|
i0.ɵɵtext(10);
|
|
945
854
|
i0.ɵɵelementEnd()();
|
|
946
|
-
i0.ɵɵelementStart(11, "div",
|
|
947
|
-
i0.ɵɵlistener("click", function
|
|
948
|
-
i0.ɵɵelementStart(12, "button",
|
|
949
|
-
i0.ɵɵlistener("click", function
|
|
950
|
-
i0.ɵɵelement(13, "i",
|
|
855
|
+
i0.ɵɵelementStart(11, "div", 101);
|
|
856
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_div_click_11_listener($event) { i0.ɵɵrestoreView(_r17); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
857
|
+
i0.ɵɵelementStart(12, "button", 102);
|
|
858
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.openTestToolDialog(undefined, undefined)); });
|
|
859
|
+
i0.ɵɵelement(13, "i", 38);
|
|
951
860
|
i0.ɵɵelementEnd()()();
|
|
952
|
-
i0.ɵɵ
|
|
861
|
+
i0.ɵɵconditionalCreate(14, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Conditional_14_Template, 2, 1);
|
|
953
862
|
i0.ɵɵelementEnd();
|
|
954
863
|
} if (rf & 2) {
|
|
955
864
|
const group_r18 = ctx.$implicit;
|
|
956
|
-
const
|
|
865
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
957
866
|
i0.ɵɵclassProp("collapsed", !group_r18.expanded);
|
|
958
867
|
i0.ɵɵadvance(3);
|
|
959
868
|
i0.ɵɵclassProp("expanded", group_r18.expanded);
|
|
960
869
|
i0.ɵɵadvance();
|
|
961
|
-
i0.ɵɵclassMap(
|
|
870
|
+
i0.ɵɵclassMap(ctx_r1.getTransportIcon(group_r18.server.TransportType));
|
|
962
871
|
i0.ɵɵadvance(2);
|
|
963
872
|
i0.ɵɵtextInterpolate(group_r18.server.Name);
|
|
964
873
|
i0.ɵɵadvance(2);
|
|
965
874
|
i0.ɵɵtextInterpolate1("", group_r18.tools.length, " tools");
|
|
966
875
|
i0.ɵɵadvance();
|
|
967
|
-
i0.ɵɵproperty("ngClass",
|
|
876
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(group_r18.server.Status));
|
|
968
877
|
i0.ɵɵadvance();
|
|
969
878
|
i0.ɵɵtextInterpolate1(" ", group_r18.server.Status, " ");
|
|
970
879
|
i0.ɵɵadvance(4);
|
|
971
880
|
i0.ɵɵconditional(group_r18.expanded ? 14 : -1);
|
|
972
881
|
} }
|
|
973
|
-
function
|
|
974
|
-
i0.ɵɵelementStart(0, "div",
|
|
975
|
-
i0.ɵɵrepeaterCreate(1,
|
|
882
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
883
|
+
i0.ɵɵelementStart(0, "div", 91);
|
|
884
|
+
i0.ɵɵrepeaterCreate(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_For_2_Template, 15, 11, "div", 93, _forTrack1);
|
|
976
885
|
i0.ɵɵelementEnd();
|
|
977
886
|
} if (rf & 2) {
|
|
978
|
-
const
|
|
887
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
979
888
|
i0.ɵɵadvance();
|
|
980
|
-
i0.ɵɵrepeater(
|
|
889
|
+
i0.ɵɵrepeater(ctx_r1.ServerGroups);
|
|
981
890
|
} }
|
|
982
|
-
function
|
|
983
|
-
i0.ɵɵ
|
|
891
|
+
function MCPDashboardComponent_Conditional_50_Case_2_Template(rf, ctx) { if (rf & 1) {
|
|
892
|
+
i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_2_Conditional_0_Template, 6, 0, "div", 47)(1, MCPDashboardComponent_Conditional_50_Case_2_Conditional_1_Template, 3, 0, "div", 91);
|
|
984
893
|
} if (rf & 2) {
|
|
985
|
-
const
|
|
986
|
-
i0.ɵɵconditional(
|
|
894
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
895
|
+
i0.ɵɵconditional(ctx_r1.ServerGroups.length === 0 ? 0 : 1);
|
|
987
896
|
} }
|
|
988
|
-
function
|
|
989
|
-
i0.ɵɵelementStart(0, "div",
|
|
990
|
-
i0.ɵɵelement(1, "i",
|
|
897
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
898
|
+
i0.ɵɵelementStart(0, "div", 47);
|
|
899
|
+
i0.ɵɵelement(1, "i", 16);
|
|
991
900
|
i0.ɵɵelementStart(2, "p");
|
|
992
901
|
i0.ɵɵtext(3, "No recent execution logs");
|
|
993
902
|
i0.ɵɵelementEnd();
|
|
994
|
-
i0.ɵɵelementStart(4, "span",
|
|
903
|
+
i0.ɵɵelementStart(4, "span", 92);
|
|
995
904
|
i0.ɵɵtext(5, "Logs appear when tools are executed via MCP connections");
|
|
996
905
|
i0.ɵɵelementEnd()();
|
|
997
906
|
} }
|
|
998
|
-
function
|
|
999
|
-
i0.ɵɵelement(0, "i",
|
|
907
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_3_Template(rf, ctx) { if (rf & 1) {
|
|
908
|
+
i0.ɵɵelement(0, "i", 88);
|
|
1000
909
|
} }
|
|
1001
|
-
function
|
|
1002
|
-
i0.ɵɵelement(0, "i",
|
|
910
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_4_Template(rf, ctx) { if (rf & 1) {
|
|
911
|
+
i0.ɵɵelement(0, "i", 140);
|
|
1003
912
|
} }
|
|
1004
|
-
function
|
|
1005
|
-
i0.ɵɵelement(0, "i",
|
|
913
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_5_Template(rf, ctx) { if (rf & 1) {
|
|
914
|
+
i0.ɵɵelement(0, "i", 141);
|
|
1006
915
|
} }
|
|
1007
|
-
function
|
|
1008
|
-
i0.ɵɵelement(0, "i",
|
|
916
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_6_Template(rf, ctx) { if (rf & 1) {
|
|
917
|
+
i0.ɵɵelement(0, "i", 142);
|
|
1009
918
|
} }
|
|
1010
|
-
function
|
|
919
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template(rf, ctx) { if (rf & 1) {
|
|
1011
920
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
1012
|
-
i0.ɵɵelementStart(0, "tr",
|
|
1013
|
-
i0.ɵɵlistener("click", function
|
|
1014
|
-
i0.ɵɵelementStart(1, "td")(2, "span",
|
|
1015
|
-
i0.ɵɵ
|
|
921
|
+
i0.ɵɵelementStart(0, "tr", 139);
|
|
922
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template_tr_click_0_listener() { const log_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r1.onLogClick(log_r25)); });
|
|
923
|
+
i0.ɵɵelementStart(1, "td")(2, "span", 54);
|
|
924
|
+
i0.ɵɵconditionalCreate(3, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_3_Template, 1, 0, "i", 88)(4, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_4_Template, 1, 0, "i", 140)(5, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_5_Template, 1, 0, "i", 141)(6, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Case_6_Template, 1, 0, "i", 142);
|
|
1016
925
|
i0.ɵɵtext(7);
|
|
1017
926
|
i0.ɵɵelementEnd()();
|
|
1018
|
-
i0.ɵɵelementStart(8, "td",
|
|
927
|
+
i0.ɵɵelementStart(8, "td", 98);
|
|
1019
928
|
i0.ɵɵtext(9);
|
|
1020
929
|
i0.ɵɵelementEnd();
|
|
1021
|
-
i0.ɵɵelementStart(10, "td",
|
|
930
|
+
i0.ɵɵelementStart(10, "td", 143);
|
|
1022
931
|
i0.ɵɵtext(11);
|
|
1023
932
|
i0.ɵɵelementEnd();
|
|
1024
933
|
i0.ɵɵelementStart(12, "td");
|
|
@@ -1030,19 +939,19 @@ function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Templa
|
|
|
1030
939
|
i0.ɵɵelementStart(16, "td");
|
|
1031
940
|
i0.ɵɵtext(17);
|
|
1032
941
|
i0.ɵɵelementEnd();
|
|
1033
|
-
i0.ɵɵelementStart(18, "td",
|
|
942
|
+
i0.ɵɵelementStart(18, "td", 144);
|
|
1034
943
|
i0.ɵɵtext(19);
|
|
1035
944
|
i0.ɵɵelementEnd();
|
|
1036
|
-
i0.ɵɵelementStart(20, "td",
|
|
1037
|
-
i0.ɵɵelement(21, "i",
|
|
945
|
+
i0.ɵɵelementStart(20, "td", 145);
|
|
946
|
+
i0.ɵɵelement(21, "i", 146);
|
|
1038
947
|
i0.ɵɵelementEnd()();
|
|
1039
948
|
} if (rf & 2) {
|
|
1040
949
|
let tmp_15_0;
|
|
1041
950
|
const log_r25 = ctx.$implicit;
|
|
1042
|
-
const
|
|
951
|
+
const ctx_r1 = i0.ɵɵnextContext(4);
|
|
1043
952
|
i0.ɵɵclassProp("error-row", log_r25.Status === "Error");
|
|
1044
953
|
i0.ɵɵadvance(2);
|
|
1045
|
-
i0.ɵɵproperty("ngClass",
|
|
954
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getStatusClass(log_r25.Status));
|
|
1046
955
|
i0.ɵɵadvance();
|
|
1047
956
|
i0.ɵɵconditional((tmp_15_0 = log_r25.Status) === "Success" ? 3 : tmp_15_0 === "Error" ? 4 : tmp_15_0 === "Running" ? 5 : 6);
|
|
1048
957
|
i0.ɵɵadvance(4);
|
|
@@ -1054,140 +963,140 @@ function MCPDashboardComponent_Conditional_70_Case_3_Conditional_2_For_27_Templa
|
|
|
1054
963
|
i0.ɵɵadvance(2);
|
|
1055
964
|
i0.ɵɵtextInterpolate(log_r25.ConnectionName);
|
|
1056
965
|
i0.ɵɵadvance(2);
|
|
1057
|
-
i0.ɵɵtextInterpolate(
|
|
966
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDate(log_r25.StartedAt));
|
|
1058
967
|
i0.ɵɵadvance(2);
|
|
1059
|
-
i0.ɵɵtextInterpolate(
|
|
968
|
+
i0.ɵɵtextInterpolate(ctx_r1.formatDuration(log_r25.DurationMs));
|
|
1060
969
|
i0.ɵɵadvance();
|
|
1061
970
|
i0.ɵɵproperty("title", log_r25.ErrorMessage || "");
|
|
1062
971
|
i0.ɵɵadvance();
|
|
1063
972
|
i0.ɵɵtextInterpolate1(" ", log_r25.ErrorMessage || "-", " ");
|
|
1064
973
|
} }
|
|
1065
|
-
function
|
|
974
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
1066
975
|
const _r23 = i0.ɵɵgetCurrentView();
|
|
1067
|
-
i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th",
|
|
1068
|
-
i0.ɵɵlistener("click", function
|
|
976
|
+
i0.ɵɵelementStart(0, "table")(1, "thead")(2, "tr")(3, "th", 136);
|
|
977
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_3_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("status")); });
|
|
1069
978
|
i0.ɵɵtext(4, " Status ");
|
|
1070
|
-
i0.ɵɵelement(5, "i",
|
|
979
|
+
i0.ɵɵelement(5, "i", 137);
|
|
1071
980
|
i0.ɵɵelementEnd();
|
|
1072
|
-
i0.ɵɵelementStart(6, "th",
|
|
1073
|
-
i0.ɵɵlistener("click", function
|
|
981
|
+
i0.ɵɵelementStart(6, "th", 136);
|
|
982
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_6_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("server")); });
|
|
1074
983
|
i0.ɵɵtext(7, " Server ");
|
|
1075
|
-
i0.ɵɵelement(8, "i",
|
|
984
|
+
i0.ɵɵelement(8, "i", 137);
|
|
1076
985
|
i0.ɵɵelementEnd();
|
|
1077
|
-
i0.ɵɵelementStart(9, "th",
|
|
1078
|
-
i0.ɵɵlistener("click", function
|
|
986
|
+
i0.ɵɵelementStart(9, "th", 136);
|
|
987
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_9_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("tool")); });
|
|
1079
988
|
i0.ɵɵtext(10, " Tool ");
|
|
1080
|
-
i0.ɵɵelement(11, "i",
|
|
989
|
+
i0.ɵɵelement(11, "i", 137);
|
|
1081
990
|
i0.ɵɵelementEnd();
|
|
1082
|
-
i0.ɵɵelementStart(12, "th",
|
|
1083
|
-
i0.ɵɵlistener("click", function
|
|
991
|
+
i0.ɵɵelementStart(12, "th", 136);
|
|
992
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_12_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("connection")); });
|
|
1084
993
|
i0.ɵɵtext(13, " Connection ");
|
|
1085
|
-
i0.ɵɵelement(14, "i",
|
|
994
|
+
i0.ɵɵelement(14, "i", 137);
|
|
1086
995
|
i0.ɵɵelementEnd();
|
|
1087
|
-
i0.ɵɵelementStart(15, "th",
|
|
1088
|
-
i0.ɵɵlistener("click", function
|
|
996
|
+
i0.ɵɵelementStart(15, "th", 136);
|
|
997
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_15_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("started")); });
|
|
1089
998
|
i0.ɵɵtext(16, " Started ");
|
|
1090
|
-
i0.ɵɵelement(17, "i",
|
|
999
|
+
i0.ɵɵelement(17, "i", 137);
|
|
1091
1000
|
i0.ɵɵelementEnd();
|
|
1092
|
-
i0.ɵɵelementStart(18, "th",
|
|
1093
|
-
i0.ɵɵlistener("click", function
|
|
1001
|
+
i0.ɵɵelementStart(18, "th", 136);
|
|
1002
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_18_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("duration")); });
|
|
1094
1003
|
i0.ɵɵtext(19, " Duration ");
|
|
1095
|
-
i0.ɵɵelement(20, "i",
|
|
1004
|
+
i0.ɵɵelement(20, "i", 137);
|
|
1096
1005
|
i0.ɵɵelementEnd();
|
|
1097
|
-
i0.ɵɵelementStart(21, "th",
|
|
1098
|
-
i0.ɵɵlistener("click", function
|
|
1006
|
+
i0.ɵɵelementStart(21, "th", 136);
|
|
1007
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template_th_click_21_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onLogSortColumn("error")); });
|
|
1099
1008
|
i0.ɵɵtext(22, " Error ");
|
|
1100
|
-
i0.ɵɵelement(23, "i",
|
|
1009
|
+
i0.ɵɵelement(23, "i", 137);
|
|
1101
1010
|
i0.ɵɵelementEnd();
|
|
1102
1011
|
i0.ɵɵelement(24, "th");
|
|
1103
1012
|
i0.ɵɵelementEnd()();
|
|
1104
1013
|
i0.ɵɵelementStart(25, "tbody");
|
|
1105
|
-
i0.ɵɵrepeaterCreate(26,
|
|
1014
|
+
i0.ɵɵrepeaterCreate(26, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_For_27_Template, 22, 12, "tr", 138, _forTrack0);
|
|
1106
1015
|
i0.ɵɵelementEnd()();
|
|
1107
1016
|
} if (rf & 2) {
|
|
1108
|
-
const
|
|
1017
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
1109
1018
|
i0.ɵɵadvance(3);
|
|
1110
|
-
i0.ɵɵproperty("ngClass",
|
|
1019
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("status"));
|
|
1111
1020
|
i0.ɵɵadvance(2);
|
|
1112
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
1021
|
+
i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "status" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "status" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "status");
|
|
1113
1022
|
i0.ɵɵadvance();
|
|
1114
|
-
i0.ɵɵproperty("ngClass",
|
|
1023
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("server"));
|
|
1115
1024
|
i0.ɵɵadvance(2);
|
|
1116
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
1025
|
+
i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "server" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "server" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "server");
|
|
1117
1026
|
i0.ɵɵadvance();
|
|
1118
|
-
i0.ɵɵproperty("ngClass",
|
|
1027
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("tool"));
|
|
1119
1028
|
i0.ɵɵadvance(2);
|
|
1120
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
1029
|
+
i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "tool" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "tool" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "tool");
|
|
1121
1030
|
i0.ɵɵadvance();
|
|
1122
|
-
i0.ɵɵproperty("ngClass",
|
|
1031
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("connection"));
|
|
1123
1032
|
i0.ɵɵadvance(2);
|
|
1124
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
1033
|
+
i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "connection" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "connection" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "connection");
|
|
1125
1034
|
i0.ɵɵadvance();
|
|
1126
|
-
i0.ɵɵproperty("ngClass",
|
|
1035
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("started"));
|
|
1127
1036
|
i0.ɵɵadvance(2);
|
|
1128
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
1037
|
+
i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "started" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "started" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "started");
|
|
1129
1038
|
i0.ɵɵadvance();
|
|
1130
|
-
i0.ɵɵproperty("ngClass",
|
|
1039
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("duration"));
|
|
1131
1040
|
i0.ɵɵadvance(2);
|
|
1132
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
1041
|
+
i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "duration" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "duration" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "duration");
|
|
1133
1042
|
i0.ɵɵadvance();
|
|
1134
|
-
i0.ɵɵproperty("ngClass",
|
|
1043
|
+
i0.ɵɵproperty("ngClass", ctx_r1.getLogSortClass("error"));
|
|
1135
1044
|
i0.ɵɵadvance(2);
|
|
1136
|
-
i0.ɵɵclassProp("fa-sort-up",
|
|
1045
|
+
i0.ɵɵclassProp("fa-sort-up", ctx_r1.LogsSortColumn === "error" && ctx_r1.LogsSortAscending)("fa-sort-down", ctx_r1.LogsSortColumn === "error" && !ctx_r1.LogsSortAscending)("fa-sort", ctx_r1.LogsSortColumn !== "error");
|
|
1137
1046
|
i0.ɵɵadvance(3);
|
|
1138
|
-
i0.ɵɵrepeater(
|
|
1047
|
+
i0.ɵɵrepeater(ctx_r1.filteredLogs);
|
|
1139
1048
|
} }
|
|
1140
|
-
function
|
|
1141
|
-
i0.ɵɵelementStart(0, "div",
|
|
1142
|
-
i0.ɵɵ
|
|
1049
|
+
function MCPDashboardComponent_Conditional_50_Case_3_Template(rf, ctx) { if (rf & 1) {
|
|
1050
|
+
i0.ɵɵelementStart(0, "div", 46);
|
|
1051
|
+
i0.ɵɵconditionalCreate(1, MCPDashboardComponent_Conditional_50_Case_3_Conditional_1_Template, 6, 0, "div", 47)(2, MCPDashboardComponent_Conditional_50_Case_3_Conditional_2_Template, 28, 49, "table");
|
|
1143
1052
|
i0.ɵɵelementEnd();
|
|
1144
1053
|
} if (rf & 2) {
|
|
1145
|
-
const
|
|
1054
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
1146
1055
|
i0.ɵɵadvance();
|
|
1147
|
-
i0.ɵɵconditional(
|
|
1056
|
+
i0.ɵɵconditional(ctx_r1.filteredLogs.length === 0 ? 1 : 2);
|
|
1148
1057
|
} }
|
|
1149
|
-
function
|
|
1150
|
-
i0.ɵɵ
|
|
1058
|
+
function MCPDashboardComponent_Conditional_50_Template(rf, ctx) { if (rf & 1) {
|
|
1059
|
+
i0.ɵɵconditionalCreate(0, MCPDashboardComponent_Conditional_50_Case_0_Template, 3, 1, "div", 44)(1, MCPDashboardComponent_Conditional_50_Case_1_Template, 3, 1, "div", 45)(2, MCPDashboardComponent_Conditional_50_Case_2_Template, 2, 1)(3, MCPDashboardComponent_Conditional_50_Case_3_Template, 3, 1, "div", 46);
|
|
1151
1060
|
} if (rf & 2) {
|
|
1152
1061
|
let tmp_1_0;
|
|
1153
|
-
const
|
|
1154
|
-
i0.ɵɵconditional((tmp_1_0 =
|
|
1062
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
1063
|
+
i0.ɵɵconditional((tmp_1_0 = ctx_r1.ActiveTab) === "servers" ? 0 : tmp_1_0 === "connections" ? 1 : tmp_1_0 === "tools" ? 2 : tmp_1_0 === "logs" ? 3 : -1);
|
|
1155
1064
|
} }
|
|
1156
|
-
function
|
|
1065
|
+
function MCPDashboardComponent_Conditional_51_Template(rf, ctx) { if (rf & 1) {
|
|
1157
1066
|
const _r26 = i0.ɵɵgetCurrentView();
|
|
1158
|
-
i0.ɵɵelementStart(0, "mj-mcp-server-dialog",
|
|
1159
|
-
i0.ɵɵlistener("close", function
|
|
1067
|
+
i0.ɵɵelementStart(0, "mj-mcp-server-dialog", 147);
|
|
1068
|
+
i0.ɵɵlistener("close", function MCPDashboardComponent_Conditional_51_Template_mj_mcp_server_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r26); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onServerDialogClose($event)); });
|
|
1160
1069
|
i0.ɵɵelementEnd();
|
|
1161
1070
|
} if (rf & 2) {
|
|
1162
|
-
const
|
|
1163
|
-
i0.ɵɵproperty("server",
|
|
1071
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
1072
|
+
i0.ɵɵproperty("server", ctx_r1.EditingServer)("visible", ctx_r1.ShowServerDialog);
|
|
1164
1073
|
} }
|
|
1165
|
-
function
|
|
1074
|
+
function MCPDashboardComponent_Conditional_52_Template(rf, ctx) { if (rf & 1) {
|
|
1166
1075
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
1167
|
-
i0.ɵɵelementStart(0, "mj-mcp-connection-dialog",
|
|
1168
|
-
i0.ɵɵlistener("close", function
|
|
1076
|
+
i0.ɵɵelementStart(0, "mj-mcp-connection-dialog", 148);
|
|
1077
|
+
i0.ɵɵlistener("close", function MCPDashboardComponent_Conditional_52_Template_mj_mcp_connection_dialog_close_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onConnectionDialogClose($event)); });
|
|
1169
1078
|
i0.ɵɵelementEnd();
|
|
1170
1079
|
} if (rf & 2) {
|
|
1171
|
-
const
|
|
1172
|
-
i0.ɵɵproperty("connection",
|
|
1080
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
1081
|
+
i0.ɵɵproperty("connection", ctx_r1.EditingConnection)("servers", ctx_r1.servers)("visible", ctx_r1.ShowConnectionDialog);
|
|
1173
1082
|
} }
|
|
1174
|
-
function
|
|
1083
|
+
function MCPDashboardComponent_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
1175
1084
|
const _r28 = i0.ɵɵgetCurrentView();
|
|
1176
|
-
i0.ɵɵelementStart(0, "mj-mcp-test-tool-dialog",
|
|
1177
|
-
i0.ɵɵlistener("Close", function
|
|
1085
|
+
i0.ɵɵelementStart(0, "mj-mcp-test-tool-dialog", 149);
|
|
1086
|
+
i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_53_Template_mj_mcp_test_tool_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestToolDialogClose()); });
|
|
1178
1087
|
i0.ɵɵelementEnd();
|
|
1179
1088
|
} if (rf & 2) {
|
|
1180
|
-
const
|
|
1181
|
-
i0.ɵɵproperty("Visible",
|
|
1089
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
1090
|
+
i0.ɵɵproperty("Visible", ctx_r1.ShowTestToolDialog)("Servers", ctx_r1.servers)("Connections", ctx_r1.connections)("Tools", ctx_r1.tools)("SelectedServerID", ctx_r1.TestToolServerID)("SelectedConnectionID", ctx_r1.TestToolConnectionID)("SelectedToolID", ctx_r1.TestToolID);
|
|
1182
1091
|
} }
|
|
1183
|
-
function
|
|
1092
|
+
function MCPDashboardComponent_Conditional_54_Template(rf, ctx) { if (rf & 1) {
|
|
1184
1093
|
const _r29 = i0.ɵɵgetCurrentView();
|
|
1185
|
-
i0.ɵɵelementStart(0, "mj-mcp-log-detail-panel",
|
|
1186
|
-
i0.ɵɵlistener("Close", function
|
|
1094
|
+
i0.ɵɵelementStart(0, "mj-mcp-log-detail-panel", 150);
|
|
1095
|
+
i0.ɵɵlistener("Close", function MCPDashboardComponent_Conditional_54_Template_mj_mcp_log_detail_panel_Close_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLogDetailClose()); })("RunAgain", function MCPDashboardComponent_Conditional_54_Template_mj_mcp_log_detail_panel_RunAgain_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRunAgainFromLog($event)); });
|
|
1187
1096
|
i0.ɵɵelementEnd();
|
|
1188
1097
|
} if (rf & 2) {
|
|
1189
|
-
const
|
|
1190
|
-
i0.ɵɵproperty("Visible",
|
|
1098
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
1099
|
+
i0.ɵɵproperty("Visible", ctx_r1.ShowLogDetailPanel)("Log", ctx_r1.SelectedLog);
|
|
1191
1100
|
} }
|
|
1192
1101
|
/**
|
|
1193
1102
|
* MCP Management Dashboard Component
|
|
@@ -1201,6 +1110,7 @@ function MCPDashboardComponent_Conditional_74_Template(rf, ctx) { if (rf & 1) {
|
|
|
1201
1110
|
let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
1202
1111
|
cdr;
|
|
1203
1112
|
router;
|
|
1113
|
+
route;
|
|
1204
1114
|
navigationService;
|
|
1205
1115
|
mcpToolsService;
|
|
1206
1116
|
// ========================================
|
|
@@ -1270,14 +1180,17 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1270
1180
|
// Sync state
|
|
1271
1181
|
SyncStates = new Map();
|
|
1272
1182
|
syncSubscriptions = new Map();
|
|
1183
|
+
// Filter panel state
|
|
1184
|
+
FilterPanelVisible = true;
|
|
1273
1185
|
// ========================================
|
|
1274
1186
|
// Lifecycle
|
|
1275
1187
|
// ========================================
|
|
1276
1188
|
destroy$ = new Subject();
|
|
1277
|
-
constructor(cdr, router, navigationService, mcpToolsService) {
|
|
1189
|
+
constructor(cdr, router, route, navigationService, mcpToolsService) {
|
|
1278
1190
|
super();
|
|
1279
1191
|
this.cdr = cdr;
|
|
1280
1192
|
this.router = router;
|
|
1193
|
+
this.route = route;
|
|
1281
1194
|
this.navigationService = navigationService;
|
|
1282
1195
|
this.mcpToolsService = mcpToolsService;
|
|
1283
1196
|
// Set up debounced settings persistence
|
|
@@ -1287,6 +1200,8 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1287
1200
|
}
|
|
1288
1201
|
async ngOnInit() {
|
|
1289
1202
|
await super.ngOnInit();
|
|
1203
|
+
// Check for OAuth completion redirect
|
|
1204
|
+
this.checkOAuthCompletion();
|
|
1290
1205
|
// Load saved user preferences first
|
|
1291
1206
|
this.loadUserPreferences();
|
|
1292
1207
|
// Parse initial URL state
|
|
@@ -1402,6 +1317,10 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1402
1317
|
toolStatus: prefs.toolStatus || 'all',
|
|
1403
1318
|
logStatus: prefs.logStatus || 'all'
|
|
1404
1319
|
});
|
|
1320
|
+
// Apply filter panel visibility
|
|
1321
|
+
if (prefs.filterPanelVisible !== undefined) {
|
|
1322
|
+
this.FilterPanelVisible = prefs.filterPanelVisible;
|
|
1323
|
+
}
|
|
1405
1324
|
}
|
|
1406
1325
|
/**
|
|
1407
1326
|
* Get current preferences as an object for saving
|
|
@@ -1418,7 +1337,8 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1418
1337
|
serverStatus: currentFilters.serverStatus,
|
|
1419
1338
|
connectionStatus: currentFilters.connectionStatus,
|
|
1420
1339
|
toolStatus: currentFilters.toolStatus,
|
|
1421
|
-
logStatus: currentFilters.logStatus
|
|
1340
|
+
logStatus: currentFilters.logStatus,
|
|
1341
|
+
filterPanelVisible: this.FilterPanelVisible
|
|
1422
1342
|
};
|
|
1423
1343
|
}
|
|
1424
1344
|
/**
|
|
@@ -1500,16 +1420,19 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1500
1420
|
/**
|
|
1501
1421
|
* Loads all dashboard data using MCPEngine for cached entities
|
|
1502
1422
|
* and RunView for execution logs (historical data loaded on-demand)
|
|
1423
|
+
* @param forceRefresh - If true, forces MCPEngine to reload from database (use after sync operations)
|
|
1503
1424
|
*/
|
|
1504
|
-
async loadAllData() {
|
|
1425
|
+
async loadAllData(forceRefresh = false) {
|
|
1505
1426
|
this.IsLoading = true;
|
|
1506
1427
|
this.ErrorMessage = null;
|
|
1507
1428
|
this.cdr.detectChanges();
|
|
1508
1429
|
try {
|
|
1509
1430
|
// Initialize MCPEngine and load execution logs in parallel
|
|
1431
|
+
// forceRefresh=true is needed after sync operations since backend changes
|
|
1432
|
+
// won't trigger local BaseEntity events
|
|
1510
1433
|
const rv = new RunView();
|
|
1511
1434
|
const [, logsResult] = await Promise.all([
|
|
1512
|
-
MCPEngine.Instance.Config(
|
|
1435
|
+
MCPEngine.Instance.Config(forceRefresh),
|
|
1513
1436
|
rv.RunView({
|
|
1514
1437
|
EntityName: 'MJ: MCP Tool Execution Logs',
|
|
1515
1438
|
ExtraFilter: `StartedAt >= DATEADD(day, -7, GETUTCDATE())`,
|
|
@@ -1530,7 +1453,14 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1530
1453
|
Status: s.Status,
|
|
1531
1454
|
RateLimitPerMinute: s.RateLimitPerMinute,
|
|
1532
1455
|
RateLimitPerHour: s.RateLimitPerHour,
|
|
1533
|
-
LastSyncAt: s.LastSyncAt
|
|
1456
|
+
LastSyncAt: s.LastSyncAt,
|
|
1457
|
+
// OAuth configuration fields
|
|
1458
|
+
OAuthIssuerURL: s.OAuthIssuerURL,
|
|
1459
|
+
OAuthScopes: s.OAuthScopes,
|
|
1460
|
+
OAuthMetadataCacheTTLMinutes: s.OAuthMetadataCacheTTLMinutes,
|
|
1461
|
+
OAuthClientID: s.OAuthClientID,
|
|
1462
|
+
OAuthClientSecretEncrypted: s.OAuthClientSecretEncrypted,
|
|
1463
|
+
OAuthRequirePKCE: s.OAuthRequirePKCE
|
|
1534
1464
|
}));
|
|
1535
1465
|
this.connections = MCPEngine.Instance.Connections.map(c => ({
|
|
1536
1466
|
ID: c.ID,
|
|
@@ -1739,6 +1669,64 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1739
1669
|
this.saveUserPreferencesDebounced();
|
|
1740
1670
|
}
|
|
1741
1671
|
// ========================================
|
|
1672
|
+
// Filter Panel
|
|
1673
|
+
// ========================================
|
|
1674
|
+
/**
|
|
1675
|
+
* Toggle filter panel visibility
|
|
1676
|
+
*/
|
|
1677
|
+
toggleFilterPanel() {
|
|
1678
|
+
this.FilterPanelVisible = !this.FilterPanelVisible;
|
|
1679
|
+
this.saveUserPreferencesDebounced();
|
|
1680
|
+
this.cdr.detectChanges();
|
|
1681
|
+
}
|
|
1682
|
+
/**
|
|
1683
|
+
* Handle filter changes from the filter panel component
|
|
1684
|
+
*/
|
|
1685
|
+
onFiltersChange(filters) {
|
|
1686
|
+
this.filters$.next(filters);
|
|
1687
|
+
this.saveUserPreferencesDebounced();
|
|
1688
|
+
}
|
|
1689
|
+
/**
|
|
1690
|
+
* Get the current filtered count based on active tab
|
|
1691
|
+
*/
|
|
1692
|
+
get CurrentFilteredCount() {
|
|
1693
|
+
switch (this.ActiveTab) {
|
|
1694
|
+
case 'servers':
|
|
1695
|
+
return this.filteredServers.length;
|
|
1696
|
+
case 'connections':
|
|
1697
|
+
return this.filteredConnections.length;
|
|
1698
|
+
case 'tools':
|
|
1699
|
+
return this.filteredTools.length;
|
|
1700
|
+
case 'logs':
|
|
1701
|
+
return this.filteredLogs.length;
|
|
1702
|
+
default:
|
|
1703
|
+
return 0;
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
/**
|
|
1707
|
+
* Get the total count based on active tab
|
|
1708
|
+
*/
|
|
1709
|
+
get CurrentTotalCount() {
|
|
1710
|
+
switch (this.ActiveTab) {
|
|
1711
|
+
case 'servers':
|
|
1712
|
+
return this.servers.length;
|
|
1713
|
+
case 'connections':
|
|
1714
|
+
return this.connections.length;
|
|
1715
|
+
case 'tools':
|
|
1716
|
+
return this.tools.length;
|
|
1717
|
+
case 'logs':
|
|
1718
|
+
return this.executionLogs.length;
|
|
1719
|
+
default:
|
|
1720
|
+
return 0;
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
/**
|
|
1724
|
+
* Get current filters value (non-observable)
|
|
1725
|
+
*/
|
|
1726
|
+
get CurrentFilters() {
|
|
1727
|
+
return this.filters$.value;
|
|
1728
|
+
}
|
|
1729
|
+
// ========================================
|
|
1742
1730
|
// Tab Navigation
|
|
1743
1731
|
// ========================================
|
|
1744
1732
|
/**
|
|
@@ -1765,23 +1753,225 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1765
1753
|
this.cdr.detectChanges();
|
|
1766
1754
|
}
|
|
1767
1755
|
async deleteServer(server) {
|
|
1768
|
-
|
|
1769
|
-
|
|
1756
|
+
// Check for related connections first
|
|
1757
|
+
const relatedConnections = this.connections.filter((c) => c.MCPServerID === server.ID);
|
|
1758
|
+
const relatedTools = this.tools.filter((t) => t.MCPServerID === server.ID);
|
|
1759
|
+
if (relatedConnections.length > 0 || relatedTools.length > 0) {
|
|
1760
|
+
const parts = [];
|
|
1761
|
+
if (relatedConnections.length > 0) {
|
|
1762
|
+
parts.push(`${relatedConnections.length} connection(s)`);
|
|
1763
|
+
}
|
|
1764
|
+
if (relatedTools.length > 0) {
|
|
1765
|
+
parts.push(`${relatedTools.length} tool(s)`);
|
|
1766
|
+
}
|
|
1767
|
+
if (!confirm(`Server "${server.Name}" has ${parts.join(' and ')}.\n\n` +
|
|
1768
|
+
`All related records will be deleted. Are you sure you want to proceed?`)) {
|
|
1769
|
+
return;
|
|
1770
|
+
}
|
|
1771
|
+
// Delete related connections first (which will cascade to connection tools/permissions)
|
|
1772
|
+
for (const conn of relatedConnections) {
|
|
1773
|
+
try {
|
|
1774
|
+
await this.deleteConnectionInternal(conn.ID);
|
|
1775
|
+
}
|
|
1776
|
+
catch (error) {
|
|
1777
|
+
this.ErrorMessage = `Failed to delete related connection "${conn.Name}": ${error instanceof Error ? error.message : String(error)}`;
|
|
1778
|
+
this.cdr.detectChanges();
|
|
1779
|
+
return;
|
|
1780
|
+
}
|
|
1781
|
+
}
|
|
1782
|
+
// Delete related tools
|
|
1783
|
+
for (const tool of relatedTools) {
|
|
1784
|
+
try {
|
|
1785
|
+
await this.deleteToolInternal(tool.ID);
|
|
1786
|
+
}
|
|
1787
|
+
catch (error) {
|
|
1788
|
+
this.ErrorMessage = `Failed to delete related tool "${tool.ToolName}": ${error instanceof Error ? error.message : String(error)}`;
|
|
1789
|
+
this.cdr.detectChanges();
|
|
1790
|
+
return;
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
}
|
|
1794
|
+
else {
|
|
1795
|
+
if (!confirm(`Are you sure you want to delete server "${server.Name}"?`)) {
|
|
1796
|
+
return;
|
|
1797
|
+
}
|
|
1770
1798
|
}
|
|
1771
1799
|
try {
|
|
1772
1800
|
const md = new Metadata();
|
|
1773
1801
|
const entity = await md.GetEntityObject('MJ: MCP Servers');
|
|
1774
|
-
const loaded = await entity.
|
|
1775
|
-
if (loaded) {
|
|
1776
|
-
|
|
1777
|
-
|
|
1802
|
+
const loaded = await entity.Load(server.ID);
|
|
1803
|
+
if (!loaded) {
|
|
1804
|
+
this.ErrorMessage = `Server not found: ${server.Name}`;
|
|
1805
|
+
this.cdr.detectChanges();
|
|
1806
|
+
return;
|
|
1807
|
+
}
|
|
1808
|
+
const deleted = await entity.Delete();
|
|
1809
|
+
if (!deleted) {
|
|
1810
|
+
const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Unknown error';
|
|
1811
|
+
this.ErrorMessage = `Failed to delete server: ${errorMsg}`;
|
|
1812
|
+
this.cdr.detectChanges();
|
|
1813
|
+
return;
|
|
1778
1814
|
}
|
|
1815
|
+
await this.loadAllData();
|
|
1779
1816
|
}
|
|
1780
1817
|
catch (error) {
|
|
1781
1818
|
this.ErrorMessage = `Failed to delete server: ${error instanceof Error ? error.message : String(error)}`;
|
|
1782
1819
|
this.cdr.detectChanges();
|
|
1783
1820
|
}
|
|
1784
1821
|
}
|
|
1822
|
+
/**
|
|
1823
|
+
* Internal helper to delete a tool by ID without confirmation
|
|
1824
|
+
*/
|
|
1825
|
+
async deleteToolInternal(toolId) {
|
|
1826
|
+
const md = new Metadata();
|
|
1827
|
+
const entity = await md.GetEntityObject('MJ: MCP Server Tools');
|
|
1828
|
+
const loaded = await entity.Load(toolId);
|
|
1829
|
+
if (!loaded) {
|
|
1830
|
+
throw new Error(`Tool not found`);
|
|
1831
|
+
}
|
|
1832
|
+
const deleted = await entity.Delete();
|
|
1833
|
+
if (!deleted) {
|
|
1834
|
+
const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';
|
|
1835
|
+
throw new Error(errorMsg);
|
|
1836
|
+
}
|
|
1837
|
+
}
|
|
1838
|
+
/**
|
|
1839
|
+
* Internal helper to delete a connection by ID without confirmation.
|
|
1840
|
+
* Handles deletion of all related records that don't have ON DELETE CASCADE:
|
|
1841
|
+
* - MCP Tool Execution Logs
|
|
1842
|
+
* - OAuth Authorization States
|
|
1843
|
+
* - OAuth Client Registrations
|
|
1844
|
+
* - OAuth Tokens
|
|
1845
|
+
*/
|
|
1846
|
+
async deleteConnectionInternal(connectionId) {
|
|
1847
|
+
console.log(`[MCPDashboard] deleteConnectionInternal called for connectionId: ${connectionId}`);
|
|
1848
|
+
const rv = new RunView();
|
|
1849
|
+
const md = new Metadata();
|
|
1850
|
+
// Delete execution logs for this connection
|
|
1851
|
+
console.log('[MCPDashboard] Deleting execution logs...');
|
|
1852
|
+
const logsResult = await rv.RunView({
|
|
1853
|
+
EntityName: 'MJ: MCP Tool Execution Logs',
|
|
1854
|
+
ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
|
|
1855
|
+
Fields: ['ID'],
|
|
1856
|
+
ResultType: 'simple'
|
|
1857
|
+
});
|
|
1858
|
+
if (logsResult.Success && logsResult.Results) {
|
|
1859
|
+
console.log(`[MCPDashboard] Found ${logsResult.Results.length} execution logs to delete`);
|
|
1860
|
+
for (const log of logsResult.Results) {
|
|
1861
|
+
console.log(`[MCPDashboard] Loading execution log ${log.ID}...`);
|
|
1862
|
+
const logEntity = await md.GetEntityObject('MJ: MCP Tool Execution Logs');
|
|
1863
|
+
const loaded = await logEntity.Load(log.ID);
|
|
1864
|
+
console.log(`[MCPDashboard] Load result for execution log ${log.ID}: ${loaded}`);
|
|
1865
|
+
if (loaded) {
|
|
1866
|
+
const deleted = await logEntity.Delete();
|
|
1867
|
+
if (!deleted) {
|
|
1868
|
+
console.error(`[MCPDashboard] Failed to delete execution log ${log.ID}:`, logEntity.LatestResult);
|
|
1869
|
+
throw new Error(`Failed to delete execution log: ${logEntity.LatestResult?.Message || 'Unknown error'}`);
|
|
1870
|
+
}
|
|
1871
|
+
console.log(`[MCPDashboard] Deleted execution log ${log.ID}`);
|
|
1872
|
+
}
|
|
1873
|
+
else {
|
|
1874
|
+
console.warn(`[MCPDashboard] Could not load execution log ${log.ID} - may have been already deleted`);
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
}
|
|
1878
|
+
// Delete OAuth Authorization States for this connection
|
|
1879
|
+
console.log('[MCPDashboard] Deleting OAuth Authorization States...');
|
|
1880
|
+
const authStatesResult = await rv.RunView({
|
|
1881
|
+
EntityName: 'MJ: O Auth Authorization States',
|
|
1882
|
+
ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
|
|
1883
|
+
Fields: ['ID'],
|
|
1884
|
+
ResultType: 'simple'
|
|
1885
|
+
});
|
|
1886
|
+
if (authStatesResult.Success && authStatesResult.Results) {
|
|
1887
|
+
console.log(`[MCPDashboard] Found ${authStatesResult.Results.length} OAuth Authorization States to delete`);
|
|
1888
|
+
for (const state of authStatesResult.Results) {
|
|
1889
|
+
console.log(`[MCPDashboard] Loading OAuth Authorization State ${state.ID}...`);
|
|
1890
|
+
const stateEntity = await md.GetEntityObject('MJ: O Auth Authorization States');
|
|
1891
|
+
const loaded = await stateEntity.Load(state.ID);
|
|
1892
|
+
console.log(`[MCPDashboard] Load result for OAuth Authorization State ${state.ID}: ${loaded}`);
|
|
1893
|
+
if (loaded) {
|
|
1894
|
+
const deleted = await stateEntity.Delete();
|
|
1895
|
+
if (!deleted) {
|
|
1896
|
+
console.error(`[MCPDashboard] Failed to delete OAuth Authorization State ${state.ID}:`, stateEntity.LatestResult);
|
|
1897
|
+
throw new Error(`Failed to delete OAuth Authorization State: ${stateEntity.LatestResult?.Message || 'Unknown error'}`);
|
|
1898
|
+
}
|
|
1899
|
+
console.log(`[MCPDashboard] Deleted OAuth Authorization State ${state.ID}`);
|
|
1900
|
+
}
|
|
1901
|
+
else {
|
|
1902
|
+
console.warn(`[MCPDashboard] Could not load OAuth Authorization State ${state.ID} - may have been already deleted`);
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1905
|
+
}
|
|
1906
|
+
// Delete OAuth Client Registrations for this connection
|
|
1907
|
+
console.log('[MCPDashboard] Deleting OAuth Client Registrations...');
|
|
1908
|
+
const clientRegsResult = await rv.RunView({
|
|
1909
|
+
EntityName: 'MJ: O Auth Client Registrations',
|
|
1910
|
+
ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
|
|
1911
|
+
Fields: ['ID'],
|
|
1912
|
+
ResultType: 'simple'
|
|
1913
|
+
});
|
|
1914
|
+
if (clientRegsResult.Success && clientRegsResult.Results) {
|
|
1915
|
+
console.log(`[MCPDashboard] Found ${clientRegsResult.Results.length} OAuth Client Registrations to delete`);
|
|
1916
|
+
for (const reg of clientRegsResult.Results) {
|
|
1917
|
+
console.log(`[MCPDashboard] Loading OAuth Client Registration ${reg.ID}...`);
|
|
1918
|
+
const regEntity = await md.GetEntityObject('MJ: O Auth Client Registrations');
|
|
1919
|
+
const loaded = await regEntity.Load(reg.ID);
|
|
1920
|
+
console.log(`[MCPDashboard] Load result for OAuth Client Registration ${reg.ID}: ${loaded}`);
|
|
1921
|
+
if (loaded) {
|
|
1922
|
+
const deleted = await regEntity.Delete();
|
|
1923
|
+
if (!deleted) {
|
|
1924
|
+
console.error(`[MCPDashboard] Failed to delete OAuth Client Registration ${reg.ID}:`, regEntity.LatestResult);
|
|
1925
|
+
throw new Error(`Failed to delete OAuth Client Registration: ${regEntity.LatestResult?.Message || 'Unknown error'}`);
|
|
1926
|
+
}
|
|
1927
|
+
console.log(`[MCPDashboard] Deleted OAuth Client Registration ${reg.ID}`);
|
|
1928
|
+
}
|
|
1929
|
+
else {
|
|
1930
|
+
console.warn(`[MCPDashboard] Could not load OAuth Client Registration ${reg.ID} - may have been already deleted`);
|
|
1931
|
+
}
|
|
1932
|
+
}
|
|
1933
|
+
}
|
|
1934
|
+
// Delete OAuth Tokens for this connection
|
|
1935
|
+
console.log('[MCPDashboard] Deleting OAuth Tokens...');
|
|
1936
|
+
const tokensResult = await rv.RunView({
|
|
1937
|
+
EntityName: 'MJ: O Auth Tokens',
|
|
1938
|
+
ExtraFilter: `MCPServerConnectionID='${connectionId}'`,
|
|
1939
|
+
Fields: ['ID'],
|
|
1940
|
+
ResultType: 'simple'
|
|
1941
|
+
});
|
|
1942
|
+
if (tokensResult.Success && tokensResult.Results) {
|
|
1943
|
+
console.log(`[MCPDashboard] Found ${tokensResult.Results.length} OAuth Tokens to delete`);
|
|
1944
|
+
for (const token of tokensResult.Results) {
|
|
1945
|
+
console.log(`[MCPDashboard] Loading OAuth Token ${token.ID}...`);
|
|
1946
|
+
const tokenEntity = await md.GetEntityObject('MJ: O Auth Tokens');
|
|
1947
|
+
const loaded = await tokenEntity.Load(token.ID);
|
|
1948
|
+
console.log(`[MCPDashboard] Load result for OAuth Token ${token.ID}: ${loaded}`);
|
|
1949
|
+
if (loaded) {
|
|
1950
|
+
const deleted = await tokenEntity.Delete();
|
|
1951
|
+
if (!deleted) {
|
|
1952
|
+
console.error(`[MCPDashboard] Failed to delete OAuth Token ${token.ID}:`, tokenEntity.LatestResult);
|
|
1953
|
+
throw new Error(`Failed to delete OAuth Token: ${tokenEntity.LatestResult?.Message || 'Unknown error'}`);
|
|
1954
|
+
}
|
|
1955
|
+
console.log(`[MCPDashboard] Deleted OAuth Token ${token.ID}`);
|
|
1956
|
+
}
|
|
1957
|
+
else {
|
|
1958
|
+
console.warn(`[MCPDashboard] Could not load OAuth Token ${token.ID} - may have been already deleted`);
|
|
1959
|
+
}
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
// Now delete the connection itself
|
|
1963
|
+
console.log('[MCPDashboard] All related records deleted. Now deleting the connection itself...');
|
|
1964
|
+
const entity = await md.GetEntityObject('MJ: MCP Server Connections');
|
|
1965
|
+
const loaded = await entity.Load(connectionId);
|
|
1966
|
+
if (!loaded) {
|
|
1967
|
+
throw new Error(`Connection not found`);
|
|
1968
|
+
}
|
|
1969
|
+
const deleted = await entity.Delete();
|
|
1970
|
+
if (!deleted) {
|
|
1971
|
+
const errorMsg = entity.LatestResult?.Message || entity.LatestResult?.CompleteMessage || 'Delete failed';
|
|
1972
|
+
throw new Error(errorMsg);
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1785
1975
|
async onServerDialogClose(result) {
|
|
1786
1976
|
this.ShowServerDialog = false;
|
|
1787
1977
|
this.EditingServer = null;
|
|
@@ -1804,18 +1994,24 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
1804
1994
|
this.cdr.detectChanges();
|
|
1805
1995
|
}
|
|
1806
1996
|
async deleteConnection(connection) {
|
|
1807
|
-
|
|
1808
|
-
|
|
1997
|
+
// Check for related execution logs
|
|
1998
|
+
const relatedLogs = this.executionLogs.filter(l => l.ConnectionID === connection.ID);
|
|
1999
|
+
if (relatedLogs.length > 0) {
|
|
2000
|
+
if (!confirm(`Connection "${connection.Name}" has ${relatedLogs.length} execution log(s).\n\n` +
|
|
2001
|
+
`All related logs will be deleted. Are you sure you want to proceed?`)) {
|
|
2002
|
+
return;
|
|
2003
|
+
}
|
|
1809
2004
|
}
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
const loaded = await entity.InnerLoad(new CompositeKey([{ FieldName: 'ID', Value: connection.ID }]));
|
|
1814
|
-
if (loaded) {
|
|
1815
|
-
await entity.Delete();
|
|
1816
|
-
await this.loadAllData();
|
|
2005
|
+
else {
|
|
2006
|
+
if (!confirm(`Are you sure you want to delete connection "${connection.Name}"?`)) {
|
|
2007
|
+
return;
|
|
1817
2008
|
}
|
|
1818
2009
|
}
|
|
2010
|
+
try {
|
|
2011
|
+
// Use the internal method which handles deleting related records
|
|
2012
|
+
await this.deleteConnectionInternal(connection.ID);
|
|
2013
|
+
await this.loadAllData();
|
|
2014
|
+
}
|
|
1819
2015
|
catch (error) {
|
|
1820
2016
|
this.ErrorMessage = `Failed to delete connection: ${error instanceof Error ? error.message : String(error)}`;
|
|
1821
2017
|
this.cdr.detectChanges();
|
|
@@ -2044,8 +2240,15 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
2044
2240
|
try {
|
|
2045
2241
|
const result = await this.mcpToolsService.syncTools(connectionId);
|
|
2046
2242
|
if (result.Success) {
|
|
2047
|
-
//
|
|
2048
|
-
await this.loadAllData();
|
|
2243
|
+
// Force refresh to show updated tools - backend changes don't trigger local events
|
|
2244
|
+
await this.loadAllData(true);
|
|
2245
|
+
}
|
|
2246
|
+
else if (result.RequiresOAuth || result.RequiresReauthorization) {
|
|
2247
|
+
// OAuth authorization is required - initiate fresh OAuth flow with frontend callback
|
|
2248
|
+
// Note: We ignore result.AuthorizationUrl because it was built with the server's callback URL
|
|
2249
|
+
// We need to initiate a fresh flow that uses the frontend callback URL
|
|
2250
|
+
console.log(`[MCPDashboard] OAuth ${result.RequiresReauthorization ? 're-' : ''}authorization required, initiating frontend OAuth flow...`);
|
|
2251
|
+
await this.initiateOAuthFlow(connectionId);
|
|
2049
2252
|
}
|
|
2050
2253
|
else {
|
|
2051
2254
|
this.ErrorMessage = `Sync failed: ${result.ErrorMessage}`;
|
|
@@ -2078,6 +2281,116 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
2078
2281
|
return state.progress.message;
|
|
2079
2282
|
}
|
|
2080
2283
|
// ========================================
|
|
2284
|
+
// OAuth Operations
|
|
2285
|
+
// ========================================
|
|
2286
|
+
/**
|
|
2287
|
+
* Checks for OAuth completion by looking for query params set by the OAuth callback
|
|
2288
|
+
*/
|
|
2289
|
+
checkOAuthCompletion() {
|
|
2290
|
+
const params = this.route.snapshot.queryParams;
|
|
2291
|
+
if (params['oauth'] === 'success') {
|
|
2292
|
+
// OAuth completed successfully
|
|
2293
|
+
const connectionId = params['connectionId'];
|
|
2294
|
+
console.log(`[MCPDashboard] OAuth authorization completed for connection: ${connectionId}`);
|
|
2295
|
+
// Show success notification
|
|
2296
|
+
this.showSuccessNotification('OAuth authorization completed successfully');
|
|
2297
|
+
// Clear the query params without triggering a full navigation
|
|
2298
|
+
this.router.navigate([], {
|
|
2299
|
+
relativeTo: this.route,
|
|
2300
|
+
queryParams: {},
|
|
2301
|
+
queryParamsHandling: 'merge',
|
|
2302
|
+
replaceUrl: true
|
|
2303
|
+
});
|
|
2304
|
+
// Refresh data to pick up new OAuth state
|
|
2305
|
+
this.loadAllData(true);
|
|
2306
|
+
}
|
|
2307
|
+
else if (params['oauth'] === 'error') {
|
|
2308
|
+
// OAuth failed
|
|
2309
|
+
const errorCode = params['error'] || 'unknown_error';
|
|
2310
|
+
const errorMessage = params['error_description'] || 'Authorization failed';
|
|
2311
|
+
console.error(`[MCPDashboard] OAuth authorization failed: ${errorCode} - ${errorMessage}`);
|
|
2312
|
+
// Show error message
|
|
2313
|
+
this.ErrorMessage = `OAuth authorization failed: ${errorMessage}`;
|
|
2314
|
+
// Clear the query params
|
|
2315
|
+
this.router.navigate([], {
|
|
2316
|
+
relativeTo: this.route,
|
|
2317
|
+
queryParams: {},
|
|
2318
|
+
queryParamsHandling: 'merge',
|
|
2319
|
+
replaceUrl: true
|
|
2320
|
+
});
|
|
2321
|
+
}
|
|
2322
|
+
}
|
|
2323
|
+
/**
|
|
2324
|
+
* Shows a success notification (temporary)
|
|
2325
|
+
*/
|
|
2326
|
+
showSuccessNotification(message) {
|
|
2327
|
+
// For now, use a simple console log and clear any error message
|
|
2328
|
+
console.log(`[MCPDashboard] Success: ${message}`);
|
|
2329
|
+
this.ErrorMessage = null;
|
|
2330
|
+
// TODO: Implement proper toast/notification system
|
|
2331
|
+
}
|
|
2332
|
+
/**
|
|
2333
|
+
* Initiates OAuth authorization flow for a connection.
|
|
2334
|
+
* Stores the current URL and redirects directly to the OAuth provider.
|
|
2335
|
+
* Always uses the frontend callback URL so the OAuth redirect comes back to MJExplorer.
|
|
2336
|
+
*
|
|
2337
|
+
* @param connectionId - The MCP connection ID requiring OAuth
|
|
2338
|
+
*/
|
|
2339
|
+
async initiateOAuthFlow(connectionId) {
|
|
2340
|
+
// Store current URL for return after OAuth completion
|
|
2341
|
+
// Store both full URL and path-only version for cross-origin scenarios
|
|
2342
|
+
const currentUrl = window.location.href;
|
|
2343
|
+
const currentPath = window.location.pathname + window.location.search;
|
|
2344
|
+
// Store in both localStorage and sessionStorage for redundancy
|
|
2345
|
+
localStorage.setItem('oauth_return_url', currentUrl);
|
|
2346
|
+
localStorage.setItem('oauth_return_path', currentPath);
|
|
2347
|
+
sessionStorage.setItem('oauth_return_url', currentUrl);
|
|
2348
|
+
sessionStorage.setItem('oauth_return_path', currentPath);
|
|
2349
|
+
console.log('[MCPDashboard] Stored OAuth return URL:', currentUrl);
|
|
2350
|
+
console.log('[MCPDashboard] Stored OAuth return path:', currentPath);
|
|
2351
|
+
// Initiate OAuth via GraphQL to get the URL with frontend callback
|
|
2352
|
+
const result = await this.initiateMCPOAuth(connectionId);
|
|
2353
|
+
if (result.Success && result.AuthorizationUrl) {
|
|
2354
|
+
console.log('[MCPDashboard] Redirecting to OAuth provider:', result.AuthorizationUrl);
|
|
2355
|
+
window.location.href = result.AuthorizationUrl;
|
|
2356
|
+
}
|
|
2357
|
+
else {
|
|
2358
|
+
this.ErrorMessage = result.ErrorMessage || 'Failed to initiate OAuth authorization';
|
|
2359
|
+
this.cdr.detectChanges();
|
|
2360
|
+
}
|
|
2361
|
+
}
|
|
2362
|
+
/**
|
|
2363
|
+
* Calls the InitiateMCPOAuth mutation with frontend callback URL
|
|
2364
|
+
*/
|
|
2365
|
+
async initiateMCPOAuth(connectionId) {
|
|
2366
|
+
try {
|
|
2367
|
+
const { GraphQLDataProvider, gql } = await import('@memberjunction/graphql-dataprovider');
|
|
2368
|
+
const mutation = gql `
|
|
2369
|
+
mutation InitiateMCPOAuth($input: InitiateMCPOAuthInput!) {
|
|
2370
|
+
InitiateMCPOAuth(input: $input) {
|
|
2371
|
+
Success
|
|
2372
|
+
ErrorMessage
|
|
2373
|
+
AuthorizationUrl
|
|
2374
|
+
StateParameter
|
|
2375
|
+
}
|
|
2376
|
+
}
|
|
2377
|
+
`;
|
|
2378
|
+
// Use the frontend callback URL so we handle the OAuth redirect
|
|
2379
|
+
const frontendCallbackUrl = `${window.location.origin}/oauth/callback`;
|
|
2380
|
+
const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, {
|
|
2381
|
+
input: {
|
|
2382
|
+
ConnectionID: connectionId,
|
|
2383
|
+
FrontendCallbackUrl: frontendCallbackUrl
|
|
2384
|
+
}
|
|
2385
|
+
});
|
|
2386
|
+
return result?.InitiateMCPOAuth || { Success: false, ErrorMessage: 'No result returned' };
|
|
2387
|
+
}
|
|
2388
|
+
catch (error) {
|
|
2389
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
2390
|
+
return { Success: false, ErrorMessage: message };
|
|
2391
|
+
}
|
|
2392
|
+
}
|
|
2393
|
+
// ========================================
|
|
2081
2394
|
// Utility Methods
|
|
2082
2395
|
// ========================================
|
|
2083
2396
|
getStatusClass(status) {
|
|
@@ -2330,95 +2643,79 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
2330
2643
|
this.ShowTestToolDialog = true;
|
|
2331
2644
|
this.cdr.detectChanges();
|
|
2332
2645
|
}
|
|
2333
|
-
static ɵfac = function MCPDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.NavigationService), i0.ɵɵdirectiveInject(i3.MCPToolsService)); };
|
|
2334
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPDashboardComponent, selectors: [["mj-mcp-dashboard"]], features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
2335
|
-
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
|
|
2336
|
-
i0.ɵɵelement(
|
|
2337
|
-
i0.ɵɵ
|
|
2338
|
-
i0.ɵɵtext(5, "MCP");
|
|
2339
|
-
i0.ɵɵelementEnd()();
|
|
2340
|
-
i0.ɵɵelementStart(6, "nav", 5)(7, "button", 6);
|
|
2341
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_7_listener() { return ctx.setActiveTab("servers"); });
|
|
2342
|
-
i0.ɵɵelement(8, "i", 7);
|
|
2343
|
-
i0.ɵɵelementStart(9, "span", 8);
|
|
2344
|
-
i0.ɵɵtext(10, "Servers");
|
|
2646
|
+
static ɵfac = function MCPDashboardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MCPDashboardComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i1.ActivatedRoute), i0.ɵɵdirectiveInject(i2.NavigationService), i0.ɵɵdirectiveInject(i3.MCPToolsService)); };
|
|
2647
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MCPDashboardComponent, selectors: [["mj-mcp-dashboard"]], standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 55, vars: 30, consts: [[1, "mcp-dashboard"], [1, "dashboard-header"], [1, "header-info"], [1, "dashboard-title"], [1, "fa-solid", "fa-plug-circle-bolt"], ["type", "button", "title", "Toggle Filters", 1, "filter-toggle-btn", 3, "click"], [1, "fa-solid", "fa-filter"], [1, "item-count"], [1, "header-controls"], [1, "tab-nav"], ["type", "button", 1, "tab-btn", 3, "click"], [1, "fa-solid", "fa-server"], [1, "tab-label"], [1, "tab-badge"], [1, "fa-solid", "fa-link"], [1, "fa-solid", "fa-wrench"], [1, "fa-solid", "fa-list-check"], ["kendoButton", "", "themeColor", "primary"], ["kendoButton", "", "fillMode", "flat", "title", "Refresh", 3, "disabled"], [1, "main-content"], [1, "filter-panel-container"], [3, "filtersChange", "closePanel", "filters", "activeTab", "totalCount", "filteredCount"], [1, "resize-handle"], [1, "content-area"], [1, "error-banner"], [1, "content-body"], ["text", "Loading MCP data..."], [3, "server", "visible"], [3, "connection", "servers", "visible"], [3, "Visible", "Servers", "Connections", "Tools", "SelectedServerID", "SelectedConnectionID", "SelectedToolID"], [3, "Visible", "Log"], ["kendoButton", "", "themeColor", "primary", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "view-toggle"], ["type", "button", "title", "Card View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "List View", 1, "view-btn", 3, "click"], [1, "fa-solid", "fa-list"], [1, "fa-solid", "fa-play"], ["kendoButton", "", "fillMode", "flat", "title", "Refresh", 3, "click", "disabled"], [1, "fa-solid", "fa-sync"], [1, "fa-solid", "fa-exclamation-triangle"], [1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "data-grid", "servers-grid"], [1, "data-grid", "connections-grid"], [1, "data-table"], [1, "empty-state"], [1, "data-card", 3, "expanded"], [1, "data-card"], [1, "card-header", "clickable", 3, "click"], [1, "card-title"], [1, "fa-solid", "fa-chevron-right", "expand-arrow"], [1, "name", 3, "innerHTML"], [1, "status-badge", 3, "ngClass"], [1, "card-actions", 3, "click"], ["kendoButton", "", "fillMode", "flat", "title", "Edit", 3, "click"], [1, "fa-solid", "fa-pen"], ["kendoButton", "", "fillMode", "flat", "title", "Delete", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "card-body"], [1, "description", 3, "innerHTML"], [1, "details-grid"], [1, "detail"], [1, "label"], [1, "value"], [1, "detail", "full-width"], [1, "expanded-tools-section"], [1, "value", "url"], [1, "value", "command"], [1, "tools-section-header"], [1, "no-tools-message"], [1, "tools-mini-list"], [1, "fa-solid", "fa-info-circle"], [1, "tool-mini-card"], [1, "tool-mini-info"], [1, "tool-mini-name"], [1, "tool-mini-params"], [1, "fa-solid", "fa-sliders"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Test this tool", 3, "click"], ["kendoButton", "", "fillMode", "flat", "title", "Sync Tools", 3, "click", "disabled"], [1, "fa-solid", "fa-sync", "fa-spin"], [1, "sync-progress-banner"], [1, "sync-result-banner", 3, "success", "error"], [1, "detail", "full-width", "error"], [1, "fa-solid", "fa-circle-notch", "fa-spin"], [1, "sync-message"], [1, "sync-result-banner"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-exclamation-circle"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Test this tool with this connection", 3, "click"], [1, "tools-container"], [1, "hint"], [1, "server-group", 3, "collapsed"], [1, "server-group"], [1, "server-group-header", 3, "click"], [1, "server-info"], [1, "fa-solid", "fa-chevron-right", "expand-icon"], [1, "server-name"], [1, "tool-count"], [1, "status-badge", "small", 3, "ngClass"], [1, "server-actions", 3, "click"], ["kendoButton", "", "fillMode", "flat", "title", "Test a tool", 3, "click"], [1, "tools-grid"], [1, "tools-list"], [1, "tool-card", 3, "expanded"], [1, "tool-card"], [1, "tool-card-header", 3, "click"], [1, "tool-title"], [1, "tool-meta"], ["title", "Parameters", 1, "param-badge"], [1, "tool-description", 3, "innerHTML"], [1, "tool-card-actions"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "View details", 3, "click"], [1, "fa-solid"], [1, "tool-details"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value", "mono"], [1, "detail-value"], [1, "detail-row", "full"], [1, "schema-preview"], [1, "tool-name-cell"], [1, "tool-name-info"], [1, "tool-title", 3, "innerHTML"], [1, "tool-code"], [1, "description-cell", 3, "innerHTML"], [1, "param-count"], [1, "actions-cell"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Test", 3, "click"], ["kendoButton", "", "fillMode", "flat", "size", "small", "title", "Details", 3, "click"], [1, "detail-row-expanded"], ["colspan", "6"], [1, "inline-details"], [1, "detail-section"], [1, "detail-section", "full"], [1, "sortable", 3, "click", "ngClass"], [1, "sort-icon", "fa-solid"], ["title", "Click for details", 1, "clickable-row", 3, "error-row"], ["title", "Click for details", 1, "clickable-row", 3, "click"], [1, "fa-solid", "fa-times-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-question-circle"], [1, "tool-name"], [1, "error-message", 3, "title"], [1, "action-cell"], [1, "fa-solid", "fa-chevron-right"], [3, "close", "server", "visible"], [3, "close", "connection", "servers", "visible"], [3, "Close", "Visible", "Servers", "Connections", "Tools", "SelectedServerID", "SelectedConnectionID", "SelectedToolID"], [3, "Close", "RunAgain", "Visible", "Log"]], template: function MCPDashboardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2648
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h2", 3);
|
|
2649
|
+
i0.ɵɵelement(4, "i", 4);
|
|
2650
|
+
i0.ɵɵtext(5, " MCP Dashboard ");
|
|
2345
2651
|
i0.ɵɵelementEnd();
|
|
2346
|
-
i0.ɵɵelementStart(
|
|
2347
|
-
i0.ɵɵ
|
|
2348
|
-
i0.ɵɵ
|
|
2349
|
-
i0.ɵɵ
|
|
2350
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_13_listener() { return ctx.setActiveTab("connections"); });
|
|
2351
|
-
i0.ɵɵelement(14, "i", 10);
|
|
2352
|
-
i0.ɵɵelementStart(15, "span", 8);
|
|
2353
|
-
i0.ɵɵtext(16, "Connections");
|
|
2652
|
+
i0.ɵɵelementStart(6, "button", 5);
|
|
2653
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_6_listener() { return ctx.toggleFilterPanel(); });
|
|
2654
|
+
i0.ɵɵelement(7, "i", 6);
|
|
2655
|
+
i0.ɵɵconditionalCreate(8, MCPDashboardComponent_Conditional_8_Template, 1, 0)(9, MCPDashboardComponent_Conditional_9_Template, 1, 0);
|
|
2354
2656
|
i0.ɵɵelementEnd();
|
|
2355
|
-
i0.ɵɵelementStart(
|
|
2356
|
-
i0.ɵɵtext(
|
|
2657
|
+
i0.ɵɵelementStart(10, "span", 7);
|
|
2658
|
+
i0.ɵɵtext(11);
|
|
2357
2659
|
i0.ɵɵelementEnd()();
|
|
2358
|
-
i0.ɵɵelementStart(
|
|
2359
|
-
i0.ɵɵlistener("click", function
|
|
2360
|
-
i0.ɵɵelement(
|
|
2361
|
-
i0.ɵɵelementStart(
|
|
2362
|
-
i0.ɵɵtext(
|
|
2660
|
+
i0.ɵɵelementStart(12, "div", 8)(13, "div", 9)(14, "button", 10);
|
|
2661
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_14_listener() { return ctx.setActiveTab("servers"); });
|
|
2662
|
+
i0.ɵɵelement(15, "i", 11);
|
|
2663
|
+
i0.ɵɵelementStart(16, "span", 12);
|
|
2664
|
+
i0.ɵɵtext(17, "Servers");
|
|
2363
2665
|
i0.ɵɵelementEnd();
|
|
2364
|
-
i0.ɵɵelementStart(
|
|
2365
|
-
i0.ɵɵtext(
|
|
2666
|
+
i0.ɵɵelementStart(18, "span", 13);
|
|
2667
|
+
i0.ɵɵtext(19);
|
|
2366
2668
|
i0.ɵɵelementEnd()();
|
|
2367
|
-
i0.ɵɵelementStart(
|
|
2368
|
-
i0.ɵɵlistener("click", function
|
|
2369
|
-
i0.ɵɵelement(
|
|
2370
|
-
i0.ɵɵelementStart(
|
|
2371
|
-
i0.ɵɵtext(
|
|
2669
|
+
i0.ɵɵelementStart(20, "button", 10);
|
|
2670
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_20_listener() { return ctx.setActiveTab("connections"); });
|
|
2671
|
+
i0.ɵɵelement(21, "i", 14);
|
|
2672
|
+
i0.ɵɵelementStart(22, "span", 12);
|
|
2673
|
+
i0.ɵɵtext(23, "Connections");
|
|
2372
2674
|
i0.ɵɵelementEnd();
|
|
2373
|
-
i0.ɵɵelementStart(
|
|
2374
|
-
i0.ɵɵtext(
|
|
2375
|
-
i0.ɵɵelementEnd()()();
|
|
2376
|
-
i0.ɵɵelementStart(31, "div", 13)(32, "div", 14)(33, "span", 15);
|
|
2377
|
-
i0.ɵɵtext(34, "Active Servers");
|
|
2378
|
-
i0.ɵɵelementEnd();
|
|
2379
|
-
i0.ɵɵelementStart(35, "span", 16);
|
|
2380
|
-
i0.ɵɵtext(36);
|
|
2675
|
+
i0.ɵɵelementStart(24, "span", 13);
|
|
2676
|
+
i0.ɵɵtext(25);
|
|
2381
2677
|
i0.ɵɵelementEnd()();
|
|
2382
|
-
i0.ɵɵelementStart(
|
|
2383
|
-
i0.ɵɵ
|
|
2678
|
+
i0.ɵɵelementStart(26, "button", 10);
|
|
2679
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_26_listener() { return ctx.setActiveTab("tools"); });
|
|
2680
|
+
i0.ɵɵelement(27, "i", 15);
|
|
2681
|
+
i0.ɵɵelementStart(28, "span", 12);
|
|
2682
|
+
i0.ɵɵtext(29, "Tools");
|
|
2384
2683
|
i0.ɵɵelementEnd();
|
|
2385
|
-
i0.ɵɵelementStart(
|
|
2386
|
-
i0.ɵɵtext(
|
|
2684
|
+
i0.ɵɵelementStart(30, "span", 13);
|
|
2685
|
+
i0.ɵɵtext(31);
|
|
2387
2686
|
i0.ɵɵelementEnd()();
|
|
2388
|
-
i0.ɵɵelementStart(
|
|
2389
|
-
i0.ɵɵ
|
|
2687
|
+
i0.ɵɵelementStart(32, "button", 10);
|
|
2688
|
+
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_32_listener() { return ctx.setActiveTab("logs"); });
|
|
2689
|
+
i0.ɵɵelement(33, "i", 16);
|
|
2690
|
+
i0.ɵɵelementStart(34, "span", 12);
|
|
2691
|
+
i0.ɵɵtext(35, "Logs");
|
|
2390
2692
|
i0.ɵɵelementEnd();
|
|
2391
|
-
i0.ɵɵelementStart(
|
|
2392
|
-
i0.ɵɵtext(
|
|
2693
|
+
i0.ɵɵelementStart(36, "span", 13);
|
|
2694
|
+
i0.ɵɵtext(37);
|
|
2695
|
+
i0.ɵɵelementEnd()()();
|
|
2696
|
+
i0.ɵɵconditionalCreate(38, MCPDashboardComponent_Case_38_Template, 3, 0, "button", 17)(39, MCPDashboardComponent_Case_39_Template, 3, 0, "button", 17)(40, MCPDashboardComponent_Case_40_Template, 8, 4)(41, MCPDashboardComponent_Case_41_Template, 3, 3, "button", 18);
|
|
2393
2697
|
i0.ɵɵelementEnd()();
|
|
2394
|
-
i0.ɵɵ
|
|
2698
|
+
i0.ɵɵelementStart(42, "div", 19)(43, "div", 20)(44, "mj-mcp-filter-panel", 21);
|
|
2699
|
+
i0.ɵɵlistener("filtersChange", function MCPDashboardComponent_Template_mj_mcp_filter_panel_filtersChange_44_listener($event) { return ctx.onFiltersChange($event); })("closePanel", function MCPDashboardComponent_Template_mj_mcp_filter_panel_closePanel_44_listener() { return ctx.toggleFilterPanel(); });
|
|
2395
2700
|
i0.ɵɵelementEnd();
|
|
2396
|
-
i0.ɵɵ
|
|
2397
|
-
i0.ɵɵlistener("click", function MCPDashboardComponent_Template_button_click_49_listener() { return ctx.loadAllData(); });
|
|
2398
|
-
i0.ɵɵelement(50, "i", 20);
|
|
2399
|
-
i0.ɵɵelementEnd()()();
|
|
2400
|
-
i0.ɵɵelementStart(51, "div", 21);
|
|
2401
|
-
i0.ɵɵtemplate(52, MCPDashboardComponent_Conditional_52_Template, 5, 1, "div", 22);
|
|
2402
|
-
i0.ɵɵelementStart(53, "div", 23)(54, "h2", 24);
|
|
2403
|
-
i0.ɵɵtemplate(55, MCPDashboardComponent_Case_55_Template, 1, 0)(56, MCPDashboardComponent_Case_56_Template, 1, 0)(57, MCPDashboardComponent_Case_57_Template, 1, 0)(58, MCPDashboardComponent_Case_58_Template, 1, 0);
|
|
2701
|
+
i0.ɵɵelement(45, "div", 22);
|
|
2404
2702
|
i0.ɵɵelementEnd();
|
|
2405
|
-
i0.ɵɵelementStart(
|
|
2406
|
-
i0.ɵɵ
|
|
2407
|
-
i0.ɵɵelementStart(
|
|
2408
|
-
i0.ɵɵ
|
|
2409
|
-
i0.ɵɵ
|
|
2410
|
-
i0.ɵɵ
|
|
2411
|
-
i0.ɵɵ
|
|
2412
|
-
i0.ɵɵ
|
|
2413
|
-
i0.ɵɵ
|
|
2414
|
-
i0.ɵɵtemplate(69, MCPDashboardComponent_Conditional_69_Template, 1, 0, "mj-loading", 31)(70, MCPDashboardComponent_Conditional_70_Template, 4, 1);
|
|
2415
|
-
i0.ɵɵelementEnd()()();
|
|
2416
|
-
i0.ɵɵtemplate(71, MCPDashboardComponent_Conditional_71_Template, 1, 2, "mj-mcp-server-dialog", 32)(72, MCPDashboardComponent_Conditional_72_Template, 1, 3, "mj-mcp-connection-dialog", 33)(73, MCPDashboardComponent_Conditional_73_Template, 1, 7, "mj-mcp-test-tool-dialog", 34)(74, MCPDashboardComponent_Conditional_74_Template, 1, 2, "mj-mcp-log-detail-panel", 35);
|
|
2703
|
+
i0.ɵɵelementStart(46, "div", 23);
|
|
2704
|
+
i0.ɵɵconditionalCreate(47, MCPDashboardComponent_Conditional_47_Template, 5, 1, "div", 24);
|
|
2705
|
+
i0.ɵɵelementStart(48, "div", 25);
|
|
2706
|
+
i0.ɵɵconditionalCreate(49, MCPDashboardComponent_Conditional_49_Template, 1, 0, "mj-loading", 26)(50, MCPDashboardComponent_Conditional_50_Template, 4, 1);
|
|
2707
|
+
i0.ɵɵelementEnd()()()();
|
|
2708
|
+
i0.ɵɵconditionalCreate(51, MCPDashboardComponent_Conditional_51_Template, 1, 2, "mj-mcp-server-dialog", 27);
|
|
2709
|
+
i0.ɵɵconditionalCreate(52, MCPDashboardComponent_Conditional_52_Template, 1, 3, "mj-mcp-connection-dialog", 28);
|
|
2710
|
+
i0.ɵɵconditionalCreate(53, MCPDashboardComponent_Conditional_53_Template, 1, 7, "mj-mcp-test-tool-dialog", 29);
|
|
2711
|
+
i0.ɵɵconditionalCreate(54, MCPDashboardComponent_Conditional_54_Template, 1, 2, "mj-mcp-log-detail-panel", 30);
|
|
2417
2712
|
} if (rf & 2) {
|
|
2418
|
-
let
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
i0.ɵɵadvance(
|
|
2713
|
+
let tmp_11_0;
|
|
2714
|
+
i0.ɵɵadvance(8);
|
|
2715
|
+
i0.ɵɵconditional(ctx.FilterPanelVisible ? 8 : 9);
|
|
2716
|
+
i0.ɵɵadvance(3);
|
|
2717
|
+
i0.ɵɵtextInterpolate2("", ctx.CurrentFilteredCount, " of ", ctx.CurrentTotalCount, " items");
|
|
2718
|
+
i0.ɵɵadvance(3);
|
|
2422
2719
|
i0.ɵɵclassProp("active", ctx.ActiveTab === "servers");
|
|
2423
2720
|
i0.ɵɵadvance(5);
|
|
2424
2721
|
i0.ɵɵtextInterpolate(ctx.servers.length);
|
|
@@ -2436,37 +2733,25 @@ let MCPDashboardComponent = class MCPDashboardComponent extends BaseDashboard {
|
|
|
2436
2733
|
i0.ɵɵclassProp("has-errors", ctx.stats.failedExecutions > 0);
|
|
2437
2734
|
i0.ɵɵadvance();
|
|
2438
2735
|
i0.ɵɵtextInterpolate(ctx.executionLogs.length);
|
|
2439
|
-
i0.ɵɵadvance(6);
|
|
2440
|
-
i0.ɵɵtextInterpolate2("", ctx.stats.activeServers, "/", ctx.stats.totalServers, "");
|
|
2441
|
-
i0.ɵɵadvance(5);
|
|
2442
|
-
i0.ɵɵtextInterpolate2("", ctx.stats.activeConnections, "/", ctx.stats.totalConnections, "");
|
|
2443
|
-
i0.ɵɵadvance(5);
|
|
2444
|
-
i0.ɵɵtextInterpolate2("", ctx.stats.activeTools, "/", ctx.stats.totalTools, "");
|
|
2445
2736
|
i0.ɵɵadvance();
|
|
2446
|
-
i0.ɵɵconditional(ctx.
|
|
2447
|
-
i0.ɵɵadvance(
|
|
2448
|
-
i0.ɵɵ
|
|
2737
|
+
i0.ɵɵconditional((tmp_11_0 = ctx.ActiveTab) === "servers" ? 38 : tmp_11_0 === "connections" ? 39 : tmp_11_0 === "tools" ? 40 : tmp_11_0 === "logs" ? 41 : -1);
|
|
2738
|
+
i0.ɵɵadvance(5);
|
|
2739
|
+
i0.ɵɵclassProp("hidden", !ctx.FilterPanelVisible);
|
|
2449
2740
|
i0.ɵɵadvance();
|
|
2450
|
-
i0.ɵɵ
|
|
2451
|
-
i0.ɵɵadvance(2);
|
|
2452
|
-
i0.ɵɵconditional(ctx.ErrorMessage ? 52 : -1);
|
|
2741
|
+
i0.ɵɵproperty("filters", ctx.CurrentFilters)("activeTab", ctx.ActiveTab)("totalCount", ctx.CurrentTotalCount)("filteredCount", ctx.CurrentFilteredCount);
|
|
2453
2742
|
i0.ɵɵadvance(3);
|
|
2454
|
-
i0.ɵɵconditional(
|
|
2455
|
-
i0.ɵɵadvance(7);
|
|
2456
|
-
i0.ɵɵproperty("ngModel", (tmp_17_0 = i0.ɵɵpipeBind1(63, 33, ctx.filters$)) == null ? null : tmp_17_0.searchTerm);
|
|
2743
|
+
i0.ɵɵconditional(ctx.ErrorMessage ? 47 : -1);
|
|
2457
2744
|
i0.ɵɵadvance(2);
|
|
2458
|
-
i0.ɵɵconditional(
|
|
2459
|
-
i0.ɵɵadvance(5);
|
|
2460
|
-
i0.ɵɵconditional(ctx.IsLoading ? 69 : 70);
|
|
2745
|
+
i0.ɵɵconditional(ctx.IsLoading ? 49 : 50);
|
|
2461
2746
|
i0.ɵɵadvance(2);
|
|
2462
|
-
i0.ɵɵconditional(ctx.ShowServerDialog ?
|
|
2747
|
+
i0.ɵɵconditional(ctx.ShowServerDialog ? 51 : -1);
|
|
2463
2748
|
i0.ɵɵadvance();
|
|
2464
|
-
i0.ɵɵconditional(ctx.ShowConnectionDialog ?
|
|
2749
|
+
i0.ɵɵconditional(ctx.ShowConnectionDialog ? 52 : -1);
|
|
2465
2750
|
i0.ɵɵadvance();
|
|
2466
|
-
i0.ɵɵconditional(ctx.ShowTestToolDialog ?
|
|
2751
|
+
i0.ɵɵconditional(ctx.ShowTestToolDialog ? 53 : -1);
|
|
2467
2752
|
i0.ɵɵadvance();
|
|
2468
|
-
i0.ɵɵconditional(ctx.ShowLogDetailPanel && ctx.SelectedLog ?
|
|
2469
|
-
} }, styles: ["\n\n.mcp-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n height: 100%;\n background: var(--mj-background-color, #f5f5f5);\n overflow: hidden;\n}\n\n\n\n\n\n.sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 220px;\n min-width: 220px;\n background: white;\n border-right: 1px solid #e0e0e0;\n box-shadow: 2px 0 4px rgba(0, 0, 0, 0.04);\n}\n\n.sidebar-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 16px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.sidebar-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 24px;\n color: var(--mj-primary-color, #2196f3);\n}\n\n.sidebar-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n\n\n.sidebar-nav[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n flex: 1;\n}\n\n.nav-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin-bottom: 4px;\n background: none;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n text-align: left;\n width: 100%;\n}\n\n.nav-item[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.08);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item.active[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.12);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 20px;\n text-align: center;\n font-size: 16px;\n}\n\n.nav-label[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.nav-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 6px;\n background: #e0e0e0;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.nav-item.active[_ngcontent-%COMP%] .nav-badge[_ngcontent-%COMP%] {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n.nav-badge.has-errors[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n}\n\n\n\n.sidebar-stats[_ngcontent-%COMP%] {\n padding: 16px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n}\n\n.stat-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.stat-row[_ngcontent-%COMP%] .stat-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\n}\n\n.stat-row[_ngcontent-%COMP%] .stat-value[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.stat-row.error[_ngcontent-%COMP%] .stat-value[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n\n\n.sidebar-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 12px;\n border-top: 1px solid #e0e0e0;\n}\n\n\n\n\n\n.main-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.content-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.content-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n\n\n.search-box[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f5f5f5;\n border-radius: 6px;\n min-width: 200px;\n}\n\n.search-box[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\n}\n\n.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n background: none;\n outline: none;\n font-size: 14px;\n}\n\n.status-filter[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n}\n\n\n\n.content-body[_ngcontent-%COMP%] {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\n}\n\n.error-banner[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #c62828;\n padding: 4px;\n}\n\n\n\n\n\n\n\n\n.data-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card[_ngcontent-%COMP%] {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\n transition: box-shadow 0.2s ease;\n}\n\n.data-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.card-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.card-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.card-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 4px 8px;\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.card-body[_ngcontent-%COMP%] .description[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail.error[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n.detail[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-color, #333);\n}\n\n.detail[_ngcontent-%COMP%] .value.url[_ngcontent-%COMP%], \n.detail[_ngcontent-%COMP%] .value.command[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n background: #f5f5f5;\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated[_ngcontent-%COMP%] {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n\n\n.sync-progress-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] .sync-message[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.sync-result-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.data-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.error-row[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.05);\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.data-table[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #f44336;\n font-size: 12px;\n}\n\n.data-table[_ngcontent-%COMP%] .server-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n margin-left: 6px;\n font-size: 10px;\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n color: #999;\n}\n\n.data-table[_ngcontent-%COMP%] th.sorted-asc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] th.sorted-desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #e0e0e0;\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-color, #333);\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%] {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n\n\n\n\n.tools-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\n}\n\n.server-group.collapsed[_ngcontent-%COMP%] .server-group-header[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.server-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.server-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n\n\n\n\n.tools-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card[_ngcontent-%COMP%] {\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-primary-color, #2196f3);\n}\n\n.tool-card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.tool-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.param-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-description[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid #f0f0f0;\n background: #fafafa;\n}\n\n\n\n.tool-details[_ngcontent-%COMP%] {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row[_ngcontent-%COMP%] {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row.full[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n min-width: 100px;\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n\n\n.tools-list[_ngcontent-%COMP%] {\n overflow: auto;\n}\n\n.tools-list[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.tools-list[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s ease;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: #fafafa;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.expanded[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.04);\n}\n\n.tool-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n margin-top: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-code[_ngcontent-%COMP%] {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.description-cell[_ngcontent-%COMP%] {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.actions-cell[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n\n\n.detail-row-expanded[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0;\n background: #fafafa;\n}\n\n.inline-details[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed #e0e0e0;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section.full[_ngcontent-%COMP%] {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n}\n\n\n\n\n\n@media (max-width: 900px) {\n .mcp-dashboard[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .sidebar-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\n }\n\n .sidebar-nav[_ngcontent-%COMP%] {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats[_ngcontent-%COMP%] {\n display: none;\n }\n\n .sidebar-footer[_ngcontent-%COMP%] {\n border-top: none;\n border-left: 1px solid #e0e0e0;\n padding: 8px;\n }\n\n .data-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .search-box[_ngcontent-%COMP%] {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .search-box[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n\n\n\n.clickable-row[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row[_ngcontent-%COMP%] .action-cell[_ngcontent-%COMP%] {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.action-cell[_ngcontent-%COMP%] {\n width: 40px;\n text-align: center;\n}\n\n\n\n\n\n.card-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n}\n\n.expand-arrow[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.data-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n\n\n\n\n.expanded-tools-section[_ngcontent-%COMP%] {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\n}\n\n.tools-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\n}\n\n.tools-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\n}\n\n\n\n.tools-mini-list[_ngcontent-%COMP%] {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\n}\n\n.tool-mini-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-color, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.tool-mini-params[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n\n\n[_nghost-%COMP%] .search-highlight, \n.search-highlight[_ngcontent-%COMP%] {\n background-color: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
|
|
2753
|
+
i0.ɵɵconditional(ctx.ShowLogDetailPanel && ctx.SelectedLog ? 54 : -1);
|
|
2754
|
+
} }, styles: ["\n\n.mcp-dashboard[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-background-color, #f5f5f5);\n overflow: hidden;\n}\n\n\n\n\n\n.dashboard-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n gap: 16px;\n}\n\n.header-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.dashboard-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n font-size: 20px;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #f5f5f5;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%]:hover {\n background: #e8e8e8;\n border-color: #d0d0d0;\n color: var(--mj-text-color, #333);\n}\n\n.filter-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.item-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n padding: 4px 10px;\n background: #f5f5f5;\n border-radius: 4px;\n}\n\n.header-controls[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n\n\n.tab-nav[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n background: #f5f5f5;\n padding: 4px;\n border-radius: 8px;\n}\n\n.tab-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n}\n\n.tab-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.7);\n color: var(--mj-text-color, #333);\n}\n\n.tab-btn.active[_ngcontent-%COMP%] {\n background: white;\n color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.tab-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.tab-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.tab-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 18px;\n padding: 0 6px;\n background: #e0e0e0;\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.tab-btn.active[_ngcontent-%COMP%] .tab-badge[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.15);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.tab-badge.has-errors[_ngcontent-%COMP%] {\n background: #f44336;\n color: white;\n}\n\n\n\n\n\n.main-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.filter-panel-container[_ngcontent-%COMP%] {\n display: flex;\n flex-shrink: 0;\n width: 280px;\n min-width: 200px;\n max-width: 400px;\n background: white;\n border-right: 1px solid #e0e0e0;\n position: relative;\n transition: width 0.2s ease, margin 0.2s ease;\n}\n\n.filter-panel-container.hidden[_ngcontent-%COMP%] {\n width: 0;\n min-width: 0;\n margin-left: -1px;\n overflow: hidden;\n}\n\n\n\n.resize-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 0;\n right: 0;\n width: 4px;\n height: 100%;\n cursor: col-resize;\n background: transparent;\n transition: background 0.2s ease;\n z-index: 10;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover, \n.resize-handle[_ngcontent-%COMP%]:active {\n background: var(--mj-primary-color, #2196f3);\n}\n\n\n\n.content-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n\n\n.content-body[_ngcontent-%COMP%] {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n\n\n.error-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\n}\n\n.error-banner[_ngcontent-%COMP%] .close-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #c62828;\n padding: 4px;\n}\n\n\n\n\n\n\n\n\n.data-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card[_ngcontent-%COMP%] {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\n transition: box-shadow 0.2s ease;\n}\n\n.data-card[_ngcontent-%COMP%]:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.card-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.card-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.card-actions[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n padding: 4px 8px;\n}\n\n.card-body[_ngcontent-%COMP%] {\n padding: 16px;\n}\n\n.card-body[_ngcontent-%COMP%] .description[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n}\n\n.detail.error[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n.detail[_ngcontent-%COMP%] .label[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail[_ngcontent-%COMP%] .value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-color, #333);\n}\n\n.detail[_ngcontent-%COMP%] .value.url[_ngcontent-%COMP%], \n.detail[_ngcontent-%COMP%] .value.command[_ngcontent-%COMP%] {\n font-family: monospace;\n font-size: 12px;\n background: #f5f5f5;\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated[_ngcontent-%COMP%] {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown[_ngcontent-%COMP%] {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n\n\n.sync-progress-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #2196f3;\n}\n\n.sync-progress-banner[_ngcontent-%COMP%] .sync-message[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.sync-result-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #4caf50;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #f44336;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.data-table[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.data-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: #f5f5f5;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.data-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.error-row[_ngcontent-%COMP%] {\n background: rgba(244, 67, 54, 0.05);\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table[_ngcontent-%COMP%] .tool-name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.data-table[_ngcontent-%COMP%] .error-message[_ngcontent-%COMP%] {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #f44336;\n font-size: 12px;\n}\n\n.data-table[_ngcontent-%COMP%] .server-name[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n margin-left: 6px;\n font-size: 10px;\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table[_ngcontent-%COMP%] th.sortable[_ngcontent-%COMP%]:hover .sort-icon[_ngcontent-%COMP%] {\n color: #999;\n}\n\n.data-table[_ngcontent-%COMP%] th.sorted-asc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%], \n.data-table[_ngcontent-%COMP%] th.sorted-desc[_ngcontent-%COMP%] .sort-icon[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #e0e0e0;\n margin-bottom: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-color, #333);\n}\n\n.empty-state[_ngcontent-%COMP%] .hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n\n\n\n\n.view-toggle[_ngcontent-%COMP%] {\n display: flex;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle[_ngcontent-%COMP%] button.active[_ngcontent-%COMP%] {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n\n\n\n\n.tools-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group[_ngcontent-%COMP%] {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\n}\n\n.server-group.collapsed[_ngcontent-%COMP%] .server-group-header[_ngcontent-%COMP%] {\n border-bottom: none;\n}\n\n.server-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.server-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-count[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small[_ngcontent-%COMP%] {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n\n\n\n\n.tools-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card[_ngcontent-%COMP%] {\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-primary-color, #2196f3);\n}\n\n.tool-card-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.tool-title[_ngcontent-%COMP%] .name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.param-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-description[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid #f0f0f0;\n background: #fafafa;\n}\n\n\n\n.tool-details[_ngcontent-%COMP%] {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row[_ngcontent-%COMP%] {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-row.full[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n min-width: 100px;\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview[_ngcontent-%COMP%] {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n\n\n\n\n.tools-list[_ngcontent-%COMP%] {\n overflow: auto;\n}\n\n.tools-list[_ngcontent-%COMP%] table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.tools-list[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.tools-list[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%] {\n transition: background 0.15s ease;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background: #fafafa;\n}\n\n.tools-list[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr.expanded[_ngcontent-%COMP%] {\n background: rgba(33, 150, 243, 0.04);\n}\n\n.tool-name-cell[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n margin-top: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.tool-name-info[_ngcontent-%COMP%] .tool-code[_ngcontent-%COMP%] {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.description-cell[_ngcontent-%COMP%] {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.actions-cell[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n\n\n.detail-row-expanded[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: 0;\n background: #fafafa;\n}\n\n.inline-details[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed #e0e0e0;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-section.full[_ngcontent-%COMP%] {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-label[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value[_ngcontent-%COMP%] {\n color: var(--mj-text-color, #333);\n}\n\n.inline-details[_ngcontent-%COMP%] .detail-value.mono[_ngcontent-%COMP%] {\n font-family: monospace;\n}\n\n\n\n\n\n@media (max-width: 900px) {\n .mcp-dashboard[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .sidebar[_ngcontent-%COMP%] {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .sidebar-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\n }\n\n .sidebar-nav[_ngcontent-%COMP%] {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats[_ngcontent-%COMP%] {\n display: none;\n }\n\n .sidebar-footer[_ngcontent-%COMP%] {\n border-top: none;\n border-left: 1px solid #e0e0e0;\n padding: 8px;\n }\n\n .data-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n flex-wrap: wrap;\n }\n\n .search-box[_ngcontent-%COMP%] {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .search-box[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n\n\n\n\n.clickable-row[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover {\n background: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row[_ngcontent-%COMP%] .action-cell[_ngcontent-%COMP%] {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row[_ngcontent-%COMP%]:hover .action-cell[_ngcontent-%COMP%] {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.action-cell[_ngcontent-%COMP%] {\n width: 40px;\n text-align: center;\n}\n\n\n\n\n\n.card-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable[_ngcontent-%COMP%]:hover {\n background: #f0f0f0;\n}\n\n.expand-arrow[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated[_ngcontent-%COMP%] {\n transform: rotate(90deg);\n}\n\n.data-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n\n\n\n\n.expanded-tools-section[_ngcontent-%COMP%] {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\n}\n\n.tools-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\n}\n\n.tools-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #999;\n}\n\n\n\n.tools-mini-list[_ngcontent-%COMP%] {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\n}\n\n.tool-mini-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name[_ngcontent-%COMP%] {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-color, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.tool-mini-params[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.tool-mini-card[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n\n\n[_nghost-%COMP%] .search-highlight, \n.search-highlight[_ngcontent-%COMP%] {\n background-color: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}"] });
|
|
2470
2755
|
};
|
|
2471
2756
|
MCPDashboardComponent = __decorate([
|
|
2472
2757
|
RegisterClass(BaseDashboard, 'MCPDashboard')
|
|
@@ -2474,13 +2759,7 @@ MCPDashboardComponent = __decorate([
|
|
|
2474
2759
|
export { MCPDashboardComponent };
|
|
2475
2760
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MCPDashboardComponent, [{
|
|
2476
2761
|
type: Component,
|
|
2477
|
-
args: [{ selector: 'mj-mcp-dashboard', template: "<div class=\"mcp-dashboard\">\n <!-- Left Sidebar Navigation -->\n <div class=\"sidebar\">\n <div class=\"sidebar-header\">\n <i class=\"fa-solid fa-plug-circle-bolt\"></i>\n <span class=\"sidebar-title\">MCP</span>\n </div>\n\n <nav class=\"sidebar-nav\">\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'servers'\" (click)=\"setActiveTab('servers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span class=\"nav-label\">Servers</span>\n <span class=\"nav-badge\">{{ servers.length }}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'connections'\" (click)=\"setActiveTab('connections')\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"nav-label\">Connections</span>\n <span class=\"nav-badge\">{{ connections.length }}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'tools'\" (click)=\"setActiveTab('tools')\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"nav-label\">Tools</span>\n <span class=\"nav-badge\">{{ tools.length }}</span>\n </button>\n <button class=\"nav-item\" [class.active]=\"ActiveTab === 'logs'\" (click)=\"setActiveTab('logs')\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span class=\"nav-label\">Logs</span>\n <span class=\"nav-badge\" [class.has-errors]=\"stats.failedExecutions > 0\">{{ executionLogs.length }}</span>\n </button>\n </nav>\n\n <!-- Sidebar Stats Summary -->\n <div class=\"sidebar-stats\">\n <div class=\"stat-row\">\n <span class=\"stat-label\">Active Servers</span>\n <span class=\"stat-value\">{{ stats.activeServers }}/{{ stats.totalServers }}</span>\n </div>\n <div class=\"stat-row\">\n <span class=\"stat-label\">Active Connections</span>\n <span class=\"stat-value\">{{ stats.activeConnections }}/{{ stats.totalConnections }}</span>\n </div>\n <div class=\"stat-row\">\n <span class=\"stat-label\">Active Tools</span>\n <span class=\"stat-value\">{{ stats.activeTools }}/{{ stats.totalTools }}</span>\n </div>\n @if (stats.failedExecutions > 0) {\n <div class=\"stat-row error\">\n <span class=\"stat-label\">Failed (7d)</span>\n <span class=\"stat-value\">{{ stats.failedExecutions }}</span>\n </div>\n }\n </div>\n\n <div class=\"sidebar-footer\">\n <button kendoButton fillMode=\"flat\" (click)=\"loadAllData()\" [disabled]=\"IsLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n </div>\n </div>\n\n <!-- Main Content Area -->\n <div class=\"main-content\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n <button class=\"close-btn\" (click)=\"ErrorMessage = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <!-- Content Header with Search and Filters -->\n <div class=\"content-header\">\n <h2 class=\"content-title\">\n @switch (ActiveTab) {\n @case ('servers') { MCP Servers }\n @case ('connections') { Server Connections }\n @case ('tools') { Available Tools }\n @case ('logs') { Execution Logs }\n }\n </h2>\n\n <div class=\"header-actions\">\n <!-- Search -->\n <div class=\"search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input type=\"text\"\n placeholder=\"Search...\"\n [ngModel]=\"(filters$ | async)?.searchTerm\"\n (ngModelChange)=\"onSearchChange($event)\">\n </div>\n\n <!-- Status Filter -->\n @switch (ActiveTab) {\n @case ('servers') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.serverStatus\"\n (ngModelChange)=\"onStatusFilterChange('server', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n </select>\n <button kendoButton themeColor=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.connectionStatus\"\n (ngModelChange)=\"onStatusFilterChange('connection', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Active\">Active</option>\n <option value=\"Inactive\">Inactive</option>\n <option value=\"Error\">Error</option>\n </select>\n <button kendoButton themeColor=\"primary\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.toolStatus\"\n (ngModelChange)=\"onStatusFilterChange('tool', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Active\">Active</option>\n <option value=\"Deprecated\">Deprecated</option>\n </select>\n <!-- View Mode Toggle -->\n <div class=\"view-toggle\">\n <button kendoButton\n fillMode=\"flat\"\n [class.active]=\"ToolsViewMode === 'card'\"\n (click)=\"setToolsViewMode('card')\"\n title=\"Card View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button kendoButton\n fillMode=\"flat\"\n [class.active]=\"ToolsViewMode === 'list'\"\n (click)=\"setToolsViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n <!-- Sort Dropdown -->\n <select class=\"status-filter\"\n [(ngModel)]=\"ToolsSortBy\"\n (ngModelChange)=\"setToolsSort($event)\">\n <option value=\"server\">Sort by Server</option>\n <option value=\"name\">Sort by Name</option>\n <option value=\"discovered\">Sort by Discovered</option>\n <option value=\"lastSeen\">Sort by Last Seen</option>\n </select>\n <button kendoButton themeColor=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <select class=\"status-filter\"\n [ngModel]=\"(filters$ | async)?.logStatus\"\n (ngModelChange)=\"onStatusFilterChange('log', $event)\">\n <option value=\"all\">All Status</option>\n <option value=\"Success\">Success</option>\n <option value=\"Error\">Error</option>\n <option value=\"Running\">Running</option>\n </select>\n }\n }\n </div>\n </div>\n\n <!-- Content Body -->\n <div class=\"content-body\">\n @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button kendoButton themeColor=\"primary\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\" [innerHTML]=\"server.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton fillMode=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\" [innerHTML]=\"server.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button kendoButton themeColor=\"primary\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\" [innerHTML]=\"conn.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\" [innerHTML]=\"conn.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n @if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ group.tools.length }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton fillMode=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\" [innerHTML]=\"tool.ToolDescription | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"tool-card-actions\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\" [innerHTML]=\"(tool.ToolDescription || '-') | highlightSearch:(filters$ | async)?.searchTerm\">\n </td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n</div>\n\n<!-- Server Dialog -->\n@if (ShowServerDialog) {\n <mj-mcp-server-dialog\n [server]=\"EditingServer\"\n [visible]=\"ShowServerDialog\"\n (close)=\"onServerDialogClose($event)\">\n </mj-mcp-server-dialog>\n}\n\n<!-- Connection Dialog -->\n@if (ShowConnectionDialog) {\n <mj-mcp-connection-dialog\n [connection]=\"EditingConnection\"\n [servers]=\"servers\"\n [visible]=\"ShowConnectionDialog\"\n (close)=\"onConnectionDialogClose($event)\">\n </mj-mcp-connection-dialog>\n}\n\n<!-- Test Tool Dialog -->\n@if (ShowTestToolDialog) {\n <mj-mcp-test-tool-dialog\n [Visible]=\"ShowTestToolDialog\"\n [Servers]=\"servers\"\n [Connections]=\"connections\"\n [Tools]=\"tools\"\n [SelectedServerID]=\"TestToolServerID\"\n [SelectedConnectionID]=\"TestToolConnectionID\"\n [SelectedToolID]=\"TestToolID\"\n (Close)=\"onTestToolDialogClose()\">\n </mj-mcp-test-tool-dialog>\n}\n\n<!-- Log Detail Panel -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <mj-mcp-log-detail-panel\n [Visible]=\"ShowLogDetailPanel\"\n [Log]=\"SelectedLog\"\n (Close)=\"onLogDetailClose()\"\n (RunAgain)=\"onRunAgainFromLog($event)\">\n </mj-mcp-log-detail-panel>\n}\n", styles: ["/* MCP Dashboard - Left Sidebar Layout */\n.mcp-dashboard {\n display: flex;\n flex-direction: row;\n height: 100%;\n background: var(--mj-background-color, #f5f5f5);\n overflow: hidden;\n}\n\n/* ========================================\n Left Sidebar\n ======================================== */\n.sidebar {\n display: flex;\n flex-direction: column;\n width: 220px;\n min-width: 220px;\n background: white;\n border-right: 1px solid #e0e0e0;\n box-shadow: 2px 0 4px rgba(0, 0, 0, 0.04);\n}\n\n.sidebar-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 16px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.sidebar-header i {\n font-size: 24px;\n color: var(--mj-primary-color, #2196f3);\n}\n\n.sidebar-title {\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n/* Sidebar Navigation */\n.sidebar-nav {\n display: flex;\n flex-direction: column;\n padding: 12px 8px;\n flex: 1;\n}\n\n.nav-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin-bottom: 4px;\n background: none;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n text-align: left;\n width: 100%;\n}\n\n.nav-item:hover {\n background: rgba(33, 150, 243, 0.08);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item.active {\n background: rgba(33, 150, 243, 0.12);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.nav-item i {\n width: 20px;\n text-align: center;\n font-size: 16px;\n}\n\n.nav-label {\n flex: 1;\n}\n\n.nav-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 20px;\n padding: 0 6px;\n background: #e0e0e0;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.nav-item.active .nav-badge {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n.nav-badge.has-errors {\n background: #f44336;\n color: white;\n}\n\n/* Sidebar Stats */\n.sidebar-stats {\n padding: 16px;\n border-top: 1px solid #e0e0e0;\n background: #fafafa;\n}\n\n.stat-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.stat-row .stat-label {\n color: var(--mj-text-secondary-color, #666);\n}\n\n.stat-row .stat-value {\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.stat-row.error .stat-value {\n color: #f44336;\n}\n\n/* Sidebar Footer */\n.sidebar-footer {\n display: flex;\n justify-content: center;\n padding: 12px;\n border-top: 1px solid #e0e0e0;\n}\n\n/* ========================================\n Main Content Area\n ======================================== */\n.main-content {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Content Header */\n.content-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n}\n\n.content-title {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.header-actions {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n/* Search Box */\n.search-box {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: #f5f5f5;\n border-radius: 6px;\n min-width: 200px;\n}\n\n.search-box i {\n color: #999;\n}\n\n.search-box input {\n flex: 1;\n border: none;\n background: none;\n outline: none;\n font-size: 14px;\n}\n\n.status-filter {\n padding: 8px 12px;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n font-size: 14px;\n background: white;\n cursor: pointer;\n}\n\n/* Content Body */\n.content-body {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n/* Error Banner */\n.error-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #c62828;\n padding: 4px;\n}\n\n/* ========================================\n Data Display Components\n ======================================== */\n\n/* Data Grid (Cards) */\n.data-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\n transition: box-shadow 0.2s ease;\n}\n\n.data-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.card-title {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.card-title .name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions {\n display: flex;\n gap: 4px;\n}\n\n.card-actions button {\n padding: 4px 8px;\n}\n\n.card-body {\n padding: 16px;\n}\n\n.card-body .description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width {\n grid-column: 1 / -1;\n}\n\n.detail.error .value {\n color: #f44336;\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-color, #333);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: #f5f5f5;\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n/* Status Badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n/* Sync Progress & Result Banners */\n.sync-progress-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: #2196f3;\n}\n\n.sync-progress-banner .sync-message {\n flex: 1;\n}\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success {\n background: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success i {\n color: #4caf50;\n}\n\n.sync-result-banner.error {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error i {\n color: #f44336;\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.data-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th,\n.data-table td {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.data-table tbody tr {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table tbody tr:hover {\n background: #f5f5f5;\n}\n\n.data-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.data-table tbody tr.error-row {\n background: rgba(244, 67, 54, 0.05);\n}\n\n.data-table .tool-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table .tool-name i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #f44336;\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n/* Sortable Column Headers */\n.data-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table th.sortable:hover {\n background: #f0f0f0;\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: #999;\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-primary-color, #2196f3);\n}\n\n/* Status badge icons */\n.status-badge i {\n font-size: 12px;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state i {\n font-size: 48px;\n color: #e0e0e0;\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-color, #333);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View Mode Toggle\n ======================================== */\n.view-toggle {\n display: flex;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle button {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle button.active {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n/* ========================================\n Tools Tab - Server Groups\n ======================================== */\n.tools-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\n}\n\n.server-group.collapsed .server-group-header {\n border-bottom: none;\n}\n\n.server-info {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.server-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions {\n display: flex;\n gap: 4px;\n}\n\n/* ========================================\n Tools Grid (Card View)\n ======================================== */\n.tools-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card {\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-primary-color, #2196f3);\n}\n\n.tool-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title i {\n color: var(--mj-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.param-badge i {\n font-size: 10px;\n}\n\n.tool-description {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid #f0f0f0;\n background: #fafafa;\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\n}\n\n.tool-details .detail-row {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details .detail-row.full {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details .detail-label {\n min-width: 100px;\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Tools List View\n ======================================== */\n.tools-list {\n overflow: auto;\n}\n\n.tools-list table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list th,\n.tools-list td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.tools-list tbody tr {\n transition: background 0.15s ease;\n}\n\n.tools-list tbody tr:hover {\n background: #fafafa;\n}\n\n.tools-list tbody tr.expanded {\n background: rgba(33, 150, 243, 0.04);\n}\n\n.tool-name-cell {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell i {\n color: var(--mj-primary-color, #2196f3);\n margin-top: 2px;\n}\n\n.tool-name-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info .tool-title {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.actions-cell {\n white-space: nowrap;\n}\n\n/* Expanded Detail Row in List View */\n.detail-row-expanded td {\n padding: 0;\n background: #fafafa;\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed #e0e0e0;\n}\n\n.inline-details .detail-section {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details .detail-section.full {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details .detail-label {\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-color, #333);\n}\n\n.inline-details .detail-value.mono {\n font-family: monospace;\n}\n\n/* ========================================\n Responsive Styles\n ======================================== */\n@media (max-width: 900px) {\n .mcp-dashboard {\n flex-direction: column;\n }\n\n .sidebar {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\n }\n\n .sidebar-nav {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats {\n display: none;\n }\n\n .sidebar-footer {\n border-top: none;\n border-left: 1px solid #e0e0e0;\n padding: 8px;\n }\n\n .data-grid {\n grid-template-columns: 1fr;\n }\n\n .header-actions {\n flex-wrap: wrap;\n }\n\n .search-box {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions {\n width: 100%;\n }\n\n .search-box {\n width: 100%;\n }\n}\n\n/* ========================================\n Clickable Log Rows\n ======================================== */\n.clickable-row {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row:hover {\n background: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row .action-cell {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.action-cell {\n width: 40px;\n text-align: center;\n}\n\n/* ========================================\n Expandable Card Styles\n ======================================== */\n.card-header.clickable {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable:hover {\n background: #f0f0f0;\n}\n\n.expand-arrow {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated {\n transform: rotate(90deg);\n}\n\n.data-card.expanded {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\n}\n\n.tools-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\n}\n\n.tools-section-header i {\n font-size: 14px;\n}\n\n.no-tools-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: #999;\n}\n\n/* Tools Mini List */\n.tools-mini-list {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\n}\n\n.tool-mini-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-color, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.tool-mini-params i {\n font-size: 10px;\n}\n\n.tool-mini-card button {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
|
|
2478
|
-
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.Router }, { type: i2.NavigationService }, { type: i3.MCPToolsService }], null); })();
|
|
2479
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPDashboardComponent, { className: "MCPDashboardComponent", filePath: "src/MCP/mcp-dashboard.component.ts", lineNumber:
|
|
2480
|
-
/**
|
|
2481
|
-
* Tree-shaking prevention function
|
|
2482
|
-
*/
|
|
2483
|
-
export function LoadMCPDashboard() {
|
|
2484
|
-
// Ensures the component is not tree-shaken
|
|
2485
|
-
}
|
|
2762
|
+
args: [{ standalone: false, selector: 'mj-mcp-dashboard', template: "<div class=\"mcp-dashboard\">\n <!-- Header -->\n <div class=\"dashboard-header\">\n <div class=\"header-info\">\n <h2 class=\"dashboard-title\">\n <i class=\"fa-solid fa-plug-circle-bolt\"></i>\n MCP Dashboard\n </h2>\n <button\n type=\"button\"\n class=\"filter-toggle-btn\"\n (click)=\"toggleFilterPanel()\"\n title=\"Toggle Filters\">\n <i class=\"fa-solid fa-filter\"></i>\n @if (FilterPanelVisible) {\n Hide Filters\n } @else {\n Show Filters\n }\n </button>\n <span class=\"item-count\">{{ CurrentFilteredCount }} of {{ CurrentTotalCount }} items</span>\n </div>\n\n <div class=\"header-controls\">\n <!-- Tab Navigation -->\n <div class=\"tab-nav\">\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'servers'\"\n (click)=\"setActiveTab('servers')\">\n <i class=\"fa-solid fa-server\"></i>\n <span class=\"tab-label\">Servers</span>\n <span class=\"tab-badge\">{{ servers.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'connections'\"\n (click)=\"setActiveTab('connections')\">\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"tab-label\">Connections</span>\n <span class=\"tab-badge\">{{ connections.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'tools'\"\n (click)=\"setActiveTab('tools')\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"tab-label\">Tools</span>\n <span class=\"tab-badge\">{{ tools.length }}</span>\n </button>\n <button\n type=\"button\"\n class=\"tab-btn\"\n [class.active]=\"ActiveTab === 'logs'\"\n (click)=\"setActiveTab('logs')\">\n <i class=\"fa-solid fa-list-check\"></i>\n <span class=\"tab-label\">Logs</span>\n <span class=\"tab-badge\" [class.has-errors]=\"stats.failedExecutions > 0\">{{ executionLogs.length }}</span>\n </button>\n </div>\n\n <!-- Action Buttons based on tab -->\n @switch (ActiveTab) {\n @case ('servers') {\n <button kendoButton themeColor=\"primary\" (click)=\"createServer()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Server\n </button>\n }\n @case ('connections') {\n <button kendoButton themeColor=\"primary\" (click)=\"createConnection()\">\n <i class=\"fa-solid fa-plus\"></i>\n Add Connection\n </button>\n }\n @case ('tools') {\n <!-- View Mode Toggle -->\n <div class=\"view-toggle\">\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'card'\"\n (click)=\"setToolsViewMode('card')\"\n title=\"Card View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button\n type=\"button\"\n class=\"view-btn\"\n [class.active]=\"ToolsViewMode === 'list'\"\n (click)=\"setToolsViewMode('list')\"\n title=\"List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n <button kendoButton themeColor=\"primary\" (click)=\"openTestToolDialog()\">\n <i class=\"fa-solid fa-play\"></i>\n Test Tool\n </button>\n }\n @case ('logs') {\n <button kendoButton fillMode=\"flat\" (click)=\"loadAllData()\" [disabled]=\"IsLoading\" title=\"Refresh\">\n <i class=\"fa-solid fa-sync\" [class.fa-spin]=\"IsLoading\"></i>\n Refresh\n </button>\n }\n }\n </div>\n </div>\n\n <!-- Main Content with Filter Panel -->\n <div class=\"main-content\">\n <!-- Filter Panel (Left) -->\n <div class=\"filter-panel-container\" [class.hidden]=\"!FilterPanelVisible\">\n <mj-mcp-filter-panel\n [filters]=\"CurrentFilters\"\n [activeTab]=\"ActiveTab\"\n [totalCount]=\"CurrentTotalCount\"\n [filteredCount]=\"CurrentFilteredCount\"\n (filtersChange)=\"onFiltersChange($event)\"\n (closePanel)=\"toggleFilterPanel()\">\n </mj-mcp-filter-panel>\n <!-- Resize Handle -->\n <div class=\"resize-handle\"></div>\n </div>\n\n <!-- Content Area -->\n <div class=\"content-area\">\n <!-- Error Message -->\n @if (ErrorMessage) {\n <div class=\"error-banner\">\n <i class=\"fa-solid fa-exclamation-triangle\"></i>\n {{ ErrorMessage }}\n <button class=\"close-btn\" (click)=\"ErrorMessage = null\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <!-- Content Body -->\n <div class=\"content-body\">\n @if (IsLoading) {\n <mj-loading text=\"Loading MCP data...\"></mj-loading>\n } @else {\n @switch (ActiveTab) {\n <!-- Servers Tab -->\n @case ('servers') {\n <div class=\"data-grid servers-grid\">\n @if (filteredServers.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-server\"></i>\n <p>No MCP servers configured</p>\n <button kendoButton themeColor=\"primary\" (click)=\"createServer()\">\n Add Your First Server\n </button>\n </div>\n } @else {\n @for (server of filteredServers; track server.ID) {\n <div class=\"data-card\" [class.expanded]=\"isServerExpanded(server)\">\n <div class=\"card-header clickable\" (click)=\"toggleServerExpand(server)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isServerExpanded(server)\"></i>\n <i [class]=\"getTransportIcon(server.TransportType)\"></i>\n <span class=\"name\" [innerHTML]=\"server.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(server.Status)\">\n {{ server.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton fillMode=\"flat\" (click)=\"editServer(server)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"deleteServer(server)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <div class=\"card-body\">\n @if (server.Description) {\n <p class=\"description\" [innerHTML]=\"server.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Transport</span>\n <span class=\"value\">{{ server.TransportType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auth</span>\n <span class=\"value\">{{ server.DefaultAuthType }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Connections</span>\n <span class=\"value\">{{ server.ConnectionCount }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Tools</span>\n <span class=\"value\">{{ server.ToolCount }}</span>\n </div>\n @if (server.ServerURL) {\n <div class=\"detail full-width\">\n <span class=\"label\">URL</span>\n <span class=\"value url\">{{ server.ServerURL }}</span>\n </div>\n }\n @if (server.Command) {\n <div class=\"detail full-width\">\n <span class=\"label\">Command</span>\n <span class=\"value command\">{{ server.Command }}</span>\n </div>\n }\n <div class=\"detail\">\n <span class=\"label\">Last Sync</span>\n <span class=\"value\">{{ formatDate(server.LastSyncAt) }}</span>\n </div>\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isServerExpanded(server)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForServer(server.ID).length }})</span>\n </div>\n @if (getToolsForServer(server.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Sync a connection to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForServer(server.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n (click)=\"runToolFromCard(tool); $event.stopPropagation()\"\n title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Connections Tab -->\n @case ('connections') {\n <div class=\"data-grid connections-grid\">\n @if (filteredConnections.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-link\"></i>\n <p>No connections configured</p>\n <button kendoButton themeColor=\"primary\" (click)=\"createConnection()\">\n Add Your First Connection\n </button>\n </div>\n } @else {\n @for (conn of filteredConnections; track conn.ID) {\n <div class=\"data-card\" [class.expanded]=\"isConnectionExpanded(conn)\">\n <div class=\"card-header clickable\" (click)=\"toggleConnectionExpand(conn)\">\n <div class=\"card-title\">\n <i class=\"fa-solid fa-chevron-right expand-arrow\" [class.rotated]=\"isConnectionExpanded(conn)\"></i>\n <i class=\"fa-solid fa-link\"></i>\n <span class=\"name\" [innerHTML]=\"conn.Name | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(conn.Status)\">\n {{ conn.Status }}\n </span>\n </div>\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton\n fillMode=\"flat\"\n (click)=\"syncConnectionTools(conn)\"\n [disabled]=\"isSyncing(conn.ID)\"\n title=\"Sync Tools\">\n @if (isSyncing(conn.ID)) {\n <i class=\"fa-solid fa-sync fa-spin\"></i>\n } @else {\n <i class=\"fa-solid fa-sync\"></i>\n }\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"editConnection(conn)\" title=\"Edit\">\n <i class=\"fa-solid fa-pen\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" (click)=\"deleteConnection(conn)\" title=\"Delete\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n </div>\n <!-- Sync Progress Banner -->\n @if (isSyncing(conn.ID)) {\n <div class=\"sync-progress-banner\">\n <i class=\"fa-solid fa-circle-notch fa-spin\"></i>\n <span class=\"sync-message\">{{ getSyncProgressMessage(conn.ID) || 'Syncing...' }}</span>\n </div>\n }\n <!-- Sync Result Banner -->\n @if (getSyncState(conn.ID)?.lastResult && !isSyncing(conn.ID)) {\n <div class=\"sync-result-banner\"\n [class.success]=\"getSyncState(conn.ID)?.lastResult?.Success\"\n [class.error]=\"!getSyncState(conn.ID)?.lastResult?.Success\">\n @if (getSyncState(conn.ID)?.lastResult?.Success) {\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Synced: {{ getSyncState(conn.ID)?.lastResult?.Added }} added,\n {{ getSyncState(conn.ID)?.lastResult?.Updated }} updated,\n {{ getSyncState(conn.ID)?.lastResult?.Deprecated }} deprecated\n </span>\n } @else {\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ getSyncState(conn.ID)?.lastResult?.ErrorMessage }}</span>\n }\n </div>\n }\n <div class=\"card-body\">\n @if (conn.Description) {\n <p class=\"description\" [innerHTML]=\"conn.Description | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"details-grid\">\n <div class=\"detail\">\n <span class=\"label\">Server</span>\n <span class=\"value\">{{ conn.ServerName }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Auto Sync</span>\n <span class=\"value\">{{ conn.AutoSyncTools ? 'Yes' : 'No' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Logging</span>\n <span class=\"value\">{{ conn.LogToolCalls ? 'Enabled' : 'Disabled' }}</span>\n </div>\n <div class=\"detail\">\n <span class=\"label\">Last Connected</span>\n <span class=\"value\">{{ formatDate(conn.LastConnectedAt) }}</span>\n </div>\n @if (conn.LastErrorMessage) {\n <div class=\"detail full-width error\">\n <span class=\"label\">Last Error</span>\n <span class=\"value\">{{ conn.LastErrorMessage }}</span>\n </div>\n }\n </div>\n </div>\n <!-- Expanded Tools Section -->\n @if (isConnectionExpanded(conn)) {\n <div class=\"expanded-tools-section\">\n <div class=\"tools-section-header\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span>Available Tools ({{ getToolsForConnection(conn.ID).length }})</span>\n </div>\n @if (getToolsForConnection(conn.ID).length === 0) {\n <div class=\"no-tools-message\">\n <i class=\"fa-solid fa-info-circle\"></i>\n No tools discovered yet. Click the sync button to discover tools.\n </div>\n } @else {\n <div class=\"tools-mini-list\">\n @for (tool of getToolsForConnection(conn.ID); track tool.ID) {\n <div class=\"tool-mini-card\">\n <div class=\"tool-mini-info\">\n <span class=\"tool-mini-name\">{{ tool.ToolTitle || tool.ToolName }}</span>\n <span class=\"tool-mini-params\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }} params\n </span>\n </div>\n <button kendoButton\n fillMode=\"flat\"\n size=\"small\"\n (click)=\"runToolFromCard(tool, conn); $event.stopPropagation()\"\n title=\"Test this tool with this connection\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n </div>\n }\n\n <!-- Tools Tab -->\n @case ('tools') {\n @if (ServerGroups.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-wrench\"></i>\n <p>No tools discovered yet</p>\n <span class=\"hint\">Tools are discovered when connections sync with MCP servers</span>\n </div>\n } @else {\n <div class=\"tools-container\">\n <!-- Server Groups -->\n @for (group of ServerGroups; track group.server.ID) {\n <div class=\"server-group\" [class.collapsed]=\"!group.expanded\">\n <!-- Server Group Header -->\n <div class=\"server-group-header\" (click)=\"toggleServerGroup(group)\">\n <div class=\"server-info\">\n <i class=\"fa-solid fa-chevron-right expand-icon\" [class.expanded]=\"group.expanded\"></i>\n <i [class]=\"getTransportIcon(group.server.TransportType)\"></i>\n <span class=\"server-name\">{{ group.server.Name }}</span>\n <span class=\"tool-count\">{{ group.tools.length }} tools</span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(group.server.Status)\">\n {{ group.server.Status }}\n </span>\n </div>\n <div class=\"server-actions\" (click)=\"$event.stopPropagation()\">\n <button kendoButton fillMode=\"flat\" (click)=\"openTestToolDialog(undefined, undefined)\" title=\"Test a tool\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n </div>\n </div>\n\n <!-- Tools Content -->\n @if (group.expanded) {\n <!-- Card View -->\n @if (ToolsViewMode === 'card') {\n <div class=\"tools-grid\">\n @for (tool of group.tools; track tool.ID) {\n <div class=\"tool-card\" [class.expanded]=\"isToolExpanded(tool)\">\n <div class=\"tool-card-header\" (click)=\"toggleToolExpand(tool)\">\n <div class=\"tool-title\">\n <i class=\"fa-solid fa-wrench\"></i>\n <span class=\"name\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n </div>\n <div class=\"tool-meta\">\n <span class=\"param-badge\" title=\"Parameters\">\n <i class=\"fa-solid fa-sliders\"></i>\n {{ getParamCount(tool) }}\n </span>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </div>\n </div>\n @if (tool.ToolDescription) {\n <p class=\"tool-description\" [innerHTML]=\"tool.ToolDescription | highlightSearch:(filters$ | async)?.searchTerm\"></p>\n }\n <div class=\"tool-card-actions\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test this tool\">\n <i class=\"fa-solid fa-play\"></i>\n Test\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"toggleToolExpand(tool)\" title=\"View details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n {{ isToolExpanded(tool) ? 'Less' : 'More' }}\n </button>\n </div>\n <!-- Expanded Details -->\n @if (isToolExpanded(tool)) {\n <div class=\"tool-details\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Parameters:</span>\n <span class=\"detail-value\">\n {{ getParamCount(tool) }} total, {{ getRequiredParamCount(tool) }} required\n </span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Last Seen:</span>\n <span class=\"detail-value\">{{ formatDate(tool.LastSeenAt) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-row full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else {\n <!-- List View -->\n <div class=\"tools-list\">\n <table>\n <thead>\n <tr>\n <th>Tool</th>\n <th>Description</th>\n <th>Params</th>\n <th>Status</th>\n <th>Last Seen</th>\n <th>Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (tool of group.tools; track tool.ID) {\n <tr [class.expanded]=\"isToolExpanded(tool)\">\n <td class=\"tool-name-cell\">\n <i class=\"fa-solid fa-wrench\"></i>\n <div class=\"tool-name-info\">\n <span class=\"tool-title\" [innerHTML]=\"(tool.ToolTitle || tool.ToolName) | highlightSearch:(filters$ | async)?.searchTerm\"></span>\n @if (tool.ToolTitle) {\n <span class=\"tool-code\">{{ tool.ToolName }}</span>\n }\n </div>\n </td>\n <td class=\"description-cell\" [innerHTML]=\"(tool.ToolDescription || '-') | highlightSearch:(filters$ | async)?.searchTerm\">\n </td>\n <td>\n <span class=\"param-count\">{{ getParamCount(tool) }}</span>\n </td>\n <td>\n <span class=\"status-badge small\" [ngClass]=\"getStatusClass(tool.Status)\">\n {{ tool.Status }}\n </span>\n </td>\n <td>{{ formatDate(tool.LastSeenAt) }}</td>\n <td class=\"actions-cell\">\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"openTestToolDialog(tool)\" title=\"Test\">\n <i class=\"fa-solid fa-play\"></i>\n </button>\n <button kendoButton fillMode=\"flat\" size=\"small\" (click)=\"toggleToolExpand(tool)\" title=\"Details\">\n <i class=\"fa-solid\" [class.fa-chevron-down]=\"!isToolExpanded(tool)\" [class.fa-chevron-up]=\"isToolExpanded(tool)\"></i>\n </button>\n </td>\n </tr>\n @if (isToolExpanded(tool)) {\n <tr class=\"detail-row-expanded\">\n <td colspan=\"6\">\n <div class=\"inline-details\">\n <div class=\"detail-section\">\n <span class=\"detail-label\">Tool Name:</span>\n <span class=\"detail-value mono\">{{ tool.ToolName }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Discovered:</span>\n <span class=\"detail-value\">{{ formatDate(tool.DiscoveredAt) }}</span>\n </div>\n <div class=\"detail-section\">\n <span class=\"detail-label\">Required Params:</span>\n <span class=\"detail-value\">{{ getRequiredParamCount(tool) }}</span>\n </div>\n @if (tool.InputSchema) {\n <div class=\"detail-section full\">\n <span class=\"detail-label\">Input Schema:</span>\n <pre class=\"schema-preview\">{{ getFormattedInputSchema(tool) }}</pre>\n </div>\n }\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- Logs Tab -->\n @case ('logs') {\n <div class=\"data-table\">\n @if (filteredLogs.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-list-check\"></i>\n <p>No recent execution logs</p>\n <span class=\"hint\">Logs appear when tools are executed via MCP connections</span>\n </div>\n } @else {\n <table>\n <thead>\n <tr>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('status')\" (click)=\"onLogSortColumn('status')\">\n Status\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'status' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'status' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'status'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('server')\" (click)=\"onLogSortColumn('server')\">\n Server\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'server' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'server' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'server'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('tool')\" (click)=\"onLogSortColumn('tool')\">\n Tool\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'tool' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'tool' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'tool'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('connection')\" (click)=\"onLogSortColumn('connection')\">\n Connection\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'connection' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'connection' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'connection'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('started')\" (click)=\"onLogSortColumn('started')\">\n Started\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'started' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'started' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'started'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('duration')\" (click)=\"onLogSortColumn('duration')\">\n Duration\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'duration' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'duration' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'duration'\"></i>\n </th>\n <th class=\"sortable\" [ngClass]=\"getLogSortClass('error')\" (click)=\"onLogSortColumn('error')\">\n Error\n <i class=\"sort-icon fa-solid\" [class.fa-sort-up]=\"LogsSortColumn === 'error' && LogsSortAscending\" [class.fa-sort-down]=\"LogsSortColumn === 'error' && !LogsSortAscending\" [class.fa-sort]=\"LogsSortColumn !== 'error'\"></i>\n </th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n @for (log of filteredLogs; track log.ID) {\n <tr [class.error-row]=\"log.Status === 'Error'\"\n class=\"clickable-row\"\n (click)=\"onLogClick(log)\"\n title=\"Click for details\">\n <td>\n <span class=\"status-badge\" [ngClass]=\"getStatusClass(log.Status)\">\n @switch (log.Status) {\n @case ('Success') {\n <i class=\"fa-solid fa-check-circle\"></i>\n }\n @case ('Error') {\n <i class=\"fa-solid fa-times-circle\"></i>\n }\n @case ('Running') {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n }\n @default {\n <i class=\"fa-solid fa-question-circle\"></i>\n }\n }\n {{ log.Status || 'Unknown' }}\n </span>\n </td>\n <td class=\"server-name\">{{ log.ServerName }}</td>\n <td class=\"tool-name\">{{ log.ToolName }}</td>\n <td>{{ log.ConnectionName }}</td>\n <td>{{ formatDate(log.StartedAt) }}</td>\n <td>{{ formatDuration(log.DurationMs) }}</td>\n <td class=\"error-message\" [title]=\"log.ErrorMessage || ''\">\n {{ log.ErrorMessage || '-' }}\n </td>\n <td class=\"action-cell\">\n <i class=\"fa-solid fa-chevron-right\"></i>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </div>\n }\n }\n }\n </div>\n </div>\n </div>\n</div>\n\n<!-- Server Dialog -->\n@if (ShowServerDialog) {\n <mj-mcp-server-dialog\n [server]=\"EditingServer\"\n [visible]=\"ShowServerDialog\"\n (close)=\"onServerDialogClose($event)\">\n </mj-mcp-server-dialog>\n}\n\n<!-- Connection Dialog -->\n@if (ShowConnectionDialog) {\n <mj-mcp-connection-dialog\n [connection]=\"EditingConnection\"\n [servers]=\"servers\"\n [visible]=\"ShowConnectionDialog\"\n (close)=\"onConnectionDialogClose($event)\">\n </mj-mcp-connection-dialog>\n}\n\n<!-- Test Tool Dialog -->\n@if (ShowTestToolDialog) {\n <mj-mcp-test-tool-dialog\n [Visible]=\"ShowTestToolDialog\"\n [Servers]=\"servers\"\n [Connections]=\"connections\"\n [Tools]=\"tools\"\n [SelectedServerID]=\"TestToolServerID\"\n [SelectedConnectionID]=\"TestToolConnectionID\"\n [SelectedToolID]=\"TestToolID\"\n (Close)=\"onTestToolDialogClose()\">\n </mj-mcp-test-tool-dialog>\n}\n\n<!-- Log Detail Panel -->\n@if (ShowLogDetailPanel && SelectedLog) {\n <mj-mcp-log-detail-panel\n [Visible]=\"ShowLogDetailPanel\"\n [Log]=\"SelectedLog\"\n (Close)=\"onLogDetailClose()\"\n (RunAgain)=\"onRunAgainFromLog($event)\">\n </mj-mcp-log-detail-panel>\n}\n", styles: ["/* MCP Dashboard - Header + Filter Panel Layout */\n.mcp-dashboard {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-background-color, #f5f5f5);\n overflow: hidden;\n}\n\n/* ========================================\n Dashboard Header\n ======================================== */\n.dashboard-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 20px;\n background: white;\n border-bottom: 1px solid #e0e0e0;\n flex-shrink: 0;\n gap: 16px;\n}\n\n.header-info {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.dashboard-title {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-color, #333);\n}\n\n.dashboard-title i {\n color: var(--mj-primary-color, #2196f3);\n font-size: 20px;\n}\n\n.filter-toggle-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #f5f5f5;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n}\n\n.filter-toggle-btn:hover {\n background: #e8e8e8;\n border-color: #d0d0d0;\n color: var(--mj-text-color, #333);\n}\n\n.filter-toggle-btn i {\n font-size: 12px;\n}\n\n.item-count {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n padding: 4px 10px;\n background: #f5f5f5;\n border-radius: 4px;\n}\n\n.header-controls {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n/* Tab Navigation */\n.tab-nav {\n display: flex;\n gap: 4px;\n background: #f5f5f5;\n padding: 4px;\n border-radius: 8px;\n}\n\n.tab-btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n transition: all 0.2s ease;\n}\n\n.tab-btn:hover {\n background: rgba(255, 255, 255, 0.7);\n color: var(--mj-text-color, #333);\n}\n\n.tab-btn.active {\n background: white;\n color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.tab-btn i {\n font-size: 14px;\n}\n\n.tab-label {\n font-weight: 500;\n}\n\n.tab-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 18px;\n padding: 0 6px;\n background: #e0e0e0;\n border-radius: 9px;\n font-size: 11px;\n font-weight: 600;\n color: #666;\n}\n\n.tab-btn.active .tab-badge {\n background: rgba(33, 150, 243, 0.15);\n color: var(--mj-primary-color, #2196f3);\n}\n\n.tab-badge.has-errors {\n background: #f44336;\n color: white;\n}\n\n/* ========================================\n Main Content Area (with Filter Panel)\n ======================================== */\n.main-content {\n display: flex;\n flex-direction: row;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Filter Panel Container */\n.filter-panel-container {\n display: flex;\n flex-shrink: 0;\n width: 280px;\n min-width: 200px;\n max-width: 400px;\n background: white;\n border-right: 1px solid #e0e0e0;\n position: relative;\n transition: width 0.2s ease, margin 0.2s ease;\n}\n\n.filter-panel-container.hidden {\n width: 0;\n min-width: 0;\n margin-left: -1px;\n overflow: hidden;\n}\n\n/* Resize Handle */\n.resize-handle {\n position: absolute;\n top: 0;\n right: 0;\n width: 4px;\n height: 100%;\n cursor: col-resize;\n background: transparent;\n transition: background 0.2s ease;\n z-index: 10;\n}\n\n.resize-handle:hover,\n.resize-handle:active {\n background: var(--mj-primary-color, #2196f3);\n}\n\n/* Content Area */\n.content-area {\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n min-width: 0;\n}\n\n/* Content Body */\n.content-body {\n flex: 1;\n padding: 20px 24px;\n overflow: auto;\n}\n\n/* Error Banner */\n.error-banner {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n margin: 16px 24px 0 24px;\n background: #ffebee;\n border: 1px solid #f44336;\n border-radius: 8px;\n color: #c62828;\n}\n\n.error-banner .close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: #c62828;\n padding: 4px;\n}\n\n/* ========================================\n Data Display Components\n ======================================== */\n\n/* Data Grid (Cards) */\n.data-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));\n gap: 16px;\n}\n\n.data-card {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n background: white;\n transition: box-shadow 0.2s ease;\n}\n\n.data-card:hover {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n\n.card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.card-title {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.card-title i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.card-title .name {\n font-weight: 600;\n font-size: 15px;\n}\n\n.card-actions {\n display: flex;\n gap: 4px;\n}\n\n.card-actions button {\n padding: 4px 8px;\n}\n\n.card-body {\n padding: 16px;\n}\n\n.card-body .description {\n margin: 0 0 12px 0;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.details-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n}\n\n.detail {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.detail.full-width {\n grid-column: 1 / -1;\n}\n\n.detail.error .value {\n color: #f44336;\n}\n\n.detail .label {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 500;\n}\n\n.detail .value {\n font-size: 13px;\n color: var(--mj-text-color, #333);\n}\n\n.detail .value.url,\n.detail .value.command {\n font-family: monospace;\n font-size: 12px;\n background: #f5f5f5;\n padding: 4px 8px;\n border-radius: 4px;\n word-break: break-all;\n}\n\n/* Status Badges */\n.status-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n border-radius: 12px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-active {\n background: rgba(76, 175, 80, 0.1);\n color: #4caf50;\n}\n\n.status-inactive {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n.status-error {\n background: rgba(244, 67, 54, 0.1);\n color: #f44336;\n}\n\n.status-deprecated {\n background: rgba(255, 152, 0, 0.1);\n color: #ff9800;\n}\n\n.status-unknown {\n background: rgba(158, 158, 158, 0.1);\n color: #9e9e9e;\n}\n\n/* Sync Progress & Result Banners */\n.sync-progress-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 16px;\n background: linear-gradient(90deg, rgba(33, 150, 243, 0.1), rgba(33, 150, 243, 0.05));\n border-bottom: 1px solid rgba(33, 150, 243, 0.2);\n color: #1976d2;\n font-size: 13px;\n}\n\n.sync-progress-banner i {\n color: #2196f3;\n}\n\n.sync-progress-banner .sync-message {\n flex: 1;\n}\n\n.sync-result-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n font-size: 12px;\n border-bottom: 1px solid;\n}\n\n.sync-result-banner.success {\n background: rgba(76, 175, 80, 0.08);\n border-color: rgba(76, 175, 80, 0.2);\n color: #388e3c;\n}\n\n.sync-result-banner.success i {\n color: #4caf50;\n}\n\n.sync-result-banner.error {\n background: rgba(244, 67, 54, 0.08);\n border-color: rgba(244, 67, 54, 0.2);\n color: #d32f2f;\n}\n\n.sync-result-banner.error i {\n color: #f44336;\n}\n\n/* Data Table */\n.data-table {\n overflow: auto;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.data-table table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.data-table th,\n.data-table td {\n padding: 12px 16px;\n text-align: left;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.data-table th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.data-table tbody tr {\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.data-table tbody tr:hover {\n background: #f5f5f5;\n}\n\n.data-table tbody tr:last-child td {\n border-bottom: none;\n}\n\n.data-table tbody tr.error-row {\n background: rgba(244, 67, 54, 0.05);\n}\n\n.data-table .tool-name {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 500;\n}\n\n.data-table .tool-name i {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.data-table .error-message {\n max-width: 200px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: #f44336;\n font-size: 12px;\n}\n\n.data-table .server-name {\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n/* Sortable Column Headers */\n.data-table th.sortable {\n cursor: pointer;\n user-select: none;\n transition: background 0.15s ease;\n}\n\n.data-table th.sortable:hover {\n background: #f0f0f0;\n}\n\n.data-table th.sortable .sort-icon {\n margin-left: 6px;\n font-size: 10px;\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.data-table th.sortable:hover .sort-icon {\n color: #999;\n}\n\n.data-table th.sorted-asc .sort-icon,\n.data-table th.sorted-desc .sort-icon {\n color: var(--mj-primary-color, #2196f3);\n}\n\n/* Status badge icons */\n.status-badge i {\n font-size: 12px;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n text-align: center;\n background: white;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n}\n\n.empty-state i {\n font-size: 48px;\n color: #e0e0e0;\n margin-bottom: 16px;\n}\n\n.empty-state p {\n margin: 0 0 8px 0;\n font-size: 16px;\n color: var(--mj-text-color, #333);\n}\n\n.empty-state .hint {\n font-size: 13px;\n color: var(--mj-text-secondary-color, #666);\n margin-bottom: 16px;\n}\n\n/* ========================================\n View Mode Toggle\n ======================================== */\n.view-toggle {\n display: flex;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n overflow: hidden;\n}\n\n.view-toggle button {\n border-radius: 0;\n border: none;\n padding: 6px 10px;\n}\n\n.view-toggle button.active {\n background: var(--mj-primary-color, #2196f3);\n color: white;\n}\n\n/* ========================================\n Tools Tab - Server Groups\n ======================================== */\n.tools-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.server-group {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n overflow: hidden;\n}\n\n.server-group-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: linear-gradient(135deg, #fafafa, #f5f5f5);\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.server-group-header:hover {\n background: linear-gradient(135deg, #f5f5f5, #efefef);\n}\n\n.server-group.collapsed .server-group-header {\n border-bottom: none;\n}\n\n.server-info {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.expand-icon {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n}\n\n.expand-icon.expanded {\n transform: rotate(90deg);\n}\n\n.server-name {\n font-weight: 600;\n font-size: 15px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-count {\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n background: rgba(0, 0, 0, 0.05);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.status-badge.small {\n padding: 2px 6px;\n font-size: 10px;\n}\n\n.server-actions {\n display: flex;\n gap: 4px;\n}\n\n/* ========================================\n Tools Grid (Card View)\n ======================================== */\n.tools-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n padding: 16px;\n}\n\n.tool-card {\n border: 1px solid #e8e8e8;\n border-radius: 8px;\n background: white;\n transition: all 0.2s ease;\n overflow: hidden;\n}\n\n.tool-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n.tool-card.expanded {\n border-color: var(--mj-primary-color, #2196f3);\n}\n\n.tool-card-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 12px 14px;\n cursor: pointer;\n}\n\n.tool-title {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1;\n}\n\n.tool-title i {\n color: var(--mj-primary-color, #2196f3);\n font-size: 14px;\n}\n\n.tool-title .name {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-color, #333);\n}\n\n.tool-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.param-badge {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #f5f5f5;\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.param-badge i {\n font-size: 10px;\n}\n\n.tool-description {\n margin: 0;\n padding: 0 14px 8px 14px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.tool-card-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 14px;\n border-top: 1px solid #f0f0f0;\n background: #fafafa;\n}\n\n/* Tool Details (Expanded) */\n.tool-details {\n padding: 12px 14px;\n background: #fafafa;\n border-top: 1px solid #e8e8e8;\n}\n\n.tool-details .detail-row {\n display: flex;\n padding: 6px 0;\n font-size: 12px;\n}\n\n.tool-details .detail-row.full {\n flex-direction: column;\n gap: 6px;\n}\n\n.tool-details .detail-label {\n min-width: 100px;\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.tool-details .detail-value {\n color: var(--mj-text-color, #333);\n}\n\n.tool-details .detail-value.mono {\n font-family: 'Consolas', 'Monaco', monospace;\n background: #fff;\n padding: 2px 6px;\n border-radius: 3px;\n border: 1px solid #e0e0e0;\n}\n\n.schema-preview {\n margin: 0;\n padding: 10px 12px;\n background: #fff;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n font-family: 'Consolas', 'Monaco', monospace;\n font-size: 11px;\n line-height: 1.4;\n max-height: 200px;\n overflow: auto;\n white-space: pre-wrap;\n word-break: break-word;\n}\n\n/* ========================================\n Tools List View\n ======================================== */\n.tools-list {\n overflow: auto;\n}\n\n.tools-list table {\n width: 100%;\n border-collapse: collapse;\n}\n\n.tools-list th,\n.tools-list td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid #f0f0f0;\n}\n\n.tools-list th {\n font-size: 11px;\n text-transform: uppercase;\n color: #999;\n font-weight: 600;\n background: #fafafa;\n position: sticky;\n top: 0;\n}\n\n.tools-list tbody tr {\n transition: background 0.15s ease;\n}\n\n.tools-list tbody tr:hover {\n background: #fafafa;\n}\n\n.tools-list tbody tr.expanded {\n background: rgba(33, 150, 243, 0.04);\n}\n\n.tool-name-cell {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n}\n\n.tool-name-cell i {\n color: var(--mj-primary-color, #2196f3);\n margin-top: 2px;\n}\n\n.tool-name-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.tool-name-info .tool-title {\n font-weight: 500;\n color: var(--mj-text-color, #333);\n}\n\n.tool-name-info .tool-code {\n font-size: 11px;\n font-family: monospace;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.description-cell {\n max-width: 300px;\n font-size: 12px;\n color: var(--mj-text-secondary-color, #666);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.param-count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n background: #f5f5f5;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.actions-cell {\n white-space: nowrap;\n}\n\n/* Expanded Detail Row in List View */\n.detail-row-expanded td {\n padding: 0;\n background: #fafafa;\n}\n\n.inline-details {\n display: flex;\n flex-wrap: wrap;\n gap: 16px;\n padding: 14px;\n border-top: 1px dashed #e0e0e0;\n}\n\n.inline-details .detail-section {\n display: flex;\n gap: 8px;\n font-size: 12px;\n}\n\n.inline-details .detail-section.full {\n flex-basis: 100%;\n flex-direction: column;\n gap: 6px;\n}\n\n.inline-details .detail-label {\n color: var(--mj-text-secondary-color, #666);\n font-weight: 500;\n}\n\n.inline-details .detail-value {\n color: var(--mj-text-color, #333);\n}\n\n.inline-details .detail-value.mono {\n font-family: monospace;\n}\n\n/* ========================================\n Responsive Styles\n ======================================== */\n@media (max-width: 900px) {\n .mcp-dashboard {\n flex-direction: column;\n }\n\n .sidebar {\n width: 100%;\n min-width: 100%;\n flex-direction: row;\n height: auto;\n border-right: none;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .sidebar-header {\n padding: 12px 16px;\n border-bottom: none;\n border-right: 1px solid #e0e0e0;\n }\n\n .sidebar-nav {\n flex-direction: row;\n padding: 8px;\n overflow-x: auto;\n flex: 1;\n }\n\n .nav-item {\n padding: 8px 12px;\n margin-bottom: 0;\n margin-right: 4px;\n white-space: nowrap;\n }\n\n .sidebar-stats {\n display: none;\n }\n\n .sidebar-footer {\n border-top: none;\n border-left: 1px solid #e0e0e0;\n padding: 8px;\n }\n\n .data-grid {\n grid-template-columns: 1fr;\n }\n\n .header-actions {\n flex-wrap: wrap;\n }\n\n .search-box {\n min-width: 100%;\n order: 1;\n }\n}\n\n@media (max-width: 600px) {\n .content-header {\n flex-direction: column;\n align-items: flex-start;\n gap: 12px;\n }\n\n .header-actions {\n width: 100%;\n }\n\n .search-box {\n width: 100%;\n }\n}\n\n/* ========================================\n Clickable Log Rows\n ======================================== */\n.clickable-row {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.clickable-row:hover {\n background: rgba(33, 150, 243, 0.05) !important;\n}\n\n.clickable-row .action-cell {\n color: #ccc;\n transition: color 0.15s ease;\n}\n\n.clickable-row:hover .action-cell {\n color: var(--mj-primary-color, #2196f3);\n}\n\n.action-cell {\n width: 40px;\n text-align: center;\n}\n\n/* ========================================\n Expandable Card Styles\n ======================================== */\n.card-header.clickable {\n cursor: pointer;\n transition: background 0.15s ease;\n}\n\n.card-header.clickable:hover {\n background: #f0f0f0;\n}\n\n.expand-arrow {\n font-size: 12px;\n color: #999;\n transition: transform 0.2s ease;\n margin-right: 4px;\n}\n\n.expand-arrow.rotated {\n transform: rotate(90deg);\n}\n\n.data-card.expanded {\n border-color: var(--mj-primary-color, #2196f3);\n box-shadow: 0 2px 8px rgba(33, 150, 243, 0.15);\n}\n\n/* ========================================\n Expanded Tools Section (Server/Connection Cards)\n ======================================== */\n.expanded-tools-section {\n border-top: 1px solid #e0e0e0;\n background: linear-gradient(180deg, #fafafa, #f5f5f5);\n}\n\n.tools-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-primary-color, #2196f3);\n border-bottom: 1px solid #e8e8e8;\n}\n\n.tools-section-header i {\n font-size: 14px;\n}\n\n.no-tools-message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 16px;\n color: var(--mj-text-secondary-color, #666);\n font-size: 13px;\n}\n\n.no-tools-message i {\n color: #999;\n}\n\n/* Tools Mini List */\n.tools-mini-list {\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.tool-mini-card {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: white;\n border: 1px solid #e8e8e8;\n border-radius: 6px;\n transition: all 0.15s ease;\n}\n\n.tool-mini-card:hover {\n border-color: var(--mj-primary-color, #2196f3);\n background: rgba(33, 150, 243, 0.02);\n}\n\n.tool-mini-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n}\n\n.tool-mini-name {\n font-weight: 500;\n font-size: 13px;\n color: var(--mj-text-color, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.tool-mini-params {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 11px;\n color: var(--mj-text-secondary-color, #666);\n}\n\n.tool-mini-params i {\n font-size: 10px;\n}\n\n.tool-mini-card button {\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n/* Search Highlight */\n:host ::ng-deep .search-highlight,\n.search-highlight {\n background-color: #fef08a;\n padding: 1px 2px;\n border-radius: 2px;\n font-weight: inherit;\n}\n"] }]
|
|
2763
|
+
}], () => [{ type: i0.ChangeDetectorRef }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.NavigationService }, { type: i3.MCPToolsService }], null); })();
|
|
2764
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MCPDashboardComponent, { className: "MCPDashboardComponent", filePath: "src/MCP/mcp-dashboard.component.ts", lineNumber: 195 }); })();
|
|
2486
2765
|
//# sourceMappingURL=mcp-dashboard.component.js.map
|