@multiplatform.one/table 6.6.0 → 7.0.0
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 +4 -3
- package/dist/cjs/components/ChildTable/index.cjs +2 -1
- package/dist/cjs/components/ChildTable/index.native.js +3 -2
- package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
- package/dist/cjs/components/ColumnHeaderFilter/index.cjs +17 -9
- package/dist/cjs/components/ColumnHeaderFilter/index.native.js +33 -12
- package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTableCardControls.native.js +1 -1
- package/dist/cjs/components/DataTable/DataTableCardControls.native.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTableContext.native.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTableDocumentList.cjs +222 -0
- package/dist/cjs/components/DataTable/DataTableDocumentList.native.js +237 -0
- package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -0
- package/dist/cjs/components/DataTable/DataTableMobileCards.cjs +5 -2
- package/dist/cjs/components/DataTable/DataTableMobileCards.native.js +6 -2
- package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTableRoot.cjs +92 -41
- package/dist/cjs/components/DataTable/DataTableRoot.native.js +104 -50
- package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTableStateContext.native.js.map +1 -1
- package/dist/cjs/components/DataTable/DataTableVirtualized.cjs +8 -2
- package/dist/cjs/components/DataTable/DataTableVirtualized.native.js +9 -3
- package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
- package/dist/cjs/components/DataTable/documentListSlots.cjs +59 -0
- package/dist/cjs/components/DataTable/documentListSlots.native.js +85 -0
- package/dist/cjs/components/DataTable/documentListSlots.native.js.map +1 -0
- package/dist/cjs/components/DataTable/index.native.js +84 -69
- package/dist/cjs/components/DataTable/index.native.js.map +1 -1
- package/dist/cjs/components/DataTable/rowStateChrome.cjs +55 -0
- package/dist/cjs/components/DataTable/rowStateChrome.native.js +59 -0
- package/dist/cjs/components/DataTable/rowStateChrome.native.js.map +1 -0
- package/dist/cjs/components/DataTableBulkActions/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +24 -3
- package/dist/cjs/components/DataTableCell/CellModalEditor.native.js +6 -1
- package/dist/cjs/components/DataTableCell/CellModalEditor.native.js.map +1 -1
- package/dist/cjs/components/DataTableCell/CellOptionsEditor.cjs +9 -2
- package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js +11 -2
- package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
- package/dist/cjs/components/DataTableCell/index.cjs +74 -63
- package/dist/cjs/components/DataTableCell/index.native.js +94 -82
- package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableColumnPinning/index.cjs +54 -37
- package/dist/cjs/components/DataTableColumnPinning/index.native.js +59 -38
- package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableDateFilter/index.cjs +33 -14
- package/dist/cjs/components/DataTableDateFilter/index.native.js +33 -12
- package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableExport/index.cjs +35 -7
- package/dist/cjs/components/DataTableExport/index.native.js +42 -7
- package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableFacetMenu/index.cjs +140 -0
- package/dist/cjs/components/DataTableFacetMenu/index.native.js +156 -0
- package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -0
- package/dist/cjs/components/DataTableFilterButton/index.cjs +51 -32
- package/dist/cjs/components/DataTableFilterButton/index.native.js +64 -41
- package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableFilterChips/FilterChip.cjs +143 -0
- package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js +148 -0
- package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
- package/dist/cjs/components/DataTableFilterChips/index.cjs +9 -31
- package/dist/cjs/components/DataTableFilterChips/index.native.js +9 -32
- package/dist/cjs/components/DataTableFilterChips/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableFilters/index.cjs +145 -502
- package/dist/cjs/components/DataTableFilters/index.native.js +171 -544
- package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableGrouping/index.cjs +273 -108
- package/dist/cjs/components/DataTableGrouping/index.native.js +310 -157
- package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
- package/dist/cjs/components/DataTablePagination/index.cjs +147 -95
- package/dist/cjs/components/DataTablePagination/index.native.js +159 -106
- package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableSearch/index.cjs +251 -210
- package/dist/cjs/components/DataTableSearch/index.native.js +292 -243
- package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableToolbar/index.cjs +141 -115
- package/dist/cjs/components/DataTableToolbar/index.native.js +164 -149
- package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
- package/dist/cjs/components/DataTableViewOptions/index.cjs +25 -21
- package/dist/cjs/components/DataTableViewOptions/index.native.js +6 -4
- package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
- package/dist/cjs/components/FilterManager.native.js.map +1 -1
- package/dist/cjs/components/FilterOperatorValueEditor/index.native.js.map +1 -1
- package/dist/cjs/components/KnobDialog.native.js.map +1 -1
- package/dist/cjs/components/SavedFilterDropdown.native.js.map +1 -1
- package/dist/cjs/components/SimpleTable/index.cjs +336 -46
- package/dist/cjs/components/SimpleTable/index.native.js +356 -48
- package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
- package/dist/cjs/components/TableInput/index.cjs +147 -38
- package/dist/cjs/components/TableInput/index.native.js +55 -39
- package/dist/cjs/components/TableInput/index.native.js.map +1 -1
- package/dist/cjs/components/TableInput/shared.cjs +36 -1
- package/dist/cjs/components/TableInput/shared.native.js +35 -0
- package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
- package/dist/cjs/hooks/useDataTable.cjs +33 -2
- package/dist/cjs/hooks/useDataTable.native.js +41 -2
- package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
- package/dist/cjs/hooks/useDataTableKeyboard.native.js.map +1 -1
- package/dist/cjs/hooks/useDragScroll.native.js.map +1 -1
- package/dist/cjs/hooks/useInfiniteRows.cjs +20 -3
- package/dist/cjs/hooks/useInfiniteRows.native.js +20 -3
- package/dist/cjs/hooks/useInfiniteRows.native.js.map +1 -1
- package/dist/cjs/hooks/useSavedFilters.native.js.map +1 -1
- package/dist/cjs/hooks/useTableColumnPinning.native.js.map +1 -1
- package/dist/cjs/hooks/useTableFiltering.native.js.map +1 -1
- package/dist/cjs/hooks/useTableGrouping.native.js.map +1 -1
- package/dist/cjs/hooks/useTableKeyboard.native.js.map +1 -1
- package/dist/cjs/hooks/useTablePagination.native.js.map +1 -1
- package/dist/cjs/hooks/useTableSearch.native.js.map +1 -1
- package/dist/cjs/hooks/useTableSelection.native.js.map +1 -1
- package/dist/cjs/hooks/useTableSorting.native.js.map +1 -1
- package/dist/cjs/hooks/useTableUrlSync.native.js.map +1 -1
- package/dist/cjs/hooks/useTableViews.native.js.map +1 -1
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.native.js +2 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/shared/t.native.js.map +1 -1
- package/dist/cjs/shims/primitives.native.js.map +1 -1
- package/dist/cjs/shims/tableCellContext.native.js.map +1 -1
- package/dist/cjs/types.native.js.map +1 -1
- package/dist/cjs/utils/columnAlign.native.js.map +1 -1
- package/dist/cjs/utils/filterFields.native.js.map +1 -1
- package/dist/cjs/utils/filterUtils.cjs +12 -5
- package/dist/cjs/utils/filterUtils.native.js +20 -5
- package/dist/cjs/utils/filterUtils.native.js.map +1 -1
- package/dist/cjs/utils/paginationDefaults.native.js.map +1 -1
- package/dist/cjs/utils/rowPress.native.js.map +1 -1
- package/dist/cjs/utils/urlStateUtils.native.js.map +1 -1
- package/dist/cjs/utils/viewData.native.js.map +1 -1
- package/dist/cjs/utils/withInterp.native.js.map +1 -1
- package/dist/esm/components/ChildTable/index.mjs +2 -1
- package/dist/esm/components/ChildTable/index.mjs.map +1 -1
- package/dist/esm/components/ChildTable/index.native.js +2 -1
- package/dist/esm/components/ChildTable/index.native.js.map +1 -1
- package/dist/esm/components/ColumnHeaderFilter/index.mjs +17 -9
- package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
- package/dist/esm/components/ColumnHeaderFilter/index.native.js +32 -11
- package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
- package/dist/esm/components/DataTable/DataTableDocumentList.mjs +196 -0
- package/dist/esm/components/DataTable/DataTableDocumentList.mjs.map +1 -0
- package/dist/esm/components/DataTable/DataTableDocumentList.native.js +208 -0
- package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -0
- package/dist/esm/components/DataTable/DataTableMobileCards.mjs +5 -2
- package/dist/esm/components/DataTable/DataTableMobileCards.mjs.map +1 -1
- package/dist/esm/components/DataTable/DataTableMobileCards.native.js +6 -2
- package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
- package/dist/esm/components/DataTable/DataTableRoot.mjs +93 -42
- package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
- package/dist/esm/components/DataTable/DataTableRoot.native.js +98 -44
- package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
- package/dist/esm/components/DataTable/DataTableVirtualized.mjs +8 -2
- package/dist/esm/components/DataTable/DataTableVirtualized.mjs.map +1 -1
- package/dist/esm/components/DataTable/DataTableVirtualized.native.js +9 -3
- package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
- package/dist/esm/components/DataTable/documentListSlots.mjs +33 -0
- package/dist/esm/components/DataTable/documentListSlots.mjs.map +1 -0
- package/dist/esm/components/DataTable/documentListSlots.native.js +56 -0
- package/dist/esm/components/DataTable/documentListSlots.native.js.map +1 -0
- package/dist/esm/components/DataTable/index.native.js +52 -37
- package/dist/esm/components/DataTable/index.native.js.map +1 -1
- package/dist/esm/components/DataTable/rowStateChrome.mjs +28 -0
- package/dist/esm/components/DataTable/rowStateChrome.mjs.map +1 -0
- package/dist/esm/components/DataTable/rowStateChrome.native.js +29 -0
- package/dist/esm/components/DataTable/rowStateChrome.native.js.map +1 -0
- package/dist/esm/components/DataTableCell/CellModalEditor.mjs +25 -4
- package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
- package/dist/esm/components/DataTableCell/CellModalEditor.native.js +6 -1
- package/dist/esm/components/DataTableCell/CellModalEditor.native.js.map +1 -1
- package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs +9 -2
- package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
- package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js +11 -2
- package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
- package/dist/esm/components/DataTableCell/index.mjs +75 -64
- package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
- package/dist/esm/components/DataTableCell/index.native.js +95 -83
- package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
- package/dist/esm/components/DataTableColumnPinning/index.mjs +54 -37
- package/dist/esm/components/DataTableColumnPinning/index.mjs.map +1 -1
- package/dist/esm/components/DataTableColumnPinning/index.native.js +59 -38
- package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
- package/dist/esm/components/DataTableDateFilter/index.mjs +34 -15
- package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
- package/dist/esm/components/DataTableDateFilter/index.native.js +34 -13
- package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
- package/dist/esm/components/DataTableExport/index.mjs +36 -8
- package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
- package/dist/esm/components/DataTableExport/index.native.js +43 -8
- package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
- package/dist/esm/components/DataTableFacetMenu/index.mjs +115 -0
- package/dist/esm/components/DataTableFacetMenu/index.mjs.map +1 -0
- package/dist/esm/components/DataTableFacetMenu/index.native.js +128 -0
- package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -0
- package/dist/esm/components/DataTableFilterButton/index.mjs +54 -35
- package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
- package/dist/esm/components/DataTableFilterButton/index.native.js +66 -43
- package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
- package/dist/esm/components/DataTableFilterChips/FilterChip.mjs +118 -0
- package/dist/esm/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
- package/dist/esm/components/DataTableFilterChips/FilterChip.native.js +120 -0
- package/dist/esm/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
- package/dist/esm/components/DataTableFilterChips/index.mjs +9 -32
- package/dist/esm/components/DataTableFilterChips/index.mjs.map +1 -1
- package/dist/esm/components/DataTableFilterChips/index.native.js +9 -33
- package/dist/esm/components/DataTableFilterChips/index.native.js.map +1 -1
- package/dist/esm/components/DataTableFilters/index.mjs +149 -506
- package/dist/esm/components/DataTableFilters/index.mjs.map +1 -1
- package/dist/esm/components/DataTableFilters/index.native.js +175 -548
- package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
- package/dist/esm/components/DataTableGrouping/index.mjs +275 -110
- package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
- package/dist/esm/components/DataTableGrouping/index.native.js +287 -134
- package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
- package/dist/esm/components/DataTablePagination/index.mjs +148 -96
- package/dist/esm/components/DataTablePagination/index.mjs.map +1 -1
- package/dist/esm/components/DataTablePagination/index.native.js +160 -107
- package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
- package/dist/esm/components/DataTableSearch/index.mjs +256 -215
- package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
- package/dist/esm/components/DataTableSearch/index.native.js +297 -248
- package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
- package/dist/esm/components/DataTableToolbar/index.mjs +145 -119
- package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
- package/dist/esm/components/DataTableToolbar/index.native.js +167 -152
- package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
- package/dist/esm/components/DataTableViewOptions/index.mjs +26 -22
- package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
- package/dist/esm/components/DataTableViewOptions/index.native.js +7 -5
- package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
- package/dist/esm/components/SimpleTable/index.mjs +338 -48
- package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
- package/dist/esm/components/SimpleTable/index.native.js +358 -50
- package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
- package/dist/esm/components/TableInput/index.mjs +150 -41
- package/dist/esm/components/TableInput/index.mjs.map +1 -1
- package/dist/esm/components/TableInput/index.native.js +55 -39
- package/dist/esm/components/TableInput/index.native.js.map +1 -1
- package/dist/esm/components/TableInput/shared.mjs +34 -1
- package/dist/esm/components/TableInput/shared.mjs.map +1 -1
- package/dist/esm/components/TableInput/shared.native.js +34 -1
- package/dist/esm/components/TableInput/shared.native.js.map +1 -1
- package/dist/esm/hooks/useDataTable.mjs +33 -2
- package/dist/esm/hooks/useDataTable.mjs.map +1 -1
- package/dist/esm/hooks/useDataTable.native.js +41 -2
- package/dist/esm/hooks/useDataTable.native.js.map +1 -1
- package/dist/esm/hooks/useInfiniteRows.mjs +20 -3
- package/dist/esm/hooks/useInfiniteRows.mjs.map +1 -1
- package/dist/esm/hooks/useInfiniteRows.native.js +20 -3
- package/dist/esm/hooks/useInfiniteRows.native.js.map +1 -1
- package/dist/esm/index.mjs +2 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +2 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/utils/filterUtils.mjs +12 -5
- package/dist/esm/utils/filterUtils.mjs.map +1 -1
- package/dist/esm/utils/filterUtils.native.js +20 -5
- package/dist/esm/utils/filterUtils.native.js.map +1 -1
- package/dist/jsx/components/ChildTable/index.mjs +2 -1
- package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
- package/dist/jsx/components/ChildTable/index.native.js +2 -1
- package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
- package/dist/jsx/components/ColumnHeaderFilter/index.mjs +17 -9
- package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
- package/dist/jsx/components/ColumnHeaderFilter/index.native.js +32 -11
- package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
- package/dist/jsx/components/DataTable/DataTableDocumentList.mjs +196 -0
- package/dist/jsx/components/DataTable/DataTableDocumentList.mjs.map +1 -0
- package/dist/jsx/components/DataTable/DataTableDocumentList.native.js +237 -0
- package/dist/jsx/components/DataTable/DataTableDocumentList.native.js.map +1 -0
- package/dist/jsx/components/DataTable/DataTableMobileCards.mjs +5 -2
- package/dist/jsx/components/DataTable/DataTableMobileCards.mjs.map +1 -1
- package/dist/jsx/components/DataTable/DataTableMobileCards.native.js +6 -2
- package/dist/jsx/components/DataTable/DataTableMobileCards.native.js.map +1 -1
- package/dist/jsx/components/DataTable/DataTableRoot.mjs +93 -42
- package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
- package/dist/jsx/components/DataTable/DataTableRoot.native.js +97 -43
- package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
- package/dist/jsx/components/DataTable/DataTableVirtualized.mjs +8 -2
- package/dist/jsx/components/DataTable/DataTableVirtualized.mjs.map +1 -1
- package/dist/jsx/components/DataTable/DataTableVirtualized.native.js +9 -3
- package/dist/jsx/components/DataTable/DataTableVirtualized.native.js.map +1 -1
- package/dist/jsx/components/DataTable/documentListSlots.mjs +33 -0
- package/dist/jsx/components/DataTable/documentListSlots.mjs.map +1 -0
- package/dist/jsx/components/DataTable/documentListSlots.native.js +85 -0
- package/dist/jsx/components/DataTable/documentListSlots.native.js.map +1 -0
- package/dist/jsx/components/DataTable/index.native.js +74 -59
- package/dist/jsx/components/DataTable/index.native.js.map +1 -1
- package/dist/jsx/components/DataTable/rowStateChrome.mjs +28 -0
- package/dist/jsx/components/DataTable/rowStateChrome.mjs.map +1 -0
- package/dist/jsx/components/DataTable/rowStateChrome.native.js +59 -0
- package/dist/jsx/components/DataTable/rowStateChrome.native.js.map +1 -0
- package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +25 -4
- package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
- package/dist/jsx/components/DataTableCell/CellModalEditor.native.js +6 -1
- package/dist/jsx/components/DataTableCell/CellModalEditor.native.js.map +1 -1
- package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs +9 -2
- package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
- package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js +11 -2
- package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
- package/dist/jsx/components/DataTableCell/index.mjs +75 -64
- package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableCell/index.native.js +94 -82
- package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableColumnPinning/index.mjs +54 -37
- package/dist/jsx/components/DataTableColumnPinning/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableColumnPinning/index.native.js +59 -38
- package/dist/jsx/components/DataTableColumnPinning/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableDateFilter/index.mjs +34 -15
- package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableDateFilter/index.native.js +33 -12
- package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableExport/index.mjs +36 -8
- package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableExport/index.native.js +42 -7
- package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableFacetMenu/index.mjs +115 -0
- package/dist/jsx/components/DataTableFacetMenu/index.mjs.map +1 -0
- package/dist/jsx/components/DataTableFacetMenu/index.native.js +156 -0
- package/dist/jsx/components/DataTableFacetMenu/index.native.js.map +1 -0
- package/dist/jsx/components/DataTableFilterButton/index.mjs +54 -35
- package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableFilterButton/index.native.js +63 -40
- package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs +118 -0
- package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
- package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js +148 -0
- package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
- package/dist/jsx/components/DataTableFilterChips/index.mjs +9 -32
- package/dist/jsx/components/DataTableFilterChips/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableFilterChips/index.native.js +9 -32
- package/dist/jsx/components/DataTableFilterChips/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableFilters/index.mjs +149 -506
- package/dist/jsx/components/DataTableFilters/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableFilters/index.native.js +171 -544
- package/dist/jsx/components/DataTableFilters/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableGrouping/index.mjs +275 -110
- package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableGrouping/index.native.js +310 -157
- package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
- package/dist/jsx/components/DataTablePagination/index.mjs +148 -96
- package/dist/jsx/components/DataTablePagination/index.mjs.map +1 -1
- package/dist/jsx/components/DataTablePagination/index.native.js +159 -106
- package/dist/jsx/components/DataTablePagination/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableSearch/index.mjs +256 -215
- package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableSearch/index.native.js +292 -243
- package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableToolbar/index.mjs +145 -119
- package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableToolbar/index.native.js +163 -148
- package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
- package/dist/jsx/components/DataTableViewOptions/index.mjs +26 -22
- package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
- package/dist/jsx/components/DataTableViewOptions/index.native.js +6 -4
- package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
- package/dist/jsx/components/SimpleTable/index.mjs +338 -48
- package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
- package/dist/jsx/components/SimpleTable/index.native.js +356 -48
- package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
- package/dist/jsx/components/TableInput/index.mjs +150 -41
- package/dist/jsx/components/TableInput/index.mjs.map +1 -1
- package/dist/jsx/components/TableInput/index.native.js +54 -38
- package/dist/jsx/components/TableInput/index.native.js.map +1 -1
- package/dist/jsx/components/TableInput/shared.mjs +34 -1
- package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
- package/dist/jsx/components/TableInput/shared.native.js +35 -0
- package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
- package/dist/jsx/hooks/useDataTable.mjs +33 -2
- package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
- package/dist/jsx/hooks/useDataTable.native.js +41 -2
- package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
- package/dist/jsx/hooks/useInfiniteRows.mjs +20 -3
- package/dist/jsx/hooks/useInfiniteRows.mjs.map +1 -1
- package/dist/jsx/hooks/useInfiniteRows.native.js +20 -3
- package/dist/jsx/hooks/useInfiniteRows.native.js.map +1 -1
- package/dist/jsx/index.js +2 -1
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +2 -1
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +2 -0
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/utils/filterUtils.mjs +12 -5
- package/dist/jsx/utils/filterUtils.mjs.map +1 -1
- package/dist/jsx/utils/filterUtils.native.js +20 -5
- package/dist/jsx/utils/filterUtils.native.js.map +1 -1
- package/package.json +16 -16
- package/src/components/ChildTable/index.tsx +1 -0
- package/src/components/ColumnHeaderFilter/ColumnHeaderFilter.spec.tsx +85 -0
- package/src/components/ColumnHeaderFilter/index.tsx +28 -10
- package/src/components/DataTable/DataTable.stories.tsx +30 -0
- package/src/components/DataTable/DataTableDocumentList.tsx +224 -0
- package/src/components/DataTable/DataTableMobileCards.tsx +20 -8
- package/src/components/DataTable/DataTableRoot.tsx +135 -58
- package/src/components/DataTable/DataTableVirtualized.tsx +8 -11
- package/src/components/DataTable/cardLayout.spec.tsx +89 -0
- package/src/components/DataTable/documentListSlots.ts +57 -0
- package/src/components/DataTable/index.native.tsx +76 -50
- package/src/components/DataTable/keepPreviousData.spec.tsx +137 -0
- package/src/components/DataTable/rowRing.spec.tsx +118 -0
- package/src/components/DataTable/rowStateChrome.ts +38 -0
- package/src/components/DataTableCell/CellModalEditor.native.tsx +4 -0
- package/src/components/DataTableCell/CellModalEditor.tsx +31 -3
- package/src/components/DataTableCell/CellOptionsEditor.tsx +29 -12
- package/src/components/DataTableCell/DataTableCell.stories.tsx +3 -3
- package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +131 -4
- package/src/components/DataTableCell/dataTableCell.spec.tsx +36 -1
- package/src/components/DataTableCell/index.tsx +121 -86
- package/src/components/DataTableColumnPinning/DataTableColumnPinning.spec.tsx +66 -0
- package/src/components/DataTableColumnPinning/index.tsx +32 -17
- package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +9 -1
- package/src/components/DataTableDateFilter/dateFilterZones.spec.ts +316 -0
- package/src/components/DataTableDateFilter/index.tsx +42 -22
- package/src/components/DataTableExport/exportDateZones.spec.tsx +348 -0
- package/src/components/DataTableExport/index.tsx +107 -63
- package/src/components/DataTableFacetMenu/DataTableFacetMenu.spec.tsx +264 -0
- package/src/components/DataTableFacetMenu/DataTableFacetMenu.stories.tsx +212 -0
- package/src/components/DataTableFacetMenu/index.tsx +202 -0
- package/src/components/DataTableFilterButton/index.tsx +66 -49
- package/src/components/DataTableFilterChips/DataTableFilterChips.spec.tsx +22 -0
- package/src/components/DataTableFilterChips/FilterChip.tsx +122 -0
- package/src/components/DataTableFilterChips/index.tsx +13 -29
- package/src/components/DataTableFilters/DataTableFilters.spec.tsx +56 -0
- package/src/components/DataTableFilters/index.tsx +169 -584
- package/src/components/DataTableGrouping/DataTableGrouping.spec.tsx +85 -0
- package/src/components/DataTableGrouping/index.tsx +270 -130
- package/src/components/DataTablePagination/DataTablePagination.spec.tsx +79 -4
- package/src/components/DataTablePagination/index.tsx +168 -112
- package/src/components/DataTableSearch/DataTableSearch.spec.tsx +40 -0
- package/src/components/DataTableSearch/DataTableSearch.stories.tsx +1 -1
- package/src/components/DataTableSearch/index.tsx +192 -163
- package/src/components/DataTableToolbar/DataTableToolbar.spec.tsx +48 -18
- package/src/components/DataTableToolbar/DataTableToolbar.stories.tsx +5 -45
- package/src/components/DataTableToolbar/index.tsx +128 -99
- package/src/components/DataTableViewOptions/index.tsx +29 -22
- package/src/components/SimpleTable/SimpleTable.stories.tsx +29 -5
- package/src/components/SimpleTable/index.tsx +442 -61
- package/src/components/SimpleTable/simpleTable.spec.tsx +140 -12
- package/src/components/TableInput/index.native.tsx +91 -81
- package/src/components/TableInput/index.tsx +191 -50
- package/src/components/TableInput/shared.ts +57 -0
- package/src/components/TableInput/tableInput.spec.tsx +104 -0
- package/src/hooks/useDataTable.spec.ts +100 -3
- package/src/hooks/useDataTable.ts +44 -1
- package/src/hooks/useInfiniteRows.spec.tsx +37 -0
- package/src/hooks/useInfiniteRows.ts +34 -4
- package/src/index.ts +7 -0
- package/src/types.ts +54 -3
- package/src/utils/filterUtils.ts +27 -5
- package/types/components/ChildTable/index.d.ts.map +1 -1
- package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
- package/types/components/DataTable/DataTableDocumentList.d.ts +32 -0
- package/types/components/DataTable/DataTableDocumentList.d.ts.map +1 -0
- package/types/components/DataTable/DataTableMobileCards.d.ts +3 -1
- package/types/components/DataTable/DataTableMobileCards.d.ts.map +1 -1
- package/types/components/DataTable/DataTableRoot.d.ts +1 -1
- package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
- package/types/components/DataTable/DataTableVirtualized.d.ts +1 -2
- package/types/components/DataTable/DataTableVirtualized.d.ts.map +1 -1
- package/types/components/DataTable/documentListSlots.d.ts +26 -0
- package/types/components/DataTable/documentListSlots.d.ts.map +1 -0
- package/types/components/DataTable/index.native.d.ts +1 -1
- package/types/components/DataTable/index.native.d.ts.map +1 -1
- package/types/components/DataTable/rowStateChrome.d.ts +18 -0
- package/types/components/DataTable/rowStateChrome.d.ts.map +1 -0
- package/types/components/DataTableCell/CellModalEditor.d.ts +6 -1
- package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
- package/types/components/DataTableCell/CellModalEditor.native.d.ts +1 -1
- package/types/components/DataTableCell/CellModalEditor.native.d.ts.map +1 -1
- package/types/components/DataTableCell/CellOptionsEditor.d.ts +11 -3
- package/types/components/DataTableCell/CellOptionsEditor.d.ts.map +1 -1
- package/types/components/DataTableCell/index.d.ts +1 -1
- package/types/components/DataTableCell/index.d.ts.map +1 -1
- package/types/components/DataTableColumnPinning/index.d.ts.map +1 -1
- package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
- package/types/components/DataTableExport/index.d.ts +17 -6
- package/types/components/DataTableExport/index.d.ts.map +1 -1
- package/types/components/DataTableFacetMenu/index.d.ts +84 -0
- package/types/components/DataTableFacetMenu/index.d.ts.map +1 -0
- package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
- package/types/components/DataTableFilterChips/FilterChip.d.ts +15 -0
- package/types/components/DataTableFilterChips/FilterChip.d.ts.map +1 -0
- package/types/components/DataTableFilterChips/index.d.ts +5 -0
- package/types/components/DataTableFilterChips/index.d.ts.map +1 -1
- package/types/components/DataTableFilters/index.d.ts +11 -0
- package/types/components/DataTableFilters/index.d.ts.map +1 -1
- package/types/components/DataTableGrouping/index.d.ts.map +1 -1
- package/types/components/DataTablePagination/index.d.ts +5 -0
- package/types/components/DataTablePagination/index.d.ts.map +1 -1
- package/types/components/DataTableSearch/index.d.ts.map +1 -1
- package/types/components/DataTableToolbar/index.d.ts +2 -0
- package/types/components/DataTableToolbar/index.d.ts.map +1 -1
- package/types/components/SimpleTable/index.d.ts +27 -5
- package/types/components/SimpleTable/index.d.ts.map +1 -1
- package/types/components/TableInput/index.d.ts +6 -1
- package/types/components/TableInput/index.d.ts.map +1 -1
- package/types/components/TableInput/index.native.d.ts +6 -1
- package/types/components/TableInput/index.native.d.ts.map +1 -1
- package/types/components/TableInput/shared.d.ts +38 -0
- package/types/components/TableInput/shared.d.ts.map +1 -1
- package/types/hooks/useDataTable.d.ts +1 -1
- package/types/hooks/useDataTable.d.ts.map +1 -1
- package/types/hooks/useInfiniteRows.d.ts +8 -1
- package/types/hooks/useInfiniteRows.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/types.d.ts +54 -3
- package/types/types.d.ts.map +1 -1
- package/types/utils/filterUtils.d.ts.map +1 -1
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date filtering across timezones, for the case the rest of the suite never
|
|
3
|
+
* exercises: rows carrying a DATE-ONLY value.
|
|
4
|
+
*
|
|
5
|
+
* Every fixture elsewhere in this folder stamps rows with `toISOString()`, so
|
|
6
|
+
* both sides of every comparison were full instants and the filter looked
|
|
7
|
+
* correct. A Frappe `Date` column — and any CSV, API or fixture that stores a
|
|
8
|
+
* calendar day — sends bare `YYYY-MM-DD`, which ECMA-262 parses as UTC
|
|
9
|
+
* midnight. The relative windows (`isToday`, `isThisWeek`, …) are built from
|
|
10
|
+
* LOCAL parts, so the two sides disagreed by a day and the filter dropped or
|
|
11
|
+
* admitted a whole day of rows.
|
|
12
|
+
*
|
|
13
|
+
* Each matrix below is paired with a negative control that runs the old
|
|
14
|
+
* formulation through the identical expectation, asserting the exact set of
|
|
15
|
+
* rows where it disagrees. That proves the fix discriminates, and that the
|
|
16
|
+
* matrix is not passing vacuously on instants where every zone lands on the
|
|
17
|
+
* same day.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
21
|
+
import { applyFilterToValue } from "../../utils/filterUtils";
|
|
22
|
+
import { applyDateFilter, resolveDateFilterRange } from "./index";
|
|
23
|
+
|
|
24
|
+
// Spans UTC, two negative offsets and the far positive extreme (UTC+14), so a
|
|
25
|
+
// comparison that leans on the host zone fails somewhere in this list.
|
|
26
|
+
const ZONES = ["UTC", "America/Los_Angeles", "America/New_York", "Pacific/Kiritimati"] as const;
|
|
27
|
+
|
|
28
|
+
function inZone<T>(timeZone: string, read: () => T): T {
|
|
29
|
+
const previous = process.env.TZ;
|
|
30
|
+
process.env.TZ = timeZone;
|
|
31
|
+
try {
|
|
32
|
+
return read();
|
|
33
|
+
} finally {
|
|
34
|
+
if (previous === undefined) delete process.env.TZ;
|
|
35
|
+
else process.env.TZ = previous;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Two frozen instants, because the span from UTC−7 to UTC+14 is 21 hours —
|
|
41
|
+
* under a day — so no single instant has UTC disagreeing with both extremes.
|
|
42
|
+
* `A` is late evening in Los Angeles; `B` is the small hours in Kiritimati.
|
|
43
|
+
*/
|
|
44
|
+
const INSTANT_A = "2026-08-15T05:00:00Z";
|
|
45
|
+
const INSTANT_B = "2026-08-14T11:00:00Z";
|
|
46
|
+
|
|
47
|
+
/** The local calendar day each instant names, per zone. */
|
|
48
|
+
const LOCAL_TODAY: Record<string, Record<string, string>> = {
|
|
49
|
+
[INSTANT_A]: {
|
|
50
|
+
UTC: "2026-08-15",
|
|
51
|
+
"America/Los_Angeles": "2026-08-14",
|
|
52
|
+
"America/New_York": "2026-08-15",
|
|
53
|
+
"Pacific/Kiritimati": "2026-08-15",
|
|
54
|
+
},
|
|
55
|
+
[INSTANT_B]: {
|
|
56
|
+
UTC: "2026-08-14",
|
|
57
|
+
"America/Los_Angeles": "2026-08-14",
|
|
58
|
+
"America/New_York": "2026-08-14",
|
|
59
|
+
"Pacific/Kiritimati": "2026-08-15",
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/** Rows are bare calendar days, the shape a Frappe `Date` column sends. */
|
|
64
|
+
const DATE_ONLY_ROWS = ["2026-08-13", "2026-08-14", "2026-08-15", "2026-08-16"].map((day) => ({
|
|
65
|
+
id: day,
|
|
66
|
+
due: day,
|
|
67
|
+
}));
|
|
68
|
+
|
|
69
|
+
/** The row-parsing formulation this fix replaced, kept as the control. */
|
|
70
|
+
const naiveApplyIsToday = (rows: typeof DATE_ONLY_ROWS) => {
|
|
71
|
+
const now = new Date();
|
|
72
|
+
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
73
|
+
return rows.filter((row) => new Date(row.due).toDateString() === today.toDateString());
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
afterEach(() => {
|
|
77
|
+
vi.useRealTimers();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe("applyDateFilter — a date-only row is the day it names", () => {
|
|
81
|
+
it("isToday matches the local calendar day at both instants, in every zone", () => {
|
|
82
|
+
const rows = [INSTANT_A, INSTANT_B].flatMap((instant) =>
|
|
83
|
+
ZONES.map((timeZone) =>
|
|
84
|
+
inZone(timeZone, () => {
|
|
85
|
+
vi.useFakeTimers();
|
|
86
|
+
vi.setSystemTime(new Date(instant));
|
|
87
|
+
const matched = applyDateFilter(DATE_ONLY_ROWS, "due", { operator: "isToday" });
|
|
88
|
+
vi.useRealTimers();
|
|
89
|
+
return { instant, timeZone, matched: matched.map((row) => row.id) };
|
|
90
|
+
}),
|
|
91
|
+
),
|
|
92
|
+
);
|
|
93
|
+
expect(rows).toEqual(
|
|
94
|
+
rows.map(({ instant, timeZone }) => ({
|
|
95
|
+
instant,
|
|
96
|
+
timeZone,
|
|
97
|
+
matched: [LOCAL_TODAY[instant][timeZone]],
|
|
98
|
+
})),
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("negative control: the UTC-midnight parse returns TOMORROW's row west of UTC", () => {
|
|
103
|
+
const disagreements = [INSTANT_A, INSTANT_B]
|
|
104
|
+
.flatMap((instant) =>
|
|
105
|
+
ZONES.map((timeZone) =>
|
|
106
|
+
inZone(timeZone, () => {
|
|
107
|
+
vi.useFakeTimers();
|
|
108
|
+
vi.setSystemTime(new Date(instant));
|
|
109
|
+
const matched = naiveApplyIsToday(DATE_ONLY_ROWS).map((row) => row.id);
|
|
110
|
+
vi.useRealTimers();
|
|
111
|
+
const shouldBe = [LOCAL_TODAY[instant][timeZone]];
|
|
112
|
+
return matched.join() === shouldBe.join()
|
|
113
|
+
? null
|
|
114
|
+
: { instant, timeZone, matched, shouldBe };
|
|
115
|
+
}),
|
|
116
|
+
),
|
|
117
|
+
)
|
|
118
|
+
.filter(Boolean);
|
|
119
|
+
// A date-only row parsed as UTC midnight lands mid-afternoon of the
|
|
120
|
+
// PREVIOUS local day in any negative-offset zone, so "today" picks up the
|
|
121
|
+
// row stamped tomorrow and misses the one stamped today. East of UTC the
|
|
122
|
+
// instant stays inside the same local day (the offset is under 24h), which
|
|
123
|
+
// is why this only ever broke the Americas — and why it shipped.
|
|
124
|
+
expect(disagreements).toEqual([
|
|
125
|
+
{
|
|
126
|
+
instant: INSTANT_A,
|
|
127
|
+
timeZone: "America/Los_Angeles",
|
|
128
|
+
matched: ["2026-08-15"],
|
|
129
|
+
shouldBe: ["2026-08-14"],
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
instant: INSTANT_A,
|
|
133
|
+
timeZone: "America/New_York",
|
|
134
|
+
matched: ["2026-08-16"],
|
|
135
|
+
shouldBe: ["2026-08-15"],
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
instant: INSTANT_B,
|
|
139
|
+
timeZone: "America/Los_Angeles",
|
|
140
|
+
matched: ["2026-08-15"],
|
|
141
|
+
shouldBe: ["2026-08-14"],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
instant: INSTANT_B,
|
|
145
|
+
timeZone: "America/New_York",
|
|
146
|
+
matched: ["2026-08-15"],
|
|
147
|
+
shouldBe: ["2026-08-14"],
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("host guard: process.env.TZ actually moves the local reading in-process", () => {
|
|
153
|
+
// Without this a host ignoring TZ would collapse `inZone` to a no-op and
|
|
154
|
+
// the matrices above would stop meaning anything.
|
|
155
|
+
expect(inZone("America/Los_Angeles", () => new Date(INSTANT_A).getDate())).toBe(14);
|
|
156
|
+
expect(inZone("Pacific/Kiritimati", () => new Date(INSTANT_B).getDate())).toBe(15);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe("applyDateFilter — an instant comparand against a date-only row", () => {
|
|
161
|
+
/** The shipped "Last 7 Days" preset: a rolling window of real instants. */
|
|
162
|
+
const lastSevenDays = () => ({
|
|
163
|
+
operator: "isBetween" as const,
|
|
164
|
+
values: [new Date(Date.now() - 7 * 86_400_000).toISOString(), new Date().toISOString()] as [
|
|
165
|
+
string,
|
|
166
|
+
string,
|
|
167
|
+
],
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("includes today's row in every zone", () => {
|
|
171
|
+
const rows = [INSTANT_A, INSTANT_B].flatMap((instant) =>
|
|
172
|
+
ZONES.map((timeZone) =>
|
|
173
|
+
inZone(timeZone, () => {
|
|
174
|
+
vi.useFakeTimers();
|
|
175
|
+
vi.setSystemTime(new Date(instant));
|
|
176
|
+
const matched = applyDateFilter(DATE_ONLY_ROWS, "due", lastSevenDays());
|
|
177
|
+
vi.useRealTimers();
|
|
178
|
+
return {
|
|
179
|
+
instant,
|
|
180
|
+
timeZone,
|
|
181
|
+
includesToday: matched.some((row) => row.id === LOCAL_TODAY[instant][timeZone]),
|
|
182
|
+
};
|
|
183
|
+
}),
|
|
184
|
+
),
|
|
185
|
+
);
|
|
186
|
+
expect(rows).toEqual(rows.map((row) => ({ ...row, includesToday: true })));
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("negative control: UTC midnight puts today's row in the FUTURE east of UTC", () => {
|
|
190
|
+
// At UTC+14 before 14:00 local, UTC midnight of today's date is still
|
|
191
|
+
// ahead of `now`, so a window ending at `now` excluded the very day the
|
|
192
|
+
// user is looking at. This is the mirror of the negative-offset symptom
|
|
193
|
+
// above, and the pair is why both instants are needed.
|
|
194
|
+
const excluded = [INSTANT_A, INSTANT_B]
|
|
195
|
+
.flatMap((instant) =>
|
|
196
|
+
ZONES.map((timeZone) =>
|
|
197
|
+
inZone(timeZone, () => {
|
|
198
|
+
vi.useFakeTimers();
|
|
199
|
+
vi.setSystemTime(new Date(instant));
|
|
200
|
+
const { values } = lastSevenDays();
|
|
201
|
+
const today = LOCAL_TODAY[instant][timeZone];
|
|
202
|
+
const naive = new Date(today);
|
|
203
|
+
const inWindow = naive >= new Date(values[0]) && naive <= new Date(values[1]);
|
|
204
|
+
vi.useRealTimers();
|
|
205
|
+
return inWindow ? null : { instant, timeZone, droppedRow: today };
|
|
206
|
+
}),
|
|
207
|
+
),
|
|
208
|
+
)
|
|
209
|
+
.filter(Boolean);
|
|
210
|
+
expect(excluded).toEqual([
|
|
211
|
+
{ instant: INSTANT_B, timeZone: "Pacific/Kiritimati", droppedRow: "2026-08-15" },
|
|
212
|
+
]);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe("resolveDateFilterRange — the pickers open on the day the filter names", () => {
|
|
217
|
+
it("resolves a date-only comparand to local midnight in every zone", () => {
|
|
218
|
+
for (const timeZone of ZONES) {
|
|
219
|
+
const resolved = inZone(timeZone, () => {
|
|
220
|
+
const { start } = resolveDateFilterRange({ operator: "is", value: "2026-08-15" });
|
|
221
|
+
return {
|
|
222
|
+
timeZone,
|
|
223
|
+
day: start?.getDate(),
|
|
224
|
+
month: start?.getMonth(),
|
|
225
|
+
hour: start?.getHours(),
|
|
226
|
+
};
|
|
227
|
+
});
|
|
228
|
+
expect(resolved).toEqual({ timeZone, day: 15, month: 7, hour: 0 });
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it("negative control: the bare parse opens the picker a day early west of UTC", () => {
|
|
233
|
+
expect(inZone("America/Los_Angeles", () => new Date("2026-08-15").getDate())).toBe(14);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it("leaves an instant comparand on its instant", () => {
|
|
237
|
+
// Genuine datetimes keep the timezone-aware parse — only the date-only
|
|
238
|
+
// branch moved.
|
|
239
|
+
const iso = "2026-08-15T05:00:00Z";
|
|
240
|
+
for (const timeZone of ZONES) {
|
|
241
|
+
expect(
|
|
242
|
+
inZone(timeZone, () =>
|
|
243
|
+
resolveDateFilterRange({ operator: "is", value: iso }).start?.toISOString(),
|
|
244
|
+
),
|
|
245
|
+
).toBe("2026-08-15T05:00:00.000Z");
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
describe("applyFilterToValue — a date-only row against a locally-picked comparand", () => {
|
|
251
|
+
// The filter UI hands back `Date` objects built from local parts while rows
|
|
252
|
+
// carry date-only strings, so the two sides used to be parsed differently.
|
|
253
|
+
const sameDayPick = () => new Date(2026, 7, 15);
|
|
254
|
+
|
|
255
|
+
it("orders a row on the comparand's own day as on-or-after AND on-or-before", () => {
|
|
256
|
+
for (const timeZone of ZONES) {
|
|
257
|
+
expect(
|
|
258
|
+
inZone(timeZone, () => ({
|
|
259
|
+
timeZone,
|
|
260
|
+
onOrAfter: applyFilterToValue(
|
|
261
|
+
"2026-08-15",
|
|
262
|
+
{ operator: "isOnOrAfter", value: sameDayPick() },
|
|
263
|
+
"date",
|
|
264
|
+
),
|
|
265
|
+
onOrBefore: applyFilterToValue(
|
|
266
|
+
"2026-08-15",
|
|
267
|
+
{ operator: "isOnOrBefore", value: sameDayPick() },
|
|
268
|
+
"date",
|
|
269
|
+
),
|
|
270
|
+
})),
|
|
271
|
+
).toEqual({ timeZone, onOrAfter: true, onOrBefore: true });
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it("negative control: parsing the two sides apart breaks in BOTH hemispheres", () => {
|
|
276
|
+
const naive = (value: string, filterVal: Date, op: "after" | "before") =>
|
|
277
|
+
op === "after"
|
|
278
|
+
? new Date(value) >= new Date(filterVal)
|
|
279
|
+
: new Date(value) <= new Date(filterVal);
|
|
280
|
+
const disagreements = ZONES.flatMap((timeZone) =>
|
|
281
|
+
inZone(timeZone, () => {
|
|
282
|
+
const rows: unknown[] = [];
|
|
283
|
+
if (!naive("2026-08-15", sameDayPick(), "after")) {
|
|
284
|
+
rows.push({ timeZone, operator: "isOnOrAfter", matched: false });
|
|
285
|
+
}
|
|
286
|
+
if (!naive("2026-08-15", sameDayPick(), "before")) {
|
|
287
|
+
rows.push({ timeZone, operator: "isOnOrBefore", matched: false });
|
|
288
|
+
}
|
|
289
|
+
return rows;
|
|
290
|
+
}),
|
|
291
|
+
);
|
|
292
|
+
// West of UTC the UTC-midnight row sorts BEFORE local midnight of the same
|
|
293
|
+
// day, so "on or after today" loses it; east of UTC it sorts after, so
|
|
294
|
+
// "on or before today" loses it. UTC agrees with both, which is why the
|
|
295
|
+
// comparison read as correct wherever it was written.
|
|
296
|
+
expect(disagreements).toEqual([
|
|
297
|
+
{ timeZone: "America/Los_Angeles", operator: "isOnOrAfter", matched: false },
|
|
298
|
+
{ timeZone: "America/New_York", operator: "isOnOrAfter", matched: false },
|
|
299
|
+
{ timeZone: "Pacific/Kiritimati", operator: "isOnOrBefore", matched: false },
|
|
300
|
+
]);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it("keeps ordering genuine instants untouched", () => {
|
|
304
|
+
for (const timeZone of ZONES) {
|
|
305
|
+
expect(
|
|
306
|
+
inZone(timeZone, () =>
|
|
307
|
+
applyFilterToValue(
|
|
308
|
+
"2026-08-15T05:00:00Z",
|
|
309
|
+
{ operator: "isAfter", value: "2026-08-15T04:00:00Z" },
|
|
310
|
+
"date",
|
|
311
|
+
),
|
|
312
|
+
),
|
|
313
|
+
).toBe(true);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
});
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
ClockIcon,
|
|
7
7
|
XIcon,
|
|
8
8
|
} from "@phosphor-icons/react";
|
|
9
|
-
import { formatAbsoluteDate, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
9
|
+
import { formatAbsoluteDate, parseCalendarDate, useResolvedKnobs } from "@multiplatform.one/theme";
|
|
10
10
|
import React, { useState, useMemo } from "react";
|
|
11
11
|
import { Button, DatePicker } from "@multiplatform.one/forms";
|
|
12
12
|
import {
|
|
@@ -535,11 +535,9 @@ export function resolveDateFilterRange(
|
|
|
535
535
|
if (!filterValue) return { start: null, end: null };
|
|
536
536
|
const { operator, value, values } = filterValue;
|
|
537
537
|
const today = startOfDay(now);
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
return Number.isNaN(date.getTime()) ? null : date;
|
|
542
|
-
};
|
|
538
|
+
// Same day-grid parse applyDateFilter matches on, so the pickers open on the
|
|
539
|
+
// day a date-only comparand names rather than the UTC instant it would be.
|
|
540
|
+
const parsed = (iso?: string) => parseCalendarDate(iso);
|
|
543
541
|
const dayWindow = (offsetDays: number) => {
|
|
544
542
|
const day = new Date(today);
|
|
545
543
|
day.setDate(day.getDate() + offsetDays);
|
|
@@ -620,8 +618,13 @@ export function applyDateFilter<T>(
|
|
|
620
618
|
return operator === "isEmpty";
|
|
621
619
|
}
|
|
622
620
|
|
|
623
|
-
|
|
624
|
-
|
|
621
|
+
// Rows and comparands share the day-grid parse. A date-only "YYYY-MM-DD"
|
|
622
|
+
// names a calendar day, and `new Date()` reads that as UTC midnight — the
|
|
623
|
+
// previous local day west of UTC, mid-afternoon east of it — while every
|
|
624
|
+
// window below is built from local parts. Parsed apart, the two sides
|
|
625
|
+
// disagree by a day and the filter drops or admits a day of rows.
|
|
626
|
+
const itemDate = parseCalendarDate(itemValue as string);
|
|
627
|
+
if (!itemDate) {
|
|
625
628
|
return false;
|
|
626
629
|
}
|
|
627
630
|
|
|
@@ -629,20 +632,37 @@ export function applyDateFilter<T>(
|
|
|
629
632
|
const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
630
633
|
|
|
631
634
|
switch (operator) {
|
|
632
|
-
case "is":
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
case "
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
case "
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
635
|
+
case "is": {
|
|
636
|
+
const on = parseCalendarDate(value);
|
|
637
|
+
return on ? itemDate.toDateString() === on.toDateString() : false;
|
|
638
|
+
}
|
|
639
|
+
case "isNot": {
|
|
640
|
+
if (!value) return false;
|
|
641
|
+
const on = parseCalendarDate(value);
|
|
642
|
+
// An unusable comparand still excludes nothing, as it always did.
|
|
643
|
+
return !on || itemDate.toDateString() !== on.toDateString();
|
|
644
|
+
}
|
|
645
|
+
case "isBefore": {
|
|
646
|
+
const on = parseCalendarDate(value);
|
|
647
|
+
return on ? itemDate < on : false;
|
|
648
|
+
}
|
|
649
|
+
case "isAfter": {
|
|
650
|
+
const on = parseCalendarDate(value);
|
|
651
|
+
return on ? itemDate > on : false;
|
|
652
|
+
}
|
|
653
|
+
case "isOnOrBefore": {
|
|
654
|
+
const on = parseCalendarDate(value);
|
|
655
|
+
return on ? itemDate <= on : false;
|
|
656
|
+
}
|
|
657
|
+
case "isOnOrAfter": {
|
|
658
|
+
const on = parseCalendarDate(value);
|
|
659
|
+
return on ? itemDate >= on : false;
|
|
660
|
+
}
|
|
661
|
+
case "isBetween": {
|
|
662
|
+
const from = parseCalendarDate(values?.[0]);
|
|
663
|
+
const to = parseCalendarDate(values?.[1]);
|
|
664
|
+
return from && to ? itemDate >= from && itemDate <= to : false;
|
|
665
|
+
}
|
|
646
666
|
case "isToday":
|
|
647
667
|
return itemDate.toDateString() === today.toDateString();
|
|
648
668
|
case "isYesterday": {
|