@wordpress/dataviews 3.0.0 → 4.1.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 (352) hide show
  1. package/CHANGELOG.md +21 -3
  2. package/README.md +19 -4
  3. package/build/components/dataform/index.js +27 -0
  4. package/build/components/dataform/index.js.map +1 -0
  5. package/build/components/dataviews/index.js +126 -0
  6. package/build/components/dataviews/index.js.map +1 -0
  7. package/build/{bulk-actions.js → components/dataviews-bulk-actions/index.js} +42 -16
  8. package/build/components/dataviews-bulk-actions/index.js.map +1 -0
  9. package/build/{bulk-actions-toolbar.js → components/dataviews-bulk-actions-toolbar/index.js} +36 -19
  10. package/build/components/dataviews-bulk-actions-toolbar/index.js.map +1 -0
  11. package/build/components/dataviews-context/index.js +36 -0
  12. package/build/components/dataviews-context/index.js.map +1 -0
  13. package/build/{add-filter.js → components/dataviews-filters/add-filter.js} +35 -18
  14. package/build/components/dataviews-filters/add-filter.js.map +1 -0
  15. package/build/{filter-summary.js → components/dataviews-filters/filter-summary.js} +9 -9
  16. package/build/components/dataviews-filters/filter-summary.js.map +1 -0
  17. package/build/components/dataviews-filters/index.js +164 -0
  18. package/build/components/dataviews-filters/index.js.map +1 -0
  19. package/build/components/dataviews-filters/reset-filters.js.map +1 -0
  20. package/build/{search-widget.js → components/dataviews-filters/search-widget.js} +13 -13
  21. package/build/components/dataviews-filters/search-widget.js.map +1 -0
  22. package/build/{item-actions.js → components/dataviews-item-actions/index.js} +2 -2
  23. package/build/components/dataviews-item-actions/index.js.map +1 -0
  24. package/build/components/dataviews-layout/index.js +53 -0
  25. package/build/components/dataviews-layout/index.js.map +1 -0
  26. package/build/{pagination.js → components/dataviews-pagination/index.js} +16 -13
  27. package/build/components/dataviews-pagination/index.js.map +1 -0
  28. package/build/{search.js → components/dataviews-search/index.js} +18 -11
  29. package/build/components/dataviews-search/index.js.map +1 -0
  30. package/build/{single-selection-checkbox.js → components/dataviews-selection-checkbox/index.js} +6 -6
  31. package/build/components/dataviews-selection-checkbox/index.js.map +1 -0
  32. package/build/components/dataviews-view-config/index.js +298 -0
  33. package/build/components/dataviews-view-config/index.js.map +1 -0
  34. package/build/constants.js +6 -1
  35. package/build/constants.js.map +1 -1
  36. package/build/dataforms-layouts/index.js +24 -0
  37. package/build/dataforms-layouts/index.js.map +1 -0
  38. package/build/dataforms-layouts/panel/index.js +129 -0
  39. package/build/dataforms-layouts/panel/index.js.map +1 -0
  40. package/build/dataforms-layouts/regular/index.js +39 -0
  41. package/build/dataforms-layouts/regular/index.js.map +1 -0
  42. package/build/dataviews-layouts/grid/density-picker.js +143 -0
  43. package/build/dataviews-layouts/grid/density-picker.js.map +1 -0
  44. package/build/{view-grid.js → dataviews-layouts/grid/index.js} +40 -41
  45. package/build/dataviews-layouts/grid/index.js.map +1 -0
  46. package/build/dataviews-layouts/index.js +52 -0
  47. package/build/dataviews-layouts/index.js.map +1 -0
  48. package/build/{view-list.js → dataviews-layouts/list/index.js} +26 -23
  49. package/build/dataviews-layouts/list/index.js.map +1 -0
  50. package/build/dataviews-layouts/table/column-header-menu.js +196 -0
  51. package/build/dataviews-layouts/table/column-header-menu.js.map +1 -0
  52. package/build/dataviews-layouts/table/index.js +350 -0
  53. package/build/dataviews-layouts/table/index.js.map +1 -0
  54. package/build/field-types/index.js +46 -0
  55. package/build/field-types/index.js.map +1 -0
  56. package/build/field-types/integer.js +94 -0
  57. package/build/field-types/integer.js.map +1 -0
  58. package/build/field-types/text.js +87 -0
  59. package/build/field-types/text.js.map +1 -0
  60. package/build/filter-and-sort-data-view.js +2 -11
  61. package/build/filter-and-sort-data-view.js.map +1 -1
  62. package/build/index.js +11 -4
  63. package/build/index.js.map +1 -1
  64. package/build/normalize-fields.js +36 -2
  65. package/build/normalize-fields.js.map +1 -1
  66. package/build/types.js.map +1 -1
  67. package/build/validation.js +22 -0
  68. package/build/validation.js.map +1 -0
  69. package/build-module/components/dataform/index.js +21 -0
  70. package/build-module/components/dataform/index.js.map +1 -0
  71. package/build-module/components/dataviews/index.js +117 -0
  72. package/build-module/components/dataviews/index.js.map +1 -0
  73. package/build-module/{bulk-actions.js → components/dataviews-bulk-actions/index.js} +42 -17
  74. package/build-module/components/dataviews-bulk-actions/index.js.map +1 -0
  75. package/build-module/{bulk-actions-toolbar.js → components/dataviews-bulk-actions-toolbar/index.js} +35 -19
  76. package/build-module/components/dataviews-bulk-actions-toolbar/index.js.map +1 -0
  77. package/build-module/components/dataviews-context/index.js +30 -0
  78. package/build-module/components/dataviews-context/index.js.map +1 -0
  79. package/build-module/{add-filter.js → components/dataviews-filters/add-filter.js} +34 -18
  80. package/build-module/components/dataviews-filters/add-filter.js.map +1 -0
  81. package/build-module/{filter-summary.js → components/dataviews-filters/filter-summary.js} +9 -9
  82. package/build-module/components/dataviews-filters/filter-summary.js.map +1 -0
  83. package/build-module/components/dataviews-filters/index.js +153 -0
  84. package/build-module/components/dataviews-filters/index.js.map +1 -0
  85. package/build-module/components/dataviews-filters/reset-filters.js.map +1 -0
  86. package/build-module/{search-widget.js → components/dataviews-filters/search-widget.js} +13 -13
  87. package/build-module/components/dataviews-filters/search-widget.js.map +1 -0
  88. package/build-module/{item-actions.js → components/dataviews-item-actions/index.js} +2 -2
  89. package/build-module/components/dataviews-item-actions/index.js.map +1 -0
  90. package/build-module/components/dataviews-layout/index.js +45 -0
  91. package/build-module/components/dataviews-layout/index.js.map +1 -0
  92. package/build-module/{pagination.js → components/dataviews-pagination/index.js} +17 -15
  93. package/build-module/components/dataviews-pagination/index.js.map +1 -0
  94. package/build-module/{search.js → components/dataviews-search/index.js} +18 -12
  95. package/build-module/components/dataviews-search/index.js.map +1 -0
  96. package/build-module/{single-selection-checkbox.js → components/dataviews-selection-checkbox/index.js} +5 -5
  97. package/build-module/components/dataviews-selection-checkbox/index.js.map +1 -0
  98. package/build-module/components/dataviews-view-config/index.js +292 -0
  99. package/build-module/components/dataviews-view-config/index.js.map +1 -0
  100. package/build-module/constants.js +5 -0
  101. package/build-module/constants.js.map +1 -1
  102. package/build-module/dataforms-layouts/index.js +16 -0
  103. package/build-module/dataforms-layouts/index.js.map +1 -0
  104. package/build-module/dataforms-layouts/panel/index.js +124 -0
  105. package/build-module/dataforms-layouts/panel/index.js.map +1 -0
  106. package/build-module/dataforms-layouts/regular/index.js +32 -0
  107. package/build-module/dataforms-layouts/regular/index.js.map +1 -0
  108. package/build-module/dataviews-layouts/grid/density-picker.js +138 -0
  109. package/build-module/dataviews-layouts/grid/density-picker.js.map +1 -0
  110. package/build-module/{view-grid.js → dataviews-layouts/grid/index.js} +38 -39
  111. package/build-module/dataviews-layouts/grid/index.js.map +1 -0
  112. package/build-module/dataviews-layouts/index.js +43 -0
  113. package/build-module/dataviews-layouts/index.js.map +1 -0
  114. package/build-module/{view-list.js → dataviews-layouts/list/index.js} +24 -21
  115. package/build-module/dataviews-layouts/list/index.js.map +1 -0
  116. package/build-module/dataviews-layouts/table/column-header-menu.js +190 -0
  117. package/build-module/dataviews-layouts/table/column-header-menu.js.map +1 -0
  118. package/build-module/dataviews-layouts/table/index.js +344 -0
  119. package/build-module/dataviews-layouts/table/index.js.map +1 -0
  120. package/build-module/field-types/index.js +40 -0
  121. package/build-module/field-types/index.js.map +1 -0
  122. package/build-module/field-types/integer.js +87 -0
  123. package/build-module/field-types/integer.js.map +1 -0
  124. package/build-module/field-types/text.js +80 -0
  125. package/build-module/field-types/text.js.map +1 -0
  126. package/build-module/filter-and-sort-data-view.js +2 -11
  127. package/build-module/filter-and-sort-data-view.js.map +1 -1
  128. package/build-module/index.js +4 -3
  129. package/build-module/index.js.map +1 -1
  130. package/build-module/normalize-fields.js +35 -3
  131. package/build-module/normalize-fields.js.map +1 -1
  132. package/build-module/types.js.map +1 -1
  133. package/build-module/validation.js +15 -0
  134. package/build-module/validation.js.map +1 -0
  135. package/build-style/style-rtl.css +763 -532
  136. package/build-style/style.css +763 -532
  137. package/build-types/components/dataform/index.d.ts +6 -0
  138. package/build-types/components/dataform/index.d.ts.map +1 -0
  139. package/build-types/components/dataform/stories/index.story.d.ts +22 -0
  140. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -0
  141. package/build-types/{dataviews.d.ts → components/dataviews/index.d.ts} +9 -7
  142. package/build-types/components/dataviews/index.d.ts.map +1 -0
  143. package/build-types/{stories → components/dataviews/stories}/fixtures.d.ts +13 -19
  144. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -0
  145. package/build-types/components/dataviews/stories/index.story.d.ts +46 -0
  146. package/build-types/components/dataviews/stories/index.story.d.ts.map +1 -0
  147. package/build-types/components/dataviews-bulk-actions/index.d.ts +5 -0
  148. package/build-types/components/dataviews-bulk-actions/index.d.ts.map +1 -0
  149. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts +2 -0
  150. package/build-types/components/dataviews-bulk-actions-toolbar/index.d.ts.map +1 -0
  151. package/build-types/components/dataviews-context/index.d.ts +26 -0
  152. package/build-types/components/dataviews-context/index.d.ts.map +1 -0
  153. package/build-types/{add-filter.d.ts → components/dataviews-filters/add-filter.d.ts} +4 -2
  154. package/build-types/components/dataviews-filters/add-filter.d.ts.map +1 -0
  155. package/build-types/{filter-summary.d.ts → components/dataviews-filters/filter-summary.d.ts} +1 -1
  156. package/build-types/components/dataviews-filters/filter-summary.d.ts.map +1 -0
  157. package/build-types/components/dataviews-filters/index.d.ts +14 -0
  158. package/build-types/components/dataviews-filters/index.d.ts.map +1 -0
  159. package/build-types/{reset-filters.d.ts → components/dataviews-filters/reset-filters.d.ts} +1 -2
  160. package/build-types/components/dataviews-filters/reset-filters.d.ts.map +1 -0
  161. package/build-types/{search-widget.d.ts → components/dataviews-filters/search-widget.d.ts} +1 -2
  162. package/build-types/components/dataviews-filters/search-widget.d.ts.map +1 -0
  163. package/build-types/{item-actions.d.ts → components/dataviews-item-actions/index.d.ts} +2 -2
  164. package/build-types/components/dataviews-item-actions/index.d.ts.map +1 -0
  165. package/build-types/components/dataviews-layout/index.d.ts +2 -0
  166. package/build-types/components/dataviews-layout/index.d.ts.map +1 -0
  167. package/build-types/components/dataviews-pagination/index.d.ts +4 -0
  168. package/build-types/components/dataviews-pagination/index.d.ts.map +1 -0
  169. package/build-types/components/dataviews-search/index.d.ts +6 -0
  170. package/build-types/components/dataviews-search/index.d.ts.map +1 -0
  171. package/build-types/components/dataviews-selection-checkbox/index.d.ts +16 -0
  172. package/build-types/components/dataviews-selection-checkbox/index.d.ts.map +1 -0
  173. package/build-types/components/dataviews-view-config/index.d.ts +8 -0
  174. package/build-types/components/dataviews-view-config/index.d.ts.map +1 -0
  175. package/build-types/constants.d.ts +4 -0
  176. package/build-types/constants.d.ts.map +1 -1
  177. package/build-types/dataforms-layouts/index.d.ts +9 -0
  178. package/build-types/dataforms-layouts/index.d.ts.map +1 -0
  179. package/build-types/dataforms-layouts/panel/index.d.ts +3 -0
  180. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -0
  181. package/build-types/dataforms-layouts/regular/index.d.ts +3 -0
  182. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -0
  183. package/build-types/dataviews-layouts/grid/density-picker.d.ts +5 -0
  184. package/build-types/dataviews-layouts/grid/density-picker.d.ts.map +1 -0
  185. package/build-types/dataviews-layouts/grid/index.d.ts +3 -0
  186. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -0
  187. package/build-types/{layouts.d.ts → dataviews-layouts/index.d.ts} +6 -5
  188. package/build-types/dataviews-layouts/index.d.ts.map +1 -0
  189. package/build-types/dataviews-layouts/list/index.d.ts +3 -0
  190. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -0
  191. package/build-types/dataviews-layouts/table/column-header-menu.d.ts +17 -0
  192. package/build-types/dataviews-layouts/table/column-header-menu.d.ts.map +1 -0
  193. package/build-types/dataviews-layouts/table/index.d.ts +4 -0
  194. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -0
  195. package/build-types/field-types/index.d.ts +20 -0
  196. package/build-types/field-types/index.d.ts.map +1 -0
  197. package/build-types/field-types/integer.d.ts +14 -0
  198. package/build-types/field-types/integer.d.ts.map +1 -0
  199. package/build-types/field-types/text.d.ts +14 -0
  200. package/build-types/field-types/text.d.ts.map +1 -0
  201. package/build-types/filter-and-sort-data-view.d.ts.map +1 -1
  202. package/build-types/index.d.ts +4 -3
  203. package/build-types/index.d.ts.map +1 -1
  204. package/build-types/normalize-fields.d.ts +0 -3
  205. package/build-types/normalize-fields.d.ts.map +1 -1
  206. package/build-types/types.d.ts +73 -19
  207. package/build-types/types.d.ts.map +1 -1
  208. package/build-types/validation.d.ts +3 -0
  209. package/build-types/validation.d.ts.map +1 -0
  210. package/package.json +12 -11
  211. package/src/components/dataform/index.tsx +17 -0
  212. package/src/components/dataform/stories/index.story.tsx +79 -0
  213. package/src/components/dataviews/index.tsx +161 -0
  214. package/src/{stories → components/dataviews/stories}/fixtures.js +8 -11
  215. package/src/{stories → components/dataviews/stories}/index.story.js +17 -3
  216. package/src/components/dataviews/style.scss +100 -0
  217. package/src/{bulk-actions.tsx → components/dataviews-bulk-actions/index.tsx} +51 -29
  218. package/src/components/dataviews-bulk-actions/style.scss +7 -0
  219. package/src/{bulk-actions-toolbar.tsx → components/dataviews-bulk-actions-toolbar/index.tsx} +42 -30
  220. package/src/components/dataviews-bulk-actions-toolbar/style.scss +45 -0
  221. package/src/components/dataviews-context/index.ts +49 -0
  222. package/src/{add-filter.tsx → components/dataviews-filters/add-filter.tsx} +39 -23
  223. package/src/{filter-summary.tsx → components/dataviews-filters/filter-summary.tsx} +18 -10
  224. package/src/components/dataviews-filters/index.tsx +199 -0
  225. package/src/{reset-filters.tsx → components/dataviews-filters/reset-filters.tsx} +1 -1
  226. package/src/{search-widget.tsx → components/dataviews-filters/search-widget.tsx} +14 -14
  227. package/src/components/dataviews-filters/style.scss +282 -0
  228. package/src/{item-actions.tsx → components/dataviews-item-actions/index.tsx} +2 -2
  229. package/src/components/dataviews-item-actions/style.scss +3 -0
  230. package/src/components/dataviews-layout/index.tsx +51 -0
  231. package/src/{pagination.tsx → components/dataviews-pagination/index.tsx} +13 -21
  232. package/src/components/dataviews-pagination/style.scss +26 -0
  233. package/src/{search.tsx → components/dataviews-search/index.tsx} +13 -15
  234. package/src/{single-selection-checkbox.tsx → components/dataviews-selection-checkbox/index.tsx} +9 -9
  235. package/src/components/dataviews-selection-checkbox/style.scss +14 -0
  236. package/src/components/dataviews-view-config/index.tsx +358 -0
  237. package/src/components/dataviews-view-config/style.scss +44 -0
  238. package/src/constants.ts +5 -0
  239. package/src/dataforms-layouts/index.tsx +20 -0
  240. package/src/dataforms-layouts/panel/index.tsx +164 -0
  241. package/src/dataforms-layouts/panel/style.scss +59 -0
  242. package/src/dataforms-layouts/regular/index.tsx +41 -0
  243. package/src/dataviews-layouts/grid/density-picker.tsx +136 -0
  244. package/src/{view-grid.tsx → dataviews-layouts/grid/index.tsx} +35 -36
  245. package/src/dataviews-layouts/grid/style.scss +169 -0
  246. package/src/dataviews-layouts/index.ts +66 -0
  247. package/src/{view-list.tsx → dataviews-layouts/list/index.tsx} +30 -17
  248. package/src/dataviews-layouts/list/style.scss +192 -0
  249. package/src/dataviews-layouts/table/column-header-menu.tsx +268 -0
  250. package/src/dataviews-layouts/table/index.tsx +471 -0
  251. package/src/dataviews-layouts/table/style.scss +201 -0
  252. package/src/field-types/index.tsx +45 -0
  253. package/src/field-types/integer.tsx +103 -0
  254. package/src/field-types/text.tsx +95 -0
  255. package/src/filter-and-sort-data-view.ts +1 -15
  256. package/src/index.ts +4 -3
  257. package/src/normalize-fields.ts +45 -4
  258. package/src/style.scss +14 -907
  259. package/src/test/filter-and-sort-data-view.js +47 -4
  260. package/src/test/validation.ts +131 -0
  261. package/src/types.ts +88 -17
  262. package/src/validation.ts +18 -0
  263. package/tsconfig.json +2 -1
  264. package/tsconfig.tsbuildinfo +1 -1
  265. package/build/add-filter.js.map +0 -1
  266. package/build/bulk-actions-toolbar.js.map +0 -1
  267. package/build/bulk-actions.js.map +0 -1
  268. package/build/dataform.js +0 -78
  269. package/build/dataform.js.map +0 -1
  270. package/build/dataviews.js +0 -125
  271. package/build/dataviews.js.map +0 -1
  272. package/build/filter-summary.js.map +0 -1
  273. package/build/filters.js +0 -102
  274. package/build/filters.js.map +0 -1
  275. package/build/item-actions.js.map +0 -1
  276. package/build/layouts.js +0 -38
  277. package/build/layouts.js.map +0 -1
  278. package/build/pagination.js.map +0 -1
  279. package/build/reset-filters.js.map +0 -1
  280. package/build/search-widget.js.map +0 -1
  281. package/build/search.js.map +0 -1
  282. package/build/single-selection-checkbox.js.map +0 -1
  283. package/build/view-actions.js +0 -260
  284. package/build/view-actions.js.map +0 -1
  285. package/build/view-grid.js.map +0 -1
  286. package/build/view-list.js.map +0 -1
  287. package/build/view-table.js +0 -400
  288. package/build/view-table.js.map +0 -1
  289. package/build-module/add-filter.js.map +0 -1
  290. package/build-module/bulk-actions-toolbar.js.map +0 -1
  291. package/build-module/bulk-actions.js.map +0 -1
  292. package/build-module/dataform.js +0 -72
  293. package/build-module/dataform.js.map +0 -1
  294. package/build-module/dataviews.js +0 -116
  295. package/build-module/dataviews.js.map +0 -1
  296. package/build-module/filter-summary.js.map +0 -1
  297. package/build-module/filters.js +0 -94
  298. package/build-module/filters.js.map +0 -1
  299. package/build-module/item-actions.js.map +0 -1
  300. package/build-module/layouts.js +0 -30
  301. package/build-module/layouts.js.map +0 -1
  302. package/build-module/pagination.js.map +0 -1
  303. package/build-module/reset-filters.js.map +0 -1
  304. package/build-module/search-widget.js.map +0 -1
  305. package/build-module/search.js.map +0 -1
  306. package/build-module/single-selection-checkbox.js.map +0 -1
  307. package/build-module/view-actions.js +0 -255
  308. package/build-module/view-actions.js.map +0 -1
  309. package/build-module/view-grid.js.map +0 -1
  310. package/build-module/view-list.js.map +0 -1
  311. package/build-module/view-table.js +0 -393
  312. package/build-module/view-table.js.map +0 -1
  313. package/build-types/add-filter.d.ts.map +0 -1
  314. package/build-types/bulk-actions-toolbar.d.ts +0 -13
  315. package/build-types/bulk-actions-toolbar.d.ts.map +0 -1
  316. package/build-types/bulk-actions.d.ts +0 -15
  317. package/build-types/bulk-actions.d.ts.map +0 -1
  318. package/build-types/dataform.d.ts +0 -17
  319. package/build-types/dataform.d.ts.map +0 -1
  320. package/build-types/dataviews.d.ts.map +0 -1
  321. package/build-types/filter-summary.d.ts.map +0 -1
  322. package/build-types/filters.d.ts +0 -13
  323. package/build-types/filters.d.ts.map +0 -1
  324. package/build-types/item-actions.d.ts.map +0 -1
  325. package/build-types/layouts.d.ts.map +0 -1
  326. package/build-types/pagination.d.ts +0 -16
  327. package/build-types/pagination.d.ts.map +0 -1
  328. package/build-types/reset-filters.d.ts.map +0 -1
  329. package/build-types/search-widget.d.ts.map +0 -1
  330. package/build-types/search.d.ts +0 -13
  331. package/build-types/search.d.ts.map +0 -1
  332. package/build-types/single-selection-checkbox.d.ts +0 -17
  333. package/build-types/single-selection-checkbox.d.ts.map +0 -1
  334. package/build-types/stories/fixtures.d.ts.map +0 -1
  335. package/build-types/stories/index.story.d.ts +0 -29
  336. package/build-types/stories/index.story.d.ts.map +0 -1
  337. package/build-types/view-actions.d.ts +0 -12
  338. package/build-types/view-actions.d.ts.map +0 -1
  339. package/build-types/view-grid.d.ts +0 -4
  340. package/build-types/view-grid.d.ts.map +0 -1
  341. package/build-types/view-list.d.ts +0 -4
  342. package/build-types/view-list.d.ts.map +0 -1
  343. package/build-types/view-table.d.ts +0 -5
  344. package/build-types/view-table.d.ts.map +0 -1
  345. package/src/dataform.tsx +0 -106
  346. package/src/dataviews.tsx +0 -183
  347. package/src/filters.tsx +0 -125
  348. package/src/layouts.ts +0 -39
  349. package/src/view-actions.tsx +0 -350
  350. package/src/view-table.tsx +0 -592
  351. /package/build/{reset-filters.js → components/dataviews-filters/reset-filters.js} +0 -0
  352. /package/build-module/{reset-filters.js → components/dataviews-filters/reset-filters.js} +0 -0
@@ -1,592 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import clsx from 'clsx';
5
- import type { ReactNode, Ref, PropsWithoutRef, RefAttributes } from 'react';
6
-
7
- /**
8
- * WordPress dependencies
9
- */
10
- import { __ } from '@wordpress/i18n';
11
- import { unseen, funnel } from '@wordpress/icons';
12
- import {
13
- Button,
14
- Icon,
15
- privateApis as componentsPrivateApis,
16
- CheckboxControl,
17
- Spinner,
18
- } from '@wordpress/components';
19
- import {
20
- forwardRef,
21
- useEffect,
22
- useId,
23
- useRef,
24
- useState,
25
- useMemo,
26
- Children,
27
- Fragment,
28
- } from '@wordpress/element';
29
-
30
- /**
31
- * Internal dependencies
32
- */
33
- import SingleSelectionCheckbox from './single-selection-checkbox';
34
- import { unlock } from './lock-unlock';
35
- import ItemActions from './item-actions';
36
- import { sanitizeOperators } from './utils';
37
- import {
38
- SORTING_DIRECTIONS,
39
- sortArrows,
40
- sortLabels,
41
- sortValues,
42
- } from './constants';
43
- import {
44
- useSomeItemHasAPossibleBulkAction,
45
- useHasAPossibleBulkAction,
46
- } from './bulk-actions';
47
- import type {
48
- Action,
49
- NormalizedField,
50
- SortDirection,
51
- ViewTable as ViewTableType,
52
- ViewTableProps,
53
- } from './types';
54
- import type { SetSelection } from './private-types';
55
-
56
- const {
57
- DropdownMenuV2: DropdownMenu,
58
- DropdownMenuGroupV2: DropdownMenuGroup,
59
- DropdownMenuItemV2: DropdownMenuItem,
60
- DropdownMenuRadioItemV2: DropdownMenuRadioItem,
61
- DropdownMenuItemLabelV2: DropdownMenuItemLabel,
62
- DropdownMenuSeparatorV2: DropdownMenuSeparator,
63
- } = unlock( componentsPrivateApis );
64
-
65
- interface HeaderMenuProps< Item > {
66
- field: NormalizedField< Item >;
67
- view: ViewTableType;
68
- fields: NormalizedField< Item >[];
69
- onChangeView: ( view: ViewTableType ) => void;
70
- onHide: ( field: NormalizedField< Item > ) => void;
71
- setOpenedFilter: ( fieldId: string ) => void;
72
- }
73
-
74
- interface BulkSelectionCheckboxProps< Item > {
75
- selection: string[];
76
- onSelectionChange: SetSelection;
77
- data: Item[];
78
- actions: Action< Item >[];
79
- getItemId: ( item: Item ) => string;
80
- }
81
-
82
- interface TableRowProps< Item > {
83
- hasBulkActions: boolean;
84
- item: Item;
85
- actions: Action< Item >[];
86
- id: string;
87
- visibleFields: NormalizedField< Item >[];
88
- primaryField?: NormalizedField< Item >;
89
- selection: string[];
90
- getItemId: ( item: Item ) => string;
91
- onSelectionChange: SetSelection;
92
- }
93
-
94
- function WithDropDownMenuSeparators( { children }: { children: ReactNode } ) {
95
- return Children.toArray( children )
96
- .filter( Boolean )
97
- .map( ( child, i ) => (
98
- <Fragment key={ i }>
99
- { i > 0 && <DropdownMenuSeparator /> }
100
- { child }
101
- </Fragment>
102
- ) );
103
- }
104
-
105
- const _HeaderMenu = forwardRef( function HeaderMenu< Item >(
106
- {
107
- field,
108
- view,
109
- fields,
110
- onChangeView,
111
- onHide,
112
- setOpenedFilter,
113
- }: HeaderMenuProps< Item >,
114
- ref: Ref< HTMLButtonElement >
115
- ) {
116
- const isHidable = field.enableHiding !== false;
117
- const isSortable = field.enableSorting !== false;
118
- const isSorted = view.sort?.field === field.id;
119
- const operators = sanitizeOperators( field );
120
- // Filter can be added:
121
- // 1. If the field is not already part of a view's filters.
122
- // 2. If the field meets the type and operator requirements.
123
- // 3. If it's not primary. If it is, it should be already visible.
124
- const canAddFilter =
125
- ! view.filters?.some( ( _filter ) => field.id === _filter.field ) &&
126
- !! field.elements?.length &&
127
- !! operators.length &&
128
- ! field.filterBy?.isPrimary;
129
- if ( ! isSortable && ! isHidable && ! canAddFilter ) {
130
- return field.header;
131
- }
132
- return (
133
- <DropdownMenu
134
- align="start"
135
- trigger={
136
- <Button
137
- size="compact"
138
- className="dataviews-view-table-header-button"
139
- ref={ ref }
140
- variant="tertiary"
141
- >
142
- { field.header }
143
- { view.sort && isSorted && (
144
- <span aria-hidden="true">
145
- { sortArrows[ view.sort.direction ] }
146
- </span>
147
- ) }
148
- </Button>
149
- }
150
- style={ { minWidth: '240px' } }
151
- >
152
- <WithDropDownMenuSeparators>
153
- { isSortable && (
154
- <DropdownMenuGroup>
155
- { SORTING_DIRECTIONS.map(
156
- ( direction: SortDirection ) => {
157
- const isChecked =
158
- view.sort &&
159
- isSorted &&
160
- view.sort.direction === direction;
161
-
162
- const value = `${ field.id }-${ direction }`;
163
-
164
- return (
165
- <DropdownMenuRadioItem
166
- key={ value }
167
- // All sorting radio items share the same name, so that
168
- // selecting a sorting option automatically deselects the
169
- // previously selected one, even if it is displayed in
170
- // another submenu. The field and direction are passed via
171
- // the `value` prop.
172
- name="view-table-sorting"
173
- value={ value }
174
- checked={ isChecked }
175
- onChange={ () => {
176
- onChangeView( {
177
- ...view,
178
- sort: {
179
- field: field.id,
180
- direction,
181
- },
182
- } );
183
- } }
184
- >
185
- <DropdownMenuItemLabel>
186
- { sortLabels[ direction ] }
187
- </DropdownMenuItemLabel>
188
- </DropdownMenuRadioItem>
189
- );
190
- }
191
- ) }
192
- </DropdownMenuGroup>
193
- ) }
194
- { canAddFilter && (
195
- <DropdownMenuGroup>
196
- <DropdownMenuItem
197
- prefix={ <Icon icon={ funnel } /> }
198
- onClick={ () => {
199
- setOpenedFilter( field.id );
200
- onChangeView( {
201
- ...view,
202
- page: 1,
203
- filters: [
204
- ...( view.filters || [] ),
205
- {
206
- field: field.id,
207
- value: undefined,
208
- operator: operators[ 0 ],
209
- },
210
- ],
211
- } );
212
- } }
213
- >
214
- <DropdownMenuItemLabel>
215
- { __( 'Add filter' ) }
216
- </DropdownMenuItemLabel>
217
- </DropdownMenuItem>
218
- </DropdownMenuGroup>
219
- ) }
220
- { isHidable && (
221
- <DropdownMenuItem
222
- prefix={ <Icon icon={ unseen } /> }
223
- onClick={ () => {
224
- const viewFields =
225
- view.fields || fields.map( ( f ) => f.id );
226
- onHide( field );
227
- onChangeView( {
228
- ...view,
229
- fields: viewFields.filter(
230
- ( fieldId ) => fieldId !== field.id
231
- ),
232
- } );
233
- } }
234
- >
235
- <DropdownMenuItemLabel>
236
- { __( 'Hide' ) }
237
- </DropdownMenuItemLabel>
238
- </DropdownMenuItem>
239
- ) }
240
- </WithDropDownMenuSeparators>
241
- </DropdownMenu>
242
- );
243
- } );
244
-
245
- // @ts-expect-error Lift the `Item` type argument through the forwardRef.
246
- const HeaderMenu: < Item >(
247
- props: PropsWithoutRef< HeaderMenuProps< Item > > &
248
- RefAttributes< HTMLButtonElement >
249
- ) => ReturnType< typeof _HeaderMenu > = _HeaderMenu;
250
-
251
- function BulkSelectionCheckbox< Item >( {
252
- selection,
253
- onSelectionChange,
254
- data,
255
- actions,
256
- getItemId,
257
- }: BulkSelectionCheckboxProps< Item > ) {
258
- const selectableItems = useMemo( () => {
259
- return data.filter( ( item ) => {
260
- return actions.some(
261
- ( action ) =>
262
- action.supportsBulk &&
263
- ( ! action.isEligible || action.isEligible( item ) )
264
- );
265
- } );
266
- }, [ data, actions ] );
267
- const selectedItems = data.filter(
268
- ( item ) =>
269
- selection.includes( getItemId( item ) ) &&
270
- selectableItems.includes( item )
271
- );
272
- const areAllSelected = selectedItems.length === selectableItems.length;
273
- return (
274
- <CheckboxControl
275
- className="dataviews-view-table-selection-checkbox"
276
- __nextHasNoMarginBottom
277
- checked={ areAllSelected }
278
- indeterminate={ ! areAllSelected && !! selectedItems.length }
279
- onChange={ () => {
280
- if ( areAllSelected ) {
281
- onSelectionChange( [] );
282
- } else {
283
- onSelectionChange(
284
- selectableItems.map( ( item ) => getItemId( item ) )
285
- );
286
- }
287
- } }
288
- aria-label={
289
- areAllSelected ? __( 'Deselect all' ) : __( 'Select all' )
290
- }
291
- />
292
- );
293
- }
294
-
295
- function TableRow< Item >( {
296
- hasBulkActions,
297
- item,
298
- actions,
299
- id,
300
- visibleFields,
301
- primaryField,
302
- selection,
303
- getItemId,
304
- onSelectionChange,
305
- }: TableRowProps< Item > ) {
306
- const hasPossibleBulkAction = useHasAPossibleBulkAction( actions, item );
307
- const isSelected = hasPossibleBulkAction && selection.includes( id );
308
-
309
- const [ isHovered, setIsHovered ] = useState( false );
310
-
311
- const handleMouseEnter = () => {
312
- setIsHovered( true );
313
- };
314
-
315
- const handleMouseLeave = () => {
316
- setIsHovered( false );
317
- };
318
-
319
- // Will be set to true if `onTouchStart` fires. This happens before
320
- // `onClick` and can be used to exclude touchscreen devices from certain
321
- // behaviours.
322
- const isTouchDevice = useRef( false );
323
-
324
- return (
325
- <tr
326
- className={ clsx( 'dataviews-view-table__row', {
327
- 'is-selected': hasPossibleBulkAction && isSelected,
328
- 'is-hovered': isHovered,
329
- 'has-bulk-actions': hasPossibleBulkAction,
330
- } ) }
331
- onMouseEnter={ handleMouseEnter }
332
- onMouseLeave={ handleMouseLeave }
333
- onTouchStart={ () => {
334
- isTouchDevice.current = true;
335
- } }
336
- onClick={ () => {
337
- if ( ! hasPossibleBulkAction ) {
338
- return;
339
- }
340
- if (
341
- ! isTouchDevice.current &&
342
- document.getSelection()?.type !== 'Range'
343
- ) {
344
- onSelectionChange(
345
- selection.includes( id )
346
- ? selection.filter( ( itemId ) => id !== itemId )
347
- : [ ...selection, id ]
348
- );
349
- }
350
- } }
351
- >
352
- { hasBulkActions && (
353
- <td
354
- className="dataviews-view-table__checkbox-column"
355
- style={ {
356
- width: '1%',
357
- } }
358
- >
359
- <div className="dataviews-view-table__cell-content-wrapper">
360
- <SingleSelectionCheckbox
361
- item={ item }
362
- selection={ selection }
363
- onSelectionChange={ onSelectionChange }
364
- getItemId={ getItemId }
365
- primaryField={ primaryField }
366
- disabled={ ! hasPossibleBulkAction }
367
- />
368
- </div>
369
- </td>
370
- ) }
371
- { visibleFields.map( ( field ) => (
372
- <td
373
- key={ field.id }
374
- style={ {
375
- width: field.width || undefined,
376
- minWidth: field.minWidth || undefined,
377
- maxWidth: field.maxWidth || undefined,
378
- } }
379
- >
380
- <div
381
- className={ clsx(
382
- 'dataviews-view-table__cell-content-wrapper',
383
- {
384
- 'dataviews-view-table__primary-field':
385
- primaryField?.id === field.id,
386
- }
387
- ) }
388
- >
389
- { field.render( {
390
- item,
391
- } ) }
392
- </div>
393
- </td>
394
- ) ) }
395
- { !! actions?.length && (
396
- // Disable reason: we are not making the element interactive,
397
- // but preventing any click events from bubbling up to the
398
- // table row. This allows us to add a click handler to the row
399
- // itself (to toggle row selection) without erroneously
400
- // intercepting click events from ItemActions.
401
-
402
- /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
403
- <td
404
- className="dataviews-view-table__actions-column"
405
- onClick={ ( e ) => e.stopPropagation() }
406
- >
407
- <ItemActions item={ item } actions={ actions } />
408
- </td>
409
- /* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */
410
- ) }
411
- </tr>
412
- );
413
- }
414
-
415
- function ViewTable< Item >( {
416
- actions,
417
- data,
418
- fields,
419
- getItemId,
420
- isLoading = false,
421
- onChangeView,
422
- onSelectionChange,
423
- selection,
424
- setOpenedFilter,
425
- view,
426
- }: ViewTableProps< Item > ) {
427
- const headerMenuRefs = useRef<
428
- Map< string, { node: HTMLButtonElement; fallback: string } >
429
- >( new Map() );
430
- const headerMenuToFocusRef = useRef< HTMLButtonElement >();
431
- const [ nextHeaderMenuToFocus, setNextHeaderMenuToFocus ] =
432
- useState< HTMLButtonElement >();
433
- const hasBulkActions = useSomeItemHasAPossibleBulkAction( actions, data );
434
-
435
- useEffect( () => {
436
- if ( headerMenuToFocusRef.current ) {
437
- headerMenuToFocusRef.current.focus();
438
- headerMenuToFocusRef.current = undefined;
439
- }
440
- } );
441
-
442
- const tableNoticeId = useId();
443
-
444
- if ( nextHeaderMenuToFocus ) {
445
- // If we need to force focus, we short-circuit rendering here
446
- // to prevent any additional work while we handle that.
447
- // Clearing out the focus directive is necessary to make sure
448
- // future renders don't cause unexpected focus jumps.
449
- headerMenuToFocusRef.current = nextHeaderMenuToFocus;
450
- setNextHeaderMenuToFocus( undefined );
451
- return;
452
- }
453
-
454
- const onHide = ( field: NormalizedField< Item > ) => {
455
- const hidden = headerMenuRefs.current.get( field.id );
456
- const fallback = hidden
457
- ? headerMenuRefs.current.get( hidden.fallback )
458
- : undefined;
459
- setNextHeaderMenuToFocus( fallback?.node );
460
- };
461
-
462
- const viewFields = view.fields || fields.map( ( f ) => f.id );
463
- const visibleFields = fields.filter(
464
- ( field ) =>
465
- viewFields.includes( field.id ) ||
466
- [ view.layout?.mediaField ].includes( field.id )
467
- );
468
- const hasData = !! data?.length;
469
-
470
- const primaryField = fields.find(
471
- ( field ) => field.id === view.layout?.primaryField
472
- );
473
-
474
- return (
475
- <>
476
- <table
477
- className="dataviews-view-table"
478
- aria-busy={ isLoading }
479
- aria-describedby={ tableNoticeId }
480
- >
481
- <thead>
482
- <tr className="dataviews-view-table__row">
483
- { hasBulkActions && (
484
- <th
485
- className="dataviews-view-table__checkbox-column"
486
- style={ {
487
- width: '1%',
488
- } }
489
- data-field-id="selection"
490
- scope="col"
491
- >
492
- <BulkSelectionCheckbox
493
- selection={ selection }
494
- onSelectionChange={ onSelectionChange }
495
- data={ data }
496
- actions={ actions }
497
- getItemId={ getItemId }
498
- />
499
- </th>
500
- ) }
501
- { visibleFields.map( ( field, index ) => (
502
- <th
503
- key={ field.id }
504
- style={ {
505
- width: field.width || undefined,
506
- minWidth: field.minWidth || undefined,
507
- maxWidth: field.maxWidth || undefined,
508
- } }
509
- data-field-id={ field.id }
510
- aria-sort={
511
- view.sort?.field === field.id
512
- ? sortValues[ view.sort.direction ]
513
- : undefined
514
- }
515
- scope="col"
516
- >
517
- <HeaderMenu
518
- ref={ ( node ) => {
519
- if ( node ) {
520
- headerMenuRefs.current.set(
521
- field.id,
522
- {
523
- node,
524
- fallback:
525
- visibleFields[
526
- index > 0
527
- ? index - 1
528
- : 1
529
- ]?.id,
530
- }
531
- );
532
- } else {
533
- headerMenuRefs.current.delete(
534
- field.id
535
- );
536
- }
537
- } }
538
- field={ field }
539
- view={ view }
540
- fields={ fields }
541
- onChangeView={ onChangeView }
542
- onHide={ onHide }
543
- setOpenedFilter={ setOpenedFilter }
544
- />
545
- </th>
546
- ) ) }
547
- { !! actions?.length && (
548
- <th
549
- data-field-id="actions"
550
- className="dataviews-view-table__actions-column"
551
- >
552
- <span className="dataviews-view-table-header">
553
- { __( 'Actions' ) }
554
- </span>
555
- </th>
556
- ) }
557
- </tr>
558
- </thead>
559
- <tbody>
560
- { hasData &&
561
- data.map( ( item, index ) => (
562
- <TableRow
563
- key={ getItemId( item ) }
564
- item={ item }
565
- hasBulkActions={ hasBulkActions }
566
- actions={ actions }
567
- id={ getItemId( item ) || index.toString() }
568
- visibleFields={ visibleFields }
569
- primaryField={ primaryField }
570
- selection={ selection }
571
- getItemId={ getItemId }
572
- onSelectionChange={ onSelectionChange }
573
- />
574
- ) ) }
575
- </tbody>
576
- </table>
577
- <div
578
- className={ clsx( {
579
- 'dataviews-loading': isLoading,
580
- 'dataviews-no-results': ! hasData && ! isLoading,
581
- } ) }
582
- id={ tableNoticeId }
583
- >
584
- { ! hasData && (
585
- <p>{ isLoading ? <Spinner /> : __( 'No results' ) }</p>
586
- ) }
587
- </div>
588
- </>
589
- );
590
- }
591
-
592
- export default ViewTable;