@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
@@ -8,9 +8,8 @@ import {
8
8
  } from "@phosphor-icons/react";
9
9
  import { formatAbsoluteDate, parseCalendarDate, useResolvedKnobs } from "@multiplatform.one/theme";
10
10
  import React, { useState, useMemo } from "react";
11
- import { Button, DatePicker } from "@multiplatform.one/forms";
11
+ import { Button, DatePicker, FloatingPanel } from "@multiplatform.one/forms";
12
12
  import {
13
- Popover,
14
13
  ScrollView,
15
14
  Separator,
16
15
  Text,
@@ -311,194 +310,166 @@ export function DataTableDateFilter({
311
310
  }
312
311
  };
313
312
 
314
- return (
315
- // LC-06: anchored editor — start-aligned to the trigger edge with
316
- // collision handling (flip + clamp + resize inside the viewport).
317
- <Popover
318
- open={isOpen}
319
- onOpenChange={setIsOpen}
320
- placement="bottom-start"
321
- offset={4}
322
- stayInFrame
323
- allowFlip
324
- resize
313
+ const trigger = (
314
+ <Button
315
+ size={knobProps.sizeToken}
316
+ disabled={disabled}
317
+ icon={<CalendarIcon size={iconPx} />}
318
+ justifyContent="flex-start"
319
+ minWidth={triggerMinWidth}
325
320
  >
326
- <Popover.Trigger asChild>
327
- <Button
328
- size={knobProps.sizeToken}
329
- disabled={disabled}
330
- icon={<CalendarIcon size={iconPx} />}
331
- justifyContent="flex-start"
332
- minWidth={triggerMinWidth}
333
- >
334
- <Text
335
- flex={1}
336
- textAlign="left"
337
- // LC-40: while disabled, the placeholder tier ($color10) drops
338
- // below AA on the washed chrome — pin to the lowest AA step.
339
- color={disabled ? "$color11" : value ? undefined : "$color10"}
340
- fontSize="$3"
341
- numberOfLines={1}
342
- >
343
- {getDisplayValue()}
344
- </Text>
345
- <CaretDownIcon size={iconPx} />
346
- </Button>
347
- </Popover.Trigger>
348
-
349
- {/* Overlay contract: elevatedSurface + transition-paired enter/exit
350
- motion (LC-24) — same fragments as the shared components
351
- PopoverContent. The popper resize middleware caps the height to
352
- the viewport; the ScrollView keeps every section reachable
353
- instead of painting past the frame (LC-10). */}
354
- <Popover.Content
355
- {...knobProps.elevatedSurface}
356
- transition={knobProps.transition}
357
- enterStyle={{ opacity: 0, y: -4, scale: 0.97 }}
358
- exitStyle={{ opacity: 0, y: -4, scale: 0.97 }}
359
- minWidth={popoverMinWidth}
360
- padding={0}
361
- overflow="hidden"
321
+ <Text
322
+ flex={1}
323
+ textAlign="left"
324
+ // LC-40: while disabled, the placeholder tier ($color10) drops
325
+ // below AA on the washed chrome — pin to the lowest AA step.
326
+ color={disabled ? "$color11" : value ? undefined : "$color10"}
327
+ fontSize="$3"
328
+ numberOfLines={1}
362
329
  >
363
- <Popover.ScrollView minHeight={0}>
364
- <YStack {...knobProps.panelPadding} {...knobProps.gapLg}>
365
- <XStack justifyContent="space-between" alignItems="center">
366
- <Text {...knobProps.label} fontWeight="400">
367
- {t("Date Filter")}
368
- </Text>
369
- {value && (
370
- <Button
371
- size={knobProps.sizeToken}
372
- onPress={handleClear}
373
- icon={<XIcon size={iconPx} />}
374
- >
375
- {t("Clear")}
376
- </Button>
377
- )}
378
- </XStack>
330
+ {getDisplayValue()}
331
+ </Text>
332
+ <CaretDownIcon size={iconPx} />
333
+ </Button>
334
+ );
379
335
 
380
- {/* Quick Presets */}
381
- {showPresets && (
382
- <YStack gap="$2">
383
- <Text {...knobProps.label} fontWeight="400">
384
- {t("Quick Filters")}
385
- </Text>
386
- <ScrollView maxHeight={presetListMaxHeight}>
387
- <YStack gap={PRESET_ROW_GAP_TOKEN}>
388
- {allPresets.map((preset) => (
389
- <Button
390
- key={preset.id}
391
- size={knobProps.sizeToken}
392
- justifyContent="flex-start"
393
- onPress={() => handlePresetSelect(preset)}
394
- {...(activePresetId === preset.id
395
- ? { theme: "accent" as any, backgroundColor: "$background" }
396
- : undefined)}
397
- >
398
- <Text fontSize="$3">{preset.label}</Text>
399
- </Button>
400
- ))}
401
- </YStack>
402
- </ScrollView>
403
- </YStack>
404
- )}
405
-
406
- <Separator />
407
-
408
- {/* Custom Date Selection */}
409
- <YStack {...knobProps.gap}>
410
- <Text {...knobProps.label} fontWeight="400">
411
- {t("Custom Date")}
412
- </Text>
413
-
414
- <XStack gap="$2">
415
- <Button
416
- flex={1}
417
- size={knobProps.sizeToken}
418
- onPress={() => handleCustomDateSelect(new Date().toISOString(), "is")}
419
- >
420
- {t("Today")}
421
- </Button>
422
- <Button
423
- flex={1}
424
- size={knobProps.sizeToken}
425
- onPress={() =>
426
- handleCustomDateSelect(
427
- new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),
428
- "is",
429
- )
430
- }
431
- >
432
- {t("Yesterday")}
433
- </Button>
434
- </XStack>
435
-
436
- {/* Date Range */}
437
- <YStack gap="$2">
438
- <Text {...knobProps.label} fontWeight="400">
439
- {t("Date Range")}
440
- </Text>
441
- <XStack gap="$2">
442
- <Button
443
- flex={1}
444
- size={knobProps.sizeToken}
445
- onPress={() =>
446
- handleDateRangeSelect(
447
- new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
448
- new Date().toISOString(),
449
- )
450
- }
451
- >
452
- {t("Last 7 days")}
453
- </Button>
336
+ return (
337
+ // LC-06: anchored editor. FloatingPanel attaches flush to the trigger
338
+ // (MPO-38 cover contract), clamps inside the viewport and becomes a sheet
339
+ // at 640 and below.
340
+ <FloatingPanel open={isOpen} onOpenChange={setIsOpen} trigger={trigger} scrollable>
341
+ <YStack {...knobProps.gapLg} minWidth={popoverMinWidth} data-dismiss-class="compose">
342
+ <XStack justifyContent="space-between" alignItems="center">
343
+ <Text {...knobProps.label} fontWeight="400">
344
+ {t("Date Filter")}
345
+ </Text>
346
+ {value && (
347
+ <Button size={knobProps.sizeToken} onPress={handleClear} icon={<XIcon size={iconPx} />}>
348
+ {t("Clear")}
349
+ </Button>
350
+ )}
351
+ </XStack>
352
+
353
+ {/* Quick Presets */}
354
+ {showPresets && (
355
+ <YStack gap="$2">
356
+ <Text {...knobProps.label} fontWeight="400">
357
+ {t("Quick Filters")}
358
+ </Text>
359
+ <ScrollView maxHeight={presetListMaxHeight}>
360
+ <YStack gap={PRESET_ROW_GAP_TOKEN}>
361
+ {allPresets.map((preset) => (
454
362
  <Button
455
- flex={1}
363
+ key={preset.id}
456
364
  size={knobProps.sizeToken}
457
- onPress={() =>
458
- handleDateRangeSelect(
459
- new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(),
460
- new Date().toISOString(),
461
- )
462
- }
365
+ justifyContent="flex-start"
366
+ onPress={() => handlePresetSelect(preset)}
367
+ {...(activePresetId === preset.id
368
+ ? { theme: "accent" as any, backgroundColor: "$background" }
369
+ : undefined)}
463
370
  >
464
- {t("Last 30 days")}
371
+ <Text fontSize="$3">{preset.label}</Text>
465
372
  </Button>
466
- </XStack>
373
+ ))}
467
374
  </YStack>
375
+ </ScrollView>
376
+ </YStack>
377
+ )}
468
378
 
469
- {/* DatePicker-based Custom Range Selection */}
470
- <YStack gap="$2">
471
- <Text {...knobProps.label} fontWeight="400">
472
- {t("Custom Range")}
473
- </Text>
474
- <XStack gap="$2">
475
- <View flex={1} data-testid="start-date-picker">
476
- <DatePicker
477
- placeholder={t("Start date")}
478
- label={t("From")}
479
- minDate={minDate}
480
- maxDate={maxDate}
481
- value={pickerRange.start ?? null}
482
- onChange={handleStartDatePick}
483
- />
484
- </View>
485
- <View flex={1} data-testid="end-date-picker">
486
- <DatePicker
487
- placeholder={t("End date")}
488
- label={t("To")}
489
- minDate={minDate}
490
- maxDate={maxDate}
491
- value={pickerRange.end ?? null}
492
- onChange={handleEndDatePick}
493
- />
494
- </View>
495
- </XStack>
496
- </YStack>
497
- </YStack>
379
+ <Separator />
380
+
381
+ {/* Custom Date Selection */}
382
+ <YStack {...knobProps.gap}>
383
+ <Text {...knobProps.label} fontWeight="400">
384
+ {t("Custom Date")}
385
+ </Text>
386
+
387
+ <XStack gap="$2">
388
+ <Button
389
+ flex={1}
390
+ size={knobProps.sizeToken}
391
+ onPress={() => handleCustomDateSelect(new Date().toISOString(), "is")}
392
+ >
393
+ {t("Today")}
394
+ </Button>
395
+ <Button
396
+ flex={1}
397
+ size={knobProps.sizeToken}
398
+ onPress={() =>
399
+ handleCustomDateSelect(
400
+ new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),
401
+ "is",
402
+ )
403
+ }
404
+ >
405
+ {t("Yesterday")}
406
+ </Button>
407
+ </XStack>
408
+
409
+ {/* Date Range */}
410
+ <YStack gap="$2">
411
+ <Text {...knobProps.label} fontWeight="400">
412
+ {t("Date Range")}
413
+ </Text>
414
+ <XStack gap="$2">
415
+ <Button
416
+ flex={1}
417
+ size={knobProps.sizeToken}
418
+ onPress={() =>
419
+ handleDateRangeSelect(
420
+ new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),
421
+ new Date().toISOString(),
422
+ )
423
+ }
424
+ >
425
+ {t("Last 7 days")}
426
+ </Button>
427
+ <Button
428
+ flex={1}
429
+ size={knobProps.sizeToken}
430
+ onPress={() =>
431
+ handleDateRangeSelect(
432
+ new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(),
433
+ new Date().toISOString(),
434
+ )
435
+ }
436
+ >
437
+ {t("Last 30 days")}
438
+ </Button>
439
+ </XStack>
440
+ </YStack>
441
+
442
+ {/* DatePicker-based Custom Range Selection */}
443
+ <YStack gap="$2">
444
+ <Text {...knobProps.label} fontWeight="400">
445
+ {t("Custom Range")}
446
+ </Text>
447
+ <XStack gap="$2">
448
+ <View flex={1} data-testid="start-date-picker">
449
+ <DatePicker
450
+ placeholder={t("Start date")}
451
+ label={t("From")}
452
+ minDate={minDate}
453
+ maxDate={maxDate}
454
+ value={pickerRange.start ?? null}
455
+ onChange={handleStartDatePick}
456
+ />
457
+ </View>
458
+ <View flex={1} data-testid="end-date-picker">
459
+ <DatePicker
460
+ placeholder={t("End date")}
461
+ label={t("To")}
462
+ minDate={minDate}
463
+ maxDate={maxDate}
464
+ value={pickerRange.end ?? null}
465
+ onChange={handleEndDatePick}
466
+ />
467
+ </View>
468
+ </XStack>
498
469
  </YStack>
499
- </Popover.ScrollView>
500
- </Popover.Content>
501
- </Popover>
470
+ </YStack>
471
+ </YStack>
472
+ </FloatingPanel>
502
473
  );
503
474
  }
504
475
 
@@ -1,4 +1,4 @@
1
- import { fireEvent, screen, waitFor } from "@testing-library/react";
1
+ import { act, fireEvent, screen, waitFor } from "@testing-library/react";
2
2
  import { renderWithProviders } from "@multiplatform.one/test-utils";
3
3
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
4
  import { DataTable } from "../DataTable";
@@ -203,16 +203,30 @@ describe("DataTableExport", () => {
203
203
  });
204
204
 
205
205
  it("shows loading state when export is in progress", async () => {
206
- const mockOnExport = vi.fn(
207
- () => new Promise<void>((resolve) => setTimeout(resolve, 100)),
208
- ) as unknown as ReturnType<typeof vi.fn> & ((options: ExportOptions) => Promise<void>);
206
+ let finishExport!: () => void;
207
+ const pending = new Promise<void>((resolve) => {
208
+ finishExport = resolve;
209
+ });
210
+ const mockOnExport = vi.fn(() => pending) as unknown as ReturnType<typeof vi.fn> &
211
+ ((options: ExportOptions) => Promise<void>);
209
212
 
210
213
  renderWithProviders(
211
214
  <DataTableExport data={mockData} columns={mockColumns} onExport={mockOnExport} />,
212
215
  );
213
216
 
214
- fireEvent.click(screen.getByText("CSV"));
215
- expect(screen.getByText("...")).toBeInTheDocument();
217
+ const exportButton = screen.getByRole("button", { name: /Export as CSV/i });
218
+ try {
219
+ fireEvent.click(exportButton);
220
+ expect(screen.getByText("...")).toBeInTheDocument();
221
+ expect(exportButton).toHaveAttribute("aria-disabled", "true");
222
+ } finally {
223
+ await act(async () => {
224
+ finishExport();
225
+ await pending;
226
+ });
227
+ }
228
+ expect(exportButton).toHaveTextContent("CSV");
229
+ expect(exportButton).not.toHaveAttribute("aria-disabled", "true");
216
230
  });
217
231
 
218
232
  it("disables buttons when disabled prop is true", () => {
@@ -599,9 +613,12 @@ describe("DataTableExport", () => {
599
613
  });
600
614
 
601
615
  it("prevents multiple simultaneous exports", async () => {
602
- const mockOnExport = vi.fn(
603
- () => new Promise<void>((resolve) => setTimeout(resolve, 200)),
604
- ) as unknown as ReturnType<typeof vi.fn> & ((options: ExportOptions) => Promise<void>);
616
+ let finishExport!: () => void;
617
+ const pending = new Promise<void>((resolve) => {
618
+ finishExport = resolve;
619
+ });
620
+ const mockOnExport = vi.fn(() => pending) as unknown as ReturnType<typeof vi.fn> &
621
+ ((options: ExportOptions) => Promise<void>);
605
622
 
606
623
  renderWithProviders(
607
624
  <DataTableExport data={mockData} columns={mockColumns} onExport={mockOnExport} />,
@@ -609,13 +626,22 @@ describe("DataTableExport", () => {
609
626
 
610
627
  // Click export twice quickly - button shows "..." when loading
611
628
  const exportButton = screen.getByRole("button", { name: /Export as CSV/i });
612
- fireEvent.click(exportButton);
613
- fireEvent.click(exportButton);
629
+ try {
630
+ fireEvent.click(exportButton);
631
+ fireEvent.click(exportButton);
614
632
 
615
- // Should only call once
616
- await waitFor(() => {
617
- expect(mockOnExport).toHaveBeenCalledTimes(1);
618
- });
633
+ // Should only call once
634
+ await waitFor(() => {
635
+ expect(mockOnExport).toHaveBeenCalledTimes(1);
636
+ });
637
+ } finally {
638
+ await act(async () => {
639
+ finishExport();
640
+ await pending;
641
+ });
642
+ }
643
+ expect(exportButton).toHaveTextContent("CSV");
644
+ expect(exportButton).not.toHaveAttribute("aria-disabled", "true");
619
645
  });
620
646
 
621
647
  it("surfaces an inline error when Blob URLs are unavailable", async () => {
@@ -629,9 +655,7 @@ describe("DataTableExport", () => {
629
655
  renderWithProviders(<DataTableExport data={mockData} columns={mockColumns} />);
630
656
  fireEvent.click(screen.getByRole("button", { name: /Export as CSV/i }));
631
657
  await waitFor(() => {
632
- expect(screen.getByRole("alert").textContent).toMatch(
633
- /not available on this platform/i,
634
- );
658
+ expect(screen.getByRole("alert").textContent).toMatch(/not available on this platform/i);
635
659
  });
636
660
  expect(mockCreateObjectURL).not.toHaveBeenCalled();
637
661
  } finally {