@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.
- package/README.md +122 -1
- package/dist/ServerProvider-Bzid56gJ.cjs.js +1 -0
- package/dist/{ServerProvider-BGGK1ZQ_.es.js → ServerProvider-D-y63tG0.es.js} +550 -478
- package/dist/client/api.d.ts +144 -53
- package/dist/client/index.cjs.js +1 -1
- package/dist/client/index.es.js +22 -21
- package/dist/components/Notebook/Notebook.d.ts +4 -1
- package/dist/components/Notebook/NotebookCell.d.ts +2 -2
- package/dist/components/Notebook/types.d.ts +21 -0
- package/dist/components/filter/DimensionFilter.d.ts +43 -0
- package/dist/components/filter/index.d.ts +4 -0
- package/dist/components/filter/utils.d.ts +75 -0
- package/dist/components/index.d.ts +7 -6
- package/dist/components/styles.d.ts +3 -3
- package/dist/hooks/index.d.ts +4 -0
- package/dist/hooks/useDimensionFilters.d.ts +84 -0
- package/dist/hooks/useDimensionFiltersFromSpec.d.ts +52 -0
- package/dist/hooks/useDimensionFiltersQuery.d.ts +79 -0
- package/dist/hooks/useDimensionalFilterRangeData.d.ts +106 -0
- package/dist/index.cjs.js +141 -112
- package/dist/index.d.ts +3 -2
- package/dist/index.es.js +47903 -39798
- package/dist/sdk.css +1 -1
- package/package.json +16 -11
- package/src/components/Home/Home.tsx +15 -11
- package/src/components/Notebook/Notebook.tsx +391 -6
- package/src/components/Notebook/NotebookCell.tsx +2 -2
- package/src/components/Notebook/types.ts +24 -0
- package/src/components/Package/Connections.tsx +3 -6
- package/src/components/RenderedResult/RenderedResult.tsx +22 -3
- package/src/components/filter/DimensionFilter.tsx +738 -0
- package/src/components/filter/index.ts +20 -0
- package/src/components/filter/utils.ts +354 -0
- package/src/components/highlighter.ts +14 -6
- package/src/components/index.ts +7 -6
- package/src/hooks/index.ts +31 -0
- package/src/hooks/useDimensionFilters.ts +322 -0
- package/src/hooks/useDimensionFiltersFromSpec.ts +117 -0
- package/src/hooks/useDimensionFiltersQuery.ts +300 -0
- package/src/hooks/useDimensionalFilterRangeData.ts +758 -0
- package/src/index.ts +3 -2
- package/dist/ServerProvider-lXAaPKBb.cjs.js +0 -1
- package/dist/abap-BmBUA35e.es.js +0 -6
- package/dist/abap-Dwt2rH6y.cjs.js +0 -1
- package/dist/actionscript-3-mj8Uhnsc.cjs.js +0 -1
- package/dist/actionscript-3-zFUbzQa9.es.js +0 -6
- package/dist/ada-CBvPkFpZ.es.js +0 -6
- package/dist/ada-DZM58Vqs.cjs.js +0 -1
- package/dist/andromeeda-BXc5FOIb.cjs.js +0 -1
- package/dist/andromeeda-uXNdzNpk.es.js +0 -4
- package/dist/angular-html-B60m4jt-.cjs.js +0 -1
- package/dist/angular-html-D3aW1y6T.es.js +0 -32
- package/dist/angular-ts-Jud40GrY.es.js +0 -21
- package/dist/angular-ts-SIlYrqkG.cjs.js +0 -1
- package/dist/apache-CVNlsSDc.es.js +0 -6
- package/dist/apache-D7v5fxtZ.cjs.js +0 -1
- package/dist/apex-4hrAnw0a.cjs.js +0 -1
- package/dist/apex-DFk3KRB1.es.js +0 -6
- package/dist/apl-CKSaOFbt.cjs.js +0 -1
- package/dist/apl-pE3PRTDr.es.js +0 -16
- package/dist/applescript-CYMR_y0g.es.js +0 -6
- package/dist/applescript-Cnd3Dxju.cjs.js +0 -1
- package/dist/ara-4QmU5e04.es.js +0 -6
- package/dist/ara-BQ2aGbFQ.cjs.js +0 -1
- package/dist/asciidoc-C6nYvw8K.cjs.js +0 -1
- package/dist/asciidoc-v_1bjgUg.es.js +0 -6
- package/dist/asm-CQnBVCj-.cjs.js +0 -1
- package/dist/asm-RC0Yh-NZ.es.js +0 -6
- package/dist/astro-Be6fybGX.es.js +0 -16
- package/dist/astro-KhYkz6Xu.cjs.js +0 -1
- package/dist/aurora-x-BwoVEUWZ.es.js +0 -4
- package/dist/aurora-x-C5IpmIOG.cjs.js +0 -1
- package/dist/awk-DUx4h__E.cjs.js +0 -1
- package/dist/awk-gPH8MVMW.es.js +0 -6
- package/dist/ayu-dark-Cv7nTiif.cjs.js +0 -1
- package/dist/ayu-dark-CxPZkpb2.es.js +0 -4
- package/dist/ballerina-CXlzbmzl.cjs.js +0 -1
- package/dist/ballerina-kvLnRU_e.es.js +0 -6
- package/dist/bat-BHYy44sT.es.js +0 -6
- package/dist/bat-DlMT9sut.cjs.js +0 -1
- package/dist/beancount-CyyiuUzM.cjs.js +0 -1
- package/dist/beancount-D-MADTs_.es.js +0 -6
- package/dist/berry-B0EjuzrL.cjs.js +0 -1
- package/dist/berry-Ci9U0o4h.es.js +0 -6
- package/dist/bibtex-CX618D15.es.js +0 -6
- package/dist/bibtex-CfoG9xRq.cjs.js +0 -1
- package/dist/bicep-D6PH_9IY.cjs.js +0 -1
- package/dist/bicep-iuYiPopT.es.js +0 -6
- package/dist/blade-C0tMuk8f.cjs.js +0 -1
- package/dist/blade-DmXp5Zcz.es.js +0 -18
- package/dist/bsl-CfHcite8.cjs.js +0 -1
- package/dist/bsl-NPX_d-bb.es.js +0 -8
- package/dist/c-C4sXGJZM.cjs.js +0 -1
- package/dist/c-DASdrs7p.es.js +0 -6
- package/dist/cadence-BDALQi26.es.js +0 -6
- package/dist/cadence-Dq2CYzXG.cjs.js +0 -1
- package/dist/cairo-17kO8-kb.es.js +0 -8
- package/dist/cairo-CcKpJkyf.cjs.js +0 -1
- package/dist/catppuccin-frappe-BrTOiad2.es.js +0 -4
- package/dist/catppuccin-frappe-DXAedND3.cjs.js +0 -1
- package/dist/catppuccin-latte-D-dc_R4m.es.js +0 -4
- package/dist/catppuccin-latte-mwGw3-Ej.cjs.js +0 -1
- package/dist/catppuccin-macchiato-DN4jOp0G.es.js +0 -4
- package/dist/catppuccin-macchiato-cQCk9ADg.cjs.js +0 -1
- package/dist/catppuccin-mocha-B8yCE3-3.es.js +0 -4
- package/dist/catppuccin-mocha-ClSzDZSl.cjs.js +0 -1
- package/dist/clarity-CNgV2Ths.es.js +0 -6
- package/dist/clarity-ytMkUD5Q.cjs.js +0 -1
- package/dist/clojure-B_Wv414H.cjs.js +0 -1
- package/dist/clojure-CsKKFGwv.es.js +0 -6
- package/dist/cmake-Dr-A3iJx.es.js +0 -6
- package/dist/cmake-TBUaQXYY.cjs.js +0 -1
- package/dist/cobol-BzcJm6ie.es.js +0 -10
- package/dist/cobol-DXFNH4EH.cjs.js +0 -1
- package/dist/codeowners-Bt9yU6NX.es.js +0 -6
- package/dist/codeowners-QhPK6lIJ.cjs.js +0 -1
- package/dist/codeql-B7Q9tkDJ.cjs.js +0 -1
- package/dist/codeql-DBNTqJi1.es.js +0 -6
- package/dist/coffee-GRRSkgX1.cjs.js +0 -1
- package/dist/coffee-q2iaxUnQ.es.js +0 -8
- package/dist/common-lisp-Ced3ctK5.cjs.js +0 -1
- package/dist/common-lisp-r7ZEOG7T.es.js +0 -6
- package/dist/coq-BTRB4iqi.cjs.js +0 -1
- package/dist/coq-CB6Pv_W9.es.js +0 -6
- package/dist/cpp-CPOvHZqs.cjs.js +0 -1
- package/dist/cpp-CPQtoCcU.es.js +0 -18
- package/dist/crystal-BY_Cg265.es.js +0 -18
- package/dist/crystal-C6AG-iew.cjs.js +0 -1
- package/dist/csharp-CYWRhZ2R.es.js +0 -6
- package/dist/csharp-TKds-MhG.cjs.js +0 -1
- package/dist/css-B0kbn78J.cjs.js +0 -1
- package/dist/css-D1aVdRIU.es.js +0 -6
- package/dist/csv-BVJjiaC3.cjs.js +0 -1
- package/dist/csv-DvCncUGQ.es.js +0 -6
- package/dist/cue-BXMrmvay.es.js +0 -6
- package/dist/cue-Cz4J-rnd.cjs.js +0 -1
- package/dist/cypher-DTm5zNR1.es.js +0 -6
- package/dist/cypher-DuKTiyez.cjs.js +0 -1
- package/dist/d-BW9Wd7aK.cjs.js +0 -1
- package/dist/d-D6ZXmn3l.es.js +0 -6
- package/dist/dark-plus-Cd5emcYO.cjs.js +0 -1
- package/dist/dark-plus-pUHDTVV0.es.js +0 -4
- package/dist/dart-CWs-er6b.cjs.js +0 -1
- package/dist/dart-Dz59Is3F.es.js +0 -6
- package/dist/dax-CDxFL2Kb.cjs.js +0 -1
- package/dist/dax-DTVGzydb.es.js +0 -6
- package/dist/desktop-CFgo0jo7.cjs.js +0 -1
- package/dist/desktop-Db9vb-dl.es.js +0 -6
- package/dist/diff-BsEkKwI8.cjs.js +0 -1
- package/dist/diff-XmNrvgM1.es.js +0 -6
- package/dist/docker-DWH2onkn.es.js +0 -6
- package/dist/docker-hwiw4W8I.cjs.js +0 -1
- package/dist/dotenv-4337wvzu.es.js +0 -6
- package/dist/dotenv-CJ5o3G1C.cjs.js +0 -1
- package/dist/dracula-BNgwAJ-d.cjs.js +0 -1
- package/dist/dracula-BtZx2Kac.es.js +0 -4
- package/dist/dracula-soft-BHZ7sHFu.cjs.js +0 -1
- package/dist/dracula-soft-BKa-aqBv.es.js +0 -4
- package/dist/dream-maker-CvvfrJSx.es.js +0 -6
- package/dist/dream-maker-DBharE9Q.cjs.js +0 -1
- package/dist/edge-DI6_BHKG.es.js +0 -12
- package/dist/edge-i77KJtJz.cjs.js +0 -1
- package/dist/elixir-D00NoPSM.cjs.js +0 -1
- package/dist/elixir-ic9y5jcd.es.js +0 -8
- package/dist/elm-Bhj5Vf-e.cjs.js +0 -1
- package/dist/elm-DxnUqUaW.es.js +0 -8
- package/dist/emacs-lisp-BAefI874.es.js +0 -6
- package/dist/emacs-lisp-CDDyFsvQ.cjs.js +0 -1
- package/dist/erb-Cbj2YePa.es.js +0 -10
- package/dist/erb-Dybaw01v.cjs.js +0 -1
- package/dist/erlang-3VgdrQXV.cjs.js +0 -1
- package/dist/erlang-CmIiwF3I.es.js +0 -6
- package/dist/everforest-dark-DMCBqXCK.es.js +0 -4
- package/dist/everforest-dark-_sBMomR1.cjs.js +0 -1
- package/dist/everforest-light-BbXl82Em.es.js +0 -4
- package/dist/everforest-light-H0xoYxl0.cjs.js +0 -1
- package/dist/fennel-BvcDRFAV.cjs.js +0 -1
- package/dist/fennel-DNqkz9pE.es.js +0 -6
- package/dist/fish-CnamI0Ar.cjs.js +0 -1
- package/dist/fish-DIm72t2T.es.js +0 -6
- package/dist/fluent-BapTxJsC.es.js +0 -6
- package/dist/fluent-DFpT66K8.cjs.js +0 -1
- package/dist/fortran-fixed-form-DECY15PY.es.js +0 -8
- package/dist/fortran-fixed-form-u_RcUPMu.cjs.js +0 -1
- package/dist/fortran-free-form-CNDsBFUj.es.js +0 -6
- package/dist/fortran-free-form-IaGrWIda.cjs.js +0 -1
- package/dist/fsharp-B-aK2rr3.cjs.js +0 -1
- package/dist/fsharp-D2ZqviWP.es.js +0 -8
- package/dist/gdresource-BBAqNWe4.cjs.js +0 -1
- package/dist/gdresource-RIsK8sku.es.js +0 -10
- package/dist/gdscript-5N_43TPQ.cjs.js +0 -1
- package/dist/gdscript-D7aheHm-.es.js +0 -6
- package/dist/gdshader-BGJEsM2Z.es.js +0 -6
- package/dist/gdshader-Bl85Hrm5.cjs.js +0 -1
- package/dist/genie-C9gPjc6J.es.js +0 -6
- package/dist/genie-DGsxMAbQ.cjs.js +0 -1
- package/dist/gherkin-CVV6nEUH.cjs.js +0 -1
- package/dist/gherkin-bka1Exbx.es.js +0 -6
- package/dist/git-commit-BRJ1E4Bx.es.js +0 -8
- package/dist/git-commit-CwfgI4fD.cjs.js +0 -1
- package/dist/git-rebase-C3X7aMpn.es.js +0 -8
- package/dist/git-rebase-DUvbIQDw.cjs.js +0 -1
- package/dist/github-dark-BKL9xNgN.cjs.js +0 -1
- package/dist/github-dark-DenFmJkN.es.js +0 -4
- package/dist/github-dark-default-BJPUVz4H.es.js +0 -4
- package/dist/github-dark-default-Dsv5MuSi.cjs.js +0 -1
- package/dist/github-dark-dimmed-CtB9hz8U.cjs.js +0 -1
- package/dist/github-dark-dimmed-DUshB20C.es.js +0 -4
- package/dist/github-dark-high-contrast-BqZVM-jF.cjs.js +0 -1
- package/dist/github-dark-high-contrast-D3aGCnF8.es.js +0 -4
- package/dist/github-light-BFTOhCbz.cjs.js +0 -1
- package/dist/github-light-JYsPkUQd.es.js +0 -4
- package/dist/github-light-default-BZoWH9dH.cjs.js +0 -1
- package/dist/github-light-default-D99KPAby.es.js +0 -4
- package/dist/github-light-high-contrast-BbmZE-Mp.es.js +0 -4
- package/dist/github-light-high-contrast-Ks3kPGJU.cjs.js +0 -1
- package/dist/gleam-B4k9YFGD.es.js +0 -6
- package/dist/gleam-nR4mjrhK.cjs.js +0 -1
- package/dist/glimmer-js-C4MQf3Na.es.js +0 -14
- package/dist/glimmer-js-CNfyUqSb.cjs.js +0 -1
- package/dist/glimmer-ts-Bp7_dELi.cjs.js +0 -1
- package/dist/glimmer-ts-CoYpqZrZ.es.js +0 -14
- package/dist/glsl-BYTq1Tfl.es.js +0 -8
- package/dist/glsl-CIu1PL9X.cjs.js +0 -1
- package/dist/gnuplot-CurtDYoJ.cjs.js +0 -1
- package/dist/gnuplot-DnWoRZt-.es.js +0 -6
- package/dist/go-BErP6iv1.es.js +0 -6
- package/dist/go-CM9_GlwL.cjs.js +0 -1
- package/dist/graphql-BnnSMMC2.cjs.js +0 -1
- package/dist/graphql-g3nHRc0M.es.js +0 -14
- package/dist/groovy-BaVp9Il5.cjs.js +0 -1
- package/dist/groovy-IWs5-NIO.es.js +0 -6
- package/dist/hack-BVxH3fsq.cjs.js +0 -1
- package/dist/hack-wPAsyujS.es.js +0 -10
- package/dist/haml-4TJ757dz.es.js +0 -10
- package/dist/haml-vutdexHh.cjs.js +0 -1
- package/dist/handlebars-7GDLw__F.es.js +0 -14
- package/dist/handlebars-COmZnO8P.cjs.js +0 -1
- package/dist/haskell-CtlGos0K.es.js +0 -6
- package/dist/haskell-suhyCHEm.cjs.js +0 -1
- package/dist/haxe-BIQU1qHi.cjs.js +0 -1
- package/dist/haxe-CZZ33vZw.es.js +0 -6
- package/dist/hcl-6hOg9WP4.es.js +0 -6
- package/dist/hcl-CbQ1yCnz.cjs.js +0 -1
- package/dist/hjson-CgwED-oz.es.js +0 -6
- package/dist/hjson-Ddklb4QM.cjs.js +0 -1
- package/dist/hlsl-3-lv4gi7.es.js +0 -6
- package/dist/hlsl-B4NkiBfC.cjs.js +0 -1
- package/dist/houston-BDYrDoDW.es.js +0 -4
- package/dist/houston-T57H3gQZ.cjs.js +0 -1
- package/dist/html-Dc-Bg17s.cjs.js +0 -1
- package/dist/html-PSPajZka.es.js +0 -10
- package/dist/html-derivative-Brb3b4aI.es.js +0 -8
- package/dist/html-derivative-CY9mJeT0.cjs.js +0 -1
- package/dist/http-BrKsebcH.cjs.js +0 -1
- package/dist/http-CWBcr-Ch.es.js +0 -14
- package/dist/hxml-DLduiIv3.es.js +0 -8
- package/dist/hxml-DbGPHkY4.cjs.js +0 -1
- package/dist/hy-C2xHhR6I.es.js +0 -6
- package/dist/hy-DpyTdO3T.cjs.js +0 -1
- package/dist/imba-BEYqRZzB.es.js +0 -8
- package/dist/imba-CAIkF-GD.cjs.js +0 -1
- package/dist/ini-BUcvsX-U.es.js +0 -6
- package/dist/ini-CymULaw_.cjs.js +0 -1
- package/dist/java-B7odJ7Ap.es.js +0 -6
- package/dist/java-Bn1Lvoni.cjs.js +0 -1
- package/dist/javascript-Bnnicc83.cjs.js +0 -1
- package/dist/javascript-fa8UlHZE.es.js +0 -6
- package/dist/jinja-BoeZymy4.cjs.js +0 -1
- package/dist/jinja-DKLHYjK0.es.js +0 -11
- package/dist/jison-C0DlFEjB.cjs.js +0 -1
- package/dist/jison-CzPfUIvM.es.js +0 -8
- package/dist/json-71t8ZF9g.es.js +0 -6
- package/dist/json-y-J1j5EW.cjs.js +0 -1
- package/dist/json5-CzvlWgZ7.cjs.js +0 -1
- package/dist/json5-Z7F6rA6a.es.js +0 -6
- package/dist/jsonc-BnhWfmQw.cjs.js +0 -1
- package/dist/jsonc-Dphhs4m2.es.js +0 -6
- package/dist/jsonl-BbGkWPJz.cjs.js +0 -1
- package/dist/jsonl-D9jj92Gg.es.js +0 -6
- package/dist/jsonnet-Bn--UDZ1.cjs.js +0 -1
- package/dist/jsonnet-DEQ7IUoJ.es.js +0 -6
- package/dist/jssm-4CSVp8lc.cjs.js +0 -1
- package/dist/jssm-j74e88UX.es.js +0 -6
- package/dist/jsx-Bkesy5tT.es.js +0 -6
- package/dist/jsx-D8YwVp-7.cjs.js +0 -1
- package/dist/julia-B_r6juN7.es.js +0 -16
- package/dist/julia-DLxGoAlk.cjs.js +0 -1
- package/dist/kanagawa-dragon-BJZF7xDr.cjs.js +0 -1
- package/dist/kanagawa-dragon-CiKur4Hl.es.js +0 -4
- package/dist/kanagawa-lotus-BKu-smKu.es.js +0 -4
- package/dist/kanagawa-lotus-BhgzmRV4.cjs.js +0 -1
- package/dist/kanagawa-wave-BgJip59C.cjs.js +0 -1
- package/dist/kanagawa-wave-CQwozSzG.es.js +0 -4
- package/dist/kotlin-DCgZY7Ii.es.js +0 -6
- package/dist/kotlin-DDI6myF6.cjs.js +0 -1
- package/dist/kusto-Cw029H-v.es.js +0 -6
- package/dist/kusto-OZxALJZT.cjs.js +0 -1
- package/dist/laserwave--izBLY1I.cjs.js +0 -1
- package/dist/laserwave-6a00oqik.es.js +0 -4
- package/dist/latex-CXOK56Uv.cjs.js +0 -1
- package/dist/latex-GxBxlqbc.es.js +0 -8
- package/dist/lean-CYSet4vs.es.js +0 -6
- package/dist/lean-D1iY-35j.cjs.js +0 -1
- package/dist/less-DIaY7vQJ.cjs.js +0 -1
- package/dist/less-DQA4v-Nm.es.js +0 -6
- package/dist/light-plus-B5D0le0o.cjs.js +0 -1
- package/dist/light-plus-CZuVqSLX.es.js +0 -4
- package/dist/liquid-BYouVITI.cjs.js +0 -1
- package/dist/liquid-BxBkR-z5.es.js +0 -14
- package/dist/log-BIXUeBaj.cjs.js +0 -1
- package/dist/log-D2eRfqDn.es.js +0 -6
- package/dist/logo-B2d3b27P.cjs.js +0 -1
- package/dist/logo-QEAtGWZ9.es.js +0 -6
- package/dist/lua-B2_GGnC5.cjs.js +0 -1
- package/dist/lua-DeXVjwzF.es.js +0 -8
- package/dist/luau-BjYGiqID.es.js +0 -6
- package/dist/luau-CvqAeq4F.cjs.js +0 -1
- package/dist/make-BjuHP00g.es.js +0 -6
- package/dist/make-Oob5Z9Pk.cjs.js +0 -1
- package/dist/markdown-B6guhLWd.es.js +0 -6
- package/dist/markdown-BGBuj4LZ.cjs.js +0 -1
- package/dist/marko-CS7eEGs3.cjs.js +0 -1
- package/dist/marko-DwPYPpB3.es.js +0 -14
- package/dist/material-theme-D6KBX41T.es.js +0 -4
- package/dist/material-theme-Dj0-OyRN.cjs.js +0 -1
- package/dist/material-theme-darker-CkRroheE.es.js +0 -4
- package/dist/material-theme-darker-Dvfs29ir.cjs.js +0 -1
- package/dist/material-theme-lighter-BUBw43Yz.es.js +0 -4
- package/dist/material-theme-lighter-EU3ZGl_r.cjs.js +0 -1
- package/dist/material-theme-ocean-ClGX14Ja.es.js +0 -4
- package/dist/material-theme-ocean-px_3Pwqa.cjs.js +0 -1
- package/dist/material-theme-palenight-38jxvsGX.cjs.js +0 -1
- package/dist/material-theme-palenight-C1RVm8K1.es.js +0 -4
- package/dist/matlab-BpQlIJiw.es.js +0 -6
- package/dist/matlab-CbN2rF6P.cjs.js +0 -1
- package/dist/mdc-Bkl-bu_Z.cjs.js +0 -1
- package/dist/mdc-X4YjkufV.es.js +0 -12
- package/dist/mdx-Cl31h8mi.cjs.js +0 -1
- package/dist/mdx-DIoECIFU.es.js +0 -6
- package/dist/mermaid-BZ7WHNIe.es.js +0 -6
- package/dist/mermaid-CSogK_LM.cjs.js +0 -1
- package/dist/min-dark-C7ak0t6c.es.js +0 -4
- package/dist/min-dark-tt5o_I5e.cjs.js +0 -1
- package/dist/min-light-CKFxVcPp.es.js +0 -4
- package/dist/min-light-tmTHl_CQ.cjs.js +0 -1
- package/dist/mipsasm-BseoYJQp.cjs.js +0 -1
- package/dist/mipsasm-DusDYkFc.es.js +0 -6
- package/dist/mojo-CY9jaezJ.es.js +0 -6
- package/dist/mojo-D8QAG3Ze.cjs.js +0 -1
- package/dist/monokai-C1KBYcO0.es.js +0 -4
- package/dist/monokai-DMIxv6MM.cjs.js +0 -1
- package/dist/move-ChphFumd.es.js +0 -6
- package/dist/move-DaBrcjat.cjs.js +0 -1
- package/dist/narrat-Dz4d7OmN.es.js +0 -6
- package/dist/narrat-oOfAO4q8.cjs.js +0 -1
- package/dist/nextflow-BxJSKvPb.cjs.js +0 -1
- package/dist/nextflow-DW0Yq9a2.es.js +0 -6
- package/dist/nginx-ChI-VqNT.es.js +0 -8
- package/dist/nginx-LuyFICzP.cjs.js +0 -1
- package/dist/night-owl-BN78kThQ.cjs.js +0 -1
- package/dist/night-owl-Bm2rzalh.es.js +0 -4
- package/dist/nim-BiJA-5u7.es.js +0 -20
- package/dist/nim-DkC83hsN.cjs.js +0 -1
- package/dist/nix-Cg5uV_xg.es.js +0 -6
- package/dist/nix-DNME0Ea7.cjs.js +0 -1
- package/dist/nord-CC5OiUXg.es.js +0 -4
- package/dist/nord-Ca5AGUWc.cjs.js +0 -1
- package/dist/nushell-BfRnzRWn.es.js +0 -6
- package/dist/nushell-DI9Z3l3M.cjs.js +0 -1
- package/dist/objective-c-BGg9R27G.es.js +0 -6
- package/dist/objective-c-DVx8Rcni.cjs.js +0 -1
- package/dist/objective-cpp-CJ3y3V_5.es.js +0 -6
- package/dist/objective-cpp-s6XI7Jvk.cjs.js +0 -1
- package/dist/ocaml-BZLsfx_o.es.js +0 -6
- package/dist/ocaml-kUzDDUf2.cjs.js +0 -1
- package/dist/one-dark-pro-D7-kP8fv.es.js +0 -4
- package/dist/one-dark-pro-JOzzHStv.cjs.js +0 -1
- package/dist/one-light-020-h_lv.cjs.js +0 -1
- package/dist/one-light-D9sNaUtq.es.js +0 -4
- package/dist/pascal-D509_I72.cjs.js +0 -1
- package/dist/pascal-l2bqd7Dz.es.js +0 -6
- package/dist/perl-CkXYjL3t.es.js +0 -16
- package/dist/perl-DUnCLRB_.cjs.js +0 -1
- package/dist/php-D0k1sQr6.cjs.js +0 -1
- package/dist/php-q40Yjh5d.es.js +0 -18
- package/dist/plastic-CSTz3KZp.es.js +0 -4
- package/dist/plastic-r5piqq-S.cjs.js +0 -1
- package/dist/plsql-C_qH_YOK.cjs.js +0 -1
- package/dist/plsql-oVq_K_wH.es.js +0 -6
- package/dist/po-5jaeIyVd.es.js +0 -6
- package/dist/po-CBsLQIcu.cjs.js +0 -1
- package/dist/poimandres-BLP3NNjc.cjs.js +0 -1
- package/dist/poimandres-C-VADXHD.es.js +0 -4
- package/dist/polar-De-CDeYv.cjs.js +0 -1
- package/dist/polar-wcLp8ci7.es.js +0 -6
- package/dist/postcss-BZ3MNRIJ.es.js +0 -6
- package/dist/postcss-BtcsgaYj.cjs.js +0 -1
- package/dist/powerquery-B0rHn13V.cjs.js +0 -1
- package/dist/powerquery-CgRa2XRw.es.js +0 -6
- package/dist/powershell-Diwyv8Eh.es.js +0 -6
- package/dist/powershell-rCX2OYXT.cjs.js +0 -1
- package/dist/prisma-BaaUHYMp.cjs.js +0 -1
- package/dist/prisma-COL_v1x4.es.js +0 -6
- package/dist/prolog-CuvJOxqT.es.js +0 -6
- package/dist/prolog-DrXD2tGS.cjs.js +0 -1
- package/dist/proto-BtmQjBQu.cjs.js +0 -1
- package/dist/proto-o9HLmF90.es.js +0 -6
- package/dist/pug-Br4hpvIv.es.js +0 -12
- package/dist/pug-CFQMpTUe.cjs.js +0 -1
- package/dist/puppet-cIrXIuy8.cjs.js +0 -1
- package/dist/puppet-wpGOnQp5.es.js +0 -6
- package/dist/purescript-B_1NgE2N.es.js +0 -6
- package/dist/purescript-CX9QPs2N.cjs.js +0 -1
- package/dist/python-B9x3euv6.cjs.js +0 -1
- package/dist/python-xYxLFJY-.es.js +0 -6
- package/dist/qml-CzqrIM5W.cjs.js +0 -1
- package/dist/qml-D5gi21kK.es.js +0 -8
- package/dist/qmldir-BInDYbpo.es.js +0 -6
- package/dist/qmldir-DNF9H2ir.cjs.js +0 -1
- package/dist/qss-C744dLby.cjs.js +0 -1
- package/dist/qss-D-h4NdUG.es.js +0 -6
- package/dist/r-DgOc9oMe.cjs.js +0 -1
- package/dist/r-F-9I-ITZ.es.js +0 -6
- package/dist/racket-BoD1TBFT.es.js +0 -6
- package/dist/racket-Do9_vqnd.cjs.js +0 -1
- package/dist/raku-BW8wAUIz.cjs.js +0 -1
- package/dist/raku-IaYcw19m.es.js +0 -6
- package/dist/razor-Bt_t1YJb.es.js +0 -10
- package/dist/razor-COQhlwWF.cjs.js +0 -1
- package/dist/red-7y8PH7HH.es.js +0 -4
- package/dist/red-BQGOv1D5.cjs.js +0 -1
- package/dist/reg-CGWN_v-z.cjs.js +0 -1
- package/dist/reg-CMUdAgIP.es.js +0 -6
- package/dist/regexp-GiFkbxS-.es.js +0 -6
- package/dist/regexp-N7Z4hEeU.cjs.js +0 -1
- package/dist/rel-BYqA7mnV.cjs.js +0 -1
- package/dist/rel-BaRn3QX7.es.js +0 -6
- package/dist/riscv-B9V3SsvW.es.js +0 -6
- package/dist/riscv-ayQMUpo9.cjs.js +0 -1
- package/dist/rose-pine-DKEdv1Oe.cjs.js +0 -1
- package/dist/rose-pine-DhT-HZE9.es.js +0 -4
- package/dist/rose-pine-dawn-Bvt6DtVH.cjs.js +0 -1
- package/dist/rose-pine-dawn-DiCjL2i4.es.js +0 -4
- package/dist/rose-pine-moon-BNmGHlcn.es.js +0 -4
- package/dist/rose-pine-moon-cHuJy0Ng.cjs.js +0 -1
- package/dist/rst-BmKw97ch.es.js +0 -22
- package/dist/rst-Bq-h_T5U.cjs.js +0 -1
- package/dist/ruby-Bw5IEIKD.cjs.js +0 -1
- package/dist/ruby-cs7BSa_9.es.js +0 -30
- package/dist/rust-BnFKGEfa.cjs.js +0 -1
- package/dist/rust-Pc7DCsZD.es.js +0 -6
- package/dist/sas-BWKaSYkZ.cjs.js +0 -1
- package/dist/sas-DgvHx4mL.es.js +0 -8
- package/dist/sass-B9gYryDE.cjs.js +0 -1
- package/dist/sass-iCyS6eP9.es.js +0 -6
- package/dist/scala-C85dOwSU.cjs.js +0 -1
- package/dist/scala-Cly-fENF.es.js +0 -6
- package/dist/scheme-B_XUaARm.cjs.js +0 -1
- package/dist/scheme-Zi24oEYu.es.js +0 -6
- package/dist/scss-B_hSZppj.es.js +0 -8
- package/dist/scss-CV3c8_Y7.cjs.js +0 -1
- package/dist/sdbl-7Y5u0OW0.cjs.js +0 -1
- package/dist/sdbl-BBamrXFL.es.js +0 -6
- package/dist/shaderlab-CJ8U2E2w.cjs.js +0 -1
- package/dist/shaderlab-U9mqcu_f.es.js +0 -8
- package/dist/shellscript-3DYM9fut.cjs.js +0 -1
- package/dist/shellscript-Dn0-btNd.es.js +0 -6
- package/dist/shellsession-CbKmorC3.cjs.js +0 -1
- package/dist/shellsession-LvXGClmj.es.js +0 -8
- package/dist/slack-dark-akqwQ7ED.cjs.js +0 -1
- package/dist/slack-dark-i7wN4OET.es.js +0 -4
- package/dist/slack-ochin-BoQQWmTv.cjs.js +0 -1
- package/dist/slack-ochin-ndHf0LoP.es.js +0 -4
- package/dist/smalltalk-CCvytUuW.cjs.js +0 -1
- package/dist/smalltalk-Cns31tKw.es.js +0 -6
- package/dist/snazzy-light-BlSJXAu4.es.js +0 -4
- package/dist/snazzy-light-D_IwRieF.cjs.js +0 -1
- package/dist/solarized-dark-UTmkh7lw.es.js +0 -4
- package/dist/solarized-dark-gmm-WbDC.cjs.js +0 -1
- package/dist/solarized-light-BheCkDPT.es.js +0 -4
- package/dist/solarized-light-DzcxRSZP.cjs.js +0 -1
- package/dist/solidity-BG_k8fA_.es.js +0 -6
- package/dist/solidity-BcNcjFC4.cjs.js +0 -1
- package/dist/soy-B2d9ZydM.cjs.js +0 -1
- package/dist/soy-C0yEn39K.es.js +0 -8
- package/dist/sparql-CiBxIK0g.cjs.js +0 -1
- package/dist/sparql-CuZaxpno.es.js +0 -8
- package/dist/splunk-CTqDjQdo.es.js +0 -6
- package/dist/splunk-CzITjJj7.cjs.js +0 -1
- package/dist/sql-BqWZrLHB.cjs.js +0 -1
- package/dist/sql-DCkt643-.es.js +0 -6
- package/dist/ssh-config-DHHGll-v.es.js +0 -6
- package/dist/ssh-config-DUPeuEdB.cjs.js +0 -1
- package/dist/stata-B8m3qL-x.cjs.js +0 -1
- package/dist/stata-Dv81f34z.es.js +0 -8
- package/dist/stylus-ByHs6N-o.cjs.js +0 -1
- package/dist/stylus-n_9f0QQ5.es.js +0 -6
- package/dist/svelte-CfLoBBrI.cjs.js +0 -1
- package/dist/svelte-SoJd35Jr.es.js +0 -14
- package/dist/swift-BAWqNR8A.es.js +0 -6
- package/dist/swift-C5DnOriA.cjs.js +0 -1
- package/dist/synthwave-84-BBRLOmNT.cjs.js +0 -1
- package/dist/synthwave-84-NU3C_KFZ.es.js +0 -4
- package/dist/system-verilog-ClPLYLwh.cjs.js +0 -1
- package/dist/system-verilog-Cui-g-ut.es.js +0 -6
- package/dist/systemd-BASX0DlX.cjs.js +0 -1
- package/dist/systemd-CsKYQIQK.es.js +0 -6
- package/dist/talonscript-D2dGh8FO.es.js +0 -6
- package/dist/talonscript-DkCSnLHD.cjs.js +0 -1
- package/dist/tasl-BAQJK7KZ.cjs.js +0 -1
- package/dist/tasl-D3W8HMV6.es.js +0 -6
- package/dist/tcl-2y0Fuc4S.es.js +0 -6
- package/dist/tcl-CwJAYTvh.cjs.js +0 -1
- package/dist/templ-BSMv2wKZ.cjs.js +0 -1
- package/dist/templ-C7he2afp.es.js +0 -12
- package/dist/terraform-BGW6Oerf.es.js +0 -6
- package/dist/terraform-s-pzyVvp.cjs.js +0 -1
- package/dist/tex-B0y3cEZp.es.js +0 -8
- package/dist/tex-DwtFCA08.cjs.js +0 -1
- package/dist/tokyo-night-9T7_vGSy.cjs.js +0 -1
- package/dist/tokyo-night-LhP3hHhi.es.js +0 -4
- package/dist/toml-CQSfOn0e.es.js +0 -6
- package/dist/toml-CyMM7IXy.cjs.js +0 -1
- package/dist/ts-tags-C5-4VQhf.es.js +0 -41
- package/dist/ts-tags-MIr66hKK.cjs.js +0 -1
- package/dist/tsv-BtvSkaG0.es.js +0 -6
- package/dist/tsv-DqNGnuVj.cjs.js +0 -1
- package/dist/tsx-DiGsgWT8.es.js +0 -6
- package/dist/tsx-DpBRUnKC.cjs.js +0 -1
- package/dist/turtle-BJ2wmjPc.es.js +0 -6
- package/dist/turtle-DfO3eAsu.cjs.js +0 -1
- package/dist/twig-BzjoX4ZJ.cjs.js +0 -1
- package/dist/twig-OmkATFdv.es.js +0 -18
- package/dist/typescript-BqvpT6pB.cjs.js +0 -1
- package/dist/typescript-buWNZFwO.es.js +0 -6
- package/dist/typespec-P-ZVy8yC.cjs.js +0 -1
- package/dist/typespec-bLbdsxJL.es.js +0 -6
- package/dist/typst-BVh2IsT9.cjs.js +0 -1
- package/dist/typst-Y9_SmXTs.es.js +0 -6
- package/dist/v-BUlE9136.cjs.js +0 -1
- package/dist/v-wa8Orrdd.es.js +0 -6
- package/dist/vala-BIymb2K_.cjs.js +0 -1
- package/dist/vala-DRdriFr_.es.js +0 -6
- package/dist/vb-E2_-jk4M.es.js +0 -6
- package/dist/vb-IXOh8mqV.cjs.js +0 -1
- package/dist/verilog-B1iBoR5_.es.js +0 -6
- package/dist/verilog-BiglCqvO.cjs.js +0 -1
- package/dist/vesper-CJsaOsSM.es.js +0 -4
- package/dist/vesper-DqLWLxOu.cjs.js +0 -1
- package/dist/vhdl-CJUzuS2t.cjs.js +0 -1
- package/dist/vhdl-CRVaAhXk.es.js +0 -6
- package/dist/viml-B-zWOd7Z.es.js +0 -6
- package/dist/viml-B1nKLcgt.cjs.js +0 -1
- package/dist/vitesse-black-BoGvW84i.es.js +0 -4
- package/dist/vitesse-black-MF-1S1MG.cjs.js +0 -1
- package/dist/vitesse-dark-Cym-eLtO.es.js +0 -4
- package/dist/vitesse-dark-SIffJYSe.cjs.js +0 -1
- package/dist/vitesse-light-CcmG315c.es.js +0 -4
- package/dist/vitesse-light-U63SkYGT.cjs.js +0 -1
- package/dist/vue-DCwwWMGI.es.js +0 -31
- package/dist/vue-DYZqcRaZ.cjs.js +0 -1
- package/dist/vue-html-CdPbyrq1.cjs.js +0 -1
- package/dist/vue-html-sRE_Ny23.es.js +0 -10
- package/dist/vyper-CO9xUkIY.cjs.js +0 -1
- package/dist/vyper-DWutKXpa.es.js +0 -6
- package/dist/wasm-Bv5f0gKv.es.js +0 -6
- package/dist/wasm-CdIThIat.cjs.js +0 -1
- package/dist/wenyan-BMYnfus1.es.js +0 -6
- package/dist/wenyan-BSJ3fk7e.cjs.js +0 -1
- package/dist/wgsl-DnPoPGDU.es.js +0 -6
- package/dist/wgsl-d3zZE7ZN.cjs.js +0 -1
- package/dist/wikitext-BRCqXN2g.cjs.js +0 -1
- package/dist/wikitext-CntM04PE.es.js +0 -6
- package/dist/wolfram-C3rR92zj.cjs.js +0 -1
- package/dist/wolfram-Ws5qPlX9.es.js +0 -6
- package/dist/xml-BRLTD55J.cjs.js +0 -1
- package/dist/xml-Ch1q_kJp.es.js +0 -8
- package/dist/xsl-DyL8yqXw.es.js +0 -8
- package/dist/xsl-ETbYGV_-.cjs.js +0 -1
- package/dist/yaml-7DV6pRKj.cjs.js +0 -1
- package/dist/yaml-Bbg74JKr.es.js +0 -6
- package/dist/zenscript-BWMxwjeH.cjs.js +0 -1
- package/dist/zenscript-C0RKE4nU.es.js +0 -6
- package/dist/zig-D6SXBGNm.es.js +0 -6
- 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
|
+
}
|