@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,219 @@
|
|
|
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 collections = require("../lib/collections.cjs");
|
|
8
|
+
const Modal = require("../overlay/Modal.cjs");
|
|
9
|
+
const useConfirm = require("../overlay/useConfirm.cjs");
|
|
10
|
+
const apiClient = require("../rpc/apiClient.cjs");
|
|
11
|
+
const SchemaActionForm = require("../rpc/SchemaActionForm.cjs");
|
|
12
|
+
const connectionDashboard = require("./connectionDashboard.cjs");
|
|
13
|
+
const connectionDashboardModel = require("./connectionDashboardModel.cjs");
|
|
14
|
+
const connectionTestButton = require("./connectionTestButton.cjs");
|
|
15
|
+
const connectionsPageModel = require("./connectionsPageModel.cjs");
|
|
16
|
+
const CONNECTION_DETAIL_QUERY_KEY = "connection-detail";
|
|
17
|
+
const ERROR_BOX = "rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive";
|
|
18
|
+
function ConnectionsPage({
|
|
19
|
+
apiBase,
|
|
20
|
+
selected,
|
|
21
|
+
onSelect,
|
|
22
|
+
connectionHref,
|
|
23
|
+
formExtensions
|
|
24
|
+
}) {
|
|
25
|
+
const [creating, setCreating] = react.useState(false);
|
|
26
|
+
const queryClient = reactQuery.useQueryClient();
|
|
27
|
+
const client = react.useMemo(() => apiClient.createOperationsApiClient({ baseUrl: apiBase }), [apiBase]);
|
|
28
|
+
const extensions = react.useMemo(() => connectionsPageModel.connectionFormExtensions(formExtensions), [formExtensions]);
|
|
29
|
+
const renderConnectionLink = react.useCallback(
|
|
30
|
+
(connection, link) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
31
|
+
"a",
|
|
32
|
+
{
|
|
33
|
+
href: connectionHref(connection.id),
|
|
34
|
+
className: link.className,
|
|
35
|
+
title: link.title,
|
|
36
|
+
onClick: (event) => {
|
|
37
|
+
if (!connectionsPageModel.isPlainLeftClick(event)) return;
|
|
38
|
+
event.preventDefault();
|
|
39
|
+
onSelect(connection.id);
|
|
40
|
+
},
|
|
41
|
+
children: link.children
|
|
42
|
+
}
|
|
43
|
+
),
|
|
44
|
+
[connectionHref, onSelect]
|
|
45
|
+
);
|
|
46
|
+
const refresh = () => Promise.all([
|
|
47
|
+
queryClient.invalidateQueries({ queryKey: [connectionDashboardModel.CONNECTION_DASHBOARD_QUERY_KEY] }),
|
|
48
|
+
queryClient.invalidateQueries({ queryKey: [CONNECTION_DETAIL_QUERY_KEY] })
|
|
49
|
+
]);
|
|
50
|
+
const testAction = ({ value, canSubmit }) => /* @__PURE__ */ jsxRuntime.jsx(connectionTestButton.ConnectionTestButton, { apiBase, value, canSubmit });
|
|
51
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
52
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", onClick: () => setCreating(true), children: "Add Connection" }) }),
|
|
53
|
+
/* @__PURE__ */ jsxRuntime.jsx(connectionDashboard.ConnectionDashboardSurface, { apiBase, renderConnectionLink }),
|
|
54
|
+
creating ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
55
|
+
ConnectionFormDialog,
|
|
56
|
+
{
|
|
57
|
+
apiBase,
|
|
58
|
+
client,
|
|
59
|
+
action: connectionsPageModel.createConnectionAction,
|
|
60
|
+
title: "Add Connection",
|
|
61
|
+
submitLabel: "Add Connection",
|
|
62
|
+
extensions,
|
|
63
|
+
footerActions: testAction,
|
|
64
|
+
onClose: () => setCreating(false),
|
|
65
|
+
onSaved: () => {
|
|
66
|
+
setCreating(false);
|
|
67
|
+
void refresh();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
) : selected ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
71
|
+
ConnectionEditDialog,
|
|
72
|
+
{
|
|
73
|
+
id: selected,
|
|
74
|
+
apiBase,
|
|
75
|
+
client,
|
|
76
|
+
extensions,
|
|
77
|
+
testAction,
|
|
78
|
+
onClose: () => onSelect(void 0),
|
|
79
|
+
onChanged: () => {
|
|
80
|
+
onSelect(void 0);
|
|
81
|
+
void refresh();
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
selected
|
|
85
|
+
) : null
|
|
86
|
+
] });
|
|
87
|
+
}
|
|
88
|
+
function ConnectionEditDialog({
|
|
89
|
+
id,
|
|
90
|
+
apiBase,
|
|
91
|
+
client,
|
|
92
|
+
extensions,
|
|
93
|
+
testAction,
|
|
94
|
+
onClose,
|
|
95
|
+
onChanged
|
|
96
|
+
}) {
|
|
97
|
+
const { confirm, dialog } = useConfirm.useConfirm();
|
|
98
|
+
const [deleting, setDeleting] = react.useState(false);
|
|
99
|
+
const [deleteError, setDeleteError] = react.useState("");
|
|
100
|
+
const detail = reactQuery.useQuery({
|
|
101
|
+
queryKey: [CONNECTION_DETAIL_QUERY_KEY, apiBase, id],
|
|
102
|
+
queryFn: async () => {
|
|
103
|
+
const response = await client.executeCommand(
|
|
104
|
+
connectionsPageModel.updateConnectionAction.path,
|
|
105
|
+
"GET",
|
|
106
|
+
{ id },
|
|
107
|
+
{ Accept: "application/json" }
|
|
108
|
+
);
|
|
109
|
+
if (!collections.isPlainObject(response.parsed)) {
|
|
110
|
+
throw new Error(`GET ${apiBase}/connection/${id} did not return a connection object`);
|
|
111
|
+
}
|
|
112
|
+
return response.parsed;
|
|
113
|
+
},
|
|
114
|
+
retry: 0
|
|
115
|
+
});
|
|
116
|
+
if (!detail.data) {
|
|
117
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Modal.Modal, { open: true, onClose, title: "Edit connection", size: "2xl", children: detail.isError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: ERROR_BOX, children: errorMessage(detail.error) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: "Loading connection…" }) });
|
|
118
|
+
}
|
|
119
|
+
const connection = detail.data;
|
|
120
|
+
const name = typeof connection.name === "string" && connection.name ? connection.name : id;
|
|
121
|
+
async function remove() {
|
|
122
|
+
const confirmed = await confirm({
|
|
123
|
+
title: "Delete connection?",
|
|
124
|
+
message: `Delete connection "${name}"? This cannot be undone.`,
|
|
125
|
+
confirmLabel: "Delete",
|
|
126
|
+
variant: "destructive"
|
|
127
|
+
});
|
|
128
|
+
if (!confirmed) return;
|
|
129
|
+
setDeleting(true);
|
|
130
|
+
setDeleteError("");
|
|
131
|
+
let failure = "";
|
|
132
|
+
try {
|
|
133
|
+
const response = await client.executeCommand(
|
|
134
|
+
connectionsPageModel.updateConnectionAction.path,
|
|
135
|
+
"DELETE",
|
|
136
|
+
{ id },
|
|
137
|
+
{ Accept: "application/json" }
|
|
138
|
+
);
|
|
139
|
+
failure = response.error ?? "";
|
|
140
|
+
} catch (err) {
|
|
141
|
+
failure = errorMessage(err);
|
|
142
|
+
}
|
|
143
|
+
setDeleting(false);
|
|
144
|
+
if (failure) setDeleteError(failure);
|
|
145
|
+
else onChanged();
|
|
146
|
+
}
|
|
147
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
148
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
149
|
+
ConnectionFormDialog,
|
|
150
|
+
{
|
|
151
|
+
apiBase,
|
|
152
|
+
client,
|
|
153
|
+
action: connectionsPageModel.updateConnectionAction,
|
|
154
|
+
lockedValues: { id },
|
|
155
|
+
initialValue: connection,
|
|
156
|
+
title: `Edit ${name}`,
|
|
157
|
+
submitLabel: "Save",
|
|
158
|
+
extensions,
|
|
159
|
+
footerActions: (context) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
160
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
161
|
+
button.Button,
|
|
162
|
+
{
|
|
163
|
+
type: "button",
|
|
164
|
+
variant: "destructive",
|
|
165
|
+
className: "mr-auto",
|
|
166
|
+
disabled: deleting,
|
|
167
|
+
onClick: () => void remove(),
|
|
168
|
+
children: deleting ? "Deleting…" : "Delete"
|
|
169
|
+
}
|
|
170
|
+
),
|
|
171
|
+
testAction(context)
|
|
172
|
+
] }),
|
|
173
|
+
notice: deleteError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: ERROR_BOX, children: deleteError }) : null,
|
|
174
|
+
onClose,
|
|
175
|
+
onSaved: onChanged
|
|
176
|
+
}
|
|
177
|
+
),
|
|
178
|
+
dialog
|
|
179
|
+
] });
|
|
180
|
+
}
|
|
181
|
+
function ConnectionFormDialog({
|
|
182
|
+
apiBase,
|
|
183
|
+
client,
|
|
184
|
+
action,
|
|
185
|
+
lockedValues,
|
|
186
|
+
initialValue,
|
|
187
|
+
title,
|
|
188
|
+
submitLabel,
|
|
189
|
+
extensions,
|
|
190
|
+
footerActions,
|
|
191
|
+
notice,
|
|
192
|
+
onClose,
|
|
193
|
+
onSaved
|
|
194
|
+
}) {
|
|
195
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
196
|
+
SchemaActionForm.SchemaActionForm,
|
|
197
|
+
{
|
|
198
|
+
client,
|
|
199
|
+
action,
|
|
200
|
+
submitLabel,
|
|
201
|
+
formPre: extensions.pre,
|
|
202
|
+
formPost: extensions.post,
|
|
203
|
+
footerActions,
|
|
204
|
+
...lockedValues ? { lockedValues } : {},
|
|
205
|
+
...initialValue ? { initialValue } : {},
|
|
206
|
+
onSuccess: onSaved,
|
|
207
|
+
renderLayout: ({ body, footer }) => /* @__PURE__ */ jsxRuntime.jsx(Modal.Modal, { open: true, onClose, title, size: "2xl", footer, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
208
|
+
body,
|
|
209
|
+
notice
|
|
210
|
+
] }) }),
|
|
211
|
+
fallback: /* @__PURE__ */ jsxRuntime.jsx("div", { className: ERROR_BOX, children: `GET ${apiBase}/connection served no connection JSON Schema (Accept: application/schema+json).` })
|
|
212
|
+
}
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
function errorMessage(err) {
|
|
216
|
+
return err instanceof Error ? err.message : String(err);
|
|
217
|
+
}
|
|
218
|
+
exports.ConnectionsPage = ConnectionsPage;
|
|
219
|
+
//# sourceMappingURL=ConnectionsPage.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionsPage.cjs","sources":["../../src/connections/ConnectionsPage.tsx"],"sourcesContent":["import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback, useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { Modal } from \"../overlay/Modal\";\nimport { useConfirm } from \"../overlay/useConfirm\";\nimport { createOperationsApiClient } from \"../rpc/apiClient\";\nimport { SchemaActionForm, type FormActionsRenderer } from \"../rpc/SchemaActionForm\";\nimport type { ResolvedOperation } from \"../rpc/types\";\nimport type { OperationsApiClient } from \"../rpc/useOperations\";\nimport { ConnectionDashboardSurface } from \"./connectionDashboard\";\nimport {\n CONNECTION_DASHBOARD_QUERY_KEY,\n type ConnectionLinkRenderer,\n} from \"./connectionDashboardModel\";\nimport { ConnectionTestButton } from \"./connectionTestButton\";\nimport {\n connectionFormExtensions,\n createConnectionAction,\n isPlainLeftClick,\n updateConnectionAction,\n type ConnectionFormExtensions,\n} from \"./connectionsPageModel\";\n\nconst CONNECTION_DETAIL_QUERY_KEY = \"connection-detail\";\nconst ERROR_BOX =\n \"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\";\n\nexport type ConnectionsPageProps = {\n /** Where the commons-db connections service is mounted, e.g. `/api/v1`. */\n apiBase: string;\n /** The connection whose edit dialog is open; the host keeps it in its route. */\n selected?: string;\n /** Called with a row's id when it is clicked, and with undefined to close the editor. */\n onSelect: (id: string | undefined) => void;\n /** The host route of a connection, so a row stays a real link (new tab, copy link). */\n connectionHref: (id: string) => string;\n /** Pickers the host adds to the connection form (e.g. namespace / secret selectors). */\n formExtensions?: ConnectionFormExtensions;\n};\n\n/**\n * ConnectionsPage is the connections screen for a host that does not run\n * EntityExplorerApp: the namespace-laned dashboard, an \"Add Connection\" dialog\n * over the schema the service serves on `GET {apiBase}/connection`, and — while\n * `selected` names a connection — the same dialog editing it, with Delete. Both\n * dialogs carry the Test / Resolve action, which works on the unsaved draft.\n * Needs a react-query QueryClientProvider from the host.\n */\nexport function ConnectionsPage({\n apiBase,\n selected,\n onSelect,\n connectionHref,\n formExtensions,\n}: ConnectionsPageProps) {\n const [creating, setCreating] = useState(false);\n const queryClient = useQueryClient();\n const client = useMemo(() => createOperationsApiClient({ baseUrl: apiBase }), [apiBase]);\n const extensions = useMemo(() => connectionFormExtensions(formExtensions), [formExtensions]);\n const renderConnectionLink = useCallback<ConnectionLinkRenderer>(\n (connection, link) => (\n <a\n href={connectionHref(connection.id)}\n className={link.className}\n title={link.title}\n onClick={(event) => {\n if (!isPlainLeftClick(event)) return;\n event.preventDefault();\n onSelect(connection.id);\n }}\n >\n {link.children}\n </a>\n ),\n [connectionHref, onSelect],\n );\n const refresh = () =>\n Promise.all([\n queryClient.invalidateQueries({ queryKey: [CONNECTION_DASHBOARD_QUERY_KEY] }),\n queryClient.invalidateQueries({ queryKey: [CONNECTION_DETAIL_QUERY_KEY] }),\n ]);\n const testAction: FormActionsRenderer = ({ value, canSubmit }) => (\n <ConnectionTestButton apiBase={apiBase} value={value} canSubmit={canSubmit} />\n );\n\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={() => setCreating(true)}>\n Add Connection\n </Button>\n </div>\n <ConnectionDashboardSurface apiBase={apiBase} renderConnectionLink={renderConnectionLink} />\n {creating ? (\n <ConnectionFormDialog\n apiBase={apiBase}\n client={client}\n action={createConnectionAction}\n title=\"Add Connection\"\n submitLabel=\"Add Connection\"\n extensions={extensions}\n footerActions={testAction}\n onClose={() => setCreating(false)}\n onSaved={() => {\n setCreating(false);\n void refresh();\n }}\n />\n ) : selected ? (\n <ConnectionEditDialog\n key={selected}\n id={selected}\n apiBase={apiBase}\n client={client}\n extensions={extensions}\n testAction={testAction}\n onClose={() => onSelect(undefined)}\n onChanged={() => {\n onSelect(undefined);\n void refresh();\n }}\n />\n ) : null}\n </div>\n );\n}\n\nfunction ConnectionEditDialog({\n id,\n apiBase,\n client,\n extensions,\n testAction,\n onClose,\n onChanged,\n}: {\n id: string;\n apiBase: string;\n client: OperationsApiClient;\n extensions: Required<ConnectionFormExtensions>;\n testAction: FormActionsRenderer;\n onClose: () => void;\n onChanged: () => void;\n}) {\n const { confirm, dialog } = useConfirm();\n const [deleting, setDeleting] = useState(false);\n const [deleteError, setDeleteError] = useState(\"\");\n const detail = useQuery({\n queryKey: [CONNECTION_DETAIL_QUERY_KEY, apiBase, id],\n queryFn: async () => {\n const response = await client.executeCommand(\n updateConnectionAction.path,\n \"GET\",\n { id },\n { Accept: \"application/json\" },\n );\n if (!isPlainObject(response.parsed)) {\n throw new Error(`GET ${apiBase}/connection/${id} did not return a connection object`);\n }\n return response.parsed;\n },\n retry: 0,\n });\n\n if (!detail.data) {\n return (\n <Modal open onClose={onClose} title=\"Edit connection\" size=\"2xl\">\n {detail.isError ? (\n <div className={ERROR_BOX}>{errorMessage(detail.error)}</div>\n ) : (\n <div className=\"text-sm text-muted-foreground\">Loading connection…</div>\n )}\n </Modal>\n );\n }\n\n const connection = detail.data;\n const name = typeof connection.name === \"string\" && connection.name ? connection.name : id;\n\n async function remove() {\n const confirmed = await confirm({\n title: \"Delete connection?\",\n message: `Delete connection \"${name}\"? This cannot be undone.`,\n confirmLabel: \"Delete\",\n variant: \"destructive\",\n });\n if (!confirmed) return;\n setDeleting(true);\n setDeleteError(\"\");\n let failure = \"\";\n try {\n const response = await client.executeCommand(\n updateConnectionAction.path,\n \"DELETE\",\n { id },\n { Accept: \"application/json\" },\n );\n failure = response.error ?? \"\";\n } catch (err) {\n failure = errorMessage(err);\n }\n setDeleting(false);\n if (failure) setDeleteError(failure);\n else onChanged();\n }\n\n return (\n <>\n <ConnectionFormDialog\n apiBase={apiBase}\n client={client}\n action={updateConnectionAction}\n lockedValues={{ id }}\n initialValue={connection}\n title={`Edit ${name}`}\n submitLabel=\"Save\"\n extensions={extensions}\n footerActions={(context) => (\n <>\n <Button\n type=\"button\"\n variant=\"destructive\"\n className=\"mr-auto\"\n disabled={deleting}\n onClick={() => void remove()}\n >\n {deleting ? \"Deleting…\" : \"Delete\"}\n </Button>\n {testAction(context)}\n </>\n )}\n notice={deleteError ? <div className={ERROR_BOX}>{deleteError}</div> : null}\n onClose={onClose}\n onSaved={onChanged}\n />\n {dialog}\n </>\n );\n}\n\nfunction ConnectionFormDialog({\n apiBase,\n client,\n action,\n lockedValues,\n initialValue,\n title,\n submitLabel,\n extensions,\n footerActions,\n notice,\n onClose,\n onSaved,\n}: {\n apiBase: string;\n client: OperationsApiClient;\n action: ResolvedOperation;\n lockedValues?: Record<string, string>;\n initialValue?: Record<string, unknown>;\n title: string;\n submitLabel: string;\n extensions: Required<ConnectionFormExtensions>;\n footerActions: FormActionsRenderer;\n notice?: ReactNode;\n onClose: () => void;\n onSaved: () => void;\n}) {\n return (\n <SchemaActionForm\n client={client}\n action={action}\n submitLabel={submitLabel}\n formPre={extensions.pre}\n formPost={extensions.post}\n footerActions={footerActions}\n {...(lockedValues ? { lockedValues } : {})}\n {...(initialValue ? { initialValue } : {})}\n onSuccess={onSaved}\n renderLayout={({ body, footer }) => (\n <Modal open onClose={onClose} title={title} size=\"2xl\" footer={footer}>\n <div className=\"space-y-4\">\n {body}\n {notice}\n </div>\n </Modal>\n )}\n fallback={\n <div className={ERROR_BOX}>\n {`GET ${apiBase}/connection served no connection JSON Schema (Accept: application/schema+json).`}\n </div>\n }\n />\n );\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n"],"names":["useState","useQueryClient","useMemo","createOperationsApiClient","connectionFormExtensions","useCallback","jsx","isPlainLeftClick","CONNECTION_DASHBOARD_QUERY_KEY","ConnectionTestButton","jsxs","Button","ConnectionDashboardSurface","createConnectionAction","useConfirm","useQuery","updateConnectionAction","isPlainObject","Modal","Fragment","SchemaActionForm"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ConnectionFormExtensions } from './connectionsPageModel.js';
|
|
2
|
+
export type ConnectionsPageProps = {
|
|
3
|
+
/** Where the commons-db connections service is mounted, e.g. `/api/v1`. */
|
|
4
|
+
apiBase: string;
|
|
5
|
+
/** The connection whose edit dialog is open; the host keeps it in its route. */
|
|
6
|
+
selected?: string;
|
|
7
|
+
/** Called with a row's id when it is clicked, and with undefined to close the editor. */
|
|
8
|
+
onSelect: (id: string | undefined) => void;
|
|
9
|
+
/** The host route of a connection, so a row stays a real link (new tab, copy link). */
|
|
10
|
+
connectionHref: (id: string) => string;
|
|
11
|
+
/** Pickers the host adds to the connection form (e.g. namespace / secret selectors). */
|
|
12
|
+
formExtensions?: ConnectionFormExtensions;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* ConnectionsPage is the connections screen for a host that does not run
|
|
16
|
+
* EntityExplorerApp: the namespace-laned dashboard, an "Add Connection" dialog
|
|
17
|
+
* over the schema the service serves on `GET {apiBase}/connection`, and — while
|
|
18
|
+
* `selected` names a connection — the same dialog editing it, with Delete. Both
|
|
19
|
+
* dialogs carry the Test / Resolve action, which works on the unsaved draft.
|
|
20
|
+
* Needs a react-query QueryClientProvider from the host.
|
|
21
|
+
*/
|
|
22
|
+
export declare function ConnectionsPage({ apiBase, selected, onSelect, connectionHref, formExtensions, }: ConnectionsPageProps): import("react").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=ConnectionsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionsPage.d.ts","sourceRoot":"","sources":["../../src/connections/ConnectionsPage.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,wBAAwB,CAAC;AAMhC,MAAM,MAAM,oBAAoB,GAAG;IACjC,2EAA2E;IAC3E,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC3C,uFAAuF;IACvF,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,wFAAwF;IACxF,cAAc,CAAC,EAAE,wBAAwB,CAAC;CAC3C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,cAAc,GACf,EAAE,oBAAoB,+BAuEtB"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useQueryClient, useQuery } from "@tanstack/react-query";
|
|
3
|
+
import { useState, useMemo, useCallback } from "react";
|
|
4
|
+
import { Button } from "../components/button.js";
|
|
5
|
+
import { isPlainObject } from "../lib/collections.js";
|
|
6
|
+
import { Modal } from "../overlay/Modal.js";
|
|
7
|
+
import { useConfirm } from "../overlay/useConfirm.js";
|
|
8
|
+
import { createOperationsApiClient } from "../rpc/apiClient.js";
|
|
9
|
+
import { SchemaActionForm } from "../rpc/SchemaActionForm.js";
|
|
10
|
+
import { ConnectionDashboardSurface } from "./connectionDashboard.js";
|
|
11
|
+
import { CONNECTION_DASHBOARD_QUERY_KEY } from "./connectionDashboardModel.js";
|
|
12
|
+
import { ConnectionTestButton } from "./connectionTestButton.js";
|
|
13
|
+
import { connectionFormExtensions, isPlainLeftClick, createConnectionAction, updateConnectionAction } from "./connectionsPageModel.js";
|
|
14
|
+
const CONNECTION_DETAIL_QUERY_KEY = "connection-detail";
|
|
15
|
+
const ERROR_BOX = "rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive";
|
|
16
|
+
function ConnectionsPage({
|
|
17
|
+
apiBase,
|
|
18
|
+
selected,
|
|
19
|
+
onSelect,
|
|
20
|
+
connectionHref,
|
|
21
|
+
formExtensions
|
|
22
|
+
}) {
|
|
23
|
+
const [creating, setCreating] = useState(false);
|
|
24
|
+
const queryClient = useQueryClient();
|
|
25
|
+
const client = useMemo(() => createOperationsApiClient({ baseUrl: apiBase }), [apiBase]);
|
|
26
|
+
const extensions = useMemo(() => connectionFormExtensions(formExtensions), [formExtensions]);
|
|
27
|
+
const renderConnectionLink = useCallback(
|
|
28
|
+
(connection, link) => /* @__PURE__ */ jsx(
|
|
29
|
+
"a",
|
|
30
|
+
{
|
|
31
|
+
href: connectionHref(connection.id),
|
|
32
|
+
className: link.className,
|
|
33
|
+
title: link.title,
|
|
34
|
+
onClick: (event) => {
|
|
35
|
+
if (!isPlainLeftClick(event)) return;
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
onSelect(connection.id);
|
|
38
|
+
},
|
|
39
|
+
children: link.children
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
[connectionHref, onSelect]
|
|
43
|
+
);
|
|
44
|
+
const refresh = () => Promise.all([
|
|
45
|
+
queryClient.invalidateQueries({ queryKey: [CONNECTION_DASHBOARD_QUERY_KEY] }),
|
|
46
|
+
queryClient.invalidateQueries({ queryKey: [CONNECTION_DETAIL_QUERY_KEY] })
|
|
47
|
+
]);
|
|
48
|
+
const testAction = ({ value, canSubmit }) => /* @__PURE__ */ jsx(ConnectionTestButton, { apiBase, value, canSubmit });
|
|
49
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
50
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-2", children: /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setCreating(true), children: "Add Connection" }) }),
|
|
51
|
+
/* @__PURE__ */ jsx(ConnectionDashboardSurface, { apiBase, renderConnectionLink }),
|
|
52
|
+
creating ? /* @__PURE__ */ jsx(
|
|
53
|
+
ConnectionFormDialog,
|
|
54
|
+
{
|
|
55
|
+
apiBase,
|
|
56
|
+
client,
|
|
57
|
+
action: createConnectionAction,
|
|
58
|
+
title: "Add Connection",
|
|
59
|
+
submitLabel: "Add Connection",
|
|
60
|
+
extensions,
|
|
61
|
+
footerActions: testAction,
|
|
62
|
+
onClose: () => setCreating(false),
|
|
63
|
+
onSaved: () => {
|
|
64
|
+
setCreating(false);
|
|
65
|
+
void refresh();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
) : selected ? /* @__PURE__ */ jsx(
|
|
69
|
+
ConnectionEditDialog,
|
|
70
|
+
{
|
|
71
|
+
id: selected,
|
|
72
|
+
apiBase,
|
|
73
|
+
client,
|
|
74
|
+
extensions,
|
|
75
|
+
testAction,
|
|
76
|
+
onClose: () => onSelect(void 0),
|
|
77
|
+
onChanged: () => {
|
|
78
|
+
onSelect(void 0);
|
|
79
|
+
void refresh();
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
selected
|
|
83
|
+
) : null
|
|
84
|
+
] });
|
|
85
|
+
}
|
|
86
|
+
function ConnectionEditDialog({
|
|
87
|
+
id,
|
|
88
|
+
apiBase,
|
|
89
|
+
client,
|
|
90
|
+
extensions,
|
|
91
|
+
testAction,
|
|
92
|
+
onClose,
|
|
93
|
+
onChanged
|
|
94
|
+
}) {
|
|
95
|
+
const { confirm, dialog } = useConfirm();
|
|
96
|
+
const [deleting, setDeleting] = useState(false);
|
|
97
|
+
const [deleteError, setDeleteError] = useState("");
|
|
98
|
+
const detail = useQuery({
|
|
99
|
+
queryKey: [CONNECTION_DETAIL_QUERY_KEY, apiBase, id],
|
|
100
|
+
queryFn: async () => {
|
|
101
|
+
const response = await client.executeCommand(
|
|
102
|
+
updateConnectionAction.path,
|
|
103
|
+
"GET",
|
|
104
|
+
{ id },
|
|
105
|
+
{ Accept: "application/json" }
|
|
106
|
+
);
|
|
107
|
+
if (!isPlainObject(response.parsed)) {
|
|
108
|
+
throw new Error(`GET ${apiBase}/connection/${id} did not return a connection object`);
|
|
109
|
+
}
|
|
110
|
+
return response.parsed;
|
|
111
|
+
},
|
|
112
|
+
retry: 0
|
|
113
|
+
});
|
|
114
|
+
if (!detail.data) {
|
|
115
|
+
return /* @__PURE__ */ jsx(Modal, { open: true, onClose, title: "Edit connection", size: "2xl", children: detail.isError ? /* @__PURE__ */ jsx("div", { className: ERROR_BOX, children: errorMessage(detail.error) }) : /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "Loading connection…" }) });
|
|
116
|
+
}
|
|
117
|
+
const connection = detail.data;
|
|
118
|
+
const name = typeof connection.name === "string" && connection.name ? connection.name : id;
|
|
119
|
+
async function remove() {
|
|
120
|
+
const confirmed = await confirm({
|
|
121
|
+
title: "Delete connection?",
|
|
122
|
+
message: `Delete connection "${name}"? This cannot be undone.`,
|
|
123
|
+
confirmLabel: "Delete",
|
|
124
|
+
variant: "destructive"
|
|
125
|
+
});
|
|
126
|
+
if (!confirmed) return;
|
|
127
|
+
setDeleting(true);
|
|
128
|
+
setDeleteError("");
|
|
129
|
+
let failure = "";
|
|
130
|
+
try {
|
|
131
|
+
const response = await client.executeCommand(
|
|
132
|
+
updateConnectionAction.path,
|
|
133
|
+
"DELETE",
|
|
134
|
+
{ id },
|
|
135
|
+
{ Accept: "application/json" }
|
|
136
|
+
);
|
|
137
|
+
failure = response.error ?? "";
|
|
138
|
+
} catch (err) {
|
|
139
|
+
failure = errorMessage(err);
|
|
140
|
+
}
|
|
141
|
+
setDeleting(false);
|
|
142
|
+
if (failure) setDeleteError(failure);
|
|
143
|
+
else onChanged();
|
|
144
|
+
}
|
|
145
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
146
|
+
/* @__PURE__ */ jsx(
|
|
147
|
+
ConnectionFormDialog,
|
|
148
|
+
{
|
|
149
|
+
apiBase,
|
|
150
|
+
client,
|
|
151
|
+
action: updateConnectionAction,
|
|
152
|
+
lockedValues: { id },
|
|
153
|
+
initialValue: connection,
|
|
154
|
+
title: `Edit ${name}`,
|
|
155
|
+
submitLabel: "Save",
|
|
156
|
+
extensions,
|
|
157
|
+
footerActions: (context) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
158
|
+
/* @__PURE__ */ jsx(
|
|
159
|
+
Button,
|
|
160
|
+
{
|
|
161
|
+
type: "button",
|
|
162
|
+
variant: "destructive",
|
|
163
|
+
className: "mr-auto",
|
|
164
|
+
disabled: deleting,
|
|
165
|
+
onClick: () => void remove(),
|
|
166
|
+
children: deleting ? "Deleting…" : "Delete"
|
|
167
|
+
}
|
|
168
|
+
),
|
|
169
|
+
testAction(context)
|
|
170
|
+
] }),
|
|
171
|
+
notice: deleteError ? /* @__PURE__ */ jsx("div", { className: ERROR_BOX, children: deleteError }) : null,
|
|
172
|
+
onClose,
|
|
173
|
+
onSaved: onChanged
|
|
174
|
+
}
|
|
175
|
+
),
|
|
176
|
+
dialog
|
|
177
|
+
] });
|
|
178
|
+
}
|
|
179
|
+
function ConnectionFormDialog({
|
|
180
|
+
apiBase,
|
|
181
|
+
client,
|
|
182
|
+
action,
|
|
183
|
+
lockedValues,
|
|
184
|
+
initialValue,
|
|
185
|
+
title,
|
|
186
|
+
submitLabel,
|
|
187
|
+
extensions,
|
|
188
|
+
footerActions,
|
|
189
|
+
notice,
|
|
190
|
+
onClose,
|
|
191
|
+
onSaved
|
|
192
|
+
}) {
|
|
193
|
+
return /* @__PURE__ */ jsx(
|
|
194
|
+
SchemaActionForm,
|
|
195
|
+
{
|
|
196
|
+
client,
|
|
197
|
+
action,
|
|
198
|
+
submitLabel,
|
|
199
|
+
formPre: extensions.pre,
|
|
200
|
+
formPost: extensions.post,
|
|
201
|
+
footerActions,
|
|
202
|
+
...lockedValues ? { lockedValues } : {},
|
|
203
|
+
...initialValue ? { initialValue } : {},
|
|
204
|
+
onSuccess: onSaved,
|
|
205
|
+
renderLayout: ({ body, footer }) => /* @__PURE__ */ jsx(Modal, { open: true, onClose, title, size: "2xl", footer, children: /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
206
|
+
body,
|
|
207
|
+
notice
|
|
208
|
+
] }) }),
|
|
209
|
+
fallback: /* @__PURE__ */ jsx("div", { className: ERROR_BOX, children: `GET ${apiBase}/connection served no connection JSON Schema (Accept: application/schema+json).` })
|
|
210
|
+
}
|
|
211
|
+
);
|
|
212
|
+
}
|
|
213
|
+
function errorMessage(err) {
|
|
214
|
+
return err instanceof Error ? err.message : String(err);
|
|
215
|
+
}
|
|
216
|
+
export {
|
|
217
|
+
ConnectionsPage
|
|
218
|
+
};
|
|
219
|
+
//# sourceMappingURL=ConnectionsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionsPage.js","sources":["../../src/connections/ConnectionsPage.tsx"],"sourcesContent":["import { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { useCallback, useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { Modal } from \"../overlay/Modal\";\nimport { useConfirm } from \"../overlay/useConfirm\";\nimport { createOperationsApiClient } from \"../rpc/apiClient\";\nimport { SchemaActionForm, type FormActionsRenderer } from \"../rpc/SchemaActionForm\";\nimport type { ResolvedOperation } from \"../rpc/types\";\nimport type { OperationsApiClient } from \"../rpc/useOperations\";\nimport { ConnectionDashboardSurface } from \"./connectionDashboard\";\nimport {\n CONNECTION_DASHBOARD_QUERY_KEY,\n type ConnectionLinkRenderer,\n} from \"./connectionDashboardModel\";\nimport { ConnectionTestButton } from \"./connectionTestButton\";\nimport {\n connectionFormExtensions,\n createConnectionAction,\n isPlainLeftClick,\n updateConnectionAction,\n type ConnectionFormExtensions,\n} from \"./connectionsPageModel\";\n\nconst CONNECTION_DETAIL_QUERY_KEY = \"connection-detail\";\nconst ERROR_BOX =\n \"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\";\n\nexport type ConnectionsPageProps = {\n /** Where the commons-db connections service is mounted, e.g. `/api/v1`. */\n apiBase: string;\n /** The connection whose edit dialog is open; the host keeps it in its route. */\n selected?: string;\n /** Called with a row's id when it is clicked, and with undefined to close the editor. */\n onSelect: (id: string | undefined) => void;\n /** The host route of a connection, so a row stays a real link (new tab, copy link). */\n connectionHref: (id: string) => string;\n /** Pickers the host adds to the connection form (e.g. namespace / secret selectors). */\n formExtensions?: ConnectionFormExtensions;\n};\n\n/**\n * ConnectionsPage is the connections screen for a host that does not run\n * EntityExplorerApp: the namespace-laned dashboard, an \"Add Connection\" dialog\n * over the schema the service serves on `GET {apiBase}/connection`, and — while\n * `selected` names a connection — the same dialog editing it, with Delete. Both\n * dialogs carry the Test / Resolve action, which works on the unsaved draft.\n * Needs a react-query QueryClientProvider from the host.\n */\nexport function ConnectionsPage({\n apiBase,\n selected,\n onSelect,\n connectionHref,\n formExtensions,\n}: ConnectionsPageProps) {\n const [creating, setCreating] = useState(false);\n const queryClient = useQueryClient();\n const client = useMemo(() => createOperationsApiClient({ baseUrl: apiBase }), [apiBase]);\n const extensions = useMemo(() => connectionFormExtensions(formExtensions), [formExtensions]);\n const renderConnectionLink = useCallback<ConnectionLinkRenderer>(\n (connection, link) => (\n <a\n href={connectionHref(connection.id)}\n className={link.className}\n title={link.title}\n onClick={(event) => {\n if (!isPlainLeftClick(event)) return;\n event.preventDefault();\n onSelect(connection.id);\n }}\n >\n {link.children}\n </a>\n ),\n [connectionHref, onSelect],\n );\n const refresh = () =>\n Promise.all([\n queryClient.invalidateQueries({ queryKey: [CONNECTION_DASHBOARD_QUERY_KEY] }),\n queryClient.invalidateQueries({ queryKey: [CONNECTION_DETAIL_QUERY_KEY] }),\n ]);\n const testAction: FormActionsRenderer = ({ value, canSubmit }) => (\n <ConnectionTestButton apiBase={apiBase} value={value} canSubmit={canSubmit} />\n );\n\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={() => setCreating(true)}>\n Add Connection\n </Button>\n </div>\n <ConnectionDashboardSurface apiBase={apiBase} renderConnectionLink={renderConnectionLink} />\n {creating ? (\n <ConnectionFormDialog\n apiBase={apiBase}\n client={client}\n action={createConnectionAction}\n title=\"Add Connection\"\n submitLabel=\"Add Connection\"\n extensions={extensions}\n footerActions={testAction}\n onClose={() => setCreating(false)}\n onSaved={() => {\n setCreating(false);\n void refresh();\n }}\n />\n ) : selected ? (\n <ConnectionEditDialog\n key={selected}\n id={selected}\n apiBase={apiBase}\n client={client}\n extensions={extensions}\n testAction={testAction}\n onClose={() => onSelect(undefined)}\n onChanged={() => {\n onSelect(undefined);\n void refresh();\n }}\n />\n ) : null}\n </div>\n );\n}\n\nfunction ConnectionEditDialog({\n id,\n apiBase,\n client,\n extensions,\n testAction,\n onClose,\n onChanged,\n}: {\n id: string;\n apiBase: string;\n client: OperationsApiClient;\n extensions: Required<ConnectionFormExtensions>;\n testAction: FormActionsRenderer;\n onClose: () => void;\n onChanged: () => void;\n}) {\n const { confirm, dialog } = useConfirm();\n const [deleting, setDeleting] = useState(false);\n const [deleteError, setDeleteError] = useState(\"\");\n const detail = useQuery({\n queryKey: [CONNECTION_DETAIL_QUERY_KEY, apiBase, id],\n queryFn: async () => {\n const response = await client.executeCommand(\n updateConnectionAction.path,\n \"GET\",\n { id },\n { Accept: \"application/json\" },\n );\n if (!isPlainObject(response.parsed)) {\n throw new Error(`GET ${apiBase}/connection/${id} did not return a connection object`);\n }\n return response.parsed;\n },\n retry: 0,\n });\n\n if (!detail.data) {\n return (\n <Modal open onClose={onClose} title=\"Edit connection\" size=\"2xl\">\n {detail.isError ? (\n <div className={ERROR_BOX}>{errorMessage(detail.error)}</div>\n ) : (\n <div className=\"text-sm text-muted-foreground\">Loading connection…</div>\n )}\n </Modal>\n );\n }\n\n const connection = detail.data;\n const name = typeof connection.name === \"string\" && connection.name ? connection.name : id;\n\n async function remove() {\n const confirmed = await confirm({\n title: \"Delete connection?\",\n message: `Delete connection \"${name}\"? This cannot be undone.`,\n confirmLabel: \"Delete\",\n variant: \"destructive\",\n });\n if (!confirmed) return;\n setDeleting(true);\n setDeleteError(\"\");\n let failure = \"\";\n try {\n const response = await client.executeCommand(\n updateConnectionAction.path,\n \"DELETE\",\n { id },\n { Accept: \"application/json\" },\n );\n failure = response.error ?? \"\";\n } catch (err) {\n failure = errorMessage(err);\n }\n setDeleting(false);\n if (failure) setDeleteError(failure);\n else onChanged();\n }\n\n return (\n <>\n <ConnectionFormDialog\n apiBase={apiBase}\n client={client}\n action={updateConnectionAction}\n lockedValues={{ id }}\n initialValue={connection}\n title={`Edit ${name}`}\n submitLabel=\"Save\"\n extensions={extensions}\n footerActions={(context) => (\n <>\n <Button\n type=\"button\"\n variant=\"destructive\"\n className=\"mr-auto\"\n disabled={deleting}\n onClick={() => void remove()}\n >\n {deleting ? \"Deleting…\" : \"Delete\"}\n </Button>\n {testAction(context)}\n </>\n )}\n notice={deleteError ? <div className={ERROR_BOX}>{deleteError}</div> : null}\n onClose={onClose}\n onSaved={onChanged}\n />\n {dialog}\n </>\n );\n}\n\nfunction ConnectionFormDialog({\n apiBase,\n client,\n action,\n lockedValues,\n initialValue,\n title,\n submitLabel,\n extensions,\n footerActions,\n notice,\n onClose,\n onSaved,\n}: {\n apiBase: string;\n client: OperationsApiClient;\n action: ResolvedOperation;\n lockedValues?: Record<string, string>;\n initialValue?: Record<string, unknown>;\n title: string;\n submitLabel: string;\n extensions: Required<ConnectionFormExtensions>;\n footerActions: FormActionsRenderer;\n notice?: ReactNode;\n onClose: () => void;\n onSaved: () => void;\n}) {\n return (\n <SchemaActionForm\n client={client}\n action={action}\n submitLabel={submitLabel}\n formPre={extensions.pre}\n formPost={extensions.post}\n footerActions={footerActions}\n {...(lockedValues ? { lockedValues } : {})}\n {...(initialValue ? { initialValue } : {})}\n onSuccess={onSaved}\n renderLayout={({ body, footer }) => (\n <Modal open onClose={onClose} title={title} size=\"2xl\" footer={footer}>\n <div className=\"space-y-4\">\n {body}\n {notice}\n </div>\n </Modal>\n )}\n fallback={\n <div className={ERROR_BOX}>\n {`GET ${apiBase}/connection served no connection JSON Schema (Accept: application/schema+json).`}\n </div>\n }\n />\n );\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const HoverCard = require("../overlay/HoverCard.cjs");
|
|
5
|
+
const connectionActionTypes = require("./connectionActionTypes.cjs");
|
|
6
|
+
const connectionErrorView = require("./connectionErrorView.cjs");
|
|
7
|
+
const connectionResolveView = require("./connectionResolveView.cjs");
|
|
8
|
+
const connectionTestView = require("./connectionTestView.cjs");
|
|
9
|
+
const UiWarningCircle = require("../icons/components/UiWarningCircle.cjs");
|
|
10
|
+
const UiCheck = require("../icons/components/UiCheck.cjs");
|
|
11
|
+
function ConnectionActionStatus({ outcome }) {
|
|
12
|
+
const failed = "error" in outcome || outcome.action === "test" && !outcome.result.ok;
|
|
13
|
+
const label = failed ? "Failed" : outcome.action === "test" ? "Reachable" : "Resolved";
|
|
14
|
+
const detail = "error" in outcome ? /* @__PURE__ */ jsxRuntime.jsx(connectionErrorView.ConnectionErrorView, { message: outcome.error }) : outcome.action === "test" ? /* @__PURE__ */ jsxRuntime.jsx(connectionTestView.ConnectionTestView, { result: outcome.result }) : /* @__PURE__ */ jsxRuntime.jsx(connectionResolveView.ConnectionResolveView, { resolved: outcome.resolved });
|
|
15
|
+
const trigger = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16
|
+
"button",
|
|
17
|
+
{
|
|
18
|
+
type: "button",
|
|
19
|
+
className: failed ? "inline-flex items-center gap-1.5 text-sm font-medium text-destructive" : "inline-flex items-center gap-1.5 text-sm font-medium text-emerald-600",
|
|
20
|
+
"aria-label": `${label} in ${connectionActionTypes.formatDuration(outcome.elapsedMs)}; show details`,
|
|
21
|
+
children: [
|
|
22
|
+
failed ? /* @__PURE__ */ jsxRuntime.jsx(UiWarningCircle.UiWarningCircleFilled, { size: 16, className: "text-destructive" }) : /* @__PURE__ */ jsxRuntime.jsx(UiCheck.UiCheckFilled, { size: 16, className: "text-emerald-600" }),
|
|
23
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
|
|
24
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-normal text-muted-foreground", children: [
|
|
25
|
+
"· ",
|
|
26
|
+
connectionActionTypes.formatDuration(outcome.elapsedMs)
|
|
27
|
+
] })
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
32
|
+
HoverCard.HoverCard,
|
|
33
|
+
{
|
|
34
|
+
trigger,
|
|
35
|
+
placement: "top",
|
|
36
|
+
delay: 120,
|
|
37
|
+
cardClassName: "w-96 whitespace-normal p-3 text-sm",
|
|
38
|
+
children: detail
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
exports.ConnectionActionStatus = ConnectionActionStatus;
|
|
43
|
+
//# sourceMappingURL=connectionActionStatus.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActionStatus.cjs","sources":["../../src/connections/connectionActionStatus.tsx"],"sourcesContent":["import { UiCheckFilled, UiWarningCircleFilled } from \"../icons\";\nimport { HoverCard } from \"../overlay/HoverCard\";\nimport { formatDuration, type ActionOutcome } from \"./connectionActionTypes\";\nimport { ConnectionErrorView } from \"./connectionErrorView\";\nimport { ConnectionResolveView } from \"./connectionResolveView\";\nimport { ConnectionTestView } from \"./connectionTestView\";\n\nexport function ConnectionActionStatus({ outcome }: { outcome: ActionOutcome }) {\n const failed = \"error\" in outcome || (outcome.action === \"test\" && !outcome.result.ok);\n const label = failed ? \"Failed\" : outcome.action === \"test\" ? \"Reachable\" : \"Resolved\";\n const detail =\n \"error\" in outcome ? (\n <ConnectionErrorView message={outcome.error} />\n ) : outcome.action === \"test\" ? (\n <ConnectionTestView result={outcome.result} />\n ) : (\n <ConnectionResolveView resolved={outcome.resolved} />\n );\n const trigger = (\n <button\n type=\"button\"\n className={\n failed\n ? \"inline-flex items-center gap-1.5 text-sm font-medium text-destructive\"\n : \"inline-flex items-center gap-1.5 text-sm font-medium text-emerald-600\"\n }\n aria-label={`${label} in ${formatDuration(outcome.elapsedMs)}; show details`}\n >\n {failed ? (\n <UiWarningCircleFilled size={16} className=\"text-destructive\" />\n ) : (\n <UiCheckFilled size={16} className=\"text-emerald-600\" />\n )}\n <span>{label}</span>\n <span className=\"font-normal text-muted-foreground\">· {formatDuration(outcome.elapsedMs)}</span>\n </button>\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"top\"\n delay={120}\n cardClassName=\"w-96 whitespace-normal p-3 text-sm\"\n >\n {detail}\n </HoverCard>\n );\n}\n"],"names":["jsx","ConnectionErrorView","ConnectionTestView","ConnectionResolveView","jsxs","formatDuration","UiWarningCircleFilled","UiCheckFilled","HoverCard"],"mappings":";;;;;;;;;;AAOO,SAAS,uBAAuB,EAAE,WAAuC;AAC9E,QAAM,SAAS,WAAW,WAAY,QAAQ,WAAW,UAAU,CAAC,QAAQ,OAAO;AACnF,QAAM,QAAQ,SAAS,WAAW,QAAQ,WAAW,SAAS,cAAc;AAC5E,QAAM,SACJ,WAAW,UACTA,2BAAAA,IAACC,oBAAAA,uBAAoB,SAAS,QAAQ,MAAA,CAAO,IAC3C,QAAQ,WAAW,SACrBD,2BAAAA,IAACE,uCAAA,EAAmB,QAAQ,QAAQ,OAAA,CAAQ,IAE5CF,2BAAAA,IAACG,sBAAAA,uBAAA,EAAsB,UAAU,QAAQ,SAAA,CAAU;AAEvD,QAAM,UACJC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WACE,SACI,0EACA;AAAA,MAEN,cAAY,GAAG,KAAK,OAAOC,sBAAAA,eAAe,QAAQ,SAAS,CAAC;AAAA,MAE3D,UAAA;AAAA,QAAA,SACCL,2BAAAA,IAACM,gBAAAA,uBAAA,EAAsB,MAAM,IAAI,WAAU,mBAAA,CAAmB,IAE9DN,2BAAAA,IAACO,QAAAA,eAAA,EAAc,MAAM,IAAI,WAAU,oBAAmB;AAAA,QAExDP,2BAAAA,IAAC,UAAM,UAAA,MAAA,CAAM;AAAA,QACbI,2BAAAA,KAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA;AAAA,UAAA;AAAA,UAAGC,sBAAAA,eAAe,QAAQ,SAAS;AAAA,QAAA,EAAA,CAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAI7F,SACEL,2BAAAA;AAAAA,IAACQ,UAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,OAAO;AAAA,MACP,eAAc;AAAA,MAEb,UAAA;AAAA,IAAA;AAAA,EAAA;AAGP;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActionStatus.d.ts","sourceRoot":"","sources":["../../src/connections/connectionActionStatus.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7E,wBAAgB,sBAAsB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,+BAyC7E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { HoverCard } from "../overlay/HoverCard.js";
|
|
3
|
+
import { formatDuration } from "./connectionActionTypes.js";
|
|
4
|
+
import { ConnectionErrorView } from "./connectionErrorView.js";
|
|
5
|
+
import { ConnectionResolveView } from "./connectionResolveView.js";
|
|
6
|
+
import { ConnectionTestView } from "./connectionTestView.js";
|
|
7
|
+
import { UiWarningCircleFilled } from "../icons/components/UiWarningCircle.js";
|
|
8
|
+
import { UiCheckFilled } from "../icons/components/UiCheck.js";
|
|
9
|
+
function ConnectionActionStatus({ outcome }) {
|
|
10
|
+
const failed = "error" in outcome || outcome.action === "test" && !outcome.result.ok;
|
|
11
|
+
const label = failed ? "Failed" : outcome.action === "test" ? "Reachable" : "Resolved";
|
|
12
|
+
const detail = "error" in outcome ? /* @__PURE__ */ jsx(ConnectionErrorView, { message: outcome.error }) : outcome.action === "test" ? /* @__PURE__ */ jsx(ConnectionTestView, { result: outcome.result }) : /* @__PURE__ */ jsx(ConnectionResolveView, { resolved: outcome.resolved });
|
|
13
|
+
const trigger = /* @__PURE__ */ jsxs(
|
|
14
|
+
"button",
|
|
15
|
+
{
|
|
16
|
+
type: "button",
|
|
17
|
+
className: failed ? "inline-flex items-center gap-1.5 text-sm font-medium text-destructive" : "inline-flex items-center gap-1.5 text-sm font-medium text-emerald-600",
|
|
18
|
+
"aria-label": `${label} in ${formatDuration(outcome.elapsedMs)}; show details`,
|
|
19
|
+
children: [
|
|
20
|
+
failed ? /* @__PURE__ */ jsx(UiWarningCircleFilled, { size: 16, className: "text-destructive" }) : /* @__PURE__ */ jsx(UiCheckFilled, { size: 16, className: "text-emerald-600" }),
|
|
21
|
+
/* @__PURE__ */ jsx("span", { children: label }),
|
|
22
|
+
/* @__PURE__ */ jsxs("span", { className: "font-normal text-muted-foreground", children: [
|
|
23
|
+
"· ",
|
|
24
|
+
formatDuration(outcome.elapsedMs)
|
|
25
|
+
] })
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
);
|
|
29
|
+
return /* @__PURE__ */ jsx(
|
|
30
|
+
HoverCard,
|
|
31
|
+
{
|
|
32
|
+
trigger,
|
|
33
|
+
placement: "top",
|
|
34
|
+
delay: 120,
|
|
35
|
+
cardClassName: "w-96 whitespace-normal p-3 text-sm",
|
|
36
|
+
children: detail
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
ConnectionActionStatus
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=connectionActionStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connectionActionStatus.js","sources":["../../src/connections/connectionActionStatus.tsx"],"sourcesContent":["import { UiCheckFilled, UiWarningCircleFilled } from \"../icons\";\nimport { HoverCard } from \"../overlay/HoverCard\";\nimport { formatDuration, type ActionOutcome } from \"./connectionActionTypes\";\nimport { ConnectionErrorView } from \"./connectionErrorView\";\nimport { ConnectionResolveView } from \"./connectionResolveView\";\nimport { ConnectionTestView } from \"./connectionTestView\";\n\nexport function ConnectionActionStatus({ outcome }: { outcome: ActionOutcome }) {\n const failed = \"error\" in outcome || (outcome.action === \"test\" && !outcome.result.ok);\n const label = failed ? \"Failed\" : outcome.action === \"test\" ? \"Reachable\" : \"Resolved\";\n const detail =\n \"error\" in outcome ? (\n <ConnectionErrorView message={outcome.error} />\n ) : outcome.action === \"test\" ? (\n <ConnectionTestView result={outcome.result} />\n ) : (\n <ConnectionResolveView resolved={outcome.resolved} />\n );\n const trigger = (\n <button\n type=\"button\"\n className={\n failed\n ? \"inline-flex items-center gap-1.5 text-sm font-medium text-destructive\"\n : \"inline-flex items-center gap-1.5 text-sm font-medium text-emerald-600\"\n }\n aria-label={`${label} in ${formatDuration(outcome.elapsedMs)}; show details`}\n >\n {failed ? (\n <UiWarningCircleFilled size={16} className=\"text-destructive\" />\n ) : (\n <UiCheckFilled size={16} className=\"text-emerald-600\" />\n )}\n <span>{label}</span>\n <span className=\"font-normal text-muted-foreground\">· {formatDuration(outcome.elapsedMs)}</span>\n </button>\n );\n\n return (\n <HoverCard\n trigger={trigger}\n placement=\"top\"\n delay={120}\n cardClassName=\"w-96 whitespace-normal p-3 text-sm\"\n >\n {detail}\n </HoverCard>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAOO,SAAS,uBAAuB,EAAE,WAAuC;AAC9E,QAAM,SAAS,WAAW,WAAY,QAAQ,WAAW,UAAU,CAAC,QAAQ,OAAO;AACnF,QAAM,QAAQ,SAAS,WAAW,QAAQ,WAAW,SAAS,cAAc;AAC5E,QAAM,SACJ,WAAW,UACT,oBAAC,uBAAoB,SAAS,QAAQ,MAAA,CAAO,IAC3C,QAAQ,WAAW,SACrB,oBAAC,oBAAA,EAAmB,QAAQ,QAAQ,OAAA,CAAQ,IAE5C,oBAAC,uBAAA,EAAsB,UAAU,QAAQ,SAAA,CAAU;AAEvD,QAAM,UACJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WACE,SACI,0EACA;AAAA,MAEN,cAAY,GAAG,KAAK,OAAO,eAAe,QAAQ,SAAS,CAAC;AAAA,MAE3D,UAAA;AAAA,QAAA,SACC,oBAAC,uBAAA,EAAsB,MAAM,IAAI,WAAU,mBAAA,CAAmB,IAE9D,oBAAC,eAAA,EAAc,MAAM,IAAI,WAAU,oBAAmB;AAAA,QAExD,oBAAC,UAAM,UAAA,MAAA,CAAM;AAAA,QACb,qBAAC,QAAA,EAAK,WAAU,qCAAoC,UAAA;AAAA,UAAA;AAAA,UAAG,eAAe,QAAQ,SAAS;AAAA,QAAA,EAAA,CAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAI7F,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,OAAO;AAAA,MACP,eAAc;AAAA,MAEb,UAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|