@wordpress/dataviews 11.0.0 → 11.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 (303) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +140 -93
  3. package/build/components/dataviews-filters/filter.js +25 -267
  4. package/build/components/dataviews-filters/filter.js.map +2 -2
  5. package/build/components/dataviews-filters/input-widget.js +1 -4
  6. package/build/components/dataviews-filters/input-widget.js.map +2 -2
  7. package/build/components/dataviews-filters/use-filters.js +3 -3
  8. package/build/components/dataviews-filters/use-filters.js.map +2 -2
  9. package/build/constants.js +5 -142
  10. package/build/constants.js.map +2 -2
  11. package/build/dataform-controls/number.js +2 -1
  12. package/build/dataform-controls/number.js.map +2 -2
  13. package/build/dataform-controls/textarea.js +3 -1
  14. package/build/dataform-controls/textarea.js.map +2 -2
  15. package/build/dataform-controls/utils/get-custom-validity.js +8 -0
  16. package/build/dataform-controls/utils/get-custom-validity.js.map +2 -2
  17. package/build/dataform-controls/utils/validated-input.js +4 -2
  18. package/build/dataform-controls/utils/validated-input.js.map +2 -2
  19. package/build/dataform-controls/utils/validated-number.js +4 -2
  20. package/build/dataform-controls/utils/validated-number.js.map +2 -2
  21. package/build/dataform-layouts/panel/modal.js +14 -5
  22. package/build/dataform-layouts/panel/modal.js.map +2 -2
  23. package/build/dataviews-layouts/grid/composite-grid.js +39 -37
  24. package/build/dataviews-layouts/grid/composite-grid.js.map +3 -3
  25. package/build/dataviews-layouts/table/index.js +8 -3
  26. package/build/dataviews-layouts/table/index.js.map +2 -2
  27. package/build/field-types/array.js +27 -14
  28. package/build/field-types/array.js.map +3 -3
  29. package/build/field-types/boolean.js +13 -10
  30. package/build/field-types/boolean.js.map +3 -3
  31. package/build/field-types/color.js +14 -11
  32. package/build/field-types/color.js.map +3 -3
  33. package/build/field-types/date.js +11 -8
  34. package/build/field-types/date.js.map +3 -3
  35. package/build/field-types/datetime.js +7 -5
  36. package/build/field-types/datetime.js.map +3 -3
  37. package/build/field-types/email.js +20 -11
  38. package/build/field-types/email.js.map +3 -3
  39. package/build/field-types/index.js +12 -14
  40. package/build/field-types/index.js.map +3 -3
  41. package/build/field-types/integer.js +63 -14
  42. package/build/field-types/integer.js.map +3 -3
  43. package/build/field-types/media.js +5 -5
  44. package/build/field-types/media.js.map +2 -2
  45. package/build/field-types/no-type.js +9 -6
  46. package/build/field-types/no-type.js.map +3 -3
  47. package/build/field-types/number.js +51 -15
  48. package/build/field-types/number.js.map +3 -3
  49. package/build/field-types/password.js +13 -5
  50. package/build/field-types/password.js.map +3 -3
  51. package/build/field-types/telephone.js +13 -5
  52. package/build/field-types/telephone.js.map +3 -3
  53. package/build/field-types/text.js +13 -5
  54. package/build/field-types/text.js.map +3 -3
  55. package/build/field-types/url.js +13 -5
  56. package/build/field-types/url.js.map +3 -3
  57. package/build/field-types/utils/get-is-valid.js +89 -0
  58. package/build/field-types/utils/get-is-valid.js.map +7 -0
  59. package/build/field-types/utils/is-valid-elements.js +35 -0
  60. package/build/field-types/utils/is-valid-elements.js.map +7 -0
  61. package/build/field-types/utils/is-valid-max-length.js +36 -0
  62. package/build/field-types/utils/is-valid-max-length.js.map +7 -0
  63. package/build/field-types/utils/is-valid-max.js +36 -0
  64. package/build/field-types/utils/is-valid-max.js.map +7 -0
  65. package/build/field-types/utils/is-valid-min-length.js +36 -0
  66. package/build/field-types/utils/is-valid-min-length.js.map +7 -0
  67. package/build/field-types/utils/is-valid-min.js +36 -0
  68. package/build/field-types/utils/is-valid-min.js.map +7 -0
  69. package/build/field-types/utils/is-valid-pattern.js +41 -0
  70. package/build/field-types/utils/is-valid-pattern.js.map +7 -0
  71. package/build/field-types/utils/is-valid-required-for-array.js +32 -0
  72. package/build/field-types/utils/is-valid-required-for-array.js.map +7 -0
  73. package/build/field-types/utils/is-valid-required-for-bool.js +30 -0
  74. package/build/field-types/utils/is-valid-required-for-bool.js.map +7 -0
  75. package/build/field-types/utils/is-valid-required.js +30 -0
  76. package/build/field-types/utils/is-valid-required.js.map +7 -0
  77. package/build/hooks/use-form-validity.js +52 -102
  78. package/build/hooks/use-form-validity.js.map +2 -2
  79. package/build/types/field-api.js.map +1 -1
  80. package/build/types/private.js.map +1 -1
  81. package/build/utils/filter-sort-and-paginate.js +5 -0
  82. package/build/utils/filter-sort-and-paginate.js.map +3 -3
  83. package/build/utils/operators.js +399 -0
  84. package/build/utils/operators.js.map +7 -0
  85. package/build-module/components/dataviews-filters/filter.js +26 -292
  86. package/build-module/components/dataviews-filters/filter.js.map +2 -2
  87. package/build-module/components/dataviews-filters/input-widget.js +1 -4
  88. package/build-module/components/dataviews-filters/input-widget.js.map +2 -2
  89. package/build-module/components/dataviews-filters/use-filters.js +6 -3
  90. package/build-module/components/dataviews-filters/use-filters.js.map +2 -2
  91. package/build-module/constants.js +5 -139
  92. package/build-module/constants.js.map +2 -2
  93. package/build-module/dataform-controls/number.js +2 -1
  94. package/build-module/dataform-controls/number.js.map +2 -2
  95. package/build-module/dataform-controls/textarea.js +3 -1
  96. package/build-module/dataform-controls/textarea.js.map +2 -2
  97. package/build-module/dataform-controls/utils/get-custom-validity.js +8 -0
  98. package/build-module/dataform-controls/utils/get-custom-validity.js.map +2 -2
  99. package/build-module/dataform-controls/utils/validated-input.js +4 -2
  100. package/build-module/dataform-controls/utils/validated-input.js.map +2 -2
  101. package/build-module/dataform-controls/utils/validated-number.js +4 -2
  102. package/build-module/dataform-controls/utils/validated-number.js.map +2 -2
  103. package/build-module/dataform-layouts/panel/modal.js +14 -5
  104. package/build-module/dataform-layouts/panel/modal.js.map +2 -2
  105. package/build-module/dataviews-layouts/grid/composite-grid.js +40 -38
  106. package/build-module/dataviews-layouts/grid/composite-grid.js.map +3 -3
  107. package/build-module/dataviews-layouts/table/index.js +8 -3
  108. package/build-module/dataviews-layouts/table/index.js.map +2 -2
  109. package/build-module/field-types/array.js +17 -14
  110. package/build-module/field-types/array.js.map +2 -2
  111. package/build-module/field-types/boolean.js +13 -10
  112. package/build-module/field-types/boolean.js.map +2 -2
  113. package/build-module/field-types/color.js +14 -11
  114. package/build-module/field-types/color.js.map +2 -2
  115. package/build-module/field-types/date.js +11 -8
  116. package/build-module/field-types/date.js.map +2 -2
  117. package/build-module/field-types/datetime.js +7 -5
  118. package/build-module/field-types/datetime.js.map +2 -2
  119. package/build-module/field-types/email.js +20 -11
  120. package/build-module/field-types/email.js.map +2 -2
  121. package/build-module/field-types/index.js +12 -14
  122. package/build-module/field-types/index.js.map +2 -2
  123. package/build-module/field-types/integer.js +58 -13
  124. package/build-module/field-types/integer.js.map +2 -2
  125. package/build-module/field-types/media.js +5 -5
  126. package/build-module/field-types/media.js.map +2 -2
  127. package/build-module/field-types/no-type.js +10 -7
  128. package/build-module/field-types/no-type.js.map +2 -2
  129. package/build-module/field-types/number.js +47 -15
  130. package/build-module/field-types/number.js.map +2 -2
  131. package/build-module/field-types/password.js +13 -5
  132. package/build-module/field-types/password.js.map +2 -2
  133. package/build-module/field-types/telephone.js +13 -5
  134. package/build-module/field-types/telephone.js.map +2 -2
  135. package/build-module/field-types/text.js +13 -5
  136. package/build-module/field-types/text.js.map +2 -2
  137. package/build-module/field-types/url.js +13 -5
  138. package/build-module/field-types/url.js.map +2 -2
  139. package/build-module/field-types/utils/get-is-valid.js +68 -0
  140. package/build-module/field-types/utils/get-is-valid.js.map +7 -0
  141. package/build-module/field-types/utils/is-valid-elements.js +14 -0
  142. package/build-module/field-types/utils/is-valid-elements.js.map +7 -0
  143. package/build-module/field-types/utils/is-valid-max-length.js +15 -0
  144. package/build-module/field-types/utils/is-valid-max-length.js.map +7 -0
  145. package/build-module/field-types/utils/is-valid-max.js +15 -0
  146. package/build-module/field-types/utils/is-valid-max.js.map +7 -0
  147. package/build-module/field-types/utils/is-valid-min-length.js +15 -0
  148. package/build-module/field-types/utils/is-valid-min-length.js.map +7 -0
  149. package/build-module/field-types/utils/is-valid-min.js +15 -0
  150. package/build-module/field-types/utils/is-valid-min.js.map +7 -0
  151. package/build-module/field-types/utils/is-valid-pattern.js +20 -0
  152. package/build-module/field-types/utils/is-valid-pattern.js.map +7 -0
  153. package/build-module/field-types/utils/is-valid-required-for-array.js +11 -0
  154. package/build-module/field-types/utils/is-valid-required-for-array.js.map +7 -0
  155. package/build-module/field-types/utils/is-valid-required-for-bool.js +9 -0
  156. package/build-module/field-types/utils/is-valid-required-for-bool.js.map +7 -0
  157. package/build-module/field-types/utils/is-valid-required.js +9 -0
  158. package/build-module/field-types/utils/is-valid-required.js.map +7 -0
  159. package/build-module/hooks/use-form-validity.js +52 -102
  160. package/build-module/hooks/use-form-validity.js.map +2 -2
  161. package/build-module/utils/filter-sort-and-paginate.js +5 -0
  162. package/build-module/utils/filter-sort-and-paginate.js.map +2 -2
  163. package/build-module/utils/operators.js +394 -0
  164. package/build-module/utils/operators.js.map +7 -0
  165. package/build-style/style-rtl.css +13 -80
  166. package/build-style/style.css +13 -80
  167. package/build-types/components/dataviews-filters/filter.d.ts.map +1 -1
  168. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  169. package/build-types/components/dataviews-filters/use-filters.d.ts.map +1 -1
  170. package/build-types/constants.d.ts +6 -12
  171. package/build-types/constants.d.ts.map +1 -1
  172. package/build-types/dataform-controls/number.d.ts.map +1 -1
  173. package/build-types/dataform-controls/textarea.d.ts.map +1 -1
  174. package/build-types/dataform-controls/utils/get-custom-validity.d.ts +2 -2
  175. package/build-types/dataform-controls/utils/get-custom-validity.d.ts.map +1 -1
  176. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -1
  177. package/build-types/dataform-controls/utils/validated-number.d.ts.map +1 -1
  178. package/build-types/dataform-layouts/panel/modal.d.ts.map +1 -1
  179. package/build-types/dataviews-layouts/grid/composite-grid.d.ts.map +1 -1
  180. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  181. package/build-types/field-types/array.d.ts +9 -2
  182. package/build-types/field-types/array.d.ts.map +1 -1
  183. package/build-types/field-types/boolean.d.ts +9 -2
  184. package/build-types/field-types/boolean.d.ts.map +1 -1
  185. package/build-types/field-types/color.d.ts +9 -2
  186. package/build-types/field-types/color.d.ts.map +1 -1
  187. package/build-types/field-types/date.d.ts +6 -4
  188. package/build-types/field-types/date.d.ts.map +1 -1
  189. package/build-types/field-types/datetime.d.ts +6 -4
  190. package/build-types/field-types/datetime.d.ts.map +1 -1
  191. package/build-types/field-types/email.d.ts +15 -2
  192. package/build-types/field-types/email.d.ts.map +1 -1
  193. package/build-types/field-types/index.d.ts.map +1 -1
  194. package/build-types/field-types/integer.d.ts +17 -4
  195. package/build-types/field-types/integer.d.ts.map +1 -1
  196. package/build-types/field-types/media.d.ts +1 -4
  197. package/build-types/field-types/media.d.ts.map +1 -1
  198. package/build-types/field-types/no-type.d.ts +6 -4
  199. package/build-types/field-types/no-type.d.ts.map +1 -1
  200. package/build-types/field-types/number.d.ts +17 -4
  201. package/build-types/field-types/number.d.ts.map +1 -1
  202. package/build-types/field-types/password.d.ts +12 -4
  203. package/build-types/field-types/password.d.ts.map +1 -1
  204. package/build-types/field-types/telephone.d.ts +12 -4
  205. package/build-types/field-types/telephone.d.ts.map +1 -1
  206. package/build-types/field-types/text.d.ts +12 -4
  207. package/build-types/field-types/text.d.ts.map +1 -1
  208. package/build-types/field-types/url.d.ts +12 -4
  209. package/build-types/field-types/url.d.ts.map +1 -1
  210. package/build-types/field-types/utils/get-is-valid.d.ts +7 -0
  211. package/build-types/field-types/utils/get-is-valid.d.ts.map +1 -0
  212. package/build-types/field-types/utils/is-valid-elements.d.ts +6 -0
  213. package/build-types/field-types/utils/is-valid-elements.d.ts.map +1 -0
  214. package/build-types/field-types/utils/is-valid-max-length.d.ts +6 -0
  215. package/build-types/field-types/utils/is-valid-max-length.d.ts.map +1 -0
  216. package/build-types/field-types/utils/is-valid-max.d.ts +6 -0
  217. package/build-types/field-types/utils/is-valid-max.d.ts.map +1 -0
  218. package/build-types/field-types/utils/is-valid-min-length.d.ts +6 -0
  219. package/build-types/field-types/utils/is-valid-min-length.d.ts.map +1 -0
  220. package/build-types/field-types/utils/is-valid-min.d.ts +6 -0
  221. package/build-types/field-types/utils/is-valid-min.d.ts.map +1 -0
  222. package/build-types/field-types/utils/is-valid-pattern.d.ts +6 -0
  223. package/build-types/field-types/utils/is-valid-pattern.d.ts.map +1 -0
  224. package/build-types/field-types/utils/is-valid-required-for-array.d.ts +6 -0
  225. package/build-types/field-types/utils/is-valid-required-for-array.d.ts.map +1 -0
  226. package/build-types/field-types/utils/is-valid-required-for-bool.d.ts +6 -0
  227. package/build-types/field-types/utils/is-valid-required-for-bool.d.ts.map +1 -0
  228. package/build-types/field-types/utils/is-valid-required.d.ts +6 -0
  229. package/build-types/field-types/utils/is-valid-required.d.ts.map +1 -0
  230. package/build-types/hooks/use-form-validity.d.ts.map +1 -1
  231. package/build-types/stories/dataform.story.d.ts +9 -1
  232. package/build-types/stories/dataform.story.d.ts.map +1 -1
  233. package/build-types/stories/dataviews-picker.story.d.ts.map +1 -1
  234. package/build-types/stories/dataviews.story.d.ts +27 -2
  235. package/build-types/stories/dataviews.story.d.ts.map +1 -1
  236. package/build-types/stories/field-types.story.d.ts +39 -2
  237. package/build-types/stories/field-types.story.d.ts.map +1 -1
  238. package/build-types/types/field-api.d.ts +72 -4
  239. package/build-types/types/field-api.d.ts.map +1 -1
  240. package/build-types/types/private.d.ts +13 -3
  241. package/build-types/types/private.d.ts.map +1 -1
  242. package/build-types/utils/filter-sort-and-paginate.d.ts.map +1 -1
  243. package/build-types/utils/operators.d.ts +16 -0
  244. package/build-types/utils/operators.d.ts.map +1 -0
  245. package/build-wp/index.js +1548 -1452
  246. package/package.json +17 -16
  247. package/src/components/dataviews/style.scss +3 -28
  248. package/src/components/dataviews-filters/filter.tsx +34 -321
  249. package/src/components/dataviews-filters/input-widget.tsx +7 -5
  250. package/src/components/dataviews-filters/use-filters.ts +6 -3
  251. package/src/components/dataviews-footer/style.scss +1 -7
  252. package/src/constants.ts +6 -140
  253. package/src/dataform-controls/number.tsx +3 -3
  254. package/src/dataform-controls/textarea.tsx +7 -1
  255. package/src/dataform-controls/utils/get-custom-validity.ts +10 -2
  256. package/src/dataform-controls/utils/validated-input.tsx +8 -2
  257. package/src/dataform-controls/utils/validated-number.tsx +3 -1
  258. package/src/dataform-layouts/panel/modal.tsx +14 -5
  259. package/src/dataviews-layouts/activity/style.scss +1 -1
  260. package/src/dataviews-layouts/grid/composite-grid.tsx +64 -57
  261. package/src/dataviews-layouts/grid/style.scss +3 -12
  262. package/src/dataviews-layouts/table/index.tsx +9 -3
  263. package/src/dataviews-layouts/table/style.scss +4 -15
  264. package/src/dataviews-layouts/utils/grid-items.scss +1 -9
  265. package/src/field-types/array.tsx +26 -19
  266. package/src/field-types/boolean.tsx +22 -15
  267. package/src/field-types/color.tsx +22 -15
  268. package/src/field-types/date.tsx +14 -11
  269. package/src/field-types/datetime.tsx +6 -4
  270. package/src/field-types/email.tsx +24 -15
  271. package/src/field-types/index.tsx +12 -14
  272. package/src/field-types/integer.tsx +83 -17
  273. package/src/field-types/media.tsx +4 -4
  274. package/src/field-types/no-type.tsx +9 -6
  275. package/src/field-types/number.tsx +82 -16
  276. package/src/field-types/password.tsx +12 -4
  277. package/src/field-types/telephone.tsx +12 -4
  278. package/src/field-types/text.tsx +12 -4
  279. package/src/field-types/url.tsx +12 -4
  280. package/src/field-types/utils/get-is-valid.ts +103 -0
  281. package/src/field-types/utils/is-valid-elements.ts +20 -0
  282. package/src/field-types/utils/is-valid-max-length.ts +23 -0
  283. package/src/field-types/utils/is-valid-max.ts +23 -0
  284. package/src/field-types/utils/is-valid-min-length.ts +23 -0
  285. package/src/field-types/utils/is-valid-min.ts +23 -0
  286. package/src/field-types/utils/is-valid-pattern.ts +29 -0
  287. package/src/field-types/utils/is-valid-required-for-array.ts +18 -0
  288. package/src/field-types/utils/is-valid-required-for-bool.ts +13 -0
  289. package/src/field-types/utils/is-valid-required.ts +13 -0
  290. package/src/hooks/use-form-validity.ts +78 -156
  291. package/src/stories/dataform.story.tsx +126 -30
  292. package/src/stories/dataviews-picker.story.tsx +27 -17
  293. package/src/stories/dataviews.story.tsx +79 -30
  294. package/src/stories/field-types.story.tsx +86 -4
  295. package/src/test/filter-sort-and-paginate.js +2 -1
  296. package/src/test/normalize-fields.ts +87 -11
  297. package/src/test/use-form-validity.ts +796 -31
  298. package/src/types/field-api.ts +90 -4
  299. package/src/types/private.ts +26 -8
  300. package/src/utils/filter-sort-and-paginate.ts +5 -0
  301. package/src/utils/operators.tsx +448 -0
  302. package/tsconfig.json +1 -0
  303. package/tsconfig.tsbuildinfo +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/dataviews",
3
- "version": "11.0.0",
3
+ "version": "11.1.0",
4
4
  "description": "DataViews is a component that provides an API to render datasets using different types of layouts (table, grid, list, etc.).",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -44,20 +44,21 @@
44
44
  "sideEffects": false,
45
45
  "dependencies": {
46
46
  "@ariakit/react": "^0.4.15",
47
- "@wordpress/base-styles": "^6.12.0",
48
- "@wordpress/components": "^30.9.0",
49
- "@wordpress/compose": "^7.36.0",
50
- "@wordpress/data": "^10.36.0",
51
- "@wordpress/date": "^5.36.0",
52
- "@wordpress/dom": "^4.36.0",
53
- "@wordpress/element": "^6.36.0",
54
- "@wordpress/i18n": "^6.9.0",
55
- "@wordpress/icons": "^11.3.0",
56
- "@wordpress/keycodes": "^4.36.0",
57
- "@wordpress/primitives": "^4.36.0",
58
- "@wordpress/private-apis": "^1.36.0",
59
- "@wordpress/url": "^4.36.0",
60
- "@wordpress/warning": "^3.36.0",
47
+ "@wordpress/base-styles": "^6.13.0",
48
+ "@wordpress/components": "^31.0.0",
49
+ "@wordpress/compose": "^7.37.0",
50
+ "@wordpress/data": "^10.37.0",
51
+ "@wordpress/date": "^5.37.0",
52
+ "@wordpress/deprecated": "^4.37.0",
53
+ "@wordpress/dom": "^4.37.0",
54
+ "@wordpress/element": "^6.37.0",
55
+ "@wordpress/i18n": "^6.10.0",
56
+ "@wordpress/icons": "^11.4.0",
57
+ "@wordpress/keycodes": "^4.37.0",
58
+ "@wordpress/primitives": "^4.37.0",
59
+ "@wordpress/private-apis": "^1.37.0",
60
+ "@wordpress/url": "^4.37.0",
61
+ "@wordpress/warning": "^3.37.0",
61
62
  "clsx": "^2.1.1",
62
63
  "colord": "^2.7.0",
63
64
  "date-fns": "^4.1.0",
@@ -75,5 +76,5 @@
75
76
  "scripts": {
76
77
  "build:wp": "node build"
77
78
  },
78
- "gitHead": "b35cf1a2dce04665e99fd6b9c2891c0b336361b9"
79
+ "gitHead": "2cf13ec6cf86153c9b3cf369bf5c59046f5cd950"
79
80
  }
@@ -20,7 +20,7 @@
20
20
  .dataviews__view-actions,
21
21
  .dataviews-filters__container {
22
22
  box-sizing: border-box;
23
- padding: $grid-unit-20 $grid-unit-60;
23
+ padding: $grid-unit-20 $grid-unit-30;
24
24
  flex-shrink: 0;
25
25
  position: sticky;
26
26
  left: 0;
@@ -33,7 +33,7 @@
33
33
 
34
34
  .dataviews-no-results,
35
35
  .dataviews-loading {
36
- padding: 0 $grid-unit-60;
36
+ padding: 0 $grid-unit-30;
37
37
  flex-grow: 1;
38
38
  display: flex;
39
39
  align-items: center;
@@ -53,12 +53,6 @@
53
53
  .dataviews-filters__container {
54
54
  padding: $grid-unit-15 $grid-unit-30;
55
55
  }
56
-
57
- .dataviews-no-results,
58
- .dataviews-loading {
59
- padding-left: $grid-unit-30;
60
- padding-right: $grid-unit-30;
61
- }
62
56
  }
63
57
 
64
58
  .dataviews-title-field {
@@ -109,29 +103,10 @@
109
103
  }
110
104
 
111
105
  /**
112
- * Applying a consistent 24px padding when DataViews are placed within cards.
106
+ * When DataViews are placed within cards, apply a consistent top padding.
113
107
  */
114
108
  .components-card__body:has(> .dataviews-wrapper),
115
109
  .components-card__body:has(> .dataviews-picker-wrapper) {
116
110
  padding: $grid-unit-10 0 0;
117
111
  overflow: hidden; // Prevent cells with white backgrounds overflowing the card
118
-
119
- .dataviews__view-actions,
120
- .dataviews-filters__container,
121
- .dataviews-footer,
122
- .dataviews-view-grid,
123
- .dataviews-loading,
124
- .dataviews-no-results {
125
- padding-inline: $grid-unit-30;
126
- }
127
-
128
- .dataviews-view-table tr td:first-child,
129
- .dataviews-view-table tr th:first-child {
130
- padding-inline-start: $grid-unit-30;
131
- }
132
-
133
- .dataviews-view-table tr td:last-child,
134
- .dataviews-view-table tr th:last-child {
135
- padding-inline-end: $grid-unit-30;
136
- }
137
112
  }
@@ -17,7 +17,7 @@ import {
17
17
  Icon,
18
18
  } from '@wordpress/components';
19
19
  import { __, sprintf } from '@wordpress/i18n';
20
- import { useRef, createInterpolateElement } from '@wordpress/element';
20
+ import { useRef } from '@wordpress/element';
21
21
  import { closeSmall } from '@wordpress/icons';
22
22
  import { dateI18n, getDate } from '@wordpress/date';
23
23
 
@@ -26,35 +26,13 @@ import { dateI18n, getDate } from '@wordpress/date';
26
26
  */
27
27
  import SearchWidget from './search-widget';
28
28
  import InputWidget from './input-widget';
29
- import {
30
- OPERATORS,
31
- OPERATOR_IS,
32
- OPERATOR_IS_NOT,
33
- OPERATOR_IS_ANY,
34
- OPERATOR_IS_NONE,
35
- OPERATOR_IS_ALL,
36
- OPERATOR_IS_NOT_ALL,
37
- OPERATOR_LESS_THAN,
38
- OPERATOR_GREATER_THAN,
39
- OPERATOR_LESS_THAN_OR_EQUAL,
40
- OPERATOR_GREATER_THAN_OR_EQUAL,
41
- OPERATOR_CONTAINS,
42
- OPERATOR_NOT_CONTAINS,
43
- OPERATOR_STARTS_WITH,
44
- OPERATOR_BEFORE,
45
- OPERATOR_AFTER,
46
- OPERATOR_BEFORE_INC,
47
- OPERATOR_AFTER_INC,
48
- OPERATOR_BETWEEN,
49
- OPERATOR_ON,
50
- OPERATOR_NOT_ON,
51
- OPERATOR_IN_THE_PAST,
52
- OPERATOR_OVER,
53
- } from '../../constants';
29
+ import { getOperatorByName } from '../../utils/operators';
54
30
  import type {
55
31
  Filter,
56
32
  NormalizedField,
57
33
  NormalizedFieldDate,
34
+ NormalizedFieldNumber,
35
+ NormalizedFieldInteger,
58
36
  NormalizedFilter,
59
37
  Operator,
60
38
  Option,
@@ -62,6 +40,8 @@ import type {
62
40
  } from '../../types';
63
41
  import useElements from '../../hooks/use-elements';
64
42
  import parseDateTime from '../../field-types/utils/parse-date-time';
43
+ import { formatNumber } from '../../field-types/number';
44
+ import { formatInteger } from '../../field-types/integer';
65
45
 
66
46
  const ENTER = 'Enter';
67
47
  const SPACE = ' ';
@@ -93,285 +73,11 @@ const FilterText = ( {
93
73
  return filter.name;
94
74
  }
95
75
 
96
- const filterTextWrappers = {
97
- Name: <span className="dataviews-filters__summary-filter-text-name" />,
98
- Value: (
99
- <span className="dataviews-filters__summary-filter-text-value" />
100
- ),
101
- };
102
-
103
- if ( filterInView?.operator === OPERATOR_IS_ANY ) {
104
- return createInterpolateElement(
105
- sprintf(
106
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Author is any: Admin, Editor". */
107
- __( '<Name>%1$s is any: </Name><Value>%2$s</Value>' ),
108
- filter.name,
109
- activeElements.map( ( element ) => element.label ).join( ', ' )
110
- ),
111
- filterTextWrappers
112
- );
113
- }
114
-
115
- if ( filterInView?.operator === OPERATOR_IS_NONE ) {
116
- return createInterpolateElement(
117
- sprintf(
118
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Author is none: Admin, Editor". */
119
- __( '<Name>%1$s is none: </Name><Value>%2$s</Value>' ),
120
- filter.name,
121
- activeElements.map( ( element ) => element.label ).join( ', ' )
122
- ),
123
- filterTextWrappers
124
- );
76
+ const operator = getOperatorByName( filterInView?.operator );
77
+ if ( operator !== undefined ) {
78
+ return operator.filterText( filter, activeElements );
125
79
  }
126
80
 
127
- if ( filterInView?.operator === OPERATOR_IS_ALL ) {
128
- return createInterpolateElement(
129
- sprintf(
130
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Author is all: Admin, Editor". */
131
- __( '<Name>%1$s is all: </Name><Value>%2$s</Value>' ),
132
- filter.name,
133
- activeElements.map( ( element ) => element.label ).join( ', ' )
134
- ),
135
- filterTextWrappers
136
- );
137
- }
138
-
139
- if ( filterInView?.operator === OPERATOR_IS_NOT_ALL ) {
140
- return createInterpolateElement(
141
- sprintf(
142
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Author is not all: Admin, Editor". */
143
- __( '<Name>%1$s is not all: </Name><Value>%2$s</Value>' ),
144
- filter.name,
145
- activeElements.map( ( element ) => element.label ).join( ', ' )
146
- ),
147
- filterTextWrappers
148
- );
149
- }
150
-
151
- if ( filterInView?.operator === OPERATOR_IS ) {
152
- return createInterpolateElement(
153
- sprintf(
154
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Author is: Admin". */
155
- __( '<Name>%1$s is: </Name><Value>%2$s</Value>' ),
156
- filter.name,
157
- activeElements[ 0 ].label
158
- ),
159
- filterTextWrappers
160
- );
161
- }
162
-
163
- if ( filterInView?.operator === OPERATOR_IS_NOT ) {
164
- return createInterpolateElement(
165
- sprintf(
166
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Author is not: Admin". */
167
- __( '<Name>%1$s is not: </Name><Value>%2$s</Value>' ),
168
- filter.name,
169
- activeElements[ 0 ].label
170
- ),
171
- filterTextWrappers
172
- );
173
- }
174
-
175
- if ( filterInView?.operator === OPERATOR_LESS_THAN ) {
176
- return createInterpolateElement(
177
- sprintf(
178
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Price is less than: 10". */
179
- __( '<Name>%1$s is less than: </Name><Value>%2$s</Value>' ),
180
- filter.name,
181
- activeElements[ 0 ].label
182
- ),
183
- filterTextWrappers
184
- );
185
- }
186
-
187
- if ( filterInView?.operator === OPERATOR_GREATER_THAN ) {
188
- return createInterpolateElement(
189
- sprintf(
190
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Price is greater than: 10". */
191
- __( '<Name>%1$s is greater than: </Name><Value>%2$s</Value>' ),
192
- filter.name,
193
- activeElements[ 0 ].label
194
- ),
195
- filterTextWrappers
196
- );
197
- }
198
-
199
- if ( filterInView?.operator === OPERATOR_LESS_THAN_OR_EQUAL ) {
200
- return createInterpolateElement(
201
- sprintf(
202
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Price is less than or equal to: 10". */
203
- __(
204
- '<Name>%1$s is less than or equal to: </Name><Value>%2$s</Value>'
205
- ),
206
- filter.name,
207
- activeElements[ 0 ].label
208
- ),
209
- filterTextWrappers
210
- );
211
- }
212
-
213
- if ( filterInView?.operator === OPERATOR_GREATER_THAN_OR_EQUAL ) {
214
- return createInterpolateElement(
215
- sprintf(
216
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Price is greater than or equal to: 10". */
217
- __(
218
- '<Name>%1$s is greater than or equal to: </Name><Value>%2$s</Value>'
219
- ),
220
- filter.name,
221
- activeElements[ 0 ].label
222
- ),
223
- filterTextWrappers
224
- );
225
- }
226
-
227
- if ( filterInView?.operator === OPERATOR_CONTAINS ) {
228
- return createInterpolateElement(
229
- sprintf(
230
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Title contains: Mars". */
231
- __( '<Name>%1$s contains: </Name><Value>%2$s</Value>' ),
232
- filter.name,
233
- activeElements[ 0 ].label
234
- ),
235
- filterTextWrappers
236
- );
237
- }
238
-
239
- if ( filterInView?.operator === OPERATOR_NOT_CONTAINS ) {
240
- return createInterpolateElement(
241
- sprintf(
242
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Description doesn't contain: photo". */
243
- __( "<Name>%1$s doesn't contain: </Name><Value>%2$s</Value>" ),
244
- filter.name,
245
- activeElements[ 0 ].label
246
- ),
247
- filterTextWrappers
248
- );
249
- }
250
-
251
- if ( filterInView?.operator === OPERATOR_STARTS_WITH ) {
252
- return createInterpolateElement(
253
- sprintf(
254
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Title starts with: Mar". */
255
- __( '<Name>%1$s starts with: </Name><Value>%2$s</Value>' ),
256
- filter.name,
257
- activeElements[ 0 ].label
258
- ),
259
- filterTextWrappers
260
- );
261
- }
262
-
263
- if ( filterInView?.operator === OPERATOR_BEFORE ) {
264
- return createInterpolateElement(
265
- sprintf(
266
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is before: 2024-01-01". */
267
- __( '<Name>%1$s is before: </Name><Value>%2$s</Value>' ),
268
- filter.name,
269
- activeElements[ 0 ].label
270
- ),
271
- filterTextWrappers
272
- );
273
- }
274
-
275
- if ( filterInView?.operator === OPERATOR_AFTER ) {
276
- return createInterpolateElement(
277
- sprintf(
278
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is after: 2024-01-01". */
279
- __( '<Name>%1$s is after: </Name><Value>%2$s</Value>' ),
280
- filter.name,
281
- activeElements[ 0 ].label
282
- ),
283
- filterTextWrappers
284
- );
285
- }
286
-
287
- if ( filterInView?.operator === OPERATOR_BEFORE_INC ) {
288
- return createInterpolateElement(
289
- sprintf(
290
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is on or before: 2024-01-01". */
291
- __( '<Name>%1$s is on or before: </Name><Value>%2$s</Value>' ),
292
- filter.name,
293
- activeElements[ 0 ].label
294
- ),
295
- filterTextWrappers
296
- );
297
- }
298
-
299
- if ( filterInView?.operator === OPERATOR_AFTER_INC ) {
300
- return createInterpolateElement(
301
- sprintf(
302
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is on or after: 2024-01-01". */
303
- __( '<Name>%1$s is on or after: </Name><Value>%2$s</Value>' ),
304
- filter.name,
305
- activeElements[ 0 ].label
306
- ),
307
- filterTextWrappers
308
- );
309
- }
310
-
311
- if ( filterInView?.operator === OPERATOR_BETWEEN ) {
312
- const { label } = activeElements[ 0 ];
313
-
314
- return createInterpolateElement(
315
- sprintf(
316
- /* translators: 1: Filter name. 2: Min value. 3: Max value. e.g.: "Item count between (inc): 10 and 180". */
317
- __(
318
- '<Name>%1$s between (inc): </Name><Value>%2$s and %3$s</Value>'
319
- ),
320
- filter.name,
321
- label[ 0 ],
322
- label[ 1 ]
323
- ),
324
- filterTextWrappers
325
- );
326
- }
327
-
328
- if ( filterInView?.operator === OPERATOR_ON ) {
329
- return createInterpolateElement(
330
- sprintf(
331
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is: 2024-01-01". */
332
- __( '<Name>%1$s is: </Name><Value>%2$s</Value>' ),
333
- filter.name,
334
- activeElements[ 0 ].label
335
- ),
336
- filterTextWrappers
337
- );
338
- }
339
-
340
- if ( filterInView?.operator === OPERATOR_NOT_ON ) {
341
- return createInterpolateElement(
342
- sprintf(
343
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is not: 2024-01-01". */
344
- __( '<Name>%1$s is not: </Name><Value>%2$s</Value>' ),
345
- filter.name,
346
- activeElements[ 0 ].label
347
- ),
348
- filterTextWrappers
349
- );
350
- }
351
-
352
- if ( filterInView?.operator === OPERATOR_IN_THE_PAST ) {
353
- return createInterpolateElement(
354
- sprintf(
355
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is in the past: 1 days". */
356
- __( '<Name>%1$s is in the past: </Name><Value>%2$s</Value>' ),
357
- filter.name,
358
- `${ activeElements[ 0 ].value.value } ${ activeElements[ 0 ].value.unit }`
359
- ),
360
- filterTextWrappers
361
- );
362
- }
363
-
364
- if ( filterInView?.operator === OPERATOR_OVER ) {
365
- return createInterpolateElement(
366
- sprintf(
367
- /* translators: 1: Filter name. 2: Filter value. e.g.: "Date is over: 1 days ago". */
368
- __( '<Name>%1$s is over: </Name><Value>%2$s</Value> ago' ),
369
- filter.name,
370
- `${ activeElements[ 0 ].value.value } ${ activeElements[ 0 ].value.unit }`
371
- ),
372
- filterTextWrappers
373
- );
374
- }
375
81
  return sprintf(
376
82
  /* translators: 1: Filter name e.g.: "Unknown status for Author". */
377
83
  __( 'Unknown status for %1$s' ),
@@ -386,7 +92,7 @@ function OperatorSelector( {
386
92
  }: OperatorSelectorProps ) {
387
93
  const operatorOptions = filter.operators?.map( ( operator ) => ( {
388
94
  value: operator,
389
- label: OPERATORS[ operator ]?.label,
95
+ label: getOperatorByName( operator )?.label || operator,
390
96
  } ) );
391
97
  const currentFilter = view.filters?.find(
392
98
  ( _filter ) => _filter.field === filter.field
@@ -409,7 +115,7 @@ function OperatorSelector( {
409
115
  value={ value }
410
116
  options={ operatorOptions }
411
117
  onChange={ ( newValue ) => {
412
- const operator = newValue as Operator;
118
+ const newOperator = newValue as Operator;
413
119
  const currentOperator = currentFilter?.operator;
414
120
  const newFilters = currentFilter
415
121
  ? [
@@ -418,28 +124,29 @@ function OperatorSelector( {
418
124
  if (
419
125
  _filter.field === filter.field
420
126
  ) {
421
- // Reset the value only when switching between operators that have different value types.
422
- const OPERATORS_SHOULD_RESET_VALUE =
423
- [
424
- OPERATOR_BETWEEN,
425
- OPERATOR_IN_THE_PAST,
426
- OPERATOR_OVER,
427
- ];
428
- const shouldResetValue =
429
- currentOperator &&
430
- ( OPERATORS_SHOULD_RESET_VALUE.includes(
127
+ const currentOpSelectionModel =
128
+ getOperatorByName(
431
129
  currentOperator
432
- ) ||
433
- OPERATORS_SHOULD_RESET_VALUE.includes(
434
- operator
435
- ) );
130
+ )?.selection;
131
+ const newOpSelectionModel =
132
+ getOperatorByName(
133
+ newOperator
134
+ )?.selection;
135
+
136
+ const shouldResetValue =
137
+ currentOpSelectionModel !==
138
+ newOpSelectionModel ||
139
+ [
140
+ currentOpSelectionModel,
141
+ newOpSelectionModel,
142
+ ].includes( 'custom' );
436
143
 
437
144
  return {
438
145
  ..._filter,
439
146
  value: shouldResetValue
440
147
  ? undefined
441
148
  : _filter.value,
442
- operator,
149
+ operator: newOperator,
443
150
  };
444
151
  }
445
152
  return _filter;
@@ -450,7 +157,7 @@ function OperatorSelector( {
450
157
  ...( view.filters ?? [] ),
451
158
  {
452
159
  field: filter.field,
453
- operator,
160
+ operator: newOperator,
454
161
  value: undefined,
455
162
  },
456
163
  ];
@@ -521,6 +228,12 @@ export default function Filter( {
521
228
  } catch ( e ) {
522
229
  label = filterInView.value;
523
230
  }
231
+ } else if ( field?.type === 'number' && typeof label === 'number' ) {
232
+ const numberField = field as NormalizedFieldNumber< any >;
233
+ label = formatNumber( label, numberField.format );
234
+ } else if ( field?.type === 'integer' && typeof label === 'number' ) {
235
+ const integerField = field as NormalizedFieldInteger< any >;
236
+ label = formatInteger( label, integerField.format );
524
237
  }
525
238
 
526
239
  activeElements = [
@@ -13,7 +13,12 @@ import { Flex } from '@wordpress/components';
13
13
  /**
14
14
  * Internal dependencies
15
15
  */
16
- import type { View, NormalizedFilter, NormalizedField } from '../../types';
16
+ import type {
17
+ View,
18
+ NormalizedFilter,
19
+ NormalizedField,
20
+ NormalizedRules,
21
+ } from '../../types';
17
22
  import { getCurrentValue } from './utils';
18
23
 
19
24
  interface UserInputWidgetProps {
@@ -58,10 +63,7 @@ export default function InputWidget( {
58
63
  return {
59
64
  ...currentField,
60
65
  // Deactivate validation for filters.
61
- isValid: {
62
- required: false,
63
- custom: () => null,
64
- },
66
+ isValid: {} satisfies NormalizedRules< any >,
65
67
  // Configure getValue/setValue as if Item was a plain object.
66
68
  getValue: ( { item }: { item: any } ) =>
67
69
  item[ currentField.id ],
@@ -6,7 +6,10 @@ import { useMemo } from '@wordpress/element';
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
- import { ALL_OPERATORS, SINGLE_SELECTION_OPERATORS } from '../../constants';
9
+ import {
10
+ isRegisteredOperator,
11
+ isSingleSelectionOperator,
12
+ } from '../../utils/operators';
10
13
  import type { NormalizedFilter, NormalizedField, View } from '../../types';
11
14
 
12
15
  function useFilters( fields: NormalizedField< any >[], view: View ) {
@@ -33,7 +36,7 @@ function useFilters( fields: NormalizedField< any >[], view: View ) {
33
36
  getElements: field.getElements,
34
37
  hasElements: field.hasElements,
35
38
  singleSelection: operators.some( ( op ) =>
36
- SINGLE_SELECTION_OPERATORS.includes( op )
39
+ isSingleSelectionOperator( op )
37
40
  ),
38
41
  operators,
39
42
  isVisible:
@@ -42,7 +45,7 @@ function useFilters( fields: NormalizedField< any >[], view: View ) {
42
45
  !! view.filters?.some(
43
46
  ( f ) =>
44
47
  f.field === field.id &&
45
- ALL_OPERATORS.includes( f.operator )
48
+ isRegisteredOperator( f.operator )
46
49
  ),
47
50
  isPrimary,
48
51
  isLocked,
@@ -7,7 +7,7 @@
7
7
  bottom: 0;
8
8
  left: 0;
9
9
  background-color: inherit;
10
- padding: $grid-unit-15 $grid-unit-60;
10
+ padding: $grid-unit-15 $grid-unit-30;
11
11
  border-top: $border-width solid $gray-100;
12
12
  flex-shrink: 0;
13
13
 
@@ -18,12 +18,6 @@
18
18
  z-index: z-index(".dataviews-footer");
19
19
  }
20
20
 
21
- @container (max-width: 430px) {
22
- .dataviews-footer {
23
- padding: $grid-unit-15 $grid-unit-30;
24
- }
25
- }
26
-
27
21
  @container (max-width: 560px) {
28
22
  .dataviews-footer {
29
23
  flex-direction: column !important;