@flanksource/clicky-ui 0.3.48 → 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.
Files changed (444) hide show
  1. package/dist/connections/ConnectionsPage.cjs +219 -0
  2. package/dist/connections/ConnectionsPage.cjs.map +1 -0
  3. package/dist/connections/ConnectionsPage.d.ts +23 -0
  4. package/dist/connections/ConnectionsPage.d.ts.map +1 -0
  5. package/dist/connections/ConnectionsPage.js +219 -0
  6. package/dist/connections/ConnectionsPage.js.map +1 -0
  7. package/dist/connections/connectionActionStatus.cjs +43 -0
  8. package/dist/connections/connectionActionStatus.cjs.map +1 -0
  9. package/dist/connections/connectionActionStatus.d.ts +5 -0
  10. package/dist/connections/connectionActionStatus.d.ts.map +1 -0
  11. package/dist/connections/connectionActionStatus.js +43 -0
  12. package/dist/connections/connectionActionStatus.js.map +1 -0
  13. package/dist/connections/connectionActionTypes.cjs +24 -0
  14. package/dist/connections/connectionActionTypes.cjs.map +1 -0
  15. package/dist/connections/connectionActionTypes.d.ts +36 -0
  16. package/dist/connections/connectionActionTypes.d.ts.map +1 -0
  17. package/dist/connections/connectionActionTypes.js +24 -0
  18. package/dist/connections/connectionActionTypes.js.map +1 -0
  19. package/dist/connections/connectionActions.cjs +11 -0
  20. package/dist/connections/connectionActions.cjs.map +1 -0
  21. package/dist/connections/connectionActions.d.ts +15 -0
  22. package/dist/connections/connectionActions.d.ts.map +1 -0
  23. package/dist/connections/connectionActions.js +11 -0
  24. package/dist/connections/connectionActions.js.map +1 -0
  25. package/dist/connections/connectionDashboard.cjs +185 -0
  26. package/dist/connections/connectionDashboard.cjs.map +1 -0
  27. package/dist/connections/connectionDashboard.d.ts +25 -0
  28. package/dist/connections/connectionDashboard.d.ts.map +1 -0
  29. package/dist/connections/connectionDashboard.js +185 -0
  30. package/dist/connections/connectionDashboard.js.map +1 -0
  31. package/dist/connections/connectionDashboardModel.cjs +43 -0
  32. package/dist/connections/connectionDashboardModel.cjs.map +1 -0
  33. package/dist/connections/connectionDashboardModel.d.ts +75 -0
  34. package/dist/connections/connectionDashboardModel.d.ts.map +1 -0
  35. package/dist/connections/connectionDashboardModel.js +43 -0
  36. package/dist/connections/connectionDashboardModel.js.map +1 -0
  37. package/dist/connections/connectionDashboardRenderer.cjs +21 -0
  38. package/dist/connections/connectionDashboardRenderer.cjs.map +1 -0
  39. package/dist/connections/connectionDashboardRenderer.d.ts +15 -0
  40. package/dist/connections/connectionDashboardRenderer.d.ts.map +1 -0
  41. package/dist/connections/connectionDashboardRenderer.js +21 -0
  42. package/dist/connections/connectionDashboardRenderer.js.map +1 -0
  43. package/dist/connections/connectionDashboardRow.cjs +169 -0
  44. package/dist/connections/connectionDashboardRow.cjs.map +1 -0
  45. package/dist/connections/connectionDashboardRow.d.ts +12 -0
  46. package/dist/connections/connectionDashboardRow.d.ts.map +1 -0
  47. package/dist/connections/connectionDashboardRow.js +169 -0
  48. package/dist/connections/connectionDashboardRow.js.map +1 -0
  49. package/dist/connections/connectionErrorView.cjs +8 -0
  50. package/dist/connections/connectionErrorView.cjs.map +1 -0
  51. package/dist/connections/connectionErrorView.d.ts +4 -0
  52. package/dist/connections/connectionErrorView.d.ts.map +1 -0
  53. package/dist/connections/connectionErrorView.js +8 -0
  54. package/dist/connections/connectionErrorView.js.map +1 -0
  55. package/dist/connections/connectionHealth.cjs +82 -0
  56. package/dist/connections/connectionHealth.cjs.map +1 -0
  57. package/dist/connections/connectionHealth.d.ts +33 -0
  58. package/dist/connections/connectionHealth.d.ts.map +1 -0
  59. package/dist/connections/connectionHealth.js +82 -0
  60. package/dist/connections/connectionHealth.js.map +1 -0
  61. package/dist/connections/connectionLogging.cjs +29 -0
  62. package/dist/connections/connectionLogging.cjs.map +1 -0
  63. package/dist/connections/connectionLogging.d.ts +11 -0
  64. package/dist/connections/connectionLogging.d.ts.map +1 -0
  65. package/dist/connections/connectionLogging.js +29 -0
  66. package/dist/connections/connectionLogging.js.map +1 -0
  67. package/dist/connections/connectionLoggingField.cjs +37 -0
  68. package/dist/connections/connectionLoggingField.cjs.map +1 -0
  69. package/dist/connections/connectionLoggingField.d.ts +12 -0
  70. package/dist/connections/connectionLoggingField.d.ts.map +1 -0
  71. package/dist/connections/connectionLoggingField.js +37 -0
  72. package/dist/connections/connectionLoggingField.js.map +1 -0
  73. package/dist/connections/connectionLoggingModel.cjs +16 -0
  74. package/dist/connections/connectionLoggingModel.cjs.map +1 -0
  75. package/dist/connections/connectionLoggingModel.d.ts +6 -0
  76. package/dist/connections/connectionLoggingModel.d.ts.map +1 -0
  77. package/dist/connections/connectionLoggingModel.js +16 -0
  78. package/dist/connections/connectionLoggingModel.js.map +1 -0
  79. package/dist/connections/connectionResolveView.cjs +24 -0
  80. package/dist/connections/connectionResolveView.cjs.map +1 -0
  81. package/dist/connections/connectionResolveView.d.ts +5 -0
  82. package/dist/connections/connectionResolveView.d.ts.map +1 -0
  83. package/dist/connections/connectionResolveView.js +24 -0
  84. package/dist/connections/connectionResolveView.js.map +1 -0
  85. package/dist/connections/connectionTestButton.cjs +58 -0
  86. package/dist/connections/connectionTestButton.cjs.map +1 -0
  87. package/dist/connections/connectionTestButton.d.ts +6 -0
  88. package/dist/connections/connectionTestButton.d.ts.map +1 -0
  89. package/dist/connections/connectionTestButton.js +58 -0
  90. package/dist/connections/connectionTestButton.js.map +1 -0
  91. package/dist/connections/connectionTestView.cjs +12 -0
  92. package/dist/connections/connectionTestView.cjs.map +1 -0
  93. package/dist/connections/connectionTestView.d.ts +5 -0
  94. package/dist/connections/connectionTestView.d.ts.map +1 -0
  95. package/dist/connections/connectionTestView.js +12 -0
  96. package/dist/connections/connectionTestView.js.map +1 -0
  97. package/dist/connections/connectionsPageModel.cjs +33 -0
  98. package/dist/connections/connectionsPageModel.cjs.map +1 -0
  99. package/dist/connections/connectionsPageModel.d.ts +24 -0
  100. package/dist/connections/connectionsPageModel.d.ts.map +1 -0
  101. package/dist/connections/connectionsPageModel.js +33 -0
  102. package/dist/connections/connectionsPageModel.js.map +1 -0
  103. package/dist/connections/iconProvider.cjs +20 -0
  104. package/dist/connections/iconProvider.cjs.map +1 -0
  105. package/dist/connections/iconProvider.d.ts +7 -0
  106. package/dist/connections/iconProvider.d.ts.map +1 -0
  107. package/dist/connections/iconProvider.js +20 -0
  108. package/dist/connections/iconProvider.js.map +1 -0
  109. package/dist/connections.cjs +45 -0
  110. package/dist/connections.cjs.map +1 -0
  111. package/dist/connections.d.ts +34 -0
  112. package/dist/connections.d.ts.map +1 -0
  113. package/dist/connections.js +45 -0
  114. package/dist/connections.js.map +1 -0
  115. package/dist/data/DataTable.cjs +18 -8
  116. package/dist/data/DataTable.cjs.map +1 -1
  117. package/dist/data/DataTable.d.ts +4 -0
  118. package/dist/data/DataTable.d.ts.map +1 -1
  119. package/dist/data/DataTable.js +18 -8
  120. package/dist/data/DataTable.js.map +1 -1
  121. package/dist/data/TaskManager.cjs +183 -159
  122. package/dist/data/TaskManager.cjs.map +1 -1
  123. package/dist/data/TaskManager.d.ts +3 -1
  124. package/dist/data/TaskManager.d.ts.map +1 -1
  125. package/dist/data/TaskManager.js +185 -161
  126. package/dist/data/TaskManager.js.map +1 -1
  127. package/dist/data/TaskManagerButton.cjs +1 -0
  128. package/dist/data/TaskManagerButton.cjs.map +1 -1
  129. package/dist/data/TaskManagerButton.js +1 -0
  130. package/dist/data/TaskManagerButton.js.map +1 -1
  131. package/dist/data/TaskProgress.cjs +13 -7
  132. package/dist/data/TaskProgress.cjs.map +1 -1
  133. package/dist/data/TaskProgress.d.ts +3 -1
  134. package/dist/data/TaskProgress.d.ts.map +1 -1
  135. package/dist/data/TaskProgress.js +13 -7
  136. package/dist/data/TaskProgress.js.map +1 -1
  137. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +52 -295
  138. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  139. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  140. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +47 -290
  141. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  142. package/dist/data/diagnostics/MetricTile.cjs +44 -0
  143. package/dist/data/diagnostics/MetricTile.cjs.map +1 -0
  144. package/dist/data/diagnostics/MetricTile.d.ts +13 -0
  145. package/dist/data/diagnostics/MetricTile.d.ts.map +1 -0
  146. package/dist/data/diagnostics/MetricTile.js +44 -0
  147. package/dist/data/diagnostics/MetricTile.js.map +1 -0
  148. package/dist/data/diagnostics/StackDumpView.cjs +227 -0
  149. package/dist/data/diagnostics/StackDumpView.cjs.map +1 -0
  150. package/dist/data/diagnostics/StackDumpView.d.ts +53 -0
  151. package/dist/data/diagnostics/StackDumpView.d.ts.map +1 -0
  152. package/dist/data/diagnostics/StackDumpView.js +227 -0
  153. package/dist/data/diagnostics/StackDumpView.js.map +1 -0
  154. package/dist/data/diagnostics/fixtures.d.ts +1 -0
  155. package/dist/data/diagnostics/fixtures.d.ts.map +1 -1
  156. package/dist/data/diagnostics/metric-tone.cjs +18 -0
  157. package/dist/data/diagnostics/metric-tone.cjs.map +1 -0
  158. package/dist/data/diagnostics/metric-tone.d.ts +6 -0
  159. package/dist/data/diagnostics/metric-tone.d.ts.map +1 -0
  160. package/dist/data/diagnostics/metric-tone.js +18 -0
  161. package/dist/data/diagnostics/metric-tone.js.map +1 -0
  162. package/dist/data/diagnostics/stacktrace.cjs +44 -0
  163. package/dist/data/diagnostics/stacktrace.cjs.map +1 -1
  164. package/dist/data/diagnostics/stacktrace.d.ts +7 -0
  165. package/dist/data/diagnostics/stacktrace.d.ts.map +1 -1
  166. package/dist/data/diagnostics/stacktrace.js +44 -0
  167. package/dist/data/diagnostics/stacktrace.js.map +1 -1
  168. package/dist/data/diagnostics/types.d.ts +2 -8
  169. package/dist/data/diagnostics/types.d.ts.map +1 -1
  170. package/dist/data/lint/LintDetail.cjs +339 -0
  171. package/dist/data/lint/LintDetail.cjs.map +1 -0
  172. package/dist/data/lint/LintDetail.d.ts +17 -0
  173. package/dist/data/lint/LintDetail.d.ts.map +1 -0
  174. package/dist/data/lint/LintDetail.js +339 -0
  175. package/dist/data/lint/LintDetail.js.map +1 -0
  176. package/dist/data/lint/LintFilterBar.cjs +103 -0
  177. package/dist/data/lint/LintFilterBar.cjs.map +1 -0
  178. package/dist/data/lint/LintFilterBar.d.ts +16 -0
  179. package/dist/data/lint/LintFilterBar.d.ts.map +1 -0
  180. package/dist/data/lint/LintFilterBar.js +103 -0
  181. package/dist/data/lint/LintFilterBar.js.map +1 -0
  182. package/dist/data/lint/LintResults.cjs +144 -0
  183. package/dist/data/lint/LintResults.cjs.map +1 -0
  184. package/dist/data/lint/LintResults.d.ts +39 -0
  185. package/dist/data/lint/LintResults.d.ts.map +1 -0
  186. package/dist/data/lint/LintResults.fixtures.d.ts +10 -0
  187. package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -0
  188. package/dist/data/lint/LintResults.js +144 -0
  189. package/dist/data/lint/LintResults.js.map +1 -0
  190. package/dist/data/lint/LintTreeNode.cjs +66 -0
  191. package/dist/data/lint/LintTreeNode.cjs.map +1 -0
  192. package/dist/data/lint/LintTreeNode.d.ts +7 -0
  193. package/dist/data/lint/LintTreeNode.d.ts.map +1 -0
  194. package/dist/data/lint/LintTreeNode.js +66 -0
  195. package/dist/data/lint/LintTreeNode.js.map +1 -0
  196. package/dist/data/lint/actions.cjs +195 -0
  197. package/dist/data/lint/actions.cjs.map +1 -0
  198. package/dist/data/lint/actions.d.ts +29 -0
  199. package/dist/data/lint/actions.d.ts.map +1 -0
  200. package/dist/data/lint/actions.js +195 -0
  201. package/dist/data/lint/actions.js.map +1 -0
  202. package/dist/data/lint/grouping-options.cjs +14 -0
  203. package/dist/data/lint/grouping-options.cjs.map +1 -0
  204. package/dist/data/lint/grouping-options.d.ts +9 -0
  205. package/dist/data/lint/grouping-options.d.ts.map +1 -0
  206. package/dist/data/lint/grouping-options.js +14 -0
  207. package/dist/data/lint/grouping-options.js.map +1 -0
  208. package/dist/data/lint/grouping.cjs +450 -0
  209. package/dist/data/lint/grouping.cjs.map +1 -0
  210. package/dist/data/lint/grouping.d.ts +10 -0
  211. package/dist/data/lint/grouping.d.ts.map +1 -0
  212. package/dist/data/lint/grouping.js +450 -0
  213. package/dist/data/lint/grouping.js.map +1 -0
  214. package/dist/data/lint/index.d.ts +10 -0
  215. package/dist/data/lint/index.d.ts.map +1 -0
  216. package/dist/data/lint/paths.cjs +35 -0
  217. package/dist/data/lint/paths.cjs.map +1 -0
  218. package/dist/data/lint/paths.d.ts +13 -0
  219. package/dist/data/lint/paths.d.ts.map +1 -0
  220. package/dist/data/lint/paths.js +35 -0
  221. package/dist/data/lint/paths.js.map +1 -0
  222. package/dist/data/lint/stats.cjs +76 -0
  223. package/dist/data/lint/stats.cjs.map +1 -0
  224. package/dist/data/lint/stats.d.ts +19 -0
  225. package/dist/data/lint/stats.d.ts.map +1 -0
  226. package/dist/data/lint/stats.js +76 -0
  227. package/dist/data/lint/stats.js.map +1 -0
  228. package/dist/data/lint/types.cjs +16 -0
  229. package/dist/data/lint/types.cjs.map +1 -0
  230. package/dist/data/lint/types.d.ts +93 -0
  231. package/dist/data/lint/types.d.ts.map +1 -0
  232. package/dist/data/lint/types.js +16 -0
  233. package/dist/data/lint/types.js.map +1 -0
  234. package/dist/data/test-runner/TestAttemptDetail.cjs +113 -0
  235. package/dist/data/test-runner/TestAttemptDetail.cjs.map +1 -0
  236. package/dist/data/test-runner/TestAttemptDetail.d.ts +19 -0
  237. package/dist/data/test-runner/TestAttemptDetail.d.ts.map +1 -0
  238. package/dist/data/test-runner/TestAttemptDetail.js +113 -0
  239. package/dist/data/test-runner/TestAttemptDetail.js.map +1 -0
  240. package/dist/data/test-runner/TestAttempts.cjs +36 -0
  241. package/dist/data/test-runner/TestAttempts.cjs.map +1 -0
  242. package/dist/data/test-runner/TestAttempts.d.ts +5 -0
  243. package/dist/data/test-runner/TestAttempts.d.ts.map +1 -0
  244. package/dist/data/test-runner/TestAttempts.js +36 -0
  245. package/dist/data/test-runner/TestAttempts.js.map +1 -0
  246. package/dist/data/test-runner/TestDetailPanel.cjs +13 -3
  247. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  248. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  249. package/dist/data/test-runner/TestDetailPanel.js +14 -4
  250. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  251. package/dist/data/test-runner/TestFailureDetail.cjs +9 -29
  252. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  253. package/dist/data/test-runner/TestFailureDetail.d.ts +6 -6
  254. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  255. package/dist/data/test-runner/TestFailureDetail.js +9 -29
  256. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  257. package/dist/data/test-runner/TestRunSummary.cjs +33 -0
  258. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  259. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  260. package/dist/data/test-runner/TestRunSummary.js +34 -1
  261. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  262. package/dist/data/test-runner/TestRunner.cjs +3 -0
  263. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  264. package/dist/data/test-runner/TestRunner.d.ts +8 -1
  265. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  266. package/dist/data/test-runner/TestRunner.js +3 -0
  267. package/dist/data/test-runner/TestRunner.js.map +1 -1
  268. package/dist/data/test-runner/TestTreeNode.cjs +3 -1
  269. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  270. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  271. package/dist/data/test-runner/TestTreeNode.js +3 -1
  272. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  273. package/dist/data/test-runner/adapter.cjs +9 -1
  274. package/dist/data/test-runner/adapter.cjs.map +1 -1
  275. package/dist/data/test-runner/adapter.d.ts +5 -0
  276. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  277. package/dist/data/test-runner/adapter.js +9 -1
  278. package/dist/data/test-runner/adapter.js.map +1 -1
  279. package/dist/data/test-runner/attempts.cjs +62 -0
  280. package/dist/data/test-runner/attempts.cjs.map +1 -0
  281. package/dist/data/test-runner/attempts.d.ts +13 -0
  282. package/dist/data/test-runner/attempts.d.ts.map +1 -0
  283. package/dist/data/test-runner/attempts.js +62 -0
  284. package/dist/data/test-runner/attempts.js.map +1 -0
  285. package/dist/data/test-runner/context.cjs.map +1 -1
  286. package/dist/data/test-runner/context.d.ts +6 -0
  287. package/dist/data/test-runner/context.d.ts.map +1 -1
  288. package/dist/data/test-runner/context.js.map +1 -1
  289. package/dist/data/test-runner/index.d.ts +5 -1
  290. package/dist/data/test-runner/index.d.ts.map +1 -1
  291. package/dist/data/test-runner/marks.cjs +2 -0
  292. package/dist/data/test-runner/marks.cjs.map +1 -1
  293. package/dist/data/test-runner/marks.d.ts.map +1 -1
  294. package/dist/data/test-runner/marks.js +2 -0
  295. package/dist/data/test-runner/marks.js.map +1 -1
  296. package/dist/data/test-runner/process-metrics.cjs +15 -0
  297. package/dist/data/test-runner/process-metrics.cjs.map +1 -0
  298. package/dist/data/test-runner/process-metrics.d.ts +22 -0
  299. package/dist/data/test-runner/process-metrics.d.ts.map +1 -0
  300. package/dist/data/test-runner/process-metrics.js +15 -0
  301. package/dist/data/test-runner/process-metrics.js.map +1 -0
  302. package/dist/data/test-runner/status.cjs +11 -3
  303. package/dist/data/test-runner/status.cjs.map +1 -1
  304. package/dist/data/test-runner/status.d.ts +3 -1
  305. package/dist/data/test-runner/status.d.ts.map +1 -1
  306. package/dist/data/test-runner/status.js +11 -3
  307. package/dist/data/test-runner/status.js.map +1 -1
  308. package/dist/data/test-runner/types.d.ts +14 -0
  309. package/dist/data/test-runner/types.d.ts.map +1 -1
  310. package/dist/data/traces/GoProfileView.cjs +176 -0
  311. package/dist/data/traces/GoProfileView.cjs.map +1 -0
  312. package/dist/data/traces/GoProfileView.d.ts +30 -0
  313. package/dist/data/traces/GoProfileView.d.ts.map +1 -0
  314. package/dist/data/traces/GoProfileView.js +176 -0
  315. package/dist/data/traces/GoProfileView.js.map +1 -0
  316. package/dist/data/traces/ProcessFacetTable.cjs +79 -0
  317. package/dist/data/traces/ProcessFacetTable.cjs.map +1 -0
  318. package/dist/data/traces/ProcessFacetTable.d.ts +21 -0
  319. package/dist/data/traces/ProcessFacetTable.d.ts.map +1 -0
  320. package/dist/data/traces/ProcessFacetTable.js +79 -0
  321. package/dist/data/traces/ProcessFacetTable.js.map +1 -0
  322. package/dist/data/traces/ProcessRecordViews.cjs +41 -0
  323. package/dist/data/traces/ProcessRecordViews.cjs.map +1 -0
  324. package/dist/data/traces/ProcessRecordViews.d.ts +16 -0
  325. package/dist/data/traces/ProcessRecordViews.d.ts.map +1 -0
  326. package/dist/data/traces/ProcessRecordViews.js +41 -0
  327. package/dist/data/traces/ProcessRecordViews.js.map +1 -0
  328. package/dist/data/traces/ProcessTraceDetail.cjs +316 -0
  329. package/dist/data/traces/ProcessTraceDetail.cjs.map +1 -0
  330. package/dist/data/traces/ProcessTraceDetail.d.ts +39 -0
  331. package/dist/data/traces/ProcessTraceDetail.d.ts.map +1 -0
  332. package/dist/data/traces/ProcessTraceDetail.js +316 -0
  333. package/dist/data/traces/ProcessTraceDetail.js.map +1 -0
  334. package/dist/data/traces/ProcessTraceTree.cjs +135 -0
  335. package/dist/data/traces/ProcessTraceTree.cjs.map +1 -0
  336. package/dist/data/traces/ProcessTraceTree.d.ts +41 -0
  337. package/dist/data/traces/ProcessTraceTree.d.ts.map +1 -0
  338. package/dist/data/traces/ProcessTraceTree.js +135 -0
  339. package/dist/data/traces/ProcessTraceTree.js.map +1 -0
  340. package/dist/data/traces/Sparkline.cjs +45 -0
  341. package/dist/data/traces/Sparkline.cjs.map +1 -0
  342. package/dist/data/traces/Sparkline.d.ts +29 -0
  343. package/dist/data/traces/Sparkline.d.ts.map +1 -0
  344. package/dist/data/traces/Sparkline.js +45 -0
  345. package/dist/data/traces/Sparkline.js.map +1 -0
  346. package/dist/data/traces/SqlTraceTable.cjs +104 -0
  347. package/dist/data/traces/SqlTraceTable.cjs.map +1 -0
  348. package/dist/data/traces/SqlTraceTable.d.ts +19 -0
  349. package/dist/data/traces/SqlTraceTable.d.ts.map +1 -0
  350. package/dist/data/traces/SqlTraceTable.js +104 -0
  351. package/dist/data/traces/SqlTraceTable.js.map +1 -0
  352. package/dist/data/traces/TerminalCastPlayer.cjs +162 -0
  353. package/dist/data/traces/TerminalCastPlayer.cjs.map +1 -0
  354. package/dist/data/traces/TerminalCastPlayer.js +162 -0
  355. package/dist/data/traces/TerminalCastPlayer.js.map +1 -0
  356. package/dist/data/traces/TraceHarView.cjs +15 -0
  357. package/dist/data/traces/TraceHarView.cjs.map +1 -0
  358. package/dist/data/traces/TraceHarView.js +15 -0
  359. package/dist/data/traces/TraceHarView.js.map +1 -0
  360. package/dist/data/traces/TraceView.cjs +63 -0
  361. package/dist/data/traces/TraceView.cjs.map +1 -0
  362. package/dist/data/traces/TraceView.d.ts +20 -0
  363. package/dist/data/traces/TraceView.d.ts.map +1 -0
  364. package/dist/data/traces/TraceView.js +63 -0
  365. package/dist/data/traces/TraceView.js.map +1 -0
  366. package/dist/data/traces/TraceWindowList.cjs +117 -0
  367. package/dist/data/traces/TraceWindowList.cjs.map +1 -0
  368. package/dist/data/traces/TraceWindowList.d.ts +48 -0
  369. package/dist/data/traces/TraceWindowList.d.ts.map +1 -0
  370. package/dist/data/traces/TraceWindowList.js +117 -0
  371. package/dist/data/traces/TraceWindowList.js.map +1 -0
  372. package/dist/data/traces/cast.cjs +81 -0
  373. package/dist/data/traces/cast.cjs.map +1 -0
  374. package/dist/data/traces/cast.js +81 -0
  375. package/dist/data/traces/cast.js.map +1 -0
  376. package/dist/data/traces/fixtures.d.ts +25 -1
  377. package/dist/data/traces/fixtures.d.ts.map +1 -1
  378. package/dist/data/traces/har-adapter.cjs +83 -0
  379. package/dist/data/traces/har-adapter.cjs.map +1 -0
  380. package/dist/data/traces/har-adapter.js +83 -0
  381. package/dist/data/traces/har-adapter.js.map +1 -0
  382. package/dist/data/traces/index.d.ts +19 -0
  383. package/dist/data/traces/index.d.ts.map +1 -0
  384. package/dist/data/traces/process-facets.cjs +48 -0
  385. package/dist/data/traces/process-facets.cjs.map +1 -0
  386. package/dist/data/traces/process-facets.d.ts +38 -0
  387. package/dist/data/traces/process-facets.d.ts.map +1 -0
  388. package/dist/data/traces/process-facets.js +48 -0
  389. package/dist/data/traces/process-facets.js.map +1 -0
  390. package/dist/data/traces/process-tree.cjs +85 -0
  391. package/dist/data/traces/process-tree.cjs.map +1 -0
  392. package/dist/data/traces/process-tree.d.ts +40 -0
  393. package/dist/data/traces/process-tree.d.ts.map +1 -0
  394. package/dist/data/traces/process-tree.js +85 -0
  395. package/dist/data/traces/process-tree.js.map +1 -0
  396. package/dist/data/traces/profile-aggregate.cjs +78 -0
  397. package/dist/data/traces/profile-aggregate.cjs.map +1 -0
  398. package/dist/data/traces/profile-aggregate.d.ts +41 -0
  399. package/dist/data/traces/profile-aggregate.d.ts.map +1 -0
  400. package/dist/data/traces/profile-aggregate.js +78 -0
  401. package/dist/data/traces/profile-aggregate.js.map +1 -0
  402. package/dist/data/traces/sql-trace.cjs +39 -0
  403. package/dist/data/traces/sql-trace.cjs.map +1 -0
  404. package/dist/data/traces/sql-trace.d.ts +31 -0
  405. package/dist/data/traces/sql-trace.d.ts.map +1 -0
  406. package/dist/data/traces/sql-trace.js +39 -0
  407. package/dist/data/traces/sql-trace.js.map +1 -0
  408. package/dist/data/traces/stack-checkpoints.cjs +22 -0
  409. package/dist/data/traces/stack-checkpoints.cjs.map +1 -0
  410. package/dist/data/traces/stack-checkpoints.d.ts +18 -0
  411. package/dist/data/traces/stack-checkpoints.d.ts.map +1 -0
  412. package/dist/data/traces/stack-checkpoints.js +22 -0
  413. package/dist/data/traces/stack-checkpoints.js.map +1 -0
  414. package/dist/data/traces/terminal-screen.cjs +270 -0
  415. package/dist/data/traces/terminal-screen.cjs.map +1 -0
  416. package/dist/data/traces/terminal-screen.js +270 -0
  417. package/dist/data/traces/terminal-screen.js.map +1 -0
  418. package/dist/data/traces/terminal-timeline.cjs +48 -0
  419. package/dist/data/traces/terminal-timeline.cjs.map +1 -0
  420. package/dist/data/traces/terminal-timeline.js +48 -0
  421. package/dist/data/traces/terminal-timeline.js.map +1 -0
  422. package/dist/data/traces/types.d.ts +121 -8
  423. package/dist/data/traces/types.d.ts.map +1 -1
  424. package/dist/data/verification/adapters.cjs +1 -0
  425. package/dist/data/verification/adapters.cjs.map +1 -1
  426. package/dist/data/verification/adapters.d.ts.map +1 -1
  427. package/dist/data/verification/adapters.js +1 -0
  428. package/dist/data/verification/adapters.js.map +1 -1
  429. package/dist/data/version-info.cjs +3 -3
  430. package/dist/data/version-info.cjs.map +1 -1
  431. package/dist/data/version-info.js +3 -3
  432. package/dist/data/version-info.js.map +1 -1
  433. package/dist/data.cjs +105 -5
  434. package/dist/data.cjs.map +1 -1
  435. package/dist/data.d.ts +5 -0
  436. package/dist/data.d.ts.map +1 -1
  437. package/dist/data.js +101 -1
  438. package/dist/data.js.map +1 -1
  439. package/dist/index.cjs +107 -7
  440. package/dist/index.cjs.map +1 -1
  441. package/dist/index.js +101 -1
  442. package/dist/index.js.map +1 -1
  443. package/dist/styles.css +1 -1
  444. 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":";;;;;;;;;;;;;;;AAwBA,MAAM,8BAA8B;AACpC,MAAM,YACJ;AAuBK,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,KAAK;AAC9C,QAAM,cAAcC,WAAAA,eAAA;AACpB,QAAM,SAASC,cAAQ,MAAMC,oCAA0B,EAAE,SAAS,QAAA,CAAS,GAAG,CAAC,OAAO,CAAC;AACvF,QAAM,aAAaD,MAAAA,QAAQ,MAAME,qBAAAA,yBAAyB,cAAc,GAAG,CAAC,cAAc,CAAC;AAC3F,QAAM,uBAAuBC,MAAAA;AAAAA,IAC3B,CAAC,YAAY,SACXC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,eAAe,WAAW,EAAE;AAAA,QAClC,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK;AAAA,QACZ,SAAS,CAAC,UAAU;AAClB,cAAI,CAACC,qBAAAA,iBAAiB,KAAK,EAAG;AAC9B,gBAAM,eAAA;AACN,mBAAS,WAAW,EAAE;AAAA,QACxB;AAAA,QAEC,UAAA,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAGV,CAAC,gBAAgB,QAAQ;AAAA,EAAA;AAE3B,QAAM,UAAU,MACd,QAAQ,IAAI;AAAA,IACV,YAAY,kBAAkB,EAAE,UAAU,CAACC,yBAAAA,8BAA8B,GAAG;AAAA,IAC5E,YAAY,kBAAkB,EAAE,UAAU,CAAC,2BAA2B,GAAG;AAAA,EAAA,CAC1E;AACH,QAAM,aAAkC,CAAC,EAAE,OAAO,UAAA,MAChDF,+BAACG,qBAAAA,sBAAA,EAAqB,SAAkB,OAAc,UAAA,CAAsB;AAG9E,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAAJ,+BAAC,SAAI,WAAU,qCACb,UAAAA,2BAAAA,IAACK,OAAAA,QAAA,EAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAAK,SAAS,MAAM,YAAY,IAAI,GAAG,4BAEpF,GACF;AAAA,IACAL,2BAAAA,IAACM,oBAAAA,4BAAA,EAA2B,SAAkB,qBAAA,CAA4C;AAAA,IACzF,WACCN,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,QAAQO,qBAAAA;AAAAA,QACR,OAAM;AAAA,QACN,aAAY;AAAA,QACZ;AAAA,QACA,eAAe;AAAA,QACf,SAAS,MAAM,YAAY,KAAK;AAAA,QAChC,SAAS,MAAM;AACb,sBAAY,KAAK;AACjB,eAAK,QAAA;AAAA,QACP;AAAA,MAAA;AAAA,IAAA,IAEA,WACFP,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEC,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,MAAM,SAAS,MAAS;AAAA,QACjC,WAAW,MAAM;AACf,mBAAS,MAAS;AAClB,eAAK,QAAA;AAAA,QACP;AAAA,MAAA;AAAA,MAVK;AAAA,IAAA,IAYL;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,QAAM,EAAE,SAAS,OAAA,IAAWQ,sBAAA;AAC5B,QAAM,CAAC,UAAU,WAAW,IAAId,MAAAA,SAAS,KAAK;AAC9C,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAS,EAAE;AACjD,QAAM,SAASe,WAAAA,SAAS;AAAA,IACtB,UAAU,CAAC,6BAA6B,SAAS,EAAE;AAAA,IACnD,SAAS,YAAY;AACnB,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5BC,qBAAAA,uBAAuB;AAAA,QACvB;AAAA,QACA,EAAE,GAAA;AAAA,QACF,EAAE,QAAQ,mBAAA;AAAA,MAAmB;AAE/B,UAAI,CAACC,YAAAA,cAAc,SAAS,MAAM,GAAG;AACnC,cAAM,IAAI,MAAM,OAAO,OAAO,eAAe,EAAE,qCAAqC;AAAA,MACtF;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,OAAO;AAAA,EAAA,CACR;AAED,MAAI,CAAC,OAAO,MAAM;AAChB,WACEX,2BAAAA,IAACY,MAAAA,OAAA,EAAM,MAAI,MAAC,SAAkB,OAAM,mBAAkB,MAAK,OACxD,UAAA,OAAO,UACNZ,2BAAAA,IAAC,SAAI,WAAW,WAAY,UAAA,aAAa,OAAO,KAAK,EAAA,CAAE,IAEvDA,2BAAAA,IAAC,OAAA,EAAI,WAAU,iCAAgC,UAAA,sBAAA,CAAmB,GAEtE;AAAA,EAEJ;AAEA,QAAM,aAAa,OAAO;AAC1B,QAAM,OAAO,OAAO,WAAW,SAAS,YAAY,WAAW,OAAO,WAAW,OAAO;AAExF,iBAAe,SAAS;AACtB,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,OAAO;AAAA,MACP,SAAS,sBAAsB,IAAI;AAAA,MACnC,cAAc;AAAA,MACd,SAAS;AAAA,IAAA,CACV;AACD,QAAI,CAAC,UAAW;AAChB,gBAAY,IAAI;AAChB,mBAAe,EAAE;AACjB,QAAI,UAAU;AACd,QAAI;AACF,YAAM,WAAW,MAAM,OAAO;AAAA,QAC5BU,qBAAAA,uBAAuB;AAAA,QACvB;AAAA,QACA,EAAE,GAAA;AAAA,QACF,EAAE,QAAQ,mBAAA;AAAA,MAAmB;AAE/B,gBAAU,SAAS,SAAS;AAAA,IAC9B,SAAS,KAAK;AACZ,gBAAU,aAAa,GAAG;AAAA,IAC5B;AACA,gBAAY,KAAK;AACjB,QAAI,wBAAwB,OAAO;AAAA,QAC9B,WAAA;AAAA,EACP;AAEA,SACEN,2BAAAA,KAAAS,qBAAA,EACE,UAAA;AAAA,IAAAb,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,QAAQU,qBAAAA;AAAAA,QACR,cAAc,EAAE,GAAA;AAAA,QAChB,cAAc;AAAA,QACd,OAAO,QAAQ,IAAI;AAAA,QACnB,aAAY;AAAA,QACZ;AAAA,QACA,eAAe,CAAC,YACdN,2BAAAA,KAAAS,WAAAA,UAAA,EACE,UAAA;AAAA,UAAAb,2BAAAA;AAAAA,YAACK,OAAAA;AAAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,UAAU;AAAA,cACV,SAAS,MAAM,KAAK,OAAA;AAAA,cAEnB,qBAAW,cAAc;AAAA,YAAA;AAAA,UAAA;AAAA,UAE3B,WAAW,OAAO;AAAA,QAAA,GACrB;AAAA,QAEF,QAAQ,cAAcL,2BAAAA,IAAC,SAAI,WAAW,WAAY,uBAAY,IAAS;AAAA,QACvE;AAAA,QACA,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAEV;AAAA,EAAA,GACH;AAEJ;AAEA,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAaG;AACD,SACEA,2BAAAA;AAAAA,IAACc,iBAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS,WAAW;AAAA,MACpB,UAAU,WAAW;AAAA,MACrB;AAAA,MACC,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACtC,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACvC,WAAW;AAAA,MACX,cAAc,CAAC,EAAE,MAAM,OAAA,qCACpBF,aAAA,EAAM,MAAI,MAAC,SAAkB,OAAc,MAAK,OAAM,QACrD,UAAAR,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,QAAA;AAAA,QACA;AAAA,MAAA,EAAA,CACH,EAAA,CACF;AAAA,MAEF,UACEJ,2BAAAA,IAAC,OAAA,EAAI,WAAW,WACb,UAAA,OAAO,OAAO,kFAAA,CACjB;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,SAAS,aAAa,KAAsB;AAC1C,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;;"}
@@ -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,5 @@
1
+ import { ActionOutcome } from './connectionActionTypes.js';
2
+ export declare function ConnectionActionStatus({ outcome }: {
3
+ outcome: ActionOutcome;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=connectionActionStatus.d.ts.map
@@ -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;"}