@multiplatform.one/table 6.7.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.
Files changed (473) hide show
  1. package/README.md +4 -3
  2. package/dist/cjs/components/ChildTable/index.cjs +2 -1
  3. package/dist/cjs/components/ChildTable/index.native.js +2 -1
  4. package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
  5. package/dist/cjs/components/ColumnHeaderFilter/index.cjs +17 -9
  6. package/dist/cjs/components/ColumnHeaderFilter/index.native.js +32 -11
  7. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableDocumentList.cjs +222 -0
  9. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js +237 -0
  10. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  11. package/dist/cjs/components/DataTable/DataTableMobileCards.cjs +5 -2
  12. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js +6 -2
  13. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  14. package/dist/cjs/components/DataTable/DataTableRoot.cjs +92 -41
  15. package/dist/cjs/components/DataTable/DataTableRoot.native.js +97 -43
  16. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  17. package/dist/cjs/components/DataTable/DataTableVirtualized.cjs +8 -2
  18. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js +9 -3
  19. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  20. package/dist/cjs/components/DataTable/documentListSlots.cjs +59 -0
  21. package/dist/cjs/components/DataTable/documentListSlots.native.js +85 -0
  22. package/dist/cjs/components/DataTable/documentListSlots.native.js.map +1 -0
  23. package/dist/cjs/components/DataTable/index.native.js +74 -59
  24. package/dist/cjs/components/DataTable/index.native.js.map +1 -1
  25. package/dist/cjs/components/DataTable/rowStateChrome.cjs +55 -0
  26. package/dist/cjs/components/DataTable/rowStateChrome.native.js +59 -0
  27. package/dist/cjs/components/DataTable/rowStateChrome.native.js.map +1 -0
  28. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +24 -3
  29. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js +6 -1
  30. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  31. package/dist/cjs/components/DataTableCell/CellOptionsEditor.cjs +9 -2
  32. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  33. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  34. package/dist/cjs/components/DataTableCell/index.cjs +74 -63
  35. package/dist/cjs/components/DataTableCell/index.native.js +94 -82
  36. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  37. package/dist/cjs/components/DataTableColumnPinning/index.cjs +54 -37
  38. package/dist/cjs/components/DataTableColumnPinning/index.native.js +59 -38
  39. package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
  40. package/dist/cjs/components/DataTableDateFilter/index.cjs +33 -14
  41. package/dist/cjs/components/DataTableDateFilter/index.native.js +33 -12
  42. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  43. package/dist/cjs/components/DataTableExport/index.cjs +35 -7
  44. package/dist/cjs/components/DataTableExport/index.native.js +42 -7
  45. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  46. package/dist/cjs/components/DataTableFacetMenu/index.cjs +140 -0
  47. package/dist/cjs/components/DataTableFacetMenu/index.native.js +156 -0
  48. package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -0
  49. package/dist/cjs/components/DataTableFilterButton/index.cjs +51 -32
  50. package/dist/cjs/components/DataTableFilterButton/index.native.js +63 -40
  51. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  52. package/dist/cjs/components/DataTableFilterChips/FilterChip.cjs +143 -0
  53. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js +148 -0
  54. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  55. package/dist/cjs/components/DataTableFilterChips/index.cjs +9 -31
  56. package/dist/cjs/components/DataTableFilterChips/index.native.js +9 -32
  57. package/dist/cjs/components/DataTableFilterChips/index.native.js.map +1 -1
  58. package/dist/cjs/components/DataTableFilters/index.cjs +145 -502
  59. package/dist/cjs/components/DataTableFilters/index.native.js +171 -544
  60. package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
  61. package/dist/cjs/components/DataTableGrouping/index.cjs +273 -108
  62. package/dist/cjs/components/DataTableGrouping/index.native.js +310 -157
  63. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  64. package/dist/cjs/components/DataTablePagination/index.cjs +147 -95
  65. package/dist/cjs/components/DataTablePagination/index.native.js +159 -106
  66. package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
  67. package/dist/cjs/components/DataTableSearch/index.cjs +251 -210
  68. package/dist/cjs/components/DataTableSearch/index.native.js +292 -243
  69. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  70. package/dist/cjs/components/DataTableToolbar/index.cjs +141 -115
  71. package/dist/cjs/components/DataTableToolbar/index.native.js +163 -148
  72. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  73. package/dist/cjs/components/DataTableViewOptions/index.cjs +25 -21
  74. package/dist/cjs/components/DataTableViewOptions/index.native.js +6 -4
  75. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  76. package/dist/cjs/components/SimpleTable/index.cjs +336 -46
  77. package/dist/cjs/components/SimpleTable/index.native.js +356 -48
  78. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  79. package/dist/cjs/components/TableInput/index.cjs +147 -38
  80. package/dist/cjs/components/TableInput/index.native.js +54 -38
  81. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  82. package/dist/cjs/components/TableInput/shared.cjs +36 -1
  83. package/dist/cjs/components/TableInput/shared.native.js +35 -0
  84. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  85. package/dist/cjs/hooks/useDataTable.cjs +33 -2
  86. package/dist/cjs/hooks/useDataTable.native.js +41 -2
  87. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  88. package/dist/cjs/hooks/useInfiniteRows.cjs +20 -3
  89. package/dist/cjs/hooks/useInfiniteRows.native.js +20 -3
  90. package/dist/cjs/hooks/useInfiniteRows.native.js.map +1 -1
  91. package/dist/cjs/index.cjs +2 -0
  92. package/dist/cjs/index.native.js +2 -0
  93. package/dist/cjs/index.native.js.map +1 -1
  94. package/dist/cjs/utils/filterUtils.cjs +12 -5
  95. package/dist/cjs/utils/filterUtils.native.js +20 -5
  96. package/dist/cjs/utils/filterUtils.native.js.map +1 -1
  97. package/dist/esm/components/ChildTable/index.mjs +2 -1
  98. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  99. package/dist/esm/components/ChildTable/index.native.js +2 -1
  100. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  101. package/dist/esm/components/ColumnHeaderFilter/index.mjs +17 -9
  102. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  103. package/dist/esm/components/ColumnHeaderFilter/index.native.js +32 -11
  104. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  105. package/dist/esm/components/DataTable/DataTableDocumentList.mjs +196 -0
  106. package/dist/esm/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  107. package/dist/esm/components/DataTable/DataTableDocumentList.native.js +208 -0
  108. package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  109. package/dist/esm/components/DataTable/DataTableMobileCards.mjs +5 -2
  110. package/dist/esm/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  111. package/dist/esm/components/DataTable/DataTableMobileCards.native.js +6 -2
  112. package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  113. package/dist/esm/components/DataTable/DataTableRoot.mjs +93 -42
  114. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  115. package/dist/esm/components/DataTable/DataTableRoot.native.js +98 -44
  116. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  117. package/dist/esm/components/DataTable/DataTableVirtualized.mjs +8 -2
  118. package/dist/esm/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  119. package/dist/esm/components/DataTable/DataTableVirtualized.native.js +9 -3
  120. package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  121. package/dist/esm/components/DataTable/documentListSlots.mjs +33 -0
  122. package/dist/esm/components/DataTable/documentListSlots.mjs.map +1 -0
  123. package/dist/esm/components/DataTable/documentListSlots.native.js +56 -0
  124. package/dist/esm/components/DataTable/documentListSlots.native.js.map +1 -0
  125. package/dist/esm/components/DataTable/index.native.js +52 -37
  126. package/dist/esm/components/DataTable/index.native.js.map +1 -1
  127. package/dist/esm/components/DataTable/rowStateChrome.mjs +28 -0
  128. package/dist/esm/components/DataTable/rowStateChrome.mjs.map +1 -0
  129. package/dist/esm/components/DataTable/rowStateChrome.native.js +29 -0
  130. package/dist/esm/components/DataTable/rowStateChrome.native.js.map +1 -0
  131. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +25 -4
  132. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  133. package/dist/esm/components/DataTableCell/CellModalEditor.native.js +6 -1
  134. package/dist/esm/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  135. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  136. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  137. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  138. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  139. package/dist/esm/components/DataTableCell/index.mjs +75 -64
  140. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  141. package/dist/esm/components/DataTableCell/index.native.js +95 -83
  142. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  143. package/dist/esm/components/DataTableColumnPinning/index.mjs +54 -37
  144. package/dist/esm/components/DataTableColumnPinning/index.mjs.map +1 -1
  145. package/dist/esm/components/DataTableColumnPinning/index.native.js +59 -38
  146. package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
  147. package/dist/esm/components/DataTableDateFilter/index.mjs +34 -15
  148. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  149. package/dist/esm/components/DataTableDateFilter/index.native.js +34 -13
  150. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  151. package/dist/esm/components/DataTableExport/index.mjs +36 -8
  152. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  153. package/dist/esm/components/DataTableExport/index.native.js +43 -8
  154. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  155. package/dist/esm/components/DataTableFacetMenu/index.mjs +115 -0
  156. package/dist/esm/components/DataTableFacetMenu/index.mjs.map +1 -0
  157. package/dist/esm/components/DataTableFacetMenu/index.native.js +128 -0
  158. package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -0
  159. package/dist/esm/components/DataTableFilterButton/index.mjs +54 -35
  160. package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
  161. package/dist/esm/components/DataTableFilterButton/index.native.js +66 -43
  162. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  163. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs +118 -0
  164. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  165. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js +120 -0
  166. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  167. package/dist/esm/components/DataTableFilterChips/index.mjs +9 -32
  168. package/dist/esm/components/DataTableFilterChips/index.mjs.map +1 -1
  169. package/dist/esm/components/DataTableFilterChips/index.native.js +9 -33
  170. package/dist/esm/components/DataTableFilterChips/index.native.js.map +1 -1
  171. package/dist/esm/components/DataTableFilters/index.mjs +149 -506
  172. package/dist/esm/components/DataTableFilters/index.mjs.map +1 -1
  173. package/dist/esm/components/DataTableFilters/index.native.js +175 -548
  174. package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
  175. package/dist/esm/components/DataTableGrouping/index.mjs +275 -110
  176. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  177. package/dist/esm/components/DataTableGrouping/index.native.js +287 -134
  178. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  179. package/dist/esm/components/DataTablePagination/index.mjs +148 -96
  180. package/dist/esm/components/DataTablePagination/index.mjs.map +1 -1
  181. package/dist/esm/components/DataTablePagination/index.native.js +160 -107
  182. package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
  183. package/dist/esm/components/DataTableSearch/index.mjs +256 -215
  184. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  185. package/dist/esm/components/DataTableSearch/index.native.js +297 -248
  186. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  187. package/dist/esm/components/DataTableToolbar/index.mjs +145 -119
  188. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  189. package/dist/esm/components/DataTableToolbar/index.native.js +167 -152
  190. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  191. package/dist/esm/components/DataTableViewOptions/index.mjs +26 -22
  192. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  193. package/dist/esm/components/DataTableViewOptions/index.native.js +7 -5
  194. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  195. package/dist/esm/components/SimpleTable/index.mjs +338 -48
  196. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  197. package/dist/esm/components/SimpleTable/index.native.js +358 -50
  198. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  199. package/dist/esm/components/TableInput/index.mjs +150 -41
  200. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  201. package/dist/esm/components/TableInput/index.native.js +55 -39
  202. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  203. package/dist/esm/components/TableInput/shared.mjs +34 -1
  204. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  205. package/dist/esm/components/TableInput/shared.native.js +34 -1
  206. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  207. package/dist/esm/hooks/useDataTable.mjs +33 -2
  208. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  209. package/dist/esm/hooks/useDataTable.native.js +41 -2
  210. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  211. package/dist/esm/hooks/useInfiniteRows.mjs +20 -3
  212. package/dist/esm/hooks/useInfiniteRows.mjs.map +1 -1
  213. package/dist/esm/hooks/useInfiniteRows.native.js +20 -3
  214. package/dist/esm/hooks/useInfiniteRows.native.js.map +1 -1
  215. package/dist/esm/index.mjs +2 -1
  216. package/dist/esm/index.mjs.map +1 -1
  217. package/dist/esm/index.native.js +2 -1
  218. package/dist/esm/index.native.js.map +1 -1
  219. package/dist/esm/utils/filterUtils.mjs +12 -5
  220. package/dist/esm/utils/filterUtils.mjs.map +1 -1
  221. package/dist/esm/utils/filterUtils.native.js +20 -5
  222. package/dist/esm/utils/filterUtils.native.js.map +1 -1
  223. package/dist/jsx/components/ChildTable/index.mjs +2 -1
  224. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  225. package/dist/jsx/components/ChildTable/index.native.js +2 -1
  226. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  227. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +17 -9
  228. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  229. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +32 -11
  230. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  231. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs +196 -0
  232. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  233. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js +237 -0
  234. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  235. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs +5 -2
  236. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  237. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js +6 -2
  238. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  239. package/dist/jsx/components/DataTable/DataTableRoot.mjs +93 -42
  240. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  241. package/dist/jsx/components/DataTable/DataTableRoot.native.js +97 -43
  242. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  243. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs +8 -2
  244. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  245. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js +9 -3
  246. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  247. package/dist/jsx/components/DataTable/documentListSlots.mjs +33 -0
  248. package/dist/jsx/components/DataTable/documentListSlots.mjs.map +1 -0
  249. package/dist/jsx/components/DataTable/documentListSlots.native.js +85 -0
  250. package/dist/jsx/components/DataTable/documentListSlots.native.js.map +1 -0
  251. package/dist/jsx/components/DataTable/index.native.js +74 -59
  252. package/dist/jsx/components/DataTable/index.native.js.map +1 -1
  253. package/dist/jsx/components/DataTable/rowStateChrome.mjs +28 -0
  254. package/dist/jsx/components/DataTable/rowStateChrome.mjs.map +1 -0
  255. package/dist/jsx/components/DataTable/rowStateChrome.native.js +59 -0
  256. package/dist/jsx/components/DataTable/rowStateChrome.native.js.map +1 -0
  257. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +25 -4
  258. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  259. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js +6 -1
  260. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  261. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  262. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  263. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  264. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  265. package/dist/jsx/components/DataTableCell/index.mjs +75 -64
  266. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  267. package/dist/jsx/components/DataTableCell/index.native.js +94 -82
  268. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  269. package/dist/jsx/components/DataTableColumnPinning/index.mjs +54 -37
  270. package/dist/jsx/components/DataTableColumnPinning/index.mjs.map +1 -1
  271. package/dist/jsx/components/DataTableColumnPinning/index.native.js +59 -38
  272. package/dist/jsx/components/DataTableColumnPinning/index.native.js.map +1 -1
  273. package/dist/jsx/components/DataTableDateFilter/index.mjs +34 -15
  274. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  275. package/dist/jsx/components/DataTableDateFilter/index.native.js +33 -12
  276. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  277. package/dist/jsx/components/DataTableExport/index.mjs +36 -8
  278. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  279. package/dist/jsx/components/DataTableExport/index.native.js +42 -7
  280. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  281. package/dist/jsx/components/DataTableFacetMenu/index.mjs +115 -0
  282. package/dist/jsx/components/DataTableFacetMenu/index.mjs.map +1 -0
  283. package/dist/jsx/components/DataTableFacetMenu/index.native.js +156 -0
  284. package/dist/jsx/components/DataTableFacetMenu/index.native.js.map +1 -0
  285. package/dist/jsx/components/DataTableFilterButton/index.mjs +54 -35
  286. package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
  287. package/dist/jsx/components/DataTableFilterButton/index.native.js +63 -40
  288. package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
  289. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs +118 -0
  290. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  291. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js +148 -0
  292. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  293. package/dist/jsx/components/DataTableFilterChips/index.mjs +9 -32
  294. package/dist/jsx/components/DataTableFilterChips/index.mjs.map +1 -1
  295. package/dist/jsx/components/DataTableFilterChips/index.native.js +9 -32
  296. package/dist/jsx/components/DataTableFilterChips/index.native.js.map +1 -1
  297. package/dist/jsx/components/DataTableFilters/index.mjs +149 -506
  298. package/dist/jsx/components/DataTableFilters/index.mjs.map +1 -1
  299. package/dist/jsx/components/DataTableFilters/index.native.js +171 -544
  300. package/dist/jsx/components/DataTableFilters/index.native.js.map +1 -1
  301. package/dist/jsx/components/DataTableGrouping/index.mjs +275 -110
  302. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  303. package/dist/jsx/components/DataTableGrouping/index.native.js +310 -157
  304. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  305. package/dist/jsx/components/DataTablePagination/index.mjs +148 -96
  306. package/dist/jsx/components/DataTablePagination/index.mjs.map +1 -1
  307. package/dist/jsx/components/DataTablePagination/index.native.js +159 -106
  308. package/dist/jsx/components/DataTablePagination/index.native.js.map +1 -1
  309. package/dist/jsx/components/DataTableSearch/index.mjs +256 -215
  310. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  311. package/dist/jsx/components/DataTableSearch/index.native.js +292 -243
  312. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  313. package/dist/jsx/components/DataTableToolbar/index.mjs +145 -119
  314. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  315. package/dist/jsx/components/DataTableToolbar/index.native.js +163 -148
  316. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  317. package/dist/jsx/components/DataTableViewOptions/index.mjs +26 -22
  318. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  319. package/dist/jsx/components/DataTableViewOptions/index.native.js +6 -4
  320. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  321. package/dist/jsx/components/SimpleTable/index.mjs +338 -48
  322. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  323. package/dist/jsx/components/SimpleTable/index.native.js +356 -48
  324. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  325. package/dist/jsx/components/TableInput/index.mjs +150 -41
  326. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  327. package/dist/jsx/components/TableInput/index.native.js +54 -38
  328. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  329. package/dist/jsx/components/TableInput/shared.mjs +34 -1
  330. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  331. package/dist/jsx/components/TableInput/shared.native.js +35 -0
  332. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  333. package/dist/jsx/hooks/useDataTable.mjs +33 -2
  334. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  335. package/dist/jsx/hooks/useDataTable.native.js +41 -2
  336. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  337. package/dist/jsx/hooks/useInfiniteRows.mjs +20 -3
  338. package/dist/jsx/hooks/useInfiniteRows.mjs.map +1 -1
  339. package/dist/jsx/hooks/useInfiniteRows.native.js +20 -3
  340. package/dist/jsx/hooks/useInfiniteRows.native.js.map +1 -1
  341. package/dist/jsx/index.js +2 -1
  342. package/dist/jsx/index.js.map +1 -1
  343. package/dist/jsx/index.mjs +2 -1
  344. package/dist/jsx/index.mjs.map +1 -1
  345. package/dist/jsx/index.native.js +2 -0
  346. package/dist/jsx/index.native.js.map +1 -1
  347. package/dist/jsx/utils/filterUtils.mjs +12 -5
  348. package/dist/jsx/utils/filterUtils.mjs.map +1 -1
  349. package/dist/jsx/utils/filterUtils.native.js +20 -5
  350. package/dist/jsx/utils/filterUtils.native.js.map +1 -1
  351. package/package.json +15 -15
  352. package/src/components/ChildTable/index.tsx +1 -0
  353. package/src/components/ColumnHeaderFilter/ColumnHeaderFilter.spec.tsx +85 -0
  354. package/src/components/ColumnHeaderFilter/index.tsx +28 -10
  355. package/src/components/DataTable/DataTable.stories.tsx +30 -0
  356. package/src/components/DataTable/DataTableDocumentList.tsx +224 -0
  357. package/src/components/DataTable/DataTableMobileCards.tsx +20 -8
  358. package/src/components/DataTable/DataTableRoot.tsx +135 -58
  359. package/src/components/DataTable/DataTableVirtualized.tsx +8 -11
  360. package/src/components/DataTable/cardLayout.spec.tsx +89 -0
  361. package/src/components/DataTable/documentListSlots.ts +57 -0
  362. package/src/components/DataTable/index.native.tsx +76 -50
  363. package/src/components/DataTable/keepPreviousData.spec.tsx +137 -0
  364. package/src/components/DataTable/rowRing.spec.tsx +118 -0
  365. package/src/components/DataTable/rowStateChrome.ts +38 -0
  366. package/src/components/DataTableCell/CellModalEditor.native.tsx +4 -0
  367. package/src/components/DataTableCell/CellModalEditor.tsx +31 -3
  368. package/src/components/DataTableCell/CellOptionsEditor.tsx +29 -12
  369. package/src/components/DataTableCell/DataTableCell.stories.tsx +3 -3
  370. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +131 -4
  371. package/src/components/DataTableCell/dataTableCell.spec.tsx +36 -1
  372. package/src/components/DataTableCell/index.tsx +121 -86
  373. package/src/components/DataTableColumnPinning/DataTableColumnPinning.spec.tsx +66 -0
  374. package/src/components/DataTableColumnPinning/index.tsx +32 -17
  375. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +9 -1
  376. package/src/components/DataTableDateFilter/dateFilterZones.spec.ts +316 -0
  377. package/src/components/DataTableDateFilter/index.tsx +42 -22
  378. package/src/components/DataTableExport/exportDateZones.spec.tsx +348 -0
  379. package/src/components/DataTableExport/index.tsx +107 -63
  380. package/src/components/DataTableFacetMenu/DataTableFacetMenu.spec.tsx +264 -0
  381. package/src/components/DataTableFacetMenu/DataTableFacetMenu.stories.tsx +212 -0
  382. package/src/components/DataTableFacetMenu/index.tsx +202 -0
  383. package/src/components/DataTableFilterButton/index.tsx +66 -49
  384. package/src/components/DataTableFilterChips/DataTableFilterChips.spec.tsx +22 -0
  385. package/src/components/DataTableFilterChips/FilterChip.tsx +122 -0
  386. package/src/components/DataTableFilterChips/index.tsx +13 -29
  387. package/src/components/DataTableFilters/DataTableFilters.spec.tsx +56 -0
  388. package/src/components/DataTableFilters/index.tsx +169 -584
  389. package/src/components/DataTableGrouping/DataTableGrouping.spec.tsx +85 -0
  390. package/src/components/DataTableGrouping/index.tsx +270 -130
  391. package/src/components/DataTablePagination/DataTablePagination.spec.tsx +79 -4
  392. package/src/components/DataTablePagination/index.tsx +168 -112
  393. package/src/components/DataTableSearch/DataTableSearch.spec.tsx +40 -0
  394. package/src/components/DataTableSearch/DataTableSearch.stories.tsx +1 -1
  395. package/src/components/DataTableSearch/index.tsx +192 -163
  396. package/src/components/DataTableToolbar/DataTableToolbar.spec.tsx +48 -18
  397. package/src/components/DataTableToolbar/DataTableToolbar.stories.tsx +5 -45
  398. package/src/components/DataTableToolbar/index.tsx +128 -99
  399. package/src/components/DataTableViewOptions/index.tsx +29 -22
  400. package/src/components/SimpleTable/SimpleTable.stories.tsx +29 -5
  401. package/src/components/SimpleTable/index.tsx +442 -61
  402. package/src/components/SimpleTable/simpleTable.spec.tsx +140 -12
  403. package/src/components/TableInput/index.native.tsx +91 -81
  404. package/src/components/TableInput/index.tsx +191 -50
  405. package/src/components/TableInput/shared.ts +57 -0
  406. package/src/components/TableInput/tableInput.spec.tsx +104 -0
  407. package/src/hooks/useDataTable.spec.ts +100 -3
  408. package/src/hooks/useDataTable.ts +44 -1
  409. package/src/hooks/useInfiniteRows.spec.tsx +37 -0
  410. package/src/hooks/useInfiniteRows.ts +34 -4
  411. package/src/index.ts +7 -0
  412. package/src/types.ts +54 -3
  413. package/src/utils/filterUtils.ts +27 -5
  414. package/types/components/ChildTable/index.d.ts.map +1 -1
  415. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  416. package/types/components/DataTable/DataTableDocumentList.d.ts +32 -0
  417. package/types/components/DataTable/DataTableDocumentList.d.ts.map +1 -0
  418. package/types/components/DataTable/DataTableMobileCards.d.ts +3 -1
  419. package/types/components/DataTable/DataTableMobileCards.d.ts.map +1 -1
  420. package/types/components/DataTable/DataTableRoot.d.ts +1 -1
  421. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  422. package/types/components/DataTable/DataTableVirtualized.d.ts +1 -2
  423. package/types/components/DataTable/DataTableVirtualized.d.ts.map +1 -1
  424. package/types/components/DataTable/documentListSlots.d.ts +26 -0
  425. package/types/components/DataTable/documentListSlots.d.ts.map +1 -0
  426. package/types/components/DataTable/index.native.d.ts +1 -1
  427. package/types/components/DataTable/index.native.d.ts.map +1 -1
  428. package/types/components/DataTable/rowStateChrome.d.ts +18 -0
  429. package/types/components/DataTable/rowStateChrome.d.ts.map +1 -0
  430. package/types/components/DataTableCell/CellModalEditor.d.ts +6 -1
  431. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  432. package/types/components/DataTableCell/CellModalEditor.native.d.ts +1 -1
  433. package/types/components/DataTableCell/CellModalEditor.native.d.ts.map +1 -1
  434. package/types/components/DataTableCell/CellOptionsEditor.d.ts +11 -3
  435. package/types/components/DataTableCell/CellOptionsEditor.d.ts.map +1 -1
  436. package/types/components/DataTableCell/index.d.ts +1 -1
  437. package/types/components/DataTableCell/index.d.ts.map +1 -1
  438. package/types/components/DataTableColumnPinning/index.d.ts.map +1 -1
  439. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  440. package/types/components/DataTableExport/index.d.ts +17 -6
  441. package/types/components/DataTableExport/index.d.ts.map +1 -1
  442. package/types/components/DataTableFacetMenu/index.d.ts +84 -0
  443. package/types/components/DataTableFacetMenu/index.d.ts.map +1 -0
  444. package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
  445. package/types/components/DataTableFilterChips/FilterChip.d.ts +15 -0
  446. package/types/components/DataTableFilterChips/FilterChip.d.ts.map +1 -0
  447. package/types/components/DataTableFilterChips/index.d.ts +5 -0
  448. package/types/components/DataTableFilterChips/index.d.ts.map +1 -1
  449. package/types/components/DataTableFilters/index.d.ts +11 -0
  450. package/types/components/DataTableFilters/index.d.ts.map +1 -1
  451. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  452. package/types/components/DataTablePagination/index.d.ts +5 -0
  453. package/types/components/DataTablePagination/index.d.ts.map +1 -1
  454. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  455. package/types/components/DataTableToolbar/index.d.ts +2 -0
  456. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  457. package/types/components/SimpleTable/index.d.ts +27 -5
  458. package/types/components/SimpleTable/index.d.ts.map +1 -1
  459. package/types/components/TableInput/index.d.ts +6 -1
  460. package/types/components/TableInput/index.d.ts.map +1 -1
  461. package/types/components/TableInput/index.native.d.ts +6 -1
  462. package/types/components/TableInput/index.native.d.ts.map +1 -1
  463. package/types/components/TableInput/shared.d.ts +38 -0
  464. package/types/components/TableInput/shared.d.ts.map +1 -1
  465. package/types/hooks/useDataTable.d.ts +1 -1
  466. package/types/hooks/useDataTable.d.ts.map +1 -1
  467. package/types/hooks/useInfiniteRows.d.ts +8 -1
  468. package/types/hooks/useInfiniteRows.d.ts.map +1 -1
  469. package/types/index.d.ts +1 -0
  470. package/types/index.d.ts.map +1 -1
  471. package/types/types.d.ts +54 -3
  472. package/types/types.d.ts.map +1 -1
  473. 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
- const parsed = (iso?: string) => {
539
- if (!iso) return null;
540
- const date = new Date(iso);
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
- const itemDate = new Date(itemValue as string);
624
- if (Number.isNaN(itemDate.getTime())) {
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
- return value ? itemDate.toDateString() === new Date(value).toDateString() : false;
634
- case "isNot":
635
- return value ? itemDate.toDateString() !== new Date(value).toDateString() : false;
636
- case "isBefore":
637
- return value ? itemDate < new Date(value) : false;
638
- case "isAfter":
639
- return value ? itemDate > new Date(value) : false;
640
- case "isOnOrBefore":
641
- return value ? itemDate <= new Date(value) : false;
642
- case "isOnOrAfter":
643
- return value ? itemDate >= new Date(value) : false;
644
- case "isBetween":
645
- return values ? itemDate >= new Date(values[0]) && itemDate <= new Date(values[1]) : false;
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": {