@malloy-publisher/sdk 0.0.138 → 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 (581) hide show
  1. package/README.md +122 -1
  2. package/dist/ServerProvider-Bzid56gJ.cjs.js +1 -0
  3. package/dist/{ServerProvider-B8JWg8Mo.es.js → ServerProvider-D-y63tG0.es.js} +68 -68
  4. package/dist/client/api.d.ts +18 -0
  5. package/dist/client/index.cjs.js +1 -1
  6. package/dist/client/index.es.js +1 -1
  7. package/dist/components/Notebook/Notebook.d.ts +4 -1
  8. package/dist/components/filter/DimensionFilter.d.ts +43 -0
  9. package/dist/components/filter/index.d.ts +4 -0
  10. package/dist/components/filter/utils.d.ts +75 -0
  11. package/dist/components/index.d.ts +7 -6
  12. package/dist/components/styles.d.ts +3 -3
  13. package/dist/hooks/index.d.ts +4 -0
  14. package/dist/hooks/useDimensionFilters.d.ts +84 -0
  15. package/dist/hooks/useDimensionFiltersFromSpec.d.ts +52 -0
  16. package/dist/hooks/useDimensionFiltersQuery.d.ts +79 -0
  17. package/dist/hooks/useDimensionalFilterRangeData.d.ts +106 -0
  18. package/dist/index.cjs.js +141 -112
  19. package/dist/index.d.ts +3 -2
  20. package/dist/index.es.js +47795 -39755
  21. package/dist/sdk.css +1 -1
  22. package/package.json +16 -11
  23. package/src/components/Home/Home.tsx +15 -11
  24. package/src/components/Notebook/Notebook.tsx +315 -31
  25. package/src/components/RenderedResult/RenderedResult.tsx +22 -3
  26. package/src/components/filter/DimensionFilter.tsx +738 -0
  27. package/src/components/filter/index.ts +20 -0
  28. package/src/components/filter/utils.ts +354 -0
  29. package/src/components/highlighter.ts +14 -6
  30. package/src/components/index.ts +7 -6
  31. package/src/hooks/index.ts +31 -0
  32. package/src/hooks/useDimensionFilters.ts +322 -0
  33. package/src/hooks/useDimensionFiltersFromSpec.ts +117 -0
  34. package/src/hooks/useDimensionFiltersQuery.ts +300 -0
  35. package/src/hooks/useDimensionalFilterRangeData.ts +758 -0
  36. package/src/index.ts +3 -2
  37. package/dist/ServerProvider-DC74Txr5.cjs.js +0 -1
  38. package/dist/abap-BmBUA35e.es.js +0 -6
  39. package/dist/abap-Dwt2rH6y.cjs.js +0 -1
  40. package/dist/actionscript-3-mj8Uhnsc.cjs.js +0 -1
  41. package/dist/actionscript-3-zFUbzQa9.es.js +0 -6
  42. package/dist/ada-CBvPkFpZ.es.js +0 -6
  43. package/dist/ada-DZM58Vqs.cjs.js +0 -1
  44. package/dist/andromeeda-BXc5FOIb.cjs.js +0 -1
  45. package/dist/andromeeda-uXNdzNpk.es.js +0 -4
  46. package/dist/angular-html-B60m4jt-.cjs.js +0 -1
  47. package/dist/angular-html-D3aW1y6T.es.js +0 -32
  48. package/dist/angular-ts-Jud40GrY.es.js +0 -21
  49. package/dist/angular-ts-SIlYrqkG.cjs.js +0 -1
  50. package/dist/apache-CVNlsSDc.es.js +0 -6
  51. package/dist/apache-D7v5fxtZ.cjs.js +0 -1
  52. package/dist/apex-4hrAnw0a.cjs.js +0 -1
  53. package/dist/apex-DFk3KRB1.es.js +0 -6
  54. package/dist/apl-CKSaOFbt.cjs.js +0 -1
  55. package/dist/apl-pE3PRTDr.es.js +0 -16
  56. package/dist/applescript-CYMR_y0g.es.js +0 -6
  57. package/dist/applescript-Cnd3Dxju.cjs.js +0 -1
  58. package/dist/ara-4QmU5e04.es.js +0 -6
  59. package/dist/ara-BQ2aGbFQ.cjs.js +0 -1
  60. package/dist/asciidoc-C6nYvw8K.cjs.js +0 -1
  61. package/dist/asciidoc-v_1bjgUg.es.js +0 -6
  62. package/dist/asm-CQnBVCj-.cjs.js +0 -1
  63. package/dist/asm-RC0Yh-NZ.es.js +0 -6
  64. package/dist/astro-Be6fybGX.es.js +0 -16
  65. package/dist/astro-KhYkz6Xu.cjs.js +0 -1
  66. package/dist/aurora-x-BwoVEUWZ.es.js +0 -4
  67. package/dist/aurora-x-C5IpmIOG.cjs.js +0 -1
  68. package/dist/awk-DUx4h__E.cjs.js +0 -1
  69. package/dist/awk-gPH8MVMW.es.js +0 -6
  70. package/dist/ayu-dark-Cv7nTiif.cjs.js +0 -1
  71. package/dist/ayu-dark-CxPZkpb2.es.js +0 -4
  72. package/dist/ballerina-CXlzbmzl.cjs.js +0 -1
  73. package/dist/ballerina-kvLnRU_e.es.js +0 -6
  74. package/dist/bat-BHYy44sT.es.js +0 -6
  75. package/dist/bat-DlMT9sut.cjs.js +0 -1
  76. package/dist/beancount-CyyiuUzM.cjs.js +0 -1
  77. package/dist/beancount-D-MADTs_.es.js +0 -6
  78. package/dist/berry-B0EjuzrL.cjs.js +0 -1
  79. package/dist/berry-Ci9U0o4h.es.js +0 -6
  80. package/dist/bibtex-CX618D15.es.js +0 -6
  81. package/dist/bibtex-CfoG9xRq.cjs.js +0 -1
  82. package/dist/bicep-D6PH_9IY.cjs.js +0 -1
  83. package/dist/bicep-iuYiPopT.es.js +0 -6
  84. package/dist/blade-C0tMuk8f.cjs.js +0 -1
  85. package/dist/blade-DmXp5Zcz.es.js +0 -18
  86. package/dist/bsl-CfHcite8.cjs.js +0 -1
  87. package/dist/bsl-NPX_d-bb.es.js +0 -8
  88. package/dist/c-C4sXGJZM.cjs.js +0 -1
  89. package/dist/c-DASdrs7p.es.js +0 -6
  90. package/dist/cadence-BDALQi26.es.js +0 -6
  91. package/dist/cadence-Dq2CYzXG.cjs.js +0 -1
  92. package/dist/cairo-17kO8-kb.es.js +0 -8
  93. package/dist/cairo-CcKpJkyf.cjs.js +0 -1
  94. package/dist/catppuccin-frappe-BrTOiad2.es.js +0 -4
  95. package/dist/catppuccin-frappe-DXAedND3.cjs.js +0 -1
  96. package/dist/catppuccin-latte-D-dc_R4m.es.js +0 -4
  97. package/dist/catppuccin-latte-mwGw3-Ej.cjs.js +0 -1
  98. package/dist/catppuccin-macchiato-DN4jOp0G.es.js +0 -4
  99. package/dist/catppuccin-macchiato-cQCk9ADg.cjs.js +0 -1
  100. package/dist/catppuccin-mocha-B8yCE3-3.es.js +0 -4
  101. package/dist/catppuccin-mocha-ClSzDZSl.cjs.js +0 -1
  102. package/dist/clarity-CNgV2Ths.es.js +0 -6
  103. package/dist/clarity-ytMkUD5Q.cjs.js +0 -1
  104. package/dist/clojure-B_Wv414H.cjs.js +0 -1
  105. package/dist/clojure-CsKKFGwv.es.js +0 -6
  106. package/dist/cmake-Dr-A3iJx.es.js +0 -6
  107. package/dist/cmake-TBUaQXYY.cjs.js +0 -1
  108. package/dist/cobol-BzcJm6ie.es.js +0 -10
  109. package/dist/cobol-DXFNH4EH.cjs.js +0 -1
  110. package/dist/codeowners-Bt9yU6NX.es.js +0 -6
  111. package/dist/codeowners-QhPK6lIJ.cjs.js +0 -1
  112. package/dist/codeql-B7Q9tkDJ.cjs.js +0 -1
  113. package/dist/codeql-DBNTqJi1.es.js +0 -6
  114. package/dist/coffee-GRRSkgX1.cjs.js +0 -1
  115. package/dist/coffee-q2iaxUnQ.es.js +0 -8
  116. package/dist/common-lisp-Ced3ctK5.cjs.js +0 -1
  117. package/dist/common-lisp-r7ZEOG7T.es.js +0 -6
  118. package/dist/coq-BTRB4iqi.cjs.js +0 -1
  119. package/dist/coq-CB6Pv_W9.es.js +0 -6
  120. package/dist/cpp-CPOvHZqs.cjs.js +0 -1
  121. package/dist/cpp-CPQtoCcU.es.js +0 -18
  122. package/dist/crystal-BY_Cg265.es.js +0 -18
  123. package/dist/crystal-C6AG-iew.cjs.js +0 -1
  124. package/dist/csharp-CYWRhZ2R.es.js +0 -6
  125. package/dist/csharp-TKds-MhG.cjs.js +0 -1
  126. package/dist/css-B0kbn78J.cjs.js +0 -1
  127. package/dist/css-D1aVdRIU.es.js +0 -6
  128. package/dist/csv-BVJjiaC3.cjs.js +0 -1
  129. package/dist/csv-DvCncUGQ.es.js +0 -6
  130. package/dist/cue-BXMrmvay.es.js +0 -6
  131. package/dist/cue-Cz4J-rnd.cjs.js +0 -1
  132. package/dist/cypher-DTm5zNR1.es.js +0 -6
  133. package/dist/cypher-DuKTiyez.cjs.js +0 -1
  134. package/dist/d-BW9Wd7aK.cjs.js +0 -1
  135. package/dist/d-D6ZXmn3l.es.js +0 -6
  136. package/dist/dark-plus-Cd5emcYO.cjs.js +0 -1
  137. package/dist/dark-plus-pUHDTVV0.es.js +0 -4
  138. package/dist/dart-CWs-er6b.cjs.js +0 -1
  139. package/dist/dart-Dz59Is3F.es.js +0 -6
  140. package/dist/dax-CDxFL2Kb.cjs.js +0 -1
  141. package/dist/dax-DTVGzydb.es.js +0 -6
  142. package/dist/desktop-CFgo0jo7.cjs.js +0 -1
  143. package/dist/desktop-Db9vb-dl.es.js +0 -6
  144. package/dist/diff-BsEkKwI8.cjs.js +0 -1
  145. package/dist/diff-XmNrvgM1.es.js +0 -6
  146. package/dist/docker-DWH2onkn.es.js +0 -6
  147. package/dist/docker-hwiw4W8I.cjs.js +0 -1
  148. package/dist/dotenv-4337wvzu.es.js +0 -6
  149. package/dist/dotenv-CJ5o3G1C.cjs.js +0 -1
  150. package/dist/dracula-BNgwAJ-d.cjs.js +0 -1
  151. package/dist/dracula-BtZx2Kac.es.js +0 -4
  152. package/dist/dracula-soft-BHZ7sHFu.cjs.js +0 -1
  153. package/dist/dracula-soft-BKa-aqBv.es.js +0 -4
  154. package/dist/dream-maker-CvvfrJSx.es.js +0 -6
  155. package/dist/dream-maker-DBharE9Q.cjs.js +0 -1
  156. package/dist/edge-DI6_BHKG.es.js +0 -12
  157. package/dist/edge-i77KJtJz.cjs.js +0 -1
  158. package/dist/elixir-D00NoPSM.cjs.js +0 -1
  159. package/dist/elixir-ic9y5jcd.es.js +0 -8
  160. package/dist/elm-Bhj5Vf-e.cjs.js +0 -1
  161. package/dist/elm-DxnUqUaW.es.js +0 -8
  162. package/dist/emacs-lisp-BAefI874.es.js +0 -6
  163. package/dist/emacs-lisp-CDDyFsvQ.cjs.js +0 -1
  164. package/dist/erb-Cbj2YePa.es.js +0 -10
  165. package/dist/erb-Dybaw01v.cjs.js +0 -1
  166. package/dist/erlang-3VgdrQXV.cjs.js +0 -1
  167. package/dist/erlang-CmIiwF3I.es.js +0 -6
  168. package/dist/everforest-dark-DMCBqXCK.es.js +0 -4
  169. package/dist/everforest-dark-_sBMomR1.cjs.js +0 -1
  170. package/dist/everforest-light-BbXl82Em.es.js +0 -4
  171. package/dist/everforest-light-H0xoYxl0.cjs.js +0 -1
  172. package/dist/fennel-BvcDRFAV.cjs.js +0 -1
  173. package/dist/fennel-DNqkz9pE.es.js +0 -6
  174. package/dist/fish-CnamI0Ar.cjs.js +0 -1
  175. package/dist/fish-DIm72t2T.es.js +0 -6
  176. package/dist/fluent-BapTxJsC.es.js +0 -6
  177. package/dist/fluent-DFpT66K8.cjs.js +0 -1
  178. package/dist/fortran-fixed-form-DECY15PY.es.js +0 -8
  179. package/dist/fortran-fixed-form-u_RcUPMu.cjs.js +0 -1
  180. package/dist/fortran-free-form-CNDsBFUj.es.js +0 -6
  181. package/dist/fortran-free-form-IaGrWIda.cjs.js +0 -1
  182. package/dist/fsharp-B-aK2rr3.cjs.js +0 -1
  183. package/dist/fsharp-D2ZqviWP.es.js +0 -8
  184. package/dist/gdresource-BBAqNWe4.cjs.js +0 -1
  185. package/dist/gdresource-RIsK8sku.es.js +0 -10
  186. package/dist/gdscript-5N_43TPQ.cjs.js +0 -1
  187. package/dist/gdscript-D7aheHm-.es.js +0 -6
  188. package/dist/gdshader-BGJEsM2Z.es.js +0 -6
  189. package/dist/gdshader-Bl85Hrm5.cjs.js +0 -1
  190. package/dist/genie-C9gPjc6J.es.js +0 -6
  191. package/dist/genie-DGsxMAbQ.cjs.js +0 -1
  192. package/dist/gherkin-CVV6nEUH.cjs.js +0 -1
  193. package/dist/gherkin-bka1Exbx.es.js +0 -6
  194. package/dist/git-commit-BRJ1E4Bx.es.js +0 -8
  195. package/dist/git-commit-CwfgI4fD.cjs.js +0 -1
  196. package/dist/git-rebase-C3X7aMpn.es.js +0 -8
  197. package/dist/git-rebase-DUvbIQDw.cjs.js +0 -1
  198. package/dist/github-dark-BKL9xNgN.cjs.js +0 -1
  199. package/dist/github-dark-DenFmJkN.es.js +0 -4
  200. package/dist/github-dark-default-BJPUVz4H.es.js +0 -4
  201. package/dist/github-dark-default-Dsv5MuSi.cjs.js +0 -1
  202. package/dist/github-dark-dimmed-CtB9hz8U.cjs.js +0 -1
  203. package/dist/github-dark-dimmed-DUshB20C.es.js +0 -4
  204. package/dist/github-dark-high-contrast-BqZVM-jF.cjs.js +0 -1
  205. package/dist/github-dark-high-contrast-D3aGCnF8.es.js +0 -4
  206. package/dist/github-light-BFTOhCbz.cjs.js +0 -1
  207. package/dist/github-light-JYsPkUQd.es.js +0 -4
  208. package/dist/github-light-default-BZoWH9dH.cjs.js +0 -1
  209. package/dist/github-light-default-D99KPAby.es.js +0 -4
  210. package/dist/github-light-high-contrast-BbmZE-Mp.es.js +0 -4
  211. package/dist/github-light-high-contrast-Ks3kPGJU.cjs.js +0 -1
  212. package/dist/gleam-B4k9YFGD.es.js +0 -6
  213. package/dist/gleam-nR4mjrhK.cjs.js +0 -1
  214. package/dist/glimmer-js-C4MQf3Na.es.js +0 -14
  215. package/dist/glimmer-js-CNfyUqSb.cjs.js +0 -1
  216. package/dist/glimmer-ts-Bp7_dELi.cjs.js +0 -1
  217. package/dist/glimmer-ts-CoYpqZrZ.es.js +0 -14
  218. package/dist/glsl-BYTq1Tfl.es.js +0 -8
  219. package/dist/glsl-CIu1PL9X.cjs.js +0 -1
  220. package/dist/gnuplot-CurtDYoJ.cjs.js +0 -1
  221. package/dist/gnuplot-DnWoRZt-.es.js +0 -6
  222. package/dist/go-BErP6iv1.es.js +0 -6
  223. package/dist/go-CM9_GlwL.cjs.js +0 -1
  224. package/dist/graphql-BnnSMMC2.cjs.js +0 -1
  225. package/dist/graphql-g3nHRc0M.es.js +0 -14
  226. package/dist/groovy-BaVp9Il5.cjs.js +0 -1
  227. package/dist/groovy-IWs5-NIO.es.js +0 -6
  228. package/dist/hack-BVxH3fsq.cjs.js +0 -1
  229. package/dist/hack-wPAsyujS.es.js +0 -10
  230. package/dist/haml-4TJ757dz.es.js +0 -10
  231. package/dist/haml-vutdexHh.cjs.js +0 -1
  232. package/dist/handlebars-7GDLw__F.es.js +0 -14
  233. package/dist/handlebars-COmZnO8P.cjs.js +0 -1
  234. package/dist/haskell-CtlGos0K.es.js +0 -6
  235. package/dist/haskell-suhyCHEm.cjs.js +0 -1
  236. package/dist/haxe-BIQU1qHi.cjs.js +0 -1
  237. package/dist/haxe-CZZ33vZw.es.js +0 -6
  238. package/dist/hcl-6hOg9WP4.es.js +0 -6
  239. package/dist/hcl-CbQ1yCnz.cjs.js +0 -1
  240. package/dist/hjson-CgwED-oz.es.js +0 -6
  241. package/dist/hjson-Ddklb4QM.cjs.js +0 -1
  242. package/dist/hlsl-3-lv4gi7.es.js +0 -6
  243. package/dist/hlsl-B4NkiBfC.cjs.js +0 -1
  244. package/dist/houston-BDYrDoDW.es.js +0 -4
  245. package/dist/houston-T57H3gQZ.cjs.js +0 -1
  246. package/dist/html-Dc-Bg17s.cjs.js +0 -1
  247. package/dist/html-PSPajZka.es.js +0 -10
  248. package/dist/html-derivative-Brb3b4aI.es.js +0 -8
  249. package/dist/html-derivative-CY9mJeT0.cjs.js +0 -1
  250. package/dist/http-BrKsebcH.cjs.js +0 -1
  251. package/dist/http-CWBcr-Ch.es.js +0 -14
  252. package/dist/hxml-DLduiIv3.es.js +0 -8
  253. package/dist/hxml-DbGPHkY4.cjs.js +0 -1
  254. package/dist/hy-C2xHhR6I.es.js +0 -6
  255. package/dist/hy-DpyTdO3T.cjs.js +0 -1
  256. package/dist/imba-BEYqRZzB.es.js +0 -8
  257. package/dist/imba-CAIkF-GD.cjs.js +0 -1
  258. package/dist/ini-BUcvsX-U.es.js +0 -6
  259. package/dist/ini-CymULaw_.cjs.js +0 -1
  260. package/dist/java-B7odJ7Ap.es.js +0 -6
  261. package/dist/java-Bn1Lvoni.cjs.js +0 -1
  262. package/dist/javascript-Bnnicc83.cjs.js +0 -1
  263. package/dist/javascript-fa8UlHZE.es.js +0 -6
  264. package/dist/jinja-BoeZymy4.cjs.js +0 -1
  265. package/dist/jinja-DKLHYjK0.es.js +0 -11
  266. package/dist/jison-C0DlFEjB.cjs.js +0 -1
  267. package/dist/jison-CzPfUIvM.es.js +0 -8
  268. package/dist/json-71t8ZF9g.es.js +0 -6
  269. package/dist/json-y-J1j5EW.cjs.js +0 -1
  270. package/dist/json5-CzvlWgZ7.cjs.js +0 -1
  271. package/dist/json5-Z7F6rA6a.es.js +0 -6
  272. package/dist/jsonc-BnhWfmQw.cjs.js +0 -1
  273. package/dist/jsonc-Dphhs4m2.es.js +0 -6
  274. package/dist/jsonl-BbGkWPJz.cjs.js +0 -1
  275. package/dist/jsonl-D9jj92Gg.es.js +0 -6
  276. package/dist/jsonnet-Bn--UDZ1.cjs.js +0 -1
  277. package/dist/jsonnet-DEQ7IUoJ.es.js +0 -6
  278. package/dist/jssm-4CSVp8lc.cjs.js +0 -1
  279. package/dist/jssm-j74e88UX.es.js +0 -6
  280. package/dist/jsx-Bkesy5tT.es.js +0 -6
  281. package/dist/jsx-D8YwVp-7.cjs.js +0 -1
  282. package/dist/julia-B_r6juN7.es.js +0 -16
  283. package/dist/julia-DLxGoAlk.cjs.js +0 -1
  284. package/dist/kanagawa-dragon-BJZF7xDr.cjs.js +0 -1
  285. package/dist/kanagawa-dragon-CiKur4Hl.es.js +0 -4
  286. package/dist/kanagawa-lotus-BKu-smKu.es.js +0 -4
  287. package/dist/kanagawa-lotus-BhgzmRV4.cjs.js +0 -1
  288. package/dist/kanagawa-wave-BgJip59C.cjs.js +0 -1
  289. package/dist/kanagawa-wave-CQwozSzG.es.js +0 -4
  290. package/dist/kotlin-DCgZY7Ii.es.js +0 -6
  291. package/dist/kotlin-DDI6myF6.cjs.js +0 -1
  292. package/dist/kusto-Cw029H-v.es.js +0 -6
  293. package/dist/kusto-OZxALJZT.cjs.js +0 -1
  294. package/dist/laserwave--izBLY1I.cjs.js +0 -1
  295. package/dist/laserwave-6a00oqik.es.js +0 -4
  296. package/dist/latex-CXOK56Uv.cjs.js +0 -1
  297. package/dist/latex-GxBxlqbc.es.js +0 -8
  298. package/dist/lean-CYSet4vs.es.js +0 -6
  299. package/dist/lean-D1iY-35j.cjs.js +0 -1
  300. package/dist/less-DIaY7vQJ.cjs.js +0 -1
  301. package/dist/less-DQA4v-Nm.es.js +0 -6
  302. package/dist/light-plus-B5D0le0o.cjs.js +0 -1
  303. package/dist/light-plus-CZuVqSLX.es.js +0 -4
  304. package/dist/liquid-BYouVITI.cjs.js +0 -1
  305. package/dist/liquid-BxBkR-z5.es.js +0 -14
  306. package/dist/log-BIXUeBaj.cjs.js +0 -1
  307. package/dist/log-D2eRfqDn.es.js +0 -6
  308. package/dist/logo-B2d3b27P.cjs.js +0 -1
  309. package/dist/logo-QEAtGWZ9.es.js +0 -6
  310. package/dist/lua-B2_GGnC5.cjs.js +0 -1
  311. package/dist/lua-DeXVjwzF.es.js +0 -8
  312. package/dist/luau-BjYGiqID.es.js +0 -6
  313. package/dist/luau-CvqAeq4F.cjs.js +0 -1
  314. package/dist/make-BjuHP00g.es.js +0 -6
  315. package/dist/make-Oob5Z9Pk.cjs.js +0 -1
  316. package/dist/markdown-B6guhLWd.es.js +0 -6
  317. package/dist/markdown-BGBuj4LZ.cjs.js +0 -1
  318. package/dist/marko-CS7eEGs3.cjs.js +0 -1
  319. package/dist/marko-DwPYPpB3.es.js +0 -14
  320. package/dist/material-theme-D6KBX41T.es.js +0 -4
  321. package/dist/material-theme-Dj0-OyRN.cjs.js +0 -1
  322. package/dist/material-theme-darker-CkRroheE.es.js +0 -4
  323. package/dist/material-theme-darker-Dvfs29ir.cjs.js +0 -1
  324. package/dist/material-theme-lighter-BUBw43Yz.es.js +0 -4
  325. package/dist/material-theme-lighter-EU3ZGl_r.cjs.js +0 -1
  326. package/dist/material-theme-ocean-ClGX14Ja.es.js +0 -4
  327. package/dist/material-theme-ocean-px_3Pwqa.cjs.js +0 -1
  328. package/dist/material-theme-palenight-38jxvsGX.cjs.js +0 -1
  329. package/dist/material-theme-palenight-C1RVm8K1.es.js +0 -4
  330. package/dist/matlab-BpQlIJiw.es.js +0 -6
  331. package/dist/matlab-CbN2rF6P.cjs.js +0 -1
  332. package/dist/mdc-Bkl-bu_Z.cjs.js +0 -1
  333. package/dist/mdc-X4YjkufV.es.js +0 -12
  334. package/dist/mdx-Cl31h8mi.cjs.js +0 -1
  335. package/dist/mdx-DIoECIFU.es.js +0 -6
  336. package/dist/mermaid-BZ7WHNIe.es.js +0 -6
  337. package/dist/mermaid-CSogK_LM.cjs.js +0 -1
  338. package/dist/min-dark-C7ak0t6c.es.js +0 -4
  339. package/dist/min-dark-tt5o_I5e.cjs.js +0 -1
  340. package/dist/min-light-CKFxVcPp.es.js +0 -4
  341. package/dist/min-light-tmTHl_CQ.cjs.js +0 -1
  342. package/dist/mipsasm-BseoYJQp.cjs.js +0 -1
  343. package/dist/mipsasm-DusDYkFc.es.js +0 -6
  344. package/dist/mojo-CY9jaezJ.es.js +0 -6
  345. package/dist/mojo-D8QAG3Ze.cjs.js +0 -1
  346. package/dist/monokai-C1KBYcO0.es.js +0 -4
  347. package/dist/monokai-DMIxv6MM.cjs.js +0 -1
  348. package/dist/move-ChphFumd.es.js +0 -6
  349. package/dist/move-DaBrcjat.cjs.js +0 -1
  350. package/dist/narrat-Dz4d7OmN.es.js +0 -6
  351. package/dist/narrat-oOfAO4q8.cjs.js +0 -1
  352. package/dist/nextflow-BxJSKvPb.cjs.js +0 -1
  353. package/dist/nextflow-DW0Yq9a2.es.js +0 -6
  354. package/dist/nginx-ChI-VqNT.es.js +0 -8
  355. package/dist/nginx-LuyFICzP.cjs.js +0 -1
  356. package/dist/night-owl-BN78kThQ.cjs.js +0 -1
  357. package/dist/night-owl-Bm2rzalh.es.js +0 -4
  358. package/dist/nim-BiJA-5u7.es.js +0 -20
  359. package/dist/nim-DkC83hsN.cjs.js +0 -1
  360. package/dist/nix-Cg5uV_xg.es.js +0 -6
  361. package/dist/nix-DNME0Ea7.cjs.js +0 -1
  362. package/dist/nord-CC5OiUXg.es.js +0 -4
  363. package/dist/nord-Ca5AGUWc.cjs.js +0 -1
  364. package/dist/nushell-BfRnzRWn.es.js +0 -6
  365. package/dist/nushell-DI9Z3l3M.cjs.js +0 -1
  366. package/dist/objective-c-BGg9R27G.es.js +0 -6
  367. package/dist/objective-c-DVx8Rcni.cjs.js +0 -1
  368. package/dist/objective-cpp-CJ3y3V_5.es.js +0 -6
  369. package/dist/objective-cpp-s6XI7Jvk.cjs.js +0 -1
  370. package/dist/ocaml-BZLsfx_o.es.js +0 -6
  371. package/dist/ocaml-kUzDDUf2.cjs.js +0 -1
  372. package/dist/one-dark-pro-D7-kP8fv.es.js +0 -4
  373. package/dist/one-dark-pro-JOzzHStv.cjs.js +0 -1
  374. package/dist/one-light-020-h_lv.cjs.js +0 -1
  375. package/dist/one-light-D9sNaUtq.es.js +0 -4
  376. package/dist/pascal-D509_I72.cjs.js +0 -1
  377. package/dist/pascal-l2bqd7Dz.es.js +0 -6
  378. package/dist/perl-CkXYjL3t.es.js +0 -16
  379. package/dist/perl-DUnCLRB_.cjs.js +0 -1
  380. package/dist/php-D0k1sQr6.cjs.js +0 -1
  381. package/dist/php-q40Yjh5d.es.js +0 -18
  382. package/dist/plastic-CSTz3KZp.es.js +0 -4
  383. package/dist/plastic-r5piqq-S.cjs.js +0 -1
  384. package/dist/plsql-C_qH_YOK.cjs.js +0 -1
  385. package/dist/plsql-oVq_K_wH.es.js +0 -6
  386. package/dist/po-5jaeIyVd.es.js +0 -6
  387. package/dist/po-CBsLQIcu.cjs.js +0 -1
  388. package/dist/poimandres-BLP3NNjc.cjs.js +0 -1
  389. package/dist/poimandres-C-VADXHD.es.js +0 -4
  390. package/dist/polar-De-CDeYv.cjs.js +0 -1
  391. package/dist/polar-wcLp8ci7.es.js +0 -6
  392. package/dist/postcss-BZ3MNRIJ.es.js +0 -6
  393. package/dist/postcss-BtcsgaYj.cjs.js +0 -1
  394. package/dist/powerquery-B0rHn13V.cjs.js +0 -1
  395. package/dist/powerquery-CgRa2XRw.es.js +0 -6
  396. package/dist/powershell-Diwyv8Eh.es.js +0 -6
  397. package/dist/powershell-rCX2OYXT.cjs.js +0 -1
  398. package/dist/prisma-BaaUHYMp.cjs.js +0 -1
  399. package/dist/prisma-COL_v1x4.es.js +0 -6
  400. package/dist/prolog-CuvJOxqT.es.js +0 -6
  401. package/dist/prolog-DrXD2tGS.cjs.js +0 -1
  402. package/dist/proto-BtmQjBQu.cjs.js +0 -1
  403. package/dist/proto-o9HLmF90.es.js +0 -6
  404. package/dist/pug-Br4hpvIv.es.js +0 -12
  405. package/dist/pug-CFQMpTUe.cjs.js +0 -1
  406. package/dist/puppet-cIrXIuy8.cjs.js +0 -1
  407. package/dist/puppet-wpGOnQp5.es.js +0 -6
  408. package/dist/purescript-B_1NgE2N.es.js +0 -6
  409. package/dist/purescript-CX9QPs2N.cjs.js +0 -1
  410. package/dist/python-B9x3euv6.cjs.js +0 -1
  411. package/dist/python-xYxLFJY-.es.js +0 -6
  412. package/dist/qml-CzqrIM5W.cjs.js +0 -1
  413. package/dist/qml-D5gi21kK.es.js +0 -8
  414. package/dist/qmldir-BInDYbpo.es.js +0 -6
  415. package/dist/qmldir-DNF9H2ir.cjs.js +0 -1
  416. package/dist/qss-C744dLby.cjs.js +0 -1
  417. package/dist/qss-D-h4NdUG.es.js +0 -6
  418. package/dist/r-DgOc9oMe.cjs.js +0 -1
  419. package/dist/r-F-9I-ITZ.es.js +0 -6
  420. package/dist/racket-BoD1TBFT.es.js +0 -6
  421. package/dist/racket-Do9_vqnd.cjs.js +0 -1
  422. package/dist/raku-BW8wAUIz.cjs.js +0 -1
  423. package/dist/raku-IaYcw19m.es.js +0 -6
  424. package/dist/razor-Bt_t1YJb.es.js +0 -10
  425. package/dist/razor-COQhlwWF.cjs.js +0 -1
  426. package/dist/red-7y8PH7HH.es.js +0 -4
  427. package/dist/red-BQGOv1D5.cjs.js +0 -1
  428. package/dist/reg-CGWN_v-z.cjs.js +0 -1
  429. package/dist/reg-CMUdAgIP.es.js +0 -6
  430. package/dist/regexp-GiFkbxS-.es.js +0 -6
  431. package/dist/regexp-N7Z4hEeU.cjs.js +0 -1
  432. package/dist/rel-BYqA7mnV.cjs.js +0 -1
  433. package/dist/rel-BaRn3QX7.es.js +0 -6
  434. package/dist/riscv-B9V3SsvW.es.js +0 -6
  435. package/dist/riscv-ayQMUpo9.cjs.js +0 -1
  436. package/dist/rose-pine-DKEdv1Oe.cjs.js +0 -1
  437. package/dist/rose-pine-DhT-HZE9.es.js +0 -4
  438. package/dist/rose-pine-dawn-Bvt6DtVH.cjs.js +0 -1
  439. package/dist/rose-pine-dawn-DiCjL2i4.es.js +0 -4
  440. package/dist/rose-pine-moon-BNmGHlcn.es.js +0 -4
  441. package/dist/rose-pine-moon-cHuJy0Ng.cjs.js +0 -1
  442. package/dist/rst-BmKw97ch.es.js +0 -22
  443. package/dist/rst-Bq-h_T5U.cjs.js +0 -1
  444. package/dist/ruby-Bw5IEIKD.cjs.js +0 -1
  445. package/dist/ruby-cs7BSa_9.es.js +0 -30
  446. package/dist/rust-BnFKGEfa.cjs.js +0 -1
  447. package/dist/rust-Pc7DCsZD.es.js +0 -6
  448. package/dist/sas-BWKaSYkZ.cjs.js +0 -1
  449. package/dist/sas-DgvHx4mL.es.js +0 -8
  450. package/dist/sass-B9gYryDE.cjs.js +0 -1
  451. package/dist/sass-iCyS6eP9.es.js +0 -6
  452. package/dist/scala-C85dOwSU.cjs.js +0 -1
  453. package/dist/scala-Cly-fENF.es.js +0 -6
  454. package/dist/scheme-B_XUaARm.cjs.js +0 -1
  455. package/dist/scheme-Zi24oEYu.es.js +0 -6
  456. package/dist/scss-B_hSZppj.es.js +0 -8
  457. package/dist/scss-CV3c8_Y7.cjs.js +0 -1
  458. package/dist/sdbl-7Y5u0OW0.cjs.js +0 -1
  459. package/dist/sdbl-BBamrXFL.es.js +0 -6
  460. package/dist/shaderlab-CJ8U2E2w.cjs.js +0 -1
  461. package/dist/shaderlab-U9mqcu_f.es.js +0 -8
  462. package/dist/shellscript-3DYM9fut.cjs.js +0 -1
  463. package/dist/shellscript-Dn0-btNd.es.js +0 -6
  464. package/dist/shellsession-CbKmorC3.cjs.js +0 -1
  465. package/dist/shellsession-LvXGClmj.es.js +0 -8
  466. package/dist/slack-dark-akqwQ7ED.cjs.js +0 -1
  467. package/dist/slack-dark-i7wN4OET.es.js +0 -4
  468. package/dist/slack-ochin-BoQQWmTv.cjs.js +0 -1
  469. package/dist/slack-ochin-ndHf0LoP.es.js +0 -4
  470. package/dist/smalltalk-CCvytUuW.cjs.js +0 -1
  471. package/dist/smalltalk-Cns31tKw.es.js +0 -6
  472. package/dist/snazzy-light-BlSJXAu4.es.js +0 -4
  473. package/dist/snazzy-light-D_IwRieF.cjs.js +0 -1
  474. package/dist/solarized-dark-UTmkh7lw.es.js +0 -4
  475. package/dist/solarized-dark-gmm-WbDC.cjs.js +0 -1
  476. package/dist/solarized-light-BheCkDPT.es.js +0 -4
  477. package/dist/solarized-light-DzcxRSZP.cjs.js +0 -1
  478. package/dist/solidity-BG_k8fA_.es.js +0 -6
  479. package/dist/solidity-BcNcjFC4.cjs.js +0 -1
  480. package/dist/soy-B2d9ZydM.cjs.js +0 -1
  481. package/dist/soy-C0yEn39K.es.js +0 -8
  482. package/dist/sparql-CiBxIK0g.cjs.js +0 -1
  483. package/dist/sparql-CuZaxpno.es.js +0 -8
  484. package/dist/splunk-CTqDjQdo.es.js +0 -6
  485. package/dist/splunk-CzITjJj7.cjs.js +0 -1
  486. package/dist/sql-BqWZrLHB.cjs.js +0 -1
  487. package/dist/sql-DCkt643-.es.js +0 -6
  488. package/dist/ssh-config-DHHGll-v.es.js +0 -6
  489. package/dist/ssh-config-DUPeuEdB.cjs.js +0 -1
  490. package/dist/stata-B8m3qL-x.cjs.js +0 -1
  491. package/dist/stata-Dv81f34z.es.js +0 -8
  492. package/dist/stylus-ByHs6N-o.cjs.js +0 -1
  493. package/dist/stylus-n_9f0QQ5.es.js +0 -6
  494. package/dist/svelte-CfLoBBrI.cjs.js +0 -1
  495. package/dist/svelte-SoJd35Jr.es.js +0 -14
  496. package/dist/swift-BAWqNR8A.es.js +0 -6
  497. package/dist/swift-C5DnOriA.cjs.js +0 -1
  498. package/dist/synthwave-84-BBRLOmNT.cjs.js +0 -1
  499. package/dist/synthwave-84-NU3C_KFZ.es.js +0 -4
  500. package/dist/system-verilog-ClPLYLwh.cjs.js +0 -1
  501. package/dist/system-verilog-Cui-g-ut.es.js +0 -6
  502. package/dist/systemd-BASX0DlX.cjs.js +0 -1
  503. package/dist/systemd-CsKYQIQK.es.js +0 -6
  504. package/dist/talonscript-D2dGh8FO.es.js +0 -6
  505. package/dist/talonscript-DkCSnLHD.cjs.js +0 -1
  506. package/dist/tasl-BAQJK7KZ.cjs.js +0 -1
  507. package/dist/tasl-D3W8HMV6.es.js +0 -6
  508. package/dist/tcl-2y0Fuc4S.es.js +0 -6
  509. package/dist/tcl-CwJAYTvh.cjs.js +0 -1
  510. package/dist/templ-BSMv2wKZ.cjs.js +0 -1
  511. package/dist/templ-C7he2afp.es.js +0 -12
  512. package/dist/terraform-BGW6Oerf.es.js +0 -6
  513. package/dist/terraform-s-pzyVvp.cjs.js +0 -1
  514. package/dist/tex-B0y3cEZp.es.js +0 -8
  515. package/dist/tex-DwtFCA08.cjs.js +0 -1
  516. package/dist/tokyo-night-9T7_vGSy.cjs.js +0 -1
  517. package/dist/tokyo-night-LhP3hHhi.es.js +0 -4
  518. package/dist/toml-CQSfOn0e.es.js +0 -6
  519. package/dist/toml-CyMM7IXy.cjs.js +0 -1
  520. package/dist/ts-tags-C5-4VQhf.es.js +0 -41
  521. package/dist/ts-tags-MIr66hKK.cjs.js +0 -1
  522. package/dist/tsv-BtvSkaG0.es.js +0 -6
  523. package/dist/tsv-DqNGnuVj.cjs.js +0 -1
  524. package/dist/tsx-DiGsgWT8.es.js +0 -6
  525. package/dist/tsx-DpBRUnKC.cjs.js +0 -1
  526. package/dist/turtle-BJ2wmjPc.es.js +0 -6
  527. package/dist/turtle-DfO3eAsu.cjs.js +0 -1
  528. package/dist/twig-BzjoX4ZJ.cjs.js +0 -1
  529. package/dist/twig-OmkATFdv.es.js +0 -18
  530. package/dist/typescript-BqvpT6pB.cjs.js +0 -1
  531. package/dist/typescript-buWNZFwO.es.js +0 -6
  532. package/dist/typespec-P-ZVy8yC.cjs.js +0 -1
  533. package/dist/typespec-bLbdsxJL.es.js +0 -6
  534. package/dist/typst-BVh2IsT9.cjs.js +0 -1
  535. package/dist/typst-Y9_SmXTs.es.js +0 -6
  536. package/dist/v-BUlE9136.cjs.js +0 -1
  537. package/dist/v-wa8Orrdd.es.js +0 -6
  538. package/dist/vala-BIymb2K_.cjs.js +0 -1
  539. package/dist/vala-DRdriFr_.es.js +0 -6
  540. package/dist/vb-E2_-jk4M.es.js +0 -6
  541. package/dist/vb-IXOh8mqV.cjs.js +0 -1
  542. package/dist/verilog-B1iBoR5_.es.js +0 -6
  543. package/dist/verilog-BiglCqvO.cjs.js +0 -1
  544. package/dist/vesper-CJsaOsSM.es.js +0 -4
  545. package/dist/vesper-DqLWLxOu.cjs.js +0 -1
  546. package/dist/vhdl-CJUzuS2t.cjs.js +0 -1
  547. package/dist/vhdl-CRVaAhXk.es.js +0 -6
  548. package/dist/viml-B-zWOd7Z.es.js +0 -6
  549. package/dist/viml-B1nKLcgt.cjs.js +0 -1
  550. package/dist/vitesse-black-BoGvW84i.es.js +0 -4
  551. package/dist/vitesse-black-MF-1S1MG.cjs.js +0 -1
  552. package/dist/vitesse-dark-Cym-eLtO.es.js +0 -4
  553. package/dist/vitesse-dark-SIffJYSe.cjs.js +0 -1
  554. package/dist/vitesse-light-CcmG315c.es.js +0 -4
  555. package/dist/vitesse-light-U63SkYGT.cjs.js +0 -1
  556. package/dist/vue-DCwwWMGI.es.js +0 -31
  557. package/dist/vue-DYZqcRaZ.cjs.js +0 -1
  558. package/dist/vue-html-CdPbyrq1.cjs.js +0 -1
  559. package/dist/vue-html-sRE_Ny23.es.js +0 -10
  560. package/dist/vyper-CO9xUkIY.cjs.js +0 -1
  561. package/dist/vyper-DWutKXpa.es.js +0 -6
  562. package/dist/wasm-Bv5f0gKv.es.js +0 -6
  563. package/dist/wasm-CdIThIat.cjs.js +0 -1
  564. package/dist/wenyan-BMYnfus1.es.js +0 -6
  565. package/dist/wenyan-BSJ3fk7e.cjs.js +0 -1
  566. package/dist/wgsl-DnPoPGDU.es.js +0 -6
  567. package/dist/wgsl-d3zZE7ZN.cjs.js +0 -1
  568. package/dist/wikitext-BRCqXN2g.cjs.js +0 -1
  569. package/dist/wikitext-CntM04PE.es.js +0 -6
  570. package/dist/wolfram-C3rR92zj.cjs.js +0 -1
  571. package/dist/wolfram-Ws5qPlX9.es.js +0 -6
  572. package/dist/xml-BRLTD55J.cjs.js +0 -1
  573. package/dist/xml-Ch1q_kJp.es.js +0 -8
  574. package/dist/xsl-DyL8yqXw.es.js +0 -8
  575. package/dist/xsl-ETbYGV_-.cjs.js +0 -1
  576. package/dist/yaml-7DV6pRKj.cjs.js +0 -1
  577. package/dist/yaml-Bbg74JKr.es.js +0 -6
  578. package/dist/zenscript-BWMxwjeH.cjs.js +0 -1
  579. package/dist/zenscript-C0RKE4nU.es.js +0 -6
  580. package/dist/zig-D6SXBGNm.es.js +0 -6
  581. package/dist/zig-yAcNfpgW.cjs.js +0 -1
@@ -0,0 +1,322 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+ import { DimensionSpec } from "./useDimensionalFilterRangeData";
3
+
4
+ /**
5
+ * Match types for filtering dimensions
6
+ */
7
+ export type MatchType =
8
+ | "Equals"
9
+ | "Contains"
10
+ | "After"
11
+ | "Before"
12
+ | "Less Than"
13
+ | "Greater Than"
14
+ | "Between"
15
+ | "Concept Search";
16
+
17
+ /**
18
+ * Primitive types that can be used as filter values
19
+ */
20
+ export type FilterValuePrimitive = string | number | boolean | Date;
21
+
22
+ /**
23
+ * Type for filter values - can be a single value or an array for multi-select
24
+ */
25
+ export type FilterValue = FilterValuePrimitive | FilterValuePrimitive[];
26
+
27
+ /**
28
+ * A selected filter value with its match type
29
+ */
30
+ export interface FilterSelection {
31
+ dimensionName: string;
32
+ matchType: MatchType;
33
+ value: FilterValue;
34
+ value2?: FilterValuePrimitive; // For "Between" match type
35
+ }
36
+
37
+ /**
38
+ * Complete filter state including the dimension spec and selection
39
+ */
40
+ export interface DimensionFilterState {
41
+ spec: DimensionSpec;
42
+ selection: FilterSelection | null;
43
+ }
44
+
45
+ /**
46
+ * Parameters for the useDimensionFilters hook
47
+ */
48
+ export interface UseDimensionFiltersParams {
49
+ /** Dimension specifications (each includes source and model) */
50
+ dimensionSpecs: DimensionSpec[];
51
+ }
52
+
53
+ /**
54
+ * Result from the useDimensionFilters hook
55
+ */
56
+ export interface UseDimensionFiltersResult {
57
+ /** Current filter states */
58
+ filterStates: Map<string, DimensionFilterState>;
59
+ /** Update a filter selection */
60
+ updateFilter: (
61
+ dimensionName: string,
62
+ selection: FilterSelection | null,
63
+ ) => void;
64
+ /** Clear a specific filter */
65
+ clearFilter: (dimensionName: string) => void;
66
+ /** Clear all filters */
67
+ clearAllFilters: () => void;
68
+ /** Get active filters (with selections) */
69
+ getActiveFilters: () => FilterSelection[];
70
+ /** Generate Malloy query fragment for active filters */
71
+ generateWhereClause: () => string;
72
+ }
73
+
74
+ /**
75
+ * Escapes special characters in strings for Malloy queries
76
+ */
77
+ function escapeMalloyString(value: string): string {
78
+ return value.replace(/'/g, "\\'").replace(/\\/g, "\\\\");
79
+ }
80
+
81
+ /**
82
+ * Formats a value for use in Malloy query
83
+ */
84
+ function formatMalloyValue(
85
+ value: FilterValuePrimitive | null | undefined,
86
+ isDate: boolean = false,
87
+ ): string {
88
+ if (value === null || value === undefined) {
89
+ return "null";
90
+ }
91
+
92
+ if (isDate) {
93
+ if (value instanceof Date) {
94
+ // Format as YYYY-MM-DD
95
+ return `@${value.getFullYear()}-${String(value.getMonth() + 1).padStart(2, "0")}-${String(value.getDate()).padStart(2, "0")}`;
96
+ }
97
+ // If it's a string, assume it's already in ISO format
98
+ return `@${value}`;
99
+ }
100
+
101
+ if (typeof value === "string") {
102
+ return `'${escapeMalloyString(value)}'`;
103
+ }
104
+
105
+ if (typeof value === "number") {
106
+ return String(value);
107
+ }
108
+
109
+ if (typeof value === "boolean") {
110
+ return value ? "true" : "false";
111
+ }
112
+
113
+ return String(value);
114
+ }
115
+
116
+ /**
117
+ * Generates a Malloy filter condition for a single filter selection
118
+ */
119
+ function generateFilterCondition(selection: FilterSelection): string {
120
+ const { dimensionName, matchType, value, value2 } = selection;
121
+ const fieldName = `\`${dimensionName}\``;
122
+
123
+ // Determine if this is a date field based on the value
124
+ const isDate = value instanceof Date;
125
+
126
+ switch (matchType) {
127
+ case "Equals":
128
+ case "Concept Search":
129
+ if (Array.isArray(value) && value.length > 0) {
130
+ // Handle multi-select: (field = val1 or field = val2)
131
+ const conditions = value.map(
132
+ (v) => `${fieldName} = ${formatMalloyValue(v, isDate)}`,
133
+ );
134
+ return `(${conditions.join(" or ")})`;
135
+ }
136
+ // Empty array or single value
137
+ if (Array.isArray(value)) return "";
138
+ return `${fieldName} = ${formatMalloyValue(value, isDate)}`;
139
+
140
+ case "Contains":
141
+ if (typeof value === "string") {
142
+ return `${fieldName} ~ f'%${escapeMalloyString(value)}%'`;
143
+ }
144
+ if (Array.isArray(value)) return "";
145
+ return `${fieldName} = ${formatMalloyValue(value)}`;
146
+
147
+ case "After":
148
+ if (Array.isArray(value)) return "";
149
+ return `${fieldName} > ${formatMalloyValue(value, isDate)}`;
150
+
151
+ case "Before":
152
+ if (Array.isArray(value)) return "";
153
+ return `${fieldName} < ${formatMalloyValue(value, isDate)}`;
154
+
155
+ case "Greater Than":
156
+ if (Array.isArray(value)) return "";
157
+ return `${fieldName} > ${formatMalloyValue(value)}`;
158
+
159
+ case "Less Than":
160
+ if (Array.isArray(value)) return "";
161
+ return `${fieldName} < ${formatMalloyValue(value)}`;
162
+
163
+ case "Between":
164
+ if (Array.isArray(value)) return "";
165
+ if (value2 !== undefined) {
166
+ return `${fieldName} >= ${formatMalloyValue(value, isDate)} and ${fieldName} <= ${formatMalloyValue(value2, isDate)}`;
167
+ }
168
+ return `${fieldName} >= ${formatMalloyValue(value, isDate)}`;
169
+
170
+ default:
171
+ return "";
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Custom hook to manage dimension filter state and generate Malloy queries
177
+ *
178
+ * This hook maintains filter state for multiple dimensions and provides utilities
179
+ * to generate Malloy WHERE clauses based on the active filters.
180
+ *
181
+ * @param params - Parameters including dimension specs (each with source and model)
182
+ * @returns Filter state management functions and query generation
183
+ *
184
+ * @example
185
+ * ```tsx
186
+ * const { filterStates, updateFilter, generateWhereClause } = useDimensionFilters({
187
+ * dimensionSpecs: [
188
+ * { dimensionName: "category", filterType: "Star", source: "my_source", model: "model.malloy" },
189
+ * { dimensionName: "price", filterType: "MinMax", source: "my_source", model: "model.malloy" },
190
+ * ],
191
+ * });
192
+ *
193
+ * // Update a filter
194
+ * updateFilter("category", {
195
+ * dimensionName: "category",
196
+ * matchType: "Equals",
197
+ * value: "Electronics"
198
+ * });
199
+ *
200
+ * // Generate query
201
+ * const whereClause = generateWhereClause();
202
+ * // Returns: "where `category` = 'Electronics'"
203
+ * ```
204
+ */
205
+ export function useDimensionFilters(
206
+ params: UseDimensionFiltersParams,
207
+ ): UseDimensionFiltersResult {
208
+ const { dimensionSpecs } = params;
209
+
210
+ // Initialize filter states
211
+ const [filterStates, setFilterStates] = useState<
212
+ Map<string, DimensionFilterState>
213
+ >(() => {
214
+ const initialStates = new Map<string, DimensionFilterState>();
215
+ dimensionSpecs.forEach((spec) => {
216
+ initialStates.set(spec.dimensionName, {
217
+ spec,
218
+ selection: null,
219
+ });
220
+ });
221
+ return initialStates;
222
+ });
223
+
224
+ // Sync filter states when dimensionSpecs change (e.g., loaded asynchronously)
225
+ useEffect(() => {
226
+ setFilterStates((prevStates) => {
227
+ const newStates = new Map<string, DimensionFilterState>();
228
+
229
+ dimensionSpecs.forEach((spec) => {
230
+ // Preserve existing selection if the dimension already exists
231
+ const existingState = prevStates.get(spec.dimensionName);
232
+ newStates.set(spec.dimensionName, {
233
+ spec,
234
+ selection: existingState?.selection ?? null,
235
+ });
236
+ });
237
+
238
+ return newStates;
239
+ });
240
+ }, [dimensionSpecs]);
241
+
242
+ // Update a filter selection
243
+ const updateFilter = useCallback(
244
+ (dimensionName: string, selection: FilterSelection | null) => {
245
+ setFilterStates((prevStates) => {
246
+ const newStates = new Map(prevStates);
247
+ const existingState = newStates.get(dimensionName);
248
+
249
+ if (existingState) {
250
+ newStates.set(dimensionName, {
251
+ ...existingState,
252
+ selection,
253
+ });
254
+ }
255
+
256
+ return newStates;
257
+ });
258
+ },
259
+ [],
260
+ );
261
+
262
+ // Clear a specific filter
263
+ const clearFilter = useCallback(
264
+ (dimensionName: string) => {
265
+ updateFilter(dimensionName, null);
266
+ },
267
+ [updateFilter],
268
+ );
269
+
270
+ // Clear all filters
271
+ const clearAllFilters = useCallback(() => {
272
+ setFilterStates((prevStates) => {
273
+ const newStates = new Map(prevStates);
274
+ newStates.forEach((state, key) => {
275
+ newStates.set(key, {
276
+ ...state,
277
+ selection: null,
278
+ });
279
+ });
280
+ return newStates;
281
+ });
282
+ }, []);
283
+
284
+ // Get active filters (those with selections)
285
+ const getActiveFilters = useCallback((): FilterSelection[] => {
286
+ const activeFilters: FilterSelection[] = [];
287
+ filterStates.forEach((state) => {
288
+ if (state.selection) {
289
+ activeFilters.push(state.selection);
290
+ }
291
+ });
292
+ return activeFilters;
293
+ }, [filterStates]);
294
+
295
+ // Generate Malloy WHERE clause from active filters
296
+ const generateWhereClause = useCallback((): string => {
297
+ const activeFilters = getActiveFilters();
298
+
299
+ if (activeFilters.length === 0) {
300
+ return "";
301
+ }
302
+
303
+ const conditions = activeFilters
304
+ .map((selection) => generateFilterCondition(selection))
305
+ .filter((condition) => condition.length > 0);
306
+
307
+ if (conditions.length === 0) {
308
+ return "";
309
+ }
310
+
311
+ return `where ${conditions.join(" and ")}`;
312
+ }, [getActiveFilters]);
313
+
314
+ return {
315
+ filterStates,
316
+ updateFilter,
317
+ clearFilter,
318
+ clearAllFilters,
319
+ getActiveFilters,
320
+ generateWhereClause,
321
+ };
322
+ }
@@ -0,0 +1,117 @@
1
+ import { useMemo } from "react";
2
+ import {
3
+ DimensionSpec,
4
+ useDimensionalFilterRangeData,
5
+ } from "./useDimensionalFilterRangeData";
6
+ import { useDimensionFilters } from "./useDimensionFilters";
7
+ import { useDimensionFiltersQuery } from "./useDimensionFiltersQuery";
8
+
9
+ /**
10
+ * Configuration for dimensional filters
11
+ */
12
+ export interface DimensionFiltersConfig {
13
+ /** Project name */
14
+ project: string;
15
+ /** Package name */
16
+ package: string;
17
+ /** Version ID (optional) */
18
+ versionId?: string;
19
+ /** Index limit for retrieval queries */
20
+ indexLimit: number;
21
+ /** Dimension specifications for filters (each includes source and model) */
22
+ dimensionSpecs: DimensionSpec[];
23
+ /** Fields/columns to group by in the query (if not specified, uses select *) */
24
+ selectFields?: string[];
25
+ }
26
+
27
+ /**
28
+ * Options passed to useDimensionFiltersFromSpec
29
+ */
30
+ export interface UseDimensionFiltersFromSpecOptions {
31
+ config: DimensionFiltersConfig;
32
+ /** Maximum number of results to return from query (default: 100) */
33
+ queryLimit?: number;
34
+ }
35
+
36
+ /**
37
+ * Combined hook that manages dimensional filters, data fetching, and query execution
38
+ * from a single configuration object.
39
+ *
40
+ * @param config - Configuration containing project, package, dimension specs, and index limit
41
+ * @param queryLimit - Maximum number of results to return from query (default: 100)
42
+ * @returns All state and methods needed for dimensional filtering UI
43
+ */
44
+ export function useDimensionFiltersFromSpec(
45
+ config: DimensionFiltersConfig,
46
+ queryLimit: number = 5000,
47
+ ) {
48
+ // Get primary source/model from dimension specs (for query execution)
49
+ const primarySource = config.dimensionSpecs[0]?.source ?? "";
50
+ const primaryModel = config.dimensionSpecs[0]?.model ?? "";
51
+
52
+ // Manage filter state and query generation
53
+ const { filterStates, updateFilter, clearAllFilters, getActiveFilters } =
54
+ useDimensionFilters({
55
+ dimensionSpecs: config.dimensionSpecs,
56
+ });
57
+
58
+ // Get active filters (memoized to prevent unnecessary re-renders)
59
+ // Note: filterStates must be in the dependency array to ensure activeFilters updates
60
+ // when individual filter values change (e.g., removing a chip from multi-select)
61
+ const activeFilters = useMemo(
62
+ () => getActiveFilters(),
63
+ // eslint-disable-next-line react-hooks/exhaustive-deps
64
+ [filterStates, getActiveFilters],
65
+ );
66
+
67
+ // Fetch dimensional filter range data
68
+ // When activeFilters change, the hook will automatically re-fetch with filters applied
69
+ // The hook handles multiple source/model combos internally
70
+ const { data, noRowsMatchedFilter, isLoading, isError, error, refetch } =
71
+ useDimensionalFilterRangeData({
72
+ project: config.project,
73
+ package: config.package,
74
+ indexLimit: config.indexLimit,
75
+ dimensionSpecs: config.dimensionSpecs,
76
+ versionId: config.versionId,
77
+ activeFilters,
78
+ });
79
+
80
+ // Only show loading on initial load, not during refetches
81
+ const isInitialLoading = isLoading && !data;
82
+
83
+ // Generate the embedded query result (uses primary source/model)
84
+ const { embeddedQueryResult, queryString, executeQuery, canExecute } =
85
+ useDimensionFiltersQuery({
86
+ project: config.project,
87
+ package: config.package,
88
+ model: primaryModel,
89
+ source: primarySource,
90
+ filterSelections: activeFilters,
91
+ limit: queryLimit,
92
+ fields: config.selectFields,
93
+ });
94
+
95
+ return {
96
+ // Filter state management
97
+ filterStates,
98
+ updateFilter,
99
+ clearAllFilters,
100
+ activeFilters,
101
+
102
+ // Data fetching
103
+ data,
104
+ noRowsMatchedFilter,
105
+ isLoading,
106
+ isInitialLoading,
107
+ isError,
108
+ error,
109
+ refetch,
110
+
111
+ // Query execution
112
+ embeddedQueryResult,
113
+ queryString,
114
+ executeQuery,
115
+ canExecute,
116
+ };
117
+ }