@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,17 +1,23 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { JsonSchemaForm } from "../../components/JsonSchemaForm.js";
3
3
  import { Button } from "../../components/button.js";
4
+ import { debugCaptureHeaders } from "../../data/debugConsoleSignal.js";
4
5
  import { Icon } from "../../data/Icon.js";
5
6
  import { Modal } from "../../overlay/Modal.js";
6
7
  import { useQuery } from "@tanstack/react-query";
7
- import { useMemo, useState, useEffect, useCallback } from "react";
8
- import { browserBaseUrl, fetchJSON, useInspection, mergeProviderOptions } from "../connections/connectionBrowserModel.js";
8
+ import { useMemo, useState, useRef, useEffect, useCallback } from "react";
9
+ import { browserBaseUrl, fetchJSON, mergeProviderOptions } from "../connections/connectionBrowserModel.js";
9
10
  import { ConnectionQueryWorkspace } from "../connections/connectionQueryWorkspace.js";
11
+ import { useInspection } from "../connections/useInspection.js";
12
+ import { profileApiPath } from "../profileApi.js";
10
13
  import { ColumnPicker } from "../fields/profileColumnPicker.js";
11
14
  import { withProfileLimits } from "../wizard/profileWizardModel.js";
12
15
  import { defaultParamValues, paramRoles } from "../elasticsearch/esQueryBuilderForm.js";
13
16
  import { mapTimestampColumn } from "../fields/profileColumnModel.js";
14
17
  import { sampleParamSchema } from "./profileBuilderModel.js";
18
+ import { profileSamplePayload } from "../query/profileSamplePayload.js";
19
+ import { lookupProfileSampleFilterValues } from "../query/profileSampleFilterLookup.js";
20
+ import { profileSampleFilterColumns, profileSampleQueryResult } from "../query/profileSampleResult.js";
15
21
  import { UiCheck } from "../../icons/components/UiCheck.js";
16
22
  import { UiColumns } from "../../icons/components/UiColumns.js";
17
23
  import { UiSqlColumn } from "../../icons/components/UiSqlColumn.js";
@@ -22,7 +28,7 @@ function ProfileBuilderWorkspace({
22
28
  onApply,
23
29
  onClose
24
30
  }) {
25
- var _a, _b, _c, _d;
31
+ var _a, _b, _c, _d, _e, _f;
26
32
  const baseUrl = browserBaseUrl(connectionID);
27
33
  const descriptor = useQuery({
28
34
  queryKey: ["profile-builder-descriptor", connectionID],
@@ -66,6 +72,7 @@ function ProfileBuilderWorkspace({
66
72
  const [limits, setLimits] = useState(
67
73
  () => rootValue.limits
68
74
  );
75
+ const filterColumns = useRef([]);
69
76
  useEffect(() => {
70
77
  var _a2;
71
78
  if (!query && ((_a2 = descriptor.data) == null ? void 0 : _a2.defaultQuery)) {
@@ -73,14 +80,17 @@ function ProfileBuilderWorkspace({
73
80
  }
74
81
  }, [(_b = descriptor.data) == null ? void 0 : _b.defaultQuery, query]);
75
82
  const explicitTargetKind = liveOptions.targetKind ?? initialProviderOptions.targetKind;
83
+ const targetOption = ((_d = (_c = descriptor.data) == null ? void 0 : _c.target) == null ? void 0 : _d.kind) === "index" ? descriptor.data.target.option : "";
76
84
  const inspection = useInspection({
77
85
  cacheKey: "profile-builder-inspection",
78
86
  id: connectionID,
79
87
  baseUrl,
80
- enabled: ((_c = descriptor.data) == null ? void 0 : _c.catalog) === true,
88
+ enabled: ((_e = descriptor.data) == null ? void 0 : _e.catalog) === true,
81
89
  database: selectedDatabase,
82
90
  fallbackDatabase: String(initialProviderOptions.database ?? ""),
83
- target: String(liveOptions.index ?? initialProviderOptions.index ?? ""),
91
+ target: targetOption ? String(
92
+ liveOptions[targetOption] ?? initialProviderOptions[targetOption] ?? ""
93
+ ) : "",
84
94
  ...typeof explicitTargetKind === "string" ? { targetKind: explicitTargetKind } : {}
85
95
  });
86
96
  const browserOptions = useMemo(
@@ -98,7 +108,7 @@ function ProfileBuilderWorkspace({
98
108
  },
99
109
  [
100
110
  catalogOptions,
101
- (_d = descriptor.data) == null ? void 0 : _d.initialOptions,
111
+ (_f = descriptor.data) == null ? void 0 : _f.initialOptions,
102
112
  initialProviderOptions,
103
113
  inspection.sqlDatabase
104
114
  ]
@@ -262,34 +272,56 @@ function ProfileBuilderWorkspace({
262
272
  setCatalogOptions(nextOptions);
263
273
  setLiveOptions({ ...browserOptions, ...nextOptions });
264
274
  },
275
+ lookupFilterValues: (request) => lookupProfileSampleFilterValues({
276
+ draft: {
277
+ ...rootValue,
278
+ params,
279
+ profile: rootValue.profile || "sample",
280
+ query: request.query,
281
+ provider: {
282
+ ...rootValue.provider,
283
+ options: effectiveOptions(request.options)
284
+ }
285
+ },
286
+ params: sampleParams,
287
+ filterColumns: filterColumns.current,
288
+ request
289
+ }),
265
290
  execute: async (request) => {
291
+ const sampleDraft = {
292
+ ...rootValue,
293
+ params,
294
+ profile: rootValue.profile || "sample",
295
+ query: request.query,
296
+ provider: {
297
+ ...rootValue.provider,
298
+ options: effectiveOptions(request.options)
299
+ }
300
+ };
266
301
  const result = await fetchJSON(
267
- "/api/v1/profile/sample",
302
+ profileApiPath("profile/sample"),
268
303
  {
269
304
  method: "POST",
270
- headers: { "Content-Type": "application/json" },
271
- body: JSON.stringify({
272
- profile: {
273
- ...rootValue,
274
- params,
275
- profile: rootValue.profile || "sample",
276
- query: request.query,
277
- provider: {
278
- ...rootValue.provider,
279
- options: effectiveOptions(request.options)
280
- }
281
- },
282
- params: sampleParams,
283
- ...request.pagination ? { pagination: request.pagination } : {},
284
- ...request.debug ? { debug: true } : {}
285
- })
305
+ headers: {
306
+ "Content-Type": "application/json",
307
+ ...debugCaptureHeaders()
308
+ },
309
+ body: JSON.stringify(
310
+ profileSamplePayload({
311
+ draft: sampleDraft,
312
+ request,
313
+ params: sampleParams,
314
+ filterColumns: filterColumns.current
315
+ })
316
+ )
286
317
  }
287
318
  );
319
+ filterColumns.current = profileSampleFilterColumns(result);
288
320
  setSampleColumns(result.columns ?? []);
289
321
  setSelectedColumns(
290
322
  new Set((result.columns ?? []).map((column) => column.name))
291
323
  );
292
- return result;
324
+ return profileSampleQueryResult(result);
293
325
  },
294
326
  renderResults: ({ defaultView }) => /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col gap-3", children: [
295
327
  /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", children: defaultView }),
@@ -1 +1 @@
1
- {"version":3,"file":"profileBuilderWorkspace.js","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":["_a","_b"],"mappings":"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"}
1
+ {"version":3,"file":"profileBuilderWorkspace.js","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":["_a","_b"],"mappings":"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"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const Combobox = require("../../components/Combobox.cjs");
5
5
  const connectionBrowserModel = require("../connections/connectionBrowserModel.cjs");
6
+ const useInspection = require("../connections/useInspection.cjs");
6
7
  const esQueryBuilderModel = require("./esQueryBuilderModel.cjs");
7
8
  const esFieldValues = require("./esFieldValues.cjs");
8
9
  const esQueryClauseGroup = require("./esQueryClauseGroup.cjs");
@@ -69,7 +70,10 @@ function EsQueryBuilder({
69
70
  values: ({ path, field }) => {
70
71
  const target = esFieldValues.valueLookupField(fields, field);
71
72
  if (!target) return void 0;
72
- return values({ field: target, search: { ...search, query: esQueryBuilderModel.removeAt(root, path) } });
73
+ return values({
74
+ field: target,
75
+ search: { ...search, query: esQueryBuilderModel.removeAt(root, path) }
76
+ });
73
77
  }
74
78
  } : {}
75
79
  };
@@ -181,7 +185,7 @@ function EsQueryBuilderField({
181
185
  const connectionID = connectionBrowserModel.savedConnectionID((_a = rootValue.provider) == null ? void 0 : _a.connection);
182
186
  const baseUrl = connectionID ? connectionBrowserModel.browserBaseUrl(connectionID) : "";
183
187
  const target = String(((_c = (_b = rootValue.provider) == null ? void 0 : _b.options) == null ? void 0 : _c.index) ?? "");
184
- const inspection = connectionBrowserModel.useInspection({
188
+ const inspection = useInspection.useInspection({
185
189
  cacheKey: "es-query-builder",
186
190
  id: connectionID ?? "",
187
191
  baseUrl,
@@ -199,7 +203,12 @@ function EsQueryBuilderField({
199
203
  roles,
200
204
  enabled: baseUrl !== ""
201
205
  });
202
- const values = esFieldValues.makeFieldValueLookup({ baseUrl, index: target, params, roles });
206
+ const values = esFieldValues.makeFieldValueLookup({
207
+ baseUrl,
208
+ index: target,
209
+ params,
210
+ roles
211
+ });
203
212
  return /* @__PURE__ */ jsxRuntime.jsx(
204
213
  EsQueryBuilder,
205
214
  {
@@ -1 +1 @@
1
- {"version":3,"file":"esQueryBuilder.cjs","sources":["../../../src/profiles/elasticsearch/esQueryBuilder.tsx"],"sourcesContent":["/**\n * The query builder panel and the form extension that mounts it. The panel is\n * pure: it takes a specification and the vocabulary the schema described, and\n * reports edits. Everything that needs a connection — field mappings and the\n * compiled preview — is wired by the host that has one.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport type { JsonSchemaProperty } from \"../../components/json-schema-form-types\";\nimport {\n browserBaseUrl,\n savedConnectionID,\n useInspection\n} from \"../connections/connectionBrowserModel\";\nimport {\n conditionAt,\n emptyGroup,\n insertAt,\n removeAt,\n updateAt,\n type EsSearch,\n type EsTimeFieldFormat,\n} from \"./esQueryBuilderModel\";\nimport {\n makeFieldValueLookup,\n valueLookupField,\n type FieldValuesSource\n} from \"./esFieldValues\";\nimport { EsQueryClauseGroup } from \"./esQueryClauseGroup\";\nimport type {\n EsQueryContext,\n EsQueryTreeActions\n} from \"./esQueryConditionRow\";\nimport {\n esBuilderVocabulary,\n type EsBuilderVocabulary,\n type EsFieldMapping\n} from \"./esQueryOperators\";\nimport { EsQueryOutputEditor } from \"./esQueryOutputEditor\";\nimport {\n EsQueryPreview\n } from \"./esQueryPreview\";\nimport { EsQuerySortEditor } from \"./esQuerySortEditor\";\nimport type { ProfileDraft } from \"../editor/profileBuilderWorkspace\";\nimport type { ParamDraft } from \"../wizard/profileWizardModel\";\nimport {\n bindParamOperand,\n reconcileSearchParamMappings,\n removeParamMapping,\n type ParamMappingEdit\n} from \"./esParamMappingModel\";\nimport {\n defaultParamValues,\n esQueryFields,\n paramRoles,\n selectTimeField,\n timeFieldFormatRequired,\n timeFieldMappings,\n} from \"./esQueryBuilderForm\";\nimport { useCompiledSearch, type EsCompilation } from \"./esQueryCompile\";\n\nexport type EsQueryBuilderProps = {\n search: EsSearch;\n onChange: (search: EsSearch) => void;\n fields: EsFieldMapping[];\n vocabulary: EsBuilderVocabulary;\n /** Declared profile parameters an operand can bind to. */\n params?: ParamDraft[];\n onMappingChange?: (edit: ParamMappingEdit) => void;\n /** Where a field's own values come from; absent without a connection. */\n values?: FieldValuesSource;\n compilation?: EsCompilation;\n className?: string;\n};\n\nexport function EsQueryBuilder({\n search,\n onChange,\n fields,\n vocabulary,\n params = [],\n onMappingChange,\n values,\n compilation,\n className\n}: EsQueryBuilderProps) {\n const root = search.query ?? emptyGroup();\n const requiresTimeFieldFormat = timeFieldFormatRequired(\n fields,\n search.timeField,\n );\n const mappingFieldsChanged = (edit: ParamMappingEdit) =>\n edit.params.some((param, index) => param.field !== params[index]?.field);\n const commitMappingEdit = (edit: ParamMappingEdit) => {\n if (onMappingChange) {\n onMappingChange(edit);\n return;\n }\n if (mappingFieldsChanged(edit)) {\n throw new Error(\n \"list parameter mappings require an atomic mapping change handler\",\n );\n }\n onChange(edit.search);\n };\n const commitSearchEdit = (nextSearch: EsSearch) => {\n const edit = reconcileSearchParamMappings({\n previousSearch: search,\n nextSearch,\n params\n });\n if (mappingFieldsChanged(edit)) {\n commitMappingEdit(edit);\n return;\n }\n onChange(nextSearch);\n };\n const context: EsQueryContext = {\n fields,\n vocabulary,\n params,\n // The builder owns the tree, so it — not the host — decides what a lookup is\n // scoped by: the query without the row being edited. Leaving that row in\n // would filter the suggestions by the half-typed value they are meant to\n // complete.\n ...(values\n ? {\n values: ({ path, field }) => {\n const target = valueLookupField(fields, field);\n if (!target) return undefined;\n return values({ field: target, search: { ...search, query: removeAt(root, path) } });\n }\n }\n : {})\n };\n const actions: EsQueryTreeActions = {\n update: (path, update) =>\n commitSearchEdit({ ...search, query: updateAt(root, path, update) }),\n insert: (groupPath, condition) =>\n commitSearchEdit({\n ...search,\n query: insertAt(\n root,\n groupPath,\n conditionAt(root, groupPath)?.conditions?.length ?? 0,\n condition,\n )\n }),\n remove: (path) =>\n commitSearchEdit({ ...search, query: removeAt(root, path) }),\n mapParam: (path, operand, name) => {\n const edit = bindParamOperand({ search, params, path, operand, name });\n commitMappingEdit(edit);\n },\n unmapParam: (path, name) => {\n const edit = removeParamMapping({ search, params, name, path });\n commitMappingEdit(edit);\n }\n };\n\n return (\n <div className={className ?? \"flex min-w-0 flex-col gap-3\"}>\n <EsQueryClauseGroup\n condition={root}\n path={[]}\n context={context}\n actions={actions}\n root\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Time field</span>\n <Combobox\n ariaLabel=\"Time field\"\n className=\"min-w-48\"\n value={search.timeField ?? \"\"}\n onChange={(next) => onChange(selectTimeField(search, fields, next))}\n options={timeFieldMappings(fields).map((field) => ({\n value: field.name,\n label: field.name,\n }))}\n placeholder=\"Timestamp field…\"\n allowCustomValue\n />\n {requiresTimeFieldFormat ? (\n <>\n <span className=\"text-xs text-muted-foreground\">Epoch unit</span>\n <Combobox\n ariaLabel=\"Time field format\"\n ariaRequired\n required\n invalid={!search.timeFieldFormat}\n className=\"min-w-40\"\n value={search.timeFieldFormat ?? \"\"}\n onChange={(next) =>\n onChange({\n ...search,\n timeFieldFormat: (next || undefined) as\n | EsTimeFieldFormat\n | undefined,\n })\n }\n options={(vocabulary.timeFieldFormats ?? []).map((format) => ({\n value: format,\n label: timeFieldFormatLabel(format),\n }))}\n placeholder=\"Select epoch unit…\"\n allowCustomValue={false}\n />\n </>\n ) : null}\n <span className=\"text-xs text-muted-foreground\">\n Where time-from and time-to parameters apply\n </span>\n </div>\n <EsQuerySortEditor\n sort={search.sort ?? []}\n fields={fields}\n orders={vocabulary.sortOrders}\n onChange={(sort) => onChange({ ...search, sort: sort.length ? sort : undefined })}\n />\n <EsQueryOutputEditor\n search={search}\n onChange={(patch) => onChange({ ...search, ...patch })}\n />\n {compilation ? <EsQueryPreview compilation={compilation} /> : null}\n </div>\n );\n}\n\n/**\n * The builder as the profile form mounts it. The form knows the connection and\n * the index, so the field mappings and the compiled preview come from the same\n * browser endpoints the connection browser uses.\n */\nexport function EsQueryBuilderField({\n search,\n onChange,\n schema,\n rootValue,\n onRootChange\n}: {\n search: EsSearch;\n onChange: (next: unknown) => void;\n schema: JsonSchemaProperty;\n rootValue: ProfileDraft;\n onRootChange?: ((next: Record<string, unknown>) => void) | undefined;\n}) {\n const connectionID = savedConnectionID(rootValue.provider?.connection);\n const baseUrl = connectionID ? browserBaseUrl(connectionID) : \"\";\n const target = String(rootValue.provider?.options?.index ?? \"\");\n const inspection = useInspection({\n cacheKey: \"es-query-builder\",\n id: connectionID ?? \"\",\n baseUrl,\n enabled: baseUrl !== \"\",\n database: \"\",\n target\n });\n const roles = paramRoles(rootValue.params);\n const params = defaultParamValues(rootValue.params);\n const compilation = useCompiledSearch({\n baseUrl,\n index: target,\n search,\n params,\n roles,\n enabled: baseUrl !== \"\"\n });\n const values = makeFieldValueLookup({ baseUrl, index: target, params, roles });\n\n return (\n <EsQueryBuilder\n search={search}\n onChange={(next) => onChange(next)}\n fields={esQueryFields(inspection.completion)}\n vocabulary={esBuilderVocabulary({ properties: { search: schema } })}\n params={rootValue.params ?? []}\n onMappingChange={(edit) => {\n if (!onRootChange) {\n throw new Error(\n \"query parameter mappings require an atomic root form update\",\n );\n }\n onRootChange({\n ...rootValue,\n params: edit.params,\n provider: {\n ...rootValue.provider,\n options: {\n ...rootValue.provider?.options,\n search: edit.search\n }\n }\n });\n }}\n {...(values ? { values } : {})}\n compilation={compilation}\n />\n );\n}\n\nfunction timeFieldFormatLabel(format: EsTimeFieldFormat): string {\n switch (format) {\n case \"epoch_second\":\n return \"Seconds\";\n case \"epoch_millis\":\n return \"Milliseconds\";\n case \"epoch_micros\":\n return \"Microseconds\";\n case \"epoch_nanos\":\n return \"Nanoseconds\";\n }\n}\n"],"names":["emptyGroup","timeFieldFormatRequired","reconcileSearchParamMappings","valueLookupField","removeAt","updateAt","insertAt","conditionAt","bindParamOperand","removeParamMapping","jsxs","jsx","EsQueryClauseGroup","Combobox","selectTimeField","timeFieldMappings","Fragment","EsQuerySortEditor","EsQueryOutputEditor","EsQueryPreview","savedConnectionID","browserBaseUrl","useInspection","paramRoles","defaultParamValues","useCompiledSearch","makeFieldValueLookup","esQueryFields","esBuilderVocabulary","_a"],"mappings":"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"}
1
+ {"version":3,"file":"esQueryBuilder.cjs","sources":["../../../src/profiles/elasticsearch/esQueryBuilder.tsx"],"sourcesContent":["/**\n * The query builder panel and the form extension that mounts it. The panel is\n * pure: it takes a specification and the vocabulary the schema described, and\n * reports edits. Everything that needs a connection — field mappings and the\n * compiled preview — is wired by the host that has one.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport type { JsonSchemaProperty } from \"../../components/json-schema-form-types\";\nimport {\n browserBaseUrl,\n savedConnectionID,\n} from \"../connections/connectionBrowserModel\";\nimport { useInspection } from \"../connections/useInspection\";\nimport {\n conditionAt,\n emptyGroup,\n insertAt,\n removeAt,\n updateAt,\n type EsSearch,\n type EsTimeFieldFormat,\n} from \"./esQueryBuilderModel\";\nimport {\n makeFieldValueLookup,\n valueLookupField,\n type FieldValuesSource,\n} from \"./esFieldValues\";\nimport { EsQueryClauseGroup } from \"./esQueryClauseGroup\";\nimport type { EsQueryContext, EsQueryTreeActions } from \"./esQueryConditionRow\";\nimport {\n esBuilderVocabulary,\n type EsBuilderVocabulary,\n type EsFieldMapping,\n} from \"./esQueryOperators\";\nimport { EsQueryOutputEditor } from \"./esQueryOutputEditor\";\nimport { EsQueryPreview } from \"./esQueryPreview\";\nimport { EsQuerySortEditor } from \"./esQuerySortEditor\";\nimport type { ProfileDraft } from \"../editor/profileBuilderWorkspace\";\nimport type { ParamDraft } from \"../wizard/profileWizardModel\";\nimport {\n bindParamOperand,\n reconcileSearchParamMappings,\n removeParamMapping,\n type ParamMappingEdit,\n} from \"./esParamMappingModel\";\nimport {\n defaultParamValues,\n esQueryFields,\n paramRoles,\n selectTimeField,\n timeFieldFormatRequired,\n timeFieldMappings,\n} from \"./esQueryBuilderForm\";\nimport { useCompiledSearch, type EsCompilation } from \"./esQueryCompile\";\n\nexport type EsQueryBuilderProps = {\n search: EsSearch;\n onChange: (search: EsSearch) => void;\n fields: EsFieldMapping[];\n vocabulary: EsBuilderVocabulary;\n /** Declared profile parameters an operand can bind to. */\n params?: ParamDraft[];\n onMappingChange?: (edit: ParamMappingEdit) => void;\n /** Where a field's own values come from; absent without a connection. */\n values?: FieldValuesSource;\n compilation?: EsCompilation;\n className?: string;\n};\n\nexport function EsQueryBuilder({\n search,\n onChange,\n fields,\n vocabulary,\n params = [],\n onMappingChange,\n values,\n compilation,\n className,\n}: EsQueryBuilderProps) {\n const root = search.query ?? emptyGroup();\n const requiresTimeFieldFormat = timeFieldFormatRequired(\n fields,\n search.timeField,\n );\n const mappingFieldsChanged = (edit: ParamMappingEdit) =>\n edit.params.some((param, index) => param.field !== params[index]?.field);\n const commitMappingEdit = (edit: ParamMappingEdit) => {\n if (onMappingChange) {\n onMappingChange(edit);\n return;\n }\n if (mappingFieldsChanged(edit)) {\n throw new Error(\n \"list parameter mappings require an atomic mapping change handler\",\n );\n }\n onChange(edit.search);\n };\n const commitSearchEdit = (nextSearch: EsSearch) => {\n const edit = reconcileSearchParamMappings({\n previousSearch: search,\n nextSearch,\n params,\n });\n if (mappingFieldsChanged(edit)) {\n commitMappingEdit(edit);\n return;\n }\n onChange(nextSearch);\n };\n const context: EsQueryContext = {\n fields,\n vocabulary,\n params,\n // The builder owns the tree, so it — not the host — decides what a lookup is\n // scoped by: the query without the row being edited. Leaving that row in\n // would filter the suggestions by the half-typed value they are meant to\n // complete.\n ...(values\n ? {\n values: ({ path, field }) => {\n const target = valueLookupField(fields, field);\n if (!target) return undefined;\n return values({\n field: target,\n search: { ...search, query: removeAt(root, path) },\n });\n },\n }\n : {}),\n };\n const actions: EsQueryTreeActions = {\n update: (path, update) =>\n commitSearchEdit({ ...search, query: updateAt(root, path, update) }),\n insert: (groupPath, condition) =>\n commitSearchEdit({\n ...search,\n query: insertAt(\n root,\n groupPath,\n conditionAt(root, groupPath)?.conditions?.length ?? 0,\n condition,\n ),\n }),\n remove: (path) =>\n commitSearchEdit({ ...search, query: removeAt(root, path) }),\n mapParam: (path, operand, name) => {\n const edit = bindParamOperand({ search, params, path, operand, name });\n commitMappingEdit(edit);\n },\n unmapParam: (path, name) => {\n const edit = removeParamMapping({ search, params, name, path });\n commitMappingEdit(edit);\n },\n };\n\n return (\n <div className={className ?? \"flex min-w-0 flex-col gap-3\"}>\n <EsQueryClauseGroup\n condition={root}\n path={[]}\n context={context}\n actions={actions}\n root\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Time field</span>\n <Combobox\n ariaLabel=\"Time field\"\n className=\"min-w-48\"\n value={search.timeField ?? \"\"}\n onChange={(next) => onChange(selectTimeField(search, fields, next))}\n options={timeFieldMappings(fields).map((field) => ({\n value: field.name,\n label: field.name,\n }))}\n placeholder=\"Timestamp field…\"\n allowCustomValue\n />\n {requiresTimeFieldFormat ? (\n <>\n <span className=\"text-xs text-muted-foreground\">Epoch unit</span>\n <Combobox\n ariaLabel=\"Time field format\"\n ariaRequired\n required\n invalid={!search.timeFieldFormat}\n className=\"min-w-40\"\n value={search.timeFieldFormat ?? \"\"}\n onChange={(next) =>\n onChange({\n ...search,\n timeFieldFormat: (next || undefined) as\n | EsTimeFieldFormat\n | undefined,\n })\n }\n options={(vocabulary.timeFieldFormats ?? []).map((format) => ({\n value: format,\n label: timeFieldFormatLabel(format),\n }))}\n placeholder=\"Select epoch unit…\"\n allowCustomValue={false}\n />\n </>\n ) : null}\n <span className=\"text-xs text-muted-foreground\">\n Where time-from and time-to parameters apply\n </span>\n </div>\n <EsQuerySortEditor\n sort={search.sort ?? []}\n fields={fields}\n orders={vocabulary.sortOrders}\n onChange={(sort) =>\n onChange({ ...search, sort: sort.length ? sort : undefined })\n }\n />\n <EsQueryOutputEditor\n search={search}\n onChange={(patch) => onChange({ ...search, ...patch })}\n />\n {compilation ? <EsQueryPreview compilation={compilation} /> : null}\n </div>\n );\n}\n\n/**\n * The builder as the profile form mounts it. The form knows the connection and\n * the index, so the field mappings and the compiled preview come from the same\n * browser endpoints the connection browser uses.\n */\nexport function EsQueryBuilderField({\n search,\n onChange,\n schema,\n rootValue,\n onRootChange,\n}: {\n search: EsSearch;\n onChange: (next: unknown) => void;\n schema: JsonSchemaProperty;\n rootValue: ProfileDraft;\n onRootChange?: ((next: Record<string, unknown>) => void) | undefined;\n}) {\n const connectionID = savedConnectionID(rootValue.provider?.connection);\n const baseUrl = connectionID ? browserBaseUrl(connectionID) : \"\";\n const target = String(rootValue.provider?.options?.index ?? \"\");\n const inspection = useInspection({\n cacheKey: \"es-query-builder\",\n id: connectionID ?? \"\",\n baseUrl,\n enabled: baseUrl !== \"\",\n database: \"\",\n target,\n });\n const roles = paramRoles(rootValue.params);\n const params = defaultParamValues(rootValue.params);\n const compilation = useCompiledSearch({\n baseUrl,\n index: target,\n search,\n params,\n roles,\n enabled: baseUrl !== \"\",\n });\n const values = makeFieldValueLookup({\n baseUrl,\n index: target,\n params,\n roles,\n });\n\n return (\n <EsQueryBuilder\n search={search}\n onChange={(next) => onChange(next)}\n fields={esQueryFields(inspection.completion)}\n vocabulary={esBuilderVocabulary({ properties: { search: schema } })}\n params={rootValue.params ?? []}\n onMappingChange={(edit) => {\n if (!onRootChange) {\n throw new Error(\n \"query parameter mappings require an atomic root form update\",\n );\n }\n onRootChange({\n ...rootValue,\n params: edit.params,\n provider: {\n ...rootValue.provider,\n options: {\n ...rootValue.provider?.options,\n search: edit.search,\n },\n },\n });\n }}\n {...(values ? { values } : {})}\n compilation={compilation}\n />\n );\n}\n\nfunction timeFieldFormatLabel(format: EsTimeFieldFormat): string {\n switch (format) {\n case \"epoch_second\":\n return \"Seconds\";\n case \"epoch_millis\":\n return \"Milliseconds\";\n case \"epoch_micros\":\n return \"Microseconds\";\n case \"epoch_nanos\":\n return \"Nanoseconds\";\n }\n}\n"],"names":["emptyGroup","timeFieldFormatRequired","reconcileSearchParamMappings","valueLookupField","removeAt","updateAt","insertAt","conditionAt","bindParamOperand","removeParamMapping","jsxs","jsx","EsQueryClauseGroup","Combobox","selectTimeField","timeFieldMappings","Fragment","EsQuerySortEditor","EsQueryOutputEditor","EsQueryPreview","savedConnectionID","browserBaseUrl","useInspection","paramRoles","defaultParamValues","useCompiledSearch","makeFieldValueLookup","esQueryFields","esBuilderVocabulary","_a"],"mappings":"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"}
@@ -19,13 +19,13 @@ export type EsQueryBuilderProps = {
19
19
  compilation?: EsCompilation;
20
20
  className?: string;
21
21
  };
22
- export declare function EsQueryBuilder({ search, onChange, fields, vocabulary, params, onMappingChange, values, compilation, className }: EsQueryBuilderProps): import("react/jsx-runtime").JSX.Element;
22
+ export declare function EsQueryBuilder({ search, onChange, fields, vocabulary, params, onMappingChange, values, compilation, className, }: EsQueryBuilderProps): import("react/jsx-runtime").JSX.Element;
23
23
  /**
24
24
  * The builder as the profile form mounts it. The form knows the connection and
25
25
  * the index, so the field mappings and the compiled preview come from the same
26
26
  * browser endpoints the connection browser uses.
27
27
  */
28
- export declare function EsQueryBuilderField({ search, onChange, schema, rootValue, onRootChange }: {
28
+ export declare function EsQueryBuilderField({ search, onChange, schema, rootValue, onRootChange, }: {
29
29
  search: EsSearch;
30
30
  onChange: (next: unknown) => void;
31
31
  schema: JsonSchemaProperty;
@@ -1 +1 @@
1
- {"version":3,"file":"esQueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/profiles/elasticsearch/esQueryBuilder.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAMlF,OAAO,EAML,KAAK,QAAQ,EAEd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAMzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,UAAU,EAAE,mBAAmB,CAAC;IAChC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,yEAAyE;IACzE,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,UAAU,EACV,MAAW,EACX,eAAe,EACf,MAAM,EACN,WAAW,EACX,SAAS,EACV,EAAE,mBAAmB,2CA8IrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,EACb,EAAE;IACD,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACtE,2CAqDA"}
1
+ {"version":3,"file":"esQueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/profiles/elasticsearch/esQueryBuilder.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAMlF,OAAO,EAML,KAAK,QAAQ,EAEd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC;IACrC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,UAAU,EAAE,mBAAmB,CAAC;IAChC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,yEAAyE;IACzE,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,UAAU,EACV,MAAW,EACX,eAAe,EACf,MAAM,EACN,WAAW,EACX,SAAS,GACV,EAAE,mBAAmB,2CAmJrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE;IACD,MAAM,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACtE,2CA0DA"}
@@ -1,6 +1,7 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { Combobox } from "../../components/Combobox.js";
3
- import { savedConnectionID, browserBaseUrl, useInspection } from "../connections/connectionBrowserModel.js";
3
+ import { savedConnectionID, browserBaseUrl } from "../connections/connectionBrowserModel.js";
4
+ import { useInspection } from "../connections/useInspection.js";
4
5
  import { emptyGroup, removeAt, insertAt, conditionAt, updateAt } from "./esQueryBuilderModel.js";
5
6
  import { makeFieldValueLookup, valueLookupField } from "./esFieldValues.js";
6
7
  import { EsQueryClauseGroup } from "./esQueryClauseGroup.js";
@@ -67,7 +68,10 @@ function EsQueryBuilder({
67
68
  values: ({ path, field }) => {
68
69
  const target = valueLookupField(fields, field);
69
70
  if (!target) return void 0;
70
- return values({ field: target, search: { ...search, query: removeAt(root, path) } });
71
+ return values({
72
+ field: target,
73
+ search: { ...search, query: removeAt(root, path) }
74
+ });
71
75
  }
72
76
  } : {}
73
77
  };
@@ -197,7 +201,12 @@ function EsQueryBuilderField({
197
201
  roles,
198
202
  enabled: baseUrl !== ""
199
203
  });
200
- const values = makeFieldValueLookup({ baseUrl, index: target, params, roles });
204
+ const values = makeFieldValueLookup({
205
+ baseUrl,
206
+ index: target,
207
+ params,
208
+ roles
209
+ });
201
210
  return /* @__PURE__ */ jsx(
202
211
  EsQueryBuilder,
203
212
  {
@@ -1 +1 @@
1
- {"version":3,"file":"esQueryBuilder.js","sources":["../../../src/profiles/elasticsearch/esQueryBuilder.tsx"],"sourcesContent":["/**\n * The query builder panel and the form extension that mounts it. The panel is\n * pure: it takes a specification and the vocabulary the schema described, and\n * reports edits. Everything that needs a connection — field mappings and the\n * compiled preview — is wired by the host that has one.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport type { JsonSchemaProperty } from \"../../components/json-schema-form-types\";\nimport {\n browserBaseUrl,\n savedConnectionID,\n useInspection\n} from \"../connections/connectionBrowserModel\";\nimport {\n conditionAt,\n emptyGroup,\n insertAt,\n removeAt,\n updateAt,\n type EsSearch,\n type EsTimeFieldFormat,\n} from \"./esQueryBuilderModel\";\nimport {\n makeFieldValueLookup,\n valueLookupField,\n type FieldValuesSource\n} from \"./esFieldValues\";\nimport { EsQueryClauseGroup } from \"./esQueryClauseGroup\";\nimport type {\n EsQueryContext,\n EsQueryTreeActions\n} from \"./esQueryConditionRow\";\nimport {\n esBuilderVocabulary,\n type EsBuilderVocabulary,\n type EsFieldMapping\n} from \"./esQueryOperators\";\nimport { EsQueryOutputEditor } from \"./esQueryOutputEditor\";\nimport {\n EsQueryPreview\n } from \"./esQueryPreview\";\nimport { EsQuerySortEditor } from \"./esQuerySortEditor\";\nimport type { ProfileDraft } from \"../editor/profileBuilderWorkspace\";\nimport type { ParamDraft } from \"../wizard/profileWizardModel\";\nimport {\n bindParamOperand,\n reconcileSearchParamMappings,\n removeParamMapping,\n type ParamMappingEdit\n} from \"./esParamMappingModel\";\nimport {\n defaultParamValues,\n esQueryFields,\n paramRoles,\n selectTimeField,\n timeFieldFormatRequired,\n timeFieldMappings,\n} from \"./esQueryBuilderForm\";\nimport { useCompiledSearch, type EsCompilation } from \"./esQueryCompile\";\n\nexport type EsQueryBuilderProps = {\n search: EsSearch;\n onChange: (search: EsSearch) => void;\n fields: EsFieldMapping[];\n vocabulary: EsBuilderVocabulary;\n /** Declared profile parameters an operand can bind to. */\n params?: ParamDraft[];\n onMappingChange?: (edit: ParamMappingEdit) => void;\n /** Where a field's own values come from; absent without a connection. */\n values?: FieldValuesSource;\n compilation?: EsCompilation;\n className?: string;\n};\n\nexport function EsQueryBuilder({\n search,\n onChange,\n fields,\n vocabulary,\n params = [],\n onMappingChange,\n values,\n compilation,\n className\n}: EsQueryBuilderProps) {\n const root = search.query ?? emptyGroup();\n const requiresTimeFieldFormat = timeFieldFormatRequired(\n fields,\n search.timeField,\n );\n const mappingFieldsChanged = (edit: ParamMappingEdit) =>\n edit.params.some((param, index) => param.field !== params[index]?.field);\n const commitMappingEdit = (edit: ParamMappingEdit) => {\n if (onMappingChange) {\n onMappingChange(edit);\n return;\n }\n if (mappingFieldsChanged(edit)) {\n throw new Error(\n \"list parameter mappings require an atomic mapping change handler\",\n );\n }\n onChange(edit.search);\n };\n const commitSearchEdit = (nextSearch: EsSearch) => {\n const edit = reconcileSearchParamMappings({\n previousSearch: search,\n nextSearch,\n params\n });\n if (mappingFieldsChanged(edit)) {\n commitMappingEdit(edit);\n return;\n }\n onChange(nextSearch);\n };\n const context: EsQueryContext = {\n fields,\n vocabulary,\n params,\n // The builder owns the tree, so it — not the host — decides what a lookup is\n // scoped by: the query without the row being edited. Leaving that row in\n // would filter the suggestions by the half-typed value they are meant to\n // complete.\n ...(values\n ? {\n values: ({ path, field }) => {\n const target = valueLookupField(fields, field);\n if (!target) return undefined;\n return values({ field: target, search: { ...search, query: removeAt(root, path) } });\n }\n }\n : {})\n };\n const actions: EsQueryTreeActions = {\n update: (path, update) =>\n commitSearchEdit({ ...search, query: updateAt(root, path, update) }),\n insert: (groupPath, condition) =>\n commitSearchEdit({\n ...search,\n query: insertAt(\n root,\n groupPath,\n conditionAt(root, groupPath)?.conditions?.length ?? 0,\n condition,\n )\n }),\n remove: (path) =>\n commitSearchEdit({ ...search, query: removeAt(root, path) }),\n mapParam: (path, operand, name) => {\n const edit = bindParamOperand({ search, params, path, operand, name });\n commitMappingEdit(edit);\n },\n unmapParam: (path, name) => {\n const edit = removeParamMapping({ search, params, name, path });\n commitMappingEdit(edit);\n }\n };\n\n return (\n <div className={className ?? \"flex min-w-0 flex-col gap-3\"}>\n <EsQueryClauseGroup\n condition={root}\n path={[]}\n context={context}\n actions={actions}\n root\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Time field</span>\n <Combobox\n ariaLabel=\"Time field\"\n className=\"min-w-48\"\n value={search.timeField ?? \"\"}\n onChange={(next) => onChange(selectTimeField(search, fields, next))}\n options={timeFieldMappings(fields).map((field) => ({\n value: field.name,\n label: field.name,\n }))}\n placeholder=\"Timestamp field…\"\n allowCustomValue\n />\n {requiresTimeFieldFormat ? (\n <>\n <span className=\"text-xs text-muted-foreground\">Epoch unit</span>\n <Combobox\n ariaLabel=\"Time field format\"\n ariaRequired\n required\n invalid={!search.timeFieldFormat}\n className=\"min-w-40\"\n value={search.timeFieldFormat ?? \"\"}\n onChange={(next) =>\n onChange({\n ...search,\n timeFieldFormat: (next || undefined) as\n | EsTimeFieldFormat\n | undefined,\n })\n }\n options={(vocabulary.timeFieldFormats ?? []).map((format) => ({\n value: format,\n label: timeFieldFormatLabel(format),\n }))}\n placeholder=\"Select epoch unit…\"\n allowCustomValue={false}\n />\n </>\n ) : null}\n <span className=\"text-xs text-muted-foreground\">\n Where time-from and time-to parameters apply\n </span>\n </div>\n <EsQuerySortEditor\n sort={search.sort ?? []}\n fields={fields}\n orders={vocabulary.sortOrders}\n onChange={(sort) => onChange({ ...search, sort: sort.length ? sort : undefined })}\n />\n <EsQueryOutputEditor\n search={search}\n onChange={(patch) => onChange({ ...search, ...patch })}\n />\n {compilation ? <EsQueryPreview compilation={compilation} /> : null}\n </div>\n );\n}\n\n/**\n * The builder as the profile form mounts it. The form knows the connection and\n * the index, so the field mappings and the compiled preview come from the same\n * browser endpoints the connection browser uses.\n */\nexport function EsQueryBuilderField({\n search,\n onChange,\n schema,\n rootValue,\n onRootChange\n}: {\n search: EsSearch;\n onChange: (next: unknown) => void;\n schema: JsonSchemaProperty;\n rootValue: ProfileDraft;\n onRootChange?: ((next: Record<string, unknown>) => void) | undefined;\n}) {\n const connectionID = savedConnectionID(rootValue.provider?.connection);\n const baseUrl = connectionID ? browserBaseUrl(connectionID) : \"\";\n const target = String(rootValue.provider?.options?.index ?? \"\");\n const inspection = useInspection({\n cacheKey: \"es-query-builder\",\n id: connectionID ?? \"\",\n baseUrl,\n enabled: baseUrl !== \"\",\n database: \"\",\n target\n });\n const roles = paramRoles(rootValue.params);\n const params = defaultParamValues(rootValue.params);\n const compilation = useCompiledSearch({\n baseUrl,\n index: target,\n search,\n params,\n roles,\n enabled: baseUrl !== \"\"\n });\n const values = makeFieldValueLookup({ baseUrl, index: target, params, roles });\n\n return (\n <EsQueryBuilder\n search={search}\n onChange={(next) => onChange(next)}\n fields={esQueryFields(inspection.completion)}\n vocabulary={esBuilderVocabulary({ properties: { search: schema } })}\n params={rootValue.params ?? []}\n onMappingChange={(edit) => {\n if (!onRootChange) {\n throw new Error(\n \"query parameter mappings require an atomic root form update\",\n );\n }\n onRootChange({\n ...rootValue,\n params: edit.params,\n provider: {\n ...rootValue.provider,\n options: {\n ...rootValue.provider?.options,\n search: edit.search\n }\n }\n });\n }}\n {...(values ? { values } : {})}\n compilation={compilation}\n />\n );\n}\n\nfunction timeFieldFormatLabel(format: EsTimeFieldFormat): string {\n switch (format) {\n case \"epoch_second\":\n return \"Seconds\";\n case \"epoch_millis\":\n return \"Milliseconds\";\n case \"epoch_micros\":\n return \"Microseconds\";\n case \"epoch_nanos\":\n return \"Nanoseconds\";\n }\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"esQueryBuilder.js","sources":["../../../src/profiles/elasticsearch/esQueryBuilder.tsx"],"sourcesContent":["/**\n * The query builder panel and the form extension that mounts it. The panel is\n * pure: it takes a specification and the vocabulary the schema described, and\n * reports edits. Everything that needs a connection — field mappings and the\n * compiled preview — is wired by the host that has one.\n */\n\nimport { Combobox } from \"../../components/Combobox\";\nimport type { JsonSchemaProperty } from \"../../components/json-schema-form-types\";\nimport {\n browserBaseUrl,\n savedConnectionID,\n} from \"../connections/connectionBrowserModel\";\nimport { useInspection } from \"../connections/useInspection\";\nimport {\n conditionAt,\n emptyGroup,\n insertAt,\n removeAt,\n updateAt,\n type EsSearch,\n type EsTimeFieldFormat,\n} from \"./esQueryBuilderModel\";\nimport {\n makeFieldValueLookup,\n valueLookupField,\n type FieldValuesSource,\n} from \"./esFieldValues\";\nimport { EsQueryClauseGroup } from \"./esQueryClauseGroup\";\nimport type { EsQueryContext, EsQueryTreeActions } from \"./esQueryConditionRow\";\nimport {\n esBuilderVocabulary,\n type EsBuilderVocabulary,\n type EsFieldMapping,\n} from \"./esQueryOperators\";\nimport { EsQueryOutputEditor } from \"./esQueryOutputEditor\";\nimport { EsQueryPreview } from \"./esQueryPreview\";\nimport { EsQuerySortEditor } from \"./esQuerySortEditor\";\nimport type { ProfileDraft } from \"../editor/profileBuilderWorkspace\";\nimport type { ParamDraft } from \"../wizard/profileWizardModel\";\nimport {\n bindParamOperand,\n reconcileSearchParamMappings,\n removeParamMapping,\n type ParamMappingEdit,\n} from \"./esParamMappingModel\";\nimport {\n defaultParamValues,\n esQueryFields,\n paramRoles,\n selectTimeField,\n timeFieldFormatRequired,\n timeFieldMappings,\n} from \"./esQueryBuilderForm\";\nimport { useCompiledSearch, type EsCompilation } from \"./esQueryCompile\";\n\nexport type EsQueryBuilderProps = {\n search: EsSearch;\n onChange: (search: EsSearch) => void;\n fields: EsFieldMapping[];\n vocabulary: EsBuilderVocabulary;\n /** Declared profile parameters an operand can bind to. */\n params?: ParamDraft[];\n onMappingChange?: (edit: ParamMappingEdit) => void;\n /** Where a field's own values come from; absent without a connection. */\n values?: FieldValuesSource;\n compilation?: EsCompilation;\n className?: string;\n};\n\nexport function EsQueryBuilder({\n search,\n onChange,\n fields,\n vocabulary,\n params = [],\n onMappingChange,\n values,\n compilation,\n className,\n}: EsQueryBuilderProps) {\n const root = search.query ?? emptyGroup();\n const requiresTimeFieldFormat = timeFieldFormatRequired(\n fields,\n search.timeField,\n );\n const mappingFieldsChanged = (edit: ParamMappingEdit) =>\n edit.params.some((param, index) => param.field !== params[index]?.field);\n const commitMappingEdit = (edit: ParamMappingEdit) => {\n if (onMappingChange) {\n onMappingChange(edit);\n return;\n }\n if (mappingFieldsChanged(edit)) {\n throw new Error(\n \"list parameter mappings require an atomic mapping change handler\",\n );\n }\n onChange(edit.search);\n };\n const commitSearchEdit = (nextSearch: EsSearch) => {\n const edit = reconcileSearchParamMappings({\n previousSearch: search,\n nextSearch,\n params,\n });\n if (mappingFieldsChanged(edit)) {\n commitMappingEdit(edit);\n return;\n }\n onChange(nextSearch);\n };\n const context: EsQueryContext = {\n fields,\n vocabulary,\n params,\n // The builder owns the tree, so it — not the host — decides what a lookup is\n // scoped by: the query without the row being edited. Leaving that row in\n // would filter the suggestions by the half-typed value they are meant to\n // complete.\n ...(values\n ? {\n values: ({ path, field }) => {\n const target = valueLookupField(fields, field);\n if (!target) return undefined;\n return values({\n field: target,\n search: { ...search, query: removeAt(root, path) },\n });\n },\n }\n : {}),\n };\n const actions: EsQueryTreeActions = {\n update: (path, update) =>\n commitSearchEdit({ ...search, query: updateAt(root, path, update) }),\n insert: (groupPath, condition) =>\n commitSearchEdit({\n ...search,\n query: insertAt(\n root,\n groupPath,\n conditionAt(root, groupPath)?.conditions?.length ?? 0,\n condition,\n ),\n }),\n remove: (path) =>\n commitSearchEdit({ ...search, query: removeAt(root, path) }),\n mapParam: (path, operand, name) => {\n const edit = bindParamOperand({ search, params, path, operand, name });\n commitMappingEdit(edit);\n },\n unmapParam: (path, name) => {\n const edit = removeParamMapping({ search, params, name, path });\n commitMappingEdit(edit);\n },\n };\n\n return (\n <div className={className ?? \"flex min-w-0 flex-col gap-3\"}>\n <EsQueryClauseGroup\n condition={root}\n path={[]}\n context={context}\n actions={actions}\n root\n />\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">Time field</span>\n <Combobox\n ariaLabel=\"Time field\"\n className=\"min-w-48\"\n value={search.timeField ?? \"\"}\n onChange={(next) => onChange(selectTimeField(search, fields, next))}\n options={timeFieldMappings(fields).map((field) => ({\n value: field.name,\n label: field.name,\n }))}\n placeholder=\"Timestamp field…\"\n allowCustomValue\n />\n {requiresTimeFieldFormat ? (\n <>\n <span className=\"text-xs text-muted-foreground\">Epoch unit</span>\n <Combobox\n ariaLabel=\"Time field format\"\n ariaRequired\n required\n invalid={!search.timeFieldFormat}\n className=\"min-w-40\"\n value={search.timeFieldFormat ?? \"\"}\n onChange={(next) =>\n onChange({\n ...search,\n timeFieldFormat: (next || undefined) as\n | EsTimeFieldFormat\n | undefined,\n })\n }\n options={(vocabulary.timeFieldFormats ?? []).map((format) => ({\n value: format,\n label: timeFieldFormatLabel(format),\n }))}\n placeholder=\"Select epoch unit…\"\n allowCustomValue={false}\n />\n </>\n ) : null}\n <span className=\"text-xs text-muted-foreground\">\n Where time-from and time-to parameters apply\n </span>\n </div>\n <EsQuerySortEditor\n sort={search.sort ?? []}\n fields={fields}\n orders={vocabulary.sortOrders}\n onChange={(sort) =>\n onChange({ ...search, sort: sort.length ? sort : undefined })\n }\n />\n <EsQueryOutputEditor\n search={search}\n onChange={(patch) => onChange({ ...search, ...patch })}\n />\n {compilation ? <EsQueryPreview compilation={compilation} /> : null}\n </div>\n );\n}\n\n/**\n * The builder as the profile form mounts it. The form knows the connection and\n * the index, so the field mappings and the compiled preview come from the same\n * browser endpoints the connection browser uses.\n */\nexport function EsQueryBuilderField({\n search,\n onChange,\n schema,\n rootValue,\n onRootChange,\n}: {\n search: EsSearch;\n onChange: (next: unknown) => void;\n schema: JsonSchemaProperty;\n rootValue: ProfileDraft;\n onRootChange?: ((next: Record<string, unknown>) => void) | undefined;\n}) {\n const connectionID = savedConnectionID(rootValue.provider?.connection);\n const baseUrl = connectionID ? browserBaseUrl(connectionID) : \"\";\n const target = String(rootValue.provider?.options?.index ?? \"\");\n const inspection = useInspection({\n cacheKey: \"es-query-builder\",\n id: connectionID ?? \"\",\n baseUrl,\n enabled: baseUrl !== \"\",\n database: \"\",\n target,\n });\n const roles = paramRoles(rootValue.params);\n const params = defaultParamValues(rootValue.params);\n const compilation = useCompiledSearch({\n baseUrl,\n index: target,\n search,\n params,\n roles,\n enabled: baseUrl !== \"\",\n });\n const values = makeFieldValueLookup({\n baseUrl,\n index: target,\n params,\n roles,\n });\n\n return (\n <EsQueryBuilder\n search={search}\n onChange={(next) => onChange(next)}\n fields={esQueryFields(inspection.completion)}\n vocabulary={esBuilderVocabulary({ properties: { search: schema } })}\n params={rootValue.params ?? []}\n onMappingChange={(edit) => {\n if (!onRootChange) {\n throw new Error(\n \"query parameter mappings require an atomic root form update\",\n );\n }\n onRootChange({\n ...rootValue,\n params: edit.params,\n provider: {\n ...rootValue.provider,\n options: {\n ...rootValue.provider?.options,\n search: edit.search,\n },\n },\n });\n }}\n {...(values ? { values } : {})}\n compilation={compilation}\n />\n );\n}\n\nfunction timeFieldFormatLabel(format: EsTimeFieldFormat): string {\n switch (format) {\n case \"epoch_second\":\n return \"Seconds\";\n case \"epoch_millis\":\n return \"Milliseconds\";\n case \"epoch_micros\":\n return \"Microseconds\";\n case \"epoch_nanos\":\n return \"Nanoseconds\";\n }\n}\n"],"names":["_a"],"mappings":"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"}