@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
@@ -161,45 +161,94 @@ Default.argTypes = {
161
161
  },
162
162
  };
163
163
 
164
- export const Empty = () => {
164
+ const PlanetIllustration = () => (
165
+ <svg
166
+ width="120"
167
+ height="120"
168
+ viewBox="0 0 120 120"
169
+ fill="none"
170
+ style={ { opacity: 0.6 } }
171
+ >
172
+ <circle cx="60" cy="60" r="35" fill="#9ca3af" />
173
+ <ellipse
174
+ cx="60"
175
+ cy="60"
176
+ rx="55"
177
+ ry="12"
178
+ stroke="#9ca3af"
179
+ strokeWidth="3"
180
+ fill="none"
181
+ />
182
+ </svg>
183
+ );
184
+
185
+ const CustomEmptyComponent = () => (
186
+ <VStack alignment="center" justify="center" spacing={ 3 }>
187
+ <PlanetIllustration />
188
+ <Text>No celestial bodies found</Text>
189
+ </VStack>
190
+ );
191
+
192
+ const EmptyComponent = ( {
193
+ customEmpty,
194
+ containerHeight,
195
+ isLoading,
196
+ }: {
197
+ customEmpty?: boolean;
198
+ containerHeight?: 'auto' | '50vh' | '100vh';
199
+ isLoading?: boolean;
200
+ } ) => {
165
201
  const [ view, setView ] = useState< View >( {
166
202
  ...DEFAULT_VIEW,
167
203
  fields: [ 'title', 'description', 'categories' ],
168
204
  } );
169
205
 
170
206
  return (
171
- <DataViews
172
- getItemId={ ( item ) => item.id.toString() }
173
- paginationInfo={ { totalItems: 0, totalPages: 0 } }
174
- data={ [] }
175
- view={ view }
176
- fields={ fields }
177
- onChangeView={ setView }
178
- actions={ actions }
179
- defaultLayouts={ defaultLayouts }
180
- />
207
+ <div
208
+ style={ {
209
+ display: 'flex',
210
+ flexDirection: 'column',
211
+ height: containerHeight,
212
+ } }
213
+ >
214
+ <DataViews
215
+ getItemId={ ( item ) => item.id.toString() }
216
+ paginationInfo={ { totalItems: 0, totalPages: 0 } }
217
+ data={ [] }
218
+ view={ view }
219
+ fields={ fields }
220
+ onChangeView={ setView }
221
+ actions={ actions }
222
+ defaultLayouts={ defaultLayouts }
223
+ isLoading={ isLoading }
224
+ empty={ customEmpty ? <CustomEmptyComponent /> : undefined }
225
+ />
226
+ </div>
181
227
  );
182
228
  };
183
229
 
184
- export const CustomEmpty = () => {
185
- const [ view, setView ] = useState< View >( {
186
- ...DEFAULT_VIEW,
187
- fields: [ 'title', 'description', 'categories' ],
188
- } );
189
-
190
- return (
191
- <DataViews
192
- getItemId={ ( item ) => item.id.toString() }
193
- paginationInfo={ { totalItems: 0, totalPages: 0 } }
194
- data={ [] }
195
- view={ view }
196
- fields={ fields }
197
- onChangeView={ setView }
198
- actions={ actions }
199
- defaultLayouts={ defaultLayouts }
200
- empty={ <p>{ view.search ? 'No sites found' : 'No sites' }</p> }
201
- />
202
- );
230
+ export const Empty = {
231
+ render: EmptyComponent,
232
+ args: {
233
+ customEmpty: false,
234
+ containerHeight: '50vh',
235
+ isLoading: false,
236
+ },
237
+ argTypes: {
238
+ customEmpty: {
239
+ control: 'boolean',
240
+ description: 'Use custom empty state with planet illustration',
241
+ },
242
+ containerHeight: {
243
+ control: 'select',
244
+ options: [ 'auto', '50vh', '100vh' ],
245
+ description: 'Height of the container',
246
+ },
247
+ isLoading: {
248
+ control: 'boolean',
249
+ description: 'Show loading state',
250
+ },
251
+ },
203
252
  };
204
253
 
205
254
  const MinimalUIComponent = ( {
@@ -733,14 +733,29 @@ export const IntegerComponent = ( {
733
733
  type,
734
734
  Edit,
735
735
  asyncElements,
736
+ formatSeparatorThousand,
736
737
  }: {
737
738
  type: PanelTypes;
738
739
  Edit: ControlTypes;
739
740
  asyncElements: boolean;
741
+ formatSeparatorThousand?: string;
740
742
  } ) => {
741
743
  const integerFields = useMemo(
742
- () => fields.filter( ( field ) => field.type === 'integer' ),
743
- []
744
+ () =>
745
+ fields
746
+ .filter( ( field ) => field.type === 'integer' )
747
+ .map( ( field ) => {
748
+ if ( formatSeparatorThousand !== undefined ) {
749
+ return {
750
+ ...field,
751
+ format: {
752
+ separatorThousand: formatSeparatorThousand,
753
+ },
754
+ };
755
+ }
756
+ return field;
757
+ } ),
758
+ [ formatSeparatorThousand ]
744
759
  );
745
760
 
746
761
  return (
@@ -753,19 +768,64 @@ export const IntegerComponent = ( {
753
768
  );
754
769
  };
755
770
  IntegerComponent.storyName = 'integer';
771
+ IntegerComponent.args = {
772
+ formatSeparatorThousand: ',',
773
+ };
774
+ IntegerComponent.argTypes = {
775
+ formatSeparatorThousand: {
776
+ control: 'text',
777
+ description:
778
+ 'Character used as thousand separator (e.g., "," for "1,234"). Default is ",".',
779
+ },
780
+ };
756
781
 
757
782
  export const NumberComponent = ( {
758
783
  type,
759
784
  Edit,
760
785
  asyncElements,
786
+ formatSeparatorThousand,
787
+ formatSeparatorDecimal,
788
+ formatDecimals,
761
789
  }: {
762
790
  type: PanelTypes;
763
791
  Edit: ControlTypes;
764
792
  asyncElements: boolean;
793
+ formatSeparatorThousand?: string;
794
+ formatSeparatorDecimal?: string;
795
+ formatDecimals?: number;
765
796
  } ) => {
766
797
  const numberFields = useMemo(
767
- () => fields.filter( ( field ) => field.type === 'number' ),
768
- []
798
+ () =>
799
+ fields
800
+ .filter( ( field ) => field.type === 'number' )
801
+ .map( ( field ) => {
802
+ if (
803
+ formatSeparatorThousand !== undefined ||
804
+ formatSeparatorDecimal !== undefined ||
805
+ formatDecimals !== undefined
806
+ ) {
807
+ const format: {
808
+ separatorThousand?: string;
809
+ separatorDecimal?: string;
810
+ decimals?: number;
811
+ } = {};
812
+ if ( formatSeparatorThousand !== undefined ) {
813
+ format.separatorThousand = formatSeparatorThousand;
814
+ }
815
+ if ( formatSeparatorDecimal !== undefined ) {
816
+ format.separatorDecimal = formatSeparatorDecimal;
817
+ }
818
+ if ( formatDecimals !== undefined ) {
819
+ format.decimals = formatDecimals;
820
+ }
821
+ return {
822
+ ...field,
823
+ format,
824
+ };
825
+ }
826
+ return field;
827
+ } ),
828
+ [ formatSeparatorThousand, formatSeparatorDecimal, formatDecimals ]
769
829
  );
770
830
 
771
831
  return (
@@ -778,6 +838,28 @@ export const NumberComponent = ( {
778
838
  );
779
839
  };
780
840
  NumberComponent.storyName = 'number';
841
+ NumberComponent.args = {
842
+ formatSeparatorThousand: ',',
843
+ formatSeparatorDecimal: '.',
844
+ formatDecimals: 2,
845
+ };
846
+ NumberComponent.argTypes = {
847
+ formatSeparatorThousand: {
848
+ control: 'text',
849
+ description:
850
+ 'Character used as thousand separator (e.g., "," for "1,234"). Default is ",".',
851
+ },
852
+ formatSeparatorDecimal: {
853
+ control: 'text',
854
+ description:
855
+ 'Character used as decimal separator (e.g., "." for "1.23"). Default is ".".',
856
+ },
857
+ formatDecimals: {
858
+ control: { type: 'number', min: 0, max: 100, step: 1 },
859
+ description:
860
+ 'Number of decimal places to display (0-100). Default is 2.',
861
+ },
862
+ };
781
863
 
782
864
  export const BooleanComponent = ( {
783
865
  type,
@@ -307,7 +307,7 @@ describe( 'filters', () => {
307
307
  expect( result[ 7 ].name.title ).toBe( 'Uranus' );
308
308
  } );
309
309
 
310
- it( 'should search using IS NOT ALL filter', () => {
310
+ it( 'should search using IS NOT ALL filter (deprecated operator)', () => {
311
311
  const { data: result } = filterSortAndPaginate(
312
312
  data,
313
313
  {
@@ -321,6 +321,7 @@ describe( 'filters', () => {
321
321
  },
322
322
  fields
323
323
  );
324
+ expect( console ).toHaveWarned();
324
325
  expect( result ).toHaveLength( 10 );
325
326
  expect( result[ 0 ].name.title ).toBe( 'Moon' );
326
327
  expect( result[ 1 ].name.title ).toBe( 'Io' );
@@ -348,13 +348,10 @@ describe( 'normalizeFields: default getValue', () => {
348
348
  },
349
349
  ];
350
350
  const normalizedFields = normalizeFields( fields );
351
- expect( normalizedFields[ 0 ].format ).toBeDefined();
352
- expect( normalizedFields[ 0 ].format.date ).toBeDefined();
353
- expect( typeof normalizedFields[ 0 ].format.date ).toBe( 'string' );
354
- expect( normalizedFields[ 0 ].format.weekStartsOn ).toBeDefined();
355
- expect( typeof normalizedFields[ 0 ].format.weekStartsOn ).toBe(
356
- 'number'
357
- );
351
+ expect( normalizedFields[ 0 ].format ).toEqual( {
352
+ date: expect.any( String ),
353
+ weekStartsOn: expect.any( Number ),
354
+ } );
358
355
  } );
359
356
 
360
357
  it( 'preserves custom format when provided', () => {
@@ -369,8 +366,10 @@ describe( 'normalizeFields: default getValue', () => {
369
366
  },
370
367
  ];
371
368
  const normalizedFields = normalizeFields( fields );
372
- expect( normalizedFields[ 0 ].format.date ).toBe( 'F j, Y' );
373
- expect( normalizedFields[ 0 ].format.weekStartsOn ).toBe( 1 );
369
+ expect( normalizedFields[ 0 ].format ).toEqual( {
370
+ date: 'F j, Y',
371
+ weekStartsOn: 1,
372
+ } );
374
373
  } );
375
374
 
376
375
  it( 'adds empty format for non-date field types', () => {
@@ -379,14 +378,91 @@ describe( 'normalizeFields: default getValue', () => {
379
378
  id: 'title',
380
379
  type: 'text',
381
380
  },
381
+ ];
382
+ const normalizedFields = normalizeFields( fields );
383
+ expect( normalizedFields[ 0 ].format ).toEqual( {} );
384
+ } );
385
+
386
+ it( 'applies default format for number fields', () => {
387
+ const fields: Field< {} >[] = [
388
+ {
389
+ id: 'price',
390
+ type: 'number',
391
+ },
392
+ ];
393
+ const normalizedFields = normalizeFields( fields );
394
+ expect( normalizedFields[ 0 ].format ).toEqual( {
395
+ separatorThousand: ',',
396
+ separatorDecimal: '.',
397
+ decimals: 2,
398
+ } );
399
+ } );
400
+
401
+ it( 'preserves custom format for number fields', () => {
402
+ const fields: Field< {} >[] = [
403
+ {
404
+ id: 'price',
405
+ type: 'number',
406
+ format: {
407
+ separatorThousand: ' ',
408
+ separatorDecimal: ',',
409
+ decimals: 3,
410
+ },
411
+ },
412
+ ];
413
+ const normalizedFields = normalizeFields( fields );
414
+ expect( normalizedFields[ 0 ].format ).toEqual( {
415
+ separatorThousand: ' ',
416
+ separatorDecimal: ',',
417
+ decimals: 3,
418
+ } );
419
+ } );
420
+
421
+ it( 'applies partial custom format for number fields', () => {
422
+ const fields: Field< {} >[] = [
423
+ {
424
+ id: 'price',
425
+ type: 'number',
426
+ format: {
427
+ decimals: 0,
428
+ },
429
+ },
430
+ ];
431
+ const normalizedFields = normalizeFields( fields );
432
+ expect( normalizedFields[ 0 ].format ).toEqual( {
433
+ separatorThousand: ',',
434
+ separatorDecimal: '.',
435
+ decimals: 0,
436
+ } );
437
+ } );
438
+
439
+ it( 'applies default format for integer fields', () => {
440
+ const fields: Field< {} >[] = [
441
+ {
442
+ id: 'count',
443
+ type: 'integer',
444
+ },
445
+ ];
446
+ const normalizedFields = normalizeFields( fields );
447
+ expect( normalizedFields[ 0 ].format ).toEqual( {
448
+ separatorThousand: ',',
449
+ } );
450
+ } );
451
+
452
+ it( 'preserves custom format for integer fields', () => {
453
+ const fields: Field< {} >[] = [
382
454
  {
383
455
  id: 'count',
384
456
  type: 'integer',
457
+ format: {
458
+ separatorThousand: '.',
459
+ },
385
460
  },
386
461
  ];
387
462
  const normalizedFields = normalizeFields( fields );
388
- expect( normalizedFields[ 0 ].format ).toEqual( {} );
389
- expect( normalizedFields[ 1 ].format ).toEqual( {} );
463
+ expect( normalizedFields[ 0 ].format ).toEqual( {
464
+ separatorThousand: '.',
465
+ } );
390
466
  } );
391
467
  } );
392
468
  } );