@flanksource/clicky-ui 0.3.1 → 0.3.3

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 (382) hide show
  1. package/dist/comments/CommentAuthor.cjs +58 -0
  2. package/dist/comments/CommentAuthor.cjs.map +1 -0
  3. package/dist/comments/CommentAuthor.d.ts +17 -0
  4. package/dist/comments/CommentAuthor.d.ts.map +1 -0
  5. package/dist/comments/CommentAuthor.js +58 -0
  6. package/dist/comments/CommentAuthor.js.map +1 -0
  7. package/dist/comments/CommentCard.cjs +343 -0
  8. package/dist/comments/CommentCard.cjs.map +1 -0
  9. package/dist/comments/CommentCard.d.ts +27 -0
  10. package/dist/comments/CommentCard.d.ts.map +1 -0
  11. package/dist/comments/CommentCard.js +343 -0
  12. package/dist/comments/CommentCard.js.map +1 -0
  13. package/dist/comments/CommentComposer.cjs +207 -0
  14. package/dist/comments/CommentComposer.cjs.map +1 -0
  15. package/dist/comments/CommentComposer.d.ts +23 -0
  16. package/dist/comments/CommentComposer.d.ts.map +1 -0
  17. package/dist/comments/CommentComposer.js +207 -0
  18. package/dist/comments/CommentComposer.js.map +1 -0
  19. package/dist/comments/CommentFilterBar.cjs +145 -0
  20. package/dist/comments/CommentFilterBar.cjs.map +1 -0
  21. package/dist/comments/CommentFilterBar.d.ts +15 -0
  22. package/dist/comments/CommentFilterBar.d.ts.map +1 -0
  23. package/dist/comments/CommentFilterBar.js +145 -0
  24. package/dist/comments/CommentFilterBar.js.map +1 -0
  25. package/dist/comments/CommentMarkdown.cjs +156 -0
  26. package/dist/comments/CommentMarkdown.cjs.map +1 -0
  27. package/dist/comments/CommentMarkdown.d.ts +13 -0
  28. package/dist/comments/CommentMarkdown.d.ts.map +1 -0
  29. package/dist/comments/CommentMarkdown.js +156 -0
  30. package/dist/comments/CommentMarkdown.js.map +1 -0
  31. package/dist/comments/CommentProgress.cjs +86 -0
  32. package/dist/comments/CommentProgress.cjs.map +1 -0
  33. package/dist/comments/CommentProgress.d.ts +16 -0
  34. package/dist/comments/CommentProgress.d.ts.map +1 -0
  35. package/dist/comments/CommentProgress.js +86 -0
  36. package/dist/comments/CommentProgress.js.map +1 -0
  37. package/dist/comments/CommentProvider.cjs +99 -0
  38. package/dist/comments/CommentProvider.cjs.map +1 -0
  39. package/dist/comments/CommentProvider.d.ts +19 -0
  40. package/dist/comments/CommentProvider.d.ts.map +1 -0
  41. package/dist/comments/CommentProvider.js +99 -0
  42. package/dist/comments/CommentProvider.js.map +1 -0
  43. package/dist/comments/CommentSidePanel.cjs +219 -0
  44. package/dist/comments/CommentSidePanel.cjs.map +1 -0
  45. package/dist/comments/CommentSidePanel.d.ts +16 -0
  46. package/dist/comments/CommentSidePanel.d.ts.map +1 -0
  47. package/dist/comments/CommentSidePanel.js +219 -0
  48. package/dist/comments/CommentSidePanel.js.map +1 -0
  49. package/dist/comments/CommentThread.cjs +57 -0
  50. package/dist/comments/CommentThread.cjs.map +1 -0
  51. package/dist/comments/CommentThread.d.ts +24 -0
  52. package/dist/comments/CommentThread.d.ts.map +1 -0
  53. package/dist/comments/CommentThread.js +57 -0
  54. package/dist/comments/CommentThread.js.map +1 -0
  55. package/dist/comments/CommentThreadList.cjs +124 -0
  56. package/dist/comments/CommentThreadList.cjs.map +1 -0
  57. package/dist/comments/CommentThreadList.d.ts +25 -0
  58. package/dist/comments/CommentThreadList.d.ts.map +1 -0
  59. package/dist/comments/CommentThreadList.js +124 -0
  60. package/dist/comments/CommentThreadList.js.map +1 -0
  61. package/dist/comments/GroupedComments.cjs +74 -0
  62. package/dist/comments/GroupedComments.cjs.map +1 -0
  63. package/dist/comments/GroupedComments.d.ts +18 -0
  64. package/dist/comments/GroupedComments.d.ts.map +1 -0
  65. package/dist/comments/GroupedComments.js +74 -0
  66. package/dist/comments/GroupedComments.js.map +1 -0
  67. package/dist/comments/MentionTextarea.cjs +253 -0
  68. package/dist/comments/MentionTextarea.cjs.map +1 -0
  69. package/dist/comments/MentionTextarea.d.ts +28 -0
  70. package/dist/comments/MentionTextarea.d.ts.map +1 -0
  71. package/dist/comments/MentionTextarea.js +253 -0
  72. package/dist/comments/MentionTextarea.js.map +1 -0
  73. package/dist/comments/comment-context.cjs +33 -0
  74. package/dist/comments/comment-context.cjs.map +1 -0
  75. package/dist/comments/comment-context.d.ts +32 -0
  76. package/dist/comments/comment-context.d.ts.map +1 -0
  77. package/dist/comments/comment-context.js +33 -0
  78. package/dist/comments/comment-context.js.map +1 -0
  79. package/dist/comments/comment-fixtures.d.ts +11 -0
  80. package/dist/comments/comment-fixtures.d.ts.map +1 -0
  81. package/dist/comments/comment-types.cjs +19 -0
  82. package/dist/comments/comment-types.cjs.map +1 -0
  83. package/dist/comments/comment-types.d.ts +170 -0
  84. package/dist/comments/comment-types.d.ts.map +1 -0
  85. package/dist/comments/comment-types.js +19 -0
  86. package/dist/comments/comment-types.js.map +1 -0
  87. package/dist/comments/comment-utils.cjs +216 -0
  88. package/dist/comments/comment-utils.cjs.map +1 -0
  89. package/dist/comments/comment-utils.d.ts +59 -0
  90. package/dist/comments/comment-utils.d.ts.map +1 -0
  91. package/dist/comments/comment-utils.js +216 -0
  92. package/dist/comments/comment-utils.js.map +1 -0
  93. package/dist/comments.cjs +57 -0
  94. package/dist/comments.cjs.map +1 -0
  95. package/dist/comments.d.ts +16 -0
  96. package/dist/comments.d.ts.map +1 -0
  97. package/dist/comments.js +57 -0
  98. package/dist/comments.js.map +1 -0
  99. package/dist/components/FilterBar.cjs +13 -3
  100. package/dist/components/FilterBar.cjs.map +1 -1
  101. package/dist/components/FilterBar.js +13 -3
  102. package/dist/components/FilterBar.js.map +1 -1
  103. package/dist/components/JsonSchemaForm.cjs +20 -6
  104. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  105. package/dist/components/JsonSchemaForm.d.ts +1 -1
  106. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  107. package/dist/components/JsonSchemaForm.js +22 -8
  108. package/dist/components/JsonSchemaForm.js.map +1 -1
  109. package/dist/components/NamespacePicker.cjs +52 -0
  110. package/dist/components/NamespacePicker.cjs.map +1 -0
  111. package/dist/components/NamespacePicker.d.ts +17 -0
  112. package/dist/components/NamespacePicker.d.ts.map +1 -0
  113. package/dist/components/NamespacePicker.js +52 -0
  114. package/dist/components/NamespacePicker.js.map +1 -0
  115. package/dist/components/form-lookup-context.cjs +36 -0
  116. package/dist/components/form-lookup-context.cjs.map +1 -0
  117. package/dist/components/form-lookup-context.d.ts +9 -0
  118. package/dist/components/form-lookup-context.d.ts.map +1 -0
  119. package/dist/components/form-lookup-context.js +36 -0
  120. package/dist/components/form-lookup-context.js.map +1 -0
  121. package/dist/components/json-schema-form-discriminator.cjs +67 -0
  122. package/dist/components/json-schema-form-discriminator.cjs.map +1 -0
  123. package/dist/components/json-schema-form-discriminator.d.ts +10 -0
  124. package/dist/components/json-schema-form-discriminator.d.ts.map +1 -0
  125. package/dist/components/json-schema-form-discriminator.js +67 -0
  126. package/dist/components/json-schema-form-discriminator.js.map +1 -0
  127. package/dist/components/json-schema-form-fields.cjs +66 -1
  128. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  129. package/dist/components/json-schema-form-fields.d.ts +7 -0
  130. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  131. package/dist/components/json-schema-form-fields.js +66 -1
  132. package/dist/components/json-schema-form-fields.js.map +1 -1
  133. package/dist/components/json-schema-form-grid.cjs +92 -0
  134. package/dist/components/json-schema-form-grid.cjs.map +1 -0
  135. package/dist/components/json-schema-form-grid.d.ts +9 -0
  136. package/dist/components/json-schema-form-grid.d.ts.map +1 -0
  137. package/dist/components/json-schema-form-grid.js +92 -0
  138. package/dist/components/json-schema-form-grid.js.map +1 -0
  139. package/dist/components/json-schema-form-render.cjs +20 -3
  140. package/dist/components/json-schema-form-render.cjs.map +1 -1
  141. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  142. package/dist/components/json-schema-form-render.js +22 -5
  143. package/dist/components/json-schema-form-render.js.map +1 -1
  144. package/dist/components/json-schema-form-resolve.cjs +24 -2
  145. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  146. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  147. package/dist/components/json-schema-form-resolve.js +24 -2
  148. package/dist/components/json-schema-form-resolve.js.map +1 -1
  149. package/dist/components/json-schema-form-types.d.ts +37 -2
  150. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  151. package/dist/components/json-schema-form-utils.cjs +8 -0
  152. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  153. package/dist/components/json-schema-form-utils.d.ts +1 -0
  154. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  155. package/dist/components/json-schema-form-utils.js +8 -0
  156. package/dist/components/json-schema-form-utils.js.map +1 -1
  157. package/dist/components/workload-picker-utils.cjs.map +1 -1
  158. package/dist/components/workload-picker-utils.d.ts +11 -1
  159. package/dist/components/workload-picker-utils.d.ts.map +1 -1
  160. package/dist/components/workload-picker-utils.js.map +1 -1
  161. package/dist/components.cjs +6 -0
  162. package/dist/components.cjs.map +1 -1
  163. package/dist/components.d.ts +4 -2
  164. package/dist/components.d.ts.map +1 -1
  165. package/dist/components.js +6 -0
  166. package/dist/components.js.map +1 -1
  167. package/dist/data/Clicky.cjs +225 -60
  168. package/dist/data/Clicky.cjs.map +1 -1
  169. package/dist/data/Clicky.d.ts +7 -1
  170. package/dist/data/Clicky.d.ts.map +1 -1
  171. package/dist/data/Clicky.fixtures.d.ts +3 -1
  172. package/dist/data/Clicky.fixtures.d.ts.map +1 -1
  173. package/dist/data/Clicky.js +226 -61
  174. package/dist/data/Clicky.js.map +1 -1
  175. package/dist/data/ExecutionTree.cjs +68 -0
  176. package/dist/data/ExecutionTree.cjs.map +1 -0
  177. package/dist/data/ExecutionTree.d.ts +40 -0
  178. package/dist/data/ExecutionTree.d.ts.map +1 -0
  179. package/dist/data/ExecutionTree.js +68 -0
  180. package/dist/data/ExecutionTree.js.map +1 -0
  181. package/dist/data/GaugeHoverCard.cjs +35 -0
  182. package/dist/data/GaugeHoverCard.cjs.map +1 -0
  183. package/dist/data/GaugeHoverCard.d.ts +25 -0
  184. package/dist/data/GaugeHoverCard.d.ts.map +1 -0
  185. package/dist/data/GaugeHoverCard.js +35 -0
  186. package/dist/data/GaugeHoverCard.js.map +1 -0
  187. package/dist/data/MarkdownEditor.cjs +616 -0
  188. package/dist/data/MarkdownEditor.cjs.map +1 -0
  189. package/dist/data/MarkdownEditor.d.ts +61 -0
  190. package/dist/data/MarkdownEditor.d.ts.map +1 -0
  191. package/dist/data/MarkdownEditor.js +616 -0
  192. package/dist/data/MarkdownEditor.js.map +1 -0
  193. package/dist/data/MarkdownEditor.model.cjs +27 -0
  194. package/dist/data/MarkdownEditor.model.cjs.map +1 -0
  195. package/dist/data/MarkdownEditor.model.d.ts +38 -0
  196. package/dist/data/MarkdownEditor.model.d.ts.map +1 -0
  197. package/dist/data/MarkdownEditor.model.js +27 -0
  198. package/dist/data/MarkdownEditor.model.js.map +1 -0
  199. package/dist/data/ObjectGraph.cjs +44 -0
  200. package/dist/data/ObjectGraph.cjs.map +1 -0
  201. package/dist/data/ObjectGraph.d.ts +39 -0
  202. package/dist/data/ObjectGraph.d.ts.map +1 -0
  203. package/dist/data/ObjectGraph.js +44 -0
  204. package/dist/data/ObjectGraph.js.map +1 -0
  205. package/dist/data/SchemaViewer.cjs +152 -0
  206. package/dist/data/SchemaViewer.cjs.map +1 -0
  207. package/dist/data/SchemaViewer.d.ts +27 -0
  208. package/dist/data/SchemaViewer.d.ts.map +1 -0
  209. package/dist/data/SchemaViewer.js +152 -0
  210. package/dist/data/SchemaViewer.js.map +1 -0
  211. package/dist/data/TimeseriesCoreBars.cjs +51 -12
  212. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  213. package/dist/data/TimeseriesCoreBars.d.ts +32 -5
  214. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  215. package/dist/data/TimeseriesCoreBars.js +51 -12
  216. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  217. package/dist/data/TimeseriesCoreBars.model.cjs +5 -5
  218. package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -1
  219. package/dist/data/TimeseriesCoreBars.model.d.ts +4 -4
  220. package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -1
  221. package/dist/data/TimeseriesCoreBars.model.js +5 -5
  222. package/dist/data/TimeseriesCoreBars.model.js.map +1 -1
  223. package/dist/data/TimeseriesGauge.cjs +103 -65
  224. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  225. package/dist/data/TimeseriesGauge.d.ts +10 -1
  226. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  227. package/dist/data/TimeseriesGauge.js +104 -66
  228. package/dist/data/TimeseriesGauge.js.map +1 -1
  229. package/dist/data/WorkloadCard.cjs +4 -4
  230. package/dist/data/WorkloadCard.cjs.map +1 -1
  231. package/dist/data/WorkloadCard.d.ts +3 -2
  232. package/dist/data/WorkloadCard.d.ts.map +1 -1
  233. package/dist/data/WorkloadCard.js +4 -4
  234. package/dist/data/WorkloadCard.js.map +1 -1
  235. package/dist/data/ai/ChatWindow.cjs +11 -19
  236. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  237. package/dist/data/ai/ChatWindow.d.ts +1 -7
  238. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  239. package/dist/data/ai/ChatWindow.js +11 -19
  240. package/dist/data/ai/ChatWindow.js.map +1 -1
  241. package/dist/data/ai/ChatWindowRequestBody.cjs +20 -0
  242. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -0
  243. package/dist/data/ai/ChatWindowRequestBody.d.ts +9 -0
  244. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -0
  245. package/dist/data/ai/ChatWindowRequestBody.js +20 -0
  246. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -0
  247. package/dist/data/chat/Chat.cjs +12 -0
  248. package/dist/data/chat/Chat.cjs.map +1 -1
  249. package/dist/data/chat/Chat.d.ts +8 -1
  250. package/dist/data/chat/Chat.d.ts.map +1 -1
  251. package/dist/data/chat/Chat.js +12 -0
  252. package/dist/data/chat/Chat.js.map +1 -1
  253. package/dist/data/gauge-stats.cjs +19 -0
  254. package/dist/data/gauge-stats.cjs.map +1 -0
  255. package/dist/data/gauge-stats.d.ts +15 -0
  256. package/dist/data/gauge-stats.d.ts.map +1 -0
  257. package/dist/data/gauge-stats.js +19 -0
  258. package/dist/data/gauge-stats.js.map +1 -0
  259. package/dist/data/schema-viewer-model.cjs +436 -0
  260. package/dist/data/schema-viewer-model.cjs.map +1 -0
  261. package/dist/data/schema-viewer-model.d.ts +64 -0
  262. package/dist/data/schema-viewer-model.d.ts.map +1 -0
  263. package/dist/data/schema-viewer-model.js +436 -0
  264. package/dist/data/schema-viewer-model.js.map +1 -0
  265. package/dist/data/version-info.cjs +2 -2
  266. package/dist/data/version-info.js +2 -2
  267. package/dist/data.cjs +23 -0
  268. package/dist/data.cjs.map +1 -1
  269. package/dist/data.d.ts +11 -3
  270. package/dist/data.d.ts.map +1 -1
  271. package/dist/data.js +23 -0
  272. package/dist/data.js.map +1 -1
  273. package/dist/index.cjs +87 -2
  274. package/dist/index.cjs.map +1 -1
  275. package/dist/index.d.ts +1 -0
  276. package/dist/index.d.ts.map +1 -1
  277. package/dist/index.js +87 -2
  278. package/dist/index.js.map +1 -1
  279. package/dist/rpc/EntityExplorerApp.cjs +102 -143
  280. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  281. package/dist/rpc/EntityExplorerApp.d.ts +34 -1
  282. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  283. package/dist/rpc/EntityExplorerApp.js +105 -146
  284. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  285. package/dist/rpc/OperationActionBar.cjs +135 -0
  286. package/dist/rpc/OperationActionBar.cjs.map +1 -0
  287. package/dist/rpc/OperationActionBar.d.ts +20 -0
  288. package/dist/rpc/OperationActionBar.d.ts.map +1 -0
  289. package/dist/rpc/OperationActionBar.js +135 -0
  290. package/dist/rpc/OperationActionBar.js.map +1 -0
  291. package/dist/rpc/OperationCatalog.cjs +79 -116
  292. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  293. package/dist/rpc/OperationCatalog.d.ts +8 -1
  294. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  295. package/dist/rpc/OperationCatalog.js +80 -117
  296. package/dist/rpc/OperationCatalog.js.map +1 -1
  297. package/dist/rpc/OperationCommandPage.cjs +134 -223
  298. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  299. package/dist/rpc/OperationCommandPage.d.ts +1 -1
  300. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  301. package/dist/rpc/OperationCommandPage.js +135 -224
  302. package/dist/rpc/OperationCommandPage.js.map +1 -1
  303. package/dist/rpc/OperationEntityPage.cjs +49 -100
  304. package/dist/rpc/OperationEntityPage.cjs.map +1 -1
  305. package/dist/rpc/OperationEntityPage.d.ts +6 -1
  306. package/dist/rpc/OperationEntityPage.d.ts.map +1 -1
  307. package/dist/rpc/OperationEntityPage.js +50 -101
  308. package/dist/rpc/OperationEntityPage.js.map +1 -1
  309. package/dist/rpc/OperationResultView.cjs +43 -0
  310. package/dist/rpc/OperationResultView.cjs.map +1 -0
  311. package/dist/rpc/OperationResultView.d.ts +30 -0
  312. package/dist/rpc/OperationResultView.d.ts.map +1 -0
  313. package/dist/rpc/OperationResultView.js +43 -0
  314. package/dist/rpc/OperationResultView.js.map +1 -0
  315. package/dist/rpc/SchemaActionForm.cjs +102 -0
  316. package/dist/rpc/SchemaActionForm.cjs.map +1 -0
  317. package/dist/rpc/SchemaActionForm.d.ts +23 -0
  318. package/dist/rpc/SchemaActionForm.d.ts.map +1 -0
  319. package/dist/rpc/SchemaActionForm.js +102 -0
  320. package/dist/rpc/SchemaActionForm.js.map +1 -0
  321. package/dist/rpc/accept-options.cjs.map +1 -1
  322. package/dist/rpc/accept-options.d.ts +0 -1
  323. package/dist/rpc/accept-options.d.ts.map +1 -1
  324. package/dist/rpc/accept-options.js.map +1 -1
  325. package/dist/rpc/apiClient.cjs +34 -2
  326. package/dist/rpc/apiClient.cjs.map +1 -1
  327. package/dist/rpc/apiClient.d.ts +4 -1
  328. package/dist/rpc/apiClient.d.ts.map +1 -1
  329. package/dist/rpc/apiClient.js +34 -2
  330. package/dist/rpc/apiClient.js.map +1 -1
  331. package/dist/rpc/clickyMetadata.cjs +4 -4
  332. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  333. package/dist/rpc/clickyMetadata.d.ts +0 -1
  334. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  335. package/dist/rpc/clickyMetadata.js +4 -4
  336. package/dist/rpc/clickyMetadata.js.map +1 -1
  337. package/dist/rpc/formMetadata.cjs +1 -0
  338. package/dist/rpc/formMetadata.cjs.map +1 -1
  339. package/dist/rpc/formMetadata.d.ts +6 -1
  340. package/dist/rpc/formMetadata.d.ts.map +1 -1
  341. package/dist/rpc/formMetadata.js +1 -0
  342. package/dist/rpc/formMetadata.js.map +1 -1
  343. package/dist/rpc/rowNavigation.cjs +86 -0
  344. package/dist/rpc/rowNavigation.cjs.map +1 -0
  345. package/dist/rpc/rowNavigation.d.ts +14 -0
  346. package/dist/rpc/rowNavigation.d.ts.map +1 -0
  347. package/dist/rpc/rowNavigation.js +86 -0
  348. package/dist/rpc/rowNavigation.js.map +1 -0
  349. package/dist/rpc/schemaActionPath.cjs +22 -0
  350. package/dist/rpc/schemaActionPath.cjs.map +1 -0
  351. package/dist/rpc/schemaActionPath.d.ts +4 -0
  352. package/dist/rpc/schemaActionPath.d.ts.map +1 -0
  353. package/dist/rpc/schemaActionPath.js +22 -0
  354. package/dist/rpc/schemaActionPath.js.map +1 -0
  355. package/dist/rpc/surfaceIconMap.cjs +35 -0
  356. package/dist/rpc/surfaceIconMap.cjs.map +1 -0
  357. package/dist/rpc/surfaceIconMap.d.ts +3 -0
  358. package/dist/rpc/surfaceIconMap.d.ts.map +1 -0
  359. package/dist/rpc/surfaceIconMap.js +35 -0
  360. package/dist/rpc/surfaceIconMap.js.map +1 -0
  361. package/dist/rpc/types.cjs.map +1 -1
  362. package/dist/rpc/types.d.ts +2 -0
  363. package/dist/rpc/types.d.ts.map +1 -1
  364. package/dist/rpc/types.js.map +1 -1
  365. package/dist/rpc/useOperations.cjs.map +1 -1
  366. package/dist/rpc/useOperations.d.ts +4 -1
  367. package/dist/rpc/useOperations.d.ts.map +1 -1
  368. package/dist/rpc/useOperations.js.map +1 -1
  369. package/dist/rpc.cjs +4 -2
  370. package/dist/rpc.cjs.map +1 -1
  371. package/dist/rpc.d.ts +7 -6
  372. package/dist/rpc.d.ts.map +1 -1
  373. package/dist/rpc.js +4 -2
  374. package/dist/rpc.js.map +1 -1
  375. package/dist/styles.css +1 -1
  376. package/package.json +6 -1
  377. package/dist/rpc/AcceptPicker.cjs +0 -137
  378. package/dist/rpc/AcceptPicker.cjs.map +0 -1
  379. package/dist/rpc/AcceptPicker.d.ts +0 -12
  380. package/dist/rpc/AcceptPicker.d.ts.map +0 -1
  381. package/dist/rpc/AcceptPicker.js +0 -137
  382. package/dist/rpc/AcceptPicker.js.map +0 -1
@@ -1,14 +1,11 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useState, useMemo } from "react";
2
+ import { useMemo } from "react";
3
3
  import { useQuery } from "@tanstack/react-query";
4
- import { Button } from "../components/button.js";
5
4
  import { MethodBadge } from "../data/MethodBadge.js";
6
- import { Modal } from "../overlay/Modal.js";
7
5
  import { filterOperationsByDomain, findListEndpoint, findDetailEndpointForList } from "./classify.js";
8
6
  import { filterOperationsBySurface, findSurfaceListOperation, findSurfaceDetailOperation, findSurfaceEntityActions } from "./clickyMetadata.js";
9
7
  import { ExecutionResult } from "./ExecutionResult.js";
10
- import { FilterForm } from "./FilterForm.js";
11
- import { packParameterValues } from "./formMetadata.js";
8
+ import { OperationActionBar } from "./OperationActionBar.js";
12
9
  import { useOperations } from "./useOperations.js";
13
10
  function defaultRenderError(err, title) {
14
11
  const message = err instanceof Error ? err.message : String(err ?? "");
@@ -31,13 +28,12 @@ function OperationEntityPage({
31
28
  backHref,
32
29
  backLabel = "Back",
33
30
  renderError = defaultRenderError,
34
- commandRuntime
31
+ commandRuntime,
32
+ formPre,
33
+ formPost,
34
+ formActions
35
35
  }) {
36
36
  const { operations, isLoading } = useOperations(client);
37
- const [activeAction, setActiveAction] = useState(null);
38
- const [actionResult, setActionResult] = useState(null);
39
- const [actionError, setActionError] = useState("");
40
- const [isExecutingAction, setIsExecutingAction] = useState(false);
41
37
  const surfaceOps = useMemo(
42
38
  () => filterOperationsBySurface(operations, surfaceKey),
43
39
  [operations, surfaceKey]
@@ -94,31 +90,25 @@ function OperationEntityPage({
94
90
  staleTime: 3e4,
95
91
  retry: 0
96
92
  });
93
+ const rawDetailQuery = useQuery({
94
+ queryKey: ["entity-detail-raw", definition.key, id, resolvedDetailEndpoint == null ? void 0 : resolvedDetailEndpoint.path],
95
+ queryFn: async () => client.executeCommand(resolvedDetailEndpoint.path, resolvedDetailEndpoint.method, detailValues, {
96
+ Accept: "application/json"
97
+ }),
98
+ enabled: !!resolvedDetailEndpoint && !!id,
99
+ staleTime: 3e4,
100
+ retry: 0
101
+ });
102
+ const editInitialValue = useMemo(() => {
103
+ var _a;
104
+ const parsed = (_a = rawDetailQuery.data) == null ? void 0 : _a.parsed;
105
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : void 0;
106
+ }, [rawDetailQuery.data]);
97
107
  const backLink = backHref == null ? null : renderLink ? renderLink({
98
108
  to: backHref,
99
109
  className: "text-sm text-primary underline-offset-4 hover:underline",
100
110
  children: backLabel
101
111
  }) : /* @__PURE__ */ jsx("a", { href: backHref, className: "text-sm text-primary underline-offset-4 hover:underline", children: backLabel });
102
- async function executeAction(values) {
103
- if (!activeAction) return;
104
- setIsExecutingAction(true);
105
- setActionError("");
106
- try {
107
- const response = await client.executeCommand(
108
- activeAction.path,
109
- activeAction.method,
110
- packParameterValues(values, activeAction.operation.parameters ?? []),
111
- { Accept: "application/json+clicky" }
112
- );
113
- setActionResult(response);
114
- await detailQuery.refetch();
115
- } catch (err) {
116
- setActionResult(null);
117
- setActionError(err instanceof Error ? err.message : String(err ?? "Unknown error"));
118
- } finally {
119
- setIsExecutingAction(false);
120
- }
121
- }
122
112
  if (isLoading) {
123
113
  return /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: "Loading entity…" });
124
114
  }
@@ -129,38 +119,36 @@ function OperationEntityPage({
129
119
  ] });
130
120
  }
131
121
  return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
132
- /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
133
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-2", children: [
134
- backLink,
135
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
136
- /* @__PURE__ */ jsx(MethodBadge, { method: resolvedDetailEndpoint.method }),
137
- /* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: resolvedDetailEndpoint.path })
138
- ] }),
139
- /* @__PURE__ */ jsxs("div", { children: [
140
- /* @__PURE__ */ jsxs("h1", { className: "text-2xl font-semibold tracking-tight", children: [
141
- definition.title,
142
- ": ",
143
- id
144
- ] }),
145
- /* @__PURE__ */ jsx("p", { className: "mt-1 max-w-3xl text-sm text-muted-foreground", children: definition.description })
146
- ] })
122
+ /* @__PURE__ */ jsx("div", { className: "flex items-start justify-between gap-4", children: /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-2", children: [
123
+ backLink,
124
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
125
+ /* @__PURE__ */ jsx(MethodBadge, { method: resolvedDetailEndpoint.method }),
126
+ /* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: resolvedDetailEndpoint.path })
147
127
  ] }),
148
- actionOps.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex shrink-0 flex-wrap justify-end gap-2", children: actionOps.map((op) => /* @__PURE__ */ jsx(
149
- Button,
150
- {
151
- type: "button",
152
- variant: "outline",
153
- size: "sm",
154
- onClick: () => {
155
- setActiveAction(op);
156
- setActionResult(null);
157
- setActionError("");
158
- },
159
- children: op.operation.summary || op.operation.operationId || op.path
160
- },
161
- `${op.method}:${op.path}`
162
- )) })
163
- ] }),
128
+ /* @__PURE__ */ jsxs("div", { children: [
129
+ /* @__PURE__ */ jsxs("h1", { className: "text-2xl font-semibold tracking-tight", children: [
130
+ definition.title,
131
+ ": ",
132
+ id
133
+ ] }),
134
+ /* @__PURE__ */ jsx("p", { className: "mt-1 max-w-3xl text-sm text-muted-foreground", children: definition.description })
135
+ ] })
136
+ ] }) }),
137
+ /* @__PURE__ */ jsx(
138
+ OperationActionBar,
139
+ {
140
+ actions: actionOps,
141
+ client,
142
+ getLockedValues: () => ({ [idParameterName]: id }),
143
+ onExecuted: () => void detailQuery.refetch(),
144
+ hideLockedInForm: true,
145
+ ...editInitialValue ? { initialValue: editInitialValue } : {},
146
+ ...commandRuntime ? { commandRuntime } : {},
147
+ ...formPre ? { formPre } : {},
148
+ ...formPost ? { formPost } : {},
149
+ ...formActions ? { formActions } : {}
150
+ }
151
+ ),
164
152
  detailQuery.isLoading ? /* @__PURE__ */ jsxs("section", { className: "rounded-xl border bg-card p-4", children: [
165
153
  /* @__PURE__ */ jsx("h2", { className: "text-lg font-medium", children: "Entity detail" }),
166
154
  /* @__PURE__ */ jsx(ExecutionResult, { loading: true, loadingMessage: "Loading entity detail…" })
@@ -173,46 +161,7 @@ function OperationEntityPage({
173
161
  ...commandRuntime ? { commandRuntime } : {}
174
162
  }
175
163
  )
176
- ] }),
177
- /* @__PURE__ */ jsx(
178
- Modal,
179
- {
180
- open: activeAction != null,
181
- onClose: () => setActiveAction(null),
182
- title: (activeAction == null ? void 0 : activeAction.operation.summary) || (activeAction == null ? void 0 : activeAction.operation.operationId) || "Action",
183
- size: "lg",
184
- children: activeAction && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
185
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
186
- /* @__PURE__ */ jsx(MethodBadge, { method: activeAction.method }),
187
- /* @__PURE__ */ jsx("code", { className: "rounded-md bg-muted px-2 py-1 text-sm", children: activeAction.path })
188
- ] }),
189
- /* @__PURE__ */ jsx(
190
- FilterForm,
191
- {
192
- client,
193
- path: activeAction.path,
194
- method: activeAction.method,
195
- parameters: activeAction.operation.parameters ?? [],
196
- lockedValues: { [idParameterName]: id },
197
- hideLocked: true,
198
- enableLookup: false,
199
- submitLabel: "Execute request",
200
- submittingLabel: "Executing…",
201
- isSubmitting: isExecutingAction,
202
- onSubmit: executeAction
203
- }
204
- ),
205
- actionError ? /* @__PURE__ */ jsx("div", { className: "rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive", children: actionError }) : actionResult ? /* @__PURE__ */ jsx(
206
- ExecutionResult,
207
- {
208
- response: actionResult,
209
- className: "mt-0",
210
- ...commandRuntime ? { commandRuntime } : {}
211
- }
212
- ) : null
213
- ] })
214
- }
215
- )
164
+ ] })
216
165
  ] });
217
166
  }
218
167
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"OperationEntityPage.js","sources":["../../src/rpc/OperationEntityPage.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { filterOperationsByDomain, findDetailEndpointForList, findListEndpoint } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceDetailOperation,\n findSurfaceEntityActions,\n findSurfaceListOperation,\n} from \"./clickyMetadata\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport { packParameterValues } from \"./formMetadata\";\nimport type { RenderLink } from \"./EndpointList\";\nimport type { DomainDefinition, ExecutionResponse, ResolvedOperation } from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationEntityPageProps = {\n id?: string;\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink?: RenderLink;\n allOperations?: boolean;\n operationIdPrefix?: string;\n listOperationId?: string;\n detailOperationId?: string;\n surfaceKey?: string;\n backHref?: string;\n backLabel?: string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n};\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">{message}</div>}\n </div>\n );\n}\n\nexport function OperationEntityPage({\n id,\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n operationIdPrefix,\n listOperationId,\n detailOperationId,\n surfaceKey,\n backHref,\n backLabel = \"Back\",\n renderError = defaultRenderError,\n commandRuntime,\n}: OperationEntityPageProps) {\n const { operations, isLoading } = useOperations(client);\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return surfaceOps;\n }\n\n return (allOperations ? operations : filterOperationsByDomain(operations, entities)).filter(\n (op) =>\n operationIdPrefix ? (op.operation.operationId ?? \"\").startsWith(operationIdPrefix) : true,\n );\n }, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);\n\n const listEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceListOperation(domainOps, surfaceKey);\n }\n\n const explicitList = listOperationId\n ? domainOps.find((op) => op.method === \"get\" && op.operation.operationId === listOperationId)\n : undefined;\n return explicitList ?? findListEndpoint(domainOps, entities);\n }, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);\n\n const resolvedDetailEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceDetailOperation(domainOps, surfaceKey);\n }\n\n return detailOperationId\n ? domainOps.find(\n (op) => op.method === \"get\" && op.operation.operationId === detailOperationId,\n )\n : findDetailEndpointForList(domainOps, listEndpoint);\n }, [detailOperationId, domainOps, listEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const idParameterName = useMemo(\n () =>\n resolvedDetailEndpoint?.operation.parameters?.find((param) => param.in === \"path\")?.name ??\n \"id\",\n [resolvedDetailEndpoint],\n );\n const detailValues = useMemo(() => (id ? { [idParameterName]: id } : {}), [id, idParameterName]);\n const actionOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceEntityActions(domainOps, surfaceKey);\n }\n\n return resolvedDetailEndpoint == null\n ? []\n : domainOps.filter(\n (op) => op.method !== \"get\" && op.path.startsWith(`${resolvedDetailEndpoint.path}/`),\n );\n }, [domainOps, resolvedDetailEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const detailQuery = useQuery({\n queryKey: [\"entity-detail\", definition.key, id, resolvedDetailEndpoint?.path],\n queryFn: async () =>\n client.executeCommand(\n resolvedDetailEndpoint!.path,\n resolvedDetailEndpoint!.method,\n detailValues,\n { Accept: \"application/json+clicky\" },\n ),\n enabled: !!resolvedDetailEndpoint && !!id,\n staleTime: 30_000,\n retry: 0,\n });\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n await detailQuery.refetch();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\n }\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading entity…</div>;\n }\n\n if (!resolvedDetailEndpoint || !id) {\n return (\n <div className=\"space-y-4\">\n {backLink}\n <div className=\"text-sm text-muted-foreground\">Unknown entity detail route.</div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 space-y-2\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={resolvedDetailEndpoint.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {resolvedDetailEndpoint.path}\n </code>\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {definition.title}: {id}\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n </div>\n {actionOps.length > 0 && (\n <div className=\"flex shrink-0 flex-wrap justify-end gap-2\">\n {actionOps.map((op) => (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }}\n >\n {op.operation.summary || op.operation.operationId || op.path}\n </Button>\n ))}\n </div>\n )}\n </div>\n\n {detailQuery.isLoading ? (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult loading loadingMessage=\"Loading entity detail…\" />\n </section>\n ) : detailQuery.isError ? (\n renderError(detailQuery.error, `Failed to load ${resolvedDetailEndpoint.path}`)\n ) : (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult\n response={detailQuery.data ?? null}\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n </section>\n )}\n\n <Modal\n open={activeAction != null}\n onClose={() => setActiveAction(null)}\n title={activeAction?.operation.summary || activeAction?.operation.operationId || \"Action\"}\n size=\"lg\"\n >\n {activeAction && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">{activeAction.path}</code>\n </div>\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={{ [idParameterName]: id }}\n hideLocked\n enableLookup={false}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n />\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n )}\n </Modal>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OperationEntityPage.js","sources":["../../src/rpc/OperationEntityPage.tsx"],"sourcesContent":["import { useMemo, type ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { filterOperationsByDomain, findDetailEndpointForList, findListEndpoint } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceDetailOperation,\n findSurfaceEntityActions,\n findSurfaceListOperation,\n} from \"./clickyMetadata\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport type { RenderLink } from \"./EndpointList\";\nimport type { PreExtension, PostExtension } from \"../components/json-schema-form-types\";\nimport type { DomainDefinition } from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationEntityPageProps = {\n id?: string;\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink?: RenderLink;\n allOperations?: boolean;\n operationIdPrefix?: string;\n listOperationId?: string;\n detailOperationId?: string;\n surfaceKey?: string;\n backHref?: string;\n backLabel?: string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the edit form (e.g. a connection \"Test\"\n // button).\n formActions?: FormActionsRenderer;\n};\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">{message}</div>}\n </div>\n );\n}\n\nexport function OperationEntityPage({\n id,\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n operationIdPrefix,\n listOperationId,\n detailOperationId,\n surfaceKey,\n backHref,\n backLabel = \"Back\",\n renderError = defaultRenderError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n}: OperationEntityPageProps) {\n const { operations, isLoading } = useOperations(client);\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return surfaceOps;\n }\n\n return (allOperations ? operations : filterOperationsByDomain(operations, entities)).filter(\n (op) =>\n operationIdPrefix ? (op.operation.operationId ?? \"\").startsWith(operationIdPrefix) : true,\n );\n }, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);\n\n const listEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceListOperation(domainOps, surfaceKey);\n }\n\n const explicitList = listOperationId\n ? domainOps.find((op) => op.method === \"get\" && op.operation.operationId === listOperationId)\n : undefined;\n return explicitList ?? findListEndpoint(domainOps, entities);\n }, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);\n\n const resolvedDetailEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceDetailOperation(domainOps, surfaceKey);\n }\n\n return detailOperationId\n ? domainOps.find(\n (op) => op.method === \"get\" && op.operation.operationId === detailOperationId,\n )\n : findDetailEndpointForList(domainOps, listEndpoint);\n }, [detailOperationId, domainOps, listEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const idParameterName = useMemo(\n () =>\n resolvedDetailEndpoint?.operation.parameters?.find((param) => param.in === \"path\")?.name ??\n \"id\",\n [resolvedDetailEndpoint],\n );\n const detailValues = useMemo(() => (id ? { [idParameterName]: id } : {}), [id, idParameterName]);\n const actionOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceEntityActions(domainOps, surfaceKey);\n }\n\n return resolvedDetailEndpoint == null\n ? []\n : domainOps.filter(\n (op) => op.method !== \"get\" && op.path.startsWith(`${resolvedDetailEndpoint.path}/`),\n );\n }, [domainOps, resolvedDetailEndpoint, surfaceKey, useSurfaceMetadata]);\n\n const detailQuery = useQuery({\n queryKey: [\"entity-detail\", definition.key, id, resolvedDetailEndpoint?.path],\n queryFn: async () =>\n client.executeCommand(\n resolvedDetailEndpoint!.path,\n resolvedDetailEndpoint!.method,\n detailValues,\n { Accept: \"application/json+clicky\" },\n ),\n enabled: !!resolvedDetailEndpoint && !!id,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Raw (non-clicky) detail used to pre-fill the schema-driven edit form. Only\n // resources whose detail endpoint returns a plain object (e.g. connections)\n // prefill; others (e.g. a profile detail that returns rows) start blank.\n const rawDetailQuery = useQuery({\n queryKey: [\"entity-detail-raw\", definition.key, id, resolvedDetailEndpoint?.path],\n queryFn: async () =>\n client.executeCommand(resolvedDetailEndpoint!.path, resolvedDetailEndpoint!.method, detailValues, {\n Accept: \"application/json\",\n }),\n enabled: !!resolvedDetailEndpoint && !!id,\n staleTime: 30_000,\n retry: 0,\n });\n const editInitialValue = useMemo(() => {\n const parsed = rawDetailQuery.data?.parsed;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n }, [rawDetailQuery.data]);\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading entity…</div>;\n }\n\n if (!resolvedDetailEndpoint || !id) {\n return (\n <div className=\"space-y-4\">\n {backLink}\n <div className=\"text-sm text-muted-foreground\">Unknown entity detail route.</div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 space-y-2\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={resolvedDetailEndpoint.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">\n {resolvedDetailEndpoint.path}\n </code>\n </div>\n <div>\n <h1 className=\"text-2xl font-semibold tracking-tight\">\n {definition.title}: {id}\n </h1>\n <p className=\"mt-1 max-w-3xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n </div>\n </div>\n\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={() => ({ [idParameterName]: id })}\n onExecuted={() => void detailQuery.refetch()}\n hideLockedInForm\n {...(editInitialValue ? { initialValue: editInitialValue } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n />\n\n {detailQuery.isLoading ? (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult loading loadingMessage=\"Loading entity detail…\" />\n </section>\n ) : detailQuery.isError ? (\n renderError(detailQuery.error, `Failed to load ${resolvedDetailEndpoint.path}`)\n ) : (\n <section className=\"rounded-xl border bg-card p-4\">\n <h2 className=\"text-lg font-medium\">Entity detail</h2>\n <ExecutionResult\n response={detailQuery.data ?? null}\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n </section>\n )}\n </div>\n );\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 ExecutionResult = require("./ExecutionResult.cjs");
5
+ const rowNavigation = require("./rowNavigation.cjs");
6
+ function OperationResultView({
7
+ response,
8
+ loading,
9
+ loadingMessage,
10
+ emptyMessage,
11
+ ariaLabel,
12
+ className,
13
+ commandRuntime,
14
+ detailOperation,
15
+ filterConfig,
16
+ pagination
17
+ }) {
18
+ const rowNav = rowNavigation.useRowDetailNavigation(detailOperation);
19
+ const filters = filterConfig == null ? void 0 : filterConfig.filters;
20
+ return /* @__PURE__ */ jsxRuntime.jsx(
21
+ ExecutionResult.ExecutionResult,
22
+ {
23
+ response,
24
+ ...loading !== void 0 ? { loading } : {},
25
+ ...loadingMessage ? { loadingMessage } : {},
26
+ ...emptyMessage ? { emptyMessage } : {},
27
+ ...ariaLabel ? { ariaLabel } : {},
28
+ ...className ? { className } : {},
29
+ ...commandRuntime ? { commandRuntime } : {},
30
+ ...detailOperation ? {
31
+ getTableRowHref: rowNav.getRowHref,
32
+ onTableRowClick: rowNav.onRowClick,
33
+ isTableRowClickable: rowNav.isRowClickable
34
+ } : {},
35
+ ...filters && filters.length > 0 ? { externalFilters: filters } : {},
36
+ ...(filterConfig == null ? void 0 : filterConfig.search) ? { search: filterConfig.search } : {},
37
+ ...(filterConfig == null ? void 0 : filterConfig.timeRange) ? { timeRange: filterConfig.timeRange } : {},
38
+ ...pagination ? { pagination } : {}
39
+ }
40
+ );
41
+ }
42
+ exports.OperationResultView = OperationResultView;
43
+ //# sourceMappingURL=OperationResultView.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationResultView.cjs","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { useRowDetailNavigation } from \"./rowNavigation\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\n\n// ResultRenderContext is handed to a host-supplied resultRenderer so it can\n// replace the default result surface for selected entities (e.g. render a\n// LogsTable for trace/log profiles). `defaultView` is the standard\n// OperationResultView element; return it unchanged to keep the default.\nexport type ResultRenderContext = {\n surfaceKey?: string;\n response: ExecutionResponse | null;\n defaultView: ReactNode;\n};\n\n// ResultRenderer lets the host app swap the result presentation per surface. It\n// receives the current surface key, the raw response, and the default view, and\n// returns whatever node should render in its place.\nexport type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;\n\n// In-table filter inputs for the result table — mirrors what\n// parametersToFormConfig produces, surfaced through the DataTable's own\n// FilterBar so the filter UI renders identically on every result surface.\nexport type OperationResultFilterConfig = {\n filters?: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n};\n\nexport type OperationResultViewProps = {\n response: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n commandRuntime?: ClickyCommandRuntime;\n // When set, rows navigate to the entity detail page (/<surface>/<id>).\n detailOperation?: ResolvedOperation | undefined;\n filterConfig?: OperationResultFilterConfig;\n pagination?: DataTablePagination;\n};\n\n// OperationResultView is the single result surface rendered by both the entity\n// list catalog and the operation runner. It renders the clicky result table\n// with its in-table FilterBar, the View/Download menu (automatic via the\n// response's requestUrl), pagination, and row→detail navigation — so the\n// surface looks and behaves identically wherever a result is shown.\nexport function OperationResultView({\n response,\n loading,\n loadingMessage,\n emptyMessage,\n ariaLabel,\n className,\n commandRuntime,\n detailOperation,\n filterConfig,\n pagination,\n}: OperationResultViewProps) {\n const rowNav = useRowDetailNavigation(detailOperation);\n const filters = filterConfig?.filters;\n\n return (\n <ExecutionResult\n response={response}\n {...(loading !== undefined ? { loading } : {})}\n {...(loadingMessage ? { loadingMessage } : {})}\n {...(emptyMessage ? { emptyMessage } : {})}\n {...(ariaLabel ? { ariaLabel } : {})}\n {...(className ? { className } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(detailOperation\n ? {\n getTableRowHref: rowNav.getRowHref,\n onTableRowClick: rowNav.onRowClick,\n isTableRowClickable: rowNav.isRowClickable,\n }\n : {})}\n {...(filters && filters.length > 0 ? { externalFilters: filters } : {})}\n {...(filterConfig?.search ? { search: filterConfig.search } : {})}\n {...(filterConfig?.timeRange\n ? { timeRange: filterConfig.timeRange }\n : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n}\n"],"names":["useRowDetailNavigation","jsx","ExecutionResult"],"mappings":";;;;;AAuDO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,SAASA,cAAAA,uBAAuB,eAAe;AACrD,QAAM,UAAU,6CAAc;AAE9B,SACEC,2BAAAA;AAAAA,IAACC,gBAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAA,IAAY,CAAA;AAAA,MAC1C,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACtC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,kBACD;AAAA,QACE,iBAAiB,OAAO;AAAA,QACxB,iBAAiB,OAAO;AAAA,QACxB,qBAAqB,OAAO;AAAA,MAAA,IAE9B,CAAA;AAAA,MACH,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,iBAAiB,QAAA,IAAY,CAAA;AAAA,MACnE,IAAI,6CAAc,UAAS,EAAE,QAAQ,aAAa,OAAA,IAAW,CAAA;AAAA,MAC7D,IAAI,6CAAc,aACf,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,MACH,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,IAAC;AAAA,EAAA;AAG1C;;"}
@@ -0,0 +1,30 @@
1
+ import { ReactNode } from 'react';
2
+ import { FilterBarFilter, FilterBarRangeProps, FilterBarSearchProps } from '../components/FilterBar';
3
+ import { DataTablePagination } from '../data/DataTable';
4
+ import { ClickyCommandRuntime } from '../data/Clicky';
5
+ import { ExecutionResponse, ResolvedOperation } from './types';
6
+ export type ResultRenderContext = {
7
+ surfaceKey?: string;
8
+ response: ExecutionResponse | null;
9
+ defaultView: ReactNode;
10
+ };
11
+ export type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;
12
+ export type OperationResultFilterConfig = {
13
+ filters?: FilterBarFilter[];
14
+ search?: FilterBarSearchProps;
15
+ timeRange?: FilterBarRangeProps;
16
+ };
17
+ export type OperationResultViewProps = {
18
+ response: ExecutionResponse | null;
19
+ loading?: boolean;
20
+ loadingMessage?: string;
21
+ emptyMessage?: string;
22
+ ariaLabel?: string;
23
+ className?: string;
24
+ commandRuntime?: ClickyCommandRuntime;
25
+ detailOperation?: ResolvedOperation | undefined;
26
+ filterConfig?: OperationResultFilterConfig;
27
+ pagination?: DataTablePagination;
28
+ };
29
+ export declare function OperationResultView({ response, loading, loadingMessage, emptyMessage, ariaLabel, className, commandRuntime, detailOperation, filterConfig, pagination, }: OperationResultViewProps): import("react/jsx-runtime").JSX.Element;
30
+ //# sourceMappingURL=OperationResultView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationResultView.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationResultView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAMpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,SAAS,CAAC;CACxB,CAAC;AAKF,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,SAAS,CAAC;AAKrE,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC,eAAe,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAChD,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AAOF,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,OAAO,EACP,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,cAAc,EACd,eAAe,EACf,YAAY,EACZ,UAAU,GACX,EAAE,wBAAwB,2CA4B1B"}
@@ -0,0 +1,43 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { ExecutionResult } from "./ExecutionResult.js";
3
+ import { useRowDetailNavigation } from "./rowNavigation.js";
4
+ function OperationResultView({
5
+ response,
6
+ loading,
7
+ loadingMessage,
8
+ emptyMessage,
9
+ ariaLabel,
10
+ className,
11
+ commandRuntime,
12
+ detailOperation,
13
+ filterConfig,
14
+ pagination
15
+ }) {
16
+ const rowNav = useRowDetailNavigation(detailOperation);
17
+ const filters = filterConfig == null ? void 0 : filterConfig.filters;
18
+ return /* @__PURE__ */ jsx(
19
+ ExecutionResult,
20
+ {
21
+ response,
22
+ ...loading !== void 0 ? { loading } : {},
23
+ ...loadingMessage ? { loadingMessage } : {},
24
+ ...emptyMessage ? { emptyMessage } : {},
25
+ ...ariaLabel ? { ariaLabel } : {},
26
+ ...className ? { className } : {},
27
+ ...commandRuntime ? { commandRuntime } : {},
28
+ ...detailOperation ? {
29
+ getTableRowHref: rowNav.getRowHref,
30
+ onTableRowClick: rowNav.onRowClick,
31
+ isTableRowClickable: rowNav.isRowClickable
32
+ } : {},
33
+ ...filters && filters.length > 0 ? { externalFilters: filters } : {},
34
+ ...(filterConfig == null ? void 0 : filterConfig.search) ? { search: filterConfig.search } : {},
35
+ ...(filterConfig == null ? void 0 : filterConfig.timeRange) ? { timeRange: filterConfig.timeRange } : {},
36
+ ...pagination ? { pagination } : {}
37
+ }
38
+ );
39
+ }
40
+ export {
41
+ OperationResultView
42
+ };
43
+ //# sourceMappingURL=OperationResultView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationResultView.js","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { useRowDetailNavigation } from \"./rowNavigation\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\n\n// ResultRenderContext is handed to a host-supplied resultRenderer so it can\n// replace the default result surface for selected entities (e.g. render a\n// LogsTable for trace/log profiles). `defaultView` is the standard\n// OperationResultView element; return it unchanged to keep the default.\nexport type ResultRenderContext = {\n surfaceKey?: string;\n response: ExecutionResponse | null;\n defaultView: ReactNode;\n};\n\n// ResultRenderer lets the host app swap the result presentation per surface. It\n// receives the current surface key, the raw response, and the default view, and\n// returns whatever node should render in its place.\nexport type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;\n\n// In-table filter inputs for the result table — mirrors what\n// parametersToFormConfig produces, surfaced through the DataTable's own\n// FilterBar so the filter UI renders identically on every result surface.\nexport type OperationResultFilterConfig = {\n filters?: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n};\n\nexport type OperationResultViewProps = {\n response: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n commandRuntime?: ClickyCommandRuntime;\n // When set, rows navigate to the entity detail page (/<surface>/<id>).\n detailOperation?: ResolvedOperation | undefined;\n filterConfig?: OperationResultFilterConfig;\n pagination?: DataTablePagination;\n};\n\n// OperationResultView is the single result surface rendered by both the entity\n// list catalog and the operation runner. It renders the clicky result table\n// with its in-table FilterBar, the View/Download menu (automatic via the\n// response's requestUrl), pagination, and row→detail navigation — so the\n// surface looks and behaves identically wherever a result is shown.\nexport function OperationResultView({\n response,\n loading,\n loadingMessage,\n emptyMessage,\n ariaLabel,\n className,\n commandRuntime,\n detailOperation,\n filterConfig,\n pagination,\n}: OperationResultViewProps) {\n const rowNav = useRowDetailNavigation(detailOperation);\n const filters = filterConfig?.filters;\n\n return (\n <ExecutionResult\n response={response}\n {...(loading !== undefined ? { loading } : {})}\n {...(loadingMessage ? { loadingMessage } : {})}\n {...(emptyMessage ? { emptyMessage } : {})}\n {...(ariaLabel ? { ariaLabel } : {})}\n {...(className ? { className } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(detailOperation\n ? {\n getTableRowHref: rowNav.getRowHref,\n onTableRowClick: rowNav.onRowClick,\n isTableRowClickable: rowNav.isRowClickable,\n }\n : {})}\n {...(filters && filters.length > 0 ? { externalFilters: filters } : {})}\n {...(filterConfig?.search ? { search: filterConfig.search } : {})}\n {...(filterConfig?.timeRange\n ? { timeRange: filterConfig.timeRange }\n : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n}\n"],"names":[],"mappings":";;;AAuDO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,SAAS,uBAAuB,eAAe;AACrD,QAAM,UAAU,6CAAc;AAE9B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAA,IAAY,CAAA;AAAA,MAC1C,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACtC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,kBACD;AAAA,QACE,iBAAiB,OAAO;AAAA,QACxB,iBAAiB,OAAO;AAAA,QACxB,qBAAqB,OAAO;AAAA,MAAA,IAE9B,CAAA;AAAA,MACH,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,iBAAiB,QAAA,IAAY,CAAA;AAAA,MACnE,IAAI,6CAAc,UAAS,EAAE,QAAQ,aAAa,OAAA,IAAW,CAAA;AAAA,MAC7D,IAAI,6CAAc,aACf,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,MACH,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,IAAC;AAAA,EAAA;AAG1C;"}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const reactQuery = require("@tanstack/react-query");
6
+ const button = require("../components/button.cjs");
7
+ const JsonSchemaForm = require("../components/JsonSchemaForm.cjs");
8
+ const formLookupContext = require("../components/form-lookup-context.cjs");
9
+ const formMetadata = require("./formMetadata.cjs");
10
+ const schemaActionPath = require("./schemaActionPath.cjs");
11
+ function SchemaActionForm({
12
+ client,
13
+ action,
14
+ lockedValues,
15
+ initialValue,
16
+ submitLabel = "Save",
17
+ onSuccess,
18
+ formPre,
19
+ formPost,
20
+ footerActions,
21
+ fallback
22
+ }) {
23
+ const method = action.method.toUpperCase();
24
+ const canSchemaForm = Boolean(client.getSchema && client.submitForm && isMutation(method));
25
+ const schemaPath = schemaActionPath.collectionPath(action.path);
26
+ const lookupFetcher = react.useMemo(() => {
27
+ const lookup = client.lookupFilterOptions;
28
+ if (!lookup) return void 0;
29
+ return async ({ descriptor, query, rootValue }) => {
30
+ const extra = formLookupContext.resolveLookupScope(descriptor, rootValue);
31
+ const filter = await lookup.call(
32
+ client,
33
+ descriptor.url,
34
+ "GET",
35
+ descriptor.filter,
36
+ query,
37
+ extra
38
+ );
39
+ return formMetadata.lookupOptionsToFieldOptions(filter).map((o) => ({ value: o.value, label: o.label }));
40
+ };
41
+ }, [client]);
42
+ const schemaQuery = reactQuery.useQuery({
43
+ queryKey: ["entity-schema", schemaPath],
44
+ // react-query forbids undefined query data; normalize "no schema" to null.
45
+ queryFn: async () => await client.getSchema(schemaPath) ?? null,
46
+ enabled: canSchemaForm,
47
+ staleTime: 5 * 60 * 1e3,
48
+ retry: 0
49
+ });
50
+ const [value, setValue] = react.useState(initialValue ?? {});
51
+ const [error, setError] = react.useState("");
52
+ const [isSubmitting, setIsSubmitting] = react.useState(false);
53
+ if (!canSchemaForm) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fallback });
54
+ if (schemaQuery.isLoading) {
55
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: "Loading form…" });
56
+ }
57
+ const schema = schemaQuery.data;
58
+ if (!schema) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fallback });
59
+ async function handleSubmit() {
60
+ if (!client.submitForm) return;
61
+ setIsSubmitting(true);
62
+ setError("");
63
+ try {
64
+ const path = schemaActionPath.resolveActionPath(action.path, { ...schemaActionPath.scalarValues(value), ...lockedValues });
65
+ const response = await client.submitForm(path, method, value, {
66
+ Accept: "application/json+clicky"
67
+ });
68
+ if (response.error) {
69
+ setError(response.error);
70
+ return;
71
+ }
72
+ onSuccess == null ? void 0 : onSuccess(response);
73
+ } catch (err) {
74
+ setError(err instanceof Error ? err.message : String(err ?? "Unknown error"));
75
+ } finally {
76
+ setIsSubmitting(false);
77
+ }
78
+ }
79
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
80
+ /* @__PURE__ */ jsxRuntime.jsx(
81
+ JsonSchemaForm.JsonSchemaForm,
82
+ {
83
+ schema,
84
+ value,
85
+ onChange: setValue,
86
+ ...formPre ? { pre: formPre } : {},
87
+ ...formPost ? { post: formPost } : {},
88
+ ...lookupFetcher ? { lookupFetcher } : {}
89
+ }
90
+ ),
91
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive", children: error }),
92
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [
93
+ footerActions == null ? void 0 : footerActions({ value, action }),
94
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", onClick: handleSubmit, disabled: isSubmitting, children: isSubmitting ? "Saving…" : submitLabel })
95
+ ] })
96
+ ] });
97
+ }
98
+ function isMutation(method) {
99
+ return method === "POST" || method === "PUT" || method === "PATCH";
100
+ }
101
+ exports.SchemaActionForm = SchemaActionForm;
102
+ //# sourceMappingURL=SchemaActionForm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaActionForm.cjs","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { resolveLookupScope } from \"../components/form-lookup-context\";\nimport type {\n JsonSchemaObject,\n LookupFetcher,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { lookupOptionsToFieldOptions } from \"./formMetadata\";\nimport { collectionPath, resolveActionPath, scalarValues } from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(client.getSchema && client.submitForm && isMutation(method));\n const schemaPath = collectionPath(action.path);\n\n // Resolve `x-clicky-lookup` fields against the live form value: fetch the\n // referenced entity's lookup options (server-side search) and scope them by a\n // sibling field. Undefined when the client has no lookup endpoint (the field\n // then degrades to a free-text combobox).\n const lookupFetcher: LookupFetcher | undefined = useMemo(() => {\n const lookup = client.lookupFilterOptions;\n if (!lookup) return undefined;\n return async ({ descriptor, query, rootValue }) => {\n const extra = resolveLookupScope(descriptor, rootValue);\n const filter = await lookup.call(\n client,\n descriptor.url,\n \"GET\",\n descriptor.filter,\n query,\n extra,\n );\n return lookupOptionsToFieldOptions(filter).map((o) => ({ value: o.value, label: o.label }));\n };\n }, [client]);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(initialValue ?? {});\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n if (!canSchemaForm) return <>{fallback}</>;\n if (schemaQuery.isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading form…</div>;\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{fallback}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, { ...scalarValues(value), ...lockedValues });\n const response = await client.submitForm(path, method, value, {\n Accept: \"application/json+clicky\",\n });\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsSubmitting(false);\n }\n }\n\n return (\n <div className=\"space-y-4\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action })}\n <Button type=\"button\" onClick={handleSubmit} disabled={isSubmitting}>\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n"],"names":["collectionPath","useMemo","resolveLookupScope","lookupOptionsToFieldOptions","useQuery","useState","jsx","Fragment","resolveActionPath","scalarValues","jsxs","JsonSchemaForm","Button"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { ReactNode } from 'react';
2
+ import { PreExtension, PostExtension } from '../components/json-schema-form-types';
3
+ import { ExecutionResponse, ResolvedOperation } from './types';
4
+ import { OperationsApiClient } from './useOperations';
5
+ export type FormActionContext = {
6
+ value: Record<string, unknown>;
7
+ action: ResolvedOperation;
8
+ };
9
+ export type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;
10
+ export type SchemaActionFormProps = {
11
+ client: OperationsApiClient;
12
+ action: ResolvedOperation;
13
+ lockedValues?: Record<string, string>;
14
+ initialValue?: Record<string, unknown>;
15
+ submitLabel?: string;
16
+ onSuccess?: (response: ExecutionResponse) => void;
17
+ formPre?: PreExtension[];
18
+ formPost?: PostExtension[];
19
+ footerActions?: FormActionsRenderer;
20
+ fallback: ReactNode;
21
+ };
22
+ export declare function SchemaActionForm({ client, action, lockedValues, initialValue, submitLabel, onSuccess, formPre, formPost, footerActions, fallback, }: SchemaActionFormProps): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=SchemaActionForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaActionForm.d.ts","sourceRoot":"","sources":["../../src/rpc/SchemaActionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAK1D,OAAO,KAAK,EAGV,YAAY,EACZ,aAAa,EACd,MAAM,sCAAsC,CAAC;AAG9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,iBAAiB,CAAC;CAC3B,CAAC;AAIF,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC;AAExE,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAE5B,MAAM,EAAE,iBAAiB,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAGlD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAG3B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAGpC,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAMF,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,WAAoB,EACpB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,QAAQ,GACT,EAAE,qBAAqB,2CA0FvB"}