@flanksource/clicky-ui 0.3.24 → 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 (491) 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/Chat.cjs +8 -4
  133. package/dist/data/chat/Chat.cjs.map +1 -1
  134. package/dist/data/chat/Chat.d.ts.map +1 -1
  135. package/dist/data/chat/Chat.js +8 -4
  136. package/dist/data/chat/Chat.js.map +1 -1
  137. package/dist/data/chat/ChatRuntimeToolbar.cjs +11 -7
  138. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  139. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  140. package/dist/data/chat/ChatRuntimeToolbar.js +11 -7
  141. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  142. package/dist/data/chat/ContextMeter.cjs +64 -27
  143. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  144. package/dist/data/chat/ContextMeter.d.ts +11 -4
  145. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  146. package/dist/data/chat/ContextMeter.js +64 -27
  147. package/dist/data/chat/ContextMeter.js.map +1 -1
  148. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  149. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  150. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  151. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  152. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  153. package/dist/data/chat/index.d.ts +2 -1
  154. package/dist/data/chat/index.d.ts.map +1 -1
  155. package/dist/data/chat/tool-policy.cjs +132 -0
  156. package/dist/data/chat/tool-policy.cjs.map +1 -0
  157. package/dist/data/chat/tool-policy.d.ts +81 -0
  158. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  159. package/dist/data/chat/tool-policy.js +132 -0
  160. package/dist/data/chat/tool-policy.js.map +1 -0
  161. package/dist/data/chat/types.cjs +20 -0
  162. package/dist/data/chat/types.cjs.map +1 -1
  163. package/dist/data/chat/types.d.ts +41 -2
  164. package/dist/data/chat/types.d.ts.map +1 -1
  165. package/dist/data/chat/types.js +20 -0
  166. package/dist/data/chat/types.js.map +1 -1
  167. package/dist/data/chat/usage-snapshot.cjs +10 -1
  168. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  169. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  170. package/dist/data/chat/usage-snapshot.js +10 -1
  171. package/dist/data/chat/usage-snapshot.js.map +1 -1
  172. package/dist/data/debugConsoleSignal.cjs +64 -0
  173. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  174. package/dist/data/debugConsoleSignal.d.ts +83 -0
  175. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  176. package/dist/data/debugConsoleSignal.js +64 -0
  177. package/dist/data/debugConsoleSignal.js.map +1 -0
  178. package/dist/data/har/HarPanel.cjs +20 -14
  179. package/dist/data/har/HarPanel.cjs.map +1 -1
  180. package/dist/data/har/HarPanel.d.ts.map +1 -1
  181. package/dist/data/har/HarPanel.js +20 -14
  182. package/dist/data/har/HarPanel.js.map +1 -1
  183. package/dist/data/har/types.d.ts +18 -0
  184. package/dist/data/har/types.d.ts.map +1 -1
  185. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  186. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  187. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  188. package/dist/data/query-browser/QueryBrowser.js +5 -43
  189. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  190. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  191. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  192. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  193. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  194. package/dist/data/useDebugAction.cjs +29 -0
  195. package/dist/data/useDebugAction.cjs.map +1 -0
  196. package/dist/data/useDebugAction.d.ts +16 -0
  197. package/dist/data/useDebugAction.d.ts.map +1 -0
  198. package/dist/data/useDebugAction.js +29 -0
  199. package/dist/data/useDebugAction.js.map +1 -0
  200. package/dist/data/version-info.cjs +3 -3
  201. package/dist/data/version-info.js +3 -3
  202. package/dist/data.cjs +16 -8
  203. package/dist/data.cjs.map +1 -1
  204. package/dist/data.d.ts +3 -2
  205. package/dist/data.d.ts.map +1 -1
  206. package/dist/data.js +16 -8
  207. package/dist/devtools/DebugConsole.cjs +138 -0
  208. package/dist/devtools/DebugConsole.cjs.map +1 -0
  209. package/dist/devtools/DebugConsole.d.ts +23 -0
  210. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  211. package/dist/devtools/DebugConsole.js +138 -0
  212. package/dist/devtools/DebugConsole.js.map +1 -0
  213. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  214. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  215. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  216. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  217. package/dist/devtools/DebugConsoleButton.js +59 -0
  218. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  219. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  220. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  221. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  222. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  223. package/dist/devtools/DebugConsoleDock.js +112 -0
  224. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  225. package/dist/devtools/ExecutionDetail.cjs +135 -0
  226. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  227. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  228. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  229. package/dist/devtools/ExecutionDetail.js +135 -0
  230. package/dist/devtools/ExecutionDetail.js.map +1 -0
  231. package/dist/devtools/debugClient.cjs +172 -0
  232. package/dist/devtools/debugClient.cjs.map +1 -0
  233. package/dist/devtools/debugClient.d.ts +98 -0
  234. package/dist/devtools/debugClient.d.ts.map +1 -0
  235. package/dist/devtools/debugClient.js +172 -0
  236. package/dist/devtools/debugClient.js.map +1 -0
  237. package/dist/devtools/debugStore.cjs +115 -0
  238. package/dist/devtools/debugStore.cjs.map +1 -0
  239. package/dist/devtools/debugStore.d.ts +83 -0
  240. package/dist/devtools/debugStore.d.ts.map +1 -0
  241. package/dist/devtools/debugStore.js +115 -0
  242. package/dist/devtools/debugStore.js.map +1 -0
  243. package/dist/devtools/dockState.cjs +51 -0
  244. package/dist/devtools/dockState.cjs.map +1 -0
  245. package/dist/devtools/dockState.d.ts +31 -0
  246. package/dist/devtools/dockState.d.ts.map +1 -0
  247. package/dist/devtools/dockState.js +51 -0
  248. package/dist/devtools/dockState.js.map +1 -0
  249. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  250. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  251. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  252. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  253. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  254. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  255. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  256. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  257. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  258. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  259. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  260. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  261. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  262. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  263. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  264. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  265. package/dist/devtools/tabs/InspectionTab.js +316 -0
  266. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  267. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  268. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  269. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  270. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  271. package/dist/devtools/tabs/NetworkTab.js +91 -0
  272. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  273. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  274. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  275. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  276. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  277. package/dist/devtools/tabs/QueriesTab.js +85 -0
  278. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  279. package/dist/devtools/types.cjs +26 -0
  280. package/dist/devtools/types.cjs.map +1 -0
  281. package/dist/devtools/types.d.ts +235 -0
  282. package/dist/devtools/types.d.ts.map +1 -0
  283. package/dist/devtools/types.js +26 -0
  284. package/dist/devtools/types.js.map +1 -0
  285. package/dist/devtools/useDebugStream.cjs +46 -0
  286. package/dist/devtools/useDebugStream.cjs.map +1 -0
  287. package/dist/devtools/useDebugStream.d.ts +23 -0
  288. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  289. package/dist/devtools/useDebugStream.js +46 -0
  290. package/dist/devtools/useDebugStream.js.map +1 -0
  291. package/dist/devtools.cjs +51 -0
  292. package/dist/devtools.cjs.map +1 -0
  293. package/dist/devtools.d.ts +37 -0
  294. package/dist/devtools.d.ts.map +1 -0
  295. package/dist/devtools.js +51 -0
  296. package/dist/devtools.js.map +1 -0
  297. package/dist/icons/components/UiOpenScad.cjs +10 -0
  298. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  299. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  300. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  301. package/dist/icons/components/UiOpenScad.js +10 -0
  302. package/dist/icons/components/UiOpenScad.js.map +1 -0
  303. package/dist/icons/index.d.ts +1 -0
  304. package/dist/icons/index.d.ts.map +1 -1
  305. package/dist/icons/registry.cjs +2 -0
  306. package/dist/icons/registry.cjs.map +1 -1
  307. package/dist/icons/registry.d.ts.map +1 -1
  308. package/dist/icons/registry.js +2 -0
  309. package/dist/icons/registry.js.map +1 -1
  310. package/dist/icons.cjs +2 -0
  311. package/dist/icons.cjs.map +1 -1
  312. package/dist/icons.js +2 -0
  313. package/dist/icons.js.map +1 -1
  314. package/dist/index.cjs +20 -8
  315. package/dist/index.cjs.map +1 -1
  316. package/dist/index.js +20 -8
  317. package/dist/index.js.map +1 -1
  318. package/dist/layout/AppShell.cjs +15 -10
  319. package/dist/layout/AppShell.cjs.map +1 -1
  320. package/dist/layout/AppShell.d.ts +11 -0
  321. package/dist/layout/AppShell.d.ts.map +1 -1
  322. package/dist/layout/AppShell.js +15 -10
  323. package/dist/layout/AppShell.js.map +1 -1
  324. package/dist/layout/AppShell.nav.cjs +170 -49
  325. package/dist/layout/AppShell.nav.cjs.map +1 -1
  326. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  327. package/dist/layout/AppShell.nav.js +170 -49
  328. package/dist/layout/AppShell.nav.js.map +1 -1
  329. package/dist/overlay/CellActions.cjs +18 -124
  330. package/dist/overlay/CellActions.cjs.map +1 -1
  331. package/dist/overlay/CellActions.d.ts +1 -1
  332. package/dist/overlay/CellActions.d.ts.map +1 -1
  333. package/dist/overlay/CellActions.js +18 -124
  334. package/dist/overlay/CellActions.js.map +1 -1
  335. package/dist/overlay/ContextMenu.cjs +144 -0
  336. package/dist/overlay/ContextMenu.cjs.map +1 -0
  337. package/dist/overlay/ContextMenu.d.ts +8 -0
  338. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  339. package/dist/overlay/ContextMenu.js +144 -0
  340. package/dist/overlay/ContextMenu.js.map +1 -0
  341. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  342. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  343. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  344. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  345. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  346. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  347. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  348. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  349. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  350. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  351. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  352. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  353. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  354. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  355. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  356. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  357. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  358. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  359. package/dist/profiles/connections/index.d.ts +1 -0
  360. package/dist/profiles/connections/index.d.ts.map +1 -1
  361. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  362. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  363. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  364. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  365. package/dist/profiles/connections/inspectionStatus.js +44 -0
  366. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  367. package/dist/profiles/connections/useInspection.cjs +123 -0
  368. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  369. package/dist/profiles/connections/useInspection.d.ts +35 -0
  370. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  371. package/dist/profiles/connections/useInspection.js +123 -0
  372. package/dist/profiles/connections/useInspection.js.map +1 -0
  373. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  374. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  375. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  376. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  377. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  378. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  379. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  380. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  381. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  382. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  383. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  384. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  385. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  386. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  387. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  388. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  389. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  390. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  391. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  392. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  393. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  394. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  395. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  396. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  397. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  398. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  399. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  400. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  401. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  402. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  403. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  404. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  405. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  406. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  407. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  408. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  409. package/dist/profiles/query/profileSamplePayload.js +6 -4
  410. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  411. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  412. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  413. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  414. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  415. package/dist/profiles/query/profileSampleResult.js +26 -0
  416. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  417. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  418. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  419. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  420. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  421. package/dist/profiles/query/queryTargetPicker.js +5 -3
  422. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  423. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  424. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  425. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  426. package/dist/profiles/wizard/profileWizard.js +15 -6
  427. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  428. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  429. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  430. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  431. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  432. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  433. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  434. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  435. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  436. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  437. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  438. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  439. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  440. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  441. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  442. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  443. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  444. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  445. package/dist/profiles.cjs +8 -2
  446. package/dist/profiles.cjs.map +1 -1
  447. package/dist/profiles.js +10 -4
  448. package/dist/profiles.js.map +1 -1
  449. package/dist/rpc/FilterForm.cjs +21 -237
  450. package/dist/rpc/FilterForm.cjs.map +1 -1
  451. package/dist/rpc/FilterForm.d.ts +3 -1
  452. package/dist/rpc/FilterForm.d.ts.map +1 -1
  453. package/dist/rpc/FilterForm.js +21 -237
  454. package/dist/rpc/FilterForm.js.map +1 -1
  455. package/dist/rpc/FilterFormFields.cjs +240 -0
  456. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  457. package/dist/rpc/FilterFormFields.d.ts +12 -0
  458. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  459. package/dist/rpc/FilterFormFields.js +240 -0
  460. package/dist/rpc/FilterFormFields.js.map +1 -0
  461. package/dist/rpc/router.cjs +3 -2
  462. package/dist/rpc/router.cjs.map +1 -1
  463. package/dist/rpc/router.d.ts.map +1 -1
  464. package/dist/rpc/router.js +3 -2
  465. package/dist/rpc/router.js.map +1 -1
  466. package/dist/rpc/types.cjs.map +1 -1
  467. package/dist/rpc/types.d.ts +3 -1
  468. package/dist/rpc/types.d.ts.map +1 -1
  469. package/dist/rpc/types.js.map +1 -1
  470. package/dist/styles.css +1 -1
  471. package/package.json +6 -1
  472. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  473. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  474. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  475. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  476. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  477. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  478. package/dist/data/query-info/index.d.ts +0 -4
  479. package/dist/data/query-info/index.d.ts.map +0 -1
  480. package/dist/data/query-info/queryInfo.cjs +0 -42
  481. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  482. package/dist/data/query-info/queryInfo.d.ts +0 -45
  483. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  484. package/dist/data/query-info/queryInfo.js +0 -42
  485. package/dist/data/query-info/queryInfo.js.map +0 -1
  486. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  487. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  488. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  489. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  490. package/dist/data/query-info/useQueryInfo.js +0 -48
  491. package/dist/data/query-info/useQueryInfo.js.map +0 -1
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const reactQuery = require("@tanstack/react-query");
4
+ const react = require("react");
5
+ const connectionBrowserModel = require("./connectionBrowserModel.cjs");
6
+ function effectiveInspectionDatabase(scope) {
7
+ return scope.database || scope.fallbackDatabase || "";
8
+ }
9
+ function inspectionURL(baseUrl, options = {}) {
10
+ const params = new URLSearchParams();
11
+ if (options.database) params.set("database", options.database);
12
+ if (options.target) params.set("target", options.target);
13
+ if (options.targetKind) params.set("targetKind", options.targetKind);
14
+ if (options.refresh) params.set("refresh", "true");
15
+ const encoded = params.toString();
16
+ return `${baseUrl}/inspect${encoded ? `?${encoded}` : ""}`;
17
+ }
18
+ function useInspection(scope) {
19
+ var _a, _b, _c, _d;
20
+ const { cacheKey, id, baseUrl } = scope;
21
+ const queryClient = reactQuery.useQueryClient();
22
+ const requestedDatabase = effectiveInspectionDatabase(scope);
23
+ const baseQueryKey = [cacheKey, id, "base", requestedDatabase];
24
+ const base = reactQuery.useQuery({
25
+ queryKey: baseQueryKey,
26
+ queryFn: () => connectionBrowserModel.fetchJSON(
27
+ inspectionURL(baseUrl, { database: requestedDatabase })
28
+ ),
29
+ enabled: scope.enabled,
30
+ retry: 0,
31
+ staleTime: 0,
32
+ placeholderData: reactQuery.keepPreviousData
33
+ });
34
+ const data = base.data;
35
+ const targetKind = scope.targetKind ?? ((_b = (_a = data == null ? void 0 : data.targets) == null ? void 0 : _a.find((target2) => target2.name === scope.target)) == null ? void 0 : _b.kind) ?? "";
36
+ const targetEnabled = (data == null ? void 0 : data.kind) === "opensearch" && scope.target !== "" && targetKind !== "";
37
+ const targetQueryKey = [
38
+ cacheKey,
39
+ id,
40
+ "target",
41
+ targetKind,
42
+ scope.target
43
+ ];
44
+ const target = reactQuery.useQuery({
45
+ queryKey: targetQueryKey,
46
+ queryFn: () => connectionBrowserModel.fetchJSON(
47
+ inspectionURL(baseUrl, { target: scope.target, targetKind })
48
+ ),
49
+ enabled: targetEnabled,
50
+ retry: 0,
51
+ staleTime: 0,
52
+ placeholderData: reactQuery.keepPreviousData
53
+ });
54
+ const activeDatabase = requestedDatabase || (data == null ? void 0 : data.database) || "";
55
+ const completion = react.useMemo(
56
+ () => connectionBrowserModel.completionForInspection(data, target.data),
57
+ [data, target.data]
58
+ );
59
+ const activeCache = targetEnabled ? ((_c = target.data) == null ? void 0 : _c.cache) ?? (data == null ? void 0 : data.cache) : data == null ? void 0 : data.cache;
60
+ const refresh = reactQuery.useMutation({
61
+ mutationFn: () => connectionBrowserModel.fetchJSON(
62
+ inspectionURL(baseUrl, {
63
+ database: requestedDatabase,
64
+ ...targetEnabled ? { target: scope.target, targetKind } : {},
65
+ refresh: true
66
+ })
67
+ ),
68
+ onSuccess: (refreshed) => {
69
+ queryClient.setQueryData(baseQueryKey, refreshed);
70
+ if (targetEnabled) queryClient.setQueryData(targetQueryKey, refreshed);
71
+ }
72
+ });
73
+ react.useEffect(() => {
74
+ if (!(activeCache == null ? void 0 : activeCache.refreshing)) return;
75
+ let cancelled = false;
76
+ let timer = 0;
77
+ const poll = async () => {
78
+ var _a2, _b2, _c2;
79
+ const baseResult = await base.refetch();
80
+ const targetResult = targetEnabled ? await target.refetch() : void 0;
81
+ const cache = targetEnabled ? ((_a2 = targetResult == null ? void 0 : targetResult.data) == null ? void 0 : _a2.cache) ?? ((_b2 = baseResult.data) == null ? void 0 : _b2.cache) : (_c2 = baseResult.data) == null ? void 0 : _c2.cache;
82
+ if (!cancelled && (cache == null ? void 0 : cache.refreshing)) {
83
+ timer = window.setTimeout(
84
+ () => void poll(),
85
+ Math.max(500, cache.retryAfterMs ?? 1e3)
86
+ );
87
+ }
88
+ };
89
+ timer = window.setTimeout(
90
+ () => void poll(),
91
+ Math.max(500, activeCache.retryAfterMs ?? 1e3)
92
+ );
93
+ return () => {
94
+ cancelled = true;
95
+ window.clearTimeout(timer);
96
+ };
97
+ }, [
98
+ activeCache == null ? void 0 : activeCache.refreshing,
99
+ activeCache == null ? void 0 : activeCache.retryAfterMs,
100
+ base.refetch,
101
+ target.refetch,
102
+ targetEnabled
103
+ ]);
104
+ const active = targetEnabled ? target : base;
105
+ return {
106
+ data,
107
+ nodes: (data == null ? void 0 : data.nodes) ?? [],
108
+ databases: ((_d = base.data) == null ? void 0 : _d.databases) ?? [],
109
+ activeDatabase,
110
+ sqlDatabase: (data == null ? void 0 : data.kind) === "sql" ? activeDatabase : "",
111
+ targetKind,
112
+ loading: active.isLoading && active.data === void 0,
113
+ error: refresh.error ?? active.error ?? base.error,
114
+ completion,
115
+ cache: activeCache,
116
+ refreshing: refresh.isPending || base.isFetching || targetEnabled && target.isFetching,
117
+ refresh: () => refresh.mutate()
118
+ };
119
+ }
120
+ exports.effectiveInspectionDatabase = effectiveInspectionDatabase;
121
+ exports.inspectionURL = inspectionURL;
122
+ exports.useInspection = useInspection;
123
+ //# sourceMappingURL=useInspection.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInspection.cjs","sources":["../../../src/profiles/connections/useInspection.ts"],"sourcesContent":["import type { QueryBrowserCompletion } from \"../../data/query-browser/QueryBrowser.completion\";\nimport {\n keepPreviousData,\n useMutation,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n completionForInspection,\n fetchJSON,\n type BrowserInspection,\n type CatalogNode,\n type InspectionCache,\n} from \"./connectionBrowserModel\";\n\nexport type InspectionScope = {\n cacheKey: string;\n id: string;\n baseUrl: string;\n enabled: boolean;\n database: string;\n fallbackDatabase?: string;\n target: string;\n targetKind?: string;\n};\n\nexport type Inspection = {\n data?: BrowserInspection | undefined;\n nodes: CatalogNode[];\n databases: string[];\n activeDatabase: string;\n sqlDatabase: string;\n targetKind: string;\n loading: boolean;\n error: unknown;\n completion?: QueryBrowserCompletion | undefined;\n cache?: InspectionCache | undefined;\n refreshing: boolean;\n refresh: () => void;\n};\n\nexport function effectiveInspectionDatabase(\n scope: Pick<InspectionScope, \"database\" | \"fallbackDatabase\">,\n): string {\n return scope.database || scope.fallbackDatabase || \"\";\n}\n\nexport function inspectionURL(\n baseUrl: string,\n options: {\n database?: string;\n target?: string;\n targetKind?: string;\n refresh?: boolean;\n } = {},\n): string {\n const params = new URLSearchParams();\n if (options.database) params.set(\"database\", options.database);\n if (options.target) params.set(\"target\", options.target);\n if (options.targetKind) params.set(\"targetKind\", options.targetKind);\n if (options.refresh) params.set(\"refresh\", \"true\");\n const encoded = params.toString();\n return `${baseUrl}/inspect${encoded ? `?${encoded}` : \"\"}`;\n}\n\nexport function useInspection(scope: InspectionScope): Inspection {\n const { cacheKey, id, baseUrl } = scope;\n const queryClient = useQueryClient();\n const requestedDatabase = effectiveInspectionDatabase(scope);\n const baseQueryKey = [cacheKey, id, \"base\", requestedDatabase] as const;\n const base = useQuery({\n queryKey: baseQueryKey,\n queryFn: () =>\n fetchJSON<BrowserInspection>(\n inspectionURL(baseUrl, { database: requestedDatabase }),\n ),\n enabled: scope.enabled,\n retry: 0,\n staleTime: 0,\n placeholderData: keepPreviousData,\n });\n const data = base.data;\n const targetKind =\n scope.targetKind ??\n data?.targets?.find((target) => target.name === scope.target)?.kind ??\n \"\";\n const targetEnabled =\n data?.kind === \"opensearch\" && scope.target !== \"\" && targetKind !== \"\";\n const targetQueryKey = [\n cacheKey,\n id,\n \"target\",\n targetKind,\n scope.target,\n ] as const;\n const target = useQuery({\n queryKey: targetQueryKey,\n queryFn: () =>\n fetchJSON<BrowserInspection>(\n inspectionURL(baseUrl, { target: scope.target, targetKind }),\n ),\n enabled: targetEnabled,\n retry: 0,\n staleTime: 0,\n placeholderData: keepPreviousData,\n });\n const activeDatabase = requestedDatabase || data?.database || \"\";\n const completion = useMemo(\n () => completionForInspection(data, target.data),\n [data, target.data],\n );\n const activeCache = targetEnabled\n ? (target.data?.cache ?? data?.cache)\n : data?.cache;\n const refresh = useMutation({\n mutationFn: () =>\n fetchJSON<BrowserInspection>(\n inspectionURL(baseUrl, {\n database: requestedDatabase,\n ...(targetEnabled ? { target: scope.target, targetKind } : {}),\n refresh: true,\n }),\n ),\n onSuccess: (refreshed) => {\n queryClient.setQueryData(baseQueryKey, refreshed);\n if (targetEnabled) queryClient.setQueryData(targetQueryKey, refreshed);\n },\n });\n\n useEffect(() => {\n if (!activeCache?.refreshing) return;\n let cancelled = false;\n let timer = 0;\n const poll = async () => {\n const baseResult = await base.refetch();\n const targetResult = targetEnabled ? await target.refetch() : undefined;\n const cache = targetEnabled\n ? (targetResult?.data?.cache ?? baseResult.data?.cache)\n : baseResult.data?.cache;\n if (!cancelled && cache?.refreshing) {\n timer = window.setTimeout(\n () => void poll(),\n Math.max(500, cache.retryAfterMs ?? 1_000),\n );\n }\n };\n timer = window.setTimeout(\n () => void poll(),\n Math.max(500, activeCache.retryAfterMs ?? 1_000),\n );\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [\n activeCache?.refreshing,\n activeCache?.retryAfterMs,\n base.refetch,\n target.refetch,\n targetEnabled,\n ]);\n\n const active = targetEnabled ? target : base;\n return {\n data,\n nodes: data?.nodes ?? [],\n databases: base.data?.databases ?? [],\n activeDatabase,\n sqlDatabase: data?.kind === \"sql\" ? activeDatabase : \"\",\n targetKind,\n loading: active.isLoading && active.data === undefined,\n error: refresh.error ?? active.error ?? base.error,\n completion,\n cache: activeCache,\n refreshing:\n refresh.isPending ||\n base.isFetching ||\n (targetEnabled && target.isFetching),\n refresh: () => refresh.mutate(),\n };\n}\n"],"names":["useQueryClient","useQuery","fetchJSON","keepPreviousData","target","useMemo","completionForInspection","useMutation","useEffect","_a","_b","_c"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { QueryBrowserCompletion } from '../../data/query-browser/QueryBrowser.completion';
2
+ import { BrowserInspection, CatalogNode, InspectionCache } from './connectionBrowserModel';
3
+ export type InspectionScope = {
4
+ cacheKey: string;
5
+ id: string;
6
+ baseUrl: string;
7
+ enabled: boolean;
8
+ database: string;
9
+ fallbackDatabase?: string;
10
+ target: string;
11
+ targetKind?: string;
12
+ };
13
+ export type Inspection = {
14
+ data?: BrowserInspection | undefined;
15
+ nodes: CatalogNode[];
16
+ databases: string[];
17
+ activeDatabase: string;
18
+ sqlDatabase: string;
19
+ targetKind: string;
20
+ loading: boolean;
21
+ error: unknown;
22
+ completion?: QueryBrowserCompletion | undefined;
23
+ cache?: InspectionCache | undefined;
24
+ refreshing: boolean;
25
+ refresh: () => void;
26
+ };
27
+ export declare function effectiveInspectionDatabase(scope: Pick<InspectionScope, "database" | "fallbackDatabase">): string;
28
+ export declare function inspectionURL(baseUrl: string, options?: {
29
+ database?: string;
30
+ target?: string;
31
+ targetKind?: string;
32
+ refresh?: boolean;
33
+ }): string;
34
+ export declare function useInspection(scope: InspectionScope): Inspection;
35
+ //# sourceMappingURL=useInspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInspection.d.ts","sourceRoot":"","sources":["../../../src/profiles/connections/useInspection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAQ/F,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAChD,KAAK,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,GAAG,kBAAkB,CAAC,GAC5D,MAAM,CAER;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACd,GACL,MAAM,CAQR;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,UAAU,CAmHhE"}
@@ -0,0 +1,123 @@
1
+ import { useQueryClient, useQuery, keepPreviousData, useMutation } from "@tanstack/react-query";
2
+ import { useMemo, useEffect } from "react";
3
+ import { fetchJSON, completionForInspection } from "./connectionBrowserModel.js";
4
+ function effectiveInspectionDatabase(scope) {
5
+ return scope.database || scope.fallbackDatabase || "";
6
+ }
7
+ function inspectionURL(baseUrl, options = {}) {
8
+ const params = new URLSearchParams();
9
+ if (options.database) params.set("database", options.database);
10
+ if (options.target) params.set("target", options.target);
11
+ if (options.targetKind) params.set("targetKind", options.targetKind);
12
+ if (options.refresh) params.set("refresh", "true");
13
+ const encoded = params.toString();
14
+ return `${baseUrl}/inspect${encoded ? `?${encoded}` : ""}`;
15
+ }
16
+ function useInspection(scope) {
17
+ var _a, _b, _c, _d;
18
+ const { cacheKey, id, baseUrl } = scope;
19
+ const queryClient = useQueryClient();
20
+ const requestedDatabase = effectiveInspectionDatabase(scope);
21
+ const baseQueryKey = [cacheKey, id, "base", requestedDatabase];
22
+ const base = useQuery({
23
+ queryKey: baseQueryKey,
24
+ queryFn: () => fetchJSON(
25
+ inspectionURL(baseUrl, { database: requestedDatabase })
26
+ ),
27
+ enabled: scope.enabled,
28
+ retry: 0,
29
+ staleTime: 0,
30
+ placeholderData: keepPreviousData
31
+ });
32
+ const data = base.data;
33
+ const targetKind = scope.targetKind ?? ((_b = (_a = data == null ? void 0 : data.targets) == null ? void 0 : _a.find((target2) => target2.name === scope.target)) == null ? void 0 : _b.kind) ?? "";
34
+ const targetEnabled = (data == null ? void 0 : data.kind) === "opensearch" && scope.target !== "" && targetKind !== "";
35
+ const targetQueryKey = [
36
+ cacheKey,
37
+ id,
38
+ "target",
39
+ targetKind,
40
+ scope.target
41
+ ];
42
+ const target = useQuery({
43
+ queryKey: targetQueryKey,
44
+ queryFn: () => fetchJSON(
45
+ inspectionURL(baseUrl, { target: scope.target, targetKind })
46
+ ),
47
+ enabled: targetEnabled,
48
+ retry: 0,
49
+ staleTime: 0,
50
+ placeholderData: keepPreviousData
51
+ });
52
+ const activeDatabase = requestedDatabase || (data == null ? void 0 : data.database) || "";
53
+ const completion = useMemo(
54
+ () => completionForInspection(data, target.data),
55
+ [data, target.data]
56
+ );
57
+ const activeCache = targetEnabled ? ((_c = target.data) == null ? void 0 : _c.cache) ?? (data == null ? void 0 : data.cache) : data == null ? void 0 : data.cache;
58
+ const refresh = useMutation({
59
+ mutationFn: () => fetchJSON(
60
+ inspectionURL(baseUrl, {
61
+ database: requestedDatabase,
62
+ ...targetEnabled ? { target: scope.target, targetKind } : {},
63
+ refresh: true
64
+ })
65
+ ),
66
+ onSuccess: (refreshed) => {
67
+ queryClient.setQueryData(baseQueryKey, refreshed);
68
+ if (targetEnabled) queryClient.setQueryData(targetQueryKey, refreshed);
69
+ }
70
+ });
71
+ useEffect(() => {
72
+ if (!(activeCache == null ? void 0 : activeCache.refreshing)) return;
73
+ let cancelled = false;
74
+ let timer = 0;
75
+ const poll = async () => {
76
+ var _a2, _b2, _c2;
77
+ const baseResult = await base.refetch();
78
+ const targetResult = targetEnabled ? await target.refetch() : void 0;
79
+ const cache = targetEnabled ? ((_a2 = targetResult == null ? void 0 : targetResult.data) == null ? void 0 : _a2.cache) ?? ((_b2 = baseResult.data) == null ? void 0 : _b2.cache) : (_c2 = baseResult.data) == null ? void 0 : _c2.cache;
80
+ if (!cancelled && (cache == null ? void 0 : cache.refreshing)) {
81
+ timer = window.setTimeout(
82
+ () => void poll(),
83
+ Math.max(500, cache.retryAfterMs ?? 1e3)
84
+ );
85
+ }
86
+ };
87
+ timer = window.setTimeout(
88
+ () => void poll(),
89
+ Math.max(500, activeCache.retryAfterMs ?? 1e3)
90
+ );
91
+ return () => {
92
+ cancelled = true;
93
+ window.clearTimeout(timer);
94
+ };
95
+ }, [
96
+ activeCache == null ? void 0 : activeCache.refreshing,
97
+ activeCache == null ? void 0 : activeCache.retryAfterMs,
98
+ base.refetch,
99
+ target.refetch,
100
+ targetEnabled
101
+ ]);
102
+ const active = targetEnabled ? target : base;
103
+ return {
104
+ data,
105
+ nodes: (data == null ? void 0 : data.nodes) ?? [],
106
+ databases: ((_d = base.data) == null ? void 0 : _d.databases) ?? [],
107
+ activeDatabase,
108
+ sqlDatabase: (data == null ? void 0 : data.kind) === "sql" ? activeDatabase : "",
109
+ targetKind,
110
+ loading: active.isLoading && active.data === void 0,
111
+ error: refresh.error ?? active.error ?? base.error,
112
+ completion,
113
+ cache: activeCache,
114
+ refreshing: refresh.isPending || base.isFetching || targetEnabled && target.isFetching,
115
+ refresh: () => refresh.mutate()
116
+ };
117
+ }
118
+ export {
119
+ effectiveInspectionDatabase,
120
+ inspectionURL,
121
+ useInspection
122
+ };
123
+ //# sourceMappingURL=useInspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInspection.js","sources":["../../../src/profiles/connections/useInspection.ts"],"sourcesContent":["import type { QueryBrowserCompletion } from \"../../data/query-browser/QueryBrowser.completion\";\nimport {\n keepPreviousData,\n useMutation,\n useQuery,\n useQueryClient,\n} from \"@tanstack/react-query\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n completionForInspection,\n fetchJSON,\n type BrowserInspection,\n type CatalogNode,\n type InspectionCache,\n} from \"./connectionBrowserModel\";\n\nexport type InspectionScope = {\n cacheKey: string;\n id: string;\n baseUrl: string;\n enabled: boolean;\n database: string;\n fallbackDatabase?: string;\n target: string;\n targetKind?: string;\n};\n\nexport type Inspection = {\n data?: BrowserInspection | undefined;\n nodes: CatalogNode[];\n databases: string[];\n activeDatabase: string;\n sqlDatabase: string;\n targetKind: string;\n loading: boolean;\n error: unknown;\n completion?: QueryBrowserCompletion | undefined;\n cache?: InspectionCache | undefined;\n refreshing: boolean;\n refresh: () => void;\n};\n\nexport function effectiveInspectionDatabase(\n scope: Pick<InspectionScope, \"database\" | \"fallbackDatabase\">,\n): string {\n return scope.database || scope.fallbackDatabase || \"\";\n}\n\nexport function inspectionURL(\n baseUrl: string,\n options: {\n database?: string;\n target?: string;\n targetKind?: string;\n refresh?: boolean;\n } = {},\n): string {\n const params = new URLSearchParams();\n if (options.database) params.set(\"database\", options.database);\n if (options.target) params.set(\"target\", options.target);\n if (options.targetKind) params.set(\"targetKind\", options.targetKind);\n if (options.refresh) params.set(\"refresh\", \"true\");\n const encoded = params.toString();\n return `${baseUrl}/inspect${encoded ? `?${encoded}` : \"\"}`;\n}\n\nexport function useInspection(scope: InspectionScope): Inspection {\n const { cacheKey, id, baseUrl } = scope;\n const queryClient = useQueryClient();\n const requestedDatabase = effectiveInspectionDatabase(scope);\n const baseQueryKey = [cacheKey, id, \"base\", requestedDatabase] as const;\n const base = useQuery({\n queryKey: baseQueryKey,\n queryFn: () =>\n fetchJSON<BrowserInspection>(\n inspectionURL(baseUrl, { database: requestedDatabase }),\n ),\n enabled: scope.enabled,\n retry: 0,\n staleTime: 0,\n placeholderData: keepPreviousData,\n });\n const data = base.data;\n const targetKind =\n scope.targetKind ??\n data?.targets?.find((target) => target.name === scope.target)?.kind ??\n \"\";\n const targetEnabled =\n data?.kind === \"opensearch\" && scope.target !== \"\" && targetKind !== \"\";\n const targetQueryKey = [\n cacheKey,\n id,\n \"target\",\n targetKind,\n scope.target,\n ] as const;\n const target = useQuery({\n queryKey: targetQueryKey,\n queryFn: () =>\n fetchJSON<BrowserInspection>(\n inspectionURL(baseUrl, { target: scope.target, targetKind }),\n ),\n enabled: targetEnabled,\n retry: 0,\n staleTime: 0,\n placeholderData: keepPreviousData,\n });\n const activeDatabase = requestedDatabase || data?.database || \"\";\n const completion = useMemo(\n () => completionForInspection(data, target.data),\n [data, target.data],\n );\n const activeCache = targetEnabled\n ? (target.data?.cache ?? data?.cache)\n : data?.cache;\n const refresh = useMutation({\n mutationFn: () =>\n fetchJSON<BrowserInspection>(\n inspectionURL(baseUrl, {\n database: requestedDatabase,\n ...(targetEnabled ? { target: scope.target, targetKind } : {}),\n refresh: true,\n }),\n ),\n onSuccess: (refreshed) => {\n queryClient.setQueryData(baseQueryKey, refreshed);\n if (targetEnabled) queryClient.setQueryData(targetQueryKey, refreshed);\n },\n });\n\n useEffect(() => {\n if (!activeCache?.refreshing) return;\n let cancelled = false;\n let timer = 0;\n const poll = async () => {\n const baseResult = await base.refetch();\n const targetResult = targetEnabled ? await target.refetch() : undefined;\n const cache = targetEnabled\n ? (targetResult?.data?.cache ?? baseResult.data?.cache)\n : baseResult.data?.cache;\n if (!cancelled && cache?.refreshing) {\n timer = window.setTimeout(\n () => void poll(),\n Math.max(500, cache.retryAfterMs ?? 1_000),\n );\n }\n };\n timer = window.setTimeout(\n () => void poll(),\n Math.max(500, activeCache.retryAfterMs ?? 1_000),\n );\n return () => {\n cancelled = true;\n window.clearTimeout(timer);\n };\n }, [\n activeCache?.refreshing,\n activeCache?.retryAfterMs,\n base.refetch,\n target.refetch,\n targetEnabled,\n ]);\n\n const active = targetEnabled ? target : base;\n return {\n data,\n nodes: data?.nodes ?? [],\n databases: base.data?.databases ?? [],\n activeDatabase,\n sqlDatabase: data?.kind === \"sql\" ? activeDatabase : \"\",\n targetKind,\n loading: active.isLoading && active.data === undefined,\n error: refresh.error ?? active.error ?? base.error,\n completion,\n cache: activeCache,\n refreshing:\n refresh.isPending ||\n base.isFetching ||\n (targetEnabled && target.isFetching),\n refresh: () => refresh.mutate(),\n };\n}\n"],"names":["target","_a","_b","_c"],"mappings":"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"}
@@ -3,17 +3,23 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const JsonSchemaForm = require("../../components/JsonSchemaForm.cjs");
5
5
  const button = require("../../components/button.cjs");
6
+ const debugConsoleSignal = require("../../data/debugConsoleSignal.cjs");
6
7
  const Icon = require("../../data/Icon.cjs");
7
8
  const Modal = require("../../overlay/Modal.cjs");
8
9
  const reactQuery = require("@tanstack/react-query");
9
10
  const react = require("react");
10
11
  const connectionBrowserModel = require("../connections/connectionBrowserModel.cjs");
11
12
  const connectionQueryWorkspace = require("../connections/connectionQueryWorkspace.cjs");
13
+ const useInspection = require("../connections/useInspection.cjs");
14
+ const profileApi = require("../profileApi.cjs");
12
15
  const profileColumnPicker = require("../fields/profileColumnPicker.cjs");
13
16
  const profileWizardModel = require("../wizard/profileWizardModel.cjs");
14
17
  const esQueryBuilderForm = require("../elasticsearch/esQueryBuilderForm.cjs");
15
18
  const profileColumnModel = require("../fields/profileColumnModel.cjs");
16
19
  const profileBuilderModel = require("./profileBuilderModel.cjs");
20
+ const profileSamplePayload = require("../query/profileSamplePayload.cjs");
21
+ const profileSampleFilterLookup = require("../query/profileSampleFilterLookup.cjs");
22
+ const profileSampleResult = require("../query/profileSampleResult.cjs");
17
23
  const UiCheck = require("../../icons/components/UiCheck.cjs");
18
24
  const UiColumns = require("../../icons/components/UiColumns.cjs");
19
25
  const UiSqlColumn = require("../../icons/components/UiSqlColumn.cjs");
@@ -24,7 +30,7 @@ function ProfileBuilderWorkspace({
24
30
  onApply,
25
31
  onClose
26
32
  }) {
27
- var _a, _b, _c, _d;
33
+ var _a, _b, _c, _d, _e, _f;
28
34
  const baseUrl = connectionBrowserModel.browserBaseUrl(connectionID);
29
35
  const descriptor = reactQuery.useQuery({
30
36
  queryKey: ["profile-builder-descriptor", connectionID],
@@ -68,6 +74,7 @@ function ProfileBuilderWorkspace({
68
74
  const [limits, setLimits] = react.useState(
69
75
  () => rootValue.limits
70
76
  );
77
+ const filterColumns = react.useRef([]);
71
78
  react.useEffect(() => {
72
79
  var _a2;
73
80
  if (!query && ((_a2 = descriptor.data) == null ? void 0 : _a2.defaultQuery)) {
@@ -75,14 +82,17 @@ function ProfileBuilderWorkspace({
75
82
  }
76
83
  }, [(_b = descriptor.data) == null ? void 0 : _b.defaultQuery, query]);
77
84
  const explicitTargetKind = liveOptions.targetKind ?? initialProviderOptions.targetKind;
78
- const inspection = connectionBrowserModel.useInspection({
85
+ const targetOption = ((_d = (_c = descriptor.data) == null ? void 0 : _c.target) == null ? void 0 : _d.kind) === "index" ? descriptor.data.target.option : "";
86
+ const inspection = useInspection.useInspection({
79
87
  cacheKey: "profile-builder-inspection",
80
88
  id: connectionID,
81
89
  baseUrl,
82
- enabled: ((_c = descriptor.data) == null ? void 0 : _c.catalog) === true,
90
+ enabled: ((_e = descriptor.data) == null ? void 0 : _e.catalog) === true,
83
91
  database: selectedDatabase,
84
92
  fallbackDatabase: String(initialProviderOptions.database ?? ""),
85
- target: String(liveOptions.index ?? initialProviderOptions.index ?? ""),
93
+ target: targetOption ? String(
94
+ liveOptions[targetOption] ?? initialProviderOptions[targetOption] ?? ""
95
+ ) : "",
86
96
  ...typeof explicitTargetKind === "string" ? { targetKind: explicitTargetKind } : {}
87
97
  });
88
98
  const browserOptions = react.useMemo(
@@ -100,7 +110,7 @@ function ProfileBuilderWorkspace({
100
110
  },
101
111
  [
102
112
  catalogOptions,
103
- (_d = descriptor.data) == null ? void 0 : _d.initialOptions,
113
+ (_f = descriptor.data) == null ? void 0 : _f.initialOptions,
104
114
  initialProviderOptions,
105
115
  inspection.sqlDatabase
106
116
  ]
@@ -264,34 +274,56 @@ function ProfileBuilderWorkspace({
264
274
  setCatalogOptions(nextOptions);
265
275
  setLiveOptions({ ...browserOptions, ...nextOptions });
266
276
  },
277
+ lookupFilterValues: (request) => profileSampleFilterLookup.lookupProfileSampleFilterValues({
278
+ draft: {
279
+ ...rootValue,
280
+ params,
281
+ profile: rootValue.profile || "sample",
282
+ query: request.query,
283
+ provider: {
284
+ ...rootValue.provider,
285
+ options: effectiveOptions(request.options)
286
+ }
287
+ },
288
+ params: sampleParams,
289
+ filterColumns: filterColumns.current,
290
+ request
291
+ }),
267
292
  execute: async (request) => {
293
+ const sampleDraft = {
294
+ ...rootValue,
295
+ params,
296
+ profile: rootValue.profile || "sample",
297
+ query: request.query,
298
+ provider: {
299
+ ...rootValue.provider,
300
+ options: effectiveOptions(request.options)
301
+ }
302
+ };
268
303
  const result = await connectionBrowserModel.fetchJSON(
269
- "/api/v1/profile/sample",
304
+ profileApi.profileApiPath("profile/sample"),
270
305
  {
271
306
  method: "POST",
272
- headers: { "Content-Type": "application/json" },
273
- body: JSON.stringify({
274
- profile: {
275
- ...rootValue,
276
- params,
277
- profile: rootValue.profile || "sample",
278
- query: request.query,
279
- provider: {
280
- ...rootValue.provider,
281
- options: effectiveOptions(request.options)
282
- }
283
- },
284
- params: sampleParams,
285
- ...request.pagination ? { pagination: request.pagination } : {},
286
- ...request.debug ? { debug: true } : {}
287
- })
307
+ headers: {
308
+ "Content-Type": "application/json",
309
+ ...debugConsoleSignal.debugCaptureHeaders()
310
+ },
311
+ body: JSON.stringify(
312
+ profileSamplePayload.profileSamplePayload({
313
+ draft: sampleDraft,
314
+ request,
315
+ params: sampleParams,
316
+ filterColumns: filterColumns.current
317
+ })
318
+ )
288
319
  }
289
320
  );
321
+ filterColumns.current = profileSampleResult.profileSampleFilterColumns(result);
290
322
  setSampleColumns(result.columns ?? []);
291
323
  setSelectedColumns(
292
324
  new Set((result.columns ?? []).map((column) => column.name))
293
325
  );
294
- return result;
326
+ return profileSampleResult.profileSampleQueryResult(result);
295
327
  },
296
328
  renderResults: ({ defaultView }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-3", children: [
297
329
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 flex-1", children: defaultView }),
@@ -1 +1 @@
1
- {"version":3,"file":"profileBuilderWorkspace.cjs","sources":["../../../src/profiles/editor/profileBuilderWorkspace.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport { Button } from \"../../components/button\";\nimport { Icon } from \"../../data/Icon\";\nimport type { QueryBrowserResult } from \"../../data/query-browser/QueryBrowser.types\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiColumns, UiSqlColumn } from \"../../icons\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n browserBaseUrl,\n fetchJSON,\n mergeProviderOptions,\n useInspection,\n type BrowserDescriptor,\n type ProfileRowLimits,\n} from \"../connections/connectionBrowserModel\";\nimport { ConnectionQueryWorkspace } from \"../connections/connectionQueryWorkspace\";\nimport type { EsSearch } from \"../elasticsearch/esQueryBuilderModel\";\nimport {\n ColumnPicker,\n type ProfileColumn,\n} from \"../fields/profileColumnPicker\";\nimport {\n withProfileLimits,\n type ParamDraft,\n type ProfileProvider,\n} from \"../wizard/profileWizardModel\";\nimport {\n defaultParamValues,\n paramRoles,\n} from \"../elasticsearch/esQueryBuilderForm\";\nimport { mapTimestampColumn } from \"../fields/profileColumnModel\";\nimport { sampleParamSchema } from \"./profileBuilderModel\";\n\n// Same story as ProfileColumn: one ProfileProvider, defined with the draft\n// model. The copy here had drifted to carry `role`, which the canonical type's\n// index signature already admits.\nexport type { ProfileProvider };\n\nexport type ProfileDraft = Record<string, unknown> & {\n profile?: string;\n query?: string;\n provider?: ProfileProvider;\n params?: ParamDraft[];\n columns?: ProfileColumn[];\n /** The row caps this profile sets for itself; unset ones take their default. */\n limits?: ProfileRowLimits;\n};\n\ntype SampleResult = QueryBrowserResult & {\n columns: ProfileColumn[];\n renderedQuery: string;\n};\n\n// Modal's body is a flex child. It must be allowed to shrink and must not own\n// scrolling, otherwise QueryBrowser's intrinsic minimum height expands the\n// whole workspace and pushes the editor/results below the dialog viewport.\n//\n// These are utilities rather than a stylesheet on purpose: a library CSS asset\n// only reaches a consumer that remembers to import it, whereas Tailwind scans\n// this source and folds the rules into the dist/styles.css every consumer\n// already loads.\nexport const profileBuilderModalClassName =\n \"h-[calc(100dvh-2rem)] [&>[data-slot=modal-body]]:flex [&>[data-slot=modal-body]]:min-h-0 [&>[data-slot=modal-body]]:overflow-hidden [&>[data-slot=modal-body]>*]:flex-1 [&>[data-slot=modal-body]>*]:h-auto [&>[data-slot=modal-body]>*]:min-h-0\";\n\nexport function ProfileBuilderWorkspace({\n connectionID,\n rootValue,\n onApply,\n onClose,\n}: {\n connectionID: string;\n rootValue: ProfileDraft;\n onApply: (next: Record<string, unknown>) => void;\n onClose: () => void;\n}) {\n const baseUrl = browserBaseUrl(connectionID);\n const descriptor = useQuery({\n queryKey: [\"profile-builder-descriptor\", connectionID],\n queryFn: () => fetchJSON<BrowserDescriptor>(baseUrl),\n retry: 0,\n });\n const initialProviderOptions = useMemo(\n () => ({ ...rootValue.provider?.options }),\n [rootValue.provider?.options],\n );\n const [query, setQuery] = useState(rootValue.query ?? \"\");\n const [search, setSearch] = useState<EsSearch | undefined>(\n () => initialProviderOptions.search as EsSearch | undefined,\n );\n const [params, setParams] = useState<ParamDraft[]>(\n () => rootValue.params ?? [],\n );\n const [liveOptions, setLiveOptions] = useState<Record<string, unknown>>(\n initialProviderOptions,\n );\n const [catalogOptions, setCatalogOptions] = useState<Record<string, unknown>>(\n {},\n );\n const [sampleParams, setSampleParams] = useState<Record<string, unknown>>(\n () => defaultParamValues(params),\n );\n const [sampleColumns, setSampleColumns] = useState<ProfileColumn[]>([]);\n const [selectedColumns, setSelectedColumns] = useState<Set<string>>(\n () => new Set(),\n );\n const [timestampColumn, setTimestampColumn] = useState(\n () =>\n rootValue.columns?.find((column) => column.kind === \"timestamp\")?.name ??\n \"\",\n );\n const [selectedDatabase, setSelectedDatabase] = useState(\"\");\n const [limits, setLimits] = useState<ProfileRowLimits | undefined>(\n () => rootValue.limits,\n );\n\n useEffect(() => {\n if (!query && descriptor.data?.defaultQuery) {\n setQuery(descriptor.data.defaultQuery);\n }\n }, [descriptor.data?.defaultQuery, query]);\n\n const explicitTargetKind =\n liveOptions.targetKind ?? initialProviderOptions.targetKind;\n const inspection = useInspection({\n cacheKey: \"profile-builder-inspection\",\n id: connectionID,\n baseUrl,\n enabled: descriptor.data?.catalog === true,\n database: selectedDatabase,\n fallbackDatabase: String(initialProviderOptions.database ?? \"\"),\n target: String(liveOptions.index ?? initialProviderOptions.index ?? \"\"),\n ...(typeof explicitTargetKind === \"string\"\n ? { targetKind: explicitTargetKind }\n : {}),\n });\n const browserOptions = useMemo(\n () =>\n mergeProviderOptions({\n layers: [\n descriptor.data?.initialOptions,\n initialProviderOptions,\n catalogOptions,\n ],\n database: inspection.sqlDatabase,\n keepTargetKind: true,\n }),\n [\n catalogOptions,\n descriptor.data?.initialOptions,\n initialProviderOptions,\n inspection.sqlDatabase,\n ],\n );\n // The specification is authored here, not merged from a layer, so it is\n // stamped on last — including its absence, which a lower layer would\n // otherwise reinstate after the author switched back to raw DSL.\n const effectiveOptions = useCallback(\n (options: Record<string, unknown>) => {\n const merged = mergeProviderOptions({\n layers: [initialProviderOptions, catalogOptions, options],\n database: inspection.sqlDatabase,\n });\n if (search) merged.search = search;\n else delete merged.search;\n return merged;\n },\n [catalogOptions, initialProviderOptions, inspection.sqlDatabase, search],\n );\n\n const paramSchema = useMemo(() => sampleParamSchema(params), [params]);\n const existingColumns = rootValue.columns ?? [];\n const existingNames = useMemo(\n () => new Set(existingColumns.map((column) => column.name)),\n [existingColumns],\n );\n\n const applyDraft = (mode: \"query\" | \"merge\" | \"replace\") => {\n const chosen = mapTimestampColumn(\n sampleColumns.filter((column) => selectedColumns.has(column.name)),\n timestampColumn,\n );\n let columns = existingColumns;\n if (mode === \"merge\") {\n columns = mapTimestampColumn(\n [\n ...existingColumns,\n ...chosen.filter((column) => !existingNames.has(column.name)),\n ],\n timestampColumn,\n );\n } else if (mode === \"replace\") {\n if (\n existingColumns.length > 0 &&\n !window.confirm(\n `Replace ${existingColumns.length} configured column${existingColumns.length === 1 ? \"\" : \"s\"}?`,\n )\n ) {\n return;\n }\n columns = chosen;\n }\n const next: ProfileDraft = withProfileLimits(\n {\n ...rootValue,\n query,\n params,\n provider: {\n ...rootValue.provider,\n options: effectiveOptions(liveOptions),\n },\n ...(mode === \"query\" ? {} : { columns }),\n },\n limits,\n );\n onApply(next);\n onClose();\n };\n\n const footer = (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!query.trim() && !search}\n onClick={() => applyDraft(\"query\")}\n >\n <Icon icon={UiCheck} className=\"size-4\" />\n Use query\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={selectedColumns.size === 0}\n onClick={() => applyDraft(\"merge\")}\n >\n <Icon icon={UiColumns} className=\"size-4\" />\n Merge selected\n </Button>\n <Button\n type=\"button\"\n disabled={selectedColumns.size === 0}\n onClick={() => applyDraft(\"replace\")}\n >\n <Icon icon={UiSqlColumn} className=\"size-4\" />\n Replace columns\n </Button>\n </div>\n );\n\n return (\n <Modal\n open\n onClose={onClose}\n title={`Build profile from ${connectionID}`}\n size=\"full\"\n className={profileBuilderModalClassName}\n footer={footer}\n >\n <div className=\"flex h-full min-h-0 flex-col gap-3\">\n {Object.keys(paramSchema.properties ?? {}).length > 0 ? (\n <div className=\"shrink-0 rounded-md border bg-card px-3 py-2\">\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">\n Temporary sample parameters (not saved)\n </div>\n <JsonSchemaForm\n schema={paramSchema}\n value={sampleParams}\n onChange={setSampleParams}\n size=\"sm\"\n inline\n showPreferencesMenu={false}\n persistPreferences={false}\n />\n </div>\n ) : null}\n {descriptor.isLoading ? (\n <WorkspaceMessage>Loading connection browser…</WorkspaceMessage>\n ) : descriptor.isError ? (\n <WorkspaceMessage error>\n {errorMessage(\n descriptor.error,\n \"Unable to load this connection browser\",\n )}\n </WorkspaceMessage>\n ) : descriptor.data ? (\n <ConnectionQueryWorkspace\n id={`profile-builder:${connectionID}`}\n title=\"Profile query\"\n descriptor={descriptor.data}\n inspection={inspection}\n onDatabaseChange={setSelectedDatabase}\n query={query}\n onQueryChange={setQuery}\n options={browserOptions}\n onOptionsChange={setLiveOptions}\n search={search}\n onSearchChange={(transition) => {\n setSearch(transition.search);\n setQuery(transition.query);\n }}\n {...(limits ? { limits } : {})}\n onLimitsChange={setLimits}\n params={params}\n onParamMappingChange={(edit) => {\n setSearch(edit.search);\n setParams(edit.params);\n }}\n paramValues={sampleParams}\n paramRoles={paramRoles(params)}\n compileBaseUrl={baseUrl}\n className=\"h-full min-h-0\"\n onCatalogSelect={(node) => {\n if (node.query) setQuery(node.query);\n const nextOptions = node.options ?? {};\n setCatalogOptions(nextOptions);\n setLiveOptions({ ...browserOptions, ...nextOptions });\n }}\n execute={async (request) => {\n const result = await fetchJSON<SampleResult>(\n \"/api/v1/profile/sample\",\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n profile: {\n ...rootValue,\n params,\n profile: rootValue.profile || \"sample\",\n query: request.query,\n provider: {\n ...rootValue.provider,\n options: effectiveOptions(request.options),\n },\n },\n params: sampleParams,\n ...(request.pagination\n ? { pagination: request.pagination }\n : {}),\n ...(request.debug ? { debug: true } : {}),\n }),\n },\n );\n setSampleColumns(result.columns ?? []);\n setSelectedColumns(\n new Set((result.columns ?? []).map((column) => column.name)),\n );\n return result;\n }}\n renderResults={({ defaultView }) => (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3\">\n <div className=\"min-h-0 flex-1\">{defaultView}</div>\n {sampleColumns.length > 0 ? (\n <ColumnPicker\n columns={sampleColumns}\n selected={selectedColumns}\n existing={existingNames}\n onChange={setSelectedColumns}\n timestampColumn={timestampColumn}\n onTimestampColumnChange={setTimestampColumn}\n />\n ) : null}\n </div>\n )}\n />\n ) : (\n <WorkspaceMessage>\n This saved connection does not expose a query browser.\n </WorkspaceMessage>\n )}\n </div>\n </Modal>\n );\n}\n\nfunction WorkspaceMessage({\n children,\n error = false,\n}: {\n children: ReactNode;\n error?: boolean;\n}) {\n return (\n <div\n className={`grid min-h-80 flex-1 place-items-center rounded-md border border-dashed p-6 text-sm ${error ? \"border-destructive/40 text-destructive\" : \"text-muted-foreground\"}`}\n >\n {children}\n </div>\n );\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : fallback;\n}\n"],"names":["browserBaseUrl","useQuery","fetchJSON","useMemo","_a","useState","defaultParamValues","_b","useEffect","useInspection","mergeProviderOptions","useCallback","sampleParamSchema","mapTimestampColumn","withProfileLimits","jsxs","jsx","Button","Icon","UiCheck","UiColumns","UiSqlColumn","Modal","JsonSchemaForm","ConnectionQueryWorkspace","paramRoles","ColumnPicker"],"mappings":"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"}
1
+ {"version":3,"file":"profileBuilderWorkspace.cjs","sources":["../../../src/profiles/editor/profileBuilderWorkspace.tsx"],"sourcesContent":["import { JsonSchemaForm } from \"../../components/JsonSchemaForm\";\nimport { Button } from \"../../components/button\";\nimport { debugCaptureHeaders } from \"../../data/debugConsoleSignal\";\nimport { Icon } from \"../../data/Icon\";\nimport { Modal } from \"../../overlay/Modal\";\nimport { UiCheck, UiColumns, UiSqlColumn } from \"../../icons\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n browserBaseUrl,\n fetchJSON,\n mergeProviderOptions,\n type BrowserDescriptor,\n type ProfileRowLimits,\n} from \"../connections/connectionBrowserModel\";\nimport { ConnectionQueryWorkspace } from \"../connections/connectionQueryWorkspace\";\nimport { useInspection } from \"../connections/useInspection\";\nimport { profileApiPath } from \"../profileApi\";\nimport type { EsSearch } from \"../elasticsearch/esQueryBuilderModel\";\nimport {\n ColumnPicker,\n type ProfileColumn,\n} from \"../fields/profileColumnPicker\";\nimport {\n withProfileLimits,\n type ParamDraft,\n type ProfileProvider,\n} from \"../wizard/profileWizardModel\";\nimport {\n defaultParamValues,\n paramRoles,\n} from \"../elasticsearch/esQueryBuilderForm\";\nimport { mapTimestampColumn } from \"../fields/profileColumnModel\";\nimport { sampleParamSchema } from \"./profileBuilderModel\";\nimport { profileSamplePayload } from \"../query/profileSamplePayload\";\nimport { lookupProfileSampleFilterValues } from \"../query/profileSampleFilterLookup\";\nimport {\n profileSampleFilterColumns,\n profileSampleQueryResult,\n type ProfileSampleResponse,\n} from \"../query/profileSampleResult\";\n\n// Same story as ProfileColumn: one ProfileProvider, defined with the draft\n// model. The copy here had drifted to carry `role`, which the canonical type's\n// index signature already admits.\nexport type { ProfileProvider };\n\nexport type ProfileDraft = Record<string, unknown> & {\n profile?: string;\n query?: string;\n provider?: ProfileProvider;\n params?: ParamDraft[];\n columns?: ProfileColumn[];\n /** The row caps this profile sets for itself; unset ones take their default. */\n limits?: ProfileRowLimits;\n};\n\n// Modal's body is a flex child. It must be allowed to shrink and must not own\n// scrolling, otherwise QueryBrowser's intrinsic minimum height expands the\n// whole workspace and pushes the editor/results below the dialog viewport.\n//\n// These are utilities rather than a stylesheet on purpose: a library CSS asset\n// only reaches a consumer that remembers to import it, whereas Tailwind scans\n// this source and folds the rules into the dist/styles.css every consumer\n// already loads.\nexport const profileBuilderModalClassName =\n \"h-[calc(100dvh-2rem)] [&>[data-slot=modal-body]]:flex [&>[data-slot=modal-body]]:min-h-0 [&>[data-slot=modal-body]]:overflow-hidden [&>[data-slot=modal-body]>*]:flex-1 [&>[data-slot=modal-body]>*]:h-auto [&>[data-slot=modal-body]>*]:min-h-0\";\n\nexport function ProfileBuilderWorkspace({\n connectionID,\n rootValue,\n onApply,\n onClose,\n}: {\n connectionID: string;\n rootValue: ProfileDraft;\n onApply: (next: Record<string, unknown>) => void;\n onClose: () => void;\n}) {\n const baseUrl = browserBaseUrl(connectionID);\n const descriptor = useQuery({\n queryKey: [\"profile-builder-descriptor\", connectionID],\n queryFn: () => fetchJSON<BrowserDescriptor>(baseUrl),\n retry: 0,\n });\n const initialProviderOptions = useMemo(\n () => ({ ...rootValue.provider?.options }),\n [rootValue.provider?.options],\n );\n const [query, setQuery] = useState(rootValue.query ?? \"\");\n const [search, setSearch] = useState<EsSearch | undefined>(\n () => initialProviderOptions.search as EsSearch | undefined,\n );\n const [params, setParams] = useState<ParamDraft[]>(\n () => rootValue.params ?? [],\n );\n const [liveOptions, setLiveOptions] = useState<Record<string, unknown>>(\n initialProviderOptions,\n );\n const [catalogOptions, setCatalogOptions] = useState<Record<string, unknown>>(\n {},\n );\n const [sampleParams, setSampleParams] = useState<Record<string, unknown>>(\n () => defaultParamValues(params),\n );\n const [sampleColumns, setSampleColumns] = useState<ProfileColumn[]>([]);\n const [selectedColumns, setSelectedColumns] = useState<Set<string>>(\n () => new Set(),\n );\n const [timestampColumn, setTimestampColumn] = useState(\n () =>\n rootValue.columns?.find((column) => column.kind === \"timestamp\")?.name ??\n \"\",\n );\n const [selectedDatabase, setSelectedDatabase] = useState(\"\");\n const [limits, setLimits] = useState<ProfileRowLimits | undefined>(\n () => rootValue.limits,\n );\n const filterColumns = useRef<ProfileColumn[]>([]);\n\n useEffect(() => {\n if (!query && descriptor.data?.defaultQuery) {\n setQuery(descriptor.data.defaultQuery);\n }\n }, [descriptor.data?.defaultQuery, query]);\n\n const explicitTargetKind =\n liveOptions.targetKind ?? initialProviderOptions.targetKind;\n const targetOption =\n descriptor.data?.target?.kind === \"index\"\n ? descriptor.data.target.option\n : \"\";\n const inspection = useInspection({\n cacheKey: \"profile-builder-inspection\",\n id: connectionID,\n baseUrl,\n enabled: descriptor.data?.catalog === true,\n database: selectedDatabase,\n fallbackDatabase: String(initialProviderOptions.database ?? \"\"),\n target: targetOption\n ? String(\n liveOptions[targetOption] ??\n initialProviderOptions[targetOption] ??\n \"\",\n )\n : \"\",\n ...(typeof explicitTargetKind === \"string\"\n ? { targetKind: explicitTargetKind }\n : {}),\n });\n const browserOptions = useMemo(\n () =>\n mergeProviderOptions({\n layers: [\n descriptor.data?.initialOptions,\n initialProviderOptions,\n catalogOptions,\n ],\n database: inspection.sqlDatabase,\n keepTargetKind: true,\n }),\n [\n catalogOptions,\n descriptor.data?.initialOptions,\n initialProviderOptions,\n inspection.sqlDatabase,\n ],\n );\n // The specification is authored here, not merged from a layer, so it is\n // stamped on last — including its absence, which a lower layer would\n // otherwise reinstate after the author switched back to raw DSL.\n const effectiveOptions = useCallback(\n (options: Record<string, unknown>) => {\n const merged = mergeProviderOptions({\n layers: [initialProviderOptions, catalogOptions, options],\n database: inspection.sqlDatabase,\n });\n if (search) merged.search = search;\n else delete merged.search;\n return merged;\n },\n [catalogOptions, initialProviderOptions, inspection.sqlDatabase, search],\n );\n\n const paramSchema = useMemo(() => sampleParamSchema(params), [params]);\n const existingColumns = rootValue.columns ?? [];\n const existingNames = useMemo(\n () => new Set(existingColumns.map((column) => column.name)),\n [existingColumns],\n );\n\n const applyDraft = (mode: \"query\" | \"merge\" | \"replace\") => {\n const chosen = mapTimestampColumn(\n sampleColumns.filter((column) => selectedColumns.has(column.name)),\n timestampColumn,\n );\n let columns = existingColumns;\n if (mode === \"merge\") {\n columns = mapTimestampColumn(\n [\n ...existingColumns,\n ...chosen.filter((column) => !existingNames.has(column.name)),\n ],\n timestampColumn,\n );\n } else if (mode === \"replace\") {\n if (\n existingColumns.length > 0 &&\n !window.confirm(\n `Replace ${existingColumns.length} configured column${existingColumns.length === 1 ? \"\" : \"s\"}?`,\n )\n ) {\n return;\n }\n columns = chosen;\n }\n const next: ProfileDraft = withProfileLimits(\n {\n ...rootValue,\n query,\n params,\n provider: {\n ...rootValue.provider,\n options: effectiveOptions(liveOptions),\n },\n ...(mode === \"query\" ? {} : { columns }),\n },\n limits,\n );\n onApply(next);\n onClose();\n };\n\n const footer = (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button type=\"button\" variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={!query.trim() && !search}\n onClick={() => applyDraft(\"query\")}\n >\n <Icon icon={UiCheck} className=\"size-4\" />\n Use query\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={selectedColumns.size === 0}\n onClick={() => applyDraft(\"merge\")}\n >\n <Icon icon={UiColumns} className=\"size-4\" />\n Merge selected\n </Button>\n <Button\n type=\"button\"\n disabled={selectedColumns.size === 0}\n onClick={() => applyDraft(\"replace\")}\n >\n <Icon icon={UiSqlColumn} className=\"size-4\" />\n Replace columns\n </Button>\n </div>\n );\n\n return (\n <Modal\n open\n onClose={onClose}\n title={`Build profile from ${connectionID}`}\n size=\"full\"\n className={profileBuilderModalClassName}\n footer={footer}\n >\n <div className=\"flex h-full min-h-0 flex-col gap-3\">\n {Object.keys(paramSchema.properties ?? {}).length > 0 ? (\n <div className=\"shrink-0 rounded-md border bg-card px-3 py-2\">\n <div className=\"mb-2 text-xs font-medium text-muted-foreground\">\n Temporary sample parameters (not saved)\n </div>\n <JsonSchemaForm\n schema={paramSchema}\n value={sampleParams}\n onChange={setSampleParams}\n size=\"sm\"\n inline\n showPreferencesMenu={false}\n persistPreferences={false}\n />\n </div>\n ) : null}\n {descriptor.isLoading ? (\n <WorkspaceMessage>Loading connection browser…</WorkspaceMessage>\n ) : descriptor.isError ? (\n <WorkspaceMessage error>\n {errorMessage(\n descriptor.error,\n \"Unable to load this connection browser\",\n )}\n </WorkspaceMessage>\n ) : descriptor.data ? (\n <ConnectionQueryWorkspace\n id={`profile-builder:${connectionID}`}\n title=\"Profile query\"\n descriptor={descriptor.data}\n inspection={inspection}\n onDatabaseChange={setSelectedDatabase}\n query={query}\n onQueryChange={setQuery}\n options={browserOptions}\n onOptionsChange={setLiveOptions}\n search={search}\n onSearchChange={(transition) => {\n setSearch(transition.search);\n setQuery(transition.query);\n }}\n {...(limits ? { limits } : {})}\n onLimitsChange={setLimits}\n params={params}\n onParamMappingChange={(edit) => {\n setSearch(edit.search);\n setParams(edit.params);\n }}\n paramValues={sampleParams}\n paramRoles={paramRoles(params)}\n compileBaseUrl={baseUrl}\n className=\"h-full min-h-0\"\n onCatalogSelect={(node) => {\n if (node.query) setQuery(node.query);\n const nextOptions = node.options ?? {};\n setCatalogOptions(nextOptions);\n setLiveOptions({ ...browserOptions, ...nextOptions });\n }}\n lookupFilterValues={(request) =>\n lookupProfileSampleFilterValues({\n draft: {\n ...rootValue,\n params,\n profile: rootValue.profile || \"sample\",\n query: request.query,\n provider: {\n ...rootValue.provider,\n options: effectiveOptions(request.options),\n },\n },\n params: sampleParams,\n filterColumns: filterColumns.current,\n request,\n })\n }\n execute={async (request) => {\n const sampleDraft: ProfileDraft = {\n ...rootValue,\n params,\n profile: rootValue.profile || \"sample\",\n query: request.query,\n provider: {\n ...rootValue.provider,\n options: effectiveOptions(request.options),\n },\n };\n const result = await fetchJSON<ProfileSampleResponse>(\n profileApiPath(\"profile/sample\"),\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...debugCaptureHeaders(),\n },\n body: JSON.stringify(\n profileSamplePayload({\n draft: sampleDraft,\n request,\n params: sampleParams,\n filterColumns: filterColumns.current,\n }),\n ),\n },\n );\n filterColumns.current = profileSampleFilterColumns(result);\n setSampleColumns(result.columns ?? []);\n setSelectedColumns(\n new Set((result.columns ?? []).map((column) => column.name)),\n );\n return profileSampleQueryResult(result);\n }}\n renderResults={({ defaultView }) => (\n <div className=\"flex min-h-0 flex-1 flex-col gap-3\">\n <div className=\"min-h-0 flex-1\">{defaultView}</div>\n {sampleColumns.length > 0 ? (\n <ColumnPicker\n columns={sampleColumns}\n selected={selectedColumns}\n existing={existingNames}\n onChange={setSelectedColumns}\n timestampColumn={timestampColumn}\n onTimestampColumnChange={setTimestampColumn}\n />\n ) : null}\n </div>\n )}\n />\n ) : (\n <WorkspaceMessage>\n This saved connection does not expose a query browser.\n </WorkspaceMessage>\n )}\n </div>\n </Modal>\n );\n}\n\nfunction WorkspaceMessage({\n children,\n error = false,\n}: {\n children: ReactNode;\n error?: boolean;\n}) {\n return (\n <div\n className={`grid min-h-80 flex-1 place-items-center rounded-md border border-dashed p-6 text-sm ${error ? \"border-destructive/40 text-destructive\" : \"text-muted-foreground\"}`}\n >\n {children}\n </div>\n );\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : fallback;\n}\n"],"names":["browserBaseUrl","useQuery","fetchJSON","useMemo","_a","useState","defaultParamValues","_b","useRef","useEffect","useInspection","mergeProviderOptions","useCallback","sampleParamSchema","mapTimestampColumn","withProfileLimits","jsxs","jsx","Button","Icon","UiCheck","UiColumns","UiSqlColumn","Modal","JsonSchemaForm","ConnectionQueryWorkspace","paramRoles","lookupProfileSampleFilterValues","profileApiPath","debugCaptureHeaders","profileSamplePayload","profileSampleFilterColumns","profileSampleQueryResult","ColumnPicker"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"profileBuilderWorkspace.d.ts","sourceRoot":"","sources":["../../../src/profiles/editor/profileBuilderWorkspace.tsx"],"names":[],"mappings":"AAcA,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAWtC,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,gFAAgF;IAChF,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAeF,eAAO,MAAM,4BAA4B,qPAC2M,CAAC;AAErP,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,GACR,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,2CA6SA"}
1
+ {"version":3,"file":"profileBuilderWorkspace.d.ts","sourceRoot":"","sources":["../../../src/profiles/editor/profileBuilderWorkspace.tsx"],"names":[],"mappings":"AAeA,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,uCAAuC,CAAC;AAK/C,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AAkBtC,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,gFAAgF;IAChF,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAUF,eAAO,MAAM,4BAA4B,qPAC2M,CAAC;AAErP,wBAAgB,uBAAuB,CAAC,EACtC,YAAY,EACZ,SAAS,EACT,OAAO,EACP,OAAO,GACR,EAAE;IACD,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,YAAY,CAAC;IACxB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,2CA8UA"}