@wordpress/dataviews 8.0.2-next.836ecdcae.0 → 9.0.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 (322) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/README.md +127 -13
  3. package/build/components/dataviews-filters/input-widget.js +48 -4
  4. package/build/components/dataviews-filters/input-widget.js.map +1 -1
  5. package/build/components/dataviews-layout/index.js +3 -1
  6. package/build/components/dataviews-layout/index.js.map +1 -1
  7. package/build/dataform-controls/array.js +9 -7
  8. package/build/dataform-controls/array.js.map +1 -1
  9. package/build/dataform-controls/checkbox.js +40 -8
  10. package/build/dataform-controls/checkbox.js.map +1 -1
  11. package/build/dataform-controls/color.js +133 -0
  12. package/build/dataform-controls/color.js.map +1 -0
  13. package/build/dataform-controls/date.js +32 -24
  14. package/build/dataform-controls/date.js.map +1 -1
  15. package/build/dataform-controls/datetime.js +133 -19
  16. package/build/dataform-controls/datetime.js.map +1 -1
  17. package/build/dataform-controls/email.js +15 -3
  18. package/build/dataform-controls/email.js.map +1 -1
  19. package/build/dataform-controls/index.js +33 -2
  20. package/build/dataform-controls/index.js.map +1 -1
  21. package/build/dataform-controls/integer.js +47 -34
  22. package/build/dataform-controls/integer.js.map +1 -1
  23. package/build/dataform-controls/password.js +47 -0
  24. package/build/dataform-controls/password.js.map +1 -0
  25. package/build/dataform-controls/radio.js +42 -9
  26. package/build/dataform-controls/radio.js.map +1 -1
  27. package/build/dataform-controls/relative-date-control.js +6 -10
  28. package/build/dataform-controls/relative-date-control.js.map +1 -1
  29. package/build/dataform-controls/select.js +41 -10
  30. package/build/dataform-controls/select.js.map +1 -1
  31. package/build/dataform-controls/telephone.js +15 -3
  32. package/build/dataform-controls/telephone.js.map +1 -1
  33. package/build/dataform-controls/text.js +16 -4
  34. package/build/dataform-controls/text.js.map +1 -1
  35. package/build/dataform-controls/textarea.js +81 -0
  36. package/build/dataform-controls/textarea.js.map +1 -0
  37. package/build/dataform-controls/toggle-group.js +36 -6
  38. package/build/dataform-controls/toggle-group.js.map +1 -1
  39. package/build/dataform-controls/toggle.js +77 -0
  40. package/build/dataform-controls/toggle.js.map +1 -0
  41. package/build/dataform-controls/url.js +40 -0
  42. package/build/dataform-controls/url.js.map +1 -0
  43. package/build/dataform-controls/utils/validated-input.js +83 -0
  44. package/build/dataform-controls/utils/validated-input.js.map +1 -0
  45. package/build/dataforms-layouts/card/index.js +0 -4
  46. package/build/dataforms-layouts/card/index.js.map +1 -1
  47. package/build/dataforms-layouts/data-form-layout.js +16 -4
  48. package/build/dataforms-layouts/data-form-layout.js.map +1 -1
  49. package/build/dataforms-layouts/index.js +31 -1
  50. package/build/dataforms-layouts/index.js.map +1 -1
  51. package/build/dataforms-layouts/panel/dropdown.js +10 -14
  52. package/build/dataforms-layouts/panel/dropdown.js.map +1 -1
  53. package/build/dataforms-layouts/panel/index.js +24 -11
  54. package/build/dataforms-layouts/panel/index.js.map +1 -1
  55. package/build/dataforms-layouts/panel/modal.js +22 -27
  56. package/build/dataforms-layouts/panel/modal.js.map +1 -1
  57. package/build/dataforms-layouts/panel/summary-button.js +67 -0
  58. package/build/dataforms-layouts/panel/summary-button.js.map +1 -0
  59. package/build/dataforms-layouts/regular/index.js +7 -9
  60. package/build/dataforms-layouts/regular/index.js.map +1 -1
  61. package/build/dataforms-layouts/row/index.js +113 -0
  62. package/build/dataforms-layouts/row/index.js.map +1 -0
  63. package/build/dataviews-layouts/grid/index.js +5 -15
  64. package/build/dataviews-layouts/grid/index.js.map +1 -1
  65. package/build/dataviews-layouts/list/index.js +47 -2
  66. package/build/dataviews-layouts/list/index.js.map +1 -1
  67. package/build/dataviews-layouts/picker-grid/index.js +5 -15
  68. package/build/dataviews-layouts/picker-grid/index.js.map +1 -1
  69. package/build/dataviews-layouts/table/index.js +5 -17
  70. package/build/dataviews-layouts/table/index.js.map +1 -1
  71. package/build/dataviews-layouts/utils/get-data-by-group.js +23 -0
  72. package/build/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  73. package/build/field-types/boolean.js +1 -1
  74. package/build/field-types/boolean.js.map +1 -1
  75. package/build/field-types/color.js +113 -0
  76. package/build/field-types/color.js.map +1 -0
  77. package/build/field-types/index.js +12 -0
  78. package/build/field-types/index.js.map +1 -1
  79. package/build/field-types/password.js +51 -0
  80. package/build/field-types/password.js.map +1 -0
  81. package/build/field-types/url.js +57 -0
  82. package/build/field-types/url.js.map +1 -0
  83. package/build/normalize-fields.js +17 -0
  84. package/build/normalize-fields.js.map +1 -1
  85. package/build/normalize-form-fields.js +6 -0
  86. package/build/normalize-form-fields.js.map +1 -1
  87. package/build/types.js.map +1 -1
  88. package/build/validation.js +1 -1
  89. package/build/validation.js.map +1 -1
  90. package/build-module/components/dataviews-filters/input-widget.js +48 -4
  91. package/build-module/components/dataviews-filters/input-widget.js.map +1 -1
  92. package/build-module/components/dataviews-layout/index.js +3 -1
  93. package/build-module/components/dataviews-layout/index.js.map +1 -1
  94. package/build-module/dataform-controls/array.js +9 -7
  95. package/build-module/dataform-controls/array.js.map +1 -1
  96. package/build-module/dataform-controls/checkbox.js +41 -9
  97. package/build-module/dataform-controls/checkbox.js.map +1 -1
  98. package/build-module/dataform-controls/color.js +126 -0
  99. package/build-module/dataform-controls/color.js.map +1 -0
  100. package/build-module/dataform-controls/date.js +32 -24
  101. package/build-module/dataform-controls/date.js.map +1 -1
  102. package/build-module/dataform-controls/datetime.js +135 -21
  103. package/build-module/dataform-controls/datetime.js.map +1 -1
  104. package/build-module/dataform-controls/email.js +14 -2
  105. package/build-module/dataform-controls/email.js.map +1 -1
  106. package/build-module/dataform-controls/index.js +33 -2
  107. package/build-module/dataform-controls/index.js.map +1 -1
  108. package/build-module/dataform-controls/integer.js +46 -34
  109. package/build-module/dataform-controls/integer.js.map +1 -1
  110. package/build-module/dataform-controls/password.js +38 -0
  111. package/build-module/dataform-controls/password.js.map +1 -0
  112. package/build-module/dataform-controls/radio.js +44 -11
  113. package/build-module/dataform-controls/radio.js.map +1 -1
  114. package/build-module/dataform-controls/relative-date-control.js +6 -10
  115. package/build-module/dataform-controls/relative-date-control.js.map +1 -1
  116. package/build-module/dataform-controls/select.js +43 -12
  117. package/build-module/dataform-controls/select.js.map +1 -1
  118. package/build-module/dataform-controls/telephone.js +14 -2
  119. package/build-module/dataform-controls/telephone.js.map +1 -1
  120. package/build-module/dataform-controls/text.js +15 -3
  121. package/build-module/dataform-controls/text.js.map +1 -1
  122. package/build-module/dataform-controls/textarea.js +74 -0
  123. package/build-module/dataform-controls/textarea.js.map +1 -0
  124. package/build-module/dataform-controls/toggle-group.js +38 -8
  125. package/build-module/dataform-controls/toggle-group.js.map +1 -1
  126. package/build-module/dataform-controls/toggle.js +70 -0
  127. package/build-module/dataform-controls/toggle.js.map +1 -0
  128. package/build-module/dataform-controls/url.js +33 -0
  129. package/build-module/dataform-controls/url.js.map +1 -0
  130. package/build-module/dataform-controls/utils/validated-input.js +76 -0
  131. package/build-module/dataform-controls/utils/validated-input.js.map +1 -0
  132. package/build-module/dataforms-layouts/card/index.js +0 -4
  133. package/build-module/dataforms-layouts/card/index.js.map +1 -1
  134. package/build-module/dataforms-layouts/data-form-layout.js +14 -4
  135. package/build-module/dataforms-layouts/data-form-layout.js.map +1 -1
  136. package/build-module/dataforms-layouts/index.js +32 -1
  137. package/build-module/dataforms-layouts/index.js.map +1 -1
  138. package/build-module/dataforms-layouts/panel/dropdown.js +10 -15
  139. package/build-module/dataforms-layouts/panel/dropdown.js.map +1 -1
  140. package/build-module/dataforms-layouts/panel/index.js +24 -11
  141. package/build-module/dataforms-layouts/panel/index.js.map +1 -1
  142. package/build-module/dataforms-layouts/panel/modal.js +22 -28
  143. package/build-module/dataforms-layouts/panel/modal.js.map +1 -1
  144. package/build-module/dataforms-layouts/panel/summary-button.js +60 -0
  145. package/build-module/dataforms-layouts/panel/summary-button.js.map +1 -0
  146. package/build-module/dataforms-layouts/regular/index.js +8 -10
  147. package/build-module/dataforms-layouts/regular/index.js.map +1 -1
  148. package/build-module/dataforms-layouts/row/index.js +106 -0
  149. package/build-module/dataforms-layouts/row/index.js.map +1 -0
  150. package/build-module/dataviews-layouts/grid/index.js +6 -16
  151. package/build-module/dataviews-layouts/grid/index.js.map +1 -1
  152. package/build-module/dataviews-layouts/list/index.js +48 -3
  153. package/build-module/dataviews-layouts/list/index.js.map +1 -1
  154. package/build-module/dataviews-layouts/picker-grid/index.js +6 -16
  155. package/build-module/dataviews-layouts/picker-grid/index.js.map +1 -1
  156. package/build-module/dataviews-layouts/table/index.js +5 -17
  157. package/build-module/dataviews-layouts/table/index.js.map +1 -1
  158. package/build-module/dataviews-layouts/utils/get-data-by-group.js +17 -0
  159. package/build-module/dataviews-layouts/utils/get-data-by-group.js.map +1 -0
  160. package/build-module/field-types/boolean.js +1 -1
  161. package/build-module/field-types/boolean.js.map +1 -1
  162. package/build-module/field-types/color.js +107 -0
  163. package/build-module/field-types/color.js.map +1 -0
  164. package/build-module/field-types/index.js +12 -0
  165. package/build-module/field-types/index.js.map +1 -1
  166. package/build-module/field-types/password.js +46 -0
  167. package/build-module/field-types/password.js.map +1 -0
  168. package/build-module/field-types/url.js +51 -0
  169. package/build-module/field-types/url.js.map +1 -0
  170. package/build-module/normalize-fields.js +15 -0
  171. package/build-module/normalize-fields.js.map +1 -1
  172. package/build-module/normalize-form-fields.js +6 -0
  173. package/build-module/normalize-form-fields.js.map +1 -1
  174. package/build-module/types.js.map +1 -1
  175. package/build-module/validation.js +1 -1
  176. package/build-module/validation.js.map +1 -1
  177. package/build-style/style-rtl.css +13 -6
  178. package/build-style/style.css +13 -6
  179. package/build-types/components/dataform/stories/index.story.d.ts +21 -17
  180. package/build-types/components/dataform/stories/index.story.d.ts.map +1 -1
  181. package/build-types/components/dataviews/stories/fixtures.d.ts +4 -2
  182. package/build-types/components/dataviews/stories/fixtures.d.ts.map +1 -1
  183. package/build-types/components/dataviews-filters/input-widget.d.ts.map +1 -1
  184. package/build-types/dataform-controls/array.d.ts.map +1 -1
  185. package/build-types/dataform-controls/checkbox.d.ts.map +1 -1
  186. package/build-types/dataform-controls/color.d.ts +6 -0
  187. package/build-types/dataform-controls/color.d.ts.map +1 -0
  188. package/build-types/dataform-controls/date.d.ts.map +1 -1
  189. package/build-types/dataform-controls/datetime.d.ts.map +1 -1
  190. package/build-types/dataform-controls/email.d.ts.map +1 -1
  191. package/build-types/dataform-controls/index.d.ts +1 -1
  192. package/build-types/dataform-controls/index.d.ts.map +1 -1
  193. package/build-types/dataform-controls/integer.d.ts.map +1 -1
  194. package/build-types/dataform-controls/password.d.ts +3 -0
  195. package/build-types/dataform-controls/password.d.ts.map +1 -0
  196. package/build-types/dataform-controls/radio.d.ts.map +1 -1
  197. package/build-types/dataform-controls/relative-date-control.d.ts +6 -5
  198. package/build-types/dataform-controls/relative-date-control.d.ts.map +1 -1
  199. package/build-types/dataform-controls/select.d.ts.map +1 -1
  200. package/build-types/dataform-controls/telephone.d.ts.map +1 -1
  201. package/build-types/dataform-controls/text.d.ts +1 -1
  202. package/build-types/dataform-controls/text.d.ts.map +1 -1
  203. package/build-types/dataform-controls/textarea.d.ts +6 -0
  204. package/build-types/dataform-controls/textarea.d.ts.map +1 -0
  205. package/build-types/dataform-controls/toggle-group.d.ts.map +1 -1
  206. package/build-types/dataform-controls/toggle.d.ts +6 -0
  207. package/build-types/dataform-controls/toggle.d.ts.map +1 -0
  208. package/build-types/dataform-controls/url.d.ts +6 -0
  209. package/build-types/dataform-controls/url.d.ts.map +1 -0
  210. package/build-types/dataform-controls/utils/validated-input.d.ts +20 -0
  211. package/build-types/dataform-controls/utils/validated-input.d.ts.map +1 -0
  212. package/build-types/dataforms-layouts/card/index.d.ts +0 -3
  213. package/build-types/dataforms-layouts/card/index.d.ts.map +1 -1
  214. package/build-types/dataforms-layouts/data-form-layout.d.ts +4 -1
  215. package/build-types/dataforms-layouts/data-form-layout.d.ts.map +1 -1
  216. package/build-types/dataforms-layouts/index.d.ts +10 -0
  217. package/build-types/dataforms-layouts/index.d.ts.map +1 -1
  218. package/build-types/dataforms-layouts/panel/dropdown.d.ts +2 -1
  219. package/build-types/dataforms-layouts/panel/dropdown.d.ts.map +1 -1
  220. package/build-types/dataforms-layouts/panel/index.d.ts.map +1 -1
  221. package/build-types/dataforms-layouts/panel/modal.d.ts +2 -1
  222. package/build-types/dataforms-layouts/panel/modal.d.ts.map +1 -1
  223. package/build-types/dataforms-layouts/panel/summary-button.d.ts +15 -0
  224. package/build-types/dataforms-layouts/panel/summary-button.d.ts.map +1 -0
  225. package/build-types/dataforms-layouts/regular/index.d.ts.map +1 -1
  226. package/build-types/dataforms-layouts/row/index.d.ts +6 -0
  227. package/build-types/dataforms-layouts/row/index.d.ts.map +1 -0
  228. package/build-types/dataviews-layouts/grid/index.d.ts.map +1 -1
  229. package/build-types/dataviews-layouts/list/index.d.ts.map +1 -1
  230. package/build-types/dataviews-layouts/picker-grid/index.d.ts.map +1 -1
  231. package/build-types/dataviews-layouts/table/index.d.ts.map +1 -1
  232. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts +6 -0
  233. package/build-types/dataviews-layouts/utils/get-data-by-group.d.ts.map +1 -0
  234. package/build-types/field-types/color.d.ts +20 -0
  235. package/build-types/field-types/color.d.ts.map +1 -0
  236. package/build-types/field-types/index.d.ts.map +1 -1
  237. package/build-types/field-types/password.d.ts +17 -0
  238. package/build-types/field-types/password.d.ts.map +1 -0
  239. package/build-types/field-types/stories/index.story.d.ts +13 -1
  240. package/build-types/field-types/stories/index.story.d.ts.map +1 -1
  241. package/build-types/field-types/url.d.ts +20 -0
  242. package/build-types/field-types/url.d.ts.map +1 -0
  243. package/build-types/normalize-fields.d.ts +3 -0
  244. package/build-types/normalize-fields.d.ts.map +1 -1
  245. package/build-types/normalize-form-fields.d.ts.map +1 -1
  246. package/build-types/types.d.ts +78 -7
  247. package/build-types/types.d.ts.map +1 -1
  248. package/build-types/validation.d.ts.map +1 -1
  249. package/build-wp/index.js +2577 -1708
  250. package/package.json +17 -15
  251. package/src/components/dataform/stories/index.story.tsx +794 -27
  252. package/src/components/dataviews/stories/fixtures.tsx +99 -41
  253. package/src/components/dataviews/stories/index.story.tsx +2 -2
  254. package/src/components/dataviews-filters/input-widget.tsx +44 -5
  255. package/src/components/dataviews-layout/index.tsx +1 -1
  256. package/src/components/dataviews-picker/stories/index.story.tsx +1 -1
  257. package/src/dataform-controls/array.tsx +4 -6
  258. package/src/dataform-controls/checkbox.tsx +54 -7
  259. package/src/dataform-controls/color.tsx +148 -0
  260. package/src/dataform-controls/date.tsx +47 -21
  261. package/src/dataform-controls/datetime.tsx +171 -23
  262. package/src/dataform-controls/email.tsx +22 -2
  263. package/src/dataform-controls/index.tsx +36 -2
  264. package/src/dataform-controls/integer.tsx +82 -49
  265. package/src/dataform-controls/password.tsx +50 -0
  266. package/src/dataform-controls/radio.tsx +53 -11
  267. package/src/dataform-controls/relative-date-control.tsx +11 -10
  268. package/src/dataform-controls/select.tsx +53 -10
  269. package/src/dataform-controls/telephone.tsx +22 -2
  270. package/src/dataform-controls/text.tsx +19 -2
  271. package/src/dataform-controls/textarea.tsx +85 -0
  272. package/src/dataform-controls/toggle-group.tsx +50 -10
  273. package/src/dataform-controls/toggle.tsx +79 -0
  274. package/src/dataform-controls/url.tsx +38 -0
  275. package/src/dataform-controls/utils/validated-input.tsx +109 -0
  276. package/src/dataforms-layouts/card/index.tsx +0 -4
  277. package/src/dataforms-layouts/data-form-layout.tsx +15 -3
  278. package/src/dataforms-layouts/index.tsx +35 -0
  279. package/src/dataforms-layouts/panel/dropdown.tsx +12 -23
  280. package/src/dataforms-layouts/panel/index.tsx +39 -16
  281. package/src/dataforms-layouts/panel/modal.tsx +24 -30
  282. package/src/dataforms-layouts/panel/summary-button.tsx +92 -0
  283. package/src/dataforms-layouts/regular/index.tsx +9 -7
  284. package/src/dataforms-layouts/regular/style.scss +0 -6
  285. package/src/dataforms-layouts/row/index.tsx +115 -0
  286. package/src/dataforms-layouts/row/style.scss +3 -0
  287. package/src/dataviews-layouts/grid/index.tsx +9 -14
  288. package/src/dataviews-layouts/grid/style.scss +1 -0
  289. package/src/dataviews-layouts/list/index.tsx +74 -2
  290. package/src/dataviews-layouts/list/style.scss +8 -0
  291. package/src/dataviews-layouts/picker-grid/index.tsx +9 -13
  292. package/src/dataviews-layouts/table/index.tsx +10 -14
  293. package/src/dataviews-layouts/utils/get-data-by-group.ts +18 -0
  294. package/src/field-types/boolean.tsx +1 -1
  295. package/src/field-types/color.tsx +115 -0
  296. package/src/field-types/index.tsx +15 -0
  297. package/src/field-types/password.tsx +46 -0
  298. package/src/field-types/stories/index.story.tsx +234 -3
  299. package/src/field-types/url.tsx +71 -0
  300. package/src/normalize-fields.ts +18 -0
  301. package/src/normalize-form-fields.ts +6 -0
  302. package/src/style.scss +1 -0
  303. package/src/test/dataform.tsx +2 -2
  304. package/src/test/filter-and-sort-data-view.js +148 -138
  305. package/src/test/normalize-fields.ts +114 -0
  306. package/src/types.ts +89 -6
  307. package/src/validation.ts +5 -0
  308. package/tsconfig.tsbuildinfo +1 -1
  309. package/build/dataform-controls/boolean.js +0 -64
  310. package/build/dataform-controls/boolean.js.map +0 -1
  311. package/build/dataform-controls/utils/validated-text.js +0 -68
  312. package/build/dataform-controls/utils/validated-text.js.map +0 -1
  313. package/build-module/dataform-controls/boolean.js +0 -58
  314. package/build-module/dataform-controls/boolean.js.map +0 -1
  315. package/build-module/dataform-controls/utils/validated-text.js +0 -62
  316. package/build-module/dataform-controls/utils/validated-text.js.map +0 -1
  317. package/build-types/dataform-controls/boolean.d.ts +0 -6
  318. package/build-types/dataform-controls/boolean.d.ts.map +0 -1
  319. package/build-types/dataform-controls/utils/validated-text.d.ts +0 -12
  320. package/build-types/dataform-controls/utils/validated-text.d.ts.map +0 -1
  321. package/src/dataform-controls/boolean.tsx +0 -61
  322. package/src/dataform-controls/utils/validated-text.tsx +0 -79
@@ -43,7 +43,7 @@ describe( 'filters', () => {
43
43
  );
44
44
  expect( result ).toHaveLength( 4 );
45
45
  expect(
46
- result.find( ( item ) => item.title === 'Neptune' )
46
+ result.find( ( item ) => item.name.title === 'Neptune' )
47
47
  ).toBeDefined();
48
48
  } );
49
49
 
@@ -57,8 +57,8 @@ describe( 'filters', () => {
57
57
  fields
58
58
  );
59
59
  expect( result ).toHaveLength( 2 );
60
- expect( result[ 0 ].description ).toBe(
61
- 'The Moon is Earths only natural satellite, orbiting at an average distance of 384,400 kilometers with a synchronous rotation that leads to fixed lunar phases as seen from Earth. Its cratered surface and subtle glow define night skies, inspiring exploration missions and influencing tides and biological rhythms worldwide.'
60
+ expect( result[ 0 ].name.description ).toBe(
61
+ "The Moon is Earth's only natural satellite, orbiting at an average distance of 384,400 kilometers with a synchronous rotation that leads to fixed lunar phases as seen from Earth. Its cratered surface and subtle glow define night skies, inspiring exploration missions and influencing tides and biological rhythms worldwide."
62
62
  );
63
63
  } );
64
64
 
@@ -72,7 +72,7 @@ describe( 'filters', () => {
72
72
  fields
73
73
  );
74
74
  expect( result ).toHaveLength( 1 );
75
- expect( result[ 0 ].description ).toBe( 'La planète Vénus' );
75
+ expect( result[ 0 ].name.description ).toBe( 'La planète Vénus' );
76
76
  } );
77
77
 
78
78
  it( 'should search over array fields when enableGlobalSearch is true', () => {
@@ -93,9 +93,13 @@ describe( 'filters', () => {
93
93
 
94
94
  // Should find items with "Moon" in categories
95
95
  expect( result ).toHaveLength( 10 );
96
- expect( result.map( ( r ) => r.title ).sort() ).toContain( 'Europa' );
97
- expect( result.map( ( r ) => r.title ).sort() ).toContain( 'Io' );
98
- expect( result.map( ( r ) => r.title ).sort() ).toContain( 'Moon' );
96
+ expect( result.map( ( r ) => r.name.title ).sort() ).toContain(
97
+ 'Europa'
98
+ );
99
+ expect( result.map( ( r ) => r.name.title ).sort() ).toContain( 'Io' );
100
+ expect( result.map( ( r ) => r.name.title ).sort() ).toContain(
101
+ 'Moon'
102
+ );
99
103
  } );
100
104
 
101
105
  it( 'should search over array fields case-insensitively', () => {
@@ -116,9 +120,9 @@ describe( 'filters', () => {
116
120
 
117
121
  // Should find items with "Planet" in categories (case-insensitive)
118
122
  expect( result ).toHaveLength( 8 );
119
- expect( result.map( ( r ) => r.title ) ).toContain( 'Neptune' );
120
- expect( result.map( ( r ) => r.title ) ).toContain( 'Mercury' );
121
- expect( result.map( ( r ) => r.title ) ).toContain( 'Earth' );
123
+ expect( result.map( ( r ) => r.name.title ) ).toContain( 'Neptune' );
124
+ expect( result.map( ( r ) => r.name.title ) ).toContain( 'Mercury' );
125
+ expect( result.map( ( r ) => r.name.title ) ).toContain( 'Earth' );
122
126
  } );
123
127
 
124
128
  it( 'should search using IS filter', () => {
@@ -136,8 +140,8 @@ describe( 'filters', () => {
136
140
  fields
137
141
  );
138
142
  expect( result ).toHaveLength( 2 );
139
- expect( result[ 0 ].title ).toBe( 'Neptune' );
140
- expect( result[ 1 ].title ).toBe( 'Uranus' );
143
+ expect( result[ 0 ].name.title ).toBe( 'Neptune' );
144
+ expect( result[ 1 ].name.title ).toBe( 'Uranus' );
141
145
  } );
142
146
 
143
147
  it( 'should search using IS NOT filter', () => {
@@ -155,22 +159,22 @@ describe( 'filters', () => {
155
159
  fields
156
160
  );
157
161
  expect( result ).toHaveLength( 16 );
158
- expect( result[ 0 ].title ).toBe( 'Moon' );
159
- expect( result[ 1 ].title ).toBe( 'Io' );
160
- expect( result[ 2 ].title ).toBe( 'Europa' );
161
- expect( result[ 3 ].title ).toBe( 'Ganymede' );
162
- expect( result[ 4 ].title ).toBe( 'Callisto' );
163
- expect( result[ 5 ].title ).toBe( 'Amalthea' );
164
- expect( result[ 6 ].title ).toBe( 'Himalia' );
165
- expect( result[ 7 ].title ).toBe( 'Triton' );
166
- expect( result[ 8 ].title ).toBe( 'Nereid' );
167
- expect( result[ 9 ].title ).toBe( 'Proteus' );
168
- expect( result[ 10 ].title ).toBe( 'Mercury' );
169
- expect( result[ 11 ].title ).toBe( 'Venus' );
170
- expect( result[ 12 ].title ).toBe( 'Earth' );
171
- expect( result[ 13 ].title ).toBe( 'Mars' );
172
- expect( result[ 14 ].title ).toBe( 'Jupiter' );
173
- expect( result[ 15 ].title ).toBe( 'Saturn' );
162
+ expect( result[ 0 ].name.title ).toBe( 'Moon' );
163
+ expect( result[ 1 ].name.title ).toBe( 'Io' );
164
+ expect( result[ 2 ].name.title ).toBe( 'Europa' );
165
+ expect( result[ 3 ].name.title ).toBe( 'Ganymede' );
166
+ expect( result[ 4 ].name.title ).toBe( 'Callisto' );
167
+ expect( result[ 5 ].name.title ).toBe( 'Amalthea' );
168
+ expect( result[ 6 ].name.title ).toBe( 'Himalia' );
169
+ expect( result[ 7 ].name.title ).toBe( 'Triton' );
170
+ expect( result[ 8 ].name.title ).toBe( 'Nereid' );
171
+ expect( result[ 9 ].name.title ).toBe( 'Proteus' );
172
+ expect( result[ 10 ].name.title ).toBe( 'Mercury' );
173
+ expect( result[ 11 ].name.title ).toBe( 'Venus' );
174
+ expect( result[ 12 ].name.title ).toBe( 'Earth' );
175
+ expect( result[ 13 ].name.title ).toBe( 'Mars' );
176
+ expect( result[ 14 ].name.title ).toBe( 'Jupiter' );
177
+ expect( result[ 15 ].name.title ).toBe( 'Saturn' );
174
178
  } );
175
179
 
176
180
  it( 'should search using IS ANY filter for STRING values', () => {
@@ -188,8 +192,8 @@ describe( 'filters', () => {
188
192
  fields
189
193
  );
190
194
  expect( result ).toHaveLength( 2 );
191
- expect( result[ 0 ].title ).toBe( 'Neptune' );
192
- expect( result[ 1 ].title ).toBe( 'Uranus' );
195
+ expect( result[ 0 ].name.title ).toBe( 'Neptune' );
196
+ expect( result[ 1 ].name.title ).toBe( 'Uranus' );
193
197
  } );
194
198
 
195
199
  it( 'should search using IS NONE filter for STRING values', () => {
@@ -207,16 +211,16 @@ describe( 'filters', () => {
207
211
  fields
208
212
  );
209
213
  expect( result ).toHaveLength( 10 );
210
- expect( result[ 0 ].title ).toBe( 'Moon' );
211
- expect( result[ 1 ].title ).toBe( 'Io' );
212
- expect( result[ 2 ].title ).toBe( 'Europa' );
213
- expect( result[ 3 ].title ).toBe( 'Ganymede' );
214
- expect( result[ 4 ].title ).toBe( 'Callisto' );
215
- expect( result[ 5 ].title ).toBe( 'Amalthea' );
216
- expect( result[ 6 ].title ).toBe( 'Himalia' );
217
- expect( result[ 7 ].title ).toBe( 'Triton' );
218
- expect( result[ 8 ].title ).toBe( 'Nereid' );
219
- expect( result[ 9 ].title ).toBe( 'Proteus' );
214
+ expect( result[ 0 ].name.title ).toBe( 'Moon' );
215
+ expect( result[ 1 ].name.title ).toBe( 'Io' );
216
+ expect( result[ 2 ].name.title ).toBe( 'Europa' );
217
+ expect( result[ 3 ].name.title ).toBe( 'Ganymede' );
218
+ expect( result[ 4 ].name.title ).toBe( 'Callisto' );
219
+ expect( result[ 5 ].name.title ).toBe( 'Amalthea' );
220
+ expect( result[ 6 ].name.title ).toBe( 'Himalia' );
221
+ expect( result[ 7 ].name.title ).toBe( 'Triton' );
222
+ expect( result[ 8 ].name.title ).toBe( 'Nereid' );
223
+ expect( result[ 9 ].name.title ).toBe( 'Proteus' );
220
224
  } );
221
225
 
222
226
  it( 'should search using IS ANY filter for ARRAY values', () => {
@@ -234,8 +238,8 @@ describe( 'filters', () => {
234
238
  fields
235
239
  );
236
240
  expect( result ).toHaveLength( 2 );
237
- expect( result[ 0 ].title ).toBe( 'Moon' );
238
- expect( result[ 1 ].title ).toBe( 'Earth' );
241
+ expect( result[ 0 ].name.title ).toBe( 'Moon' );
242
+ expect( result[ 1 ].name.title ).toBe( 'Earth' );
239
243
  } );
240
244
 
241
245
  it( 'should search using IS NONE filter for ARRAY values', () => {
@@ -253,20 +257,20 @@ describe( 'filters', () => {
253
257
  fields
254
258
  );
255
259
  expect( result ).toHaveLength( 14 );
256
- expect( result[ 0 ].title ).toBe( 'Moon' );
257
- expect( result[ 1 ].title ).toBe( 'Io' );
258
- expect( result[ 2 ].title ).toBe( 'Europa' );
259
- expect( result[ 3 ].title ).toBe( 'Ganymede' );
260
- expect( result[ 4 ].title ).toBe( 'Callisto' );
261
- expect( result[ 5 ].title ).toBe( 'Amalthea' );
262
- expect( result[ 6 ].title ).toBe( 'Himalia' );
263
- expect( result[ 7 ].title ).toBe( 'Neptune' );
264
- expect( result[ 8 ].title ).toBe( 'Triton' );
265
- expect( result[ 9 ].title ).toBe( 'Nereid' );
266
- expect( result[ 10 ].title ).toBe( 'Proteus' );
267
- expect( result[ 11 ].title ).toBe( 'Jupiter' );
268
- expect( result[ 12 ].title ).toBe( 'Saturn' );
269
- expect( result[ 13 ].title ).toBe( 'Uranus' );
260
+ expect( result[ 0 ].name.title ).toBe( 'Moon' );
261
+ expect( result[ 1 ].name.title ).toBe( 'Io' );
262
+ expect( result[ 2 ].name.title ).toBe( 'Europa' );
263
+ expect( result[ 3 ].name.title ).toBe( 'Ganymede' );
264
+ expect( result[ 4 ].name.title ).toBe( 'Callisto' );
265
+ expect( result[ 5 ].name.title ).toBe( 'Amalthea' );
266
+ expect( result[ 6 ].name.title ).toBe( 'Himalia' );
267
+ expect( result[ 7 ].name.title ).toBe( 'Neptune' );
268
+ expect( result[ 8 ].name.title ).toBe( 'Triton' );
269
+ expect( result[ 9 ].name.title ).toBe( 'Nereid' );
270
+ expect( result[ 10 ].name.title ).toBe( 'Proteus' );
271
+ expect( result[ 11 ].name.title ).toBe( 'Jupiter' );
272
+ expect( result[ 12 ].name.title ).toBe( 'Saturn' );
273
+ expect( result[ 13 ].name.title ).toBe( 'Uranus' );
270
274
  } );
271
275
 
272
276
  it( 'should search using IS ALL filter', () => {
@@ -284,14 +288,14 @@ describe( 'filters', () => {
284
288
  fields
285
289
  );
286
290
  expect( result ).toHaveLength( 8 );
287
- expect( result[ 0 ].title ).toBe( 'Neptune' );
288
- expect( result[ 1 ].title ).toBe( 'Mercury' );
289
- expect( result[ 2 ].title ).toBe( 'Venus' );
290
- expect( result[ 3 ].title ).toBe( 'Earth' );
291
- expect( result[ 4 ].title ).toBe( 'Mars' );
292
- expect( result[ 5 ].title ).toBe( 'Jupiter' );
293
- expect( result[ 6 ].title ).toBe( 'Saturn' );
294
- expect( result[ 7 ].title ).toBe( 'Uranus' );
291
+ expect( result[ 0 ].name.title ).toBe( 'Neptune' );
292
+ expect( result[ 1 ].name.title ).toBe( 'Mercury' );
293
+ expect( result[ 2 ].name.title ).toBe( 'Venus' );
294
+ expect( result[ 3 ].name.title ).toBe( 'Earth' );
295
+ expect( result[ 4 ].name.title ).toBe( 'Mars' );
296
+ expect( result[ 5 ].name.title ).toBe( 'Jupiter' );
297
+ expect( result[ 6 ].name.title ).toBe( 'Saturn' );
298
+ expect( result[ 7 ].name.title ).toBe( 'Uranus' );
295
299
  } );
296
300
 
297
301
  it( 'should search using IS NOT ALL filter', () => {
@@ -309,16 +313,16 @@ describe( 'filters', () => {
309
313
  fields
310
314
  );
311
315
  expect( result ).toHaveLength( 10 );
312
- expect( result[ 0 ].title ).toBe( 'Moon' );
313
- expect( result[ 1 ].title ).toBe( 'Io' );
314
- expect( result[ 2 ].title ).toBe( 'Europa' );
315
- expect( result[ 3 ].title ).toBe( 'Ganymede' );
316
- expect( result[ 4 ].title ).toBe( 'Callisto' );
317
- expect( result[ 5 ].title ).toBe( 'Amalthea' );
318
- expect( result[ 6 ].title ).toBe( 'Himalia' );
319
- expect( result[ 7 ].title ).toBe( 'Triton' );
320
- expect( result[ 8 ].title ).toBe( 'Nereid' );
321
- expect( result[ 9 ].title ).toBe( 'Proteus' );
316
+ expect( result[ 0 ].name.title ).toBe( 'Moon' );
317
+ expect( result[ 1 ].name.title ).toBe( 'Io' );
318
+ expect( result[ 2 ].name.title ).toBe( 'Europa' );
319
+ expect( result[ 3 ].name.title ).toBe( 'Ganymede' );
320
+ expect( result[ 4 ].name.title ).toBe( 'Callisto' );
321
+ expect( result[ 5 ].name.title ).toBe( 'Amalthea' );
322
+ expect( result[ 6 ].name.title ).toBe( 'Himalia' );
323
+ expect( result[ 7 ].name.title ).toBe( 'Triton' );
324
+ expect( result[ 8 ].name.title ).toBe( 'Nereid' );
325
+ expect( result[ 9 ].name.title ).toBe( 'Proteus' );
322
326
  } );
323
327
 
324
328
  it( 'should search using IS filter and return all values if filter.value is undefined', () => {
@@ -336,24 +340,24 @@ describe( 'filters', () => {
336
340
  fields
337
341
  );
338
342
  expect( result ).toHaveLength( 18 );
339
- expect( result[ 0 ].title ).toBe( 'Moon' );
340
- expect( result[ 1 ].title ).toBe( 'Io' );
341
- expect( result[ 2 ].title ).toBe( 'Europa' );
342
- expect( result[ 3 ].title ).toBe( 'Ganymede' );
343
- expect( result[ 4 ].title ).toBe( 'Callisto' );
344
- expect( result[ 5 ].title ).toBe( 'Amalthea' );
345
- expect( result[ 6 ].title ).toBe( 'Himalia' );
346
- expect( result[ 7 ].title ).toBe( 'Neptune' );
347
- expect( result[ 8 ].title ).toBe( 'Triton' );
348
- expect( result[ 9 ].title ).toBe( 'Nereid' );
349
- expect( result[ 10 ].title ).toBe( 'Proteus' );
350
- expect( result[ 11 ].title ).toBe( 'Mercury' );
351
- expect( result[ 12 ].title ).toBe( 'Venus' );
352
- expect( result[ 13 ].title ).toBe( 'Earth' );
353
- expect( result[ 14 ].title ).toBe( 'Mars' );
354
- expect( result[ 15 ].title ).toBe( 'Jupiter' );
355
- expect( result[ 16 ].title ).toBe( 'Saturn' );
356
- expect( result[ 17 ].title ).toBe( 'Uranus' );
343
+ expect( result[ 0 ].name.title ).toBe( 'Moon' );
344
+ expect( result[ 1 ].name.title ).toBe( 'Io' );
345
+ expect( result[ 2 ].name.title ).toBe( 'Europa' );
346
+ expect( result[ 3 ].name.title ).toBe( 'Ganymede' );
347
+ expect( result[ 4 ].name.title ).toBe( 'Callisto' );
348
+ expect( result[ 5 ].name.title ).toBe( 'Amalthea' );
349
+ expect( result[ 6 ].name.title ).toBe( 'Himalia' );
350
+ expect( result[ 7 ].name.title ).toBe( 'Neptune' );
351
+ expect( result[ 8 ].name.title ).toBe( 'Triton' );
352
+ expect( result[ 9 ].name.title ).toBe( 'Nereid' );
353
+ expect( result[ 10 ].name.title ).toBe( 'Proteus' );
354
+ expect( result[ 11 ].name.title ).toBe( 'Mercury' );
355
+ expect( result[ 12 ].name.title ).toBe( 'Venus' );
356
+ expect( result[ 13 ].name.title ).toBe( 'Earth' );
357
+ expect( result[ 14 ].name.title ).toBe( 'Mars' );
358
+ expect( result[ 15 ].name.title ).toBe( 'Jupiter' );
359
+ expect( result[ 16 ].name.title ).toBe( 'Saturn' );
360
+ expect( result[ 17 ].name.title ).toBe( 'Uranus' );
357
361
  } );
358
362
 
359
363
  it( 'should filter using LESS THAN operator for integer', () => {
@@ -441,7 +445,7 @@ describe( 'filters', () => {
441
445
  fields
442
446
  );
443
447
  expect( result ).toHaveLength( 1 );
444
- expect( result[ 0 ].title ).toBe( 'Neptune' );
448
+ expect( result[ 0 ].name.title ).toBe( 'Neptune' );
445
449
  } );
446
450
 
447
451
  it( 'should filter using NOT_CONTAINS operator for text fields', () => {
@@ -461,9 +465,11 @@ describe( 'filters', () => {
461
465
  // Should return items that don't contain "Solar system" in description
462
466
  expect( result ).toHaveLength( 11 );
463
467
  expect(
464
- result.filter( ( r ) => r.description.includes( 'Solar system' ) )
468
+ result.filter( ( r ) =>
469
+ r.name.description.includes( 'Solar system' )
470
+ )
465
471
  ).toHaveLength( 0 );
466
- expect( result.map( ( r ) => r.title ).sort() ).toEqual( [
472
+ expect( result.map( ( r ) => r.name.title ).sort() ).toEqual( [
467
473
  'Amalthea',
468
474
  'Callisto',
469
475
  'Europa',
@@ -492,7 +498,7 @@ describe( 'filters', () => {
492
498
  },
493
499
  fields
494
500
  );
495
- expect( result.map( ( r ) => r.title ) ).toContain( 'Mars' );
501
+ expect( result.map( ( r ) => r.name.title ) ).toContain( 'Mars' );
496
502
  } );
497
503
 
498
504
  it( 'should filter using BEFORE operator for datetime', () => {
@@ -594,7 +600,7 @@ describe( 'filters', () => {
594
600
  fields
595
601
  );
596
602
  expect( result.length ).toBe( 2 );
597
- expect( result[ 0 ].title ).toBe( 'Neptune' );
603
+ expect( result[ 0 ].name.title ).toBe( 'Neptune' );
598
604
  } );
599
605
 
600
606
  it( 'should filter using ON operator for datetime with different date formats', () => {
@@ -643,7 +649,9 @@ describe( 'filters', () => {
643
649
  fields
644
650
  );
645
651
  expect( result.length ).toBe( 16 );
646
- expect( result.map( ( r ) => r.title ) ).not.toContain( 'Neptune' );
652
+ expect( result.map( ( r ) => r.name.title ) ).not.toContain(
653
+ 'Neptune'
654
+ );
647
655
  } );
648
656
 
649
657
  it( 'should filter using NOT_ON operator for datetime with different date formats', () => {
@@ -691,7 +699,7 @@ describe( 'filters', () => {
691
699
  },
692
700
  fields
693
701
  );
694
- expect( result.map( ( r ) => r.title ).sort() ).toEqual( [
702
+ expect( result.map( ( r ) => r.name.title ).sort() ).toEqual( [
695
703
  'Neptune',
696
704
  'Uranus',
697
705
  ] );
@@ -711,7 +719,7 @@ describe( 'filters', () => {
711
719
  },
712
720
  fields
713
721
  );
714
- expect( result.map( ( r ) => r.title ) ).toEqual( [ 'Uranus' ] );
722
+ expect( result.map( ( r ) => r.name.title ) ).toEqual( [ 'Uranus' ] );
715
723
  } );
716
724
 
717
725
  it( 'should filter dates inclusively between min and max using BETWEEN operator', () => {
@@ -858,40 +866,40 @@ describe( 'sorting', () => {
858
866
  expect( result ).toHaveLength( 18 );
859
867
 
860
868
  expect( result[ 0 ].type ).toBe( 'Gas giant' );
861
- expect( result[ 0 ].title ).toBe( 'Saturn' );
869
+ expect( result[ 0 ].name.title ).toBe( 'Saturn' );
862
870
  expect( result[ 1 ].type ).toBe( 'Gas giant' );
863
- expect( result[ 1 ].title ).toBe( 'Jupiter' );
871
+ expect( result[ 1 ].name.title ).toBe( 'Jupiter' );
864
872
 
865
873
  expect( result[ 2 ].type ).toBe( 'Ice giant' );
866
- expect( result[ 2 ].title ).toBe( 'Uranus' );
874
+ expect( result[ 2 ].name.title ).toBe( 'Uranus' );
867
875
  expect( result[ 3 ].type ).toBe( 'Ice giant' );
868
- expect( result[ 3 ].title ).toBe( 'Neptune' );
876
+ expect( result[ 3 ].name.title ).toBe( 'Neptune' );
869
877
 
870
878
  // All satellites should be grouped together
871
879
  const satelliteItems = result.filter(
872
880
  ( item ) => item.type === 'Satellite'
873
881
  );
874
882
  expect( satelliteItems ).toHaveLength( 10 );
875
- expect( satelliteItems[ 0 ].title ).toBe( 'Triton' );
876
- expect( satelliteItems[ 1 ].title ).toBe( 'Proteus' );
877
- expect( satelliteItems[ 2 ].title ).toBe( 'Nereid' );
878
- expect( satelliteItems[ 3 ].title ).toBe( 'Moon' );
879
- expect( satelliteItems[ 4 ].title ).toBe( 'Io' );
880
- expect( satelliteItems[ 5 ].title ).toBe( 'Himalia' );
881
- expect( satelliteItems[ 6 ].title ).toBe( 'Ganymede' );
882
- expect( satelliteItems[ 7 ].title ).toBe( 'Europa' );
883
- expect( satelliteItems[ 8 ].title ).toBe( 'Callisto' );
884
- expect( satelliteItems[ 9 ].title ).toBe( 'Amalthea' );
883
+ expect( satelliteItems[ 0 ].name.title ).toBe( 'Triton' );
884
+ expect( satelliteItems[ 1 ].name.title ).toBe( 'Proteus' );
885
+ expect( satelliteItems[ 2 ].name.title ).toBe( 'Nereid' );
886
+ expect( satelliteItems[ 3 ].name.title ).toBe( 'Moon' );
887
+ expect( satelliteItems[ 4 ].name.title ).toBe( 'Io' );
888
+ expect( satelliteItems[ 5 ].name.title ).toBe( 'Himalia' );
889
+ expect( satelliteItems[ 6 ].name.title ).toBe( 'Ganymede' );
890
+ expect( satelliteItems[ 7 ].name.title ).toBe( 'Europa' );
891
+ expect( satelliteItems[ 8 ].name.title ).toBe( 'Callisto' );
892
+ expect( satelliteItems[ 9 ].name.title ).toBe( 'Amalthea' );
885
893
 
886
894
  // All terrestrial planets should be grouped together
887
895
  const terrestrialItems = result.filter(
888
896
  ( item ) => item.type === 'Terrestrial'
889
897
  );
890
898
  expect( terrestrialItems ).toHaveLength( 4 );
891
- expect( terrestrialItems[ 0 ].title ).toBe( 'Venus' );
892
- expect( terrestrialItems[ 1 ].title ).toBe( 'Mercury' );
893
- expect( terrestrialItems[ 2 ].title ).toBe( 'Mars' );
894
- expect( terrestrialItems[ 3 ].title ).toBe( 'Earth' );
899
+ expect( terrestrialItems[ 0 ].name.title ).toBe( 'Venus' );
900
+ expect( terrestrialItems[ 1 ].name.title ).toBe( 'Mercury' );
901
+ expect( terrestrialItems[ 2 ].name.title ).toBe( 'Mars' );
902
+ expect( terrestrialItems[ 3 ].name.title ).toBe( 'Earth' );
895
903
  } );
896
904
 
897
905
  it( 'should sort integer field types', () => {
@@ -904,9 +912,9 @@ describe( 'sorting', () => {
904
912
  );
905
913
 
906
914
  expect( result ).toHaveLength( 18 );
907
- expect( result[ 0 ].title ).toBe( 'Saturn' );
908
- expect( result[ 1 ].title ).toBe( 'Jupiter' );
909
- expect( result[ 2 ].title ).toBe( 'Uranus' );
915
+ expect( result[ 0 ].name.title ).toBe( 'Saturn' );
916
+ expect( result[ 1 ].name.title ).toBe( 'Jupiter' );
917
+ expect( result[ 2 ].name.title ).toBe( 'Uranus' );
910
918
  } );
911
919
 
912
920
  it( 'should sort text field types', () => {
@@ -925,8 +933,8 @@ describe( 'sorting', () => {
925
933
  fields
926
934
  );
927
935
  expect( result ).toHaveLength( 2 );
928
- expect( result[ 0 ].title ).toBe( 'Uranus' );
929
- expect( result[ 1 ].title ).toBe( 'Neptune' );
936
+ expect( result[ 0 ].name.title ).toBe( 'Uranus' );
937
+ expect( result[ 1 ].name.title ).toBe( 'Neptune' );
930
938
  } );
931
939
 
932
940
  it( 'should sort datetime field types', () => {
@@ -938,11 +946,13 @@ describe( 'sorting', () => {
938
946
  fields
939
947
  );
940
948
  expect( resultDesc ).toHaveLength( 18 );
941
- expect( resultDesc[ 0 ].title ).toBe( 'Europa' );
942
- expect( resultDesc[ 1 ].title ).toBe( 'Earth' );
949
+ expect( resultDesc[ 0 ].name.title ).toBe( 'Europa' );
950
+ expect( resultDesc[ 1 ].name.title ).toBe( 'Earth' );
943
951
  // Skip intermediate items
944
- expect( resultDesc[ resultDesc.length - 2 ].title ).toBe( 'Io' );
945
- expect( resultDesc[ resultDesc.length - 1 ].title ).toBe( 'Jupiter' );
952
+ expect( resultDesc[ resultDesc.length - 2 ].name.title ).toBe( 'Io' );
953
+ expect( resultDesc[ resultDesc.length - 1 ].name.title ).toBe(
954
+ 'Jupiter'
955
+ );
946
956
 
947
957
  const { data: resultAsc } = filterSortAndPaginate(
948
958
  data,
@@ -952,11 +962,11 @@ describe( 'sorting', () => {
952
962
  fields
953
963
  );
954
964
  expect( resultAsc ).toHaveLength( 18 );
955
- expect( resultAsc[ 0 ].title ).toBe( 'Jupiter' );
956
- expect( resultAsc[ 1 ].title ).toBe( 'Io' );
965
+ expect( resultAsc[ 0 ].name.title ).toBe( 'Jupiter' );
966
+ expect( resultAsc[ 1 ].name.title ).toBe( 'Io' );
957
967
  // Skip intermediate items
958
- expect( resultAsc[ resultAsc.length - 2 ].title ).toBe( 'Earth' );
959
- expect( resultAsc[ resultAsc.length - 1 ].title ).toBe( 'Europa' );
968
+ expect( resultAsc[ resultAsc.length - 2 ].name.title ).toBe( 'Earth' );
969
+ expect( resultAsc[ resultAsc.length - 1 ].name.title ).toBe( 'Europa' );
960
970
  } );
961
971
 
962
972
  it( 'should sort untyped fields if the value is a number', () => {
@@ -974,9 +984,9 @@ describe( 'sorting', () => {
974
984
  );
975
985
 
976
986
  expect( result ).toHaveLength( 18 );
977
- expect( result[ 0 ].title ).toBe( 'Saturn' );
978
- expect( result[ 1 ].title ).toBe( 'Jupiter' );
979
- expect( result[ 2 ].title ).toBe( 'Uranus' );
987
+ expect( result[ 0 ].name.title ).toBe( 'Saturn' );
988
+ expect( result[ 1 ].name.title ).toBe( 'Jupiter' );
989
+ expect( result[ 2 ].name.title ).toBe( 'Uranus' );
980
990
  } );
981
991
 
982
992
  it( 'should sort untyped fields if the value is string', () => {
@@ -998,8 +1008,8 @@ describe( 'sorting', () => {
998
1008
  )
999
1009
  );
1000
1010
  expect( result ).toHaveLength( 2 );
1001
- expect( result[ 0 ].title ).toBe( 'Uranus' );
1002
- expect( result[ 1 ].title ).toBe( 'Neptune' );
1011
+ expect( result[ 0 ].name.title ).toBe( 'Uranus' );
1012
+ expect( result[ 1 ].name.title ).toBe( 'Neptune' );
1003
1013
  } );
1004
1014
 
1005
1015
  it( 'should sort only by groupByField when sort is not specified', () => {
@@ -1037,8 +1047,8 @@ describe( 'pagination', () => {
1037
1047
  fields
1038
1048
  );
1039
1049
  expect( result ).toHaveLength( 2 );
1040
- expect( result[ 0 ].title ).toBe( 'Europa' );
1041
- expect( result[ 1 ].title ).toBe( 'Ganymede' );
1050
+ expect( result[ 0 ].name.title ).toBe( 'Europa' );
1051
+ expect( result[ 1 ].name.title ).toBe( 'Ganymede' );
1042
1052
  expect( paginationInfo ).toStrictEqual( {
1043
1053
  totalItems: data.length,
1044
1054
  totalPages: 9,
@@ -42,6 +42,120 @@ describe( 'normalizeFields: default getValue', () => {
42
42
  expect( result ).toBe( 'value' );
43
43
  } );
44
44
  } );
45
+ describe( 'setValue from ID', () => {
46
+ it( 'user', () => {
47
+ const item = { user: 'value', email: 'user@example.com' };
48
+ const fields: Field< {} >[] = [
49
+ {
50
+ id: 'user',
51
+ },
52
+ {
53
+ id: 'email',
54
+ },
55
+ ];
56
+ const normalizedFields = normalizeFields( fields );
57
+ const result = normalizedFields[ 0 ].setValue( {
58
+ item,
59
+ value: 'newValue',
60
+ } );
61
+ expect( result ).toEqual( { user: 'newValue' } );
62
+ } );
63
+
64
+ it( 'user.name', () => {
65
+ const item = {
66
+ user: { name: 'value', email: 'user@example.com' },
67
+ date: '2023-01-01',
68
+ };
69
+ const fields: Field< {} >[] = [
70
+ {
71
+ id: 'user.name',
72
+ },
73
+ {
74
+ id: 'user.email',
75
+ },
76
+ {
77
+ id: 'date',
78
+ },
79
+ ];
80
+ const normalizedFields = normalizeFields( fields );
81
+ const result = normalizedFields[ 0 ].setValue( {
82
+ item,
83
+ value: 'newValue',
84
+ } );
85
+ expect( result ).toEqual( { user: { name: 'newValue' } } );
86
+ } );
87
+
88
+ it( 'user.name.first', () => {
89
+ const item = {
90
+ user: {
91
+ name: { first: 'firstName', last: 'lastName' },
92
+ email: 'user@example.com',
93
+ },
94
+ date: '2023-01-01',
95
+ };
96
+ const fields: Field< {} >[] = [
97
+ {
98
+ id: 'user.name.first',
99
+ },
100
+ {
101
+ id: 'user.name.last',
102
+ },
103
+ {
104
+ id: 'user.email',
105
+ },
106
+ {
107
+ id: 'date',
108
+ },
109
+ ];
110
+ const normalizedFields = normalizeFields( fields );
111
+ const result = normalizedFields[ 0 ].setValue( {
112
+ item,
113
+ value: 'newValue',
114
+ } );
115
+ expect( result ).toEqual( {
116
+ user: {
117
+ name: { first: 'newValue' },
118
+ },
119
+ } );
120
+ } );
121
+
122
+ it( 'returns null for null value', () => {
123
+ const item = { user: 'value', email: 'user@example.com' };
124
+ const fields: Field< {} >[] = [
125
+ {
126
+ id: 'user',
127
+ },
128
+ {
129
+ id: 'email',
130
+ },
131
+ ];
132
+ const normalizedFields = normalizeFields( fields );
133
+ const result = normalizedFields[ 0 ].setValue( {
134
+ item,
135
+ value: null,
136
+ } );
137
+ expect( result ).toEqual( { user: null } );
138
+ } );
139
+
140
+ it( 'returns undefined for undefined value', () => {
141
+ const item = { user: 'value', email: 'user@example.com' };
142
+ const fields: Field< {} >[] = [
143
+ {
144
+ id: 'user',
145
+ },
146
+ {
147
+ id: 'email',
148
+ },
149
+ ];
150
+ const normalizedFields = normalizeFields( fields );
151
+ const result = normalizedFields[ 0 ].setValue( {
152
+ item,
153
+ value: undefined,
154
+ } );
155
+ expect( result ).toEqual( { user: undefined } );
156
+ } );
157
+ } );
158
+
45
159
  describe( 'filterBy', () => {
46
160
  it( 'returns the default field type definition if undefined for untyped field', () => {
47
161
  const fields: Field< {} >[] = [