@flanksource/clicky-ui 0.3.25 → 0.3.26

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 (470) hide show
  1. package/NOTICE.md +1 -0
  2. package/dist/ai.cjs +4 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +6 -2
  5. package/dist/ai.js.map +1 -1
  6. package/dist/chat.cjs +8 -0
  7. package/dist/chat.cjs.map +1 -1
  8. package/dist/chat.js +9 -1
  9. package/dist/chat.js.map +1 -1
  10. package/dist/comments/CommentCard.cjs +89 -14
  11. package/dist/comments/CommentCard.cjs.map +1 -1
  12. package/dist/comments/CommentCard.d.ts.map +1 -1
  13. package/dist/comments/CommentCard.js +90 -15
  14. package/dist/comments/CommentCard.js.map +1 -1
  15. package/dist/comments/CommentComposer.cjs +25 -2
  16. package/dist/comments/CommentComposer.cjs.map +1 -1
  17. package/dist/comments/CommentComposer.d.ts.map +1 -1
  18. package/dist/comments/CommentComposer.js +25 -2
  19. package/dist/comments/CommentComposer.js.map +1 -1
  20. package/dist/comments/CommentProvider.cjs +21 -14
  21. package/dist/comments/CommentProvider.cjs.map +1 -1
  22. package/dist/comments/CommentProvider.d.ts +1 -1
  23. package/dist/comments/CommentProvider.d.ts.map +1 -1
  24. package/dist/comments/CommentProvider.js +21 -14
  25. package/dist/comments/CommentProvider.js.map +1 -1
  26. package/dist/comments/CommentSidePanel.cjs +1 -1
  27. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  28. package/dist/comments/CommentSidePanel.js +1 -1
  29. package/dist/comments/CommentSidePanel.js.map +1 -1
  30. package/dist/comments/comment-types.cjs.map +1 -1
  31. package/dist/comments/comment-types.d.ts +6 -0
  32. package/dist/comments/comment-types.d.ts.map +1 -1
  33. package/dist/comments/comment-types.js.map +1 -1
  34. package/dist/components/DimensionField.cjs +56 -0
  35. package/dist/components/DimensionField.cjs.map +1 -0
  36. package/dist/components/DimensionField.d.ts +17 -0
  37. package/dist/components/DimensionField.d.ts.map +1 -0
  38. package/dist/components/DimensionField.js +56 -0
  39. package/dist/components/DimensionField.js.map +1 -0
  40. package/dist/components.cjs +4 -0
  41. package/dist/components.cjs.map +1 -1
  42. package/dist/components.d.ts +2 -0
  43. package/dist/components.d.ts.map +1 -1
  44. package/dist/components.js +4 -0
  45. package/dist/components.js.map +1 -1
  46. package/dist/data/Clicky.cjs +4 -5
  47. package/dist/data/Clicky.cjs.map +1 -1
  48. package/dist/data/Clicky.d.ts.map +1 -1
  49. package/dist/data/Clicky.js +4 -5
  50. package/dist/data/Clicky.js.map +1 -1
  51. package/dist/data/TaskExecDetails.cjs +8 -3
  52. package/dist/data/TaskExecDetails.cjs.map +1 -1
  53. package/dist/data/TaskExecDetails.d.ts +4 -0
  54. package/dist/data/TaskExecDetails.d.ts.map +1 -1
  55. package/dist/data/TaskExecDetails.js +9 -4
  56. package/dist/data/TaskExecDetails.js.map +1 -1
  57. package/dist/data/TaskManagerButton.cjs +101 -7
  58. package/dist/data/TaskManagerButton.cjs.map +1 -1
  59. package/dist/data/TaskManagerButton.d.ts +6 -1
  60. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  61. package/dist/data/TaskManagerButton.js +103 -9
  62. package/dist/data/TaskManagerButton.js.map +1 -1
  63. package/dist/data/TaskProcessDetails.cjs +2 -0
  64. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  65. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  66. package/dist/data/TaskProcessDetails.js +2 -0
  67. package/dist/data/TaskProcessDetails.js.map +1 -1
  68. package/dist/data/TaskProgress.cjs +14 -4
  69. package/dist/data/TaskProgress.cjs.map +1 -1
  70. package/dist/data/TaskProgress.js +14 -4
  71. package/dist/data/TaskProgress.js.map +1 -1
  72. package/dist/data/TaskSnapshot.cjs.map +1 -1
  73. package/dist/data/TaskSnapshot.d.ts +1 -0
  74. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  75. package/dist/data/TaskSnapshot.js.map +1 -1
  76. package/dist/data/ai/ChatWindow.cjs +18 -23
  77. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  78. package/dist/data/ai/ChatWindow.d.ts +1 -1
  79. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  80. package/dist/data/ai/ChatWindow.js +19 -24
  81. package/dist/data/ai/ChatWindow.js.map +1 -1
  82. package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
  83. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  84. package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
  85. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  86. package/dist/data/ai/ChatWindow.preferences.js +12 -21
  87. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  88. package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
  89. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  90. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
  91. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  92. package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
  93. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  94. package/dist/data/ai/ChatWindow.types.d.ts +2 -2
  95. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  96. package/dist/data/ai/ChatWindowManager.cjs +2 -2
  97. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  98. package/dist/data/ai/ChatWindowManager.js +2 -2
  99. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  100. package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
  101. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
  102. package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
  103. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
  104. package/dist/data/ai/ChatWindowRequestBody.js +4 -2
  105. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
  106. package/dist/data/ai/ToolPreferences.cjs +5 -5
  107. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  108. package/dist/data/ai/ToolPreferences.d.ts +6 -5
  109. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  110. package/dist/data/ai/ToolPreferences.js +5 -5
  111. package/dist/data/ai/ToolPreferences.js.map +1 -1
  112. package/dist/data/ai/ToolPreferences.model.cjs +61 -37
  113. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  114. package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
  115. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  116. package/dist/data/ai/ToolPreferences.model.js +62 -38
  117. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  118. package/dist/data/ai/ToolPreferencesList.cjs +17 -20
  119. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  120. package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
  121. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  122. package/dist/data/ai/ToolPreferencesList.js +18 -21
  123. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  124. package/dist/data/ai/chat-window-context.cjs +1 -1
  125. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  126. package/dist/data/ai/chat-window-context.d.ts +7 -7
  127. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  128. package/dist/data/ai/chat-window-context.js +1 -1
  129. package/dist/data/ai/chat-window-context.js.map +1 -1
  130. package/dist/data/ai/index.d.ts +3 -1
  131. package/dist/data/ai/index.d.ts.map +1 -1
  132. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  133. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  134. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  135. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  136. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  137. package/dist/data/chat/index.d.ts +2 -1
  138. package/dist/data/chat/index.d.ts.map +1 -1
  139. package/dist/data/chat/tool-policy.cjs +132 -0
  140. package/dist/data/chat/tool-policy.cjs.map +1 -0
  141. package/dist/data/chat/tool-policy.d.ts +81 -0
  142. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  143. package/dist/data/chat/tool-policy.js +132 -0
  144. package/dist/data/chat/tool-policy.js.map +1 -0
  145. package/dist/data/chat/types.cjs +20 -0
  146. package/dist/data/chat/types.cjs.map +1 -1
  147. package/dist/data/chat/types.d.ts +22 -2
  148. package/dist/data/chat/types.d.ts.map +1 -1
  149. package/dist/data/chat/types.js +20 -0
  150. package/dist/data/chat/types.js.map +1 -1
  151. package/dist/data/debugConsoleSignal.cjs +64 -0
  152. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  153. package/dist/data/debugConsoleSignal.d.ts +83 -0
  154. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  155. package/dist/data/debugConsoleSignal.js +64 -0
  156. package/dist/data/debugConsoleSignal.js.map +1 -0
  157. package/dist/data/har/HarPanel.cjs +20 -14
  158. package/dist/data/har/HarPanel.cjs.map +1 -1
  159. package/dist/data/har/HarPanel.d.ts.map +1 -1
  160. package/dist/data/har/HarPanel.js +20 -14
  161. package/dist/data/har/HarPanel.js.map +1 -1
  162. package/dist/data/har/types.d.ts +18 -0
  163. package/dist/data/har/types.d.ts.map +1 -1
  164. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  165. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  166. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  167. package/dist/data/query-browser/QueryBrowser.js +5 -43
  168. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  169. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  170. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  171. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  172. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  173. package/dist/data/useDebugAction.cjs +29 -0
  174. package/dist/data/useDebugAction.cjs.map +1 -0
  175. package/dist/data/useDebugAction.d.ts +16 -0
  176. package/dist/data/useDebugAction.d.ts.map +1 -0
  177. package/dist/data/useDebugAction.js +29 -0
  178. package/dist/data/useDebugAction.js.map +1 -0
  179. package/dist/data/version-info.cjs +3 -3
  180. package/dist/data/version-info.js +3 -3
  181. package/dist/data.cjs +16 -8
  182. package/dist/data.cjs.map +1 -1
  183. package/dist/data.d.ts +3 -2
  184. package/dist/data.d.ts.map +1 -1
  185. package/dist/data.js +16 -8
  186. package/dist/devtools/DebugConsole.cjs +138 -0
  187. package/dist/devtools/DebugConsole.cjs.map +1 -0
  188. package/dist/devtools/DebugConsole.d.ts +23 -0
  189. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  190. package/dist/devtools/DebugConsole.js +138 -0
  191. package/dist/devtools/DebugConsole.js.map +1 -0
  192. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  193. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  194. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  195. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  196. package/dist/devtools/DebugConsoleButton.js +59 -0
  197. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  198. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  199. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  200. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  201. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  202. package/dist/devtools/DebugConsoleDock.js +112 -0
  203. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  204. package/dist/devtools/ExecutionDetail.cjs +135 -0
  205. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  206. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  207. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  208. package/dist/devtools/ExecutionDetail.js +135 -0
  209. package/dist/devtools/ExecutionDetail.js.map +1 -0
  210. package/dist/devtools/debugClient.cjs +172 -0
  211. package/dist/devtools/debugClient.cjs.map +1 -0
  212. package/dist/devtools/debugClient.d.ts +98 -0
  213. package/dist/devtools/debugClient.d.ts.map +1 -0
  214. package/dist/devtools/debugClient.js +172 -0
  215. package/dist/devtools/debugClient.js.map +1 -0
  216. package/dist/devtools/debugStore.cjs +115 -0
  217. package/dist/devtools/debugStore.cjs.map +1 -0
  218. package/dist/devtools/debugStore.d.ts +83 -0
  219. package/dist/devtools/debugStore.d.ts.map +1 -0
  220. package/dist/devtools/debugStore.js +115 -0
  221. package/dist/devtools/debugStore.js.map +1 -0
  222. package/dist/devtools/dockState.cjs +51 -0
  223. package/dist/devtools/dockState.cjs.map +1 -0
  224. package/dist/devtools/dockState.d.ts +31 -0
  225. package/dist/devtools/dockState.d.ts.map +1 -0
  226. package/dist/devtools/dockState.js +51 -0
  227. package/dist/devtools/dockState.js.map +1 -0
  228. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  229. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  230. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  231. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  232. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  233. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  234. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  235. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  236. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  237. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  238. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  239. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  240. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  241. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  242. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  243. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  244. package/dist/devtools/tabs/InspectionTab.js +316 -0
  245. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  246. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  247. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  248. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  249. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  250. package/dist/devtools/tabs/NetworkTab.js +91 -0
  251. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  252. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  253. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  254. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  255. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  256. package/dist/devtools/tabs/QueriesTab.js +85 -0
  257. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  258. package/dist/devtools/types.cjs +26 -0
  259. package/dist/devtools/types.cjs.map +1 -0
  260. package/dist/devtools/types.d.ts +235 -0
  261. package/dist/devtools/types.d.ts.map +1 -0
  262. package/dist/devtools/types.js +26 -0
  263. package/dist/devtools/types.js.map +1 -0
  264. package/dist/devtools/useDebugStream.cjs +46 -0
  265. package/dist/devtools/useDebugStream.cjs.map +1 -0
  266. package/dist/devtools/useDebugStream.d.ts +23 -0
  267. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  268. package/dist/devtools/useDebugStream.js +46 -0
  269. package/dist/devtools/useDebugStream.js.map +1 -0
  270. package/dist/devtools.cjs +51 -0
  271. package/dist/devtools.cjs.map +1 -0
  272. package/dist/devtools.d.ts +37 -0
  273. package/dist/devtools.d.ts.map +1 -0
  274. package/dist/devtools.js +51 -0
  275. package/dist/devtools.js.map +1 -0
  276. package/dist/icons/components/UiOpenScad.cjs +10 -0
  277. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  278. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  279. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  280. package/dist/icons/components/UiOpenScad.js +10 -0
  281. package/dist/icons/components/UiOpenScad.js.map +1 -0
  282. package/dist/icons/index.d.ts +1 -0
  283. package/dist/icons/index.d.ts.map +1 -1
  284. package/dist/icons/registry.cjs +2 -0
  285. package/dist/icons/registry.cjs.map +1 -1
  286. package/dist/icons/registry.d.ts.map +1 -1
  287. package/dist/icons/registry.js +2 -0
  288. package/dist/icons/registry.js.map +1 -1
  289. package/dist/icons.cjs +2 -0
  290. package/dist/icons.cjs.map +1 -1
  291. package/dist/icons.js +2 -0
  292. package/dist/icons.js.map +1 -1
  293. package/dist/index.cjs +20 -8
  294. package/dist/index.cjs.map +1 -1
  295. package/dist/index.js +20 -8
  296. package/dist/index.js.map +1 -1
  297. package/dist/layout/AppShell.cjs +15 -10
  298. package/dist/layout/AppShell.cjs.map +1 -1
  299. package/dist/layout/AppShell.d.ts +11 -0
  300. package/dist/layout/AppShell.d.ts.map +1 -1
  301. package/dist/layout/AppShell.js +15 -10
  302. package/dist/layout/AppShell.js.map +1 -1
  303. package/dist/layout/AppShell.nav.cjs +170 -49
  304. package/dist/layout/AppShell.nav.cjs.map +1 -1
  305. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  306. package/dist/layout/AppShell.nav.js +170 -49
  307. package/dist/layout/AppShell.nav.js.map +1 -1
  308. package/dist/overlay/CellActions.cjs +18 -124
  309. package/dist/overlay/CellActions.cjs.map +1 -1
  310. package/dist/overlay/CellActions.d.ts +1 -1
  311. package/dist/overlay/CellActions.d.ts.map +1 -1
  312. package/dist/overlay/CellActions.js +18 -124
  313. package/dist/overlay/CellActions.js.map +1 -1
  314. package/dist/overlay/ContextMenu.cjs +144 -0
  315. package/dist/overlay/ContextMenu.cjs.map +1 -0
  316. package/dist/overlay/ContextMenu.d.ts +8 -0
  317. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  318. package/dist/overlay/ContextMenu.js +144 -0
  319. package/dist/overlay/ContextMenu.js.map +1 -0
  320. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  321. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  322. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  323. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  324. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  325. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  326. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  327. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  328. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  329. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  330. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  331. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  332. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  333. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  334. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  335. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  336. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  337. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  338. package/dist/profiles/connections/index.d.ts +1 -0
  339. package/dist/profiles/connections/index.d.ts.map +1 -1
  340. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  341. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  342. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  343. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  344. package/dist/profiles/connections/inspectionStatus.js +44 -0
  345. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  346. package/dist/profiles/connections/useInspection.cjs +123 -0
  347. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  348. package/dist/profiles/connections/useInspection.d.ts +35 -0
  349. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  350. package/dist/profiles/connections/useInspection.js +123 -0
  351. package/dist/profiles/connections/useInspection.js.map +1 -0
  352. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  353. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  354. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  355. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  356. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  357. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  358. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  359. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  360. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  361. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  362. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  363. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  364. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  365. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  366. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  367. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  368. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  369. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  370. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  371. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  372. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  373. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  374. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  375. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  376. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  377. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  378. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  379. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  380. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  381. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  382. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  383. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  384. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  385. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  386. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  387. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  388. package/dist/profiles/query/profileSamplePayload.js +6 -4
  389. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  390. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  391. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  392. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  393. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  394. package/dist/profiles/query/profileSampleResult.js +26 -0
  395. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  396. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  397. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  398. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  399. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  400. package/dist/profiles/query/queryTargetPicker.js +5 -3
  401. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  402. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  403. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  404. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  405. package/dist/profiles/wizard/profileWizard.js +15 -6
  406. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  407. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  408. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  409. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  410. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  411. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  412. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  413. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  414. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  415. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  416. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  417. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  418. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  419. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  420. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  421. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  422. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  423. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  424. package/dist/profiles.cjs +8 -2
  425. package/dist/profiles.cjs.map +1 -1
  426. package/dist/profiles.js +10 -4
  427. package/dist/profiles.js.map +1 -1
  428. package/dist/rpc/FilterForm.cjs +21 -237
  429. package/dist/rpc/FilterForm.cjs.map +1 -1
  430. package/dist/rpc/FilterForm.d.ts +3 -1
  431. package/dist/rpc/FilterForm.d.ts.map +1 -1
  432. package/dist/rpc/FilterForm.js +21 -237
  433. package/dist/rpc/FilterForm.js.map +1 -1
  434. package/dist/rpc/FilterFormFields.cjs +240 -0
  435. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  436. package/dist/rpc/FilterFormFields.d.ts +12 -0
  437. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  438. package/dist/rpc/FilterFormFields.js +240 -0
  439. package/dist/rpc/FilterFormFields.js.map +1 -0
  440. package/dist/rpc/router.cjs +3 -2
  441. package/dist/rpc/router.cjs.map +1 -1
  442. package/dist/rpc/router.d.ts.map +1 -1
  443. package/dist/rpc/router.js +3 -2
  444. package/dist/rpc/router.js.map +1 -1
  445. package/dist/rpc/types.cjs.map +1 -1
  446. package/dist/rpc/types.d.ts +3 -1
  447. package/dist/rpc/types.d.ts.map +1 -1
  448. package/dist/rpc/types.js.map +1 -1
  449. package/dist/styles.css +1 -1
  450. package/package.json +6 -1
  451. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  452. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  453. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  454. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  455. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  456. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  457. package/dist/data/query-info/index.d.ts +0 -4
  458. package/dist/data/query-info/index.d.ts.map +0 -1
  459. package/dist/data/query-info/queryInfo.cjs +0 -42
  460. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  461. package/dist/data/query-info/queryInfo.d.ts +0 -45
  462. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  463. package/dist/data/query-info/queryInfo.js +0 -42
  464. package/dist/data/query-info/queryInfo.js.map +0 -1
  465. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  466. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  467. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  468. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  469. package/dist/data/query-info/useQueryInfo.js +0 -48
  470. package/dist/data/query-info/useQueryInfo.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"profileSamplePayload.cjs","sources":["../../../src/profiles/query/profileSamplePayload.ts"],"sourcesContent":["import type { QueryBrowserRequest } from \"../../data/query-browser/QueryBrowser.types\";\nimport { sampleRequestProfile } from \"./jsonPathSample\";\nimport type { ProfileWizardDraft } from \"../wizard/profileWizardModel\";\n\nexport function profileSamplePayload(\n draft: ProfileWizardDraft,\n request: QueryBrowserRequest,\n) {\n const profile = sampleRequestProfile(draft);\n if (!profile) throw new Error(\"Cannot sample a profile without a provider\");\n return {\n profile,\n params: {},\n ...(request.pagination ? { pagination: request.pagination } : {}),\n ...(request.debug ? { debug: true } : {}),\n };\n}\n"],"names":["sampleRequestProfile"],"mappings":";;;AAIO,SAAS,qBACd,OACA,SACA;AACA,QAAM,UAAUA,eAAAA,qBAAqB,KAAK;AAC1C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,4CAA4C;AAC1E,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAA;AAAA,IACR,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAA,IAAe,CAAA;AAAA,IAC9D,GAAI,QAAQ,QAAQ,EAAE,OAAO,KAAA,IAAS,CAAA;AAAA,EAAC;AAE3C;;"}
1
+ {"version":3,"file":"profileSamplePayload.cjs","sources":["../../../src/profiles/query/profileSamplePayload.ts"],"sourcesContent":["import type { QueryBrowserRequest } from \"../../data/query-browser/QueryBrowser.types\";\nimport { sampleRequestProfile } from \"./jsonPathSample\";\nimport type {\n ProfileColumn,\n ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nexport type ProfileSamplePayloadOptions = {\n draft: ProfileWizardDraft;\n request: QueryBrowserRequest;\n params?: Record<string, unknown>;\n filterColumns?: ProfileColumn[];\n};\n\nexport function profileSamplePayload(options: ProfileSamplePayloadOptions) {\n const { draft, request } = options;\n const profile = sampleRequestProfile(draft);\n if (!profile) throw new Error(\"Cannot sample a profile without a provider\");\n return {\n profile,\n params: options.params ?? {},\n ...(request.filters ? { filters: request.filters } : {}),\n ...(options.filterColumns\n ? { filterColumns: options.filterColumns }\n : {}),\n ...(request.pagination ? { pagination: request.pagination } : {}),\n };\n}\n"],"names":["sampleRequestProfile"],"mappings":";;;AAcO,SAAS,qBAAqB,SAAsC;AACzE,QAAM,EAAE,OAAO,QAAA,IAAY;AAC3B,QAAM,UAAUA,eAAAA,qBAAqB,KAAK;AAC1C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,4CAA4C;AAC1E,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ,UAAU,CAAA;AAAA,IAC1B,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAA,IAAY,CAAA;AAAA,IACrD,GAAI,QAAQ,gBACR,EAAE,eAAe,QAAQ,cAAA,IACzB,CAAA;AAAA,IACJ,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAA,IAAe,CAAA;AAAA,EAAC;AAEnE;;"}
@@ -1,13 +1,20 @@
1
1
  import { QueryBrowserRequest } from '../../data/query-browser/QueryBrowser.types';
2
- import { ProfileWizardDraft } from '../wizard/profileWizardModel';
3
- export declare function profileSamplePayload(draft: ProfileWizardDraft, request: QueryBrowserRequest): {
4
- debug?: boolean;
2
+ import { ProfileColumn, ProfileWizardDraft } from '../wizard/profileWizardModel';
3
+ export type ProfileSamplePayloadOptions = {
4
+ draft: ProfileWizardDraft;
5
+ request: QueryBrowserRequest;
6
+ params?: Record<string, unknown>;
7
+ filterColumns?: ProfileColumn[];
8
+ };
9
+ export declare function profileSamplePayload(options: ProfileSamplePayloadOptions): {
5
10
  pagination?: {
6
11
  limit: number;
7
12
  offset?: number;
8
13
  cursor?: string;
9
14
  };
15
+ filterColumns?: ProfileColumn[];
16
+ filters?: import('../..').DataTableFilterSelection;
10
17
  profile: Record<string, unknown>;
11
- params: {};
18
+ params: Record<string, unknown>;
12
19
  };
13
20
  //# sourceMappingURL=profileSamplePayload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profileSamplePayload.d.ts","sourceRoot":"","sources":["../../../src/profiles/query/profileSamplePayload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAEvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAEvE,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,mBAAmB;;;;;;;;;EAU7B"}
1
+ {"version":3,"file":"profileSamplePayload.d.ts","sourceRoot":"","sources":["../../../src/profiles/query/profileSamplePayload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAEvF,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,2BAA2B,GAAG;IACxC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B;;;;;;;;;;EAaxE"}
@@ -1,12 +1,14 @@
1
1
  import { sampleRequestProfile } from "./jsonPathSample.js";
2
- function profileSamplePayload(draft, request) {
2
+ function profileSamplePayload(options) {
3
+ const { draft, request } = options;
3
4
  const profile = sampleRequestProfile(draft);
4
5
  if (!profile) throw new Error("Cannot sample a profile without a provider");
5
6
  return {
6
7
  profile,
7
- params: {},
8
- ...request.pagination ? { pagination: request.pagination } : {},
9
- ...request.debug ? { debug: true } : {}
8
+ params: options.params ?? {},
9
+ ...request.filters ? { filters: request.filters } : {},
10
+ ...options.filterColumns ? { filterColumns: options.filterColumns } : {},
11
+ ...request.pagination ? { pagination: request.pagination } : {}
10
12
  };
11
13
  }
12
14
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"profileSamplePayload.js","sources":["../../../src/profiles/query/profileSamplePayload.ts"],"sourcesContent":["import type { QueryBrowserRequest } from \"../../data/query-browser/QueryBrowser.types\";\nimport { sampleRequestProfile } from \"./jsonPathSample\";\nimport type { ProfileWizardDraft } from \"../wizard/profileWizardModel\";\n\nexport function profileSamplePayload(\n draft: ProfileWizardDraft,\n request: QueryBrowserRequest,\n) {\n const profile = sampleRequestProfile(draft);\n if (!profile) throw new Error(\"Cannot sample a profile without a provider\");\n return {\n profile,\n params: {},\n ...(request.pagination ? { pagination: request.pagination } : {}),\n ...(request.debug ? { debug: true } : {}),\n };\n}\n"],"names":[],"mappings":";AAIO,SAAS,qBACd,OACA,SACA;AACA,QAAM,UAAU,qBAAqB,KAAK;AAC1C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,4CAA4C;AAC1E,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAA;AAAA,IACR,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAA,IAAe,CAAA;AAAA,IAC9D,GAAI,QAAQ,QAAQ,EAAE,OAAO,KAAA,IAAS,CAAA;AAAA,EAAC;AAE3C;"}
1
+ {"version":3,"file":"profileSamplePayload.js","sources":["../../../src/profiles/query/profileSamplePayload.ts"],"sourcesContent":["import type { QueryBrowserRequest } from \"../../data/query-browser/QueryBrowser.types\";\nimport { sampleRequestProfile } from \"./jsonPathSample\";\nimport type {\n ProfileColumn,\n ProfileWizardDraft,\n} from \"../wizard/profileWizardModel\";\n\nexport type ProfileSamplePayloadOptions = {\n draft: ProfileWizardDraft;\n request: QueryBrowserRequest;\n params?: Record<string, unknown>;\n filterColumns?: ProfileColumn[];\n};\n\nexport function profileSamplePayload(options: ProfileSamplePayloadOptions) {\n const { draft, request } = options;\n const profile = sampleRequestProfile(draft);\n if (!profile) throw new Error(\"Cannot sample a profile without a provider\");\n return {\n profile,\n params: options.params ?? {},\n ...(request.filters ? { filters: request.filters } : {}),\n ...(options.filterColumns\n ? { filterColumns: options.filterColumns }\n : {}),\n ...(request.pagination ? { pagination: request.pagination } : {}),\n };\n}\n"],"names":[],"mappings":";AAcO,SAAS,qBAAqB,SAAsC;AACzE,QAAM,EAAE,OAAO,QAAA,IAAY;AAC3B,QAAM,UAAU,qBAAqB,KAAK;AAC1C,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,4CAA4C;AAC1E,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,QAAQ,UAAU,CAAA;AAAA,IAC1B,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAA,IAAY,CAAA;AAAA,IACrD,GAAI,QAAQ,gBACR,EAAE,eAAe,QAAQ,cAAA,IACzB,CAAA;AAAA,IACJ,GAAI,QAAQ,aAAa,EAAE,YAAY,QAAQ,WAAA,IAAe,CAAA;AAAA,EAAC;AAEnE;"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function profileSampleQueryResult(response) {
4
+ if (!Array.isArray(response.resultColumns)) {
5
+ throw new Error("Profile sample response is missing resultColumns");
6
+ }
7
+ const result = {
8
+ ...response,
9
+ columns: response.resultColumns
10
+ };
11
+ delete result.resultColumns;
12
+ delete result.renderedQuery;
13
+ return result;
14
+ }
15
+ function profileSampleFilterColumns(response) {
16
+ if (!Array.isArray(response.resultColumns)) {
17
+ throw new Error("Profile sample response is missing resultColumns");
18
+ }
19
+ const filterable = new Set(
20
+ response.resultColumns.filter((column) => column.filterKey !== void 0).map((column) => column.name)
21
+ );
22
+ return response.columns.filter((column) => filterable.has(column.name));
23
+ }
24
+ exports.profileSampleFilterColumns = profileSampleFilterColumns;
25
+ exports.profileSampleQueryResult = profileSampleQueryResult;
26
+ //# sourceMappingURL=profileSampleResult.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileSampleResult.cjs","sources":["../../../src/profiles/query/profileSampleResult.ts"],"sourcesContent":["import type { DataTableServerColumn } from \"../../data/data-table-server-filters\";\nimport type { QueryBrowserResult } from \"../../data/query-browser/QueryBrowser.types\";\nimport type { ProfileColumn } from \"../wizard/profileWizardModel\";\n\nexport type ProfileSampleResponse = Omit<QueryBrowserResult, \"columns\"> & {\n columns: ProfileColumn[];\n resultColumns?: DataTableServerColumn[];\n renderedQuery: string;\n};\n\nexport function profileSampleQueryResult(\n response: ProfileSampleResponse,\n): QueryBrowserResult {\n if (!Array.isArray(response.resultColumns)) {\n throw new Error(\"Profile sample response is missing resultColumns\");\n }\n const result = {\n ...response,\n columns: response.resultColumns,\n } as QueryBrowserResult & {\n resultColumns?: DataTableServerColumn[];\n renderedQuery?: string;\n };\n delete result.resultColumns;\n delete result.renderedQuery;\n return result;\n}\n\nexport function profileSampleFilterColumns(\n response: ProfileSampleResponse,\n): ProfileColumn[] {\n if (!Array.isArray(response.resultColumns)) {\n throw new Error(\"Profile sample response is missing resultColumns\");\n }\n const filterable = new Set(\n response.resultColumns\n .filter((column) => column.filterKey !== undefined)\n .map((column) => column.name),\n );\n return response.columns.filter((column) => filterable.has(column.name));\n}\n"],"names":[],"mappings":";;AAUO,SAAS,yBACd,UACoB;AACpB,MAAI,CAAC,MAAM,QAAQ,SAAS,aAAa,GAAG;AAC1C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,SAAS,SAAS;AAAA,EAAA;AAKpB,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO;AACT;AAEO,SAAS,2BACd,UACiB;AACjB,MAAI,CAAC,MAAM,QAAQ,SAAS,aAAa,GAAG;AAC1C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,aAAa,IAAI;AAAA,IACrB,SAAS,cACN,OAAO,CAAC,WAAW,OAAO,cAAc,MAAS,EACjD,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,EAAA;AAEhC,SAAO,SAAS,QAAQ,OAAO,CAAC,WAAW,WAAW,IAAI,OAAO,IAAI,CAAC;AACxE;;;"}
@@ -0,0 +1,11 @@
1
+ import { DataTableServerColumn } from '../../data/data-table-server-filters';
2
+ import { QueryBrowserResult } from '../../data/query-browser/QueryBrowser.types';
3
+ import { ProfileColumn } from '../wizard/profileWizardModel';
4
+ export type ProfileSampleResponse = Omit<QueryBrowserResult, "columns"> & {
5
+ columns: ProfileColumn[];
6
+ resultColumns?: DataTableServerColumn[];
7
+ renderedQuery: string;
8
+ };
9
+ export declare function profileSampleQueryResult(response: ProfileSampleResponse): QueryBrowserResult;
10
+ export declare function profileSampleFilterColumns(response: ProfileSampleResponse): ProfileColumn[];
11
+ //# sourceMappingURL=profileSampleResult.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileSampleResult.d.ts","sourceRoot":"","sources":["../../../src/profiles/query/profileSampleResult.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAClF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,GAAG;IACxE,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qBAAqB,GAC9B,kBAAkB,CAcpB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,qBAAqB,GAC9B,aAAa,EAAE,CAUjB"}
@@ -0,0 +1,26 @@
1
+ function profileSampleQueryResult(response) {
2
+ if (!Array.isArray(response.resultColumns)) {
3
+ throw new Error("Profile sample response is missing resultColumns");
4
+ }
5
+ const result = {
6
+ ...response,
7
+ columns: response.resultColumns
8
+ };
9
+ delete result.resultColumns;
10
+ delete result.renderedQuery;
11
+ return result;
12
+ }
13
+ function profileSampleFilterColumns(response) {
14
+ if (!Array.isArray(response.resultColumns)) {
15
+ throw new Error("Profile sample response is missing resultColumns");
16
+ }
17
+ const filterable = new Set(
18
+ response.resultColumns.filter((column) => column.filterKey !== void 0).map((column) => column.name)
19
+ );
20
+ return response.columns.filter((column) => filterable.has(column.name));
21
+ }
22
+ export {
23
+ profileSampleFilterColumns,
24
+ profileSampleQueryResult
25
+ };
26
+ //# sourceMappingURL=profileSampleResult.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profileSampleResult.js","sources":["../../../src/profiles/query/profileSampleResult.ts"],"sourcesContent":["import type { DataTableServerColumn } from \"../../data/data-table-server-filters\";\nimport type { QueryBrowserResult } from \"../../data/query-browser/QueryBrowser.types\";\nimport type { ProfileColumn } from \"../wizard/profileWizardModel\";\n\nexport type ProfileSampleResponse = Omit<QueryBrowserResult, \"columns\"> & {\n columns: ProfileColumn[];\n resultColumns?: DataTableServerColumn[];\n renderedQuery: string;\n};\n\nexport function profileSampleQueryResult(\n response: ProfileSampleResponse,\n): QueryBrowserResult {\n if (!Array.isArray(response.resultColumns)) {\n throw new Error(\"Profile sample response is missing resultColumns\");\n }\n const result = {\n ...response,\n columns: response.resultColumns,\n } as QueryBrowserResult & {\n resultColumns?: DataTableServerColumn[];\n renderedQuery?: string;\n };\n delete result.resultColumns;\n delete result.renderedQuery;\n return result;\n}\n\nexport function profileSampleFilterColumns(\n response: ProfileSampleResponse,\n): ProfileColumn[] {\n if (!Array.isArray(response.resultColumns)) {\n throw new Error(\"Profile sample response is missing resultColumns\");\n }\n const filterable = new Set(\n response.resultColumns\n .filter((column) => column.filterKey !== undefined)\n .map((column) => column.name),\n );\n return response.columns.filter((column) => filterable.has(column.name));\n}\n"],"names":[],"mappings":"AAUO,SAAS,yBACd,UACoB;AACpB,MAAI,CAAC,MAAM,QAAQ,SAAS,aAAa,GAAG;AAC1C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,SAAS,SAAS;AAAA,EAAA;AAKpB,SAAO,OAAO;AACd,SAAO,OAAO;AACd,SAAO;AACT;AAEO,SAAS,2BACd,UACiB;AACjB,MAAI,CAAC,MAAM,QAAQ,SAAS,aAAa,GAAG;AAC1C,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,QAAM,aAAa,IAAI;AAAA,IACrB,SAAS,cACN,OAAO,CAAC,WAAW,OAAO,cAAc,MAAS,EACjD,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,EAAA;AAEhC,SAAO,SAAS,QAAQ,OAAO,CAAC,WAAW,WAAW,IAAI,OAAO,IAAI,CAAC;AACxE;"}
@@ -8,7 +8,8 @@ function QueryTargetPicker({
8
8
  label,
9
9
  inspection,
10
10
  value,
11
- onChange
11
+ onChange,
12
+ discoverable = true
12
13
  }) {
13
14
  const options = react.useMemo(
14
15
  () => connectionBrowserModel.openSearchIndexOptions(inspection.data),
@@ -23,7 +24,7 @@ function QueryTargetPicker({
23
24
  value,
24
25
  onChange: (next) => onChange(next, connectionBrowserModel.openSearchTargetKind(inspection.data, next)),
25
26
  options,
26
- placeholder: inspection.error ? "Unavailable — check the connection" : `Select ${label.toLowerCase()} or type a wildcard…`,
27
+ placeholder: inspection.error ? "Unavailable — check the connection" : discoverable ? `Select ${label.toLowerCase()} or type a wildcard…` : `Enter ${label.toLowerCase()}…`,
27
28
  loading: inspection.loading,
28
29
  invalid: Boolean(inspection.error),
29
30
  allowCustomValue: true,
@@ -34,7 +35,8 @@ function QueryTargetPicker({
34
35
  ] });
35
36
  }
36
37
  function targetErrorMessage(error) {
37
- if (error instanceof Error && error.message.trim()) return error.message.trim();
38
+ if (error instanceof Error && error.message.trim())
39
+ return error.message.trim();
38
40
  if (typeof error === "string" && error.trim()) return error.trim();
39
41
  return "The inspection request failed. Check the connection settings and try again.";
40
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"queryTargetPicker.cjs","sources":["../../../src/profiles/query/queryTargetPicker.tsx"],"sourcesContent":["/**\n * The flat target a query runs against — an OpenSearch index, alias, data\n * stream, or the wildcard a daily rotation rolls up into. A hundred timestamped\n * index names is a searchable list, not a hierarchy, so this replaces the\n * catalog tree wherever the server declares an index target.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport { useMemo } from \"react\";\nimport {\n openSearchIndexOptions,\n openSearchTargetKind,\n type Inspection,\n} from \"../connections/connectionBrowserModel\";\n\nexport function QueryTargetPicker({\n label,\n inspection,\n value,\n onChange,\n}: {\n label: string;\n inspection: Inspection;\n value: string;\n onChange: (target: string, kind: string) => void;\n}) {\n const options = useMemo(\n () => openSearchIndexOptions(inspection.data),\n [inspection.data],\n );\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Combobox\n ariaLabel={label}\n label={label}\n value={value}\n onChange={(next) => onChange(next, openSearchTargetKind(inspection.data, next))}\n options={options}\n placeholder={\n inspection.error\n ? \"Unavailable — check the connection\"\n : `Select ${label.toLowerCase()} or type a wildcard…`\n }\n loading={inspection.loading}\n invalid={Boolean(inspection.error)}\n allowCustomValue\n className=\"min-w-0\"\n />\n {inspection.error ? (\n <p role=\"alert\" className=\"break-words text-xs text-destructive\">\n {targetErrorMessage(inspection.error)}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction targetErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim()) return error.message.trim();\n if (typeof error === \"string\" && error.trim()) return error.trim();\n return \"The inspection request failed. Check the connection settings and try again.\";\n}\n"],"names":["useMemo","openSearchIndexOptions","jsxs","jsx","Combobox","openSearchTargetKind"],"mappings":";;;;;;AAeO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,UAAUA,MAAAA;AAAAA,IACd,MAAMC,uBAAAA,uBAAuB,WAAW,IAAI;AAAA,IAC5C,CAAC,WAAW,IAAI;AAAA,EAAA;AAElB,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAACC,SAAAA;AAAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU,CAAC,SAAS,SAAS,MAAMC,uBAAAA,qBAAqB,WAAW,MAAM,IAAI,CAAC;AAAA,QAC9E;AAAA,QACA,aACE,WAAW,QACP,uCACA,UAAU,MAAM,aAAa;AAAA,QAEnC,SAAS,WAAW;AAAA,QACpB,SAAS,QAAQ,WAAW,KAAK;AAAA,QACjC,kBAAgB;AAAA,QAChB,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,WAAW,QACVF,2BAAAA,IAAC,KAAA,EAAE,MAAK,SAAQ,WAAU,wCACvB,UAAA,mBAAmB,WAAW,KAAK,EAAA,CACtC,IACE;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,iBAAiB,SAAS,MAAM,QAAQ,OAAQ,QAAO,MAAM,QAAQ,KAAA;AACzE,MAAI,OAAO,UAAU,YAAY,MAAM,OAAQ,QAAO,MAAM,KAAA;AAC5D,SAAO;AACT;;"}
1
+ {"version":3,"file":"queryTargetPicker.cjs","sources":["../../../src/profiles/query/queryTargetPicker.tsx"],"sourcesContent":["/**\n * The flat target a query runs against — an OpenSearch index, alias, data\n * stream, or the wildcard a daily rotation rolls up into. A hundred timestamped\n * index names is a searchable list, not a hierarchy, so this replaces the\n * catalog tree wherever the server declares an index target.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport { useMemo } from \"react\";\nimport {\n openSearchIndexOptions,\n openSearchTargetKind,\n} from \"../connections/connectionBrowserModel\";\nimport type { Inspection } from \"../connections/useInspection\";\n\nexport function QueryTargetPicker({\n label,\n inspection,\n value,\n onChange,\n discoverable = true,\n}: {\n label: string;\n inspection: Inspection;\n value: string;\n onChange: (target: string, kind: string) => void;\n discoverable?: boolean;\n}) {\n const options = useMemo(\n () => openSearchIndexOptions(inspection.data),\n [inspection.data],\n );\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Combobox\n ariaLabel={label}\n label={label}\n value={value}\n onChange={(next) =>\n onChange(next, openSearchTargetKind(inspection.data, next))\n }\n options={options}\n placeholder={\n inspection.error\n ? \"Unavailable — check the connection\"\n : discoverable\n ? `Select ${label.toLowerCase()} or type a wildcard…`\n : `Enter ${label.toLowerCase()}…`\n }\n loading={inspection.loading}\n invalid={Boolean(inspection.error)}\n allowCustomValue\n className=\"min-w-0\"\n />\n {inspection.error ? (\n <p role=\"alert\" className=\"break-words text-xs text-destructive\">\n {targetErrorMessage(inspection.error)}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction targetErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim())\n return error.message.trim();\n if (typeof error === \"string\" && error.trim()) return error.trim();\n return \"The inspection request failed. Check the connection settings and try again.\";\n}\n"],"names":["useMemo","openSearchIndexOptions","jsxs","jsx","Combobox","openSearchTargetKind"],"mappings":";;;;;;AAeO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAMG;AACD,QAAM,UAAUA,MAAAA;AAAAA,IACd,MAAMC,uBAAAA,uBAAuB,WAAW,IAAI;AAAA,IAC5C,CAAC,WAAW,IAAI;AAAA,EAAA;AAElB,SACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAACC,SAAAA;AAAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU,CAAC,SACT,SAAS,MAAMC,uBAAAA,qBAAqB,WAAW,MAAM,IAAI,CAAC;AAAA,QAE5D;AAAA,QACA,aACE,WAAW,QACP,uCACA,eACE,UAAU,MAAM,YAAA,CAAa,yBAC7B,SAAS,MAAM,aAAa;AAAA,QAEpC,SAAS,WAAW;AAAA,QACpB,SAAS,QAAQ,WAAW,KAAK;AAAA,QACjC,kBAAgB;AAAA,QAChB,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,WAAW,QACVF,2BAAAA,IAAC,KAAA,EAAE,MAAK,SAAQ,WAAU,wCACvB,UAAA,mBAAmB,WAAW,KAAK,EAAA,CACtC,IACE;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,iBAAiB,SAAS,MAAM,QAAQ,KAAA;AAC1C,WAAO,MAAM,QAAQ,KAAA;AACvB,MAAI,OAAO,UAAU,YAAY,MAAM,OAAQ,QAAO,MAAM,KAAA;AAC5D,SAAO;AACT;;"}
@@ -1,8 +1,9 @@
1
- import { Inspection } from '../connections/connectionBrowserModel';
2
- export declare function QueryTargetPicker({ label, inspection, value, onChange, }: {
1
+ import { Inspection } from '../connections/useInspection';
2
+ export declare function QueryTargetPicker({ label, inspection, value, onChange, discoverable, }: {
3
3
  label: string;
4
4
  inspection: Inspection;
5
5
  value: string;
6
6
  onChange: (target: string, kind: string) => void;
7
+ discoverable?: boolean;
7
8
  }): import("react/jsx-runtime").JSX.Element;
8
9
  //# sourceMappingURL=queryTargetPicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queryTargetPicker.d.ts","sourceRoot":"","sources":["../../../src/profiles/query/queryTargetPicker.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,uCAAuC,CAAC;AAE/C,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,UAAU,EACV,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD,2CA8BA"}
1
+ {"version":3,"file":"queryTargetPicker.d.ts","sourceRoot":"","sources":["../../../src/profiles/query/queryTargetPicker.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,UAAU,EACV,KAAK,EACL,QAAQ,EACR,YAAmB,GACpB,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,UAAU,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,2CAkCA"}
@@ -6,7 +6,8 @@ function QueryTargetPicker({
6
6
  label,
7
7
  inspection,
8
8
  value,
9
- onChange
9
+ onChange,
10
+ discoverable = true
10
11
  }) {
11
12
  const options = useMemo(
12
13
  () => openSearchIndexOptions(inspection.data),
@@ -21,7 +22,7 @@ function QueryTargetPicker({
21
22
  value,
22
23
  onChange: (next) => onChange(next, openSearchTargetKind(inspection.data, next)),
23
24
  options,
24
- placeholder: inspection.error ? "Unavailable — check the connection" : `Select ${label.toLowerCase()} or type a wildcard…`,
25
+ placeholder: inspection.error ? "Unavailable — check the connection" : discoverable ? `Select ${label.toLowerCase()} or type a wildcard…` : `Enter ${label.toLowerCase()}…`,
25
26
  loading: inspection.loading,
26
27
  invalid: Boolean(inspection.error),
27
28
  allowCustomValue: true,
@@ -32,7 +33,8 @@ function QueryTargetPicker({
32
33
  ] });
33
34
  }
34
35
  function targetErrorMessage(error) {
35
- if (error instanceof Error && error.message.trim()) return error.message.trim();
36
+ if (error instanceof Error && error.message.trim())
37
+ return error.message.trim();
36
38
  if (typeof error === "string" && error.trim()) return error.trim();
37
39
  return "The inspection request failed. Check the connection settings and try again.";
38
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"queryTargetPicker.js","sources":["../../../src/profiles/query/queryTargetPicker.tsx"],"sourcesContent":["/**\n * The flat target a query runs against — an OpenSearch index, alias, data\n * stream, or the wildcard a daily rotation rolls up into. A hundred timestamped\n * index names is a searchable list, not a hierarchy, so this replaces the\n * catalog tree wherever the server declares an index target.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport { useMemo } from \"react\";\nimport {\n openSearchIndexOptions,\n openSearchTargetKind,\n type Inspection,\n} from \"../connections/connectionBrowserModel\";\n\nexport function QueryTargetPicker({\n label,\n inspection,\n value,\n onChange,\n}: {\n label: string;\n inspection: Inspection;\n value: string;\n onChange: (target: string, kind: string) => void;\n}) {\n const options = useMemo(\n () => openSearchIndexOptions(inspection.data),\n [inspection.data],\n );\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Combobox\n ariaLabel={label}\n label={label}\n value={value}\n onChange={(next) => onChange(next, openSearchTargetKind(inspection.data, next))}\n options={options}\n placeholder={\n inspection.error\n ? \"Unavailable — check the connection\"\n : `Select ${label.toLowerCase()} or type a wildcard…`\n }\n loading={inspection.loading}\n invalid={Boolean(inspection.error)}\n allowCustomValue\n className=\"min-w-0\"\n />\n {inspection.error ? (\n <p role=\"alert\" className=\"break-words text-xs text-destructive\">\n {targetErrorMessage(inspection.error)}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction targetErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim()) return error.message.trim();\n if (typeof error === \"string\" && error.trim()) return error.trim();\n return \"The inspection request failed. Check the connection settings and try again.\";\n}\n"],"names":[],"mappings":";;;;AAeO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,UAAU;AAAA,IACd,MAAM,uBAAuB,WAAW,IAAI;AAAA,IAC5C,CAAC,WAAW,IAAI;AAAA,EAAA;AAElB,SACE,qBAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU,CAAC,SAAS,SAAS,MAAM,qBAAqB,WAAW,MAAM,IAAI,CAAC;AAAA,QAC9E;AAAA,QACA,aACE,WAAW,QACP,uCACA,UAAU,MAAM,aAAa;AAAA,QAEnC,SAAS,WAAW;AAAA,QACpB,SAAS,QAAQ,WAAW,KAAK;AAAA,QACjC,kBAAgB;AAAA,QAChB,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,WAAW,QACV,oBAAC,KAAA,EAAE,MAAK,SAAQ,WAAU,wCACvB,UAAA,mBAAmB,WAAW,KAAK,EAAA,CACtC,IACE;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,iBAAiB,SAAS,MAAM,QAAQ,OAAQ,QAAO,MAAM,QAAQ,KAAA;AACzE,MAAI,OAAO,UAAU,YAAY,MAAM,OAAQ,QAAO,MAAM,KAAA;AAC5D,SAAO;AACT;"}
1
+ {"version":3,"file":"queryTargetPicker.js","sources":["../../../src/profiles/query/queryTargetPicker.tsx"],"sourcesContent":["/**\n * The flat target a query runs against — an OpenSearch index, alias, data\n * stream, or the wildcard a daily rotation rolls up into. A hundred timestamped\n * index names is a searchable list, not a hierarchy, so this replaces the\n * catalog tree wherever the server declares an index target.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport { useMemo } from \"react\";\nimport {\n openSearchIndexOptions,\n openSearchTargetKind,\n} from \"../connections/connectionBrowserModel\";\nimport type { Inspection } from \"../connections/useInspection\";\n\nexport function QueryTargetPicker({\n label,\n inspection,\n value,\n onChange,\n discoverable = true,\n}: {\n label: string;\n inspection: Inspection;\n value: string;\n onChange: (target: string, kind: string) => void;\n discoverable?: boolean;\n}) {\n const options = useMemo(\n () => openSearchIndexOptions(inspection.data),\n [inspection.data],\n );\n return (\n <div className=\"flex min-w-0 flex-col gap-1\">\n <Combobox\n ariaLabel={label}\n label={label}\n value={value}\n onChange={(next) =>\n onChange(next, openSearchTargetKind(inspection.data, next))\n }\n options={options}\n placeholder={\n inspection.error\n ? \"Unavailable — check the connection\"\n : discoverable\n ? `Select ${label.toLowerCase()} or type a wildcard…`\n : `Enter ${label.toLowerCase()}…`\n }\n loading={inspection.loading}\n invalid={Boolean(inspection.error)}\n allowCustomValue\n className=\"min-w-0\"\n />\n {inspection.error ? (\n <p role=\"alert\" className=\"break-words text-xs text-destructive\">\n {targetErrorMessage(inspection.error)}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction targetErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message.trim())\n return error.message.trim();\n if (typeof error === \"string\" && error.trim()) return error.trim();\n return \"The inspection request failed. Check the connection settings and try again.\";\n}\n"],"names":[],"mappings":";;;;AAeO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,GAMG;AACD,QAAM,UAAU;AAAA,IACd,MAAM,uBAAuB,WAAW,IAAI;AAAA,IAC5C,CAAC,WAAW,IAAI;AAAA,EAAA;AAElB,SACE,qBAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,UAAU,CAAC,SACT,SAAS,MAAM,qBAAqB,WAAW,MAAM,IAAI,CAAC;AAAA,QAE5D;AAAA,QACA,aACE,WAAW,QACP,uCACA,eACE,UAAU,MAAM,YAAA,CAAa,yBAC7B,SAAS,MAAM,aAAa;AAAA,QAEpC,SAAS,WAAW;AAAA,QACpB,SAAS,QAAQ,WAAW,KAAK;AAAA,QACjC,kBAAgB;AAAA,QAChB,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEX,WAAW,QACV,oBAAC,KAAA,EAAE,MAAK,SAAQ,WAAU,wCACvB,UAAA,mBAAmB,WAAW,KAAK,EAAA,CACtC,IACE;AAAA,EAAA,GACN;AAEJ;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI,iBAAiB,SAAS,MAAM,QAAQ,KAAA;AAC1C,WAAO,MAAM,QAAQ,KAAA;AACvB,MAAI,OAAO,UAAU,YAAY,MAAM,OAAQ,QAAO,MAAM,KAAA;AAC5D,SAAO;AACT;"}
@@ -192,13 +192,20 @@ function ProfileWizard({
192
192
  setDraft({
193
193
  ...draft.namespace !== void 0 ? { namespace: draft.namespace } : {},
194
194
  provider: {
195
- type: choice.providerType,
195
+ // The first candidate is the most specific one. Where the
196
+ // connection type is read by several providers the step
197
+ // offers the choice, and this is only what it opens on.
198
+ ...choice.providerTypes[0] ? { type: choice.providerTypes[0] } : {},
196
199
  connection: choice.value
197
200
  }
198
201
  });
199
202
  setDiscovered([]);
200
203
  setActiveField("");
201
- }
204
+ },
205
+ onProviderTypeChange: (type) => setDraft({
206
+ ...draft,
207
+ provider: { ...draft.provider, type }
208
+ })
202
209
  }
203
210
  ) : null,
204
211
  step.id === "query" && connectionID ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -239,13 +246,15 @@ function cloneInitialDraft(value) {
239
246
  }
240
247
  function connectionChoice(value, node) {
241
248
  const label = clickyNodeText(node) || value;
242
- const providerType = profileWizardModel.providerTypeFromConnectionLabel(label);
243
- if (!providerType) return null;
249
+ const connectionType = profileWizardModel.connectionTypeFromLabel(label);
250
+ if (!connectionType) return null;
251
+ const providerTypes = profileWizardModel.providerTypesForConnectionType(connectionType);
244
252
  return {
245
253
  value,
246
254
  label,
247
255
  name: profileWizardModel.profileConnectionID(value) ?? label,
248
- providerType
256
+ connectionType,
257
+ providerTypes
249
258
  };
250
259
  }
251
260
  function clickyNodeText(node) {
@@ -1 +1 @@
1
- {"version":3,"file":"profileWizard.cjs","sources":["../../../src/profiles/wizard/profileWizard.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport type { ClickyNode } from \"../../data/Clicky\";\nimport { Modal } from \"../../overlay/Modal\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { ProfileWizardQueryStep, type ProfileSample } from \"./profileWizardQueryStep\";\nimport {\n profileConnectionID,\n profileWizardErrorMessage,\n profileWizardStepReady,\n profileWizardSteps,\n providerTypeFromConnectionLabel,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"./profileWizardModel\";\nimport {\n FieldsStep,\n ReviewStep,\n SourceStep,\n WizardProgress,\n type ConnectionChoice,\n} from \"./profileWizardSteps\";\nimport { stepHelp } from \"./profileWizardHelp\";\n\ntype ProfileWizardProps = {\n client: OperationsApiClient;\n action: ResolvedOperation;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: () => void | Promise<void>;\n};\n\nexport function ProfileWizard({\n client,\n action,\n initialValue,\n onClose,\n onSuccess,\n}: ProfileWizardProps) {\n const initialDraft = useMemo(() => cloneInitialDraft(initialValue), [initialValue]);\n const [stepIndex, setStepIndex] = useState(0);\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [connectionSearch, setConnectionSearch] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const deferredConnectionSearch = useDeferredValue(connectionSearch);\n const connections = useQuery({\n queryKey: [\"profile-wizard-connections\", deferredConnectionSearch],\n queryFn: () => {\n if (!client.lookupFilterOptions) {\n throw new Error(\"Connection lookup is unavailable\");\n }\n return client.lookupFilterOptions(\n \"/api/v1/connection\",\n \"GET\",\n \"connection\",\n deferredConnectionSearch,\n );\n },\n retry: 0,\n });\n const connectionChoices = useMemo(\n () =>\n Object.entries(connections.data?.options ?? {})\n .map(([value, node]) => connectionChoice(value, node))\n .filter((choice): choice is ConnectionChoice => choice != null)\n .sort((left, right) => left.name.localeCompare(right.name)),\n [connections.data?.options],\n );\n const step = profileWizardSteps[stepIndex];\n // stepIndex only ever moves between 0 and the last step, so an out-of-range\n // one is a broken navigation guard rather than a state the UI should render\n // around — say so instead of rendering a wizard with no current step.\n if (!step) throw new Error(`wizard step ${stepIndex} is out of range`);\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const currentStepReady = profileWizardStepReady(\n step.id,\n draft,\n discovered,\n );\n\n const updateQueryDraft = (next: ProfileWizardDraft) => {\n if (next.query !== draft.query) setDiscovered([]);\n setDraft(next);\n };\n\n const acceptSample = ({ columns }: ProfileSample) => {\n setDiscovered(columns);\n setActiveField((current) =>\n columns.some((field) => field.name === current)\n ? current\n : (columns[0]?.name ?? \"\"),\n );\n setDraft((current) => {\n const configuredByName = new Map(\n (current.columns ?? []).map((field) => [field.name, field]),\n );\n return {\n ...current,\n columns:\n configuredByName.size === 0\n ? columns\n : columns\n .filter((field) => configuredByName.has(field.name))\n .map((field) => ({\n ...field,\n ...configuredByName.get(field.name),\n })),\n };\n });\n };\n\n const save = async () => {\n setSaving(true);\n setError(\"\");\n try {\n if (!client.submitForm) {\n throw new Error(\"Profile creation is unavailable\");\n }\n const response = await client.submitForm(action.path, action.method, draft);\n if (!response.success) {\n throw new Error(\n response.error || response.message || \"Profile creation failed\",\n );\n }\n await onSuccess();\n } catch (saveError) {\n setError(profileWizardErrorMessage(saveError, \"Profile creation failed\"));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n confirmClose={\n stepIndex > 0 || draft.query\n ? {\n title: \"Discard this profile?\",\n message: \"Your query and field configuration will be lost.\",\n confirmLabel: \"Discard profile\",\n }\n : false\n }\n title=\"Build a profile\"\n subtitle={\n <WizardProgress\n stepIndex={stepIndex}\n onStepChange={(next) => {\n if (next < stepIndex) setStepIndex(next);\n }}\n />\n }\n size=\"full\"\n className=\"h-[calc(100dvh-2rem)]\"\n scrollBody={false}\n footer={\n <div className=\"flex w-full items-center gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n Step {stepIndex + 1} of {profileWizardSteps.length}\n </span>\n {error ? (\n <span className=\"ml-3 text-sm text-destructive\">{error}</span>\n ) : null}\n <div className=\"ml-auto flex gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n {stepIndex > 0 ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={saving}\n onClick={() => setStepIndex((current) => current - 1)}\n >\n Back\n </Button>\n ) : null}\n {stepIndex < profileWizardSteps.length - 1 ? (\n <Button\n type=\"button\"\n disabled={!currentStepReady}\n onClick={() => setStepIndex((current) => current + 1)}\n >\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n disabled={!currentStepReady || saving}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n )}\n </div>\n </div>\n }\n >\n <div className=\"flex h-full min-h-0 flex-col gap-5\">\n <div className=\"shrink-0\">\n <p className=\"text-xs font-semibold uppercase tracking-[0.18em] text-primary\">\n {step.description}\n </p>\n <h2 className=\"mt-1 text-xl font-semibold\">{step.label}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {stepHelp[step.id]}\n </p>\n </div>\n <div key={step.id} className=\"min-h-0 flex-1 overflow-auto\">\n {step.id === \"source\" ? (\n <SourceStep\n choices={connectionChoices}\n loading={connections.isLoading}\n error={connections.error}\n {...(connections.data?.truncated !== undefined\n ? { truncated: connections.data.truncated }\n : {})}\n {...(connections.data?.total !== undefined\n ? { total: connections.data.total }\n : {})}\n search={connectionSearch}\n selected={draft.provider?.connection ?? \"\"}\n selectedType={draft.provider?.type ?? \"\"}\n onSearchChange={setConnectionSearch}\n onSelect={(choice) => {\n if (choice.value === draft.provider?.connection) return;\n setDraft({\n ...(draft.namespace !== undefined\n ? { namespace: draft.namespace }\n : {}),\n provider: {\n type: choice.providerType,\n connection: choice.value,\n },\n });\n setDiscovered([]);\n setActiveField(\"\");\n }}\n />\n ) : null}\n {step.id === \"query\" && connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={updateQueryDraft}\n onSample={acceptSample}\n />\n ) : null}\n {step.id === \"fields\" ? (\n <FieldsStep\n draft={draft}\n discovered={discovered}\n activeField={activeField}\n onDraftChange={setDraft}\n onActiveFieldChange={setActiveField}\n />\n ) : null}\n {step.id === \"review\" ? (\n <ReviewStep draft={draft} discovered={discovered} />\n ) : null}\n </div>\n </div>\n </Modal>\n );\n}\n\nfunction cloneInitialDraft(value: Record<string, unknown>): ProfileWizardDraft {\n const draft = value as ProfileWizardDraft;\n return {\n ...draft,\n provider: draft.provider ? { ...draft.provider } : {},\n columns: draft.columns?.map((column) => ({ ...column })) ?? [],\n };\n}\n\nfunction connectionChoice(\n value: string,\n node: ClickyNode,\n): ConnectionChoice | null {\n const label = clickyNodeText(node) || value;\n const providerType = providerTypeFromConnectionLabel(label);\n if (!providerType) return null;\n return {\n value,\n label,\n name: profileConnectionID(value) ?? label,\n providerType,\n };\n}\n\nfunction clickyNodeText(node: ClickyNode): string {\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map(clickyNodeText).join(\"\");\n}\n"],"names":["useMemo","useState","useDeferredValue","useQuery","_a","profileWizardSteps","profileConnectionID","profileWizardStepReady","profileWizardErrorMessage","jsx","Modal","WizardProgress","jsxs","Button","stepHelp","SourceStep","ProfileWizardQueryStep","FieldsStep","ReviewStep","providerTypeFromConnectionLabel"],"mappings":"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"}
1
+ {"version":3,"file":"profileWizard.cjs","sources":["../../../src/profiles/wizard/profileWizard.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport type { ClickyNode } from \"../../data/Clicky\";\nimport { Modal } from \"../../overlay/Modal\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { ProfileWizardQueryStep, type ProfileSample } from \"./profileWizardQueryStep\";\nimport {\n profileConnectionID,\n profileWizardErrorMessage,\n profileWizardStepReady,\n profileWizardSteps,\n connectionTypeFromLabel,\n providerTypesForConnectionType,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"./profileWizardModel\";\nimport {\n FieldsStep,\n ReviewStep,\n SourceStep,\n WizardProgress,\n type ConnectionChoice,\n} from \"./profileWizardSteps\";\nimport { stepHelp } from \"./profileWizardHelp\";\n\ntype ProfileWizardProps = {\n client: OperationsApiClient;\n action: ResolvedOperation;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: () => void | Promise<void>;\n};\n\nexport function ProfileWizard({\n client,\n action,\n initialValue,\n onClose,\n onSuccess,\n}: ProfileWizardProps) {\n const initialDraft = useMemo(() => cloneInitialDraft(initialValue), [initialValue]);\n const [stepIndex, setStepIndex] = useState(0);\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [connectionSearch, setConnectionSearch] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const deferredConnectionSearch = useDeferredValue(connectionSearch);\n const connections = useQuery({\n queryKey: [\"profile-wizard-connections\", deferredConnectionSearch],\n queryFn: () => {\n if (!client.lookupFilterOptions) {\n throw new Error(\"Connection lookup is unavailable\");\n }\n return client.lookupFilterOptions(\n \"/api/v1/connection\",\n \"GET\",\n \"connection\",\n deferredConnectionSearch,\n );\n },\n retry: 0,\n });\n const connectionChoices = useMemo(\n () =>\n Object.entries(connections.data?.options ?? {})\n .map(([value, node]) => connectionChoice(value, node))\n .filter((choice): choice is ConnectionChoice => choice != null)\n .sort((left, right) => left.name.localeCompare(right.name)),\n [connections.data?.options],\n );\n const step = profileWizardSteps[stepIndex];\n // stepIndex only ever moves between 0 and the last step, so an out-of-range\n // one is a broken navigation guard rather than a state the UI should render\n // around — say so instead of rendering a wizard with no current step.\n if (!step) throw new Error(`wizard step ${stepIndex} is out of range`);\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const currentStepReady = profileWizardStepReady(\n step.id,\n draft,\n discovered,\n );\n\n const updateQueryDraft = (next: ProfileWizardDraft) => {\n if (next.query !== draft.query) setDiscovered([]);\n setDraft(next);\n };\n\n const acceptSample = ({ columns }: ProfileSample) => {\n setDiscovered(columns);\n setActiveField((current) =>\n columns.some((field) => field.name === current)\n ? current\n : (columns[0]?.name ?? \"\"),\n );\n setDraft((current) => {\n const configuredByName = new Map(\n (current.columns ?? []).map((field) => [field.name, field]),\n );\n return {\n ...current,\n columns:\n configuredByName.size === 0\n ? columns\n : columns\n .filter((field) => configuredByName.has(field.name))\n .map((field) => ({\n ...field,\n ...configuredByName.get(field.name),\n })),\n };\n });\n };\n\n const save = async () => {\n setSaving(true);\n setError(\"\");\n try {\n if (!client.submitForm) {\n throw new Error(\"Profile creation is unavailable\");\n }\n const response = await client.submitForm(action.path, action.method, draft);\n if (!response.success) {\n throw new Error(\n response.error || response.message || \"Profile creation failed\",\n );\n }\n await onSuccess();\n } catch (saveError) {\n setError(profileWizardErrorMessage(saveError, \"Profile creation failed\"));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n confirmClose={\n stepIndex > 0 || draft.query\n ? {\n title: \"Discard this profile?\",\n message: \"Your query and field configuration will be lost.\",\n confirmLabel: \"Discard profile\",\n }\n : false\n }\n title=\"Build a profile\"\n subtitle={\n <WizardProgress\n stepIndex={stepIndex}\n onStepChange={(next) => {\n if (next < stepIndex) setStepIndex(next);\n }}\n />\n }\n size=\"full\"\n className=\"h-[calc(100dvh-2rem)]\"\n scrollBody={false}\n footer={\n <div className=\"flex w-full items-center gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n Step {stepIndex + 1} of {profileWizardSteps.length}\n </span>\n {error ? (\n <span className=\"ml-3 text-sm text-destructive\">{error}</span>\n ) : null}\n <div className=\"ml-auto flex gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n {stepIndex > 0 ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={saving}\n onClick={() => setStepIndex((current) => current - 1)}\n >\n Back\n </Button>\n ) : null}\n {stepIndex < profileWizardSteps.length - 1 ? (\n <Button\n type=\"button\"\n disabled={!currentStepReady}\n onClick={() => setStepIndex((current) => current + 1)}\n >\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n disabled={!currentStepReady || saving}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n )}\n </div>\n </div>\n }\n >\n <div className=\"flex h-full min-h-0 flex-col gap-5\">\n <div className=\"shrink-0\">\n <p className=\"text-xs font-semibold uppercase tracking-[0.18em] text-primary\">\n {step.description}\n </p>\n <h2 className=\"mt-1 text-xl font-semibold\">{step.label}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {stepHelp[step.id]}\n </p>\n </div>\n <div key={step.id} className=\"min-h-0 flex-1 overflow-auto\">\n {step.id === \"source\" ? (\n <SourceStep\n choices={connectionChoices}\n loading={connections.isLoading}\n error={connections.error}\n {...(connections.data?.truncated !== undefined\n ? { truncated: connections.data.truncated }\n : {})}\n {...(connections.data?.total !== undefined\n ? { total: connections.data.total }\n : {})}\n search={connectionSearch}\n selected={draft.provider?.connection ?? \"\"}\n selectedType={draft.provider?.type ?? \"\"}\n onSearchChange={setConnectionSearch}\n onSelect={(choice) => {\n if (choice.value === draft.provider?.connection) return;\n setDraft({\n ...(draft.namespace !== undefined\n ? { namespace: draft.namespace }\n : {}),\n provider: {\n // The first candidate is the most specific one. Where the\n // connection type is read by several providers the step\n // offers the choice, and this is only what it opens on.\n ...(choice.providerTypes[0]\n ? { type: choice.providerTypes[0] }\n : {}),\n connection: choice.value,\n },\n });\n setDiscovered([]);\n setActiveField(\"\");\n }}\n onProviderTypeChange={(type) =>\n setDraft({\n ...draft,\n provider: { ...draft.provider, type },\n })\n }\n />\n ) : null}\n {step.id === \"query\" && connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={updateQueryDraft}\n onSample={acceptSample}\n />\n ) : null}\n {step.id === \"fields\" ? (\n <FieldsStep\n draft={draft}\n discovered={discovered}\n activeField={activeField}\n onDraftChange={setDraft}\n onActiveFieldChange={setActiveField}\n />\n ) : null}\n {step.id === \"review\" ? (\n <ReviewStep draft={draft} discovered={discovered} />\n ) : null}\n </div>\n </div>\n </Modal>\n );\n}\n\nfunction cloneInitialDraft(value: Record<string, unknown>): ProfileWizardDraft {\n const draft = value as ProfileWizardDraft;\n return {\n ...draft,\n provider: draft.provider ? { ...draft.provider } : {},\n columns: draft.columns?.map((column) => ({ ...column })) ?? [],\n };\n}\n\nfunction connectionChoice(\n value: string,\n node: ClickyNode,\n): ConnectionChoice | null {\n const label = clickyNodeText(node) || value;\n const connectionType = connectionTypeFromLabel(label);\n if (!connectionType) return null;\n // A connection no provider reads is still listed, with an empty candidate\n // set: the Source step says so rather than the wizard emitting a draft whose\n // provider.type is not in the schema's enum.\n const providerTypes = providerTypesForConnectionType(connectionType);\n return {\n value,\n label,\n name: profileConnectionID(value) ?? label,\n connectionType,\n providerTypes,\n };\n}\n\nfunction clickyNodeText(node: ClickyNode): string {\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map(clickyNodeText).join(\"\");\n}\n"],"names":["useMemo","useState","useDeferredValue","useQuery","_a","profileWizardSteps","profileConnectionID","profileWizardStepReady","profileWizardErrorMessage","jsx","Modal","WizardProgress","jsxs","Button","stepHelp","SourceStep","ProfileWizardQueryStep","FieldsStep","ReviewStep","connectionTypeFromLabel","providerTypesForConnectionType"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"profileWizard.d.ts","sourceRoot":"","sources":["../../../src/profiles/wizard/profileWizard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAsBnE,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,MAAM,EACN,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE,kBAAkB,2CA6OpB"}
1
+ {"version":3,"file":"profileWizard.d.ts","sourceRoot":"","sources":["../../../src/profiles/wizard/profileWizard.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAuBnE,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,MAAM,EACN,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE,kBAAkB,2CAwPpB"}
@@ -4,7 +4,7 @@ import { Modal } from "../../overlay/Modal.js";
4
4
  import { useQuery } from "@tanstack/react-query";
5
5
  import { useMemo, useState, useDeferredValue } from "react";
6
6
  import { ProfileWizardQueryStep } from "./profileWizardQueryStep.js";
7
- import { profileWizardSteps, profileConnectionID, profileWizardStepReady, providerTypeFromConnectionLabel, profileWizardErrorMessage } from "./profileWizardModel.js";
7
+ import { profileWizardSteps, profileConnectionID, profileWizardStepReady, connectionTypeFromLabel, providerTypesForConnectionType, profileWizardErrorMessage } from "./profileWizardModel.js";
8
8
  import { SourceStep, FieldsStep, ReviewStep, WizardProgress } from "./profileWizardSteps.js";
9
9
  import { stepHelp } from "./profileWizardHelp.js";
10
10
  function ProfileWizard({
@@ -190,13 +190,20 @@ function ProfileWizard({
190
190
  setDraft({
191
191
  ...draft.namespace !== void 0 ? { namespace: draft.namespace } : {},
192
192
  provider: {
193
- type: choice.providerType,
193
+ // The first candidate is the most specific one. Where the
194
+ // connection type is read by several providers the step
195
+ // offers the choice, and this is only what it opens on.
196
+ ...choice.providerTypes[0] ? { type: choice.providerTypes[0] } : {},
194
197
  connection: choice.value
195
198
  }
196
199
  });
197
200
  setDiscovered([]);
198
201
  setActiveField("");
199
- }
202
+ },
203
+ onProviderTypeChange: (type) => setDraft({
204
+ ...draft,
205
+ provider: { ...draft.provider, type }
206
+ })
200
207
  }
201
208
  ) : null,
202
209
  step.id === "query" && connectionID ? /* @__PURE__ */ jsx(
@@ -237,13 +244,15 @@ function cloneInitialDraft(value) {
237
244
  }
238
245
  function connectionChoice(value, node) {
239
246
  const label = clickyNodeText(node) || value;
240
- const providerType = providerTypeFromConnectionLabel(label);
241
- if (!providerType) return null;
247
+ const connectionType = connectionTypeFromLabel(label);
248
+ if (!connectionType) return null;
249
+ const providerTypes = providerTypesForConnectionType(connectionType);
242
250
  return {
243
251
  value,
244
252
  label,
245
253
  name: profileConnectionID(value) ?? label,
246
- providerType
254
+ connectionType,
255
+ providerTypes
247
256
  };
248
257
  }
249
258
  function clickyNodeText(node) {
@@ -1 +1 @@
1
- {"version":3,"file":"profileWizard.js","sources":["../../../src/profiles/wizard/profileWizard.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport type { ClickyNode } from \"../../data/Clicky\";\nimport { Modal } from \"../../overlay/Modal\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { ProfileWizardQueryStep, type ProfileSample } from \"./profileWizardQueryStep\";\nimport {\n profileConnectionID,\n profileWizardErrorMessage,\n profileWizardStepReady,\n profileWizardSteps,\n providerTypeFromConnectionLabel,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"./profileWizardModel\";\nimport {\n FieldsStep,\n ReviewStep,\n SourceStep,\n WizardProgress,\n type ConnectionChoice,\n} from \"./profileWizardSteps\";\nimport { stepHelp } from \"./profileWizardHelp\";\n\ntype ProfileWizardProps = {\n client: OperationsApiClient;\n action: ResolvedOperation;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: () => void | Promise<void>;\n};\n\nexport function ProfileWizard({\n client,\n action,\n initialValue,\n onClose,\n onSuccess,\n}: ProfileWizardProps) {\n const initialDraft = useMemo(() => cloneInitialDraft(initialValue), [initialValue]);\n const [stepIndex, setStepIndex] = useState(0);\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [connectionSearch, setConnectionSearch] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const deferredConnectionSearch = useDeferredValue(connectionSearch);\n const connections = useQuery({\n queryKey: [\"profile-wizard-connections\", deferredConnectionSearch],\n queryFn: () => {\n if (!client.lookupFilterOptions) {\n throw new Error(\"Connection lookup is unavailable\");\n }\n return client.lookupFilterOptions(\n \"/api/v1/connection\",\n \"GET\",\n \"connection\",\n deferredConnectionSearch,\n );\n },\n retry: 0,\n });\n const connectionChoices = useMemo(\n () =>\n Object.entries(connections.data?.options ?? {})\n .map(([value, node]) => connectionChoice(value, node))\n .filter((choice): choice is ConnectionChoice => choice != null)\n .sort((left, right) => left.name.localeCompare(right.name)),\n [connections.data?.options],\n );\n const step = profileWizardSteps[stepIndex];\n // stepIndex only ever moves between 0 and the last step, so an out-of-range\n // one is a broken navigation guard rather than a state the UI should render\n // around — say so instead of rendering a wizard with no current step.\n if (!step) throw new Error(`wizard step ${stepIndex} is out of range`);\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const currentStepReady = profileWizardStepReady(\n step.id,\n draft,\n discovered,\n );\n\n const updateQueryDraft = (next: ProfileWizardDraft) => {\n if (next.query !== draft.query) setDiscovered([]);\n setDraft(next);\n };\n\n const acceptSample = ({ columns }: ProfileSample) => {\n setDiscovered(columns);\n setActiveField((current) =>\n columns.some((field) => field.name === current)\n ? current\n : (columns[0]?.name ?? \"\"),\n );\n setDraft((current) => {\n const configuredByName = new Map(\n (current.columns ?? []).map((field) => [field.name, field]),\n );\n return {\n ...current,\n columns:\n configuredByName.size === 0\n ? columns\n : columns\n .filter((field) => configuredByName.has(field.name))\n .map((field) => ({\n ...field,\n ...configuredByName.get(field.name),\n })),\n };\n });\n };\n\n const save = async () => {\n setSaving(true);\n setError(\"\");\n try {\n if (!client.submitForm) {\n throw new Error(\"Profile creation is unavailable\");\n }\n const response = await client.submitForm(action.path, action.method, draft);\n if (!response.success) {\n throw new Error(\n response.error || response.message || \"Profile creation failed\",\n );\n }\n await onSuccess();\n } catch (saveError) {\n setError(profileWizardErrorMessage(saveError, \"Profile creation failed\"));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n confirmClose={\n stepIndex > 0 || draft.query\n ? {\n title: \"Discard this profile?\",\n message: \"Your query and field configuration will be lost.\",\n confirmLabel: \"Discard profile\",\n }\n : false\n }\n title=\"Build a profile\"\n subtitle={\n <WizardProgress\n stepIndex={stepIndex}\n onStepChange={(next) => {\n if (next < stepIndex) setStepIndex(next);\n }}\n />\n }\n size=\"full\"\n className=\"h-[calc(100dvh-2rem)]\"\n scrollBody={false}\n footer={\n <div className=\"flex w-full items-center gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n Step {stepIndex + 1} of {profileWizardSteps.length}\n </span>\n {error ? (\n <span className=\"ml-3 text-sm text-destructive\">{error}</span>\n ) : null}\n <div className=\"ml-auto flex gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n {stepIndex > 0 ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={saving}\n onClick={() => setStepIndex((current) => current - 1)}\n >\n Back\n </Button>\n ) : null}\n {stepIndex < profileWizardSteps.length - 1 ? (\n <Button\n type=\"button\"\n disabled={!currentStepReady}\n onClick={() => setStepIndex((current) => current + 1)}\n >\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n disabled={!currentStepReady || saving}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n )}\n </div>\n </div>\n }\n >\n <div className=\"flex h-full min-h-0 flex-col gap-5\">\n <div className=\"shrink-0\">\n <p className=\"text-xs font-semibold uppercase tracking-[0.18em] text-primary\">\n {step.description}\n </p>\n <h2 className=\"mt-1 text-xl font-semibold\">{step.label}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {stepHelp[step.id]}\n </p>\n </div>\n <div key={step.id} className=\"min-h-0 flex-1 overflow-auto\">\n {step.id === \"source\" ? (\n <SourceStep\n choices={connectionChoices}\n loading={connections.isLoading}\n error={connections.error}\n {...(connections.data?.truncated !== undefined\n ? { truncated: connections.data.truncated }\n : {})}\n {...(connections.data?.total !== undefined\n ? { total: connections.data.total }\n : {})}\n search={connectionSearch}\n selected={draft.provider?.connection ?? \"\"}\n selectedType={draft.provider?.type ?? \"\"}\n onSearchChange={setConnectionSearch}\n onSelect={(choice) => {\n if (choice.value === draft.provider?.connection) return;\n setDraft({\n ...(draft.namespace !== undefined\n ? { namespace: draft.namespace }\n : {}),\n provider: {\n type: choice.providerType,\n connection: choice.value,\n },\n });\n setDiscovered([]);\n setActiveField(\"\");\n }}\n />\n ) : null}\n {step.id === \"query\" && connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={updateQueryDraft}\n onSample={acceptSample}\n />\n ) : null}\n {step.id === \"fields\" ? (\n <FieldsStep\n draft={draft}\n discovered={discovered}\n activeField={activeField}\n onDraftChange={setDraft}\n onActiveFieldChange={setActiveField}\n />\n ) : null}\n {step.id === \"review\" ? (\n <ReviewStep draft={draft} discovered={discovered} />\n ) : null}\n </div>\n </div>\n </Modal>\n );\n}\n\nfunction cloneInitialDraft(value: Record<string, unknown>): ProfileWizardDraft {\n const draft = value as ProfileWizardDraft;\n return {\n ...draft,\n provider: draft.provider ? { ...draft.provider } : {},\n columns: draft.columns?.map((column) => ({ ...column })) ?? [],\n };\n}\n\nfunction connectionChoice(\n value: string,\n node: ClickyNode,\n): ConnectionChoice | null {\n const label = clickyNodeText(node) || value;\n const providerType = providerTypeFromConnectionLabel(label);\n if (!providerType) return null;\n return {\n value,\n label,\n name: profileConnectionID(value) ?? label,\n providerType,\n };\n}\n\nfunction clickyNodeText(node: ClickyNode): string {\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map(clickyNodeText).join(\"\");\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"profileWizard.js","sources":["../../../src/profiles/wizard/profileWizard.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport type { ClickyNode } from \"../../data/Clicky\";\nimport { Modal } from \"../../overlay/Modal\";\nimport type { ResolvedOperation } from \"../../rpc/types\";\nimport type { OperationsApiClient } from \"../../rpc/useOperations\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { ProfileWizardQueryStep, type ProfileSample } from \"./profileWizardQueryStep\";\nimport {\n profileConnectionID,\n profileWizardErrorMessage,\n profileWizardStepReady,\n profileWizardSteps,\n connectionTypeFromLabel,\n providerTypesForConnectionType,\n type ProfileColumn,\n type ProfileWizardDraft,\n} from \"./profileWizardModel\";\nimport {\n FieldsStep,\n ReviewStep,\n SourceStep,\n WizardProgress,\n type ConnectionChoice,\n} from \"./profileWizardSteps\";\nimport { stepHelp } from \"./profileWizardHelp\";\n\ntype ProfileWizardProps = {\n client: OperationsApiClient;\n action: ResolvedOperation;\n initialValue: Record<string, unknown>;\n onClose: () => void;\n onSuccess: () => void | Promise<void>;\n};\n\nexport function ProfileWizard({\n client,\n action,\n initialValue,\n onClose,\n onSuccess,\n}: ProfileWizardProps) {\n const initialDraft = useMemo(() => cloneInitialDraft(initialValue), [initialValue]);\n const [stepIndex, setStepIndex] = useState(0);\n const [draft, setDraft] = useState<ProfileWizardDraft>(initialDraft);\n const [discovered, setDiscovered] = useState<ProfileColumn[]>(\n initialDraft.columns ?? [],\n );\n const [activeField, setActiveField] = useState(\n initialDraft.columns?.[0]?.name ?? \"\",\n );\n const [connectionSearch, setConnectionSearch] = useState(\"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState(\"\");\n const deferredConnectionSearch = useDeferredValue(connectionSearch);\n const connections = useQuery({\n queryKey: [\"profile-wizard-connections\", deferredConnectionSearch],\n queryFn: () => {\n if (!client.lookupFilterOptions) {\n throw new Error(\"Connection lookup is unavailable\");\n }\n return client.lookupFilterOptions(\n \"/api/v1/connection\",\n \"GET\",\n \"connection\",\n deferredConnectionSearch,\n );\n },\n retry: 0,\n });\n const connectionChoices = useMemo(\n () =>\n Object.entries(connections.data?.options ?? {})\n .map(([value, node]) => connectionChoice(value, node))\n .filter((choice): choice is ConnectionChoice => choice != null)\n .sort((left, right) => left.name.localeCompare(right.name)),\n [connections.data?.options],\n );\n const step = profileWizardSteps[stepIndex];\n // stepIndex only ever moves between 0 and the last step, so an out-of-range\n // one is a broken navigation guard rather than a state the UI should render\n // around — say so instead of rendering a wizard with no current step.\n if (!step) throw new Error(`wizard step ${stepIndex} is out of range`);\n const connectionID = profileConnectionID(draft.provider?.connection ?? \"\");\n const currentStepReady = profileWizardStepReady(\n step.id,\n draft,\n discovered,\n );\n\n const updateQueryDraft = (next: ProfileWizardDraft) => {\n if (next.query !== draft.query) setDiscovered([]);\n setDraft(next);\n };\n\n const acceptSample = ({ columns }: ProfileSample) => {\n setDiscovered(columns);\n setActiveField((current) =>\n columns.some((field) => field.name === current)\n ? current\n : (columns[0]?.name ?? \"\"),\n );\n setDraft((current) => {\n const configuredByName = new Map(\n (current.columns ?? []).map((field) => [field.name, field]),\n );\n return {\n ...current,\n columns:\n configuredByName.size === 0\n ? columns\n : columns\n .filter((field) => configuredByName.has(field.name))\n .map((field) => ({\n ...field,\n ...configuredByName.get(field.name),\n })),\n };\n });\n };\n\n const save = async () => {\n setSaving(true);\n setError(\"\");\n try {\n if (!client.submitForm) {\n throw new Error(\"Profile creation is unavailable\");\n }\n const response = await client.submitForm(action.path, action.method, draft);\n if (!response.success) {\n throw new Error(\n response.error || response.message || \"Profile creation failed\",\n );\n }\n await onSuccess();\n } catch (saveError) {\n setError(profileWizardErrorMessage(saveError, \"Profile creation failed\"));\n } finally {\n setSaving(false);\n }\n };\n\n return (\n <Modal\n open\n onClose={onClose}\n confirmClose={\n stepIndex > 0 || draft.query\n ? {\n title: \"Discard this profile?\",\n message: \"Your query and field configuration will be lost.\",\n confirmLabel: \"Discard profile\",\n }\n : false\n }\n title=\"Build a profile\"\n subtitle={\n <WizardProgress\n stepIndex={stepIndex}\n onStepChange={(next) => {\n if (next < stepIndex) setStepIndex(next);\n }}\n />\n }\n size=\"full\"\n className=\"h-[calc(100dvh-2rem)]\"\n scrollBody={false}\n footer={\n <div className=\"flex w-full items-center gap-3\">\n <span className=\"text-xs text-muted-foreground\">\n Step {stepIndex + 1} of {profileWizardSteps.length}\n </span>\n {error ? (\n <span className=\"ml-3 text-sm text-destructive\">{error}</span>\n ) : null}\n <div className=\"ml-auto flex gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n {stepIndex > 0 ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={saving}\n onClick={() => setStepIndex((current) => current - 1)}\n >\n Back\n </Button>\n ) : null}\n {stepIndex < profileWizardSteps.length - 1 ? (\n <Button\n type=\"button\"\n disabled={!currentStepReady}\n onClick={() => setStepIndex((current) => current + 1)}\n >\n Continue\n </Button>\n ) : (\n <Button\n type=\"button\"\n disabled={!currentStepReady || saving}\n onClick={() => void save()}\n >\n {saving ? \"Saving…\" : \"Save profile\"}\n </Button>\n )}\n </div>\n </div>\n }\n >\n <div className=\"flex h-full min-h-0 flex-col gap-5\">\n <div className=\"shrink-0\">\n <p className=\"text-xs font-semibold uppercase tracking-[0.18em] text-primary\">\n {step.description}\n </p>\n <h2 className=\"mt-1 text-xl font-semibold\">{step.label}</h2>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {stepHelp[step.id]}\n </p>\n </div>\n <div key={step.id} className=\"min-h-0 flex-1 overflow-auto\">\n {step.id === \"source\" ? (\n <SourceStep\n choices={connectionChoices}\n loading={connections.isLoading}\n error={connections.error}\n {...(connections.data?.truncated !== undefined\n ? { truncated: connections.data.truncated }\n : {})}\n {...(connections.data?.total !== undefined\n ? { total: connections.data.total }\n : {})}\n search={connectionSearch}\n selected={draft.provider?.connection ?? \"\"}\n selectedType={draft.provider?.type ?? \"\"}\n onSearchChange={setConnectionSearch}\n onSelect={(choice) => {\n if (choice.value === draft.provider?.connection) return;\n setDraft({\n ...(draft.namespace !== undefined\n ? { namespace: draft.namespace }\n : {}),\n provider: {\n // The first candidate is the most specific one. Where the\n // connection type is read by several providers the step\n // offers the choice, and this is only what it opens on.\n ...(choice.providerTypes[0]\n ? { type: choice.providerTypes[0] }\n : {}),\n connection: choice.value,\n },\n });\n setDiscovered([]);\n setActiveField(\"\");\n }}\n onProviderTypeChange={(type) =>\n setDraft({\n ...draft,\n provider: { ...draft.provider, type },\n })\n }\n />\n ) : null}\n {step.id === \"query\" && connectionID ? (\n <ProfileWizardQueryStep\n key={connectionID}\n connectionID={connectionID}\n draft={draft}\n discovered={discovered}\n onDraftChange={updateQueryDraft}\n onSample={acceptSample}\n />\n ) : null}\n {step.id === \"fields\" ? (\n <FieldsStep\n draft={draft}\n discovered={discovered}\n activeField={activeField}\n onDraftChange={setDraft}\n onActiveFieldChange={setActiveField}\n />\n ) : null}\n {step.id === \"review\" ? (\n <ReviewStep draft={draft} discovered={discovered} />\n ) : null}\n </div>\n </div>\n </Modal>\n );\n}\n\nfunction cloneInitialDraft(value: Record<string, unknown>): ProfileWizardDraft {\n const draft = value as ProfileWizardDraft;\n return {\n ...draft,\n provider: draft.provider ? { ...draft.provider } : {},\n columns: draft.columns?.map((column) => ({ ...column })) ?? [],\n };\n}\n\nfunction connectionChoice(\n value: string,\n node: ClickyNode,\n): ConnectionChoice | null {\n const label = clickyNodeText(node) || value;\n const connectionType = connectionTypeFromLabel(label);\n if (!connectionType) return null;\n // A connection no provider reads is still listed, with an empty candidate\n // set: the Source step says so rather than the wizard emitting a draft whose\n // provider.type is not in the schema's enum.\n const providerTypes = providerTypesForConnectionType(connectionType);\n return {\n value,\n label,\n name: profileConnectionID(value) ?? label,\n connectionType,\n providerTypes,\n };\n}\n\nfunction clickyNodeText(node: ClickyNode): string {\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map(clickyNodeText).join(\"\");\n}\n"],"names":["_a"],"mappings":"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"}