@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.
Files changed (506) 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 +3 -2
  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 +33 -12
  7. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableCardControls.native.js +1 -1
  9. package/dist/cjs/components/DataTable/DataTableCardControls.native.js.map +1 -1
  10. package/dist/cjs/components/DataTable/DataTableContext.native.js.map +1 -1
  11. package/dist/cjs/components/DataTable/DataTableDocumentList.cjs +222 -0
  12. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js +237 -0
  13. package/dist/cjs/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  14. package/dist/cjs/components/DataTable/DataTableMobileCards.cjs +5 -2
  15. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js +6 -2
  16. package/dist/cjs/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  17. package/dist/cjs/components/DataTable/DataTableRoot.cjs +92 -41
  18. package/dist/cjs/components/DataTable/DataTableRoot.native.js +104 -50
  19. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  20. package/dist/cjs/components/DataTable/DataTableStateContext.native.js.map +1 -1
  21. package/dist/cjs/components/DataTable/DataTableVirtualized.cjs +8 -2
  22. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js +9 -3
  23. package/dist/cjs/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  24. package/dist/cjs/components/DataTable/documentListSlots.cjs +59 -0
  25. package/dist/cjs/components/DataTable/documentListSlots.native.js +85 -0
  26. package/dist/cjs/components/DataTable/documentListSlots.native.js.map +1 -0
  27. package/dist/cjs/components/DataTable/index.native.js +84 -69
  28. package/dist/cjs/components/DataTable/index.native.js.map +1 -1
  29. package/dist/cjs/components/DataTable/rowStateChrome.cjs +55 -0
  30. package/dist/cjs/components/DataTable/rowStateChrome.native.js +59 -0
  31. package/dist/cjs/components/DataTable/rowStateChrome.native.js.map +1 -0
  32. package/dist/cjs/components/DataTableBulkActions/index.native.js.map +1 -1
  33. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +24 -3
  34. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js +6 -1
  35. package/dist/cjs/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  36. package/dist/cjs/components/DataTableCell/CellOptionsEditor.cjs +9 -2
  37. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  38. package/dist/cjs/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  39. package/dist/cjs/components/DataTableCell/index.cjs +74 -63
  40. package/dist/cjs/components/DataTableCell/index.native.js +94 -82
  41. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  42. package/dist/cjs/components/DataTableColumnPinning/index.cjs +54 -37
  43. package/dist/cjs/components/DataTableColumnPinning/index.native.js +59 -38
  44. package/dist/cjs/components/DataTableColumnPinning/index.native.js.map +1 -1
  45. package/dist/cjs/components/DataTableDateFilter/index.cjs +33 -14
  46. package/dist/cjs/components/DataTableDateFilter/index.native.js +33 -12
  47. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  48. package/dist/cjs/components/DataTableExport/index.cjs +35 -7
  49. package/dist/cjs/components/DataTableExport/index.native.js +42 -7
  50. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  51. package/dist/cjs/components/DataTableFacetMenu/index.cjs +140 -0
  52. package/dist/cjs/components/DataTableFacetMenu/index.native.js +156 -0
  53. package/dist/cjs/components/DataTableFacetMenu/index.native.js.map +1 -0
  54. package/dist/cjs/components/DataTableFilterButton/index.cjs +51 -32
  55. package/dist/cjs/components/DataTableFilterButton/index.native.js +64 -41
  56. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  57. package/dist/cjs/components/DataTableFilterChips/FilterChip.cjs +143 -0
  58. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js +148 -0
  59. package/dist/cjs/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  60. package/dist/cjs/components/DataTableFilterChips/index.cjs +9 -31
  61. package/dist/cjs/components/DataTableFilterChips/index.native.js +9 -32
  62. package/dist/cjs/components/DataTableFilterChips/index.native.js.map +1 -1
  63. package/dist/cjs/components/DataTableFilters/index.cjs +145 -502
  64. package/dist/cjs/components/DataTableFilters/index.native.js +171 -544
  65. package/dist/cjs/components/DataTableFilters/index.native.js.map +1 -1
  66. package/dist/cjs/components/DataTableGrouping/index.cjs +273 -108
  67. package/dist/cjs/components/DataTableGrouping/index.native.js +310 -157
  68. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  69. package/dist/cjs/components/DataTablePagination/index.cjs +147 -95
  70. package/dist/cjs/components/DataTablePagination/index.native.js +159 -106
  71. package/dist/cjs/components/DataTablePagination/index.native.js.map +1 -1
  72. package/dist/cjs/components/DataTableSearch/index.cjs +251 -210
  73. package/dist/cjs/components/DataTableSearch/index.native.js +292 -243
  74. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  75. package/dist/cjs/components/DataTableToolbar/index.cjs +141 -115
  76. package/dist/cjs/components/DataTableToolbar/index.native.js +164 -149
  77. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  78. package/dist/cjs/components/DataTableViewOptions/index.cjs +25 -21
  79. package/dist/cjs/components/DataTableViewOptions/index.native.js +6 -4
  80. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  81. package/dist/cjs/components/FilterManager.native.js.map +1 -1
  82. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  83. package/dist/cjs/components/KnobDialog.native.js.map +1 -1
  84. package/dist/cjs/components/SavedFilterDropdown.native.js.map +1 -1
  85. package/dist/cjs/components/SimpleTable/index.cjs +336 -46
  86. package/dist/cjs/components/SimpleTable/index.native.js +356 -48
  87. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  88. package/dist/cjs/components/TableInput/index.cjs +147 -38
  89. package/dist/cjs/components/TableInput/index.native.js +55 -39
  90. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  91. package/dist/cjs/components/TableInput/shared.cjs +36 -1
  92. package/dist/cjs/components/TableInput/shared.native.js +35 -0
  93. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  94. package/dist/cjs/hooks/useDataTable.cjs +33 -2
  95. package/dist/cjs/hooks/useDataTable.native.js +41 -2
  96. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  97. package/dist/cjs/hooks/useDataTableKeyboard.native.js.map +1 -1
  98. package/dist/cjs/hooks/useDragScroll.native.js.map +1 -1
  99. package/dist/cjs/hooks/useInfiniteRows.cjs +20 -3
  100. package/dist/cjs/hooks/useInfiniteRows.native.js +20 -3
  101. package/dist/cjs/hooks/useInfiniteRows.native.js.map +1 -1
  102. package/dist/cjs/hooks/useSavedFilters.native.js.map +1 -1
  103. package/dist/cjs/hooks/useTableColumnPinning.native.js.map +1 -1
  104. package/dist/cjs/hooks/useTableFiltering.native.js.map +1 -1
  105. package/dist/cjs/hooks/useTableGrouping.native.js.map +1 -1
  106. package/dist/cjs/hooks/useTableKeyboard.native.js.map +1 -1
  107. package/dist/cjs/hooks/useTablePagination.native.js.map +1 -1
  108. package/dist/cjs/hooks/useTableSearch.native.js.map +1 -1
  109. package/dist/cjs/hooks/useTableSelection.native.js.map +1 -1
  110. package/dist/cjs/hooks/useTableSorting.native.js.map +1 -1
  111. package/dist/cjs/hooks/useTableUrlSync.native.js.map +1 -1
  112. package/dist/cjs/hooks/useTableViews.native.js.map +1 -1
  113. package/dist/cjs/index.cjs +2 -0
  114. package/dist/cjs/index.native.js +2 -0
  115. package/dist/cjs/index.native.js.map +1 -1
  116. package/dist/cjs/shared/t.native.js.map +1 -1
  117. package/dist/cjs/shims/primitives.native.js.map +1 -1
  118. package/dist/cjs/shims/tableCellContext.native.js.map +1 -1
  119. package/dist/cjs/types.native.js.map +1 -1
  120. package/dist/cjs/utils/columnAlign.native.js.map +1 -1
  121. package/dist/cjs/utils/filterFields.native.js.map +1 -1
  122. package/dist/cjs/utils/filterUtils.cjs +12 -5
  123. package/dist/cjs/utils/filterUtils.native.js +20 -5
  124. package/dist/cjs/utils/filterUtils.native.js.map +1 -1
  125. package/dist/cjs/utils/paginationDefaults.native.js.map +1 -1
  126. package/dist/cjs/utils/rowPress.native.js.map +1 -1
  127. package/dist/cjs/utils/urlStateUtils.native.js.map +1 -1
  128. package/dist/cjs/utils/viewData.native.js.map +1 -1
  129. package/dist/cjs/utils/withInterp.native.js.map +1 -1
  130. package/dist/esm/components/ChildTable/index.mjs +2 -1
  131. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  132. package/dist/esm/components/ChildTable/index.native.js +2 -1
  133. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  134. package/dist/esm/components/ColumnHeaderFilter/index.mjs +17 -9
  135. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  136. package/dist/esm/components/ColumnHeaderFilter/index.native.js +32 -11
  137. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  138. package/dist/esm/components/DataTable/DataTableDocumentList.mjs +196 -0
  139. package/dist/esm/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  140. package/dist/esm/components/DataTable/DataTableDocumentList.native.js +208 -0
  141. package/dist/esm/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  142. package/dist/esm/components/DataTable/DataTableMobileCards.mjs +5 -2
  143. package/dist/esm/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  144. package/dist/esm/components/DataTable/DataTableMobileCards.native.js +6 -2
  145. package/dist/esm/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  146. package/dist/esm/components/DataTable/DataTableRoot.mjs +93 -42
  147. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  148. package/dist/esm/components/DataTable/DataTableRoot.native.js +98 -44
  149. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  150. package/dist/esm/components/DataTable/DataTableVirtualized.mjs +8 -2
  151. package/dist/esm/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  152. package/dist/esm/components/DataTable/DataTableVirtualized.native.js +9 -3
  153. package/dist/esm/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  154. package/dist/esm/components/DataTable/documentListSlots.mjs +33 -0
  155. package/dist/esm/components/DataTable/documentListSlots.mjs.map +1 -0
  156. package/dist/esm/components/DataTable/documentListSlots.native.js +56 -0
  157. package/dist/esm/components/DataTable/documentListSlots.native.js.map +1 -0
  158. package/dist/esm/components/DataTable/index.native.js +52 -37
  159. package/dist/esm/components/DataTable/index.native.js.map +1 -1
  160. package/dist/esm/components/DataTable/rowStateChrome.mjs +28 -0
  161. package/dist/esm/components/DataTable/rowStateChrome.mjs.map +1 -0
  162. package/dist/esm/components/DataTable/rowStateChrome.native.js +29 -0
  163. package/dist/esm/components/DataTable/rowStateChrome.native.js.map +1 -0
  164. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +25 -4
  165. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  166. package/dist/esm/components/DataTableCell/CellModalEditor.native.js +6 -1
  167. package/dist/esm/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  168. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  169. package/dist/esm/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  170. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  171. package/dist/esm/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  172. package/dist/esm/components/DataTableCell/index.mjs +75 -64
  173. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  174. package/dist/esm/components/DataTableCell/index.native.js +95 -83
  175. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  176. package/dist/esm/components/DataTableColumnPinning/index.mjs +54 -37
  177. package/dist/esm/components/DataTableColumnPinning/index.mjs.map +1 -1
  178. package/dist/esm/components/DataTableColumnPinning/index.native.js +59 -38
  179. package/dist/esm/components/DataTableColumnPinning/index.native.js.map +1 -1
  180. package/dist/esm/components/DataTableDateFilter/index.mjs +34 -15
  181. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  182. package/dist/esm/components/DataTableDateFilter/index.native.js +34 -13
  183. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  184. package/dist/esm/components/DataTableExport/index.mjs +36 -8
  185. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  186. package/dist/esm/components/DataTableExport/index.native.js +43 -8
  187. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  188. package/dist/esm/components/DataTableFacetMenu/index.mjs +115 -0
  189. package/dist/esm/components/DataTableFacetMenu/index.mjs.map +1 -0
  190. package/dist/esm/components/DataTableFacetMenu/index.native.js +128 -0
  191. package/dist/esm/components/DataTableFacetMenu/index.native.js.map +1 -0
  192. package/dist/esm/components/DataTableFilterButton/index.mjs +54 -35
  193. package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
  194. package/dist/esm/components/DataTableFilterButton/index.native.js +66 -43
  195. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  196. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs +118 -0
  197. package/dist/esm/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  198. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js +120 -0
  199. package/dist/esm/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  200. package/dist/esm/components/DataTableFilterChips/index.mjs +9 -32
  201. package/dist/esm/components/DataTableFilterChips/index.mjs.map +1 -1
  202. package/dist/esm/components/DataTableFilterChips/index.native.js +9 -33
  203. package/dist/esm/components/DataTableFilterChips/index.native.js.map +1 -1
  204. package/dist/esm/components/DataTableFilters/index.mjs +149 -506
  205. package/dist/esm/components/DataTableFilters/index.mjs.map +1 -1
  206. package/dist/esm/components/DataTableFilters/index.native.js +175 -548
  207. package/dist/esm/components/DataTableFilters/index.native.js.map +1 -1
  208. package/dist/esm/components/DataTableGrouping/index.mjs +275 -110
  209. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  210. package/dist/esm/components/DataTableGrouping/index.native.js +287 -134
  211. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  212. package/dist/esm/components/DataTablePagination/index.mjs +148 -96
  213. package/dist/esm/components/DataTablePagination/index.mjs.map +1 -1
  214. package/dist/esm/components/DataTablePagination/index.native.js +160 -107
  215. package/dist/esm/components/DataTablePagination/index.native.js.map +1 -1
  216. package/dist/esm/components/DataTableSearch/index.mjs +256 -215
  217. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  218. package/dist/esm/components/DataTableSearch/index.native.js +297 -248
  219. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  220. package/dist/esm/components/DataTableToolbar/index.mjs +145 -119
  221. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  222. package/dist/esm/components/DataTableToolbar/index.native.js +167 -152
  223. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  224. package/dist/esm/components/DataTableViewOptions/index.mjs +26 -22
  225. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  226. package/dist/esm/components/DataTableViewOptions/index.native.js +7 -5
  227. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  228. package/dist/esm/components/SimpleTable/index.mjs +338 -48
  229. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  230. package/dist/esm/components/SimpleTable/index.native.js +358 -50
  231. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  232. package/dist/esm/components/TableInput/index.mjs +150 -41
  233. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  234. package/dist/esm/components/TableInput/index.native.js +55 -39
  235. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  236. package/dist/esm/components/TableInput/shared.mjs +34 -1
  237. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  238. package/dist/esm/components/TableInput/shared.native.js +34 -1
  239. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  240. package/dist/esm/hooks/useDataTable.mjs +33 -2
  241. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  242. package/dist/esm/hooks/useDataTable.native.js +41 -2
  243. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  244. package/dist/esm/hooks/useInfiniteRows.mjs +20 -3
  245. package/dist/esm/hooks/useInfiniteRows.mjs.map +1 -1
  246. package/dist/esm/hooks/useInfiniteRows.native.js +20 -3
  247. package/dist/esm/hooks/useInfiniteRows.native.js.map +1 -1
  248. package/dist/esm/index.mjs +2 -1
  249. package/dist/esm/index.mjs.map +1 -1
  250. package/dist/esm/index.native.js +2 -1
  251. package/dist/esm/index.native.js.map +1 -1
  252. package/dist/esm/utils/filterUtils.mjs +12 -5
  253. package/dist/esm/utils/filterUtils.mjs.map +1 -1
  254. package/dist/esm/utils/filterUtils.native.js +20 -5
  255. package/dist/esm/utils/filterUtils.native.js.map +1 -1
  256. package/dist/jsx/components/ChildTable/index.mjs +2 -1
  257. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  258. package/dist/jsx/components/ChildTable/index.native.js +2 -1
  259. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  260. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +17 -9
  261. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  262. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +32 -11
  263. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  264. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs +196 -0
  265. package/dist/jsx/components/DataTable/DataTableDocumentList.mjs.map +1 -0
  266. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js +237 -0
  267. package/dist/jsx/components/DataTable/DataTableDocumentList.native.js.map +1 -0
  268. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs +5 -2
  269. package/dist/jsx/components/DataTable/DataTableMobileCards.mjs.map +1 -1
  270. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js +6 -2
  271. package/dist/jsx/components/DataTable/DataTableMobileCards.native.js.map +1 -1
  272. package/dist/jsx/components/DataTable/DataTableRoot.mjs +93 -42
  273. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  274. package/dist/jsx/components/DataTable/DataTableRoot.native.js +97 -43
  275. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  276. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs +8 -2
  277. package/dist/jsx/components/DataTable/DataTableVirtualized.mjs.map +1 -1
  278. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js +9 -3
  279. package/dist/jsx/components/DataTable/DataTableVirtualized.native.js.map +1 -1
  280. package/dist/jsx/components/DataTable/documentListSlots.mjs +33 -0
  281. package/dist/jsx/components/DataTable/documentListSlots.mjs.map +1 -0
  282. package/dist/jsx/components/DataTable/documentListSlots.native.js +85 -0
  283. package/dist/jsx/components/DataTable/documentListSlots.native.js.map +1 -0
  284. package/dist/jsx/components/DataTable/index.native.js +74 -59
  285. package/dist/jsx/components/DataTable/index.native.js.map +1 -1
  286. package/dist/jsx/components/DataTable/rowStateChrome.mjs +28 -0
  287. package/dist/jsx/components/DataTable/rowStateChrome.mjs.map +1 -0
  288. package/dist/jsx/components/DataTable/rowStateChrome.native.js +59 -0
  289. package/dist/jsx/components/DataTable/rowStateChrome.native.js.map +1 -0
  290. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +25 -4
  291. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  292. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js +6 -1
  293. package/dist/jsx/components/DataTableCell/CellModalEditor.native.js.map +1 -1
  294. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs +9 -2
  295. package/dist/jsx/components/DataTableCell/CellOptionsEditor.mjs.map +1 -1
  296. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js +11 -2
  297. package/dist/jsx/components/DataTableCell/CellOptionsEditor.native.js.map +1 -1
  298. package/dist/jsx/components/DataTableCell/index.mjs +75 -64
  299. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  300. package/dist/jsx/components/DataTableCell/index.native.js +94 -82
  301. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  302. package/dist/jsx/components/DataTableColumnPinning/index.mjs +54 -37
  303. package/dist/jsx/components/DataTableColumnPinning/index.mjs.map +1 -1
  304. package/dist/jsx/components/DataTableColumnPinning/index.native.js +59 -38
  305. package/dist/jsx/components/DataTableColumnPinning/index.native.js.map +1 -1
  306. package/dist/jsx/components/DataTableDateFilter/index.mjs +34 -15
  307. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  308. package/dist/jsx/components/DataTableDateFilter/index.native.js +33 -12
  309. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  310. package/dist/jsx/components/DataTableExport/index.mjs +36 -8
  311. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  312. package/dist/jsx/components/DataTableExport/index.native.js +42 -7
  313. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  314. package/dist/jsx/components/DataTableFacetMenu/index.mjs +115 -0
  315. package/dist/jsx/components/DataTableFacetMenu/index.mjs.map +1 -0
  316. package/dist/jsx/components/DataTableFacetMenu/index.native.js +156 -0
  317. package/dist/jsx/components/DataTableFacetMenu/index.native.js.map +1 -0
  318. package/dist/jsx/components/DataTableFilterButton/index.mjs +54 -35
  319. package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
  320. package/dist/jsx/components/DataTableFilterButton/index.native.js +63 -40
  321. package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
  322. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs +118 -0
  323. package/dist/jsx/components/DataTableFilterChips/FilterChip.mjs.map +1 -0
  324. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js +148 -0
  325. package/dist/jsx/components/DataTableFilterChips/FilterChip.native.js.map +1 -0
  326. package/dist/jsx/components/DataTableFilterChips/index.mjs +9 -32
  327. package/dist/jsx/components/DataTableFilterChips/index.mjs.map +1 -1
  328. package/dist/jsx/components/DataTableFilterChips/index.native.js +9 -32
  329. package/dist/jsx/components/DataTableFilterChips/index.native.js.map +1 -1
  330. package/dist/jsx/components/DataTableFilters/index.mjs +149 -506
  331. package/dist/jsx/components/DataTableFilters/index.mjs.map +1 -1
  332. package/dist/jsx/components/DataTableFilters/index.native.js +171 -544
  333. package/dist/jsx/components/DataTableFilters/index.native.js.map +1 -1
  334. package/dist/jsx/components/DataTableGrouping/index.mjs +275 -110
  335. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  336. package/dist/jsx/components/DataTableGrouping/index.native.js +310 -157
  337. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  338. package/dist/jsx/components/DataTablePagination/index.mjs +148 -96
  339. package/dist/jsx/components/DataTablePagination/index.mjs.map +1 -1
  340. package/dist/jsx/components/DataTablePagination/index.native.js +159 -106
  341. package/dist/jsx/components/DataTablePagination/index.native.js.map +1 -1
  342. package/dist/jsx/components/DataTableSearch/index.mjs +256 -215
  343. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  344. package/dist/jsx/components/DataTableSearch/index.native.js +292 -243
  345. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  346. package/dist/jsx/components/DataTableToolbar/index.mjs +145 -119
  347. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  348. package/dist/jsx/components/DataTableToolbar/index.native.js +163 -148
  349. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  350. package/dist/jsx/components/DataTableViewOptions/index.mjs +26 -22
  351. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  352. package/dist/jsx/components/DataTableViewOptions/index.native.js +6 -4
  353. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  354. package/dist/jsx/components/SimpleTable/index.mjs +338 -48
  355. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  356. package/dist/jsx/components/SimpleTable/index.native.js +356 -48
  357. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  358. package/dist/jsx/components/TableInput/index.mjs +150 -41
  359. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  360. package/dist/jsx/components/TableInput/index.native.js +54 -38
  361. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  362. package/dist/jsx/components/TableInput/shared.mjs +34 -1
  363. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  364. package/dist/jsx/components/TableInput/shared.native.js +35 -0
  365. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  366. package/dist/jsx/hooks/useDataTable.mjs +33 -2
  367. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  368. package/dist/jsx/hooks/useDataTable.native.js +41 -2
  369. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  370. package/dist/jsx/hooks/useInfiniteRows.mjs +20 -3
  371. package/dist/jsx/hooks/useInfiniteRows.mjs.map +1 -1
  372. package/dist/jsx/hooks/useInfiniteRows.native.js +20 -3
  373. package/dist/jsx/hooks/useInfiniteRows.native.js.map +1 -1
  374. package/dist/jsx/index.js +2 -1
  375. package/dist/jsx/index.js.map +1 -1
  376. package/dist/jsx/index.mjs +2 -1
  377. package/dist/jsx/index.mjs.map +1 -1
  378. package/dist/jsx/index.native.js +2 -0
  379. package/dist/jsx/index.native.js.map +1 -1
  380. package/dist/jsx/utils/filterUtils.mjs +12 -5
  381. package/dist/jsx/utils/filterUtils.mjs.map +1 -1
  382. package/dist/jsx/utils/filterUtils.native.js +20 -5
  383. package/dist/jsx/utils/filterUtils.native.js.map +1 -1
  384. package/package.json +16 -16
  385. package/src/components/ChildTable/index.tsx +1 -0
  386. package/src/components/ColumnHeaderFilter/ColumnHeaderFilter.spec.tsx +85 -0
  387. package/src/components/ColumnHeaderFilter/index.tsx +28 -10
  388. package/src/components/DataTable/DataTable.stories.tsx +30 -0
  389. package/src/components/DataTable/DataTableDocumentList.tsx +224 -0
  390. package/src/components/DataTable/DataTableMobileCards.tsx +20 -8
  391. package/src/components/DataTable/DataTableRoot.tsx +135 -58
  392. package/src/components/DataTable/DataTableVirtualized.tsx +8 -11
  393. package/src/components/DataTable/cardLayout.spec.tsx +89 -0
  394. package/src/components/DataTable/documentListSlots.ts +57 -0
  395. package/src/components/DataTable/index.native.tsx +76 -50
  396. package/src/components/DataTable/keepPreviousData.spec.tsx +137 -0
  397. package/src/components/DataTable/rowRing.spec.tsx +118 -0
  398. package/src/components/DataTable/rowStateChrome.ts +38 -0
  399. package/src/components/DataTableCell/CellModalEditor.native.tsx +4 -0
  400. package/src/components/DataTableCell/CellModalEditor.tsx +31 -3
  401. package/src/components/DataTableCell/CellOptionsEditor.tsx +29 -12
  402. package/src/components/DataTableCell/DataTableCell.stories.tsx +3 -3
  403. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +131 -4
  404. package/src/components/DataTableCell/dataTableCell.spec.tsx +36 -1
  405. package/src/components/DataTableCell/index.tsx +121 -86
  406. package/src/components/DataTableColumnPinning/DataTableColumnPinning.spec.tsx +66 -0
  407. package/src/components/DataTableColumnPinning/index.tsx +32 -17
  408. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +9 -1
  409. package/src/components/DataTableDateFilter/dateFilterZones.spec.ts +316 -0
  410. package/src/components/DataTableDateFilter/index.tsx +42 -22
  411. package/src/components/DataTableExport/exportDateZones.spec.tsx +348 -0
  412. package/src/components/DataTableExport/index.tsx +107 -63
  413. package/src/components/DataTableFacetMenu/DataTableFacetMenu.spec.tsx +264 -0
  414. package/src/components/DataTableFacetMenu/DataTableFacetMenu.stories.tsx +212 -0
  415. package/src/components/DataTableFacetMenu/index.tsx +202 -0
  416. package/src/components/DataTableFilterButton/index.tsx +66 -49
  417. package/src/components/DataTableFilterChips/DataTableFilterChips.spec.tsx +22 -0
  418. package/src/components/DataTableFilterChips/FilterChip.tsx +122 -0
  419. package/src/components/DataTableFilterChips/index.tsx +13 -29
  420. package/src/components/DataTableFilters/DataTableFilters.spec.tsx +56 -0
  421. package/src/components/DataTableFilters/index.tsx +169 -584
  422. package/src/components/DataTableGrouping/DataTableGrouping.spec.tsx +85 -0
  423. package/src/components/DataTableGrouping/index.tsx +270 -130
  424. package/src/components/DataTablePagination/DataTablePagination.spec.tsx +79 -4
  425. package/src/components/DataTablePagination/index.tsx +168 -112
  426. package/src/components/DataTableSearch/DataTableSearch.spec.tsx +40 -0
  427. package/src/components/DataTableSearch/DataTableSearch.stories.tsx +1 -1
  428. package/src/components/DataTableSearch/index.tsx +192 -163
  429. package/src/components/DataTableToolbar/DataTableToolbar.spec.tsx +48 -18
  430. package/src/components/DataTableToolbar/DataTableToolbar.stories.tsx +5 -45
  431. package/src/components/DataTableToolbar/index.tsx +128 -99
  432. package/src/components/DataTableViewOptions/index.tsx +29 -22
  433. package/src/components/SimpleTable/SimpleTable.stories.tsx +29 -5
  434. package/src/components/SimpleTable/index.tsx +442 -61
  435. package/src/components/SimpleTable/simpleTable.spec.tsx +140 -12
  436. package/src/components/TableInput/index.native.tsx +91 -81
  437. package/src/components/TableInput/index.tsx +191 -50
  438. package/src/components/TableInput/shared.ts +57 -0
  439. package/src/components/TableInput/tableInput.spec.tsx +104 -0
  440. package/src/hooks/useDataTable.spec.ts +100 -3
  441. package/src/hooks/useDataTable.ts +44 -1
  442. package/src/hooks/useInfiniteRows.spec.tsx +37 -0
  443. package/src/hooks/useInfiniteRows.ts +34 -4
  444. package/src/index.ts +7 -0
  445. package/src/types.ts +54 -3
  446. package/src/utils/filterUtils.ts +27 -5
  447. package/types/components/ChildTable/index.d.ts.map +1 -1
  448. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  449. package/types/components/DataTable/DataTableDocumentList.d.ts +32 -0
  450. package/types/components/DataTable/DataTableDocumentList.d.ts.map +1 -0
  451. package/types/components/DataTable/DataTableMobileCards.d.ts +3 -1
  452. package/types/components/DataTable/DataTableMobileCards.d.ts.map +1 -1
  453. package/types/components/DataTable/DataTableRoot.d.ts +1 -1
  454. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  455. package/types/components/DataTable/DataTableVirtualized.d.ts +1 -2
  456. package/types/components/DataTable/DataTableVirtualized.d.ts.map +1 -1
  457. package/types/components/DataTable/documentListSlots.d.ts +26 -0
  458. package/types/components/DataTable/documentListSlots.d.ts.map +1 -0
  459. package/types/components/DataTable/index.native.d.ts +1 -1
  460. package/types/components/DataTable/index.native.d.ts.map +1 -1
  461. package/types/components/DataTable/rowStateChrome.d.ts +18 -0
  462. package/types/components/DataTable/rowStateChrome.d.ts.map +1 -0
  463. package/types/components/DataTableCell/CellModalEditor.d.ts +6 -1
  464. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  465. package/types/components/DataTableCell/CellModalEditor.native.d.ts +1 -1
  466. package/types/components/DataTableCell/CellModalEditor.native.d.ts.map +1 -1
  467. package/types/components/DataTableCell/CellOptionsEditor.d.ts +11 -3
  468. package/types/components/DataTableCell/CellOptionsEditor.d.ts.map +1 -1
  469. package/types/components/DataTableCell/index.d.ts +1 -1
  470. package/types/components/DataTableCell/index.d.ts.map +1 -1
  471. package/types/components/DataTableColumnPinning/index.d.ts.map +1 -1
  472. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  473. package/types/components/DataTableExport/index.d.ts +17 -6
  474. package/types/components/DataTableExport/index.d.ts.map +1 -1
  475. package/types/components/DataTableFacetMenu/index.d.ts +84 -0
  476. package/types/components/DataTableFacetMenu/index.d.ts.map +1 -0
  477. package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
  478. package/types/components/DataTableFilterChips/FilterChip.d.ts +15 -0
  479. package/types/components/DataTableFilterChips/FilterChip.d.ts.map +1 -0
  480. package/types/components/DataTableFilterChips/index.d.ts +5 -0
  481. package/types/components/DataTableFilterChips/index.d.ts.map +1 -1
  482. package/types/components/DataTableFilters/index.d.ts +11 -0
  483. package/types/components/DataTableFilters/index.d.ts.map +1 -1
  484. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  485. package/types/components/DataTablePagination/index.d.ts +5 -0
  486. package/types/components/DataTablePagination/index.d.ts.map +1 -1
  487. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  488. package/types/components/DataTableToolbar/index.d.ts +2 -0
  489. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  490. package/types/components/SimpleTable/index.d.ts +27 -5
  491. package/types/components/SimpleTable/index.d.ts.map +1 -1
  492. package/types/components/TableInput/index.d.ts +6 -1
  493. package/types/components/TableInput/index.d.ts.map +1 -1
  494. package/types/components/TableInput/index.native.d.ts +6 -1
  495. package/types/components/TableInput/index.native.d.ts.map +1 -1
  496. package/types/components/TableInput/shared.d.ts +38 -0
  497. package/types/components/TableInput/shared.d.ts.map +1 -1
  498. package/types/hooks/useDataTable.d.ts +1 -1
  499. package/types/hooks/useDataTable.d.ts.map +1 -1
  500. package/types/hooks/useInfiniteRows.d.ts +8 -1
  501. package/types/hooks/useInfiniteRows.d.ts.map +1 -1
  502. package/types/index.d.ts +1 -0
  503. package/types/index.d.ts.map +1 -1
  504. package/types/types.d.ts +54 -3
  505. package/types/types.d.ts.map +1 -1
  506. package/types/utils/filterUtils.d.ts.map +1 -1
@@ -1,16 +1,20 @@
1
- import {
2
- CalendarBlankIcon,
3
- CheckSquareIcon,
4
- FunnelIcon,
5
- HashIcon,
6
- PlusIcon,
7
- TextTIcon,
8
- XIcon,
9
- } from "@phosphor-icons/react";
1
+ /**
2
+ * DataTableFilters — standalone filter bar (Polaris Index Filters + Linear).
3
+ *
4
+ * Empty: a Filter trigger. Active: the same trigger (count on the button as
5
+ * fill, LC-71) plus wrapping dismissible chips. Add/edit opens a FloatingPanel
6
+ * (LC-06) with the shared FilterOperatorValueEditor (LC-16). Compose stays
7
+ * open after Add (LC-21); Cancel / outside / Escape close.
8
+ *
9
+ * Compact (card chrome beside DataTableFilterButton / FilterChips) is Add
10
+ * Filter + Clear — not a second Filter trigger or chip row.
11
+ */
12
+
13
+ import { FunnelIcon, PlusIcon } from "@phosphor-icons/react";
10
14
  import { useResolvedKnobs } from "@multiplatform.one/theme";
11
- import { useState, useMemo } from "react";
12
- import { Button, Input, Select } from "@multiplatform.one/forms";
13
- import { Popover, ScrollView, Separator, Text, View, XStack, YStack } from "tamagui";
15
+ import { useEffect, useState } from "react";
16
+ import { Button, FloatingPanel, Select } from "@multiplatform.one/forms";
17
+ import { Text, View, XStack, YStack } from "tamagui";
14
18
  import type {
15
19
  DataTableColumnType,
16
20
  FacetedFilterOption,
@@ -18,9 +22,15 @@ import type {
18
22
  FilterValue,
19
23
  TableFilter,
20
24
  } from "../../types";
21
- import { getFilterDescription } from "../../utils/filterUtils";
25
+ import {
26
+ defaultOperatorForFilterType,
27
+ getFilterChipLabel,
28
+ operatorNeedsNoValue,
29
+ } from "../../utils/filterFields";
22
30
  import { t } from "../../shared/t";
23
31
  import { useDataTableState } from "../DataTable/DataTableStateContext";
32
+ import { FilterChip } from "../DataTableFilterChips";
33
+ import { FilterOperatorValueEditor } from "../FilterOperatorValueEditor";
24
34
 
25
35
  export interface DataTableFiltersProps {
26
36
  filters?: TableFilter[];
@@ -39,13 +49,12 @@ export interface DataTableFiltersProps {
39
49
  compact?: boolean;
40
50
  }
41
51
 
52
+ type ColumnOption = NonNullable<DataTableFiltersProps["availableColumns"]>[number];
53
+
42
54
  export function DataTableFilters(props: DataTableFiltersProps) {
43
- // Try to consume from DataTableStateContext (compound component pattern)
44
55
  const ctx = useDataTableState();
45
56
 
46
- // Resolve values: explicit props override context values
47
57
  const filters = props.filters ?? ctx?.state.filters ?? [];
48
- const onFiltersChange = props.onFiltersChange ?? ctx?.actions.setFilters ?? (() => {});
49
58
  const onAddFilter = props.onAddFilter ?? ctx?.actions.addFilter ?? (() => {});
50
59
  const onRemoveFilter = props.onRemoveFilter ?? ctx?.actions.removeFilter ?? (() => {});
51
60
  const onClearFilters = props.onClearFilters ?? ctx?.actions.clearFilters ?? (() => {});
@@ -53,636 +62,212 @@ export function DataTableFilters(props: DataTableFiltersProps) {
53
62
 
54
63
  const { maxFilters = 10, showFilterCount = true, compact = false } = props;
55
64
 
56
- const [showFilterBuilder, setShowFilterBuilder] = useState(false);
57
- const { knobProps } = useResolvedKnobs();
65
+ const [builderOpen, setBuilderOpen] = useState(false);
66
+ const [editingId, setEditingId] = useState<string | null>(null);
67
+ const { knobProps } = useResolvedKnobs({ compact });
58
68
 
59
69
  const canAddMoreFilters = filters.length < maxFilters;
60
-
61
- // LC-21 (owner adjudication 2026-08-12): the builder stays open after Add
62
- // Filter — it resets its form so the user composes the next filter; Cancel,
63
- // outside click, or Escape close.
64
- const handleAddFilter = (filter: Omit<TableFilter, "id">) => {
70
+ const editingFilter = editingId ? (filters.find((f) => f.id === editingId) ?? null) : null;
71
+ const triggerName = compact ? t("Add Filter") : t("Filter");
72
+ const triggerLabel =
73
+ showFilterCount && filters.length > 0 ? `${triggerName} (${filters.length})` : triggerName;
74
+
75
+ const handleCommit = (filter: Omit<TableFilter, "id">) => {
76
+ if (editingId) {
77
+ const updated = filters.map((row) => (row.id === editingId ? { ...row, ...filter } : row));
78
+ (props.onFiltersChange ?? ctx?.actions.setFilters ?? (() => {}))(updated);
79
+ setEditingId(null);
80
+ return;
81
+ }
65
82
  onAddFilter(filter);
66
83
  };
67
84
 
68
- const handleUpdateFilter = (filterId: string, updates: Partial<TableFilter>) => {
69
- const updatedFilters = filters.map((filter) =>
70
- filter.id === filterId ? { ...filter, ...updates } : filter,
71
- );
72
- onFiltersChange(updatedFilters);
85
+ const openBuilder = (filterId?: string) => {
86
+ setEditingId(filterId ?? null);
87
+ setBuilderOpen(true);
73
88
  };
74
89
 
75
- if (compact) {
76
- return (
77
- <XStack alignItems="center" gap="$2">
78
- {filters.length > 0 && showFilterCount && (
79
- <View
80
- backgroundColor={"$accentBackground"}
81
- paddingHorizontal="$2"
82
- paddingVertical="$1"
83
- borderRadius={knobProps.borderRadius.borderRadius}
84
- >
85
- <Text color="$accentColor" fontSize="$2">
86
- {filters.length}
87
- </Text>
88
- </View>
89
- )}
90
+ const handleOpenChange = (next: boolean) => {
91
+ setBuilderOpen(next);
92
+ if (!next) setEditingId(null);
93
+ };
90
94
 
91
- <Popover open={showFilterBuilder} onOpenChange={setShowFilterBuilder}>
92
- <Popover.Trigger asChild>
93
- <Button
94
- size={knobProps.sizeToken}
95
- variant="outlined"
96
- icon={<PlusIcon size={16} />}
97
- disabled={!canAddMoreFilters}
98
- >
99
- {t("Add Filter")}
100
- </Button>
101
- </Popover.Trigger>
102
- <Popover.Content
103
- {...knobProps.borderRadius}
104
- borderWidth={1}
105
- borderColor="$color6"
106
- backgroundColor="$background"
107
- enterStyle={{ x: 0, y: -10, opacity: 0 }}
108
- exitStyle={{ x: 0, y: -10, opacity: 0 }}
109
- transition={[
110
- "quick",
111
- {
112
- opacity: {
113
- overshootClamping: true,
114
- },
115
- },
116
- ]}
95
+ const trigger = (
96
+ <Button
97
+ size="$3"
98
+ compact
99
+ {...(filters.length > 0 ? { accent: true } : { variant: "outlined" as const })}
100
+ icon={
101
+ compact ? (
102
+ <PlusIcon size={14} />
103
+ ) : (
104
+ <FunnelIcon size={14} weight={filters.length > 0 ? "fill" : "regular"} />
105
+ )
106
+ }
107
+ aria-label={triggerName}
108
+ aria-expanded={builderOpen}
109
+ aria-haspopup="dialog"
110
+ >
111
+ {triggerLabel}
112
+ </Button>
113
+ );
114
+
115
+ return (
116
+ <YStack data-testid="data-table-filters" aria-label={t("Table filters")} aria-live="polite">
117
+ <XStack flexWrap="wrap" alignItems="center" {...knobProps.gap}>
118
+ <View alignSelf="flex-start" flexShrink={0}>
119
+ <FloatingPanel
120
+ open={builderOpen}
121
+ onOpenChange={handleOpenChange}
122
+ trigger={trigger}
123
+ fitContent
124
+ scrollable={false}
117
125
  >
118
126
  <FilterBuilder
119
127
  availableColumns={availableColumns}
120
- onAddFilter={handleAddFilter}
121
- onCancel={() => setShowFilterBuilder(false)}
128
+ editingFilter={editingFilter}
129
+ onCommit={handleCommit}
130
+ onCancel={() => handleOpenChange(false)}
131
+ canAdd={canAddMoreFilters || !!editingFilter}
122
132
  />
123
- </Popover.Content>
124
- </Popover>
133
+ </FloatingPanel>
134
+ </View>
125
135
 
126
- {filters.length > 0 && (
127
- <Button
128
- size={knobProps.sizeToken}
129
- variant="outlined"
130
- onPress={onClearFilters}
131
- icon={<XIcon size={16} />}
132
- >
136
+ {!compact &&
137
+ filters.map((filter) => {
138
+ const column = availableColumns.find((col) => col.id === filter.columnId);
139
+ const label = getFilterChipLabel(
140
+ column?.label ?? filter.label ?? filter.columnId,
141
+ filter.value,
142
+ column?.options,
143
+ );
144
+ return (
145
+ <FilterChip
146
+ key={filter.id}
147
+ label={label}
148
+ onRemove={() => onRemoveFilter(filter.id)}
149
+ onPress={() => openBuilder(filter.id)}
150
+ />
151
+ );
152
+ })}
153
+
154
+ {compact && filters.length > 0 && (
155
+ <Button size="$2" chromeless compact onPress={onClearFilters} aria-label={t("Clear")}>
133
156
  {t("Clear")}
134
157
  </Button>
135
158
  )}
159
+ {!compact && filters.length >= 2 && (
160
+ <Button size="$2" chromeless compact onPress={onClearFilters} aria-label={t("Clear all")}>
161
+ {t("Clear all")}
162
+ </Button>
163
+ )}
136
164
  </XStack>
137
- );
138
- }
139
-
140
- return (
141
- <YStack
142
- {...knobProps.borderRadius}
143
- gap="$4"
144
- padding="$4"
145
- backgroundColor="$background"
146
- borderWidth={1}
147
- borderColor="$color6"
148
- aria-label="Table filters"
149
- aria-live="polite"
150
- >
151
- {/* Header */}
152
- <XStack alignItems="center" justifyContent="space-between">
153
- <XStack alignItems="center" gap="$2">
154
- <FunnelIcon size={16} aria-hidden />
155
- <Text fontSize="$4" fontWeight="600" id="filters-heading">
156
- {t("Filters")}
157
- </Text>
158
- {showFilterCount && filters.length > 0 && (
159
- <View
160
- backgroundColor={"$accentBackground"}
161
- paddingHorizontal="$2"
162
- paddingVertical="$1"
163
- borderRadius={knobProps.borderRadius.borderRadius}
164
- aria-label={`${filters.length} active filters`}
165
- >
166
- <Text color="$accentColor" fontSize="$2">
167
- {filters.length}
168
- </Text>
169
- </View>
170
- )}
171
- </XStack>
172
-
173
- <XStack
174
- {...({ render: "fieldset" } as object)}
175
- borderWidth={0}
176
- margin={0}
177
- padding={0}
178
- minWidth={0}
179
- alignItems="center"
180
- gap="$2"
181
- aria-label="Filter management actions"
182
- >
183
- <Popover open={showFilterBuilder} onOpenChange={setShowFilterBuilder}>
184
- <Popover.Trigger asChild>
185
- <Button
186
- size={knobProps.sizeToken}
187
- variant="outlined"
188
- icon={<PlusIcon size={16} />}
189
- disabled={!canAddMoreFilters}
190
- aria-label="Add new filter"
191
- aria-expanded={showFilterBuilder}
192
- aria-haspopup="dialog"
193
- >
194
- {t("Add Filter")}
195
- </Button>
196
- </Popover.Trigger>
197
- <Popover.Content
198
- {...knobProps.borderRadius}
199
- borderWidth={1}
200
- borderColor="$color6"
201
- backgroundColor="$background"
202
- enterStyle={{ x: 0, y: -10, opacity: 0 }}
203
- exitStyle={{ x: 0, y: -10, opacity: 0 }}
204
- transition={[
205
- "quick",
206
- {
207
- opacity: {
208
- opacity: {
209
- overshootClamping: true,
210
- },
211
- },
212
- },
213
- ]}
214
- maxWidth={400}
215
- >
216
- <FilterBuilder
217
- availableColumns={availableColumns}
218
- onAddFilter={handleAddFilter}
219
- onCancel={() => setShowFilterBuilder(false)}
220
- />
221
- </Popover.Content>
222
- </Popover>
223
-
224
- {filters.length > 0 && (
225
- <Button
226
- size={knobProps.sizeToken}
227
- variant="outlined"
228
- onPress={onClearFilters}
229
- icon={<XIcon size={16} />}
230
- aria-label="Clear all filters"
231
- >
232
- {t("Clear All")}
233
- </Button>
234
- )}
235
- </XStack>
236
- </XStack>
237
-
238
- <Separator />
239
-
240
- {/* Active Filters */}
241
- {filters.length > 0 ? (
242
- <ScrollView maxHeight={200}>
243
- <YStack
244
- {...({ render: "ul" } as object)}
245
- gap="$2"
246
- padding={0}
247
- margin={0}
248
- aria-label="Active filters"
249
- aria-describedby="filters-heading"
250
- >
251
- {filters.map((filter, index) => (
252
- <ActiveFilter
253
- key={filter.id}
254
- filter={filter}
255
- availableColumns={availableColumns}
256
- onUpdate={(updates) => handleUpdateFilter(filter.id, updates)}
257
- onRemove={() => onRemoveFilter(filter.id)}
258
- index={index}
259
- />
260
- ))}
261
- </YStack>
262
- </ScrollView>
263
- ) : (
264
- <View
265
- {...({ render: "output" } as object)}
266
- padding="$4"
267
- alignItems="center"
268
- aria-live="polite"
269
- >
270
- <Text fontSize="$3" color="$color10">
271
- {t("No filters applied")}
272
- </Text>
273
- </View>
274
- )}
275
165
  </YStack>
276
166
  );
277
167
  }
278
168
 
279
- // Filter Builder Component
280
-
281
169
  interface FilterBuilderProps {
282
- availableColumns: Array<{
283
- id: string;
284
- label: string;
285
- type: DataTableColumnType;
286
- options?: FacetedFilterOption[];
287
- }>;
288
- onAddFilter: (filter: Omit<TableFilter, "id">) => void;
170
+ availableColumns: ColumnOption[];
171
+ editingFilter: TableFilter | null;
172
+ onCommit: (filter: Omit<TableFilter, "id">) => void;
289
173
  onCancel: () => void;
174
+ canAdd: boolean;
290
175
  }
291
176
 
292
- function FilterBuilder({ availableColumns, onAddFilter, onCancel }: FilterBuilderProps) {
293
- const { knobProps } = useResolvedKnobs();
294
- const sz = knobProps.sizeToken;
295
- const builderMinWidth = sz === "$3" ? 240 : sz === "$5" ? 360 : 300;
296
- const [selectedColumnId, setSelectedColumnId] = useState<string>("");
297
- const [selectedOperator, setSelectedOperator] = useState<FilterOperator>("is");
298
- const [filterValue, setFilterValue] = useState<any>("");
299
- const [filterValues, setFilterValues] = useState<any[]>([]);
177
+ function FilterBuilder({
178
+ availableColumns,
179
+ editingFilter,
180
+ onCommit,
181
+ onCancel,
182
+ canAdd,
183
+ }: FilterBuilderProps) {
184
+ const { knobProps } = useResolvedKnobs({ compact: true });
185
+ const [selectedColumnId, setSelectedColumnId] = useState("");
186
+ const [selectedOperator, setSelectedOperator] = useState<FilterOperator>("contains");
187
+ const [filterValue, setFilterValue] = useState("");
300
188
 
301
189
  const selectedColumn = availableColumns.find((col) => col.id === selectedColumnId);
302
190
 
303
- const availableOperators = useMemo(() => {
304
- if (!selectedColumn) return [];
305
-
306
- const baseOperators: FilterOperator[] = ["is", "isNot"];
307
-
308
- switch (selectedColumn.type) {
309
- case "text":
310
- return [
311
- ...baseOperators,
312
- "contains",
313
- "doesNotContain",
314
- "startsWith",
315
- "endsWith",
316
- "isEmpty",
317
- "isNotEmpty",
318
- ];
319
- case "number":
320
- return [
321
- ...baseOperators,
322
- "isLessThan",
323
- "isGreaterThan",
324
- "isLessThanOrEqual",
325
- "isGreaterThanOrEqual",
326
- "isBetween",
327
- "isNotBetween",
328
- ];
329
- case "date":
330
- return [
331
- ...baseOperators,
332
- "isBefore",
333
- "isAfter",
334
- "isOnOrBefore",
335
- "isOnOrAfter",
336
- "isBetween",
337
- "isNotBetween",
338
- ];
339
- case "boolean":
340
- return baseOperators;
341
- default:
342
- return baseOperators;
191
+ useEffect(() => {
192
+ if (editingFilter) {
193
+ setSelectedColumnId(editingFilter.columnId);
194
+ setSelectedOperator(editingFilter.value.operator);
195
+ setFilterValue(String(editingFilter.value.value ?? ""));
196
+ return;
343
197
  }
344
- }, [selectedColumn]);
345
-
346
- // Convert to forms Select options
347
- const columnOptions = useMemo(
348
- () =>
349
- availableColumns.map((col) => ({
350
- value: col.id,
351
- label: col.label,
352
- })),
353
- [availableColumns],
354
- );
198
+ setSelectedColumnId("");
199
+ setSelectedOperator("contains");
200
+ setFilterValue("");
201
+ }, [editingFilter]);
355
202
 
356
- const operatorOptions = useMemo(
357
- () =>
358
- availableOperators.map((op) => ({
359
- value: op,
360
- label: getOperatorLabel(op as FilterOperator),
361
- })),
362
- [availableOperators],
363
- );
203
+ const columnOptions = availableColumns.map((col) => ({
204
+ value: col.id,
205
+ label: col.label,
206
+ }));
364
207
 
365
- const handleAddFilter = () => {
208
+ const handleCommit = () => {
366
209
  if (!selectedColumnId || !selectedOperator) return;
367
-
368
- const filterValueObj: FilterValue = {
210
+ const value: FilterValue = {
369
211
  operator: selectedOperator,
370
- value: null,
212
+ value: operatorNeedsNoValue(selectedOperator) ? null : filterValue,
371
213
  };
372
-
373
- // Handle different operator types
374
- if (["isBetween", "isNotBetween"].includes(selectedOperator)) {
375
- filterValueObj.values = filterValues;
376
- } else if (["isAnyOf", "isNoneOf"].includes(selectedOperator)) {
377
- filterValueObj.values = filterValues;
378
- } else if (!["isEmpty", "isNotEmpty"].includes(selectedOperator)) {
379
- filterValueObj.value = filterValue;
380
- }
381
-
382
- onAddFilter({
214
+ onCommit({
383
215
  columnId: selectedColumnId,
384
- value: filterValueObj,
216
+ value,
385
217
  label: selectedColumn?.label,
386
218
  });
387
-
388
- // Reset form
389
219
  setSelectedColumnId("");
390
- setSelectedOperator("is");
220
+ setSelectedOperator("contains");
391
221
  setFilterValue("");
392
- setFilterValues([]);
393
- };
394
-
395
- const renderValueInput = () => {
396
- if (!selectedColumn || ["isEmpty", "isNotEmpty"].includes(selectedOperator)) {
397
- return null;
398
- }
399
-
400
- if (["isBetween", "isNotBetween"].includes(selectedOperator)) {
401
- return (
402
- <XStack gap="$2">
403
- <Input
404
- placeholder={t("Min value")}
405
- value={filterValues[0] || ""}
406
- onChangeText={(text) => {
407
- const newValues = [...filterValues];
408
- newValues[0] = text;
409
- setFilterValues(newValues);
410
- }}
411
- />
412
- <Input
413
- placeholder={t("Max value")}
414
- value={filterValues[1] || ""}
415
- onChangeText={(text) => {
416
- const newValues = [...filterValues];
417
- newValues[1] = text;
418
- setFilterValues(newValues);
419
- }}
420
- />
421
- </XStack>
422
- );
423
- }
424
-
425
- if (["isAnyOf", "isNoneOf"].includes(selectedOperator)) {
426
- // For select columns with predefined options
427
- if (selectedColumn.options) {
428
- return (
429
- <ScrollView maxHeight={120}>
430
- <YStack gap="$1">
431
- {selectedColumn.options.map((option) => (
432
- <XStack key={String(option.value)} alignItems="center" gap="$2">
433
- <input
434
- type="checkbox"
435
- checked={filterValues.includes(option.value)}
436
- onChange={(e) => {
437
- if (e.target.checked) {
438
- setFilterValues([...filterValues, option.value]);
439
- } else {
440
- setFilterValues(filterValues.filter((v) => v !== option.value));
441
- }
442
- }}
443
- />
444
- <Text fontSize="$3">{option.label}</Text>
445
- <View
446
- backgroundColor="$color5"
447
- paddingHorizontal="$1"
448
- paddingVertical="$0.5"
449
- borderRadius="$1"
450
- >
451
- <Text color="$color10" fontSize="$1">
452
- {option.count}
453
- </Text>
454
- </View>
455
- </XStack>
456
- ))}
457
- </YStack>
458
- </ScrollView>
459
- );
460
- }
461
-
462
- return (
463
- <Input
464
- placeholder={t("Enter values separated by commas")}
465
- value={filterValues.join(", ")}
466
- onChangeText={(text) => {
467
- setFilterValues(text.split(",").map((v) => v.trim()));
468
- }}
469
- />
470
- );
471
- }
472
-
473
- // Single value input
474
- if (selectedColumn.type === "date") {
475
- return (
476
- <Input
477
- label={t("Value")}
478
- placeholder={t("YYYY-MM-DD")}
479
- value={filterValue}
480
- onChangeText={setFilterValue}
481
- />
482
- );
483
- }
484
-
485
- if (selectedColumn.type === "boolean") {
486
- return (
487
- <Select
488
- label={t("Value")}
489
- value={filterValue}
490
- onValueChange={(v) => {
491
- if (typeof v === "string") {
492
- setFilterValue(v);
493
- }
494
- }}
495
- options={[
496
- { value: "true", label: t("True") },
497
- { value: "false", label: t("False") },
498
- ]}
499
- placeholder={t("Select value")}
500
- />
501
- );
502
- }
503
-
504
- if (selectedColumn.options) {
505
- return (
506
- <Select
507
- label={t("Value")}
508
- value={filterValue}
509
- onValueChange={(v) => {
510
- if (typeof v === "string") {
511
- setFilterValue(v);
512
- }
513
- }}
514
- options={selectedColumn.options.map((option) => ({
515
- value: option.value.toString(),
516
- label: option.label,
517
- }))}
518
- placeholder={t("Select value")}
519
- />
520
- );
521
- }
522
-
523
- return (
524
- <Input
525
- label={t("Value")}
526
- placeholder={t("Enter value")}
527
- value={filterValue}
528
- onChangeText={setFilterValue}
529
- {...(selectedColumn.type === "number" && { keyboardType: "numeric" })}
530
- />
531
- );
532
222
  };
533
223
 
534
224
  return (
535
- <YStack {...knobProps.panelPadding} gap="$4" minWidth={builderMinWidth}>
536
- <Text fontSize="$4" fontWeight="600">
537
- {t("Add Filter")}
225
+ <YStack {...knobProps.panelPadding} gap="$3" minWidth={280} maxWidth={360}>
226
+ <Text fontSize="$3" fontWeight="600" color="$color12">
227
+ {editingFilter ? t("Edit filter") : t("Add filter")}
538
228
  </Text>
539
229
 
540
- {/* Column Selection */}
541
230
  <Select
542
231
  label={t("Column")}
543
232
  value={selectedColumnId}
544
233
  onValueChange={(v) => {
545
- if (typeof v === "string") {
546
- setSelectedColumnId(v);
547
- }
234
+ if (typeof v !== "string") return;
235
+ setSelectedColumnId(v);
236
+ const col = availableColumns.find((c) => c.id === v);
237
+ setSelectedOperator(defaultOperatorForFilterType(col?.type ?? "text"));
238
+ setFilterValue("");
548
239
  }}
549
240
  options={columnOptions}
550
241
  placeholder={t("Select column")}
242
+ size="$3"
243
+ compact
551
244
  />
552
245
 
553
- {/* Operator Selection */}
554
- {selectedColumnId && (
555
- <Select
556
- label={t("Condition")}
557
- value={selectedOperator}
558
- onValueChange={(v) => {
559
- if (typeof v === "string") {
560
- setSelectedOperator(v as FilterOperator);
561
- }
562
- }}
563
- options={operatorOptions}
246
+ {selectedColumn ? (
247
+ <FilterOperatorValueEditor
248
+ fieldType={selectedColumn.type}
249
+ operator={selectedOperator}
250
+ value={filterValue}
251
+ onOperatorChange={setSelectedOperator}
252
+ onValueChange={setFilterValue}
253
+ options={selectedColumn.options}
564
254
  />
565
- )}
255
+ ) : null}
566
256
 
567
- {/* Value Input */}
568
- {selectedColumnId && renderValueInput()}
569
-
570
- {/* Actions */}
571
257
  <XStack gap="$2" justifyContent="flex-end">
572
- <Button size={knobProps.sizeToken} variant="outlined" onPress={onCancel}>
258
+ <Button size="$3" compact variant="outlined" onPress={onCancel}>
573
259
  {t("Cancel")}
574
260
  </Button>
575
261
  <Button
576
- size={knobProps.sizeToken}
577
- onPress={handleAddFilter}
578
- disabled={!selectedColumnId || !selectedOperator}
262
+ size="$3"
263
+ compact
264
+ accent
265
+ onPress={handleCommit}
266
+ disabled={!selectedColumnId || !selectedOperator || !canAdd}
579
267
  >
580
- {t("Add Filter")}
268
+ {editingFilter ? t("Update") : t("Add filter")}
581
269
  </Button>
582
270
  </XStack>
583
271
  </YStack>
584
272
  );
585
273
  }
586
-
587
- // Active Filter Component
588
-
589
- interface ActiveFilterProps {
590
- filter: TableFilter;
591
- availableColumns: Array<{
592
- id: string;
593
- label: string;
594
- type: DataTableColumnType;
595
- options?: FacetedFilterOption[];
596
- }>;
597
- onUpdate: (updates: Partial<TableFilter>) => void;
598
- onRemove: () => void;
599
- index: number;
600
- }
601
-
602
- function ActiveFilter({
603
- filter,
604
- availableColumns,
605
- onUpdate: _onUpdate,
606
- onRemove,
607
- index,
608
- }: ActiveFilterProps) {
609
- const { knobProps } = useResolvedKnobs();
610
- const column = availableColumns.find((col) => col.id === filter.columnId);
611
-
612
- return (
613
- <XStack
614
- {...({ render: "li" } as object)}
615
- alignItems="center"
616
- justifyContent="space-between"
617
- padding="$3"
618
- {...{ backgroundColor: "$color2" }}
619
- {...knobProps.borderRadius}
620
- borderColor="$color6"
621
- aria-label={`Filter ${index + 1}: ${getFilterDescription(filter)}`}
622
- >
623
- <XStack alignItems="center" gap="$2" flex={1}>
624
- <ColumnTypeIcon type={column?.type || "text"} size={14} />
625
- <Text fontSize="$3" color="$color10">
626
- {getFilterDescription(filter)}
627
- </Text>
628
- </XStack>
629
-
630
- <Button
631
- size="$2"
632
- variant="outlined"
633
- onPress={onRemove}
634
- icon={<XIcon size={16} />}
635
- aria-label={`Remove filter: ${getFilterDescription(filter)}`}
636
- />
637
- </XStack>
638
- );
639
- }
640
-
641
- // Helper Components
642
-
643
- function ColumnTypeIcon({ type, size }: { type: DataTableColumnType; size: number }) {
644
- switch (type) {
645
- case "text":
646
- return <TextTIcon size={size} color="$color10" />;
647
- case "number":
648
- return <HashIcon size={size} color="$color10" />;
649
- case "date":
650
- return <CalendarBlankIcon size={size} color="$color10" />;
651
- case "boolean":
652
- return <CheckSquareIcon size={size} color="$color10" />;
653
- default:
654
- return <TextTIcon size={size} color="$color10" />;
655
- }
656
- }
657
-
658
- function getOperatorLabel(operator: FilterOperator): string {
659
- const labels: Record<FilterOperator, string> = {
660
- // Text
661
- contains: "Contains",
662
- doesNotContain: "Does not contain",
663
- is: "Is",
664
- isNot: "Is not",
665
- startsWith: "Starts with",
666
- endsWith: "Ends with",
667
- isEmpty: "Is empty",
668
- isNotEmpty: "Is not empty",
669
- // Number
670
- isLessThan: "Is less than",
671
- isGreaterThan: "Is greater than",
672
- isLessThanOrEqual: "Is less than or equal to",
673
- isGreaterThanOrEqual: "Is greater than or equal to",
674
- isBetween: "Is between",
675
- isNotBetween: "Is not between",
676
- // Date
677
- isBefore: "Is before",
678
- isAfter: "Is after",
679
- isOnOrBefore: "Is on or before",
680
- isOnOrAfter: "Is on or after",
681
- // Option
682
- isAnyOf: "Is any of",
683
- isNoneOf: "Is none of",
684
- };
685
-
686
- const label = labels[operator];
687
- return label ? t(label) : operator;
688
- }