@marimo-team/islands 0.23.9-dev3 → 0.23.9-dev5
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/dist/{ConnectedDataExplorerComponent-2lBNiUv6.js → ConnectedDataExplorerComponent-OzrfMM5L.js} +20 -20
- package/dist/ErrorBoundary-rULOrC_p.js +175 -0
- package/dist/{ImageComparisonComponent-CNHIsPDj.js → ImageComparisonComponent-CHrI72em.js} +1 -1
- package/dist/{Plot-4wn-lMVn.js → Plot-CAYS29h9.js} +1 -1
- package/dist/{_baseUniq-CxZRxRRo.js → _baseUniq-B_2Hw7zG.js} +3 -3
- package/dist/{any-language-editor-VWs_7v27.js → any-language-editor-DfdpyDv_.js} +23 -23
- package/dist/architecture-7HQA4BMR-Kyc44TmC.js +6 -0
- package/dist/{architectureDiagram-VXUJARFQ-CXVJxFhH.js → architectureDiagram-VXUJARFQ-CT2SuxNw.js} +15 -15
- package/dist/{arrays-CldYf7p7.js → arrays-sEtDRoG4.js} +1 -1
- package/dist/{blockDiagram-VD42YOAC-DGDaxR8I.js → blockDiagram-VD42YOAC-Dy7hlFla.js} +7 -7
- package/dist/{button-Dj4BTre0.js → button-C5K9fIPF.js} +2 -2
- package/dist/{c4Diagram-YG6GDRKO-C2hc6ne8.js → c4Diagram-YG6GDRKO-BXlAmZ8Z.js} +4 -4
- package/dist/{capabilities-C9rrYCzf.js → capabilities-BceAxrAW.js} +2 -2
- package/dist/{channel-BBoIVUrJ.js → channel-D_PHgcig.js} +1 -1
- package/dist/{chat-ui-D3XBept8.js → chat-ui-BDI3FMI8.js} +29 -29
- package/dist/{check-BcUIXnUT.js → check-DTbrK0zt.js} +1 -1
- package/dist/{chunk-4F5CHEZ2-BZq7Kom7.js → chunk-4F5CHEZ2-D9nGEHV8.js} +1 -1
- package/dist/{chunk-5FQGJX7Z-BOg95xG5.js → chunk-5FQGJX7Z-BNjes6Yx.js} +5 -5
- package/dist/{chunk-ABZYJK2D-D0cLy8Bb.js → chunk-ABZYJK2D-Dz0-H2B5.js} +1 -1
- package/dist/{chunk-ATLVNIR6-BXsEjlHF.js → chunk-ATLVNIR6-o0Z5MZLd.js} +1 -1
- package/dist/{chunk-B2363JML-D9-XOau1.js → chunk-B2363JML-KEJpLGGP.js} +1 -1
- package/dist/{chunk-B4BG7PRW-Q1usn6T3.js → chunk-B4BG7PRW-BL98U9B4.js} +4 -4
- package/dist/{chunk-DI55MBZ5-D1qLYNrb.js → chunk-DI55MBZ5-Dwkn0LWm.js} +4 -4
- package/dist/{chunk-EXTU4WIE-BKNXdLmD.js → chunk-EXTU4WIE-9sNjmQrB.js} +1 -1
- package/dist/{chunk-FRFDVMJY-BSBUAX7r.js → chunk-FRFDVMJY-DzQqMWrl.js} +1 -1
- package/dist/{chunk-JA3XYJ7Z-D6c6cOBG.js → chunk-JA3XYJ7Z-C32Y7Epf.js} +2 -2
- package/dist/{chunk-JZLCHNYA-BvsPHJmL.js → chunk-JZLCHNYA-C6ftyVMN.js} +4 -4
- package/dist/{chunk-N4CR4FBY-8ycT-O9a.js → chunk-N4CR4FBY-DUhGZhZs.js} +5 -5
- package/dist/{chunk-PL6DKKU2-B0MTXvyc.js → chunk-PL6DKKU2-D7km-08O.js} +1 -1
- package/dist/{chunk-QN33PNHL-Bb-eUBW3.js → chunk-QN33PNHL-0K6SDYn3.js} +1 -1
- package/dist/{chunk-QXUST7PY-DV8yRwBd.js → chunk-QXUST7PY-DMhsRpYK.js} +5 -5
- package/dist/{chunk-S3R3BYOJ-mQeCz5CE.js → chunk-S3R3BYOJ-oAe3dEbO.js} +3 -3
- package/dist/{chunk-SJTYNZTY-CEG4F0pB.js → chunk-SJTYNZTY-BkJrPRFC.js} +1 -1
- package/dist/{chunk-TCCFYFTB-d3HOqL2I.js → chunk-TCCFYFTB-D58KeXnC.js} +6 -6
- package/dist/{chunk-TQ3KTPDO-DiCtqVSi.js → chunk-TQ3KTPDO-D_yA_wAb.js} +1 -1
- package/dist/{chunk-TZMSLE5B-BqW10dHe.js → chunk-TZMSLE5B-yBKS_DQU.js} +1 -1
- package/dist/{chunk-UMXZTB3W-97iS1iEl.js → chunk-UMXZTB3W-D7uwvNjd.js} +1 -1
- package/dist/{classDiagram-2ON5EDUG--Yh__LHb.js → classDiagram-2ON5EDUG-QjoAcuFE.js} +10 -10
- package/dist/{classDiagram-v2-WZHVMYZB-BC7X7Xtc.js → classDiagram-v2-WZHVMYZB-bUCv4gu2.js} +10 -10
- package/dist/{clone-BuIIsfA8.js → clone-Q4Fqwn6q.js} +1 -1
- package/dist/{code-block-37QAKDTI-BsGy1AOJ.js → code-block-37QAKDTI-m92Yc8pv.js} +2 -2
- package/dist/{code-visibility-BKxrBMod.js → code-visibility-DY2PjKMU.js} +7200 -7488
- package/dist/{constants-D0gkYoE2.js → constants-T20xxyNf.js} +2 -2
- package/dist/{copy-DLf4aN7I.js → copy-BuQpJEzp.js} +2 -2
- package/dist/{dagre-6UL2VRFP-DRBWoQUw.js → dagre-6UL2VRFP-J0JKgwOt.js} +11 -11
- package/dist/{dagre-VYEPqXIV.js → dagre-By_QsQgc.js} +11 -11
- package/dist/{data-grid-overlay-editor-efe5ZagF.js → data-grid-overlay-editor-mfEJ5475.js} +2 -2
- package/dist/{diagram-PSM6KHXK-H66ATWP2.js → diagram-PSM6KHXK-DYgJuNk9.js} +18 -18
- package/dist/{diagram-QEK2KX5R-DItl5Wns.js → diagram-QEK2KX5R-CKdBR2sb.js} +14 -14
- package/dist/{diagram-S2PKOQOG-CtuW_ZuL.js → diagram-S2PKOQOG-Dpi7mo5W.js} +14 -14
- package/dist/dist-0Fif7jnk.js +5 -0
- package/dist/{dist-Dh3wkoyH.js → dist-4j4c7bjm.js} +2 -2
- package/dist/{dist-CDFZi-QD.js → dist-B3P2fFpz.js} +1 -1
- package/dist/{dist-BNyrZfqT.js → dist-B3pZ0Ab6.js} +2 -2
- package/dist/dist-B5h_9sHB.js +6 -0
- package/dist/dist-B9M6R5ye.js +5 -0
- package/dist/dist-BCt3tnck.js +8 -0
- package/dist/{dist-BrBucRXs.js → dist-BTfv03uy.js} +2 -2
- package/dist/dist-BUIJwMwn.js +8 -0
- package/dist/{dist-CYEylvZA.js → dist-BbbIBDiQ.js} +1 -1
- package/dist/{dist-KnujRhFL.js → dist-BcuoonNH.js} +4 -4
- package/dist/{dist-DJ6zJQZ4.js → dist-Bde4a2kU.js} +2 -2
- package/dist/{dist-t_qL7eB8.js → dist-Bfwsv11D.js} +2 -2
- package/dist/{dist-CNtV21T_.js → dist-BhM8gdSO.js} +4 -4
- package/dist/{dist-nuW5EDYT.js → dist-BotSqB48.js} +2 -2
- package/dist/dist-BpquMd3k.js +5 -0
- package/dist/dist-BzJsqYfz.js +5 -0
- package/dist/{dist-D029TiHd.js → dist-Bz_sYWbr.js} +2 -2
- package/dist/{dist-D3ZI9nhS.js → dist-C1BYNeCR.js} +4 -4
- package/dist/{dist-Bc5pmZIw.js → dist-C5VC_yzu.js} +1 -1
- package/dist/dist-CA5ELXAf.js +6 -0
- package/dist/dist-CLBRs6Uv.js +5 -0
- package/dist/{dist-Dhk6FMb0.js → dist-CLJWPTX2.js} +3 -3
- package/dist/{dist-C34oIrQ9.js → dist-CLUtPrdy.js} +1 -1
- package/dist/dist-CStVCMbq.js +5 -0
- package/dist/{dist-B8RaFTRF.js → dist-CUCNs1ja.js} +2 -2
- package/dist/dist-CZRIEY3Y.js +8 -0
- package/dist/{dist-UcOPnRMa.js → dist-CcXxepx6.js} +3 -3
- package/dist/dist-CuUHbFD0.js +5 -0
- package/dist/{dist-B8BjrFUE.js → dist-Cy1WxgBD.js} +5 -5
- package/dist/{dist-WdPUFc56.js → dist-D4CewLk6.js} +1 -1
- package/dist/{dist-DMZNjfX4.js → dist-DRfcqpxJ.js} +2 -2
- package/dist/dist-DV7Iabxb.js +8 -0
- package/dist/{dist-usPCDYx8.js → dist-D_bzzWBm.js} +1 -1
- package/dist/{dist-BvCfQQQE.js → dist-DgnE8F-r.js} +1 -1
- package/dist/{dist-JEhxD_cn.js → dist-DhHh0jLg.js} +1 -1
- package/dist/{dist-DGAfI2rB.js → dist-DqAWR3CS.js} +2 -2
- package/dist/{dist--sWVZwjW.js → dist-Du8WkPuU.js} +1 -1
- package/dist/dist-DuEeHMvL.js +5 -0
- package/dist/{dist-BTyJtnNg.js → dist-DxvORzUR.js} +1 -1
- package/dist/{dist-B507mf_I.js → dist-RqXTaiir.js} +2 -2
- package/dist/{dist-Yrfc6L0I.js → dist-fQ0ViXGs.js} +3 -3
- package/dist/{dist-B4LJpMEg.js → dist-h2c8sZvT.js} +1 -1
- package/dist/{dist-C2ej4eOH.js → dist-luvabDEB.js} +2 -2
- package/dist/{dist-B52GXZbd.js → dist-p2qyWijU.js} +2 -2
- package/dist/{erDiagram-Q2GNP2WA--19X2kU5.js → erDiagram-Q2GNP2WA-BU-m41EQ.js} +10 -10
- package/dist/{error-banner-CVkfBUT3.js → error-banner-5bz0L9hS.js} +3 -3
- package/dist/{esm-CWp0KQeK.js → esm-BfhQmZjp.js} +4 -4
- package/dist/{esm-DjNnlmpf.js → esm-Duie8iU-.js} +23 -23
- package/dist/{extends-vAi97cpa.js → extends-BgdxCfYu.js} +6 -6
- package/dist/{flatten-CzBvFdvC.js → flatten-Bbw7g6-K.js} +1 -1
- package/dist/{flowDiagram-NV44I4VS-DQmWlo7f.js → flowDiagram-NV44I4VS-CRoXKjGq.js} +10 -10
- package/dist/{formats-Dsy9kkZu.js → formats-DQ5qjo_Q.js} +4 -4
- package/dist/{ganttDiagram-JELNMOA3-BOGXJ8Lk.js → ganttDiagram-JELNMOA3-7mq5f9cO.js} +7 -7
- package/dist/{gitGraph-G5XIXVHT-DGlbae5m.js → gitGraph-G5XIXVHT-DiniR35k.js} +3 -3
- package/dist/{gitGraphDiagram-V2S2FVAM-DjzxfF0P.js → gitGraphDiagram-V2S2FVAM-Dfuokq6w.js} +13 -13
- package/dist/{glide-data-editor-DucgdjRo.js → glide-data-editor-DqRY9naW.js} +557 -557
- package/dist/{graphlib-CVPKjKCS.js → graphlib-Ns7y5crs.js} +5 -5
- package/dist/{hasIn-COs6vImh.js → hasIn-Deg7jl_j.js} +3 -3
- package/dist/{html-to-image-CpggM7u1.js → html-to-image-CiSinpSR.js} +109 -109
- package/dist/{info-VBDWY6EO-D2lvLLw5.js → info-VBDWY6EO-DVZvGhkQ.js} +3 -3
- package/dist/{infoDiagram-HS3SLOUP-ChNufFsP.js → infoDiagram-HS3SLOUP-CEnzWruK.js} +13 -13
- package/dist/{input-D4kjoQUB.js → input-CZD2z6X2.js} +70 -67
- package/dist/{isEmpty-Dd8mx_WL.js → isEmpty-CJJMn-QP.js} +1 -1
- package/dist/{isSymbol-BvIfMnn6.js → isSymbol-CoUCgMCM.js} +1 -1
- package/dist/{journeyDiagram-XKPGCS4Q-BO_O4Ij1.js → journeyDiagram-XKPGCS4Q-8XYSU1GI.js} +3 -3
- package/dist/{kanban-definition-3W4ZIXB7-CPpiiiWk.js → kanban-definition-3W4ZIXB7--9pT9z1R.js} +7 -7
- package/dist/{label-BLqV33b1.js → label-LWtdw5i8.js} +3 -3
- package/dist/{linear-2NnK4cxi.js → linear-B5-AFRiR.js} +2 -2
- package/dist/{loader-Dr8Qem8p.js → loader-BWLPpjKK.js} +2 -2
- package/dist/main.js +1145 -989
- package/dist/{memoize-C9ltv0Cw.js → memoize-BOtf2yFf.js} +1 -1
- package/dist/{merge-CHn7Yx0N.js → merge-Be1CqGnU.js} +1 -1
- package/dist/mermaid-4DMBBIKO-DIdL224_.js +6 -0
- package/dist/{mermaid-DO-Daq7u.js → mermaid-IU93XzmY.js} +44 -44
- package/dist/{mermaid-parser.core-DreccfmS.js → mermaid-parser.core-C3XRsazI.js} +8 -8
- package/dist/{min-BNz2lZfk.js → min-Dtgc8txR.js} +4 -4
- package/dist/{mindmap-definition-VGOIOE7T-CC1_Vl0f.js → mindmap-definition-VGOIOE7T-B-4mnfFG.js} +9 -9
- package/dist/{now-Sgq5m3D-.js → now-Ch98bJO_.js} +2 -2
- package/dist/{number-overlay-editor-CpKi64Fy.js → number-overlay-editor-D-a0qCT8.js} +1 -1
- package/dist/{once-rJImu7SE.js → once-DPuqGUeo.js} +1 -1
- package/dist/{packet-DYOGHKS2-CmWtF3uO.js → packet-DYOGHKS2-34raHOiB.js} +3 -3
- package/dist/{pick-CRAXxDYn.js → pick-D1Qo8s2C.js} +4 -4
- package/dist/{pie-VRWISCQL-B6u8vus8.js → pie-VRWISCQL-BaLlzZa3.js} +3 -3
- package/dist/{pieDiagram-ADFJNKIX-Di34MOFQ.js → pieDiagram-ADFJNKIX-Cr3cNpZY.js} +15 -15
- package/dist/{precisionRound-CnHPY_5v.js → precisionRound-Tqb4mg-H.js} +1 -1
- package/dist/{process-output-X8TR20AK.js → process-output-5qJjMRKh.js} +4 -4
- package/dist/{quadrantDiagram-AYHSOK5B-B9kVk1ny.js → quadrantDiagram-AYHSOK5B-BuNL8Q93.js} +4 -4
- package/dist/{radar-ZZBFDIW7-XAmXSa8s.js → radar-ZZBFDIW7-Ci7bfoZa.js} +3 -3
- package/dist/{react-vega-Dh6-UKKe.js → react-vega-B0sAlDTL.js} +9 -9
- package/dist/react-vega-B6ncY2Tp.js +9 -0
- package/dist/{requirementDiagram-UZGBJVZJ-BxGfGYEx.js → requirementDiagram-UZGBJVZJ-BG2lLUN1.js} +9 -9
- package/dist/{reveal-component-BMyi2UMr.js → reveal-component-Bq1iwOTq.js} +28 -28
- package/dist/{sankeyDiagram-TZEHDZUN-D09PBJ-n.js → sankeyDiagram-TZEHDZUN-DMal8sps.js} +3 -3
- package/dist/{sequenceDiagram-WL72ISMW-t_Dpemj0.js → sequenceDiagram-WL72ISMW-DT6Tk-Eo.js} +4 -4
- package/dist/{spec-hVaaZsY5.js → spec-a6DaqW__.js} +4 -4
- package/dist/{stateDiagram-FKZM4ZOC-B18gTP_j.js → stateDiagram-FKZM4ZOC-CB_lodq3.js} +12 -12
- package/dist/{stateDiagram-v2-4FDKWEC3-B6e_t14A.js → stateDiagram-v2-4FDKWEC3-E0RGjKsm.js} +10 -10
- package/dist/stex-KfRnSHzF.js +4 -0
- package/dist/{strings-BiIhGaI8.js → strings-Bu3vlb6W.js} +7 -7
- package/dist/style.css +1 -1
- package/dist/{swiper-component-DlD2GU2g.js → swiper-component-B2t5sN1q.js} +3 -3
- package/dist/{time-C1SGcFMH.js → time-CsmIF9YZ.js} +3 -3
- package/dist/{timeline-definition-IT6M3QCI-DJnh1ks5.js → timeline-definition-IT6M3QCI-NfSKRvH0.js} +2 -2
- package/dist/{toDate-CIpC_34u.js → toDate-ZVVIBmdk.js} +5 -5
- package/dist/{tooltip-DRaMBu06.js → tooltip-C5FYOpQc.js} +4 -4
- package/dist/{treemap-GDKQZRPO-Du95DV6u.js → treemap-GDKQZRPO-Cl6OQh8D.js} +3 -3
- package/dist/{types-Dzuoc3LN.js → types-CVvp1fKr.js} +2 -9
- package/dist/{useAsyncData-C56Khv_R.js → useAsyncData-C008zUPi.js} +2 -2
- package/dist/{useDateFormatter-B_9k85Ex.js → useDateFormatter-BA4FCquG.js} +2 -2
- package/dist/{useDeepCompareMemoize-Dt98v2ua.js → useDeepCompareMemoize-BrA3_n61.js} +1 -1
- package/dist/{useIframeCapabilities-BkYHTrss.js → useIframeCapabilities-C4JTXTIh.js} +1 -1
- package/dist/{useLifecycle-BF6-z62y.js → useLifecycle-BNaoJ5a4.js} +4 -4
- package/dist/{useTheme-DykuNHR2.js → useTheme-7O0YWlE5.js} +3 -3
- package/dist/{vega-component-cSdqoAxe.js → vega-component-DJNmOdUj.js} +18 -18
- package/dist/{vega-loader.browser-3_z8GoFC.js → vega-loader.browser-CZ-J8Py3.js} +3 -3
- package/dist/{xychartDiagram-PRI3JC2R-Dk2d_bX0.js → xychartDiagram-PRI3JC2R-BvwftqMA.js} +9 -9
- package/dist/{zod-BWkcDORu.js → zod-CoBiJ5v4.js} +3 -3
- package/package.json +1 -1
- package/src/components/data-table/TableBottomBar.tsx +30 -6
- package/src/components/data-table/__tests__/TableBottomBar.test.tsx +73 -0
- package/src/components/data-table/__tests__/column-header.test.tsx +110 -277
- package/src/components/data-table/__tests__/data-table.test.tsx +52 -1
- package/src/components/data-table/__tests__/date-filter-inputs.test.tsx +33 -0
- package/src/components/data-table/__tests__/filter-pill-editor.test.tsx +75 -38
- package/src/components/data-table/__tests__/filter-pills.test.tsx +287 -0
- package/src/components/data-table/__tests__/filter-test-utils.ts +47 -0
- package/src/components/data-table/__tests__/filters.test.ts +5 -5
- package/src/components/data-table/__tests__/header-items.test.tsx +47 -1
- package/src/components/data-table/__tests__/useColumnVisibility.test.ts +42 -0
- package/src/components/data-table/add-filter-button.tsx +85 -0
- package/src/components/data-table/column-explorer-panel/column-explorer.tsx +7 -1
- package/src/components/data-table/column-header.tsx +94 -691
- package/src/components/data-table/columns.tsx +3 -4
- package/src/components/data-table/context-menu.tsx +26 -12
- package/src/components/data-table/data-table.tsx +118 -56
- package/src/components/data-table/date-filter-inputs.tsx +13 -10
- package/src/components/data-table/filter-by-values-picker.tsx +13 -19
- package/src/components/data-table/filter-editor-context.tsx +34 -0
- package/src/components/data-table/filter-pill-editor.tsx +152 -175
- package/src/components/data-table/filter-pills.tsx +190 -153
- package/src/components/data-table/filters/builders.ts +102 -0
- package/src/components/data-table/filters/defaults.ts +31 -0
- package/src/components/data-table/filters/format.ts +131 -0
- package/src/components/data-table/filters/guards.ts +51 -0
- package/src/components/data-table/filters/index.ts +7 -0
- package/src/components/data-table/filters/operators.ts +76 -0
- package/src/components/data-table/filters/serialize.ts +186 -0
- package/src/components/data-table/filters/types.ts +33 -0
- package/src/components/data-table/header-items.tsx +25 -85
- package/src/components/data-table/hooks/use-column-visibility.ts +42 -0
- package/src/components/data-table/pagination.tsx +16 -3
- package/src/components/data-table/value-chips.tsx +52 -0
- package/src/components/ui/number-field.tsx +13 -1
- package/src/plugins/impl/DataTablePlugin.tsx +4 -0
- package/src/utils/dates.ts +39 -0
- package/dist/ErrorBoundary-D3wrPNma.js +0 -167
- package/dist/architecture-7HQA4BMR-CS9jOrqM.js +0 -6
- package/dist/dist-21ButRCu.js +0 -8
- package/dist/dist-B--tLnAP.js +0 -5
- package/dist/dist-BoHGySTM.js +0 -5
- package/dist/dist-ByAz19Qc.js +0 -5
- package/dist/dist-C1Ap5CYU.js +0 -5
- package/dist/dist-C93EysN4.js +0 -5
- package/dist/dist-CY-lVor6.js +0 -8
- package/dist/dist-CYDuv4bR.js +0 -8
- package/dist/dist-Cfo5EE2t.js +0 -6
- package/dist/dist-CjivSDvN.js +0 -5
- package/dist/dist-Cqwx-MH7.js +0 -5
- package/dist/dist-DbpcoFAV.js +0 -6
- package/dist/dist-FUNenbiQ.js +0 -5
- package/dist/dist-zhSud5X3.js +0 -8
- package/dist/mermaid-4DMBBIKO-B7VQMwJx.js +0 -6
- package/dist/react-vega-Cavbrg4l.js +0 -9
- package/dist/stex-ChDHQs3R.js +0 -4
- package/src/components/data-table/__tests__/column-header.test.ts +0 -65
- package/src/components/data-table/filters.ts +0 -386
- /package/dist/{_baseFor-BGiY-cm1.js → _baseFor-4jw-lnCC.js} +0 -0
- /package/dist/{clsx-CyyyQ8Ue.js → clsx-CIWA5tNO.js} +0 -0
- /package/dist/{defaultLocale-DoeErsX2.js → defaultLocale-BoHTsDG6.js} +0 -0
- /package/dist/{defaultLocale-BpsHxBd7.js → defaultLocale-u-3osm0P.js} +0 -0
- /package/dist/{dist-CCADb07R.js → dist-DNdhYsgW.js} +0 -0
- /package/dist/{emotion-is-prop-valid.esm-DtW2o230.js → emotion-is-prop-valid.esm-DzSb5hsH.js} +0 -0
- /package/dist/{invariant-UcGKQEhF.js → invariant-wRzNXIsJ.js} +0 -0
- /package/dist/{jsx-runtime-COBk7ree.js → jsx-runtime-DebpN0FN.js} +0 -0
- /package/dist/{main-CThhXnXU.js → main-Tj_-QTyF.js} +0 -0
- /package/dist/{micromark-factory-space-CwHmg6iz.js → micromark-factory-space-DF2w36zS.js} +0 -0
- /package/dist/{ordinal-B43ZeR68.js → ordinal-ArJavP1Q.js} +0 -0
- /package/dist/{purify.es-DT70lfR0.js → purify.es-H92eMd9-.js} +0 -0
- /package/dist/{range-BOiA8qqU.js → range-C-rmrM1O.js} +0 -0
- /package/dist/{react-dom-BWRJ_g_k.js → react-dom-BTJzcVJ9.js} +0 -0
- /package/dist/{stex-DrxP7bb3.js → stex-BIsgBmK4.js} +0 -0
|
@@ -6,6 +6,7 @@ import { CheckIcon, MinusIcon, Trash2Icon, XIcon } from "lucide-react";
|
|
|
6
6
|
import { useEffect, useId, useRef, useState } from "react";
|
|
7
7
|
import type { CalculateTopKRows } from "@/plugins/impl/DataTablePlugin";
|
|
8
8
|
import type { OperatorType } from "@/plugins/impl/data-frames/utils/operators";
|
|
9
|
+
import { Button } from "../ui/button";
|
|
9
10
|
import { Combobox, ComboboxItem } from "../ui/combobox";
|
|
10
11
|
import { Input } from "../ui/input";
|
|
11
12
|
import { NumberField } from "../ui/number-field";
|
|
@@ -16,95 +17,98 @@ import {
|
|
|
16
17
|
SelectTrigger,
|
|
17
18
|
SelectValue,
|
|
18
19
|
} from "../ui/select";
|
|
19
|
-
import {
|
|
20
|
+
import { Tooltip } from "../ui/tooltip";
|
|
20
21
|
import { DateLikeInput, DateLikeRangeInput } from "./date-filter-inputs";
|
|
21
22
|
import { FilterByValuesPicker } from "./filter-by-values-picker";
|
|
22
|
-
import { RegexInput } from "./regex-input";
|
|
23
23
|
import {
|
|
24
24
|
type ColumnFilterValue,
|
|
25
|
-
|
|
25
|
+
columnEditableType,
|
|
26
|
+
DEFAULT_OPERATOR_FOR_TYPE,
|
|
27
|
+
defaultFilterValueFor,
|
|
28
|
+
EDITABLE_FILTER_TYPES,
|
|
26
29
|
Filter,
|
|
27
|
-
|
|
28
|
-
|
|
30
|
+
type FilterType,
|
|
31
|
+
isComparisonOp,
|
|
32
|
+
isDateLikeType,
|
|
29
33
|
isTextScalarOp,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
OPERATORS_BY_TYPE,
|
|
35
|
+
OPERATORS_WITHOUT_VALUE,
|
|
36
|
+
type Snapshot,
|
|
33
37
|
} from "./filters";
|
|
34
38
|
import { OPERATOR_LABELS } from "./operator-labels";
|
|
35
|
-
import {
|
|
36
|
-
|
|
37
|
-
type EditableFilterType =
|
|
38
|
-
| "number"
|
|
39
|
-
| "text"
|
|
40
|
-
| "boolean"
|
|
41
|
-
| "select"
|
|
42
|
-
| "date"
|
|
43
|
-
| "datetime"
|
|
44
|
-
| "time";
|
|
45
|
-
|
|
46
|
-
type DateLikeEditableFilterType = Extract<
|
|
47
|
-
EditableFilterType,
|
|
48
|
-
"date" | "datetime" | "time"
|
|
49
|
-
>;
|
|
50
|
-
|
|
51
|
-
const DATE_LIKE_TYPES: ReadonlySet<EditableFilterType> = new Set([
|
|
52
|
-
"date",
|
|
53
|
-
"datetime",
|
|
54
|
-
"time",
|
|
55
|
-
]);
|
|
56
|
-
|
|
57
|
-
const isDateLikeType = (
|
|
58
|
-
type: EditableFilterType,
|
|
59
|
-
): type is DateLikeEditableFilterType => DATE_LIKE_TYPES.has(type);
|
|
60
|
-
|
|
61
|
-
const BOOLEAN_OPS = ["is_true", "is_false", "is_null", "is_not_null"] as const;
|
|
62
|
-
const SELECT_OPS = MEMBERSHIP_OPS;
|
|
63
|
-
|
|
64
|
-
const OPERATORS_BY_TYPE: Record<
|
|
65
|
-
EditableFilterType,
|
|
66
|
-
ReadonlyArray<OperatorType>
|
|
67
|
-
> = {
|
|
68
|
-
number: NUMBER_OPS,
|
|
69
|
-
text: TEXT_OPS,
|
|
70
|
-
boolean: BOOLEAN_OPS,
|
|
71
|
-
select: SELECT_OPS,
|
|
72
|
-
date: DATETIME_OPS,
|
|
73
|
-
datetime: DATETIME_OPS,
|
|
74
|
-
time: DATETIME_OPS,
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const DEFAULT_OPERATOR: Record<EditableFilterType, OperatorType> = {
|
|
78
|
-
number: "between",
|
|
79
|
-
text: "contains",
|
|
80
|
-
boolean: "is_true",
|
|
81
|
-
select: "in",
|
|
82
|
-
date: "between",
|
|
83
|
-
datetime: "between",
|
|
84
|
-
time: "between",
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const OPERATORS_WITHOUT_VALUE = new Set<OperatorType>([
|
|
88
|
-
"is_true",
|
|
89
|
-
"is_false",
|
|
90
|
-
"is_null",
|
|
91
|
-
"is_not_null",
|
|
92
|
-
"is_empty",
|
|
93
|
-
]);
|
|
39
|
+
import { RegexInput } from "./regex-input";
|
|
94
40
|
|
|
95
41
|
type DraftValue =
|
|
96
42
|
| { kind: "between"; min?: number; max?: number }
|
|
97
43
|
| { kind: "single-number"; value?: number }
|
|
98
44
|
| { kind: "single-text"; text?: string }
|
|
99
|
-
| { kind: "multi-
|
|
100
|
-
| { kind: "options"; options?: unknown[] }
|
|
45
|
+
| { kind: "multi-values"; values?: unknown[] }
|
|
101
46
|
| { kind: "date-between"; min?: Date; max?: Date }
|
|
102
47
|
| { kind: "date-single"; value?: Date }
|
|
103
48
|
| { kind: "none" };
|
|
104
49
|
|
|
105
|
-
interface
|
|
106
|
-
|
|
107
|
-
|
|
50
|
+
interface NumberTextDraft {
|
|
51
|
+
min?: string;
|
|
52
|
+
max?: string;
|
|
53
|
+
value?: string;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const EMPTY_NUMBER_TEXT_DRAFT: NumberTextDraft = {};
|
|
57
|
+
|
|
58
|
+
function parseDraftNumber(text: string | undefined): number | undefined {
|
|
59
|
+
if (text === undefined || text.trim() === "") {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const n = Number.parseFloat(text);
|
|
63
|
+
return Number.isFinite(n) ? n : undefined;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function mergeNumberTextDraft(
|
|
67
|
+
draft: DraftValue,
|
|
68
|
+
textDraft: NumberTextDraft,
|
|
69
|
+
): DraftValue {
|
|
70
|
+
if (draft.kind === "between") {
|
|
71
|
+
return {
|
|
72
|
+
kind: "between",
|
|
73
|
+
min: parseDraftNumber(textDraft.min) ?? draft.min,
|
|
74
|
+
max: parseDraftNumber(textDraft.max) ?? draft.max,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (draft.kind === "single-number") {
|
|
78
|
+
return {
|
|
79
|
+
kind: "single-number",
|
|
80
|
+
value: parseDraftNumber(textDraft.value) ?? draft.value,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
return draft;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function buildEmptyFilterValue(
|
|
87
|
+
column: Column<unknown, unknown>,
|
|
88
|
+
): ColumnFilterValue {
|
|
89
|
+
const type = columnEditableType(column);
|
|
90
|
+
return defaultFilterValueFor(type, DEFAULT_OPERATOR_FOR_TYPE[type]);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export function buildEditorSnapshot(
|
|
94
|
+
column: Column<unknown, unknown>,
|
|
95
|
+
opts?: { operator?: OperatorType },
|
|
96
|
+
): Snapshot {
|
|
97
|
+
const type = columnEditableType(column);
|
|
98
|
+
const operator = opts?.operator ?? DEFAULT_OPERATOR_FOR_TYPE[type];
|
|
99
|
+
return {
|
|
100
|
+
columnId: column.id,
|
|
101
|
+
value: defaultFilterValueFor(type, operator),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function editableColumns<TData>(
|
|
106
|
+
table: Table<TData>,
|
|
107
|
+
): Array<Column<TData, unknown>> {
|
|
108
|
+
return table.getAllColumns().filter((c) => {
|
|
109
|
+
const ft = c.columnDef.meta?.filterType;
|
|
110
|
+
return ft !== undefined && EDITABLE_FILTER_TYPES.has(ft);
|
|
111
|
+
});
|
|
108
112
|
}
|
|
109
113
|
|
|
110
114
|
interface FilterPillEditorProps<TData> {
|
|
@@ -112,6 +116,7 @@ interface FilterPillEditorProps<TData> {
|
|
|
112
116
|
table: Table<TData>;
|
|
113
117
|
calculateTopKRows?: CalculateTopKRows;
|
|
114
118
|
onClose: () => void;
|
|
119
|
+
editIndex?: number; // skip for creating new pill; when passed edits the pill at idx instead
|
|
115
120
|
}
|
|
116
121
|
|
|
117
122
|
export const FilterPillEditor = <TData,>({
|
|
@@ -119,33 +124,26 @@ export const FilterPillEditor = <TData,>({
|
|
|
119
124
|
table,
|
|
120
125
|
calculateTopKRows,
|
|
121
126
|
onClose,
|
|
127
|
+
editIndex,
|
|
122
128
|
}: FilterPillEditorProps<TData>) => {
|
|
123
129
|
const columnId = useId();
|
|
124
130
|
const operatorId = useId();
|
|
125
131
|
const valueId = useId();
|
|
126
132
|
|
|
127
|
-
const snapshotType =
|
|
133
|
+
const snapshotType: FilterType = snapshot.value.type;
|
|
128
134
|
const snapshotOperator = snapshot.value.operator as OperatorType;
|
|
129
135
|
const snapshotDraft = toDraftValue(snapshot.value);
|
|
130
136
|
|
|
131
137
|
const [draftColumnId, setDraftColumnId] = useState<string>(snapshot.columnId);
|
|
132
|
-
const [draftType, setDraftType] = useState<
|
|
138
|
+
const [draftType, setDraftType] = useState<FilterType>(snapshotType);
|
|
133
139
|
const [draftOperator, setDraftOperator] =
|
|
134
140
|
useState<OperatorType>(snapshotOperator);
|
|
135
141
|
const [draftValue, setDraftValue] = useState<DraftValue>(snapshotDraft);
|
|
142
|
+
const [numberTextDraft, setNumberTextDraft] = useState<NumberTextDraft>(
|
|
143
|
+
EMPTY_NUMBER_TEXT_DRAFT,
|
|
144
|
+
);
|
|
136
145
|
|
|
137
|
-
const
|
|
138
|
-
const ft = c.columnDef.meta?.filterType;
|
|
139
|
-
return (
|
|
140
|
-
ft === "number" ||
|
|
141
|
-
ft === "text" ||
|
|
142
|
-
ft === "boolean" ||
|
|
143
|
-
ft === "select" ||
|
|
144
|
-
ft === "date" ||
|
|
145
|
-
ft === "datetime" ||
|
|
146
|
-
ft === "time"
|
|
147
|
-
);
|
|
148
|
-
});
|
|
146
|
+
const columnOptions = editableColumns(table);
|
|
149
147
|
|
|
150
148
|
const rehydrateIfMatchesSnapshot = (args: {
|
|
151
149
|
id: string;
|
|
@@ -161,15 +159,18 @@ export const FilterPillEditor = <TData,>({
|
|
|
161
159
|
return;
|
|
162
160
|
}
|
|
163
161
|
const nextColumn = table.getColumn(nextColumnId);
|
|
164
|
-
|
|
165
|
-
|
|
162
|
+
if (!nextColumn) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const nextColumnType = columnEditableType(nextColumn);
|
|
166
166
|
|
|
167
167
|
let nextOperator = draftOperator;
|
|
168
168
|
if (nextColumnType !== draftType) {
|
|
169
|
-
nextOperator =
|
|
169
|
+
nextOperator = DEFAULT_OPERATOR_FOR_TYPE[nextColumnType];
|
|
170
170
|
setDraftType(nextColumnType);
|
|
171
171
|
setDraftOperator(nextOperator);
|
|
172
172
|
setDraftValue(emptyDraftFor(nextColumnType, nextOperator));
|
|
173
|
+
setNumberTextDraft(EMPTY_NUMBER_TEXT_DRAFT);
|
|
173
174
|
}
|
|
174
175
|
setDraftColumnId(nextColumnId);
|
|
175
176
|
rehydrateIfMatchesSnapshot({
|
|
@@ -184,6 +185,7 @@ export const FilterPillEditor = <TData,>({
|
|
|
184
185
|
if (nextEmpty.kind !== draftValue.kind) {
|
|
185
186
|
setDraftValue(nextEmpty);
|
|
186
187
|
}
|
|
188
|
+
setNumberTextDraft(EMPTY_NUMBER_TEXT_DRAFT);
|
|
187
189
|
rehydrateIfMatchesSnapshot({
|
|
188
190
|
id: draftColumnId,
|
|
189
191
|
operator: nextOp,
|
|
@@ -193,7 +195,7 @@ export const FilterPillEditor = <TData,>({
|
|
|
193
195
|
const pendingValue = buildFilterValue({
|
|
194
196
|
type: draftType,
|
|
195
197
|
operator: draftOperator,
|
|
196
|
-
draft: draftValue,
|
|
198
|
+
draft: mergeNumberTextDraft(draftValue, numberTextDraft),
|
|
197
199
|
});
|
|
198
200
|
const applyDisabled = pendingValue === undefined;
|
|
199
201
|
const applyTooltip = applyDisabled
|
|
@@ -206,17 +208,23 @@ export const FilterPillEditor = <TData,>({
|
|
|
206
208
|
}
|
|
207
209
|
const value = pendingValue;
|
|
208
210
|
table.setColumnFilters((filters) => {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
211
|
+
// assume new filter pill is being created
|
|
212
|
+
if (editIndex === undefined) {
|
|
213
|
+
return [{ id: draftColumnId, value }, ...filters];
|
|
214
|
+
}
|
|
215
|
+
const next = [...filters];
|
|
216
|
+
next[editIndex] = { id: draftColumnId, value };
|
|
217
|
+
return next;
|
|
212
218
|
});
|
|
213
219
|
onClose();
|
|
214
220
|
};
|
|
215
221
|
|
|
216
222
|
const handleClear = () => {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
223
|
+
if (editIndex !== undefined) {
|
|
224
|
+
table.setColumnFilters((filters) =>
|
|
225
|
+
filters.filter((_, i) => i !== editIndex),
|
|
226
|
+
);
|
|
227
|
+
}
|
|
220
228
|
onClose();
|
|
221
229
|
};
|
|
222
230
|
|
|
@@ -261,7 +269,7 @@ export const FilterPillEditor = <TData,>({
|
|
|
261
269
|
placeholder="Select column…"
|
|
262
270
|
displayValue={(id) => id}
|
|
263
271
|
>
|
|
264
|
-
{
|
|
272
|
+
{columnOptions.map((c) => (
|
|
265
273
|
<ComboboxItem key={c.id} value={c.id}>
|
|
266
274
|
{c.id}
|
|
267
275
|
</ComboboxItem>
|
|
@@ -304,6 +312,9 @@ export const FilterPillEditor = <TData,>({
|
|
|
304
312
|
operator={draftOperator}
|
|
305
313
|
value={draftValue}
|
|
306
314
|
onChange={setDraftValue}
|
|
315
|
+
onNumberTextChange={(field, text) =>
|
|
316
|
+
setNumberTextDraft((prev) => ({ ...prev, [field]: text }))
|
|
317
|
+
}
|
|
307
318
|
column={table.getColumn(draftColumnId) ?? null}
|
|
308
319
|
calculateTopKRows={calculateTopKRows}
|
|
309
320
|
/>
|
|
@@ -355,10 +366,11 @@ export const FilterPillEditor = <TData,>({
|
|
|
355
366
|
|
|
356
367
|
interface ValueSlotProps<TData, TValue> {
|
|
357
368
|
id?: string;
|
|
358
|
-
type:
|
|
369
|
+
type: FilterType;
|
|
359
370
|
operator: OperatorType;
|
|
360
371
|
value: DraftValue;
|
|
361
372
|
onChange: (next: DraftValue) => void;
|
|
373
|
+
onNumberTextChange: (field: "min" | "max" | "value", text: string) => void;
|
|
362
374
|
column: Column<TData, TValue> | null;
|
|
363
375
|
calculateTopKRows?: CalculateTopKRows;
|
|
364
376
|
}
|
|
@@ -369,6 +381,7 @@ const ValueSlot = <TData, TValue>({
|
|
|
369
381
|
operator,
|
|
370
382
|
value,
|
|
371
383
|
onChange,
|
|
384
|
+
onNumberTextChange,
|
|
372
385
|
column,
|
|
373
386
|
calculateTopKRows,
|
|
374
387
|
}: ValueSlotProps<TData, TValue>) => {
|
|
@@ -380,6 +393,7 @@ const ValueSlot = <TData, TValue>({
|
|
|
380
393
|
id={id}
|
|
381
394
|
value={v.min}
|
|
382
395
|
onChange={(n) => onChange({ kind: "between", min: n, max: v.max })}
|
|
396
|
+
onInputText={(t) => onNumberTextChange("min", t)}
|
|
383
397
|
aria-label="min"
|
|
384
398
|
placeholder="min"
|
|
385
399
|
className="border-input flex-1 min-w-0"
|
|
@@ -388,6 +402,7 @@ const ValueSlot = <TData, TValue>({
|
|
|
388
402
|
<NumberField
|
|
389
403
|
value={v.max}
|
|
390
404
|
onChange={(n) => onChange({ kind: "between", min: v.min, max: n })}
|
|
405
|
+
onInputText={(t) => onNumberTextChange("max", t)}
|
|
391
406
|
aria-label="max"
|
|
392
407
|
placeholder="max"
|
|
393
408
|
className="border-input flex-1 min-w-0"
|
|
@@ -395,7 +410,7 @@ const ValueSlot = <TData, TValue>({
|
|
|
395
410
|
</div>
|
|
396
411
|
);
|
|
397
412
|
}
|
|
398
|
-
if (type === "number" &&
|
|
413
|
+
if (type === "number" && isComparisonOp(operator)) {
|
|
399
414
|
const v =
|
|
400
415
|
value.kind === "single-number"
|
|
401
416
|
? value
|
|
@@ -405,6 +420,7 @@ const ValueSlot = <TData, TValue>({
|
|
|
405
420
|
id={id}
|
|
406
421
|
value={v.value}
|
|
407
422
|
onChange={(n) => onChange({ kind: "single-number", value: n })}
|
|
423
|
+
onInputText={(t) => onNumberTextChange("value", t)}
|
|
408
424
|
aria-label="value"
|
|
409
425
|
placeholder="value"
|
|
410
426
|
className="border-input w-24 min-w-0"
|
|
@@ -412,22 +428,20 @@ const ValueSlot = <TData, TValue>({
|
|
|
412
428
|
);
|
|
413
429
|
}
|
|
414
430
|
if (
|
|
415
|
-
type === "text" &&
|
|
431
|
+
(type === "text" || type === "number") &&
|
|
416
432
|
(operator === "in" || operator === "not_in") &&
|
|
417
433
|
column
|
|
418
434
|
) {
|
|
419
435
|
const v =
|
|
420
|
-
value.kind === "multi-
|
|
436
|
+
value.kind === "multi-values" ? value : { kind: "multi-values" as const };
|
|
421
437
|
return (
|
|
422
|
-
<div className="w-
|
|
438
|
+
<div className="min-w-[14rem] w-fit max-w-[24rem]">
|
|
423
439
|
<FilterByValuesPicker
|
|
424
440
|
column={column}
|
|
425
441
|
calculateTopKRows={calculateTopKRows}
|
|
426
442
|
chosenValues={v.values ?? []}
|
|
427
|
-
onChange={(next) =>
|
|
428
|
-
|
|
429
|
-
}
|
|
430
|
-
creatable={true}
|
|
443
|
+
onChange={(next) => onChange({ kind: "multi-values", values: next })}
|
|
444
|
+
creatable={type === "text"}
|
|
431
445
|
/>
|
|
432
446
|
</div>
|
|
433
447
|
);
|
|
@@ -474,7 +488,7 @@ const ValueSlot = <TData, TValue>({
|
|
|
474
488
|
/>
|
|
475
489
|
);
|
|
476
490
|
}
|
|
477
|
-
if (isDateLikeType(type) &&
|
|
491
|
+
if (isDateLikeType(type) && isComparisonOp(operator)) {
|
|
478
492
|
const v =
|
|
479
493
|
value.kind === "date-single" ? value : { kind: "date-single" as const };
|
|
480
494
|
return (
|
|
@@ -488,42 +502,17 @@ const ValueSlot = <TData, TValue>({
|
|
|
488
502
|
/>
|
|
489
503
|
);
|
|
490
504
|
}
|
|
491
|
-
if (type === "select" && column) {
|
|
492
|
-
const v = value.kind === "options" ? value : { kind: "options" as const };
|
|
493
|
-
return (
|
|
494
|
-
<div className="flex w-48">
|
|
495
|
-
<FilterByValuesPicker
|
|
496
|
-
column={column}
|
|
497
|
-
calculateTopKRows={calculateTopKRows}
|
|
498
|
-
chosenValues={v.options ?? []}
|
|
499
|
-
onChange={(values) => onChange({ kind: "options", options: values })}
|
|
500
|
-
/>
|
|
501
|
-
</div>
|
|
502
|
-
);
|
|
503
|
-
}
|
|
504
505
|
return null;
|
|
505
506
|
};
|
|
506
507
|
|
|
507
|
-
function getEditableType(value: ColumnFilterValue): EditableFilterType {
|
|
508
|
-
switch (value.type) {
|
|
509
|
-
case "number":
|
|
510
|
-
case "text":
|
|
511
|
-
case "boolean":
|
|
512
|
-
case "select":
|
|
513
|
-
case "date":
|
|
514
|
-
case "datetime":
|
|
515
|
-
case "time":
|
|
516
|
-
return value.type;
|
|
517
|
-
default:
|
|
518
|
-
return "text";
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
|
|
522
508
|
function toDraftValue(value: ColumnFilterValue): DraftValue {
|
|
523
509
|
if (value.type === "number") {
|
|
524
510
|
switch (value.operator) {
|
|
525
511
|
case "between":
|
|
526
512
|
return { kind: "between", min: value.min, max: value.max };
|
|
513
|
+
case "in":
|
|
514
|
+
case "not_in":
|
|
515
|
+
return { kind: "multi-values", values: [...value.values] };
|
|
527
516
|
case "is_null":
|
|
528
517
|
case "is_not_null":
|
|
529
518
|
return { kind: "none" };
|
|
@@ -535,7 +524,7 @@ function toDraftValue(value: ColumnFilterValue): DraftValue {
|
|
|
535
524
|
switch (value.operator) {
|
|
536
525
|
case "in":
|
|
537
526
|
case "not_in":
|
|
538
|
-
return { kind: "multi-
|
|
527
|
+
return { kind: "multi-values", values: [...value.values] };
|
|
539
528
|
case "is_null":
|
|
540
529
|
case "is_not_null":
|
|
541
530
|
case "is_empty":
|
|
@@ -544,9 +533,6 @@ function toDraftValue(value: ColumnFilterValue): DraftValue {
|
|
|
544
533
|
return { kind: "single-text", text: value.text };
|
|
545
534
|
}
|
|
546
535
|
}
|
|
547
|
-
if (value.type === "select") {
|
|
548
|
-
return { kind: "options", options: [...value.options] };
|
|
549
|
-
}
|
|
550
536
|
if (
|
|
551
537
|
value.type === "date" ||
|
|
552
538
|
value.type === "datetime" ||
|
|
@@ -565,25 +551,20 @@ function toDraftValue(value: ColumnFilterValue): DraftValue {
|
|
|
565
551
|
return { kind: "none" };
|
|
566
552
|
}
|
|
567
553
|
|
|
568
|
-
function emptyDraftFor(
|
|
569
|
-
type: EditableFilterType,
|
|
570
|
-
operator: OperatorType,
|
|
571
|
-
): DraftValue {
|
|
554
|
+
function emptyDraftFor(type: FilterType, operator: OperatorType): DraftValue {
|
|
572
555
|
if (OPERATORS_WITHOUT_VALUE.has(operator)) {
|
|
573
556
|
return { kind: "none" };
|
|
574
557
|
}
|
|
558
|
+
if (operator === "in" || operator === "not_in") {
|
|
559
|
+
return { kind: "multi-values", values: [] };
|
|
560
|
+
}
|
|
575
561
|
if (type === "number") {
|
|
576
562
|
return operator === "between"
|
|
577
563
|
? { kind: "between" }
|
|
578
564
|
: { kind: "single-number" };
|
|
579
565
|
}
|
|
580
566
|
if (type === "text") {
|
|
581
|
-
return
|
|
582
|
-
? { kind: "multi-text", values: [] }
|
|
583
|
-
: { kind: "single-text" };
|
|
584
|
-
}
|
|
585
|
-
if (type === "select") {
|
|
586
|
-
return { kind: "options", options: [] };
|
|
567
|
+
return { kind: "single-text" };
|
|
587
568
|
}
|
|
588
569
|
if (isDateLikeType(type)) {
|
|
589
570
|
return operator === "between"
|
|
@@ -594,13 +575,13 @@ function emptyDraftFor(
|
|
|
594
575
|
}
|
|
595
576
|
|
|
596
577
|
function getMissingValueMessage(
|
|
597
|
-
|
|
578
|
+
_type: FilterType,
|
|
598
579
|
operator: OperatorType,
|
|
599
580
|
): string {
|
|
600
581
|
if (operator === "between") {
|
|
601
582
|
return "Min and max are required";
|
|
602
583
|
}
|
|
603
|
-
if (
|
|
584
|
+
if (operator === "in" || operator === "not_in") {
|
|
604
585
|
return "Pick at least one value";
|
|
605
586
|
}
|
|
606
587
|
return "Value is required";
|
|
@@ -611,7 +592,7 @@ function buildFilterValue({
|
|
|
611
592
|
operator,
|
|
612
593
|
draft,
|
|
613
594
|
}: {
|
|
614
|
-
type:
|
|
595
|
+
type: FilterType;
|
|
615
596
|
operator: OperatorType;
|
|
616
597
|
draft: DraftValue;
|
|
617
598
|
}): ColumnFilterValue | undefined {
|
|
@@ -633,7 +614,17 @@ function buildFilterValue({
|
|
|
633
614
|
max: draft.max,
|
|
634
615
|
});
|
|
635
616
|
}
|
|
636
|
-
if (
|
|
617
|
+
if (operator === "in" || operator === "not_in") {
|
|
618
|
+
if (
|
|
619
|
+
draft.kind !== "multi-values" ||
|
|
620
|
+
!draft.values ||
|
|
621
|
+
draft.values.length === 0
|
|
622
|
+
) {
|
|
623
|
+
return undefined;
|
|
624
|
+
}
|
|
625
|
+
return Filter.number({ operator, values: draft.values });
|
|
626
|
+
}
|
|
627
|
+
if (!isComparisonOp(operator)) {
|
|
637
628
|
return undefined;
|
|
638
629
|
}
|
|
639
630
|
if (draft.kind !== "single-number" || draft.value === undefined) {
|
|
@@ -651,7 +642,7 @@ function buildFilterValue({
|
|
|
651
642
|
}
|
|
652
643
|
if (operator === "in" || operator === "not_in") {
|
|
653
644
|
if (
|
|
654
|
-
draft.kind !== "multi-
|
|
645
|
+
draft.kind !== "multi-values" ||
|
|
655
646
|
!draft.values ||
|
|
656
647
|
draft.values.length === 0
|
|
657
648
|
) {
|
|
@@ -668,29 +659,15 @@ function buildFilterValue({
|
|
|
668
659
|
return Filter.text({ operator, text: draft.text });
|
|
669
660
|
}
|
|
670
661
|
if (type === "boolean") {
|
|
671
|
-
if (operator === "is_true") {
|
|
672
|
-
return Filter.boolean({ value: true, operator: "is_true" });
|
|
673
|
-
}
|
|
674
|
-
if (operator === "is_false") {
|
|
675
|
-
return Filter.boolean({ value: false, operator: "is_false" });
|
|
676
|
-
}
|
|
677
|
-
if (operator === "is_null" || operator === "is_not_null") {
|
|
678
|
-
return Filter.boolean({ operator });
|
|
679
|
-
}
|
|
680
|
-
return undefined;
|
|
681
|
-
}
|
|
682
|
-
if (type === "select") {
|
|
683
662
|
if (
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
663
|
+
operator === "is_true" ||
|
|
664
|
+
operator === "is_false" ||
|
|
665
|
+
operator === "is_null" ||
|
|
666
|
+
operator === "is_not_null"
|
|
687
667
|
) {
|
|
688
|
-
return
|
|
668
|
+
return Filter.boolean({ operator });
|
|
689
669
|
}
|
|
690
|
-
return
|
|
691
|
-
options: draft.options,
|
|
692
|
-
operator: operator === "not_in" ? "not_in" : "in",
|
|
693
|
-
});
|
|
670
|
+
return undefined;
|
|
694
671
|
}
|
|
695
672
|
if (isDateLikeType(type)) {
|
|
696
673
|
const factory =
|
|
@@ -712,7 +689,7 @@ function buildFilterValue({
|
|
|
712
689
|
}
|
|
713
690
|
return factory({ operator: "between", min: draft.min, max: draft.max });
|
|
714
691
|
}
|
|
715
|
-
if (!
|
|
692
|
+
if (!isComparisonOp(operator)) {
|
|
716
693
|
return undefined;
|
|
717
694
|
}
|
|
718
695
|
if (draft.kind !== "date-single" || draft.value === undefined) {
|