@flanksource/clicky-ui 0.3.49 → 0.3.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/connections/ConnectionsPage.cjs +219 -0
- package/dist/connections/ConnectionsPage.cjs.map +1 -0
- package/dist/connections/ConnectionsPage.d.ts +23 -0
- package/dist/connections/ConnectionsPage.d.ts.map +1 -0
- package/dist/connections/ConnectionsPage.js +219 -0
- package/dist/connections/ConnectionsPage.js.map +1 -0
- package/dist/connections/connectionActionStatus.cjs +43 -0
- package/dist/connections/connectionActionStatus.cjs.map +1 -0
- package/dist/connections/connectionActionStatus.d.ts +5 -0
- package/dist/connections/connectionActionStatus.d.ts.map +1 -0
- package/dist/connections/connectionActionStatus.js +43 -0
- package/dist/connections/connectionActionStatus.js.map +1 -0
- package/dist/connections/connectionActionTypes.cjs +24 -0
- package/dist/connections/connectionActionTypes.cjs.map +1 -0
- package/dist/connections/connectionActionTypes.d.ts +36 -0
- package/dist/connections/connectionActionTypes.d.ts.map +1 -0
- package/dist/connections/connectionActionTypes.js +24 -0
- package/dist/connections/connectionActionTypes.js.map +1 -0
- package/dist/connections/connectionActions.cjs +11 -0
- package/dist/connections/connectionActions.cjs.map +1 -0
- package/dist/connections/connectionActions.d.ts +15 -0
- package/dist/connections/connectionActions.d.ts.map +1 -0
- package/dist/connections/connectionActions.js +11 -0
- package/dist/connections/connectionActions.js.map +1 -0
- package/dist/connections/connectionDashboard.cjs +185 -0
- package/dist/connections/connectionDashboard.cjs.map +1 -0
- package/dist/connections/connectionDashboard.d.ts +25 -0
- package/dist/connections/connectionDashboard.d.ts.map +1 -0
- package/dist/connections/connectionDashboard.js +185 -0
- package/dist/connections/connectionDashboard.js.map +1 -0
- package/dist/connections/connectionDashboardModel.cjs +43 -0
- package/dist/connections/connectionDashboardModel.cjs.map +1 -0
- package/dist/connections/connectionDashboardModel.d.ts +75 -0
- package/dist/connections/connectionDashboardModel.d.ts.map +1 -0
- package/dist/connections/connectionDashboardModel.js +43 -0
- package/dist/connections/connectionDashboardModel.js.map +1 -0
- package/dist/connections/connectionDashboardRenderer.cjs +21 -0
- package/dist/connections/connectionDashboardRenderer.cjs.map +1 -0
- package/dist/connections/connectionDashboardRenderer.d.ts +15 -0
- package/dist/connections/connectionDashboardRenderer.d.ts.map +1 -0
- package/dist/connections/connectionDashboardRenderer.js +21 -0
- package/dist/connections/connectionDashboardRenderer.js.map +1 -0
- package/dist/connections/connectionDashboardRow.cjs +169 -0
- package/dist/connections/connectionDashboardRow.cjs.map +1 -0
- package/dist/connections/connectionDashboardRow.d.ts +12 -0
- package/dist/connections/connectionDashboardRow.d.ts.map +1 -0
- package/dist/connections/connectionDashboardRow.js +169 -0
- package/dist/connections/connectionDashboardRow.js.map +1 -0
- package/dist/connections/connectionErrorView.cjs +8 -0
- package/dist/connections/connectionErrorView.cjs.map +1 -0
- package/dist/connections/connectionErrorView.d.ts +4 -0
- package/dist/connections/connectionErrorView.d.ts.map +1 -0
- package/dist/connections/connectionErrorView.js +8 -0
- package/dist/connections/connectionErrorView.js.map +1 -0
- package/dist/connections/connectionHealth.cjs +82 -0
- package/dist/connections/connectionHealth.cjs.map +1 -0
- package/dist/connections/connectionHealth.d.ts +33 -0
- package/dist/connections/connectionHealth.d.ts.map +1 -0
- package/dist/connections/connectionHealth.js +82 -0
- package/dist/connections/connectionHealth.js.map +1 -0
- package/dist/connections/connectionLogging.cjs +29 -0
- package/dist/connections/connectionLogging.cjs.map +1 -0
- package/dist/connections/connectionLogging.d.ts +11 -0
- package/dist/connections/connectionLogging.d.ts.map +1 -0
- package/dist/connections/connectionLogging.js +29 -0
- package/dist/connections/connectionLogging.js.map +1 -0
- package/dist/connections/connectionLoggingField.cjs +37 -0
- package/dist/connections/connectionLoggingField.cjs.map +1 -0
- package/dist/connections/connectionLoggingField.d.ts +12 -0
- package/dist/connections/connectionLoggingField.d.ts.map +1 -0
- package/dist/connections/connectionLoggingField.js +37 -0
- package/dist/connections/connectionLoggingField.js.map +1 -0
- package/dist/connections/connectionLoggingModel.cjs +16 -0
- package/dist/connections/connectionLoggingModel.cjs.map +1 -0
- package/dist/connections/connectionLoggingModel.d.ts +6 -0
- package/dist/connections/connectionLoggingModel.d.ts.map +1 -0
- package/dist/connections/connectionLoggingModel.js +16 -0
- package/dist/connections/connectionLoggingModel.js.map +1 -0
- package/dist/connections/connectionResolveView.cjs +24 -0
- package/dist/connections/connectionResolveView.cjs.map +1 -0
- package/dist/connections/connectionResolveView.d.ts +5 -0
- package/dist/connections/connectionResolveView.d.ts.map +1 -0
- package/dist/connections/connectionResolveView.js +24 -0
- package/dist/connections/connectionResolveView.js.map +1 -0
- package/dist/connections/connectionTestButton.cjs +58 -0
- package/dist/connections/connectionTestButton.cjs.map +1 -0
- package/dist/connections/connectionTestButton.d.ts +6 -0
- package/dist/connections/connectionTestButton.d.ts.map +1 -0
- package/dist/connections/connectionTestButton.js +58 -0
- package/dist/connections/connectionTestButton.js.map +1 -0
- package/dist/connections/connectionTestView.cjs +12 -0
- package/dist/connections/connectionTestView.cjs.map +1 -0
- package/dist/connections/connectionTestView.d.ts +5 -0
- package/dist/connections/connectionTestView.d.ts.map +1 -0
- package/dist/connections/connectionTestView.js +12 -0
- package/dist/connections/connectionTestView.js.map +1 -0
- package/dist/connections/connectionsPageModel.cjs +33 -0
- package/dist/connections/connectionsPageModel.cjs.map +1 -0
- package/dist/connections/connectionsPageModel.d.ts +24 -0
- package/dist/connections/connectionsPageModel.d.ts.map +1 -0
- package/dist/connections/connectionsPageModel.js +33 -0
- package/dist/connections/connectionsPageModel.js.map +1 -0
- package/dist/connections/iconProvider.cjs +20 -0
- package/dist/connections/iconProvider.cjs.map +1 -0
- package/dist/connections/iconProvider.d.ts +7 -0
- package/dist/connections/iconProvider.d.ts.map +1 -0
- package/dist/connections/iconProvider.js +20 -0
- package/dist/connections/iconProvider.js.map +1 -0
- package/dist/connections.cjs +45 -0
- package/dist/connections.cjs.map +1 -0
- package/dist/connections.d.ts +34 -0
- package/dist/connections.d.ts.map +1 -0
- package/dist/connections.js +45 -0
- package/dist/connections.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +52 -295
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +47 -290
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/MetricTile.cjs +44 -0
- package/dist/data/diagnostics/MetricTile.cjs.map +1 -0
- package/dist/data/diagnostics/MetricTile.d.ts +13 -0
- package/dist/data/diagnostics/MetricTile.d.ts.map +1 -0
- package/dist/data/diagnostics/MetricTile.js +44 -0
- package/dist/data/diagnostics/MetricTile.js.map +1 -0
- package/dist/data/diagnostics/StackDumpView.cjs +227 -0
- package/dist/data/diagnostics/StackDumpView.cjs.map +1 -0
- package/dist/data/diagnostics/StackDumpView.d.ts +53 -0
- package/dist/data/diagnostics/StackDumpView.d.ts.map +1 -0
- package/dist/data/diagnostics/StackDumpView.js +227 -0
- package/dist/data/diagnostics/StackDumpView.js.map +1 -0
- package/dist/data/diagnostics/fixtures.d.ts +1 -0
- package/dist/data/diagnostics/fixtures.d.ts.map +1 -1
- package/dist/data/diagnostics/metric-tone.cjs +18 -0
- package/dist/data/diagnostics/metric-tone.cjs.map +1 -0
- package/dist/data/diagnostics/metric-tone.d.ts +6 -0
- package/dist/data/diagnostics/metric-tone.d.ts.map +1 -0
- package/dist/data/diagnostics/metric-tone.js +18 -0
- package/dist/data/diagnostics/metric-tone.js.map +1 -0
- package/dist/data/diagnostics/stacktrace.cjs +44 -0
- package/dist/data/diagnostics/stacktrace.cjs.map +1 -1
- package/dist/data/diagnostics/stacktrace.d.ts +7 -0
- package/dist/data/diagnostics/stacktrace.d.ts.map +1 -1
- package/dist/data/diagnostics/stacktrace.js +44 -0
- package/dist/data/diagnostics/stacktrace.js.map +1 -1
- package/dist/data/diagnostics/types.d.ts +2 -8
- package/dist/data/diagnostics/types.d.ts.map +1 -1
- package/dist/data/lint/LintDetail.cjs +339 -0
- package/dist/data/lint/LintDetail.cjs.map +1 -0
- package/dist/data/lint/LintDetail.d.ts +17 -0
- package/dist/data/lint/LintDetail.d.ts.map +1 -0
- package/dist/data/lint/LintDetail.js +339 -0
- package/dist/data/lint/LintDetail.js.map +1 -0
- package/dist/data/lint/LintFilterBar.cjs +103 -0
- package/dist/data/lint/LintFilterBar.cjs.map +1 -0
- package/dist/data/lint/LintFilterBar.d.ts +16 -0
- package/dist/data/lint/LintFilterBar.d.ts.map +1 -0
- package/dist/data/lint/LintFilterBar.js +103 -0
- package/dist/data/lint/LintFilterBar.js.map +1 -0
- package/dist/data/lint/LintResults.cjs +144 -0
- package/dist/data/lint/LintResults.cjs.map +1 -0
- package/dist/data/lint/LintResults.d.ts +39 -0
- package/dist/data/lint/LintResults.d.ts.map +1 -0
- package/dist/data/lint/LintResults.fixtures.d.ts +10 -0
- package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -0
- package/dist/data/lint/LintResults.js +144 -0
- package/dist/data/lint/LintResults.js.map +1 -0
- package/dist/data/lint/LintTreeNode.cjs +66 -0
- package/dist/data/lint/LintTreeNode.cjs.map +1 -0
- package/dist/data/lint/LintTreeNode.d.ts +7 -0
- package/dist/data/lint/LintTreeNode.d.ts.map +1 -0
- package/dist/data/lint/LintTreeNode.js +66 -0
- package/dist/data/lint/LintTreeNode.js.map +1 -0
- package/dist/data/lint/actions.cjs +195 -0
- package/dist/data/lint/actions.cjs.map +1 -0
- package/dist/data/lint/actions.d.ts +29 -0
- package/dist/data/lint/actions.d.ts.map +1 -0
- package/dist/data/lint/actions.js +195 -0
- package/dist/data/lint/actions.js.map +1 -0
- package/dist/data/lint/grouping-options.cjs +14 -0
- package/dist/data/lint/grouping-options.cjs.map +1 -0
- package/dist/data/lint/grouping-options.d.ts +9 -0
- package/dist/data/lint/grouping-options.d.ts.map +1 -0
- package/dist/data/lint/grouping-options.js +14 -0
- package/dist/data/lint/grouping-options.js.map +1 -0
- package/dist/data/lint/grouping.cjs +450 -0
- package/dist/data/lint/grouping.cjs.map +1 -0
- package/dist/data/lint/grouping.d.ts +10 -0
- package/dist/data/lint/grouping.d.ts.map +1 -0
- package/dist/data/lint/grouping.js +450 -0
- package/dist/data/lint/grouping.js.map +1 -0
- package/dist/data/lint/index.d.ts +10 -0
- package/dist/data/lint/index.d.ts.map +1 -0
- package/dist/data/lint/paths.cjs +35 -0
- package/dist/data/lint/paths.cjs.map +1 -0
- package/dist/data/lint/paths.d.ts +13 -0
- package/dist/data/lint/paths.d.ts.map +1 -0
- package/dist/data/lint/paths.js +35 -0
- package/dist/data/lint/paths.js.map +1 -0
- package/dist/data/lint/stats.cjs +76 -0
- package/dist/data/lint/stats.cjs.map +1 -0
- package/dist/data/lint/stats.d.ts +19 -0
- package/dist/data/lint/stats.d.ts.map +1 -0
- package/dist/data/lint/stats.js +76 -0
- package/dist/data/lint/stats.js.map +1 -0
- package/dist/data/lint/types.cjs +16 -0
- package/dist/data/lint/types.cjs.map +1 -0
- package/dist/data/lint/types.d.ts +93 -0
- package/dist/data/lint/types.d.ts.map +1 -0
- package/dist/data/lint/types.js +16 -0
- package/dist/data/lint/types.js.map +1 -0
- package/dist/data/test-runner/TestAttemptDetail.cjs +113 -0
- package/dist/data/test-runner/TestAttemptDetail.cjs.map +1 -0
- package/dist/data/test-runner/TestAttemptDetail.d.ts +19 -0
- package/dist/data/test-runner/TestAttemptDetail.d.ts.map +1 -0
- package/dist/data/test-runner/TestAttemptDetail.js +113 -0
- package/dist/data/test-runner/TestAttemptDetail.js.map +1 -0
- package/dist/data/test-runner/TestAttempts.cjs +36 -0
- package/dist/data/test-runner/TestAttempts.cjs.map +1 -0
- package/dist/data/test-runner/TestAttempts.d.ts +5 -0
- package/dist/data/test-runner/TestAttempts.d.ts.map +1 -0
- package/dist/data/test-runner/TestAttempts.js +36 -0
- package/dist/data/test-runner/TestAttempts.js.map +1 -0
- package/dist/data/test-runner/TestDetailPanel.cjs +13 -3
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +14 -4
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.cjs +9 -29
- package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.d.ts +6 -6
- package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.js +9 -29
- package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +33 -0
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +34 -1
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +3 -0
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +8 -1
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +3 -0
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +3 -1
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +3 -1
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +9 -1
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +5 -0
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +9 -1
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/attempts.cjs +62 -0
- package/dist/data/test-runner/attempts.cjs.map +1 -0
- package/dist/data/test-runner/attempts.d.ts +13 -0
- package/dist/data/test-runner/attempts.d.ts.map +1 -0
- package/dist/data/test-runner/attempts.js +62 -0
- package/dist/data/test-runner/attempts.js.map +1 -0
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +6 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/index.d.ts +5 -1
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +2 -0
- package/dist/data/test-runner/marks.cjs.map +1 -1
- package/dist/data/test-runner/marks.d.ts.map +1 -1
- package/dist/data/test-runner/marks.js +2 -0
- package/dist/data/test-runner/marks.js.map +1 -1
- package/dist/data/test-runner/process-metrics.cjs +15 -0
- package/dist/data/test-runner/process-metrics.cjs.map +1 -0
- package/dist/data/test-runner/process-metrics.d.ts +22 -0
- package/dist/data/test-runner/process-metrics.d.ts.map +1 -0
- package/dist/data/test-runner/process-metrics.js +15 -0
- package/dist/data/test-runner/process-metrics.js.map +1 -0
- package/dist/data/test-runner/status.cjs +11 -3
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.d.ts +3 -1
- package/dist/data/test-runner/status.d.ts.map +1 -1
- package/dist/data/test-runner/status.js +11 -3
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/test-runner/types.d.ts +14 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/traces/GoProfileView.cjs +176 -0
- package/dist/data/traces/GoProfileView.cjs.map +1 -0
- package/dist/data/traces/GoProfileView.d.ts +30 -0
- package/dist/data/traces/GoProfileView.d.ts.map +1 -0
- package/dist/data/traces/GoProfileView.js +176 -0
- package/dist/data/traces/GoProfileView.js.map +1 -0
- package/dist/data/traces/ProcessFacetTable.cjs +79 -0
- package/dist/data/traces/ProcessFacetTable.cjs.map +1 -0
- package/dist/data/traces/ProcessFacetTable.d.ts +21 -0
- package/dist/data/traces/ProcessFacetTable.d.ts.map +1 -0
- package/dist/data/traces/ProcessFacetTable.js +79 -0
- package/dist/data/traces/ProcessFacetTable.js.map +1 -0
- package/dist/data/traces/ProcessRecordViews.cjs +41 -0
- package/dist/data/traces/ProcessRecordViews.cjs.map +1 -0
- package/dist/data/traces/ProcessRecordViews.d.ts +16 -0
- package/dist/data/traces/ProcessRecordViews.d.ts.map +1 -0
- package/dist/data/traces/ProcessRecordViews.js +41 -0
- package/dist/data/traces/ProcessRecordViews.js.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.cjs +316 -0
- package/dist/data/traces/ProcessTraceDetail.cjs.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.d.ts +39 -0
- package/dist/data/traces/ProcessTraceDetail.d.ts.map +1 -0
- package/dist/data/traces/ProcessTraceDetail.js +316 -0
- package/dist/data/traces/ProcessTraceDetail.js.map +1 -0
- package/dist/data/traces/ProcessTraceTree.cjs +76 -34
- package/dist/data/traces/ProcessTraceTree.cjs.map +1 -1
- package/dist/data/traces/ProcessTraceTree.d.ts +21 -4
- package/dist/data/traces/ProcessTraceTree.d.ts.map +1 -1
- package/dist/data/traces/ProcessTraceTree.js +72 -30
- package/dist/data/traces/ProcessTraceTree.js.map +1 -1
- package/dist/data/traces/Sparkline.cjs +27 -5
- package/dist/data/traces/Sparkline.cjs.map +1 -1
- package/dist/data/traces/Sparkline.d.ts +17 -1
- package/dist/data/traces/Sparkline.d.ts.map +1 -1
- package/dist/data/traces/Sparkline.js +28 -6
- package/dist/data/traces/Sparkline.js.map +1 -1
- package/dist/data/traces/TraceView.cjs +9 -0
- package/dist/data/traces/TraceView.cjs.map +1 -1
- package/dist/data/traces/TraceView.d.ts +4 -2
- package/dist/data/traces/TraceView.d.ts.map +1 -1
- package/dist/data/traces/TraceView.js +9 -0
- package/dist/data/traces/TraceView.js.map +1 -1
- package/dist/data/traces/TraceWindowList.cjs +117 -0
- package/dist/data/traces/TraceWindowList.cjs.map +1 -0
- package/dist/data/traces/TraceWindowList.d.ts +48 -0
- package/dist/data/traces/TraceWindowList.d.ts.map +1 -0
- package/dist/data/traces/TraceWindowList.js +117 -0
- package/dist/data/traces/TraceWindowList.js.map +1 -0
- package/dist/data/traces/fixtures.d.ts +25 -1
- package/dist/data/traces/fixtures.d.ts.map +1 -1
- package/dist/data/traces/index.d.ts +10 -3
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/traces/process-facets.cjs +48 -0
- package/dist/data/traces/process-facets.cjs.map +1 -0
- package/dist/data/traces/process-facets.d.ts +38 -0
- package/dist/data/traces/process-facets.d.ts.map +1 -0
- package/dist/data/traces/process-facets.js +48 -0
- package/dist/data/traces/process-facets.js.map +1 -0
- package/dist/data/traces/process-tree.cjs +36 -4
- package/dist/data/traces/process-tree.cjs.map +1 -1
- package/dist/data/traces/process-tree.d.ts +20 -1
- package/dist/data/traces/process-tree.d.ts.map +1 -1
- package/dist/data/traces/process-tree.js +36 -4
- package/dist/data/traces/process-tree.js.map +1 -1
- package/dist/data/traces/profile-aggregate.cjs +78 -0
- package/dist/data/traces/profile-aggregate.cjs.map +1 -0
- package/dist/data/traces/profile-aggregate.d.ts +41 -0
- package/dist/data/traces/profile-aggregate.d.ts.map +1 -0
- package/dist/data/traces/profile-aggregate.js +78 -0
- package/dist/data/traces/profile-aggregate.js.map +1 -0
- package/dist/data/traces/stack-checkpoints.cjs +22 -0
- package/dist/data/traces/stack-checkpoints.cjs.map +1 -0
- package/dist/data/traces/stack-checkpoints.d.ts +18 -0
- package/dist/data/traces/stack-checkpoints.d.ts.map +1 -0
- package/dist/data/traces/stack-checkpoints.js +22 -0
- package/dist/data/traces/stack-checkpoints.js.map +1 -0
- package/dist/data/traces/types.d.ts +120 -5
- package/dist/data/traces/types.d.ts.map +1 -1
- package/dist/data/verification/adapters.cjs +1 -0
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +1 -0
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +85 -7
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +4 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +81 -3
- package/dist/data.js.map +1 -1
- package/dist/index.cjs +87 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +81 -3
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const string = require("../lib/string.cjs");
|
|
4
|
+
async function postConnection({
|
|
5
|
+
apiBase,
|
|
6
|
+
action,
|
|
7
|
+
value
|
|
8
|
+
}) {
|
|
9
|
+
const res = await fetch(`${string.stripTrailingSlashes(apiBase)}/connection/${action}`, {
|
|
10
|
+
method: "POST",
|
|
11
|
+
headers: { "Content-Type": "application/json" },
|
|
12
|
+
body: JSON.stringify(value)
|
|
13
|
+
});
|
|
14
|
+
if (!res.ok) throw new Error(await res.text() || `${res.status} ${res.statusText}`);
|
|
15
|
+
return res.json();
|
|
16
|
+
}
|
|
17
|
+
function formatDuration(elapsedMs) {
|
|
18
|
+
if (elapsedMs < 1) return "<1 ms";
|
|
19
|
+
if (elapsedMs < 1e3) return `${Math.round(elapsedMs)} ms`;
|
|
20
|
+
return `${(elapsedMs / 1e3).toFixed(elapsedMs < 1e4 ? 1 : 0)} s`;
|
|
21
|
+
}
|
|
22
|
+
exports.formatDuration = formatDuration;
|
|
23
|
+
exports.postConnection = postConnection;
|
|
24
|
+
//# sourceMappingURL=connectionActionTypes.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActionTypes.cjs","sources":["../../src/connections/connectionActionTypes.ts"],"sourcesContent":["import { stripTrailingSlashes } from \"../lib/string\";\n\n// Shared types and pure helpers for the connection form \"Test\"/\"Resolve\"\n// actions. Kept in a non-component module so the sibling component files can\n// each export exactly one component (react/only-export-components).\n\nexport type ResolvedConnection = {\n type?: string;\n namespace?: string;\n url?: string;\n username?: string;\n password?: string;\n certificate?: string;\n properties?: Record<string, string>;\n};\n\nexport type TestResult = { ok: boolean; message: string; url?: string };\n\nexport type ConnectionAction = \"test\" | \"resolve\";\n\nexport type ActionOutcome =\n | { action: \"test\"; elapsedMs: number; result: TestResult }\n | { action: \"resolve\"; elapsedMs: number; resolved: ResolvedConnection }\n | { action: ConnectionAction; elapsedMs: number; error: string };\n\n/** POSTs an unsaved connection draft to `{apiBase}/connection/{test|resolve}`. */\nexport async function postConnection({\n apiBase,\n action,\n value,\n}: {\n apiBase: string;\n action: ConnectionAction;\n value: unknown;\n}): Promise<unknown> {\n const res = await fetch(`${stripTrailingSlashes(apiBase)}/connection/${action}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(value),\n });\n if (!res.ok) throw new Error((await res.text()) || `${res.status} ${res.statusText}`);\n return res.json();\n}\n\nexport function formatDuration(elapsedMs: number): string {\n if (elapsedMs < 1) return \"<1 ms\";\n if (elapsedMs < 1_000) return `${Math.round(elapsedMs)} ms`;\n return `${(elapsedMs / 1_000).toFixed(elapsedMs < 10_000 ? 1 : 0)} s`;\n}\n"],"names":["stripTrailingSlashes"],"mappings":";;;AA0BA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIqB;AACnB,QAAM,MAAM,MAAM,MAAM,GAAGA,OAAAA,qBAAqB,OAAO,CAAC,eAAe,MAAM,IAAI;AAAA,IAC/E,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,KAAK;AAAA,EAAA,CAC3B;AACD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAO,MAAM,IAAI,KAAA,KAAW,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AACpF,SAAO,IAAI,KAAA;AACb;AAEO,SAAS,eAAe,WAA2B;AACxD,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,YAAY,IAAO,QAAO,GAAG,KAAK,MAAM,SAAS,CAAC;AACtD,SAAO,IAAI,YAAY,KAAO,QAAQ,YAAY,MAAS,IAAI,CAAC,CAAC;AACnE;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type ResolvedConnection = {
|
|
2
|
+
type?: string;
|
|
3
|
+
namespace?: string;
|
|
4
|
+
url?: string;
|
|
5
|
+
username?: string;
|
|
6
|
+
password?: string;
|
|
7
|
+
certificate?: string;
|
|
8
|
+
properties?: Record<string, string>;
|
|
9
|
+
};
|
|
10
|
+
export type TestResult = {
|
|
11
|
+
ok: boolean;
|
|
12
|
+
message: string;
|
|
13
|
+
url?: string;
|
|
14
|
+
};
|
|
15
|
+
export type ConnectionAction = "test" | "resolve";
|
|
16
|
+
export type ActionOutcome = {
|
|
17
|
+
action: "test";
|
|
18
|
+
elapsedMs: number;
|
|
19
|
+
result: TestResult;
|
|
20
|
+
} | {
|
|
21
|
+
action: "resolve";
|
|
22
|
+
elapsedMs: number;
|
|
23
|
+
resolved: ResolvedConnection;
|
|
24
|
+
} | {
|
|
25
|
+
action: ConnectionAction;
|
|
26
|
+
elapsedMs: number;
|
|
27
|
+
error: string;
|
|
28
|
+
};
|
|
29
|
+
/** POSTs an unsaved connection draft to `{apiBase}/connection/{test|resolve}`. */
|
|
30
|
+
export declare function postConnection({ apiBase, action, value, }: {
|
|
31
|
+
apiBase: string;
|
|
32
|
+
action: ConnectionAction;
|
|
33
|
+
value: unknown;
|
|
34
|
+
}): Promise<unknown>;
|
|
35
|
+
export declare function formatDuration(elapsedMs: number): string;
|
|
36
|
+
//# sourceMappingURL=connectionActionTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActionTypes.d.ts","sourceRoot":"","sources":["../../src/connections/connectionActionTypes.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAC;AAElD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GACzD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GACtE;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,kFAAkF;AAClF,wBAAsB,cAAc,CAAC,EACnC,OAAO,EACP,MAAM,EACN,KAAK,GACN,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnB;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIxD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { stripTrailingSlashes } from "../lib/string.js";
|
|
2
|
+
async function postConnection({
|
|
3
|
+
apiBase,
|
|
4
|
+
action,
|
|
5
|
+
value
|
|
6
|
+
}) {
|
|
7
|
+
const res = await fetch(`${stripTrailingSlashes(apiBase)}/connection/${action}`, {
|
|
8
|
+
method: "POST",
|
|
9
|
+
headers: { "Content-Type": "application/json" },
|
|
10
|
+
body: JSON.stringify(value)
|
|
11
|
+
});
|
|
12
|
+
if (!res.ok) throw new Error(await res.text() || `${res.status} ${res.statusText}`);
|
|
13
|
+
return res.json();
|
|
14
|
+
}
|
|
15
|
+
function formatDuration(elapsedMs) {
|
|
16
|
+
if (elapsedMs < 1) return "<1 ms";
|
|
17
|
+
if (elapsedMs < 1e3) return `${Math.round(elapsedMs)} ms`;
|
|
18
|
+
return `${(elapsedMs / 1e3).toFixed(elapsedMs < 1e4 ? 1 : 0)} s`;
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
formatDuration,
|
|
22
|
+
postConnection
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=connectionActionTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActionTypes.js","sources":["../../src/connections/connectionActionTypes.ts"],"sourcesContent":["import { stripTrailingSlashes } from \"../lib/string\";\n\n// Shared types and pure helpers for the connection form \"Test\"/\"Resolve\"\n// actions. Kept in a non-component module so the sibling component files can\n// each export exactly one component (react/only-export-components).\n\nexport type ResolvedConnection = {\n type?: string;\n namespace?: string;\n url?: string;\n username?: string;\n password?: string;\n certificate?: string;\n properties?: Record<string, string>;\n};\n\nexport type TestResult = { ok: boolean; message: string; url?: string };\n\nexport type ConnectionAction = \"test\" | \"resolve\";\n\nexport type ActionOutcome =\n | { action: \"test\"; elapsedMs: number; result: TestResult }\n | { action: \"resolve\"; elapsedMs: number; resolved: ResolvedConnection }\n | { action: ConnectionAction; elapsedMs: number; error: string };\n\n/** POSTs an unsaved connection draft to `{apiBase}/connection/{test|resolve}`. */\nexport async function postConnection({\n apiBase,\n action,\n value,\n}: {\n apiBase: string;\n action: ConnectionAction;\n value: unknown;\n}): Promise<unknown> {\n const res = await fetch(`${stripTrailingSlashes(apiBase)}/connection/${action}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(value),\n });\n if (!res.ok) throw new Error((await res.text()) || `${res.status} ${res.statusText}`);\n return res.json();\n}\n\nexport function formatDuration(elapsedMs: number): string {\n if (elapsedMs < 1) return \"<1 ms\";\n if (elapsedMs < 1_000) return `${Math.round(elapsedMs)} ms`;\n return `${(elapsedMs / 1_000).toFixed(elapsedMs < 10_000 ? 1 : 0)} s`;\n}\n"],"names":[],"mappings":";AA0BA,eAAsB,eAAe;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAIqB;AACnB,QAAM,MAAM,MAAM,MAAM,GAAG,qBAAqB,OAAO,CAAC,eAAe,MAAM,IAAI;AAAA,IAC/E,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,IAC3B,MAAM,KAAK,UAAU,KAAK;AAAA,EAAA,CAC3B;AACD,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAO,MAAM,IAAI,KAAA,KAAW,GAAG,IAAI,MAAM,IAAI,IAAI,UAAU,EAAE;AACpF,SAAO,IAAI,KAAA;AACb;AAEO,SAAS,eAAe,WAA2B;AACxD,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,YAAY,IAAO,QAAO,GAAG,KAAK,MAAM,SAAS,CAAC;AACtD,SAAO,IAAI,YAAY,KAAO,QAAQ,YAAY,MAAS,IAAI,CAAC,CAAC;AACnE;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const connectionTestButton = require("./connectionTestButton.cjs");
|
|
5
|
+
function createConnectionFormActions({
|
|
6
|
+
apiBase
|
|
7
|
+
}) {
|
|
8
|
+
return ({ value, action, canSubmit }) => action.path.includes("/connection") ? /* @__PURE__ */ jsxRuntime.jsx(connectionTestButton.ConnectionTestButton, { apiBase, value, canSubmit }) : null;
|
|
9
|
+
}
|
|
10
|
+
exports.createConnectionFormActions = createConnectionFormActions;
|
|
11
|
+
//# sourceMappingURL=connectionActions.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActions.cjs","sources":["../../src/connections/connectionActions.tsx"],"sourcesContent":["import type { FormActionsRenderer } from \"../rpc/SchemaActionForm\";\nimport { ConnectionTestButton } from \"./connectionTestButton\";\n\n/**\n * Builds the form-footer renderer that adds a \"Test\" split-button (with a\n * \"Resolve values\" dropdown option) to the connection create/edit form. Test\n * probes the resolved URL's reachability; Resolve hydrates the draft (expanding\n * secret:// and svc:// / ip:// / proxy:// / host:// workload URLs) and shows the\n * resolved values with secrets masked. Both POST the live form value to\n * `{apiBase}/connection/{test|resolve}`, so they work before the connection is\n * saved. Forms of other entities get no extra actions, so the renderer can be\n * handed to an EntityExplorerApp that hosts every entity.\n */\nexport function createConnectionFormActions({\n apiBase,\n}: {\n apiBase: string;\n}): FormActionsRenderer {\n return ({ value, action, canSubmit }) =>\n action.path.includes(\"/connection\") ? (\n <ConnectionTestButton apiBase={apiBase} value={value} canSubmit={canSubmit} />\n ) : null;\n}\n"],"names":["jsx","ConnectionTestButton"],"mappings":";;;;AAaO,SAAS,4BAA4B;AAAA,EAC1C;AACF,GAEwB;AACtB,SAAO,CAAC,EAAE,OAAO,QAAQ,UAAA,MACvB,OAAO,KAAK,SAAS,aAAa,IAChCA,2BAAAA,IAACC,qBAAAA,sBAAA,EAAqB,SAAkB,OAAc,WAAsB,IAC1E;AACR;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FormActionsRenderer } from '../rpc/SchemaActionForm.js';
|
|
2
|
+
/**
|
|
3
|
+
* Builds the form-footer renderer that adds a "Test" split-button (with a
|
|
4
|
+
* "Resolve values" dropdown option) to the connection create/edit form. Test
|
|
5
|
+
* probes the resolved URL's reachability; Resolve hydrates the draft (expanding
|
|
6
|
+
* secret:// and svc:// / ip:// / proxy:// / host:// workload URLs) and shows the
|
|
7
|
+
* resolved values with secrets masked. Both POST the live form value to
|
|
8
|
+
* `{apiBase}/connection/{test|resolve}`, so they work before the connection is
|
|
9
|
+
* saved. Forms of other entities get no extra actions, so the renderer can be
|
|
10
|
+
* handed to an EntityExplorerApp that hosts every entity.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createConnectionFormActions({ apiBase, }: {
|
|
13
|
+
apiBase: string;
|
|
14
|
+
}): FormActionsRenderer;
|
|
15
|
+
//# sourceMappingURL=connectionActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActions.d.ts","sourceRoot":"","sources":["../../src/connections/connectionActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;CACjB,GAAG,mBAAmB,CAKtB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ConnectionTestButton } from "./connectionTestButton.js";
|
|
3
|
+
function createConnectionFormActions({
|
|
4
|
+
apiBase
|
|
5
|
+
}) {
|
|
6
|
+
return ({ value, action, canSubmit }) => action.path.includes("/connection") ? /* @__PURE__ */ jsx(ConnectionTestButton, { apiBase, value, canSubmit }) : null;
|
|
7
|
+
}
|
|
8
|
+
export {
|
|
9
|
+
createConnectionFormActions
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=connectionActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActions.js","sources":["../../src/connections/connectionActions.tsx"],"sourcesContent":["import type { FormActionsRenderer } from \"../rpc/SchemaActionForm\";\nimport { ConnectionTestButton } from \"./connectionTestButton\";\n\n/**\n * Builds the form-footer renderer that adds a \"Test\" split-button (with a\n * \"Resolve values\" dropdown option) to the connection create/edit form. Test\n * probes the resolved URL's reachability; Resolve hydrates the draft (expanding\n * secret:// and svc:// / ip:// / proxy:// / host:// workload URLs) and shows the\n * resolved values with secrets masked. Both POST the live form value to\n * `{apiBase}/connection/{test|resolve}`, so they work before the connection is\n * saved. Forms of other entities get no extra actions, so the renderer can be\n * handed to an EntityExplorerApp that hosts every entity.\n */\nexport function createConnectionFormActions({\n apiBase,\n}: {\n apiBase: string;\n}): FormActionsRenderer {\n return ({ value, action, canSubmit }) =>\n action.path.includes(\"/connection\") ? (\n <ConnectionTestButton apiBase={apiBase} value={value} canSubmit={canSubmit} />\n ) : null;\n}\n"],"names":[],"mappings":";;AAaO,SAAS,4BAA4B;AAAA,EAC1C;AACF,GAEwB;AACtB,SAAO,CAAC,EAAE,OAAO,QAAQ,UAAA,MACvB,OAAO,KAAK,SAAS,aAAa,IAChC,oBAAC,sBAAA,EAAqB,SAAkB,OAAc,WAAsB,IAC1E;AACR;"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const reactQuery = require("@tanstack/react-query");
|
|
5
|
+
const react = require("react");
|
|
6
|
+
const button = require("../components/button.cjs");
|
|
7
|
+
const utils = require("../lib/utils.cjs");
|
|
8
|
+
const connectionDashboardModel = require("./connectionDashboardModel.cjs");
|
|
9
|
+
const connectionDashboardRow = require("./connectionDashboardRow.cjs");
|
|
10
|
+
const connectionHealth = require("./connectionHealth.cjs");
|
|
11
|
+
function ConnectionDashboardSurface({
|
|
12
|
+
apiBase,
|
|
13
|
+
requestUrl,
|
|
14
|
+
renderConnectionLink
|
|
15
|
+
}) {
|
|
16
|
+
const dashboardUrl = connectionDashboardModel.connectionDashboardUrl({
|
|
17
|
+
apiBase,
|
|
18
|
+
...requestUrl ? { requestUrl } : {}
|
|
19
|
+
});
|
|
20
|
+
const dashboard = reactQuery.useQuery({
|
|
21
|
+
queryKey: [connectionDashboardModel.CONNECTION_DASHBOARD_QUERY_KEY, dashboardUrl],
|
|
22
|
+
queryFn: async () => {
|
|
23
|
+
const response = await fetch(dashboardUrl, {
|
|
24
|
+
headers: { Accept: "application/json" }
|
|
25
|
+
});
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
const message = (await response.text()).trim();
|
|
28
|
+
throw new Error(message || `Connection dashboard failed: ${response.status}`);
|
|
29
|
+
}
|
|
30
|
+
const payload = await response.json();
|
|
31
|
+
if (!Array.isArray(payload.connections)) {
|
|
32
|
+
throw new Error("Connection dashboard response is missing connections");
|
|
33
|
+
}
|
|
34
|
+
return payload.connections;
|
|
35
|
+
},
|
|
36
|
+
staleTime: 1e4,
|
|
37
|
+
retry: 0
|
|
38
|
+
});
|
|
39
|
+
const { health, pending, error, seed, check } = connectionHealth.useConnectionHealth(apiBase);
|
|
40
|
+
const connections = dashboard.data;
|
|
41
|
+
react.useEffect(() => {
|
|
42
|
+
if (connections) seed(connections);
|
|
43
|
+
}, [connections, seed]);
|
|
44
|
+
if (dashboard.isLoading) {
|
|
45
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border bg-card p-6 text-sm text-muted-foreground", children: "Loading connections…" });
|
|
46
|
+
}
|
|
47
|
+
if (dashboard.isError) {
|
|
48
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive", children: [
|
|
49
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: dashboard.error instanceof Error ? dashboard.error.message : "Unable to load connections" }),
|
|
50
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", onClick: () => void dashboard.refetch(), children: "Retry" })
|
|
51
|
+
] });
|
|
52
|
+
}
|
|
53
|
+
if (!connections) {
|
|
54
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive", children: "Connection dashboard returned no data." });
|
|
55
|
+
}
|
|
56
|
+
if (connections.length === 0) {
|
|
57
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-dashed p-8 text-center text-sm text-muted-foreground", children: "No connections match the current filters." });
|
|
58
|
+
}
|
|
59
|
+
const checked = connections.filter(
|
|
60
|
+
(connection) => {
|
|
61
|
+
var _a;
|
|
62
|
+
return health[connection.id] && ((_a = health[connection.id]) == null ? void 0 : _a.state) !== "unknown";
|
|
63
|
+
}
|
|
64
|
+
).length;
|
|
65
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
66
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
67
|
+
/* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", onClick: () => void dashboard.refetch(), children: "Refresh" }),
|
|
68
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
69
|
+
button.Button,
|
|
70
|
+
{
|
|
71
|
+
type: "button",
|
|
72
|
+
variant: "outline",
|
|
73
|
+
size: "sm",
|
|
74
|
+
disabled: pending.size > 0,
|
|
75
|
+
onClick: () => check(
|
|
76
|
+
connections.map((connection) => connection.id),
|
|
77
|
+
{ force: checked === connections.length }
|
|
78
|
+
),
|
|
79
|
+
children: pending.size > 0 ? "Checking…" : "Check all health"
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs text-muted-foreground", children: [
|
|
83
|
+
checked,
|
|
84
|
+
"/",
|
|
85
|
+
connections.length,
|
|
86
|
+
" checked"
|
|
87
|
+
] }),
|
|
88
|
+
error ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-destructive", title: error.message, children: error.message }) : null
|
|
89
|
+
] }),
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
91
|
+
ConnectionDashboardLanes,
|
|
92
|
+
{
|
|
93
|
+
connections,
|
|
94
|
+
health,
|
|
95
|
+
pending,
|
|
96
|
+
onCheck: check,
|
|
97
|
+
renderConnectionLink
|
|
98
|
+
}
|
|
99
|
+
)
|
|
100
|
+
] });
|
|
101
|
+
}
|
|
102
|
+
function ConnectionDashboardLanes({
|
|
103
|
+
connections,
|
|
104
|
+
health = {},
|
|
105
|
+
pending = /* @__PURE__ */ new Set(),
|
|
106
|
+
onCheck = () => {
|
|
107
|
+
},
|
|
108
|
+
renderConnectionLink
|
|
109
|
+
}) {
|
|
110
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
111
|
+
connectionDashboardModel.groupConnectionDashboardLanes(connections).map((lane) => {
|
|
112
|
+
const summary = connectionHealth.summarizeLaneHealth(lane.connections, health);
|
|
113
|
+
const unnamespaced = lane.namespace === "";
|
|
114
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
115
|
+
"section",
|
|
116
|
+
{
|
|
117
|
+
className: utils.cn(
|
|
118
|
+
"overflow-hidden rounded-lg border",
|
|
119
|
+
unnamespaced ? "border-dashed border-border" : "border-border"
|
|
120
|
+
),
|
|
121
|
+
children: [
|
|
122
|
+
/* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-muted/40 px-3 py-2", children: [
|
|
123
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
124
|
+
"h2",
|
|
125
|
+
{
|
|
126
|
+
className: utils.cn(
|
|
127
|
+
"text-sm font-semibold",
|
|
128
|
+
unnamespaced && "italic text-muted-foreground"
|
|
129
|
+
),
|
|
130
|
+
children: unnamespaced ? "No namespace" : lane.namespace
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded bg-background px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground", children: lane.connections.length }),
|
|
134
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
135
|
+
button.Button,
|
|
136
|
+
{
|
|
137
|
+
type: "button",
|
|
138
|
+
variant: "ghost",
|
|
139
|
+
size: "sm",
|
|
140
|
+
className: "h-6 px-2 text-[11px]",
|
|
141
|
+
onClick: () => onCheck(
|
|
142
|
+
lane.connections.map((connection) => connection.id),
|
|
143
|
+
{ force: summary.checked === lane.connections.length }
|
|
144
|
+
),
|
|
145
|
+
children: "Check"
|
|
146
|
+
}
|
|
147
|
+
),
|
|
148
|
+
summary.failing > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-1 rounded bg-rose-100 px-1.5 py-0.5 text-[11px] text-rose-700 ring-1 ring-inset ring-rose-300/60 dark:bg-rose-400/10 dark:text-rose-300 dark:ring-rose-400/25", children: [
|
|
149
|
+
summary.failing,
|
|
150
|
+
" failing"
|
|
151
|
+
] }) : null,
|
|
152
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
|
|
153
|
+
summary.checked,
|
|
154
|
+
"/",
|
|
155
|
+
lane.connections.length,
|
|
156
|
+
" checked"
|
|
157
|
+
] }),
|
|
158
|
+
summary.unused > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
|
|
159
|
+
summary.unused,
|
|
160
|
+
" unused"
|
|
161
|
+
] }) : null,
|
|
162
|
+
unnamespaced ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "`namespace` is optional on the model, so these are unplaceable rather than global." }) : null
|
|
163
|
+
] }),
|
|
164
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "divide-y divide-border", children: lane.connections.map((connection) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
165
|
+
connectionDashboardRow.ConnectionDashboardRow,
|
|
166
|
+
{
|
|
167
|
+
connection,
|
|
168
|
+
health: health[connection.id],
|
|
169
|
+
pending: pending.has(connection.id),
|
|
170
|
+
onCheck,
|
|
171
|
+
renderConnectionLink
|
|
172
|
+
},
|
|
173
|
+
connection.id
|
|
174
|
+
)) })
|
|
175
|
+
]
|
|
176
|
+
},
|
|
177
|
+
lane.namespace || "__none__"
|
|
178
|
+
);
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ jsxRuntime.jsx(connectionDashboardRow.ConnectionHealthLegend, {})
|
|
181
|
+
] });
|
|
182
|
+
}
|
|
183
|
+
exports.ConnectionDashboardLanes = ConnectionDashboardLanes;
|
|
184
|
+
exports.ConnectionDashboardSurface = ConnectionDashboardSurface;
|
|
185
|
+
//# sourceMappingURL=connectionDashboard.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionDashboard.cjs","sources":["../../src/connections/connectionDashboard.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { useEffect } from \"react\";\nimport { Button } from \"../components/button\";\nimport { cn } from \"../lib/utils\";\nimport {\n CONNECTION_DASHBOARD_QUERY_KEY,\n connectionDashboardUrl,\n groupConnectionDashboardLanes,\n type ConnectionDashboardItem,\n type ConnectionDashboardResponse,\n type ConnectionLinkRenderer,\n} from \"./connectionDashboardModel\";\nimport {\n ConnectionDashboardRow,\n ConnectionHealthLegend,\n} from \"./connectionDashboardRow\";\nimport {\n summarizeLaneHealth,\n useConnectionHealth,\n type ConnectionHealthMap,\n} from \"./connectionHealth\";\n\nexport type ConnectionDashboardSurfaceProps = {\n /** Where the commons-db connections service is mounted, e.g. `/api/v1`. */\n apiBase: string;\n /** A list request whose connection type filters the dashboard carries over. */\n requestUrl?: string;\n renderConnectionLink: ConnectionLinkRenderer;\n};\n\n/**\n * ConnectionDashboardSurface lists the connection fleet from the database only.\n * Health checks dial real backends, so they are opt-in: nothing is probed until\n * the operator clicks a row's dot, a lane's Check button, or Check all.\n */\nexport function ConnectionDashboardSurface({\n apiBase,\n requestUrl,\n renderConnectionLink,\n}: ConnectionDashboardSurfaceProps) {\n const dashboardUrl = connectionDashboardUrl({\n apiBase,\n ...(requestUrl ? { requestUrl } : {}),\n });\n const dashboard = useQuery({\n queryKey: [CONNECTION_DASHBOARD_QUERY_KEY, dashboardUrl],\n queryFn: async () => {\n const response = await fetch(dashboardUrl, {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) {\n const message = (await response.text()).trim();\n throw new Error(message || `Connection dashboard failed: ${response.status}`);\n }\n const payload = (await response.json()) as Partial<ConnectionDashboardResponse>;\n if (!Array.isArray(payload.connections)) {\n throw new Error(\"Connection dashboard response is missing connections\");\n }\n return payload.connections;\n },\n staleTime: 10_000,\n retry: 0,\n });\n\n const { health, pending, error, seed, check } = useConnectionHealth(apiBase);\n const connections = dashboard.data;\n useEffect(() => {\n if (connections) seed(connections);\n }, [connections, seed]);\n\n if (dashboard.isLoading) {\n return (\n <div className=\"rounded-lg border bg-card p-6 text-sm text-muted-foreground\">\n Loading connections…\n </div>\n );\n }\n if (dashboard.isError) {\n return (\n <div className=\"flex items-center justify-between gap-4 rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <span>\n {dashboard.error instanceof Error\n ? dashboard.error.message\n : \"Unable to load connections\"}\n </span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => void dashboard.refetch()}>\n Retry\n </Button>\n </div>\n );\n }\n if (!connections) {\n return (\n <div className=\"rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n Connection dashboard returned no data.\n </div>\n );\n }\n if (connections.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed p-8 text-center text-sm text-muted-foreground\">\n No connections match the current filters.\n </div>\n );\n }\n\n const checked = connections.filter(\n (connection) => health[connection.id] && health[connection.id]?.state !== \"unknown\",\n ).length;\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => void dashboard.refetch()}>\n Refresh\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={pending.size > 0}\n onClick={() =>\n check(\n connections.map((connection) => connection.id),\n { force: checked === connections.length },\n )\n }\n >\n {pending.size > 0 ? \"Checking…\" : \"Check all health\"}\n </Button>\n <span className=\"text-xs text-muted-foreground\">\n {checked}/{connections.length} checked\n </span>\n {error ? (\n <span className=\"text-xs text-destructive\" title={error.message}>\n {error.message}\n </span>\n ) : null}\n </div>\n <ConnectionDashboardLanes\n connections={connections}\n health={health}\n pending={pending}\n onCheck={check}\n renderConnectionLink={renderConnectionLink}\n />\n </div>\n );\n}\n\nexport function ConnectionDashboardLanes({\n connections,\n health = {},\n pending = new Set<string>(),\n onCheck = () => {},\n renderConnectionLink,\n}: {\n connections: ConnectionDashboardItem[];\n health?: ConnectionHealthMap;\n pending?: Set<string>;\n onCheck?: (ids: string[], options?: { force?: boolean }) => void;\n renderConnectionLink: ConnectionLinkRenderer;\n}) {\n return (\n <div className=\"space-y-4\">\n {groupConnectionDashboardLanes(connections).map((lane) => {\n const summary = summarizeLaneHealth(lane.connections, health);\n const unnamespaced = lane.namespace === \"\";\n return (\n <section\n key={lane.namespace || \"__none__\"}\n className={cn(\n \"overflow-hidden rounded-lg border\",\n unnamespaced ? \"border-dashed border-border\" : \"border-border\",\n )}\n >\n <header className=\"flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-muted/40 px-3 py-2\">\n <h2\n className={cn(\n \"text-sm font-semibold\",\n unnamespaced && \"italic text-muted-foreground\",\n )}\n >\n {unnamespaced ? \"No namespace\" : lane.namespace}\n </h2>\n <span className=\"rounded bg-background px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground\">\n {lane.connections.length}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-[11px]\"\n onClick={() =>\n onCheck(\n lane.connections.map((connection) => connection.id),\n { force: summary.checked === lane.connections.length },\n )\n }\n >\n Check\n </Button>\n {summary.failing > 0 ? (\n <span className=\"inline-flex items-center gap-1 rounded bg-rose-100 px-1.5 py-0.5 text-[11px] text-rose-700 ring-1 ring-inset ring-rose-300/60 dark:bg-rose-400/10 dark:text-rose-300 dark:ring-rose-400/25\">\n {summary.failing} failing\n </span>\n ) : null}\n <span className=\"text-[11px] text-muted-foreground\">\n {summary.checked}/{lane.connections.length} checked\n </span>\n {summary.unused > 0 ? (\n <span className=\"text-[11px] text-muted-foreground\">{summary.unused} unused</span>\n ) : null}\n {unnamespaced ? (\n <span className=\"text-xs text-muted-foreground\">\n `namespace` is optional on the model, so these are unplaceable rather than global.\n </span>\n ) : null}\n </header>\n <div className=\"divide-y divide-border\">\n {lane.connections.map((connection) => (\n <ConnectionDashboardRow\n key={connection.id}\n connection={connection}\n health={health[connection.id]}\n pending={pending.has(connection.id)}\n onCheck={onCheck}\n renderConnectionLink={renderConnectionLink}\n />\n ))}\n </div>\n </section>\n );\n })}\n <ConnectionHealthLegend />\n </div>\n );\n}\n"],"names":["connectionDashboardUrl","useQuery","CONNECTION_DASHBOARD_QUERY_KEY","useConnectionHealth","useEffect","jsx","jsxs","Button","groupConnectionDashboardLanes","summarizeLaneHealth","cn","ConnectionDashboardRow","ConnectionHealthLegend"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ConnectionDashboardItem, ConnectionLinkRenderer } from './connectionDashboardModel.js';
|
|
2
|
+
import { ConnectionHealthMap } from './connectionHealth.js';
|
|
3
|
+
export type ConnectionDashboardSurfaceProps = {
|
|
4
|
+
/** Where the commons-db connections service is mounted, e.g. `/api/v1`. */
|
|
5
|
+
apiBase: string;
|
|
6
|
+
/** A list request whose connection type filters the dashboard carries over. */
|
|
7
|
+
requestUrl?: string;
|
|
8
|
+
renderConnectionLink: ConnectionLinkRenderer;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* ConnectionDashboardSurface lists the connection fleet from the database only.
|
|
12
|
+
* Health checks dial real backends, so they are opt-in: nothing is probed until
|
|
13
|
+
* the operator clicks a row's dot, a lane's Check button, or Check all.
|
|
14
|
+
*/
|
|
15
|
+
export declare function ConnectionDashboardSurface({ apiBase, requestUrl, renderConnectionLink, }: ConnectionDashboardSurfaceProps): import("react").JSX.Element;
|
|
16
|
+
export declare function ConnectionDashboardLanes({ connections, health, pending, onCheck, renderConnectionLink, }: {
|
|
17
|
+
connections: ConnectionDashboardItem[];
|
|
18
|
+
health?: ConnectionHealthMap;
|
|
19
|
+
pending?: Set<string>;
|
|
20
|
+
onCheck?: (ids: string[], options?: {
|
|
21
|
+
force?: boolean;
|
|
22
|
+
}) => void;
|
|
23
|
+
renderConnectionLink: ConnectionLinkRenderer;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
25
|
+
//# sourceMappingURL=connectionDashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionDashboard.d.ts","sourceRoot":"","sources":["../../src/connections/connectionDashboard.tsx"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,uBAAuB,EAE5B,KAAK,sBAAsB,EAC5B,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,+BAA+B,GAAG;IAC5C,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,sBAAsB,CAAC;CAC9C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,OAAO,EACP,UAAU,EACV,oBAAoB,GACrB,EAAE,+BAA+B,+BA4GjC;AAED,wBAAgB,wBAAwB,CAAC,EACvC,WAAW,EACX,MAAW,EACX,OAA2B,EAC3B,OAAkB,EAClB,oBAAoB,GACrB,EAAE;IACD,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACjE,oBAAoB,EAAE,sBAAsB,CAAC;CAC9C,+BA2EA"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { useEffect } from "react";
|
|
4
|
+
import { Button } from "../components/button.js";
|
|
5
|
+
import { cn } from "../lib/utils.js";
|
|
6
|
+
import { groupConnectionDashboardLanes, connectionDashboardUrl, CONNECTION_DASHBOARD_QUERY_KEY } from "./connectionDashboardModel.js";
|
|
7
|
+
import { ConnectionDashboardRow, ConnectionHealthLegend } from "./connectionDashboardRow.js";
|
|
8
|
+
import { summarizeLaneHealth, useConnectionHealth } from "./connectionHealth.js";
|
|
9
|
+
function ConnectionDashboardSurface({
|
|
10
|
+
apiBase,
|
|
11
|
+
requestUrl,
|
|
12
|
+
renderConnectionLink
|
|
13
|
+
}) {
|
|
14
|
+
const dashboardUrl = connectionDashboardUrl({
|
|
15
|
+
apiBase,
|
|
16
|
+
...requestUrl ? { requestUrl } : {}
|
|
17
|
+
});
|
|
18
|
+
const dashboard = useQuery({
|
|
19
|
+
queryKey: [CONNECTION_DASHBOARD_QUERY_KEY, dashboardUrl],
|
|
20
|
+
queryFn: async () => {
|
|
21
|
+
const response = await fetch(dashboardUrl, {
|
|
22
|
+
headers: { Accept: "application/json" }
|
|
23
|
+
});
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
const message = (await response.text()).trim();
|
|
26
|
+
throw new Error(message || `Connection dashboard failed: ${response.status}`);
|
|
27
|
+
}
|
|
28
|
+
const payload = await response.json();
|
|
29
|
+
if (!Array.isArray(payload.connections)) {
|
|
30
|
+
throw new Error("Connection dashboard response is missing connections");
|
|
31
|
+
}
|
|
32
|
+
return payload.connections;
|
|
33
|
+
},
|
|
34
|
+
staleTime: 1e4,
|
|
35
|
+
retry: 0
|
|
36
|
+
});
|
|
37
|
+
const { health, pending, error, seed, check } = useConnectionHealth(apiBase);
|
|
38
|
+
const connections = dashboard.data;
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (connections) seed(connections);
|
|
41
|
+
}, [connections, seed]);
|
|
42
|
+
if (dashboard.isLoading) {
|
|
43
|
+
return /* @__PURE__ */ jsx("div", { className: "rounded-lg border bg-card p-6 text-sm text-muted-foreground", children: "Loading connections…" });
|
|
44
|
+
}
|
|
45
|
+
if (dashboard.isError) {
|
|
46
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4 rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive", children: [
|
|
47
|
+
/* @__PURE__ */ jsx("span", { children: dashboard.error instanceof Error ? dashboard.error.message : "Unable to load connections" }),
|
|
48
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => void dashboard.refetch(), children: "Retry" })
|
|
49
|
+
] });
|
|
50
|
+
}
|
|
51
|
+
if (!connections) {
|
|
52
|
+
return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive", children: "Connection dashboard returned no data." });
|
|
53
|
+
}
|
|
54
|
+
if (connections.length === 0) {
|
|
55
|
+
return /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-dashed p-8 text-center text-sm text-muted-foreground", children: "No connections match the current filters." });
|
|
56
|
+
}
|
|
57
|
+
const checked = connections.filter(
|
|
58
|
+
(connection) => {
|
|
59
|
+
var _a;
|
|
60
|
+
return health[connection.id] && ((_a = health[connection.id]) == null ? void 0 : _a.state) !== "unknown";
|
|
61
|
+
}
|
|
62
|
+
).length;
|
|
63
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
64
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
65
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => void dashboard.refetch(), children: "Refresh" }),
|
|
66
|
+
/* @__PURE__ */ jsx(
|
|
67
|
+
Button,
|
|
68
|
+
{
|
|
69
|
+
type: "button",
|
|
70
|
+
variant: "outline",
|
|
71
|
+
size: "sm",
|
|
72
|
+
disabled: pending.size > 0,
|
|
73
|
+
onClick: () => check(
|
|
74
|
+
connections.map((connection) => connection.id),
|
|
75
|
+
{ force: checked === connections.length }
|
|
76
|
+
),
|
|
77
|
+
children: pending.size > 0 ? "Checking…" : "Check all health"
|
|
78
|
+
}
|
|
79
|
+
),
|
|
80
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground", children: [
|
|
81
|
+
checked,
|
|
82
|
+
"/",
|
|
83
|
+
connections.length,
|
|
84
|
+
" checked"
|
|
85
|
+
] }),
|
|
86
|
+
error ? /* @__PURE__ */ jsx("span", { className: "text-xs text-destructive", title: error.message, children: error.message }) : null
|
|
87
|
+
] }),
|
|
88
|
+
/* @__PURE__ */ jsx(
|
|
89
|
+
ConnectionDashboardLanes,
|
|
90
|
+
{
|
|
91
|
+
connections,
|
|
92
|
+
health,
|
|
93
|
+
pending,
|
|
94
|
+
onCheck: check,
|
|
95
|
+
renderConnectionLink
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
] });
|
|
99
|
+
}
|
|
100
|
+
function ConnectionDashboardLanes({
|
|
101
|
+
connections,
|
|
102
|
+
health = {},
|
|
103
|
+
pending = /* @__PURE__ */ new Set(),
|
|
104
|
+
onCheck = () => {
|
|
105
|
+
},
|
|
106
|
+
renderConnectionLink
|
|
107
|
+
}) {
|
|
108
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
109
|
+
groupConnectionDashboardLanes(connections).map((lane) => {
|
|
110
|
+
const summary = summarizeLaneHealth(lane.connections, health);
|
|
111
|
+
const unnamespaced = lane.namespace === "";
|
|
112
|
+
return /* @__PURE__ */ jsxs(
|
|
113
|
+
"section",
|
|
114
|
+
{
|
|
115
|
+
className: cn(
|
|
116
|
+
"overflow-hidden rounded-lg border",
|
|
117
|
+
unnamespaced ? "border-dashed border-border" : "border-border"
|
|
118
|
+
),
|
|
119
|
+
children: [
|
|
120
|
+
/* @__PURE__ */ jsxs("header", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-muted/40 px-3 py-2", children: [
|
|
121
|
+
/* @__PURE__ */ jsx(
|
|
122
|
+
"h2",
|
|
123
|
+
{
|
|
124
|
+
className: cn(
|
|
125
|
+
"text-sm font-semibold",
|
|
126
|
+
unnamespaced && "italic text-muted-foreground"
|
|
127
|
+
),
|
|
128
|
+
children: unnamespaced ? "No namespace" : lane.namespace
|
|
129
|
+
}
|
|
130
|
+
),
|
|
131
|
+
/* @__PURE__ */ jsx("span", { className: "rounded bg-background px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground", children: lane.connections.length }),
|
|
132
|
+
/* @__PURE__ */ jsx(
|
|
133
|
+
Button,
|
|
134
|
+
{
|
|
135
|
+
type: "button",
|
|
136
|
+
variant: "ghost",
|
|
137
|
+
size: "sm",
|
|
138
|
+
className: "h-6 px-2 text-[11px]",
|
|
139
|
+
onClick: () => onCheck(
|
|
140
|
+
lane.connections.map((connection) => connection.id),
|
|
141
|
+
{ force: summary.checked === lane.connections.length }
|
|
142
|
+
),
|
|
143
|
+
children: "Check"
|
|
144
|
+
}
|
|
145
|
+
),
|
|
146
|
+
summary.failing > 0 ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 rounded bg-rose-100 px-1.5 py-0.5 text-[11px] text-rose-700 ring-1 ring-inset ring-rose-300/60 dark:bg-rose-400/10 dark:text-rose-300 dark:ring-rose-400/25", children: [
|
|
147
|
+
summary.failing,
|
|
148
|
+
" failing"
|
|
149
|
+
] }) : null,
|
|
150
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
|
|
151
|
+
summary.checked,
|
|
152
|
+
"/",
|
|
153
|
+
lane.connections.length,
|
|
154
|
+
" checked"
|
|
155
|
+
] }),
|
|
156
|
+
summary.unused > 0 ? /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-muted-foreground", children: [
|
|
157
|
+
summary.unused,
|
|
158
|
+
" unused"
|
|
159
|
+
] }) : null,
|
|
160
|
+
unnamespaced ? /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "`namespace` is optional on the model, so these are unplaceable rather than global." }) : null
|
|
161
|
+
] }),
|
|
162
|
+
/* @__PURE__ */ jsx("div", { className: "divide-y divide-border", children: lane.connections.map((connection) => /* @__PURE__ */ jsx(
|
|
163
|
+
ConnectionDashboardRow,
|
|
164
|
+
{
|
|
165
|
+
connection,
|
|
166
|
+
health: health[connection.id],
|
|
167
|
+
pending: pending.has(connection.id),
|
|
168
|
+
onCheck,
|
|
169
|
+
renderConnectionLink
|
|
170
|
+
},
|
|
171
|
+
connection.id
|
|
172
|
+
)) })
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
lane.namespace || "__none__"
|
|
176
|
+
);
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ jsx(ConnectionHealthLegend, {})
|
|
179
|
+
] });
|
|
180
|
+
}
|
|
181
|
+
export {
|
|
182
|
+
ConnectionDashboardLanes,
|
|
183
|
+
ConnectionDashboardSurface
|
|
184
|
+
};
|
|
185
|
+
//# sourceMappingURL=connectionDashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionDashboard.js","sources":["../../src/connections/connectionDashboard.tsx"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\nimport { useEffect } from \"react\";\nimport { Button } from \"../components/button\";\nimport { cn } from \"../lib/utils\";\nimport {\n CONNECTION_DASHBOARD_QUERY_KEY,\n connectionDashboardUrl,\n groupConnectionDashboardLanes,\n type ConnectionDashboardItem,\n type ConnectionDashboardResponse,\n type ConnectionLinkRenderer,\n} from \"./connectionDashboardModel\";\nimport {\n ConnectionDashboardRow,\n ConnectionHealthLegend,\n} from \"./connectionDashboardRow\";\nimport {\n summarizeLaneHealth,\n useConnectionHealth,\n type ConnectionHealthMap,\n} from \"./connectionHealth\";\n\nexport type ConnectionDashboardSurfaceProps = {\n /** Where the commons-db connections service is mounted, e.g. `/api/v1`. */\n apiBase: string;\n /** A list request whose connection type filters the dashboard carries over. */\n requestUrl?: string;\n renderConnectionLink: ConnectionLinkRenderer;\n};\n\n/**\n * ConnectionDashboardSurface lists the connection fleet from the database only.\n * Health checks dial real backends, so they are opt-in: nothing is probed until\n * the operator clicks a row's dot, a lane's Check button, or Check all.\n */\nexport function ConnectionDashboardSurface({\n apiBase,\n requestUrl,\n renderConnectionLink,\n}: ConnectionDashboardSurfaceProps) {\n const dashboardUrl = connectionDashboardUrl({\n apiBase,\n ...(requestUrl ? { requestUrl } : {}),\n });\n const dashboard = useQuery({\n queryKey: [CONNECTION_DASHBOARD_QUERY_KEY, dashboardUrl],\n queryFn: async () => {\n const response = await fetch(dashboardUrl, {\n headers: { Accept: \"application/json\" },\n });\n if (!response.ok) {\n const message = (await response.text()).trim();\n throw new Error(message || `Connection dashboard failed: ${response.status}`);\n }\n const payload = (await response.json()) as Partial<ConnectionDashboardResponse>;\n if (!Array.isArray(payload.connections)) {\n throw new Error(\"Connection dashboard response is missing connections\");\n }\n return payload.connections;\n },\n staleTime: 10_000,\n retry: 0,\n });\n\n const { health, pending, error, seed, check } = useConnectionHealth(apiBase);\n const connections = dashboard.data;\n useEffect(() => {\n if (connections) seed(connections);\n }, [connections, seed]);\n\n if (dashboard.isLoading) {\n return (\n <div className=\"rounded-lg border bg-card p-6 text-sm text-muted-foreground\">\n Loading connections…\n </div>\n );\n }\n if (dashboard.isError) {\n return (\n <div className=\"flex items-center justify-between gap-4 rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <span>\n {dashboard.error instanceof Error\n ? dashboard.error.message\n : \"Unable to load connections\"}\n </span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => void dashboard.refetch()}>\n Retry\n </Button>\n </div>\n );\n }\n if (!connections) {\n return (\n <div className=\"rounded-lg border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n Connection dashboard returned no data.\n </div>\n );\n }\n if (connections.length === 0) {\n return (\n <div className=\"rounded-lg border border-dashed p-8 text-center text-sm text-muted-foreground\">\n No connections match the current filters.\n </div>\n );\n }\n\n const checked = connections.filter(\n (connection) => health[connection.id] && health[connection.id]?.state !== \"unknown\",\n ).length;\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={() => void dashboard.refetch()}>\n Refresh\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n disabled={pending.size > 0}\n onClick={() =>\n check(\n connections.map((connection) => connection.id),\n { force: checked === connections.length },\n )\n }\n >\n {pending.size > 0 ? \"Checking…\" : \"Check all health\"}\n </Button>\n <span className=\"text-xs text-muted-foreground\">\n {checked}/{connections.length} checked\n </span>\n {error ? (\n <span className=\"text-xs text-destructive\" title={error.message}>\n {error.message}\n </span>\n ) : null}\n </div>\n <ConnectionDashboardLanes\n connections={connections}\n health={health}\n pending={pending}\n onCheck={check}\n renderConnectionLink={renderConnectionLink}\n />\n </div>\n );\n}\n\nexport function ConnectionDashboardLanes({\n connections,\n health = {},\n pending = new Set<string>(),\n onCheck = () => {},\n renderConnectionLink,\n}: {\n connections: ConnectionDashboardItem[];\n health?: ConnectionHealthMap;\n pending?: Set<string>;\n onCheck?: (ids: string[], options?: { force?: boolean }) => void;\n renderConnectionLink: ConnectionLinkRenderer;\n}) {\n return (\n <div className=\"space-y-4\">\n {groupConnectionDashboardLanes(connections).map((lane) => {\n const summary = summarizeLaneHealth(lane.connections, health);\n const unnamespaced = lane.namespace === \"\";\n return (\n <section\n key={lane.namespace || \"__none__\"}\n className={cn(\n \"overflow-hidden rounded-lg border\",\n unnamespaced ? \"border-dashed border-border\" : \"border-border\",\n )}\n >\n <header className=\"flex flex-wrap items-center gap-x-3 gap-y-1 border-b border-border bg-muted/40 px-3 py-2\">\n <h2\n className={cn(\n \"text-sm font-semibold\",\n unnamespaced && \"italic text-muted-foreground\",\n )}\n >\n {unnamespaced ? \"No namespace\" : lane.namespace}\n </h2>\n <span className=\"rounded bg-background px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground\">\n {lane.connections.length}\n </span>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 px-2 text-[11px]\"\n onClick={() =>\n onCheck(\n lane.connections.map((connection) => connection.id),\n { force: summary.checked === lane.connections.length },\n )\n }\n >\n Check\n </Button>\n {summary.failing > 0 ? (\n <span className=\"inline-flex items-center gap-1 rounded bg-rose-100 px-1.5 py-0.5 text-[11px] text-rose-700 ring-1 ring-inset ring-rose-300/60 dark:bg-rose-400/10 dark:text-rose-300 dark:ring-rose-400/25\">\n {summary.failing} failing\n </span>\n ) : null}\n <span className=\"text-[11px] text-muted-foreground\">\n {summary.checked}/{lane.connections.length} checked\n </span>\n {summary.unused > 0 ? (\n <span className=\"text-[11px] text-muted-foreground\">{summary.unused} unused</span>\n ) : null}\n {unnamespaced ? (\n <span className=\"text-xs text-muted-foreground\">\n `namespace` is optional on the model, so these are unplaceable rather than global.\n </span>\n ) : null}\n </header>\n <div className=\"divide-y divide-border\">\n {lane.connections.map((connection) => (\n <ConnectionDashboardRow\n key={connection.id}\n connection={connection}\n health={health[connection.id]}\n pending={pending.has(connection.id)}\n onCheck={onCheck}\n renderConnectionLink={renderConnectionLink}\n />\n ))}\n </div>\n </section>\n );\n })}\n <ConnectionHealthLegend />\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAmCO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AACF,GAAoC;AAClC,QAAM,eAAe,uBAAuB;AAAA,IAC1C;AAAA,IACA,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,EAAC,CACpC;AACD,QAAM,YAAY,SAAS;AAAA,IACzB,UAAU,CAAC,gCAAgC,YAAY;AAAA,IACvD,SAAS,YAAY;AACnB,YAAM,WAAW,MAAM,MAAM,cAAc;AAAA,QACzC,SAAS,EAAE,QAAQ,mBAAA;AAAA,MAAmB,CACvC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,WAAW,MAAM,SAAS,KAAA,GAAQ,KAAA;AACxC,cAAM,IAAI,MAAM,WAAW,gCAAgC,SAAS,MAAM,EAAE;AAAA,MAC9E;AACA,YAAM,UAAW,MAAM,SAAS,KAAA;AAChC,UAAI,CAAC,MAAM,QAAQ,QAAQ,WAAW,GAAG;AACvC,cAAM,IAAI,MAAM,sDAAsD;AAAA,MACxE;AACA,aAAO,QAAQ;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,EAAA,CACR;AAED,QAAM,EAAE,QAAQ,SAAS,OAAO,MAAM,MAAA,IAAU,oBAAoB,OAAO;AAC3E,QAAM,cAAc,UAAU;AAC9B,YAAU,MAAM;AACd,QAAI,kBAAkB,WAAW;AAAA,EACnC,GAAG,CAAC,aAAa,IAAI,CAAC;AAEtB,MAAI,UAAU,WAAW;AACvB,WACE,oBAAC,OAAA,EAAI,WAAU,+DAA8D,UAAA,wBAE7E;AAAA,EAEJ;AACA,MAAI,UAAU,SAAS;AACrB,WACE,qBAAC,OAAA,EAAI,WAAU,iIACb,UAAA;AAAA,MAAA,oBAAC,UACE,UAAA,UAAU,iBAAiB,QACxB,UAAU,MAAM,UAChB,6BAAA,CACN;AAAA,MACA,oBAAC,QAAA,EAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,KAAK,UAAU,QAAA,GAAW,UAAA,QAAA,CAE3F;AAAA,IAAA,GACF;AAAA,EAEJ;AACA,MAAI,CAAC,aAAa;AAChB,WACE,oBAAC,OAAA,EAAI,WAAU,yFAAwF,UAAA,0CAEvG;AAAA,EAEJ;AACA,MAAI,YAAY,WAAW,GAAG;AAC5B,WACE,oBAAC,OAAA,EAAI,WAAU,iFAAgF,UAAA,6CAE/F;AAAA,EAEJ;AAEA,QAAM,UAAU,YAAY;AAAA,IAC1B,CAAC,eAAA;;AAAe,oBAAO,WAAW,EAAE,OAAK,YAAO,WAAW,EAAE,MAApB,mBAAuB,WAAU;AAAA;AAAA,EAAA,EAC1E;AACF,SACE,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,KAAK,UAAU,QAAA,GAAW,UAAA,WAE3F;AAAA,MACA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,UAAU,QAAQ,OAAO;AAAA,UACzB,SAAS,MACP;AAAA,YACE,YAAY,IAAI,CAAC,eAAe,WAAW,EAAE;AAAA,YAC7C,EAAE,OAAO,YAAY,YAAY,OAAA;AAAA,UAAO;AAAA,UAI3C,UAAA,QAAQ,OAAO,IAAI,cAAc;AAAA,QAAA;AAAA,MAAA;AAAA,MAEpC,qBAAC,QAAA,EAAK,WAAU,iCACb,UAAA;AAAA,QAAA;AAAA,QAAQ;AAAA,QAAE,YAAY;AAAA,QAAO;AAAA,MAAA,GAChC;AAAA,MACC,QACC,oBAAC,QAAA,EAAK,WAAU,4BAA2B,OAAO,MAAM,SACrD,UAAA,MAAM,QAAA,CACT,IACE;AAAA,IAAA,GACN;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,SAAS,CAAA;AAAA,EACT,8BAAc,IAAA;AAAA,EACd,UAAU,MAAM;AAAA,EAAC;AAAA,EACjB;AACF,GAMG;AACD,SACE,qBAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA,8BAA8B,WAAW,EAAE,IAAI,CAAC,SAAS;AACxD,YAAM,UAAU,oBAAoB,KAAK,aAAa,MAAM;AAC5D,YAAM,eAAe,KAAK,cAAc;AACxC,aACE;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACA,eAAe,gCAAgC;AAAA,UAAA;AAAA,UAGjD,UAAA;AAAA,YAAA,qBAAC,UAAA,EAAO,WAAU,4FAChB,UAAA;AAAA,cAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAW;AAAA,oBACT;AAAA,oBACA,gBAAgB;AAAA,kBAAA;AAAA,kBAGjB,UAAA,eAAe,iBAAiB,KAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,kCAEvC,QAAA,EAAK,WAAU,mFACb,UAAA,KAAK,YAAY,QACpB;AAAA,cACA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS,MACP;AAAA,oBACE,KAAK,YAAY,IAAI,CAAC,eAAe,WAAW,EAAE;AAAA,oBAClD,EAAE,OAAO,QAAQ,YAAY,KAAK,YAAY,OAAA;AAAA,kBAAO;AAAA,kBAG1D,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGA,QAAQ,UAAU,IACjB,qBAAC,QAAA,EAAK,WAAU,8LACb,UAAA;AAAA,gBAAA,QAAQ;AAAA,gBAAQ;AAAA,cAAA,EAAA,CACnB,IACE;AAAA,cACJ,qBAAC,QAAA,EAAK,WAAU,qCACb,UAAA;AAAA,gBAAA,QAAQ;AAAA,gBAAQ;AAAA,gBAAE,KAAK,YAAY;AAAA,gBAAO;AAAA,cAAA,GAC7C;AAAA,cACC,QAAQ,SAAS,IAChB,qBAAC,QAAA,EAAK,WAAU,qCAAqC,UAAA;AAAA,gBAAA,QAAQ;AAAA,gBAAO;AAAA,cAAA,EAAA,CAAO,IACzE;AAAA,cACH,eACC,oBAAC,QAAA,EAAK,WAAU,iCAAgC,gGAEhD,IACE;AAAA,YAAA,GACN;AAAA,YACA,oBAAC,SAAI,WAAU,0BACZ,eAAK,YAAY,IAAI,CAAC,eACrB;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC;AAAA,gBACA,QAAQ,OAAO,WAAW,EAAE;AAAA,gBAC5B,SAAS,QAAQ,IAAI,WAAW,EAAE;AAAA,gBAClC;AAAA,gBACA;AAAA,cAAA;AAAA,cALK,WAAW;AAAA,YAAA,CAOnB,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,QA5DK,KAAK,aAAa;AAAA,MAAA;AAAA,IA+D7B,CAAC;AAAA,wBACA,wBAAA,CAAA,CAAuB;AAAA,EAAA,GAC1B;AAEJ;"}
|