@multiplatform.one/table 7.10.0 → 7.15.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 (307) hide show
  1. package/README.md +61 -1
  2. package/dist/cjs/components/ChildTable/index.cjs +8 -2
  3. package/dist/cjs/components/ChildTable/index.native.js +8 -2
  4. package/dist/cjs/components/ChildTable/index.native.js.map +1 -1
  5. package/dist/cjs/components/ColumnHeaderFilter/index.cjs +77 -111
  6. package/dist/cjs/components/ColumnHeaderFilter/index.native.js +89 -129
  7. package/dist/cjs/components/ColumnHeaderFilter/index.native.js.map +1 -1
  8. package/dist/cjs/components/DataTable/DataTableCardControls.cjs +90 -54
  9. package/dist/cjs/components/DataTable/DataTableCardControls.native.js +93 -56
  10. package/dist/cjs/components/DataTable/DataTableCardControls.native.js.map +1 -1
  11. package/dist/cjs/components/DataTable/DataTableRoot.cjs +68 -9
  12. package/dist/cjs/components/DataTable/DataTableRoot.native.js +78 -11
  13. package/dist/cjs/components/DataTable/DataTableRoot.native.js.map +1 -1
  14. package/dist/cjs/components/DataTableCell/CellModalEditor.cjs +72 -70
  15. package/dist/cjs/components/DataTableCell/index.cjs +2 -2
  16. package/dist/cjs/components/DataTableCell/index.native.js +2 -11
  17. package/dist/cjs/components/DataTableCell/index.native.js.map +1 -1
  18. package/dist/cjs/components/DataTableDateFilter/index.cjs +135 -158
  19. package/dist/cjs/components/DataTableDateFilter/index.native.js +153 -183
  20. package/dist/cjs/components/DataTableDateFilter/index.native.js.map +1 -1
  21. package/dist/cjs/components/DataTableExport/index.cjs +122 -139
  22. package/dist/cjs/components/DataTableExport/index.native.js +135 -157
  23. package/dist/cjs/components/DataTableExport/index.native.js.map +1 -1
  24. package/dist/cjs/components/DataTableFilterButton/index.cjs +14 -0
  25. package/dist/cjs/components/DataTableFilterButton/index.native.js +15 -0
  26. package/dist/cjs/components/DataTableFilterButton/index.native.js.map +1 -1
  27. package/dist/cjs/components/DataTableGrouping/index.cjs +192 -212
  28. package/dist/cjs/components/DataTableGrouping/index.native.js +209 -230
  29. package/dist/cjs/components/DataTableGrouping/index.native.js.map +1 -1
  30. package/dist/cjs/components/DataTableSearch/index.cjs +103 -115
  31. package/dist/cjs/components/DataTableSearch/index.native.js +111 -123
  32. package/dist/cjs/components/DataTableSearch/index.native.js.map +1 -1
  33. package/dist/cjs/components/DataTableToolbar/index.cjs +161 -101
  34. package/dist/cjs/components/DataTableToolbar/index.native.js +168 -109
  35. package/dist/cjs/components/DataTableToolbar/index.native.js.map +1 -1
  36. package/dist/cjs/components/DataTableViewOptions/index.cjs +38 -54
  37. package/dist/cjs/components/DataTableViewOptions/index.native.js +40 -56
  38. package/dist/cjs/components/DataTableViewOptions/index.native.js.map +1 -1
  39. package/dist/cjs/components/FilterOperatorValueEditor/index.cjs +3 -11
  40. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js +3 -11
  41. package/dist/cjs/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  42. package/dist/cjs/components/SimpleTable/index.cjs +2 -6
  43. package/dist/cjs/components/SimpleTable/index.native.js +2 -6
  44. package/dist/cjs/components/SimpleTable/index.native.js.map +1 -1
  45. package/dist/cjs/components/TableInput/RowDetailEditor.cjs +190 -0
  46. package/dist/cjs/components/TableInput/RowDetailEditor.native.js +172 -0
  47. package/dist/cjs/components/TableInput/RowDetailEditor.native.js.map +1 -0
  48. package/dist/cjs/components/TableInput/index.cjs +42 -5
  49. package/dist/cjs/components/TableInput/index.native.js +64 -1
  50. package/dist/cjs/components/TableInput/index.native.js.map +1 -1
  51. package/dist/cjs/components/TableInput/shared.cjs +8 -0
  52. package/dist/cjs/components/TableInput/shared.native.js +10 -0
  53. package/dist/cjs/components/TableInput/shared.native.js.map +1 -1
  54. package/dist/cjs/hooks/useDataTable.cjs +43 -2
  55. package/dist/cjs/hooks/useDataTable.native.js +49 -3
  56. package/dist/cjs/hooks/useDataTable.native.js.map +1 -1
  57. package/dist/cjs/index.native.js.map +1 -1
  58. package/dist/cjs/utils/rowPress.cjs +4 -1
  59. package/dist/cjs/utils/rowPress.native.js +4 -1
  60. package/dist/cjs/utils/rowPress.native.js.map +1 -1
  61. package/dist/esm/components/ChildTable/index.mjs +8 -2
  62. package/dist/esm/components/ChildTable/index.mjs.map +1 -1
  63. package/dist/esm/components/ChildTable/index.native.js +8 -2
  64. package/dist/esm/components/ChildTable/index.native.js.map +1 -1
  65. package/dist/esm/components/ColumnHeaderFilter/index.mjs +80 -114
  66. package/dist/esm/components/ColumnHeaderFilter/index.mjs.map +1 -1
  67. package/dist/esm/components/ColumnHeaderFilter/index.native.js +92 -132
  68. package/dist/esm/components/ColumnHeaderFilter/index.native.js.map +1 -1
  69. package/dist/esm/components/DataTable/DataTableCardControls.mjs +89 -54
  70. package/dist/esm/components/DataTable/DataTableCardControls.mjs.map +1 -1
  71. package/dist/esm/components/DataTable/DataTableCardControls.native.js +92 -56
  72. package/dist/esm/components/DataTable/DataTableCardControls.native.js.map +1 -1
  73. package/dist/esm/components/DataTable/DataTableRoot.mjs +70 -11
  74. package/dist/esm/components/DataTable/DataTableRoot.mjs.map +1 -1
  75. package/dist/esm/components/DataTable/DataTableRoot.native.js +80 -13
  76. package/dist/esm/components/DataTable/DataTableRoot.native.js.map +1 -1
  77. package/dist/esm/components/DataTableCell/CellModalEditor.mjs +76 -74
  78. package/dist/esm/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  79. package/dist/esm/components/DataTableCell/index.mjs +3 -3
  80. package/dist/esm/components/DataTableCell/index.mjs.map +1 -1
  81. package/dist/esm/components/DataTableCell/index.native.js +3 -12
  82. package/dist/esm/components/DataTableCell/index.native.js.map +1 -1
  83. package/dist/esm/components/DataTableDateFilter/index.mjs +137 -160
  84. package/dist/esm/components/DataTableDateFilter/index.mjs.map +1 -1
  85. package/dist/esm/components/DataTableDateFilter/index.native.js +155 -185
  86. package/dist/esm/components/DataTableDateFilter/index.native.js.map +1 -1
  87. package/dist/esm/components/DataTableExport/index.mjs +124 -141
  88. package/dist/esm/components/DataTableExport/index.mjs.map +1 -1
  89. package/dist/esm/components/DataTableExport/index.native.js +137 -159
  90. package/dist/esm/components/DataTableExport/index.native.js.map +1 -1
  91. package/dist/esm/components/DataTableFilterButton/index.mjs +14 -1
  92. package/dist/esm/components/DataTableFilterButton/index.mjs.map +1 -1
  93. package/dist/esm/components/DataTableFilterButton/index.native.js +15 -1
  94. package/dist/esm/components/DataTableFilterButton/index.native.js.map +1 -1
  95. package/dist/esm/components/DataTableGrouping/index.mjs +194 -214
  96. package/dist/esm/components/DataTableGrouping/index.mjs.map +1 -1
  97. package/dist/esm/components/DataTableGrouping/index.native.js +211 -232
  98. package/dist/esm/components/DataTableGrouping/index.native.js.map +1 -1
  99. package/dist/esm/components/DataTableSearch/index.mjs +105 -117
  100. package/dist/esm/components/DataTableSearch/index.mjs.map +1 -1
  101. package/dist/esm/components/DataTableSearch/index.native.js +113 -125
  102. package/dist/esm/components/DataTableSearch/index.native.js.map +1 -1
  103. package/dist/esm/components/DataTableToolbar/index.mjs +165 -106
  104. package/dist/esm/components/DataTableToolbar/index.mjs.map +1 -1
  105. package/dist/esm/components/DataTableToolbar/index.native.js +172 -114
  106. package/dist/esm/components/DataTableToolbar/index.native.js.map +1 -1
  107. package/dist/esm/components/DataTableViewOptions/index.mjs +40 -56
  108. package/dist/esm/components/DataTableViewOptions/index.mjs.map +1 -1
  109. package/dist/esm/components/DataTableViewOptions/index.native.js +42 -58
  110. package/dist/esm/components/DataTableViewOptions/index.native.js.map +1 -1
  111. package/dist/esm/components/FilterOperatorValueEditor/index.mjs +3 -11
  112. package/dist/esm/components/FilterOperatorValueEditor/index.mjs.map +1 -1
  113. package/dist/esm/components/FilterOperatorValueEditor/index.native.js +3 -11
  114. package/dist/esm/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  115. package/dist/esm/components/SimpleTable/index.mjs +3 -7
  116. package/dist/esm/components/SimpleTable/index.mjs.map +1 -1
  117. package/dist/esm/components/SimpleTable/index.native.js +3 -7
  118. package/dist/esm/components/SimpleTable/index.native.js.map +1 -1
  119. package/dist/esm/components/TableInput/RowDetailEditor.mjs +165 -0
  120. package/dist/esm/components/TableInput/RowDetailEditor.mjs.map +1 -0
  121. package/dist/esm/components/TableInput/RowDetailEditor.native.js +144 -0
  122. package/dist/esm/components/TableInput/RowDetailEditor.native.js.map +1 -0
  123. package/dist/esm/components/TableInput/index.mjs +42 -5
  124. package/dist/esm/components/TableInput/index.mjs.map +1 -1
  125. package/dist/esm/components/TableInput/index.native.js +64 -1
  126. package/dist/esm/components/TableInput/index.native.js.map +1 -1
  127. package/dist/esm/components/TableInput/shared.mjs +7 -1
  128. package/dist/esm/components/TableInput/shared.mjs.map +1 -1
  129. package/dist/esm/components/TableInput/shared.native.js +9 -1
  130. package/dist/esm/components/TableInput/shared.native.js.map +1 -1
  131. package/dist/esm/hooks/useDataTable.mjs +43 -2
  132. package/dist/esm/hooks/useDataTable.mjs.map +1 -1
  133. package/dist/esm/hooks/useDataTable.native.js +49 -3
  134. package/dist/esm/hooks/useDataTable.native.js.map +1 -1
  135. package/dist/esm/index.mjs.map +1 -1
  136. package/dist/esm/index.native.js.map +1 -1
  137. package/dist/esm/utils/rowPress.mjs +4 -1
  138. package/dist/esm/utils/rowPress.mjs.map +1 -1
  139. package/dist/esm/utils/rowPress.native.js +4 -1
  140. package/dist/esm/utils/rowPress.native.js.map +1 -1
  141. package/dist/jsx/components/ChildTable/index.mjs +8 -2
  142. package/dist/jsx/components/ChildTable/index.mjs.map +1 -1
  143. package/dist/jsx/components/ChildTable/index.native.js +8 -2
  144. package/dist/jsx/components/ChildTable/index.native.js.map +1 -1
  145. package/dist/jsx/components/ColumnHeaderFilter/index.mjs +80 -114
  146. package/dist/jsx/components/ColumnHeaderFilter/index.mjs.map +1 -1
  147. package/dist/jsx/components/ColumnHeaderFilter/index.native.js +89 -129
  148. package/dist/jsx/components/ColumnHeaderFilter/index.native.js.map +1 -1
  149. package/dist/jsx/components/DataTable/DataTableCardControls.mjs +89 -54
  150. package/dist/jsx/components/DataTable/DataTableCardControls.mjs.map +1 -1
  151. package/dist/jsx/components/DataTable/DataTableCardControls.native.js +93 -56
  152. package/dist/jsx/components/DataTable/DataTableCardControls.native.js.map +1 -1
  153. package/dist/jsx/components/DataTable/DataTableRoot.mjs +70 -11
  154. package/dist/jsx/components/DataTable/DataTableRoot.mjs.map +1 -1
  155. package/dist/jsx/components/DataTable/DataTableRoot.native.js +78 -11
  156. package/dist/jsx/components/DataTable/DataTableRoot.native.js.map +1 -1
  157. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs +76 -74
  158. package/dist/jsx/components/DataTableCell/CellModalEditor.mjs.map +1 -1
  159. package/dist/jsx/components/DataTableCell/index.mjs +3 -3
  160. package/dist/jsx/components/DataTableCell/index.mjs.map +1 -1
  161. package/dist/jsx/components/DataTableCell/index.native.js +2 -11
  162. package/dist/jsx/components/DataTableCell/index.native.js.map +1 -1
  163. package/dist/jsx/components/DataTableDateFilter/index.mjs +137 -160
  164. package/dist/jsx/components/DataTableDateFilter/index.mjs.map +1 -1
  165. package/dist/jsx/components/DataTableDateFilter/index.native.js +153 -183
  166. package/dist/jsx/components/DataTableDateFilter/index.native.js.map +1 -1
  167. package/dist/jsx/components/DataTableExport/index.mjs +124 -141
  168. package/dist/jsx/components/DataTableExport/index.mjs.map +1 -1
  169. package/dist/jsx/components/DataTableExport/index.native.js +135 -157
  170. package/dist/jsx/components/DataTableExport/index.native.js.map +1 -1
  171. package/dist/jsx/components/DataTableFilterButton/index.mjs +14 -1
  172. package/dist/jsx/components/DataTableFilterButton/index.mjs.map +1 -1
  173. package/dist/jsx/components/DataTableFilterButton/index.native.js +15 -0
  174. package/dist/jsx/components/DataTableFilterButton/index.native.js.map +1 -1
  175. package/dist/jsx/components/DataTableGrouping/index.mjs +194 -214
  176. package/dist/jsx/components/DataTableGrouping/index.mjs.map +1 -1
  177. package/dist/jsx/components/DataTableGrouping/index.native.js +209 -230
  178. package/dist/jsx/components/DataTableGrouping/index.native.js.map +1 -1
  179. package/dist/jsx/components/DataTableSearch/index.mjs +105 -117
  180. package/dist/jsx/components/DataTableSearch/index.mjs.map +1 -1
  181. package/dist/jsx/components/DataTableSearch/index.native.js +111 -123
  182. package/dist/jsx/components/DataTableSearch/index.native.js.map +1 -1
  183. package/dist/jsx/components/DataTableToolbar/index.mjs +165 -106
  184. package/dist/jsx/components/DataTableToolbar/index.mjs.map +1 -1
  185. package/dist/jsx/components/DataTableToolbar/index.native.js +168 -109
  186. package/dist/jsx/components/DataTableToolbar/index.native.js.map +1 -1
  187. package/dist/jsx/components/DataTableViewOptions/index.mjs +40 -56
  188. package/dist/jsx/components/DataTableViewOptions/index.mjs.map +1 -1
  189. package/dist/jsx/components/DataTableViewOptions/index.native.js +40 -56
  190. package/dist/jsx/components/DataTableViewOptions/index.native.js.map +1 -1
  191. package/dist/jsx/components/FilterOperatorValueEditor/index.mjs +3 -11
  192. package/dist/jsx/components/FilterOperatorValueEditor/index.mjs.map +1 -1
  193. package/dist/jsx/components/FilterOperatorValueEditor/index.native.js +3 -11
  194. package/dist/jsx/components/FilterOperatorValueEditor/index.native.js.map +1 -1
  195. package/dist/jsx/components/SimpleTable/index.mjs +3 -7
  196. package/dist/jsx/components/SimpleTable/index.mjs.map +1 -1
  197. package/dist/jsx/components/SimpleTable/index.native.js +2 -6
  198. package/dist/jsx/components/SimpleTable/index.native.js.map +1 -1
  199. package/dist/jsx/components/TableInput/RowDetailEditor.mjs +165 -0
  200. package/dist/jsx/components/TableInput/RowDetailEditor.mjs.map +1 -0
  201. package/dist/jsx/components/TableInput/RowDetailEditor.native.js +172 -0
  202. package/dist/jsx/components/TableInput/RowDetailEditor.native.js.map +1 -0
  203. package/dist/jsx/components/TableInput/index.mjs +42 -5
  204. package/dist/jsx/components/TableInput/index.mjs.map +1 -1
  205. package/dist/jsx/components/TableInput/index.native.js +64 -1
  206. package/dist/jsx/components/TableInput/index.native.js.map +1 -1
  207. package/dist/jsx/components/TableInput/shared.mjs +7 -1
  208. package/dist/jsx/components/TableInput/shared.mjs.map +1 -1
  209. package/dist/jsx/components/TableInput/shared.native.js +10 -0
  210. package/dist/jsx/components/TableInput/shared.native.js.map +1 -1
  211. package/dist/jsx/hooks/useDataTable.mjs +43 -2
  212. package/dist/jsx/hooks/useDataTable.mjs.map +1 -1
  213. package/dist/jsx/hooks/useDataTable.native.js +49 -3
  214. package/dist/jsx/hooks/useDataTable.native.js.map +1 -1
  215. package/dist/jsx/index.js.map +1 -1
  216. package/dist/jsx/index.mjs.map +1 -1
  217. package/dist/jsx/index.native.js.map +1 -1
  218. package/dist/jsx/utils/rowPress.mjs +4 -1
  219. package/dist/jsx/utils/rowPress.mjs.map +1 -1
  220. package/dist/jsx/utils/rowPress.native.js +4 -1
  221. package/dist/jsx/utils/rowPress.native.js.map +1 -1
  222. package/package.json +16 -16
  223. package/src/components/ChildTable/childTable.cellHidden.spec.tsx +57 -0
  224. package/src/components/ChildTable/childTable.rowDetail.spec.tsx +120 -0
  225. package/src/components/ChildTable/index.tsx +16 -0
  226. package/src/components/ColumnHeaderFilter/index.tsx +89 -116
  227. package/src/components/DataTable/DataTable.stories.tsx +130 -6
  228. package/src/components/DataTable/DataTableCardControls.stories.tsx +61 -2
  229. package/src/components/DataTable/DataTableCardControls.tsx +92 -66
  230. package/src/components/DataTable/DataTableRoot.tsx +109 -18
  231. package/src/components/DataTable/cardLayout.spec.tsx +4 -3
  232. package/src/components/DataTable/cardToolbar.spec.tsx +238 -0
  233. package/src/components/DataTable/chromeInterplay.spec.tsx +7 -5
  234. package/src/components/DataTable/columnWidthLayout.spec.tsx +189 -0
  235. package/src/components/DataTable/dataTableCardControls.spec.tsx +3 -2
  236. package/src/components/DataTable/dataTableMobileCards.spec.tsx +1 -4
  237. package/src/components/DataTable/footerLayout.spec.tsx +250 -0
  238. package/src/components/DataTable/headerContainment.spec.tsx +91 -0
  239. package/src/components/DataTable/pinningGeometry.spec.tsx +66 -1
  240. package/src/components/DataTable/rowPress.spec.tsx +2 -6
  241. package/src/components/DataTableBulkActions/DataTableBulkActions.stories.tsx +5 -4
  242. package/src/components/DataTableCell/CellModalEditor.tsx +95 -75
  243. package/src/components/DataTableCell/cellDraftPolicy.spec.tsx +12 -2
  244. package/src/components/DataTableCell/cellModalEditor.spec.tsx +75 -49
  245. package/src/components/DataTableCell/dataTableCell.spec.tsx +31 -14
  246. package/src/components/DataTableCell/index.tsx +3 -2
  247. package/src/components/DataTableDateFilter/DataTableDateFilter.spec.tsx +6 -3
  248. package/src/components/DataTableDateFilter/index.tsx +151 -180
  249. package/src/components/DataTableExport/DataTableExport.spec.tsx +42 -18
  250. package/src/components/DataTableExport/index.tsx +135 -142
  251. package/src/components/DataTableFilterButton/index.tsx +9 -0
  252. package/src/components/DataTableGrouping/index.tsx +193 -195
  253. package/src/components/DataTableSearch/index.tsx +111 -109
  254. package/src/components/DataTableToolbar/index.tsx +179 -107
  255. package/src/components/DataTableViewOptions/DataTableViewOptions.stories.tsx +52 -0
  256. package/src/components/DataTableViewOptions/index.tsx +32 -40
  257. package/src/components/FilterOperatorValueEditor/FilterOperatorValueEditor.spec.tsx +64 -2
  258. package/src/components/FilterOperatorValueEditor/index.tsx +0 -8
  259. package/src/components/SimpleTable/index.tsx +3 -2
  260. package/src/components/SimpleTable/simpleTable.spec.tsx +15 -0
  261. package/src/components/Table/accessibility.spec.tsx +7 -19
  262. package/src/components/TableInput/RowDetailEditor.native.tsx +134 -0
  263. package/src/components/TableInput/RowDetailEditor.tsx +173 -0
  264. package/src/components/TableInput/index.native.tsx +49 -1
  265. package/src/components/TableInput/index.tsx +65 -10
  266. package/src/components/TableInput/shared.ts +29 -0
  267. package/src/components/tableDropdowns.spec.tsx +172 -0
  268. package/src/hooks/useDataTable.spec.ts +153 -0
  269. package/src/hooks/useDataTable.ts +38 -2
  270. package/src/index.ts +1 -0
  271. package/src/types.ts +14 -12
  272. package/src/utils/rowPress.ts +3 -0
  273. package/types/components/ChildTable/index.d.ts +10 -0
  274. package/types/components/ChildTable/index.d.ts.map +1 -1
  275. package/types/components/ColumnHeaderFilter/index.d.ts +1 -1
  276. package/types/components/ColumnHeaderFilter/index.d.ts.map +1 -1
  277. package/types/components/DataTable/DataTableCardControls.d.ts +3 -0
  278. package/types/components/DataTable/DataTableCardControls.d.ts.map +1 -1
  279. package/types/components/DataTable/DataTableRoot.d.ts.map +1 -1
  280. package/types/components/DataTableCell/CellModalEditor.d.ts +10 -7
  281. package/types/components/DataTableCell/CellModalEditor.d.ts.map +1 -1
  282. package/types/components/DataTableCell/index.d.ts.map +1 -1
  283. package/types/components/DataTableDateFilter/index.d.ts.map +1 -1
  284. package/types/components/DataTableFilterButton/index.d.ts +2 -1
  285. package/types/components/DataTableFilterButton/index.d.ts.map +1 -1
  286. package/types/components/DataTableGrouping/index.d.ts.map +1 -1
  287. package/types/components/DataTableSearch/index.d.ts.map +1 -1
  288. package/types/components/DataTableToolbar/index.d.ts +1 -0
  289. package/types/components/DataTableToolbar/index.d.ts.map +1 -1
  290. package/types/components/FilterOperatorValueEditor/index.d.ts.map +1 -1
  291. package/types/components/SimpleTable/index.d.ts.map +1 -1
  292. package/types/components/TableInput/RowDetailEditor.d.ts +24 -0
  293. package/types/components/TableInput/RowDetailEditor.d.ts.map +1 -0
  294. package/types/components/TableInput/RowDetailEditor.native.d.ts +11 -0
  295. package/types/components/TableInput/RowDetailEditor.native.d.ts.map +1 -0
  296. package/types/components/TableInput/index.d.ts +11 -2
  297. package/types/components/TableInput/index.d.ts.map +1 -1
  298. package/types/components/TableInput/index.native.d.ts +8 -1
  299. package/types/components/TableInput/index.native.d.ts.map +1 -1
  300. package/types/components/TableInput/shared.d.ts +11 -0
  301. package/types/components/TableInput/shared.d.ts.map +1 -1
  302. package/types/hooks/useDataTable.d.ts.map +1 -1
  303. package/types/index.d.ts +1 -0
  304. package/types/index.d.ts.map +1 -1
  305. package/types/types.d.ts +14 -12
  306. package/types/types.d.ts.map +1 -1
  307. package/types/utils/rowPress.d.ts.map +1 -1
@@ -2,9 +2,14 @@ import { SlidersHorizontalIcon } from "@phosphor-icons/react";
2
2
  import { sizeRecipeForToken, useResolvedKnobs } from "@multiplatform.one/theme";
3
3
  import type React from "react";
4
4
  import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
5
- import { PopoverContent } from "@multiplatform.one/components";
6
- import { Button, Checkbox, SearchInput, formCommonColors } from "@multiplatform.one/forms";
7
- import { Popover, ScrollView, Separator, Text, View, XStack, YStack, isWeb } from "tamagui";
5
+ import {
6
+ Button,
7
+ Checkbox,
8
+ FloatingPanel,
9
+ SearchInput,
10
+ formCommonColors,
11
+ } from "@multiplatform.one/forms";
12
+ import { Separator, Text, View, XStack, YStack, isWeb } from "tamagui";
8
13
  import { useDataTableState } from "../DataTable/DataTableStateContext";
9
14
  import { t } from "../../shared/t";
10
15
  import { bidiIsolate } from "../../utils/withInterp";
@@ -165,7 +170,7 @@ export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
165
170
  </View>
166
171
 
167
172
  {showAdvancedOptions && (
168
- <SearchOptionsPopover
173
+ <SearchOptionsPanel
169
174
  searchOptions={searchOptions}
170
175
  onOptionsChange={handleOptionsChange}
171
176
  columns={searchableColumns}
@@ -201,7 +206,7 @@ export function DataTableSearch<T = any>(props: DataTableSearchProps<T>) {
201
206
  );
202
207
  }
203
208
 
204
- interface SearchOptionsPopoverProps {
209
+ interface SearchOptionsPanelProps {
205
210
  searchOptions: SearchOptions;
206
211
  onOptionsChange: (options: Partial<SearchOptions>) => void;
207
212
  columns: Array<{
@@ -217,7 +222,7 @@ interface SearchOptionsPopoverProps {
217
222
  optionsActive: boolean;
218
223
  }
219
224
 
220
- function SearchOptionsPopover({
225
+ function SearchOptionsPanel({
221
226
  searchOptions,
222
227
  onOptionsChange,
223
228
  columns,
@@ -226,7 +231,7 @@ function SearchOptionsPopover({
226
231
  disabled,
227
232
  iconPx,
228
233
  optionsActive,
229
- }: SearchOptionsPopoverProps) {
234
+ }: SearchOptionsPanelProps) {
230
235
  const { knobProps } = useResolvedKnobs();
231
236
  const [open, setOpen] = useState(false);
232
237
 
@@ -245,113 +250,110 @@ function SearchOptionsPopover({
245
250
  onOptionsChange({ columns: [] });
246
251
  };
247
252
 
248
- const sz = knobProps.sizeToken;
249
- const panelMaxHeight = sz === "$3" ? 320 : sz === "$5" ? 480 : 400;
253
+ const trigger = (
254
+ <Button
255
+ size={knobProps.sizeToken}
256
+ accent={optionsActive}
257
+ icon={<SlidersHorizontalIcon size={iconPx} weight={optionsActive ? "fill" : "regular"} />}
258
+ disabled={disabled}
259
+ aria-label={t("Search options")}
260
+ aria-expanded={open}
261
+ aria-haspopup="dialog"
262
+ />
263
+ );
250
264
 
251
265
  return (
252
- <Popover open={open} onOpenChange={setOpen} stayInFrame allowFlip resize>
253
- <Popover.Trigger asChild>
254
- <Button
255
- size={knobProps.sizeToken}
256
- accent={optionsActive}
257
- icon={<SlidersHorizontalIcon size={iconPx} weight={optionsActive ? "fill" : "regular"} />}
258
- disabled={disabled}
259
- aria-label={t("Search options")}
260
- aria-expanded={open}
261
- aria-haspopup="dialog"
262
- />
263
- </Popover.Trigger>
266
+ <FloatingPanel
267
+ open={open}
268
+ onOpenChange={setOpen}
269
+ trigger={trigger}
270
+ triggerSizing="content"
271
+ widthMode="fit-content"
272
+ disabled={disabled}
273
+ scrollable
274
+ >
275
+ <YStack {...knobProps.gapLg} minWidth={280} data-dismiss-class="compose">
276
+ <Text {...knobProps.heading} {...knobProps.label} fontWeight="400">
277
+ {t("Search Options")}
278
+ </Text>
264
279
 
265
- <PopoverContent padding={0} overflow="hidden" alignItems="stretch" minWidth={280}>
266
- <ScrollView flexShrink={1} maxHeight={panelMaxHeight}>
267
- <YStack {...knobProps.panelPadding} {...knobProps.gapLg}>
268
- <Text {...knobProps.heading} {...knobProps.label} fontWeight="400">
269
- {t("Search Options")}
280
+ <YStack {...knobProps.gap}>
281
+ <Text {...knobProps.label} fontWeight="400">
282
+ {t("Search Settings")}
283
+ </Text>
284
+
285
+ <Checkbox
286
+ compact
287
+ label={t("Case sensitive")}
288
+ checked={searchOptions.caseSensitive}
289
+ onCheckedChange={(checked) => onOptionsChange({ caseSensitive: checked as boolean })}
290
+ />
291
+
292
+ <Checkbox
293
+ compact
294
+ label={t("Whole word only")}
295
+ checked={searchOptions.wholeWord}
296
+ onCheckedChange={(checked) => onOptionsChange({ wholeWord: checked as boolean })}
297
+ />
298
+
299
+ <Checkbox
300
+ compact
301
+ label={t("Use regex")}
302
+ checked={searchOptions.regex}
303
+ onCheckedChange={(checked) => onOptionsChange({ regex: checked as boolean })}
304
+ />
305
+
306
+ <Checkbox
307
+ compact
308
+ label={t("Highlight results")}
309
+ checked={searchOptions.highlightResults}
310
+ onCheckedChange={(checked) => onOptionsChange({ highlightResults: checked as boolean })}
311
+ />
312
+ </YStack>
313
+
314
+ <Separator />
315
+
316
+ <YStack {...knobProps.gap}>
317
+ <XStack justifyContent="space-between" alignItems="center">
318
+ <Text {...knobProps.label} fontWeight="400">
319
+ {t("Search Columns")}
270
320
  </Text>
271
-
272
- <YStack {...knobProps.gap}>
273
- <Text {...knobProps.label} fontWeight="400">
274
- {t("Search Settings")}
275
- </Text>
276
-
277
- <Checkbox
278
- compact
279
- label={t("Case sensitive")}
280
- checked={searchOptions.caseSensitive}
281
- onCheckedChange={(checked) =>
282
- onOptionsChange({ caseSensitive: checked as boolean })
283
- }
284
- />
285
-
286
- <Checkbox
287
- compact
288
- label={t("Whole word only")}
289
- checked={searchOptions.wholeWord}
290
- onCheckedChange={(checked) => onOptionsChange({ wholeWord: checked as boolean })}
291
- />
292
-
293
- <Checkbox
294
- compact
295
- label={t("Use regex")}
296
- checked={searchOptions.regex}
297
- onCheckedChange={(checked) => onOptionsChange({ regex: checked as boolean })}
298
- />
299
-
300
- <Checkbox
301
- compact
302
- label={t("Highlight results")}
303
- checked={searchOptions.highlightResults}
304
- onCheckedChange={(checked) =>
305
- onOptionsChange({ highlightResults: checked as boolean })
306
- }
307
- />
308
- </YStack>
309
-
310
- <Separator />
311
-
312
- <YStack {...knobProps.gap}>
313
- <XStack justifyContent="space-between" alignItems="center">
314
- <Text {...knobProps.label} fontWeight="400">
315
- {t("Search Columns")}
316
- </Text>
317
- <Text {...knobProps.label} color={formCommonColors.muted}>
318
- {bidiIsolate(
319
- t("{{selected}} of {{total}}", {
320
- selected: selectedColumnCount,
321
- total: totalColumnCount,
322
- }),
323
- )}
324
- </Text>
325
- </XStack>
326
-
327
- <XStack {...knobProps.gap}>
328
- <Button size="$2" compact onPress={handleSelectAllColumns}>
329
- {t("All")}
330
- </Button>
331
- <Button size="$2" compact onPress={handleSelectNoColumns}>
332
- {t("None")}
333
- </Button>
334
- </XStack>
335
-
336
- <YStack gap="$1">
337
- {columns.map((col) => {
338
- const key = col.accessorKey || col.id || "";
339
- return (
340
- <Checkbox
341
- key={key}
342
- compact
343
- label={col.header || key}
344
- checked={searchOptions.columns.includes(key)}
345
- onCheckedChange={(checked) => handleColumnToggle(key, checked as boolean)}
346
- />
347
- );
348
- })}
349
- </YStack>
350
- </YStack>
321
+ <Text {...knobProps.label} color={formCommonColors.muted}>
322
+ {bidiIsolate(
323
+ t("{{selected}} of {{total}}", {
324
+ selected: selectedColumnCount,
325
+ total: totalColumnCount,
326
+ }),
327
+ )}
328
+ </Text>
329
+ </XStack>
330
+
331
+ <XStack {...knobProps.gap}>
332
+ <Button size="$2" compact onPress={handleSelectAllColumns}>
333
+ {t("All")}
334
+ </Button>
335
+ <Button size="$2" compact onPress={handleSelectNoColumns}>
336
+ {t("None")}
337
+ </Button>
338
+ </XStack>
339
+
340
+ <YStack gap="$1">
341
+ {columns.map((col) => {
342
+ const key = col.accessorKey || col.id || "";
343
+ return (
344
+ <Checkbox
345
+ key={key}
346
+ compact
347
+ label={col.header || key}
348
+ checked={searchOptions.columns.includes(key)}
349
+ onCheckedChange={(checked) => handleColumnToggle(key, checked as boolean)}
350
+ />
351
+ );
352
+ })}
351
353
  </YStack>
352
- </ScrollView>
353
- </PopoverContent>
354
- </Popover>
354
+ </YStack>
355
+ </YStack>
356
+ </FloatingPanel>
355
357
  );
356
358
  }
357
359
 
@@ -1,17 +1,17 @@
1
1
  import { CaretDownIcon, FloppyDiskIcon } from "@phosphor-icons/react";
2
2
  import { DropdownMenu } from "@multiplatform.one/components";
3
- import { Button, Input, SearchInput, Spinner } from "@multiplatform.one/forms";
3
+ import { Button, FloatingPanel, Input, SearchInput, Spinner } from "@multiplatform.one/forms";
4
4
  import { hairline, useResolvedKnobs } from "@multiplatform.one/theme";
5
5
  import { RovingFocusGroup } from "@tamagui/roving-focus";
6
6
  import type React from "react";
7
7
  import { useState } from "react";
8
- import { Popover, XStack, YStack } from "tamagui";
8
+ import { XStack, YStack } from "tamagui";
9
9
  import { t } from "../../shared/t";
10
10
  import type { TableView } from "../../types";
11
11
  import { iconSizeForToken } from "../../utils/chromeIcons";
12
12
  import { useDataTableState } from "../DataTable/DataTableStateContext";
13
13
  import { DataTableExport } from "../DataTableExport";
14
- import { DataTableFilterButton } from "../DataTableFilterButton";
14
+ import { DataTableCardFilterButton, DataTableFilterButton } from "../DataTableFilterButton";
15
15
 
16
16
  export interface DataTableToolbarProps {
17
17
  // Search
@@ -49,6 +49,17 @@ export interface DataTableToolbarProps {
49
49
  }
50
50
 
51
51
  export function DataTableToolbar(props: DataTableToolbarProps) {
52
+ return <ToolbarLayout {...props} />;
53
+ }
54
+
55
+ export function DataTableCardToolbar(props: DataTableToolbarProps) {
56
+ return <ToolbarLayout {...props} cardLayout />;
57
+ }
58
+
59
+ function ToolbarLayout({
60
+ cardLayout = false,
61
+ ...props
62
+ }: DataTableToolbarProps & { cardLayout?: boolean }) {
52
63
  const ctx = useDataTableState();
53
64
 
54
65
  const globalFilter = props.globalFilter ?? ctx?.state.globalFilter ?? "";
@@ -108,9 +119,98 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
108
119
  );
109
120
  const hasTrailing = showActionCluster || isFetching;
110
121
 
122
+ const viewPickerContent = showViewPicker && (
123
+ <DropdownMenu closeOnSelect placement="bottom-end">
124
+ <DropdownMenu.Trigger asChild>
125
+ <RovingFocusGroup.Item focusable asChild>
126
+ <Button
127
+ chromeless
128
+ size={controlSize}
129
+ iconAfter={<CaretDownIcon size={iconPx} />}
130
+ aria-label={t("Saved views")}
131
+ {...(cardLayout ? { minWidth: 0, maxWidth: "100%" as const } : {})}
132
+ aria-haspopup="menu"
133
+ >
134
+ {activeView?.name ?? t("Views")}
135
+ </Button>
136
+ </RovingFocusGroup.Item>
137
+ </DropdownMenu.Trigger>
138
+ <DropdownMenu.Content>
139
+ {views.map((view) => (
140
+ <DropdownMenu.CheckboxItem
141
+ key={view.id}
142
+ checked={view.id === activeViewId}
143
+ closeOnSelect
144
+ onSelect={() => onLoadView(view.id)}
145
+ >
146
+ {view.name}
147
+ </DropdownMenu.CheckboxItem>
148
+ ))}
149
+ </DropdownMenu.Content>
150
+ </DropdownMenu>
151
+ );
152
+ const viewPicker =
153
+ cardLayout && showViewPicker ? (
154
+ <XStack minWidth={0} maxWidth="100%" flexBasis="auto" flexGrow={0} flexShrink={1}>
155
+ {viewPickerContent}
156
+ </XStack>
157
+ ) : (
158
+ viewPickerContent
159
+ );
160
+ const saveView = showSave && (
161
+ <FloatingPanel
162
+ open={showSaveViewDialog}
163
+ onOpenChange={setShowSaveViewDialog}
164
+ triggerSizing="content"
165
+ widthMode="fit-content"
166
+ trigger={
167
+ <RovingFocusGroup.Item focusable asChild>
168
+ <Button
169
+ chromeless
170
+ size={controlSize}
171
+ icon={<FloppyDiskIcon size={iconPx} />}
172
+ aria-label={t("Save view")}
173
+ />
174
+ </RovingFocusGroup.Item>
175
+ }
176
+ >
177
+ <YStack {...knobProps.gap} minWidth={240} data-dismiss-class="compose">
178
+ <Input
179
+ placeholder={t("View name")}
180
+ value={newViewName}
181
+ onChangeText={setNewViewName}
182
+ size={searchSize}
183
+ {...(compact === undefined ? {} : { compact })}
184
+ inputProps={{
185
+ "aria-label": t("View name"),
186
+ onKeyDown: (e: React.KeyboardEvent) => {
187
+ if (e.key === "Enter") handleSaveView();
188
+ },
189
+ }}
190
+ />
191
+ <XStack {...knobProps.gap} justifyContent="flex-end">
192
+ <Button size={controlSize} onPress={() => setShowSaveViewDialog(false)}>
193
+ {t("Cancel")}
194
+ </Button>
195
+ <Button
196
+ size={controlSize}
197
+ onPress={handleSaveView}
198
+ disabled={!newViewName.trim()}
199
+ disabledReason={t("Enter a view name")}
200
+ >
201
+ {t("Save")}
202
+ </Button>
203
+ </XStack>
204
+ </YStack>
205
+ </FloatingPanel>
206
+ );
207
+ const showSecondary = showViewPicker || showSave || enableExport || isFetching;
208
+
111
209
  return (
112
210
  <XStack
113
- alignItems="center"
211
+ alignItems={cardLayout ? "stretch" : "center"}
212
+ flexDirection={cardLayout ? "column" : "row"}
213
+ {...(cardLayout ? { width: "100%" as const, minWidth: 0 } : {})}
114
214
  // LC-39: flush band — no painted panel, so no horizontal inset.
115
215
  paddingVertical={knobProps.panelPadding.padding}
116
216
  paddingHorizontal={0}
@@ -124,7 +224,12 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
124
224
  aria-busy={isFetching || undefined}
125
225
  >
126
226
  {enableGlobalSearch && (
127
- <XStack flex={1} minWidth={160} maxWidth={searchMaxWidth} flexShrink={1}>
227
+ <XStack
228
+ flex={cardLayout ? undefined : 1}
229
+ minWidth={cardLayout ? 0 : 160}
230
+ maxWidth={cardLayout ? undefined : searchMaxWidth}
231
+ flexShrink={1}
232
+ >
128
233
  <SearchInput
129
234
  value={globalFilter}
130
235
  onChange={onGlobalFilterChange}
@@ -144,116 +249,83 @@ export function DataTableToolbar(props: DataTableToolbarProps) {
144
249
  </XStack>
145
250
  )}
146
251
 
147
- {hasTrailing && (
148
- <XStack
149
- alignItems="center"
150
- {...knobProps.gap}
151
- flexShrink={0}
152
- marginInlineStart={enableGlobalSearch ? "auto" : 0}
153
- >
154
- {showActionCluster && (
252
+ {cardLayout ? (
253
+ <>
254
+ {(showFilterButton || customActions) && (
155
255
  <RovingFocusGroup orientation="horizontal" loop asChild>
156
- <XStack alignItems="center" {...knobProps.gap}>
157
- {showFilterButton && <DataTableFilterButton />}
158
-
159
- {enableExport && <DataTableExport />}
160
-
256
+ <XStack
257
+ data-table-card-primary=""
258
+ width="100%"
259
+ minWidth={0}
260
+ alignItems="center"
261
+ flexWrap="nowrap"
262
+ {...knobProps.gap}
263
+ >
264
+ {showFilterButton && (
265
+ <XStack flexShrink={0}>
266
+ <DataTableCardFilterButton />
267
+ </XStack>
268
+ )}
161
269
  {customActions}
162
-
163
- {showViewPicker && (
164
- <DropdownMenu closeOnSelect placement="bottom-end">
165
- <DropdownMenu.Trigger asChild>
166
- <RovingFocusGroup.Item focusable asChild>
167
- <Button
168
- chromeless
169
- size={controlSize}
170
- iconAfter={<CaretDownIcon size={iconPx} />}
171
- aria-label={t("Saved views")}
172
- aria-haspopup="menu"
173
- >
174
- {activeView?.name ?? t("Views")}
175
- </Button>
176
- </RovingFocusGroup.Item>
177
- </DropdownMenu.Trigger>
178
- <DropdownMenu.Content>
179
- {views.map((view) => (
180
- <DropdownMenu.CheckboxItem
181
- key={view.id}
182
- checked={view.id === activeViewId}
183
- closeOnSelect
184
- onSelect={() => onLoadView(view.id)}
185
- >
186
- {view.name}
187
- </DropdownMenu.CheckboxItem>
188
- ))}
189
- </DropdownMenu.Content>
190
- </DropdownMenu>
270
+ </XStack>
271
+ </RovingFocusGroup>
272
+ )}
273
+ {showSecondary && (
274
+ <RovingFocusGroup orientation="horizontal" loop asChild>
275
+ <XStack
276
+ data-table-card-secondary=""
277
+ width="100%"
278
+ minWidth={0}
279
+ flexWrap="wrap"
280
+ alignItems="center"
281
+ {...knobProps.gap}
282
+ >
283
+ {enableExport && (
284
+ <XStack maxWidth="100%" minWidth={0}>
285
+ <DataTableExport />
286
+ </XStack>
191
287
  )}
192
-
193
- {showSave && (
194
- <Popover open={showSaveViewDialog} onOpenChange={setShowSaveViewDialog}>
195
- <Popover.Trigger asChild>
196
- <RovingFocusGroup.Item focusable asChild>
197
- <Button
198
- chromeless
199
- size={controlSize}
200
- icon={<FloppyDiskIcon size={iconPx} />}
201
- aria-label={t("Save view")}
202
- />
203
- </RovingFocusGroup.Item>
204
- </Popover.Trigger>
205
- <Popover.Content
206
- {...knobProps.elevatedSurface}
207
- {...knobProps.borderRadius}
208
- borderColor="$color6"
209
- // LC-24: enter/exitStyle need a `transition` driver on the
210
- // same element ({...string} spread set nothing).
211
- transition={knobProps.transition}
212
- enterStyle={{ x: 0, y: -10, opacity: 0 }}
213
- exitStyle={{ x: 0, y: -10, opacity: 0 }}
214
- data-dismiss-class="compose"
215
- >
216
- <YStack {...knobProps.gap} {...knobProps.panelPadding} minWidth={240}>
217
- <Input
218
- placeholder={t("View name")}
219
- value={newViewName}
220
- onChangeText={setNewViewName}
221
- size={searchSize}
222
- {...(compact === undefined ? {} : { compact })}
223
- inputProps={{
224
- "aria-label": t("View name"),
225
- onKeyDown: (e: React.KeyboardEvent) => {
226
- if (e.key === "Enter") handleSaveView();
227
- },
228
- }}
229
- />
230
- <XStack {...knobProps.gap} justifyContent="flex-end">
231
- <Button size={controlSize} onPress={() => setShowSaveViewDialog(false)}>
232
- {t("Cancel")}
233
- </Button>
234
- <Button
235
- size={controlSize}
236
- onPress={handleSaveView}
237
- disabled={!newViewName.trim()}
238
- disabledReason={t("Enter a view name")}
239
- >
240
- {t("Save")}
241
- </Button>
242
- </XStack>
243
- </YStack>
244
- </Popover.Content>
245
- </Popover>
288
+ {viewPicker}
289
+ {saveView}
290
+ {isFetching && (
291
+ <XStack alignItems="center" aria-live="polite" data-table-fetching="true">
292
+ <Spinner size="small" />
293
+ </XStack>
246
294
  )}
247
295
  </XStack>
248
296
  </RovingFocusGroup>
249
297
  )}
298
+ </>
299
+ ) : (
300
+ hasTrailing && (
301
+ <XStack
302
+ alignItems="center"
303
+ {...knobProps.gap}
304
+ flexShrink={0}
305
+ marginInlineStart={enableGlobalSearch ? "auto" : 0}
306
+ >
307
+ {showActionCluster && (
308
+ <RovingFocusGroup orientation="horizontal" loop asChild>
309
+ <XStack alignItems="center" {...knobProps.gap}>
310
+ {showFilterButton && <DataTableFilterButton />}
250
311
 
251
- {isFetching && (
252
- <XStack alignItems="center" aria-live="polite" data-table-fetching="true">
253
- <Spinner size="small" />
254
- </XStack>
255
- )}
256
- </XStack>
312
+ {enableExport && <DataTableExport />}
313
+
314
+ {customActions}
315
+
316
+ {viewPicker}
317
+ {saveView}
318
+ </XStack>
319
+ </RovingFocusGroup>
320
+ )}
321
+
322
+ {isFetching && (
323
+ <XStack alignItems="center" aria-live="polite" data-table-fetching="true">
324
+ <Spinner size="small" />
325
+ </XStack>
326
+ )}
327
+ </XStack>
328
+ )
257
329
  )}
258
330
  </XStack>
259
331
  );
@@ -2,6 +2,7 @@ import { action } from "@multiplatform.one/storybook";
2
2
  import React from "react";
3
3
  import { formatAbsoluteDate } from "@multiplatform.one/theme";
4
4
  import { Card, Text, View, XStack, YStack } from "tamagui";
5
+ import type { TableView } from "../../types";
5
6
  import { DataTableViewOptions } from "./index";
6
7
 
7
8
  // Columns definition
@@ -420,3 +421,54 @@ export const AllOptionsCombined = () => {
420
421
  </YStack>
421
422
  );
422
423
  };
424
+
425
+ const savedViews: TableView[] = [
426
+ {
427
+ id: "all",
428
+ name: "All products",
429
+ columns: {},
430
+ filters: [],
431
+ sorting: [],
432
+ pagination: { pageIndex: 0, pageSize: 10 },
433
+ },
434
+ {
435
+ id: "in-stock",
436
+ name: "In stock",
437
+ columns: {},
438
+ filters: [],
439
+ sorting: [],
440
+ pagination: { pageIndex: 0, pageSize: 10 },
441
+ },
442
+ ];
443
+
444
+ export const WithSavedViews = () => {
445
+ const [views, setViews] = React.useState<TableView[]>(savedViews);
446
+ const [activeViewId, setActiveViewId] = React.useState("all");
447
+
448
+ return (
449
+ <YStack gap="$4" padding="$4">
450
+ <Text fontSize="$4" fontWeight="600">
451
+ Saved Views
452
+ </Text>
453
+
454
+ <DataTableViewOptions
455
+ columns={transformedColumns}
456
+ onColumnVisibilityChange={() => {}}
457
+ views={views}
458
+ activeViewId={activeViewId}
459
+ showViewManagement
460
+ onSaveView={(name) => {
461
+ const id = name.toLowerCase().replace(/\s+/g, "-");
462
+ setViews((prev) => [...prev, { ...savedViews[0], id, name }]);
463
+ setActiveViewId(id);
464
+ action("save-view")(name);
465
+ }}
466
+ onLoadView={(viewId) => {
467
+ setActiveViewId(viewId);
468
+ action("load-view")(viewId);
469
+ }}
470
+ onResetToDefault={() => {}}
471
+ />
472
+ </YStack>
473
+ );
474
+ };