@malloy-publisher/sdk 0.0.137 → 0.0.139

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 (586) hide show
  1. package/README.md +122 -1
  2. package/dist/ServerProvider-Bzid56gJ.cjs.js +1 -0
  3. package/dist/{ServerProvider-BGGK1ZQ_.es.js → ServerProvider-D-y63tG0.es.js} +550 -478
  4. package/dist/client/api.d.ts +144 -53
  5. package/dist/client/index.cjs.js +1 -1
  6. package/dist/client/index.es.js +22 -21
  7. package/dist/components/Notebook/Notebook.d.ts +4 -1
  8. package/dist/components/Notebook/NotebookCell.d.ts +2 -2
  9. package/dist/components/Notebook/types.d.ts +21 -0
  10. package/dist/components/filter/DimensionFilter.d.ts +43 -0
  11. package/dist/components/filter/index.d.ts +4 -0
  12. package/dist/components/filter/utils.d.ts +75 -0
  13. package/dist/components/index.d.ts +7 -6
  14. package/dist/components/styles.d.ts +3 -3
  15. package/dist/hooks/index.d.ts +4 -0
  16. package/dist/hooks/useDimensionFilters.d.ts +84 -0
  17. package/dist/hooks/useDimensionFiltersFromSpec.d.ts +52 -0
  18. package/dist/hooks/useDimensionFiltersQuery.d.ts +79 -0
  19. package/dist/hooks/useDimensionalFilterRangeData.d.ts +106 -0
  20. package/dist/index.cjs.js +141 -112
  21. package/dist/index.d.ts +3 -2
  22. package/dist/index.es.js +47903 -39798
  23. package/dist/sdk.css +1 -1
  24. package/package.json +16 -11
  25. package/src/components/Home/Home.tsx +15 -11
  26. package/src/components/Notebook/Notebook.tsx +391 -6
  27. package/src/components/Notebook/NotebookCell.tsx +2 -2
  28. package/src/components/Notebook/types.ts +24 -0
  29. package/src/components/Package/Connections.tsx +3 -6
  30. package/src/components/RenderedResult/RenderedResult.tsx +22 -3
  31. package/src/components/filter/DimensionFilter.tsx +738 -0
  32. package/src/components/filter/index.ts +20 -0
  33. package/src/components/filter/utils.ts +354 -0
  34. package/src/components/highlighter.ts +14 -6
  35. package/src/components/index.ts +7 -6
  36. package/src/hooks/index.ts +31 -0
  37. package/src/hooks/useDimensionFilters.ts +322 -0
  38. package/src/hooks/useDimensionFiltersFromSpec.ts +117 -0
  39. package/src/hooks/useDimensionFiltersQuery.ts +300 -0
  40. package/src/hooks/useDimensionalFilterRangeData.ts +758 -0
  41. package/src/index.ts +3 -2
  42. package/dist/ServerProvider-lXAaPKBb.cjs.js +0 -1
  43. package/dist/abap-BmBUA35e.es.js +0 -6
  44. package/dist/abap-Dwt2rH6y.cjs.js +0 -1
  45. package/dist/actionscript-3-mj8Uhnsc.cjs.js +0 -1
  46. package/dist/actionscript-3-zFUbzQa9.es.js +0 -6
  47. package/dist/ada-CBvPkFpZ.es.js +0 -6
  48. package/dist/ada-DZM58Vqs.cjs.js +0 -1
  49. package/dist/andromeeda-BXc5FOIb.cjs.js +0 -1
  50. package/dist/andromeeda-uXNdzNpk.es.js +0 -4
  51. package/dist/angular-html-B60m4jt-.cjs.js +0 -1
  52. package/dist/angular-html-D3aW1y6T.es.js +0 -32
  53. package/dist/angular-ts-Jud40GrY.es.js +0 -21
  54. package/dist/angular-ts-SIlYrqkG.cjs.js +0 -1
  55. package/dist/apache-CVNlsSDc.es.js +0 -6
  56. package/dist/apache-D7v5fxtZ.cjs.js +0 -1
  57. package/dist/apex-4hrAnw0a.cjs.js +0 -1
  58. package/dist/apex-DFk3KRB1.es.js +0 -6
  59. package/dist/apl-CKSaOFbt.cjs.js +0 -1
  60. package/dist/apl-pE3PRTDr.es.js +0 -16
  61. package/dist/applescript-CYMR_y0g.es.js +0 -6
  62. package/dist/applescript-Cnd3Dxju.cjs.js +0 -1
  63. package/dist/ara-4QmU5e04.es.js +0 -6
  64. package/dist/ara-BQ2aGbFQ.cjs.js +0 -1
  65. package/dist/asciidoc-C6nYvw8K.cjs.js +0 -1
  66. package/dist/asciidoc-v_1bjgUg.es.js +0 -6
  67. package/dist/asm-CQnBVCj-.cjs.js +0 -1
  68. package/dist/asm-RC0Yh-NZ.es.js +0 -6
  69. package/dist/astro-Be6fybGX.es.js +0 -16
  70. package/dist/astro-KhYkz6Xu.cjs.js +0 -1
  71. package/dist/aurora-x-BwoVEUWZ.es.js +0 -4
  72. package/dist/aurora-x-C5IpmIOG.cjs.js +0 -1
  73. package/dist/awk-DUx4h__E.cjs.js +0 -1
  74. package/dist/awk-gPH8MVMW.es.js +0 -6
  75. package/dist/ayu-dark-Cv7nTiif.cjs.js +0 -1
  76. package/dist/ayu-dark-CxPZkpb2.es.js +0 -4
  77. package/dist/ballerina-CXlzbmzl.cjs.js +0 -1
  78. package/dist/ballerina-kvLnRU_e.es.js +0 -6
  79. package/dist/bat-BHYy44sT.es.js +0 -6
  80. package/dist/bat-DlMT9sut.cjs.js +0 -1
  81. package/dist/beancount-CyyiuUzM.cjs.js +0 -1
  82. package/dist/beancount-D-MADTs_.es.js +0 -6
  83. package/dist/berry-B0EjuzrL.cjs.js +0 -1
  84. package/dist/berry-Ci9U0o4h.es.js +0 -6
  85. package/dist/bibtex-CX618D15.es.js +0 -6
  86. package/dist/bibtex-CfoG9xRq.cjs.js +0 -1
  87. package/dist/bicep-D6PH_9IY.cjs.js +0 -1
  88. package/dist/bicep-iuYiPopT.es.js +0 -6
  89. package/dist/blade-C0tMuk8f.cjs.js +0 -1
  90. package/dist/blade-DmXp5Zcz.es.js +0 -18
  91. package/dist/bsl-CfHcite8.cjs.js +0 -1
  92. package/dist/bsl-NPX_d-bb.es.js +0 -8
  93. package/dist/c-C4sXGJZM.cjs.js +0 -1
  94. package/dist/c-DASdrs7p.es.js +0 -6
  95. package/dist/cadence-BDALQi26.es.js +0 -6
  96. package/dist/cadence-Dq2CYzXG.cjs.js +0 -1
  97. package/dist/cairo-17kO8-kb.es.js +0 -8
  98. package/dist/cairo-CcKpJkyf.cjs.js +0 -1
  99. package/dist/catppuccin-frappe-BrTOiad2.es.js +0 -4
  100. package/dist/catppuccin-frappe-DXAedND3.cjs.js +0 -1
  101. package/dist/catppuccin-latte-D-dc_R4m.es.js +0 -4
  102. package/dist/catppuccin-latte-mwGw3-Ej.cjs.js +0 -1
  103. package/dist/catppuccin-macchiato-DN4jOp0G.es.js +0 -4
  104. package/dist/catppuccin-macchiato-cQCk9ADg.cjs.js +0 -1
  105. package/dist/catppuccin-mocha-B8yCE3-3.es.js +0 -4
  106. package/dist/catppuccin-mocha-ClSzDZSl.cjs.js +0 -1
  107. package/dist/clarity-CNgV2Ths.es.js +0 -6
  108. package/dist/clarity-ytMkUD5Q.cjs.js +0 -1
  109. package/dist/clojure-B_Wv414H.cjs.js +0 -1
  110. package/dist/clojure-CsKKFGwv.es.js +0 -6
  111. package/dist/cmake-Dr-A3iJx.es.js +0 -6
  112. package/dist/cmake-TBUaQXYY.cjs.js +0 -1
  113. package/dist/cobol-BzcJm6ie.es.js +0 -10
  114. package/dist/cobol-DXFNH4EH.cjs.js +0 -1
  115. package/dist/codeowners-Bt9yU6NX.es.js +0 -6
  116. package/dist/codeowners-QhPK6lIJ.cjs.js +0 -1
  117. package/dist/codeql-B7Q9tkDJ.cjs.js +0 -1
  118. package/dist/codeql-DBNTqJi1.es.js +0 -6
  119. package/dist/coffee-GRRSkgX1.cjs.js +0 -1
  120. package/dist/coffee-q2iaxUnQ.es.js +0 -8
  121. package/dist/common-lisp-Ced3ctK5.cjs.js +0 -1
  122. package/dist/common-lisp-r7ZEOG7T.es.js +0 -6
  123. package/dist/coq-BTRB4iqi.cjs.js +0 -1
  124. package/dist/coq-CB6Pv_W9.es.js +0 -6
  125. package/dist/cpp-CPOvHZqs.cjs.js +0 -1
  126. package/dist/cpp-CPQtoCcU.es.js +0 -18
  127. package/dist/crystal-BY_Cg265.es.js +0 -18
  128. package/dist/crystal-C6AG-iew.cjs.js +0 -1
  129. package/dist/csharp-CYWRhZ2R.es.js +0 -6
  130. package/dist/csharp-TKds-MhG.cjs.js +0 -1
  131. package/dist/css-B0kbn78J.cjs.js +0 -1
  132. package/dist/css-D1aVdRIU.es.js +0 -6
  133. package/dist/csv-BVJjiaC3.cjs.js +0 -1
  134. package/dist/csv-DvCncUGQ.es.js +0 -6
  135. package/dist/cue-BXMrmvay.es.js +0 -6
  136. package/dist/cue-Cz4J-rnd.cjs.js +0 -1
  137. package/dist/cypher-DTm5zNR1.es.js +0 -6
  138. package/dist/cypher-DuKTiyez.cjs.js +0 -1
  139. package/dist/d-BW9Wd7aK.cjs.js +0 -1
  140. package/dist/d-D6ZXmn3l.es.js +0 -6
  141. package/dist/dark-plus-Cd5emcYO.cjs.js +0 -1
  142. package/dist/dark-plus-pUHDTVV0.es.js +0 -4
  143. package/dist/dart-CWs-er6b.cjs.js +0 -1
  144. package/dist/dart-Dz59Is3F.es.js +0 -6
  145. package/dist/dax-CDxFL2Kb.cjs.js +0 -1
  146. package/dist/dax-DTVGzydb.es.js +0 -6
  147. package/dist/desktop-CFgo0jo7.cjs.js +0 -1
  148. package/dist/desktop-Db9vb-dl.es.js +0 -6
  149. package/dist/diff-BsEkKwI8.cjs.js +0 -1
  150. package/dist/diff-XmNrvgM1.es.js +0 -6
  151. package/dist/docker-DWH2onkn.es.js +0 -6
  152. package/dist/docker-hwiw4W8I.cjs.js +0 -1
  153. package/dist/dotenv-4337wvzu.es.js +0 -6
  154. package/dist/dotenv-CJ5o3G1C.cjs.js +0 -1
  155. package/dist/dracula-BNgwAJ-d.cjs.js +0 -1
  156. package/dist/dracula-BtZx2Kac.es.js +0 -4
  157. package/dist/dracula-soft-BHZ7sHFu.cjs.js +0 -1
  158. package/dist/dracula-soft-BKa-aqBv.es.js +0 -4
  159. package/dist/dream-maker-CvvfrJSx.es.js +0 -6
  160. package/dist/dream-maker-DBharE9Q.cjs.js +0 -1
  161. package/dist/edge-DI6_BHKG.es.js +0 -12
  162. package/dist/edge-i77KJtJz.cjs.js +0 -1
  163. package/dist/elixir-D00NoPSM.cjs.js +0 -1
  164. package/dist/elixir-ic9y5jcd.es.js +0 -8
  165. package/dist/elm-Bhj5Vf-e.cjs.js +0 -1
  166. package/dist/elm-DxnUqUaW.es.js +0 -8
  167. package/dist/emacs-lisp-BAefI874.es.js +0 -6
  168. package/dist/emacs-lisp-CDDyFsvQ.cjs.js +0 -1
  169. package/dist/erb-Cbj2YePa.es.js +0 -10
  170. package/dist/erb-Dybaw01v.cjs.js +0 -1
  171. package/dist/erlang-3VgdrQXV.cjs.js +0 -1
  172. package/dist/erlang-CmIiwF3I.es.js +0 -6
  173. package/dist/everforest-dark-DMCBqXCK.es.js +0 -4
  174. package/dist/everforest-dark-_sBMomR1.cjs.js +0 -1
  175. package/dist/everforest-light-BbXl82Em.es.js +0 -4
  176. package/dist/everforest-light-H0xoYxl0.cjs.js +0 -1
  177. package/dist/fennel-BvcDRFAV.cjs.js +0 -1
  178. package/dist/fennel-DNqkz9pE.es.js +0 -6
  179. package/dist/fish-CnamI0Ar.cjs.js +0 -1
  180. package/dist/fish-DIm72t2T.es.js +0 -6
  181. package/dist/fluent-BapTxJsC.es.js +0 -6
  182. package/dist/fluent-DFpT66K8.cjs.js +0 -1
  183. package/dist/fortran-fixed-form-DECY15PY.es.js +0 -8
  184. package/dist/fortran-fixed-form-u_RcUPMu.cjs.js +0 -1
  185. package/dist/fortran-free-form-CNDsBFUj.es.js +0 -6
  186. package/dist/fortran-free-form-IaGrWIda.cjs.js +0 -1
  187. package/dist/fsharp-B-aK2rr3.cjs.js +0 -1
  188. package/dist/fsharp-D2ZqviWP.es.js +0 -8
  189. package/dist/gdresource-BBAqNWe4.cjs.js +0 -1
  190. package/dist/gdresource-RIsK8sku.es.js +0 -10
  191. package/dist/gdscript-5N_43TPQ.cjs.js +0 -1
  192. package/dist/gdscript-D7aheHm-.es.js +0 -6
  193. package/dist/gdshader-BGJEsM2Z.es.js +0 -6
  194. package/dist/gdshader-Bl85Hrm5.cjs.js +0 -1
  195. package/dist/genie-C9gPjc6J.es.js +0 -6
  196. package/dist/genie-DGsxMAbQ.cjs.js +0 -1
  197. package/dist/gherkin-CVV6nEUH.cjs.js +0 -1
  198. package/dist/gherkin-bka1Exbx.es.js +0 -6
  199. package/dist/git-commit-BRJ1E4Bx.es.js +0 -8
  200. package/dist/git-commit-CwfgI4fD.cjs.js +0 -1
  201. package/dist/git-rebase-C3X7aMpn.es.js +0 -8
  202. package/dist/git-rebase-DUvbIQDw.cjs.js +0 -1
  203. package/dist/github-dark-BKL9xNgN.cjs.js +0 -1
  204. package/dist/github-dark-DenFmJkN.es.js +0 -4
  205. package/dist/github-dark-default-BJPUVz4H.es.js +0 -4
  206. package/dist/github-dark-default-Dsv5MuSi.cjs.js +0 -1
  207. package/dist/github-dark-dimmed-CtB9hz8U.cjs.js +0 -1
  208. package/dist/github-dark-dimmed-DUshB20C.es.js +0 -4
  209. package/dist/github-dark-high-contrast-BqZVM-jF.cjs.js +0 -1
  210. package/dist/github-dark-high-contrast-D3aGCnF8.es.js +0 -4
  211. package/dist/github-light-BFTOhCbz.cjs.js +0 -1
  212. package/dist/github-light-JYsPkUQd.es.js +0 -4
  213. package/dist/github-light-default-BZoWH9dH.cjs.js +0 -1
  214. package/dist/github-light-default-D99KPAby.es.js +0 -4
  215. package/dist/github-light-high-contrast-BbmZE-Mp.es.js +0 -4
  216. package/dist/github-light-high-contrast-Ks3kPGJU.cjs.js +0 -1
  217. package/dist/gleam-B4k9YFGD.es.js +0 -6
  218. package/dist/gleam-nR4mjrhK.cjs.js +0 -1
  219. package/dist/glimmer-js-C4MQf3Na.es.js +0 -14
  220. package/dist/glimmer-js-CNfyUqSb.cjs.js +0 -1
  221. package/dist/glimmer-ts-Bp7_dELi.cjs.js +0 -1
  222. package/dist/glimmer-ts-CoYpqZrZ.es.js +0 -14
  223. package/dist/glsl-BYTq1Tfl.es.js +0 -8
  224. package/dist/glsl-CIu1PL9X.cjs.js +0 -1
  225. package/dist/gnuplot-CurtDYoJ.cjs.js +0 -1
  226. package/dist/gnuplot-DnWoRZt-.es.js +0 -6
  227. package/dist/go-BErP6iv1.es.js +0 -6
  228. package/dist/go-CM9_GlwL.cjs.js +0 -1
  229. package/dist/graphql-BnnSMMC2.cjs.js +0 -1
  230. package/dist/graphql-g3nHRc0M.es.js +0 -14
  231. package/dist/groovy-BaVp9Il5.cjs.js +0 -1
  232. package/dist/groovy-IWs5-NIO.es.js +0 -6
  233. package/dist/hack-BVxH3fsq.cjs.js +0 -1
  234. package/dist/hack-wPAsyujS.es.js +0 -10
  235. package/dist/haml-4TJ757dz.es.js +0 -10
  236. package/dist/haml-vutdexHh.cjs.js +0 -1
  237. package/dist/handlebars-7GDLw__F.es.js +0 -14
  238. package/dist/handlebars-COmZnO8P.cjs.js +0 -1
  239. package/dist/haskell-CtlGos0K.es.js +0 -6
  240. package/dist/haskell-suhyCHEm.cjs.js +0 -1
  241. package/dist/haxe-BIQU1qHi.cjs.js +0 -1
  242. package/dist/haxe-CZZ33vZw.es.js +0 -6
  243. package/dist/hcl-6hOg9WP4.es.js +0 -6
  244. package/dist/hcl-CbQ1yCnz.cjs.js +0 -1
  245. package/dist/hjson-CgwED-oz.es.js +0 -6
  246. package/dist/hjson-Ddklb4QM.cjs.js +0 -1
  247. package/dist/hlsl-3-lv4gi7.es.js +0 -6
  248. package/dist/hlsl-B4NkiBfC.cjs.js +0 -1
  249. package/dist/houston-BDYrDoDW.es.js +0 -4
  250. package/dist/houston-T57H3gQZ.cjs.js +0 -1
  251. package/dist/html-Dc-Bg17s.cjs.js +0 -1
  252. package/dist/html-PSPajZka.es.js +0 -10
  253. package/dist/html-derivative-Brb3b4aI.es.js +0 -8
  254. package/dist/html-derivative-CY9mJeT0.cjs.js +0 -1
  255. package/dist/http-BrKsebcH.cjs.js +0 -1
  256. package/dist/http-CWBcr-Ch.es.js +0 -14
  257. package/dist/hxml-DLduiIv3.es.js +0 -8
  258. package/dist/hxml-DbGPHkY4.cjs.js +0 -1
  259. package/dist/hy-C2xHhR6I.es.js +0 -6
  260. package/dist/hy-DpyTdO3T.cjs.js +0 -1
  261. package/dist/imba-BEYqRZzB.es.js +0 -8
  262. package/dist/imba-CAIkF-GD.cjs.js +0 -1
  263. package/dist/ini-BUcvsX-U.es.js +0 -6
  264. package/dist/ini-CymULaw_.cjs.js +0 -1
  265. package/dist/java-B7odJ7Ap.es.js +0 -6
  266. package/dist/java-Bn1Lvoni.cjs.js +0 -1
  267. package/dist/javascript-Bnnicc83.cjs.js +0 -1
  268. package/dist/javascript-fa8UlHZE.es.js +0 -6
  269. package/dist/jinja-BoeZymy4.cjs.js +0 -1
  270. package/dist/jinja-DKLHYjK0.es.js +0 -11
  271. package/dist/jison-C0DlFEjB.cjs.js +0 -1
  272. package/dist/jison-CzPfUIvM.es.js +0 -8
  273. package/dist/json-71t8ZF9g.es.js +0 -6
  274. package/dist/json-y-J1j5EW.cjs.js +0 -1
  275. package/dist/json5-CzvlWgZ7.cjs.js +0 -1
  276. package/dist/json5-Z7F6rA6a.es.js +0 -6
  277. package/dist/jsonc-BnhWfmQw.cjs.js +0 -1
  278. package/dist/jsonc-Dphhs4m2.es.js +0 -6
  279. package/dist/jsonl-BbGkWPJz.cjs.js +0 -1
  280. package/dist/jsonl-D9jj92Gg.es.js +0 -6
  281. package/dist/jsonnet-Bn--UDZ1.cjs.js +0 -1
  282. package/dist/jsonnet-DEQ7IUoJ.es.js +0 -6
  283. package/dist/jssm-4CSVp8lc.cjs.js +0 -1
  284. package/dist/jssm-j74e88UX.es.js +0 -6
  285. package/dist/jsx-Bkesy5tT.es.js +0 -6
  286. package/dist/jsx-D8YwVp-7.cjs.js +0 -1
  287. package/dist/julia-B_r6juN7.es.js +0 -16
  288. package/dist/julia-DLxGoAlk.cjs.js +0 -1
  289. package/dist/kanagawa-dragon-BJZF7xDr.cjs.js +0 -1
  290. package/dist/kanagawa-dragon-CiKur4Hl.es.js +0 -4
  291. package/dist/kanagawa-lotus-BKu-smKu.es.js +0 -4
  292. package/dist/kanagawa-lotus-BhgzmRV4.cjs.js +0 -1
  293. package/dist/kanagawa-wave-BgJip59C.cjs.js +0 -1
  294. package/dist/kanagawa-wave-CQwozSzG.es.js +0 -4
  295. package/dist/kotlin-DCgZY7Ii.es.js +0 -6
  296. package/dist/kotlin-DDI6myF6.cjs.js +0 -1
  297. package/dist/kusto-Cw029H-v.es.js +0 -6
  298. package/dist/kusto-OZxALJZT.cjs.js +0 -1
  299. package/dist/laserwave--izBLY1I.cjs.js +0 -1
  300. package/dist/laserwave-6a00oqik.es.js +0 -4
  301. package/dist/latex-CXOK56Uv.cjs.js +0 -1
  302. package/dist/latex-GxBxlqbc.es.js +0 -8
  303. package/dist/lean-CYSet4vs.es.js +0 -6
  304. package/dist/lean-D1iY-35j.cjs.js +0 -1
  305. package/dist/less-DIaY7vQJ.cjs.js +0 -1
  306. package/dist/less-DQA4v-Nm.es.js +0 -6
  307. package/dist/light-plus-B5D0le0o.cjs.js +0 -1
  308. package/dist/light-plus-CZuVqSLX.es.js +0 -4
  309. package/dist/liquid-BYouVITI.cjs.js +0 -1
  310. package/dist/liquid-BxBkR-z5.es.js +0 -14
  311. package/dist/log-BIXUeBaj.cjs.js +0 -1
  312. package/dist/log-D2eRfqDn.es.js +0 -6
  313. package/dist/logo-B2d3b27P.cjs.js +0 -1
  314. package/dist/logo-QEAtGWZ9.es.js +0 -6
  315. package/dist/lua-B2_GGnC5.cjs.js +0 -1
  316. package/dist/lua-DeXVjwzF.es.js +0 -8
  317. package/dist/luau-BjYGiqID.es.js +0 -6
  318. package/dist/luau-CvqAeq4F.cjs.js +0 -1
  319. package/dist/make-BjuHP00g.es.js +0 -6
  320. package/dist/make-Oob5Z9Pk.cjs.js +0 -1
  321. package/dist/markdown-B6guhLWd.es.js +0 -6
  322. package/dist/markdown-BGBuj4LZ.cjs.js +0 -1
  323. package/dist/marko-CS7eEGs3.cjs.js +0 -1
  324. package/dist/marko-DwPYPpB3.es.js +0 -14
  325. package/dist/material-theme-D6KBX41T.es.js +0 -4
  326. package/dist/material-theme-Dj0-OyRN.cjs.js +0 -1
  327. package/dist/material-theme-darker-CkRroheE.es.js +0 -4
  328. package/dist/material-theme-darker-Dvfs29ir.cjs.js +0 -1
  329. package/dist/material-theme-lighter-BUBw43Yz.es.js +0 -4
  330. package/dist/material-theme-lighter-EU3ZGl_r.cjs.js +0 -1
  331. package/dist/material-theme-ocean-ClGX14Ja.es.js +0 -4
  332. package/dist/material-theme-ocean-px_3Pwqa.cjs.js +0 -1
  333. package/dist/material-theme-palenight-38jxvsGX.cjs.js +0 -1
  334. package/dist/material-theme-palenight-C1RVm8K1.es.js +0 -4
  335. package/dist/matlab-BpQlIJiw.es.js +0 -6
  336. package/dist/matlab-CbN2rF6P.cjs.js +0 -1
  337. package/dist/mdc-Bkl-bu_Z.cjs.js +0 -1
  338. package/dist/mdc-X4YjkufV.es.js +0 -12
  339. package/dist/mdx-Cl31h8mi.cjs.js +0 -1
  340. package/dist/mdx-DIoECIFU.es.js +0 -6
  341. package/dist/mermaid-BZ7WHNIe.es.js +0 -6
  342. package/dist/mermaid-CSogK_LM.cjs.js +0 -1
  343. package/dist/min-dark-C7ak0t6c.es.js +0 -4
  344. package/dist/min-dark-tt5o_I5e.cjs.js +0 -1
  345. package/dist/min-light-CKFxVcPp.es.js +0 -4
  346. package/dist/min-light-tmTHl_CQ.cjs.js +0 -1
  347. package/dist/mipsasm-BseoYJQp.cjs.js +0 -1
  348. package/dist/mipsasm-DusDYkFc.es.js +0 -6
  349. package/dist/mojo-CY9jaezJ.es.js +0 -6
  350. package/dist/mojo-D8QAG3Ze.cjs.js +0 -1
  351. package/dist/monokai-C1KBYcO0.es.js +0 -4
  352. package/dist/monokai-DMIxv6MM.cjs.js +0 -1
  353. package/dist/move-ChphFumd.es.js +0 -6
  354. package/dist/move-DaBrcjat.cjs.js +0 -1
  355. package/dist/narrat-Dz4d7OmN.es.js +0 -6
  356. package/dist/narrat-oOfAO4q8.cjs.js +0 -1
  357. package/dist/nextflow-BxJSKvPb.cjs.js +0 -1
  358. package/dist/nextflow-DW0Yq9a2.es.js +0 -6
  359. package/dist/nginx-ChI-VqNT.es.js +0 -8
  360. package/dist/nginx-LuyFICzP.cjs.js +0 -1
  361. package/dist/night-owl-BN78kThQ.cjs.js +0 -1
  362. package/dist/night-owl-Bm2rzalh.es.js +0 -4
  363. package/dist/nim-BiJA-5u7.es.js +0 -20
  364. package/dist/nim-DkC83hsN.cjs.js +0 -1
  365. package/dist/nix-Cg5uV_xg.es.js +0 -6
  366. package/dist/nix-DNME0Ea7.cjs.js +0 -1
  367. package/dist/nord-CC5OiUXg.es.js +0 -4
  368. package/dist/nord-Ca5AGUWc.cjs.js +0 -1
  369. package/dist/nushell-BfRnzRWn.es.js +0 -6
  370. package/dist/nushell-DI9Z3l3M.cjs.js +0 -1
  371. package/dist/objective-c-BGg9R27G.es.js +0 -6
  372. package/dist/objective-c-DVx8Rcni.cjs.js +0 -1
  373. package/dist/objective-cpp-CJ3y3V_5.es.js +0 -6
  374. package/dist/objective-cpp-s6XI7Jvk.cjs.js +0 -1
  375. package/dist/ocaml-BZLsfx_o.es.js +0 -6
  376. package/dist/ocaml-kUzDDUf2.cjs.js +0 -1
  377. package/dist/one-dark-pro-D7-kP8fv.es.js +0 -4
  378. package/dist/one-dark-pro-JOzzHStv.cjs.js +0 -1
  379. package/dist/one-light-020-h_lv.cjs.js +0 -1
  380. package/dist/one-light-D9sNaUtq.es.js +0 -4
  381. package/dist/pascal-D509_I72.cjs.js +0 -1
  382. package/dist/pascal-l2bqd7Dz.es.js +0 -6
  383. package/dist/perl-CkXYjL3t.es.js +0 -16
  384. package/dist/perl-DUnCLRB_.cjs.js +0 -1
  385. package/dist/php-D0k1sQr6.cjs.js +0 -1
  386. package/dist/php-q40Yjh5d.es.js +0 -18
  387. package/dist/plastic-CSTz3KZp.es.js +0 -4
  388. package/dist/plastic-r5piqq-S.cjs.js +0 -1
  389. package/dist/plsql-C_qH_YOK.cjs.js +0 -1
  390. package/dist/plsql-oVq_K_wH.es.js +0 -6
  391. package/dist/po-5jaeIyVd.es.js +0 -6
  392. package/dist/po-CBsLQIcu.cjs.js +0 -1
  393. package/dist/poimandres-BLP3NNjc.cjs.js +0 -1
  394. package/dist/poimandres-C-VADXHD.es.js +0 -4
  395. package/dist/polar-De-CDeYv.cjs.js +0 -1
  396. package/dist/polar-wcLp8ci7.es.js +0 -6
  397. package/dist/postcss-BZ3MNRIJ.es.js +0 -6
  398. package/dist/postcss-BtcsgaYj.cjs.js +0 -1
  399. package/dist/powerquery-B0rHn13V.cjs.js +0 -1
  400. package/dist/powerquery-CgRa2XRw.es.js +0 -6
  401. package/dist/powershell-Diwyv8Eh.es.js +0 -6
  402. package/dist/powershell-rCX2OYXT.cjs.js +0 -1
  403. package/dist/prisma-BaaUHYMp.cjs.js +0 -1
  404. package/dist/prisma-COL_v1x4.es.js +0 -6
  405. package/dist/prolog-CuvJOxqT.es.js +0 -6
  406. package/dist/prolog-DrXD2tGS.cjs.js +0 -1
  407. package/dist/proto-BtmQjBQu.cjs.js +0 -1
  408. package/dist/proto-o9HLmF90.es.js +0 -6
  409. package/dist/pug-Br4hpvIv.es.js +0 -12
  410. package/dist/pug-CFQMpTUe.cjs.js +0 -1
  411. package/dist/puppet-cIrXIuy8.cjs.js +0 -1
  412. package/dist/puppet-wpGOnQp5.es.js +0 -6
  413. package/dist/purescript-B_1NgE2N.es.js +0 -6
  414. package/dist/purescript-CX9QPs2N.cjs.js +0 -1
  415. package/dist/python-B9x3euv6.cjs.js +0 -1
  416. package/dist/python-xYxLFJY-.es.js +0 -6
  417. package/dist/qml-CzqrIM5W.cjs.js +0 -1
  418. package/dist/qml-D5gi21kK.es.js +0 -8
  419. package/dist/qmldir-BInDYbpo.es.js +0 -6
  420. package/dist/qmldir-DNF9H2ir.cjs.js +0 -1
  421. package/dist/qss-C744dLby.cjs.js +0 -1
  422. package/dist/qss-D-h4NdUG.es.js +0 -6
  423. package/dist/r-DgOc9oMe.cjs.js +0 -1
  424. package/dist/r-F-9I-ITZ.es.js +0 -6
  425. package/dist/racket-BoD1TBFT.es.js +0 -6
  426. package/dist/racket-Do9_vqnd.cjs.js +0 -1
  427. package/dist/raku-BW8wAUIz.cjs.js +0 -1
  428. package/dist/raku-IaYcw19m.es.js +0 -6
  429. package/dist/razor-Bt_t1YJb.es.js +0 -10
  430. package/dist/razor-COQhlwWF.cjs.js +0 -1
  431. package/dist/red-7y8PH7HH.es.js +0 -4
  432. package/dist/red-BQGOv1D5.cjs.js +0 -1
  433. package/dist/reg-CGWN_v-z.cjs.js +0 -1
  434. package/dist/reg-CMUdAgIP.es.js +0 -6
  435. package/dist/regexp-GiFkbxS-.es.js +0 -6
  436. package/dist/regexp-N7Z4hEeU.cjs.js +0 -1
  437. package/dist/rel-BYqA7mnV.cjs.js +0 -1
  438. package/dist/rel-BaRn3QX7.es.js +0 -6
  439. package/dist/riscv-B9V3SsvW.es.js +0 -6
  440. package/dist/riscv-ayQMUpo9.cjs.js +0 -1
  441. package/dist/rose-pine-DKEdv1Oe.cjs.js +0 -1
  442. package/dist/rose-pine-DhT-HZE9.es.js +0 -4
  443. package/dist/rose-pine-dawn-Bvt6DtVH.cjs.js +0 -1
  444. package/dist/rose-pine-dawn-DiCjL2i4.es.js +0 -4
  445. package/dist/rose-pine-moon-BNmGHlcn.es.js +0 -4
  446. package/dist/rose-pine-moon-cHuJy0Ng.cjs.js +0 -1
  447. package/dist/rst-BmKw97ch.es.js +0 -22
  448. package/dist/rst-Bq-h_T5U.cjs.js +0 -1
  449. package/dist/ruby-Bw5IEIKD.cjs.js +0 -1
  450. package/dist/ruby-cs7BSa_9.es.js +0 -30
  451. package/dist/rust-BnFKGEfa.cjs.js +0 -1
  452. package/dist/rust-Pc7DCsZD.es.js +0 -6
  453. package/dist/sas-BWKaSYkZ.cjs.js +0 -1
  454. package/dist/sas-DgvHx4mL.es.js +0 -8
  455. package/dist/sass-B9gYryDE.cjs.js +0 -1
  456. package/dist/sass-iCyS6eP9.es.js +0 -6
  457. package/dist/scala-C85dOwSU.cjs.js +0 -1
  458. package/dist/scala-Cly-fENF.es.js +0 -6
  459. package/dist/scheme-B_XUaARm.cjs.js +0 -1
  460. package/dist/scheme-Zi24oEYu.es.js +0 -6
  461. package/dist/scss-B_hSZppj.es.js +0 -8
  462. package/dist/scss-CV3c8_Y7.cjs.js +0 -1
  463. package/dist/sdbl-7Y5u0OW0.cjs.js +0 -1
  464. package/dist/sdbl-BBamrXFL.es.js +0 -6
  465. package/dist/shaderlab-CJ8U2E2w.cjs.js +0 -1
  466. package/dist/shaderlab-U9mqcu_f.es.js +0 -8
  467. package/dist/shellscript-3DYM9fut.cjs.js +0 -1
  468. package/dist/shellscript-Dn0-btNd.es.js +0 -6
  469. package/dist/shellsession-CbKmorC3.cjs.js +0 -1
  470. package/dist/shellsession-LvXGClmj.es.js +0 -8
  471. package/dist/slack-dark-akqwQ7ED.cjs.js +0 -1
  472. package/dist/slack-dark-i7wN4OET.es.js +0 -4
  473. package/dist/slack-ochin-BoQQWmTv.cjs.js +0 -1
  474. package/dist/slack-ochin-ndHf0LoP.es.js +0 -4
  475. package/dist/smalltalk-CCvytUuW.cjs.js +0 -1
  476. package/dist/smalltalk-Cns31tKw.es.js +0 -6
  477. package/dist/snazzy-light-BlSJXAu4.es.js +0 -4
  478. package/dist/snazzy-light-D_IwRieF.cjs.js +0 -1
  479. package/dist/solarized-dark-UTmkh7lw.es.js +0 -4
  480. package/dist/solarized-dark-gmm-WbDC.cjs.js +0 -1
  481. package/dist/solarized-light-BheCkDPT.es.js +0 -4
  482. package/dist/solarized-light-DzcxRSZP.cjs.js +0 -1
  483. package/dist/solidity-BG_k8fA_.es.js +0 -6
  484. package/dist/solidity-BcNcjFC4.cjs.js +0 -1
  485. package/dist/soy-B2d9ZydM.cjs.js +0 -1
  486. package/dist/soy-C0yEn39K.es.js +0 -8
  487. package/dist/sparql-CiBxIK0g.cjs.js +0 -1
  488. package/dist/sparql-CuZaxpno.es.js +0 -8
  489. package/dist/splunk-CTqDjQdo.es.js +0 -6
  490. package/dist/splunk-CzITjJj7.cjs.js +0 -1
  491. package/dist/sql-BqWZrLHB.cjs.js +0 -1
  492. package/dist/sql-DCkt643-.es.js +0 -6
  493. package/dist/ssh-config-DHHGll-v.es.js +0 -6
  494. package/dist/ssh-config-DUPeuEdB.cjs.js +0 -1
  495. package/dist/stata-B8m3qL-x.cjs.js +0 -1
  496. package/dist/stata-Dv81f34z.es.js +0 -8
  497. package/dist/stylus-ByHs6N-o.cjs.js +0 -1
  498. package/dist/stylus-n_9f0QQ5.es.js +0 -6
  499. package/dist/svelte-CfLoBBrI.cjs.js +0 -1
  500. package/dist/svelte-SoJd35Jr.es.js +0 -14
  501. package/dist/swift-BAWqNR8A.es.js +0 -6
  502. package/dist/swift-C5DnOriA.cjs.js +0 -1
  503. package/dist/synthwave-84-BBRLOmNT.cjs.js +0 -1
  504. package/dist/synthwave-84-NU3C_KFZ.es.js +0 -4
  505. package/dist/system-verilog-ClPLYLwh.cjs.js +0 -1
  506. package/dist/system-verilog-Cui-g-ut.es.js +0 -6
  507. package/dist/systemd-BASX0DlX.cjs.js +0 -1
  508. package/dist/systemd-CsKYQIQK.es.js +0 -6
  509. package/dist/talonscript-D2dGh8FO.es.js +0 -6
  510. package/dist/talonscript-DkCSnLHD.cjs.js +0 -1
  511. package/dist/tasl-BAQJK7KZ.cjs.js +0 -1
  512. package/dist/tasl-D3W8HMV6.es.js +0 -6
  513. package/dist/tcl-2y0Fuc4S.es.js +0 -6
  514. package/dist/tcl-CwJAYTvh.cjs.js +0 -1
  515. package/dist/templ-BSMv2wKZ.cjs.js +0 -1
  516. package/dist/templ-C7he2afp.es.js +0 -12
  517. package/dist/terraform-BGW6Oerf.es.js +0 -6
  518. package/dist/terraform-s-pzyVvp.cjs.js +0 -1
  519. package/dist/tex-B0y3cEZp.es.js +0 -8
  520. package/dist/tex-DwtFCA08.cjs.js +0 -1
  521. package/dist/tokyo-night-9T7_vGSy.cjs.js +0 -1
  522. package/dist/tokyo-night-LhP3hHhi.es.js +0 -4
  523. package/dist/toml-CQSfOn0e.es.js +0 -6
  524. package/dist/toml-CyMM7IXy.cjs.js +0 -1
  525. package/dist/ts-tags-C5-4VQhf.es.js +0 -41
  526. package/dist/ts-tags-MIr66hKK.cjs.js +0 -1
  527. package/dist/tsv-BtvSkaG0.es.js +0 -6
  528. package/dist/tsv-DqNGnuVj.cjs.js +0 -1
  529. package/dist/tsx-DiGsgWT8.es.js +0 -6
  530. package/dist/tsx-DpBRUnKC.cjs.js +0 -1
  531. package/dist/turtle-BJ2wmjPc.es.js +0 -6
  532. package/dist/turtle-DfO3eAsu.cjs.js +0 -1
  533. package/dist/twig-BzjoX4ZJ.cjs.js +0 -1
  534. package/dist/twig-OmkATFdv.es.js +0 -18
  535. package/dist/typescript-BqvpT6pB.cjs.js +0 -1
  536. package/dist/typescript-buWNZFwO.es.js +0 -6
  537. package/dist/typespec-P-ZVy8yC.cjs.js +0 -1
  538. package/dist/typespec-bLbdsxJL.es.js +0 -6
  539. package/dist/typst-BVh2IsT9.cjs.js +0 -1
  540. package/dist/typst-Y9_SmXTs.es.js +0 -6
  541. package/dist/v-BUlE9136.cjs.js +0 -1
  542. package/dist/v-wa8Orrdd.es.js +0 -6
  543. package/dist/vala-BIymb2K_.cjs.js +0 -1
  544. package/dist/vala-DRdriFr_.es.js +0 -6
  545. package/dist/vb-E2_-jk4M.es.js +0 -6
  546. package/dist/vb-IXOh8mqV.cjs.js +0 -1
  547. package/dist/verilog-B1iBoR5_.es.js +0 -6
  548. package/dist/verilog-BiglCqvO.cjs.js +0 -1
  549. package/dist/vesper-CJsaOsSM.es.js +0 -4
  550. package/dist/vesper-DqLWLxOu.cjs.js +0 -1
  551. package/dist/vhdl-CJUzuS2t.cjs.js +0 -1
  552. package/dist/vhdl-CRVaAhXk.es.js +0 -6
  553. package/dist/viml-B-zWOd7Z.es.js +0 -6
  554. package/dist/viml-B1nKLcgt.cjs.js +0 -1
  555. package/dist/vitesse-black-BoGvW84i.es.js +0 -4
  556. package/dist/vitesse-black-MF-1S1MG.cjs.js +0 -1
  557. package/dist/vitesse-dark-Cym-eLtO.es.js +0 -4
  558. package/dist/vitesse-dark-SIffJYSe.cjs.js +0 -1
  559. package/dist/vitesse-light-CcmG315c.es.js +0 -4
  560. package/dist/vitesse-light-U63SkYGT.cjs.js +0 -1
  561. package/dist/vue-DCwwWMGI.es.js +0 -31
  562. package/dist/vue-DYZqcRaZ.cjs.js +0 -1
  563. package/dist/vue-html-CdPbyrq1.cjs.js +0 -1
  564. package/dist/vue-html-sRE_Ny23.es.js +0 -10
  565. package/dist/vyper-CO9xUkIY.cjs.js +0 -1
  566. package/dist/vyper-DWutKXpa.es.js +0 -6
  567. package/dist/wasm-Bv5f0gKv.es.js +0 -6
  568. package/dist/wasm-CdIThIat.cjs.js +0 -1
  569. package/dist/wenyan-BMYnfus1.es.js +0 -6
  570. package/dist/wenyan-BSJ3fk7e.cjs.js +0 -1
  571. package/dist/wgsl-DnPoPGDU.es.js +0 -6
  572. package/dist/wgsl-d3zZE7ZN.cjs.js +0 -1
  573. package/dist/wikitext-BRCqXN2g.cjs.js +0 -1
  574. package/dist/wikitext-CntM04PE.es.js +0 -6
  575. package/dist/wolfram-C3rR92zj.cjs.js +0 -1
  576. package/dist/wolfram-Ws5qPlX9.es.js +0 -6
  577. package/dist/xml-BRLTD55J.cjs.js +0 -1
  578. package/dist/xml-Ch1q_kJp.es.js +0 -8
  579. package/dist/xsl-DyL8yqXw.es.js +0 -8
  580. package/dist/xsl-ETbYGV_-.cjs.js +0 -1
  581. package/dist/yaml-7DV6pRKj.cjs.js +0 -1
  582. package/dist/yaml-Bbg74JKr.es.js +0 -6
  583. package/dist/zenscript-BWMxwjeH.cjs.js +0 -1
  584. package/dist/zenscript-C0RKE4nU.es.js +0 -6
  585. package/dist/zig-D6SXBGNm.es.js +0 -6
  586. package/dist/zig-yAcNfpgW.cjs.js +0 -1
@@ -0,0 +1,738 @@
1
+ import Autocomplete from "@mui/material/Autocomplete";
2
+ import Box from "@mui/material/Box";
3
+ import CircularProgress from "@mui/material/CircularProgress";
4
+ import FormControl from "@mui/material/FormControl";
5
+ import InputLabel from "@mui/material/InputLabel";
6
+ import MenuItem from "@mui/material/MenuItem";
7
+ import Select, { SelectChangeEvent } from "@mui/material/Select";
8
+ import TextField from "@mui/material/TextField";
9
+ import Typography from "@mui/material/Typography";
10
+ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
11
+ import { DatePicker } from "@mui/x-date-pickers/DatePicker";
12
+ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
13
+ import dayjs, { Dayjs } from "dayjs";
14
+ import utc from "dayjs/plugin/utc";
15
+ import { useEffect, useRef, useState } from "react";
16
+ import {
17
+ DimensionSpec,
18
+ DimensionValue,
19
+ } from "../../hooks/useDimensionalFilterRangeData";
20
+ import {
21
+ FilterSelection,
22
+ FilterValue,
23
+ FilterValuePrimitive,
24
+ MatchType,
25
+ } from "../../hooks/useDimensionFilters";
26
+
27
+ dayjs.extend(utc);
28
+
29
+ /**
30
+ * Type for the retrieval function used by Retrieval filter type
31
+ */
32
+ export type RetrievalFunction = (
33
+ query: string,
34
+ spec: DimensionSpec,
35
+ ) => Promise<DimensionValue[]>;
36
+
37
+ /**
38
+ * Props for DimensionFilter component
39
+ */
40
+ export interface DimensionFilterProps {
41
+ /** The dimension specification */
42
+ spec: DimensionSpec;
43
+ /** Available values for this dimension */
44
+ values: DimensionValue[];
45
+ /** Current filter selection (optional) */
46
+ selection?: FilterSelection | null;
47
+ /** Callback when filter changes */
48
+ onChange: (selection: FilterSelection | null) => void;
49
+ /** Retrieval function for semantic search (required for Retrieval filter type) */
50
+ retrievalFn?: RetrievalFunction;
51
+ }
52
+
53
+ /**
54
+ * Get available match types based on filter type
55
+ */
56
+ function getAvailableMatchTypes(
57
+ filterType: DimensionSpec["filterType"],
58
+ ): MatchType[] {
59
+ switch (filterType) {
60
+ case "Star":
61
+ return ["Equals", "Contains"];
62
+ case "MinMax":
63
+ return ["Equals", "Less Than", "Greater Than", "Between"];
64
+ case "DateMinMax":
65
+ return ["Equals", "Before", "After", "Between"];
66
+ case "Retrieval":
67
+ return ["Concept Search"];
68
+ case "Boolean":
69
+ return ["Equals"];
70
+ case "NONE":
71
+ default:
72
+ return [];
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Determines if the filter type uses date values
78
+ */
79
+ function isDateFilter(filterType: DimensionSpec["filterType"]): boolean {
80
+ return filterType === "DateMinMax";
81
+ }
82
+
83
+ /**
84
+ * Determines if the match type requires two values
85
+ */
86
+ function requiresTwoValues(matchType: MatchType): boolean {
87
+ return matchType === "Between";
88
+ }
89
+
90
+ /**
91
+ * DimensionFilter component - Renders appropriate filter UI based on dimension type
92
+ *
93
+ * This component dynamically renders the appropriate filter UI based on the dimension's
94
+ * filter type and selected match type. It supports:
95
+ * - Star filters: Dropdown selection or text search
96
+ * - MinMax filters: Numeric input with comparison operators
97
+ * - DateMinMax filters: Date pickers with date comparison operators
98
+ *
99
+ * @param props - Component props including spec, values, selection, and onChange callback
100
+ *
101
+ * @example
102
+ * ```tsx
103
+ * <DimensionFilter
104
+ * spec={{ dimensionName: "category", filterType: "Star" }}
105
+ * values={categoryValues}
106
+ * selection={currentSelection}
107
+ * onChange={(selection) => updateFilter("category", selection)}
108
+ * />
109
+ * ```
110
+ */
111
+ export function DimensionFilter({
112
+ spec,
113
+ values,
114
+ selection,
115
+ onChange,
116
+ retrievalFn,
117
+ }: DimensionFilterProps) {
118
+ // Default to "Between" for date filters, otherwise use first available match type
119
+ const getDefaultMatchType = () => {
120
+ if (selection?.matchType) return selection.matchType;
121
+ if (spec.filterType === "DateMinMax") return "Between";
122
+ return getAvailableMatchTypes(spec.filterType)[0] || "Equals";
123
+ };
124
+
125
+ const [matchType, setMatchType] = useState<MatchType>(getDefaultMatchType());
126
+ const [value1, setValue1] = useState<FilterValue | "">(
127
+ selection?.value ?? "",
128
+ );
129
+ const [value2, setValue2] = useState<FilterValuePrimitive | "">(
130
+ selection?.value2 ?? "",
131
+ );
132
+
133
+ // Retrieval state
134
+ const [retrievalOptions, setRetrievalOptions] = useState<DimensionValue[]>(
135
+ [],
136
+ );
137
+ const [retrievalLoading, setRetrievalLoading] = useState(false);
138
+ const [retrievalInputValue, setRetrievalInputValue] = useState("");
139
+ const [retrievalSearched, setRetrievalSearched] = useState(false);
140
+ const [retrievalFocused, setRetrievalFocused] = useState(false);
141
+ const pendingRequestRef = useRef<string | null>(null);
142
+ const isRequestInFlightRef = useRef(false);
143
+
144
+ // MinMax focus state for showing helper text
145
+ const [showMinMaxHelper, setShowMinMaxHelper] = useState(false);
146
+
147
+ // Effect to trigger retrieval
148
+ useEffect(() => {
149
+ if (spec.filterType !== "Retrieval" || !retrievalFn) return;
150
+
151
+ const query = retrievalInputValue.trim();
152
+ if (query.length <= 2) {
153
+ setRetrievalOptions([]);
154
+ setRetrievalSearched(false);
155
+ return;
156
+ }
157
+
158
+ const performRetrieval = async (searchQuery: string) => {
159
+ if (isRequestInFlightRef.current) {
160
+ pendingRequestRef.current = searchQuery;
161
+ return;
162
+ }
163
+
164
+ isRequestInFlightRef.current = true;
165
+ setRetrievalLoading(true);
166
+
167
+ try {
168
+ const results = await retrievalFn(searchQuery, spec);
169
+ setRetrievalOptions(results);
170
+ } catch (e) {
171
+ console.error("Retrieval failed", e);
172
+ setRetrievalOptions([]);
173
+ } finally {
174
+ isRequestInFlightRef.current = false;
175
+ setRetrievalLoading(false);
176
+ setRetrievalSearched(true);
177
+
178
+ // Check pending
179
+ if (pendingRequestRef.current) {
180
+ const nextQuery = pendingRequestRef.current;
181
+ pendingRequestRef.current = null;
182
+ setTimeout(() => performRetrieval(nextQuery), 0);
183
+ }
184
+ }
185
+ };
186
+
187
+ // Debounce
188
+ const timeoutId = setTimeout(() => {
189
+ performRetrieval(query);
190
+ }, 300);
191
+
192
+ return () => clearTimeout(timeoutId);
193
+ }, [retrievalInputValue, spec, retrievalFn]);
194
+
195
+ // Sync internal state with selection prop changes (e.g., when filter is cleared externally)
196
+ useEffect(() => {
197
+ if (selection === null) {
198
+ // Clear internal state when selection is cleared externally
199
+ setValue1("");
200
+ setValue2("");
201
+ // Reset to default match type (Between for dates, first available for others)
202
+ setMatchType(
203
+ spec.filterType === "DateMinMax"
204
+ ? "Between"
205
+ : getAvailableMatchTypes(spec.filterType)[0] || "Equals",
206
+ );
207
+ } else if (selection) {
208
+ // Update internal state when selection changes externally
209
+ setMatchType(selection.matchType);
210
+ // Use nullish coalescing to preserve false/0 values
211
+ setValue1(selection.value ?? "");
212
+ setValue2(selection.value2 ?? "");
213
+ }
214
+ }, [selection, spec.filterType]);
215
+
216
+ const availableMatchTypes = getAvailableMatchTypes(spec.filterType);
217
+ const isDate = isDateFilter(spec.filterType);
218
+ const needsTwoValues = requiresTwoValues(matchType);
219
+
220
+ // Extract min/max values for range filters (use UTC to avoid timezone shifts)
221
+ const minDate =
222
+ isDate && values.length >= 2 && values[0].value instanceof Date
223
+ ? dayjs.utc(values[0].value)
224
+ : undefined;
225
+ const maxDate =
226
+ isDate && values.length >= 2 && values[1].value instanceof Date
227
+ ? dayjs.utc(values[1].value)
228
+ : undefined;
229
+
230
+ // Extract min/max numbers for MinMax filters
231
+ const minNumber =
232
+ spec.filterType === "MinMax" &&
233
+ values.length >= 2 &&
234
+ typeof values[0].value === "number"
235
+ ? values[0].value
236
+ : undefined;
237
+ const maxNumber =
238
+ spec.filterType === "MinMax" &&
239
+ values.length >= 2 &&
240
+ typeof values[1].value === "number"
241
+ ? values[1].value
242
+ : undefined;
243
+
244
+ // Don't render if no match types available
245
+ if (availableMatchTypes.length === 0) {
246
+ return null;
247
+ }
248
+
249
+ // Handle match type change
250
+ const handleMatchTypeChange = (event: SelectChangeEvent<MatchType>) => {
251
+ const newMatchType = event.target.value as MatchType;
252
+ setMatchType(newMatchType);
253
+
254
+ // Clear value2 if not needed
255
+ if (!requiresTwoValues(newMatchType)) {
256
+ setValue2("");
257
+ }
258
+
259
+ // Update selection
260
+ if (value1) {
261
+ onChange({
262
+ dimensionName: spec.dimensionName,
263
+ matchType: newMatchType,
264
+ value: value1,
265
+ ...(requiresTwoValues(newMatchType) && value2 && { value2 }),
266
+ });
267
+ }
268
+ };
269
+
270
+ // Handle value change
271
+ const handleValueChange = (
272
+ newValue1: FilterValue | "" | null,
273
+ newValue2?: FilterValuePrimitive | "" | null,
274
+ ) => {
275
+ setValue1(newValue1 ?? "");
276
+ if (newValue2 !== undefined) {
277
+ setValue2(newValue2 ?? "");
278
+ }
279
+
280
+ // check for empty array (multi-select cleared)
281
+ const isEmptyArray = Array.isArray(newValue1) && newValue1.length === 0;
282
+
283
+ // Only call onChange if we have a valid value
284
+ if (
285
+ !isEmptyArray &&
286
+ newValue1 !== "" &&
287
+ newValue1 !== null &&
288
+ newValue1 !== undefined
289
+ ) {
290
+ onChange({
291
+ dimensionName: spec.dimensionName,
292
+ matchType,
293
+ value: newValue1,
294
+ ...(needsTwoValues && newValue2 && { value2: newValue2 }),
295
+ });
296
+ } else {
297
+ onChange(null);
298
+ }
299
+ };
300
+
301
+ // Handle clear
302
+ const handleClear = () => {
303
+ setValue1("");
304
+ setValue2("");
305
+ onChange(null);
306
+ };
307
+
308
+ return (
309
+ <Box sx={{ display: "flex", flexDirection: "column", gap: 2 }}>
310
+ {/* Dimension Name */}
311
+ <Box sx={{ fontWeight: 600, fontSize: "0.875rem" }}>
312
+ {spec.dimensionName}
313
+ </Box>
314
+
315
+ {/* Match Type Selector */}
316
+ {spec.filterType !== "Boolean" && (
317
+ <FormControl size="small" fullWidth>
318
+ <InputLabel>Match Type</InputLabel>
319
+ <Select
320
+ value={matchType}
321
+ label="Match Type"
322
+ onChange={handleMatchTypeChange}
323
+ >
324
+ {availableMatchTypes.map((type) => (
325
+ <MenuItem key={type} value={type}>
326
+ {type}
327
+ </MenuItem>
328
+ ))}
329
+ </Select>
330
+ </FormControl>
331
+ )}
332
+
333
+ {/* Value Input - varies by filter type */}
334
+ {spec.filterType === "Star" && matchType === "Equals" && (
335
+ <Autocomplete
336
+ multiple
337
+ size="small"
338
+ options={values}
339
+ getOptionLabel={(option) => {
340
+ if (typeof option === "string") {
341
+ return option;
342
+ }
343
+ if (
344
+ typeof option === "object" &&
345
+ option !== null &&
346
+ "value" in option
347
+ ) {
348
+ return String((option as DimensionValue).value);
349
+ }
350
+ return String(option);
351
+ }}
352
+ value={
353
+ Array.isArray(value1)
354
+ ? value1.map(
355
+ (v: string) =>
356
+ values.find((opt) => opt.value === v) || v,
357
+ )
358
+ : value1
359
+ ? [values.find((v) => v.value === value1) || value1]
360
+ : []
361
+ }
362
+ onChange={(_, newValue) => {
363
+ const newValues = newValue.map((item) => {
364
+ if (typeof item === "string") return item;
365
+ if (item && typeof item === "object" && "value" in item) {
366
+ return (item as DimensionValue).value;
367
+ }
368
+ return item;
369
+ }) as FilterValuePrimitive[];
370
+ handleValueChange(newValues);
371
+ }}
372
+ noOptionsText="No matches found"
373
+ renderInput={(params) => (
374
+ <TextField
375
+ {...params}
376
+ label="Values"
377
+ placeholder="Select values..."
378
+ />
379
+ )}
380
+ freeSolo={!spec.values || spec.values.length === 0}
381
+ />
382
+ )}
383
+
384
+ {spec.filterType === "Star" && matchType === "Contains" && (
385
+ <TextField
386
+ size="small"
387
+ label="Search Text"
388
+ value={value1}
389
+ onChange={(e) => handleValueChange(e.target.value)}
390
+ placeholder="Enter text to search..."
391
+ fullWidth
392
+ />
393
+ )}
394
+
395
+ {spec.filterType === "Boolean" && (
396
+ <FormControl size="small" fullWidth>
397
+ <InputLabel>Value</InputLabel>
398
+ <Select
399
+ value={
400
+ value1 === true ? "true" : value1 === false ? "false" : ""
401
+ }
402
+ label="Value"
403
+ onChange={(e) => {
404
+ const val = e.target.value;
405
+ if (val === "true") handleValueChange(true);
406
+ else if (val === "false") handleValueChange(false);
407
+ else handleClear();
408
+ }}
409
+ >
410
+ <MenuItem value="">
411
+ <em>Blank</em>
412
+ </MenuItem>
413
+ <MenuItem value="true">True</MenuItem>
414
+ <MenuItem value="false">False</MenuItem>
415
+ </Select>
416
+ </FormControl>
417
+ )}
418
+
419
+ {spec.filterType === "Retrieval" && matchType === "Concept Search" && (
420
+ <Autocomplete
421
+ multiple
422
+ size="small"
423
+ options={retrievalOptions}
424
+ loading={retrievalLoading}
425
+ getOptionLabel={(option) => {
426
+ if (typeof option === "string") {
427
+ return option;
428
+ }
429
+ if (
430
+ typeof option === "object" &&
431
+ option !== null &&
432
+ "value" in option
433
+ ) {
434
+ return String((option as DimensionValue).value);
435
+ }
436
+ return String(option);
437
+ }}
438
+ value={
439
+ Array.isArray(value1)
440
+ ? value1.map((v: string) => {
441
+ const found = retrievalOptions.find(
442
+ (opt) => opt.value === v,
443
+ );
444
+ return found || { value: v };
445
+ })
446
+ : value1
447
+ ? [{ value: value1 }]
448
+ : []
449
+ }
450
+ onInputChange={(_, newInputValue) => {
451
+ setRetrievalInputValue(newInputValue);
452
+ }}
453
+ onChange={(_, newValue) => {
454
+ const newValues = newValue.map((item) => {
455
+ if (typeof item === "string") return item;
456
+ if (item && typeof item === "object" && "value" in item) {
457
+ return (item as DimensionValue).value;
458
+ }
459
+ return item;
460
+ }) as FilterValuePrimitive[];
461
+ handleValueChange(newValues);
462
+ }}
463
+ noOptionsText={
464
+ retrievalInputValue.trim().length <= 2
465
+ ? "Type at least 3 characters to search"
466
+ : "No matches found"
467
+ }
468
+ renderInput={(params) => (
469
+ <TextField
470
+ {...params}
471
+ label="Search Values"
472
+ placeholder="Type to search..."
473
+ onFocus={() => setRetrievalFocused(true)}
474
+ onBlur={() => setRetrievalFocused(false)}
475
+ helperText={
476
+ retrievalFocused &&
477
+ !retrievalLoading &&
478
+ retrievalSearched &&
479
+ retrievalOptions.length === 0
480
+ ? "No matches found"
481
+ : undefined
482
+ }
483
+ InputProps={{
484
+ ...params.InputProps,
485
+ endAdornment: (
486
+ <>
487
+ {retrievalLoading ? (
488
+ <CircularProgress color="inherit" size={20} />
489
+ ) : null}
490
+ {params.InputProps.endAdornment}
491
+ </>
492
+ ),
493
+ }}
494
+ />
495
+ )}
496
+ freeSolo
497
+ filterOptions={(x) => x}
498
+ />
499
+ )}
500
+
501
+ {spec.filterType === "MinMax" && !needsTwoValues && (
502
+ <TextField
503
+ size="small"
504
+ type="number"
505
+ label="Value"
506
+ value={value1}
507
+ onChange={(e) =>
508
+ handleValueChange(parseFloat(e.target.value) || "")
509
+ }
510
+ onFocus={() => setShowMinMaxHelper(true)}
511
+ onBlur={() => setShowMinMaxHelper(false)}
512
+ placeholder="Enter number..."
513
+ fullWidth
514
+ inputProps={{
515
+ min: minNumber,
516
+ max: maxNumber,
517
+ }}
518
+ helperText={
519
+ showMinMaxHelper &&
520
+ minNumber !== undefined &&
521
+ maxNumber !== undefined
522
+ ? `Valid range: [${minNumber} - ${maxNumber}]`
523
+ : undefined
524
+ }
525
+ />
526
+ )}
527
+
528
+ {spec.filterType === "MinMax" && needsTwoValues && (
529
+ <Box sx={{ display: "flex", flexDirection: "column", gap: 1 }}>
530
+ <Box sx={{ display: "flex", gap: 1, alignItems: "center" }}>
531
+ <TextField
532
+ size="small"
533
+ type="number"
534
+ label="From"
535
+ value={value1}
536
+ onChange={(e) =>
537
+ handleValueChange(
538
+ parseFloat(e.target.value) || "",
539
+ value2,
540
+ )
541
+ }
542
+ onFocus={() => setShowMinMaxHelper(true)}
543
+ onBlur={() => setShowMinMaxHelper(false)}
544
+ placeholder="Min..."
545
+ fullWidth
546
+ inputProps={{
547
+ min: minNumber,
548
+ max: value2 || maxNumber,
549
+ }}
550
+ />
551
+ <Box>to</Box>
552
+ <TextField
553
+ size="small"
554
+ type="number"
555
+ label="To"
556
+ value={value2}
557
+ onChange={(e) =>
558
+ handleValueChange(
559
+ value1,
560
+ parseFloat(e.target.value) || "",
561
+ )
562
+ }
563
+ onFocus={() => setShowMinMaxHelper(true)}
564
+ onBlur={() => setShowMinMaxHelper(false)}
565
+ placeholder="Max..."
566
+ fullWidth
567
+ inputProps={{
568
+ min: value1 || minNumber,
569
+ max: maxNumber,
570
+ }}
571
+ />
572
+ </Box>
573
+ {showMinMaxHelper &&
574
+ minNumber !== undefined &&
575
+ maxNumber !== undefined && (
576
+ <Typography
577
+ variant="caption"
578
+ color="text.secondary"
579
+ sx={{ mt: -0.5, ml: 1.5 }}
580
+ >
581
+ Valid range: [{minNumber} - {maxNumber}]
582
+ </Typography>
583
+ )}
584
+ </Box>
585
+ )}
586
+
587
+ {isDate && !needsTwoValues && (
588
+ <LocalizationProvider dateAdapter={AdapterDayjs}>
589
+ <DatePicker
590
+ label="Date"
591
+ value={value1 instanceof Date ? dayjs.utc(value1) : null}
592
+ onChange={(newValue: Dayjs | null) => {
593
+ // Only call onChange if value is null (cleared) or a valid date
594
+ if (newValue === null) {
595
+ handleValueChange(null);
596
+ } else if (newValue.isValid()) {
597
+ handleValueChange(newValue.utc().toDate());
598
+ }
599
+ // Invalid dates are ignored - don't update state
600
+ }}
601
+ timezone="UTC"
602
+ minDate={value1 instanceof Date ? undefined : minDate}
603
+ maxDate={value1 instanceof Date ? undefined : maxDate}
604
+ referenceDate={
605
+ matchType === "After" && minDate ? minDate : undefined
606
+ }
607
+ slotProps={{
608
+ textField: {
609
+ size: "small",
610
+ fullWidth: true,
611
+ sx: { minWidth: 150 },
612
+ onFocus: () => setShowMinMaxHelper(true),
613
+ onBlur: () => setShowMinMaxHelper(false),
614
+ helperText:
615
+ showMinMaxHelper && minDate && maxDate
616
+ ? `Valid range: [${minDate.format("YYYY-MM-DD")} - ${maxDate.format("YYYY-MM-DD")}]`
617
+ : undefined,
618
+ },
619
+ openPickerButton: {
620
+ sx: { backgroundColor: "transparent" },
621
+ },
622
+ }}
623
+ />
624
+ </LocalizationProvider>
625
+ )}
626
+
627
+ {isDate && needsTwoValues && (
628
+ <LocalizationProvider dateAdapter={AdapterDayjs}>
629
+ <Box sx={{ display: "flex", flexDirection: "column", gap: 1 }}>
630
+ <Box sx={{ display: "flex", gap: 1, alignItems: "center" }}>
631
+ <Box sx={{ flex: 1, minWidth: 0 }}>
632
+ <DatePicker
633
+ label="From"
634
+ value={
635
+ value1 instanceof Date ? dayjs.utc(value1) : null
636
+ }
637
+ onChange={(newValue: Dayjs | null) => {
638
+ // Only call onChange if value is null (cleared) or a valid date
639
+ if (newValue === null) {
640
+ handleValueChange(null, value2);
641
+ } else if (newValue.isValid()) {
642
+ handleValueChange(
643
+ newValue.utc().toDate(),
644
+ value2,
645
+ );
646
+ }
647
+ // Invalid dates are ignored - don't update state
648
+ }}
649
+ timezone="UTC"
650
+ minDate={
651
+ value1 instanceof Date ? undefined : minDate
652
+ }
653
+ maxDate={
654
+ value2 instanceof Date
655
+ ? dayjs.utc(value2)
656
+ : value1 instanceof Date
657
+ ? undefined
658
+ : maxDate
659
+ }
660
+ referenceDate={minDate}
661
+ slotProps={{
662
+ textField: {
663
+ size: "small",
664
+ fullWidth: true,
665
+ onFocus: () => setShowMinMaxHelper(true),
666
+ onBlur: () => setShowMinMaxHelper(false),
667
+ },
668
+ openPickerButton: {
669
+ sx: { backgroundColor: "transparent" },
670
+ },
671
+ }}
672
+ />
673
+ </Box>
674
+ <Box>to</Box>
675
+ <Box sx={{ flex: 1, minWidth: 0 }}>
676
+ <DatePicker
677
+ label="To"
678
+ value={
679
+ value2 instanceof Date ? dayjs.utc(value2) : null
680
+ }
681
+ onChange={(newValue: Dayjs | null) => {
682
+ // Only call onChange if value is null (cleared) or a valid date
683
+ if (newValue === null) {
684
+ handleValueChange(value1, null);
685
+ } else if (newValue.isValid()) {
686
+ handleValueChange(
687
+ value1,
688
+ newValue.utc().toDate(),
689
+ );
690
+ }
691
+ // Invalid dates are ignored - don't update state
692
+ }}
693
+ timezone="UTC"
694
+ minDate={
695
+ value1 instanceof Date
696
+ ? dayjs.utc(value1)
697
+ : value2 instanceof Date
698
+ ? undefined
699
+ : minDate
700
+ }
701
+ maxDate={
702
+ value2 instanceof Date ? undefined : maxDate
703
+ }
704
+ referenceDate={
705
+ value1 instanceof Date
706
+ ? dayjs.utc(value1)
707
+ : minDate
708
+ }
709
+ slotProps={{
710
+ textField: {
711
+ size: "small",
712
+ fullWidth: true,
713
+ onFocus: () => setShowMinMaxHelper(true),
714
+ onBlur: () => setShowMinMaxHelper(false),
715
+ },
716
+ openPickerButton: {
717
+ sx: { backgroundColor: "transparent" },
718
+ },
719
+ }}
720
+ />
721
+ </Box>
722
+ </Box>
723
+ {showMinMaxHelper && minDate && maxDate && (
724
+ <Typography
725
+ variant="caption"
726
+ color="text.secondary"
727
+ sx={{ mt: -0.5, ml: 1.5 }}
728
+ >
729
+ Valid range: [{minDate.format("YYYY-MM-DD")} -{" "}
730
+ {maxDate.format("YYYY-MM-DD")}]
731
+ </Typography>
732
+ )}
733
+ </Box>
734
+ </LocalizationProvider>
735
+ )}
736
+ </Box>
737
+ );
738
+ }