@strato-admin/faker-ecommerce 0.1.1 → 0.3.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 (519) hide show
  1. package/dist/dataProvider.js +1 -2
  2. package/dist/generate.d.ts +2 -1
  3. package/dist/generate.js +15 -8
  4. package/dist/ra-core/src/auth/LogoutOnMount.d.ts +8 -0
  5. package/dist/ra-core/src/auth/LogoutOnMount.js +16 -0
  6. package/dist/ra-core/src/auth/addRefreshAuthToAuthProvider.d.ts +22 -0
  7. package/dist/ra-core/src/auth/addRefreshAuthToAuthProvider.js +41 -0
  8. package/dist/ra-core/src/auth/addRefreshAuthToDataProvider.d.ts +21 -0
  9. package/dist/ra-core/src/auth/addRefreshAuthToDataProvider.js +30 -0
  10. package/dist/ra-core/src/auth/convertLegacyAuthProvider.d.ts +12 -0
  11. package/dist/ra-core/src/auth/convertLegacyAuthProvider.js +19 -0
  12. package/dist/ra-core/src/auth/index.d.ts +27 -0
  13. package/dist/ra-core/src/auth/index.js +34 -0
  14. package/dist/ra-core/src/auth/types.d.ts +7 -0
  15. package/dist/ra-core/src/auth/types.js +5 -0
  16. package/dist/ra-core/src/auth/useAuthProvider.d.ts +10 -0
  17. package/dist/ra-core/src/auth/useAuthProvider.js +11 -0
  18. package/dist/ra-core/src/auth/useAuthState.d.ts +48 -0
  19. package/dist/ra-core/src/auth/useAuthState.js +171 -0
  20. package/dist/ra-core/src/auth/useAuthenticated.d.ts +36 -0
  21. package/dist/ra-core/src/auth/useAuthenticated.js +34 -0
  22. package/dist/ra-core/src/auth/useCanAccess.d.ts +56 -0
  23. package/dist/ra-core/src/auth/useCanAccess.js +108 -0
  24. package/dist/ra-core/src/auth/useCanAccessCallback.d.ts +39 -0
  25. package/dist/ra-core/src/auth/useCanAccessCallback.js +45 -0
  26. package/dist/ra-core/src/auth/useCanAccessResources.d.ts +67 -0
  27. package/dist/ra-core/src/auth/useCanAccessResources.js +92 -0
  28. package/dist/ra-core/src/auth/useCheckAuth.d.ts +48 -0
  29. package/dist/ra-core/src/auth/useCheckAuth.js +76 -0
  30. package/dist/ra-core/src/auth/useGetIdentity.d.ts +41 -0
  31. package/dist/ra-core/src/auth/useGetIdentity.js +86 -0
  32. package/dist/ra-core/src/auth/useGetPermissions.d.ts +41 -0
  33. package/dist/ra-core/src/auth/useGetPermissions.js +47 -0
  34. package/dist/ra-core/src/auth/useHandleAuthCallback.d.ts +20 -0
  35. package/dist/ra-core/src/auth/useHandleAuthCallback.js +83 -0
  36. package/dist/ra-core/src/auth/useIsAuthPending.d.ts +13 -0
  37. package/dist/ra-core/src/auth/useIsAuthPending.js +30 -0
  38. package/dist/ra-core/src/auth/useLogin.d.ts +34 -0
  39. package/dist/ra-core/src/auth/useLogin.js +78 -0
  40. package/dist/ra-core/src/auth/useLogout.d.ts +31 -0
  41. package/dist/ra-core/src/auth/useLogout.js +117 -0
  42. package/dist/ra-core/src/auth/useLogoutIfAccessDenied.d.ts +42 -0
  43. package/dist/ra-core/src/auth/useLogoutIfAccessDenied.js +111 -0
  44. package/dist/ra-core/src/auth/usePermissions.d.ts +41 -0
  45. package/dist/ra-core/src/auth/usePermissions.js +123 -0
  46. package/dist/ra-core/src/controller/button/index.d.ts +7 -0
  47. package/dist/ra-core/src/controller/button/index.js +7 -0
  48. package/dist/ra-core/src/controller/button/useBulkDeleteController.d.ts +14 -0
  49. package/dist/ra-core/src/controller/button/useBulkDeleteController.js +66 -0
  50. package/dist/ra-core/src/controller/create/index.d.ts +6 -0
  51. package/dist/ra-core/src/controller/create/index.js +6 -0
  52. package/dist/ra-core/src/controller/create/useCreateController.d.ts +50 -0
  53. package/dist/ra-core/src/controller/create/useCreateController.js +149 -0
  54. package/dist/ra-core/src/controller/edit/index.d.ts +6 -0
  55. package/dist/ra-core/src/controller/edit/index.js +6 -0
  56. package/dist/ra-core/src/controller/edit/useEditController.d.ts +72 -0
  57. package/dist/ra-core/src/controller/edit/useEditController.js +206 -0
  58. package/dist/ra-core/src/controller/field/index.d.ts +12 -0
  59. package/dist/ra-core/src/controller/field/index.js +12 -0
  60. package/dist/ra-core/src/controller/field/sanitizeFieldRestProps.d.ts +1 -0
  61. package/dist/ra-core/src/controller/field/sanitizeFieldRestProps.js +1 -0
  62. package/dist/ra-core/src/controller/field/types.d.ts +28 -0
  63. package/dist/ra-core/src/controller/field/types.js +1 -0
  64. package/dist/ra-core/src/controller/field/useReferenceArrayFieldController.d.ts +39 -0
  65. package/dist/ra-core/src/controller/field/useReferenceArrayFieldController.js +82 -0
  66. package/dist/ra-core/src/controller/field/useReferenceFieldController.d.ts +14 -0
  67. package/dist/ra-core/src/controller/field/useReferenceFieldController.js +31 -0
  68. package/dist/ra-core/src/controller/field/useReferenceManyFieldController.d.ts +49 -0
  69. package/dist/ra-core/src/controller/field/useReferenceManyFieldController.js +264 -0
  70. package/dist/ra-core/src/controller/index.d.ts +17 -0
  71. package/dist/ra-core/src/controller/index.js +16 -0
  72. package/dist/ra-core/src/controller/input/ArrayInputContext.d.ts +9 -0
  73. package/dist/ra-core/src/controller/input/ArrayInputContext.js +8 -0
  74. package/dist/ra-core/src/controller/input/SimpleFormIteratorContext.d.ts +15 -0
  75. package/dist/ra-core/src/controller/input/SimpleFormIteratorContext.js +8 -0
  76. package/dist/ra-core/src/controller/input/SimpleFormIteratorItemContext.d.ts +13 -0
  77. package/dist/ra-core/src/controller/input/SimpleFormIteratorItemContext.js +8 -0
  78. package/dist/ra-core/src/controller/input/index.d.ts +17 -0
  79. package/dist/ra-core/src/controller/input/index.js +17 -0
  80. package/dist/ra-core/src/controller/input/referenceDataStatus.d.ts +32 -0
  81. package/dist/ra-core/src/controller/input/referenceDataStatus.js +74 -0
  82. package/dist/ra-core/src/controller/input/sanitizeInputRestProps.d.ts +1 -0
  83. package/dist/ra-core/src/controller/input/sanitizeInputRestProps.js +1 -0
  84. package/dist/ra-core/src/controller/input/types.d.ts +3 -0
  85. package/dist/ra-core/src/controller/input/types.js +1 -0
  86. package/dist/ra-core/src/controller/input/useArrayInput.d.ts +8 -0
  87. package/dist/ra-core/src/controller/input/useArrayInput.js +29 -0
  88. package/dist/ra-core/src/controller/input/useGetArrayInputNewItemDefaults.d.ts +3 -0
  89. package/dist/ra-core/src/controller/input/useGetArrayInputNewItemDefaults.js +37 -0
  90. package/dist/ra-core/src/controller/input/useReferenceArrayInputController.d.ts +48 -0
  91. package/dist/ra-core/src/controller/input/useReferenceArrayInputController.js +137 -0
  92. package/dist/ra-core/src/controller/input/useReferenceInputController.d.ts +54 -0
  93. package/dist/ra-core/src/controller/input/useReferenceInputController.js +208 -0
  94. package/dist/ra-core/src/controller/input/useReferenceParams.d.ts +106 -0
  95. package/dist/ra-core/src/controller/input/useReferenceParams.js +226 -0
  96. package/dist/ra-core/src/controller/input/useSimpleFormIterator.d.ts +7 -0
  97. package/dist/ra-core/src/controller/input/useSimpleFormIterator.js +15 -0
  98. package/dist/ra-core/src/controller/input/useSimpleFormIteratorItem.d.ts +7 -0
  99. package/dist/ra-core/src/controller/input/useSimpleFormIteratorItem.js +15 -0
  100. package/dist/ra-core/src/controller/list/InfinitePaginationContext.d.ts +25 -0
  101. package/dist/ra-core/src/controller/list/InfinitePaginationContext.js +32 -0
  102. package/dist/ra-core/src/controller/list/index.d.ts +30 -0
  103. package/dist/ra-core/src/controller/list/index.js +30 -0
  104. package/dist/ra-core/src/controller/list/queryReducer.d.ts +45 -0
  105. package/dist/ra-core/src/controller/list/queryReducer.js +85 -0
  106. package/dist/ra-core/src/controller/list/useFilterContext.d.ts +2 -0
  107. package/dist/ra-core/src/controller/list/useFilterContext.js +5 -0
  108. package/dist/ra-core/src/controller/list/useInfiniteListController.d.ts +44 -0
  109. package/dist/ra-core/src/controller/list/useInfiniteListController.js +175 -0
  110. package/dist/ra-core/src/controller/list/useInfinitePaginationContext.d.ts +16 -0
  111. package/dist/ra-core/src/controller/list/useInfinitePaginationContext.js +17 -0
  112. package/dist/ra-core/src/controller/list/useList.d.ts +55 -0
  113. package/dist/ra-core/src/controller/list/useList.js +223 -0
  114. package/dist/ra-core/src/controller/list/useListContext.d.ts +59 -0
  115. package/dist/ra-core/src/controller/list/useListContext.js +65 -0
  116. package/dist/ra-core/src/controller/list/useListContextWithProps.d.ts +44 -0
  117. package/dist/ra-core/src/controller/list/useListContextWithProps.js +84 -0
  118. package/dist/ra-core/src/controller/list/useListController.d.ts +296 -0
  119. package/dist/ra-core/src/controller/list/useListController.js +234 -0
  120. package/dist/ra-core/src/controller/list/useListFilterContext.d.ts +11 -0
  121. package/dist/ra-core/src/controller/list/useListFilterContext.js +18 -0
  122. package/dist/ra-core/src/controller/list/useListPaginationContext.d.ts +12 -0
  123. package/dist/ra-core/src/controller/list/useListPaginationContext.js +19 -0
  124. package/dist/ra-core/src/controller/list/useListParams.d.ts +116 -0
  125. package/dist/ra-core/src/controller/list/useListParams.js +281 -0
  126. package/dist/ra-core/src/controller/list/useListSortContext.d.ts +12 -0
  127. package/dist/ra-core/src/controller/list/useListSortContext.js +19 -0
  128. package/dist/ra-core/src/controller/list/useRecordSelection.d.ts +32 -0
  129. package/dist/ra-core/src/controller/list/useRecordSelection.js +93 -0
  130. package/dist/ra-core/src/controller/list/useSavedQueries.d.ts +14 -0
  131. package/dist/ra-core/src/controller/list/useSavedQueries.js +29 -0
  132. package/dist/ra-core/src/controller/list/useUnselect.d.ts +10 -0
  133. package/dist/ra-core/src/controller/list/useUnselect.js +18 -0
  134. package/dist/ra-core/src/controller/list/useUnselectAll.d.ts +9 -0
  135. package/dist/ra-core/src/controller/list/useUnselectAll.js +18 -0
  136. package/dist/ra-core/src/controller/record/index.d.ts +5 -0
  137. package/dist/ra-core/src/controller/record/index.js +5 -0
  138. package/dist/ra-core/src/controller/record/useRecordContext.d.ts +34 -0
  139. package/dist/ra-core/src/controller/record/useRecordContext.js +36 -0
  140. package/dist/ra-core/src/controller/saveContext/SaveContext.d.ts +20 -0
  141. package/dist/ra-core/src/controller/saveContext/SaveContext.js +2 -0
  142. package/dist/ra-core/src/controller/saveContext/index.d.ts +6 -0
  143. package/dist/ra-core/src/controller/saveContext/index.js +6 -0
  144. package/dist/ra-core/src/controller/saveContext/useMutationMiddlewares.d.ts +39 -0
  145. package/dist/ra-core/src/controller/saveContext/useMutationMiddlewares.js +79 -0
  146. package/dist/ra-core/src/controller/saveContext/usePickSaveContext.d.ts +5 -0
  147. package/dist/ra-core/src/controller/saveContext/usePickSaveContext.js +25 -0
  148. package/dist/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.d.ts +6 -0
  149. package/dist/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.js +18 -0
  150. package/dist/ra-core/src/controller/saveContext/useSaveContext.d.ts +14 -0
  151. package/dist/ra-core/src/controller/saveContext/useSaveContext.js +17 -0
  152. package/dist/ra-core/src/controller/show/index.d.ts +6 -0
  153. package/dist/ra-core/src/controller/show/index.js +6 -0
  154. package/dist/ra-core/src/controller/show/useShowController.d.ts +75 -0
  155. package/dist/ra-core/src/controller/show/useShowController.js +110 -0
  156. package/dist/ra-core/src/controller/useFilterState.d.ts +46 -0
  157. package/dist/ra-core/src/controller/useFilterState.js +70 -0
  158. package/dist/ra-core/src/controller/usePaginationState.d.ts +33 -0
  159. package/dist/ra-core/src/controller/usePaginationState.js +45 -0
  160. package/dist/ra-core/src/controller/usePrevNextController.d.ts +127 -0
  161. package/dist/ra-core/src/controller/usePrevNextController.js +215 -0
  162. package/dist/ra-core/src/controller/useReference.d.ts +49 -0
  163. package/dist/ra-core/src/controller/useReference.js +42 -0
  164. package/dist/ra-core/src/controller/useSortState.d.ts +61 -0
  165. package/dist/ra-core/src/controller/useSortState.js +96 -0
  166. package/dist/ra-core/src/core/DefaultTitleContext.d.ts +15 -0
  167. package/dist/ra-core/src/core/DefaultTitleContext.js +15 -0
  168. package/dist/ra-core/src/core/HasDashboardContext.d.ts +21 -0
  169. package/dist/ra-core/src/core/HasDashboardContext.js +22 -0
  170. package/dist/ra-core/src/core/ResourceContext.d.ts +19 -0
  171. package/dist/ra-core/src/core/ResourceContext.js +19 -0
  172. package/dist/ra-core/src/core/UserMenuContext.d.ts +34 -0
  173. package/dist/ra-core/src/core/UserMenuContext.js +28 -0
  174. package/dist/ra-core/src/core/index.d.ts +27 -0
  175. package/dist/ra-core/src/core/index.js +27 -0
  176. package/dist/ra-core/src/core/useGetRecordRepresentation.d.ts +13 -0
  177. package/dist/ra-core/src/core/useGetRecordRepresentation.js +44 -0
  178. package/dist/ra-core/src/core/useGetResourceLabel.d.ts +22 -0
  179. package/dist/ra-core/src/core/useGetResourceLabel.js +42 -0
  180. package/dist/ra-core/src/core/useIsOffline.d.ts +7 -0
  181. package/dist/ra-core/src/core/useIsOffline.js +18 -0
  182. package/dist/ra-core/src/core/useResourceContext.d.ts +36 -0
  183. package/dist/ra-core/src/core/useResourceContext.js +38 -0
  184. package/dist/ra-core/src/core/useResourceDefinition.d.ts +31 -0
  185. package/dist/ra-core/src/core/useResourceDefinition.js +48 -0
  186. package/dist/ra-core/src/core/useResourceDefinitionContext.d.ts +1 -0
  187. package/dist/ra-core/src/core/useResourceDefinitionContext.js +3 -0
  188. package/dist/ra-core/src/core/useResourceDefinitions.d.ts +21 -0
  189. package/dist/ra-core/src/core/useResourceDefinitions.js +20 -0
  190. package/dist/ra-core/src/core/useUserMenu.d.ts +28 -0
  191. package/dist/ra-core/src/core/useUserMenu.js +30 -0
  192. package/dist/ra-core/src/core/useWrappedSource.d.ts +11 -0
  193. package/dist/ra-core/src/core/useWrappedSource.js +15 -0
  194. package/dist/ra-core/src/dataProvider/DataProviderContext.d.ts +3 -0
  195. package/dist/ra-core/src/dataProvider/DataProviderContext.js +4 -0
  196. package/dist/ra-core/src/dataProvider/HttpError.d.ts +6 -0
  197. package/dist/ra-core/src/dataProvider/HttpError.js +19 -0
  198. package/dist/ra-core/src/dataProvider/combineDataProviders.d.ts +21 -0
  199. package/dist/ra-core/src/dataProvider/combineDataProviders.js +32 -0
  200. package/dist/ra-core/src/dataProvider/convertLegacyDataProvider.d.ts +12 -0
  201. package/dist/ra-core/src/dataProvider/convertLegacyDataProvider.js +40 -0
  202. package/dist/ra-core/src/dataProvider/dataFetchActions.d.ts +15 -0
  203. package/dist/ra-core/src/dataProvider/dataFetchActions.js +49 -0
  204. package/dist/ra-core/src/dataProvider/defaultDataProvider.d.ts +2 -0
  205. package/dist/ra-core/src/dataProvider/defaultDataProvider.js +12 -0
  206. package/dist/ra-core/src/dataProvider/fetch.d.ts +32 -0
  207. package/dist/ra-core/src/dataProvider/fetch.js +78 -0
  208. package/dist/ra-core/src/dataProvider/index.d.ts +34 -0
  209. package/dist/ra-core/src/dataProvider/index.js +33 -0
  210. package/dist/ra-core/src/dataProvider/populateQueryCache.d.ts +22 -0
  211. package/dist/ra-core/src/dataProvider/populateQueryCache.js +30 -0
  212. package/dist/ra-core/src/dataProvider/testDataProvider.d.ts +2 -0
  213. package/dist/ra-core/src/dataProvider/testDataProvider.js +41 -0
  214. package/dist/ra-core/src/dataProvider/undo/index.d.ts +6 -0
  215. package/dist/ra-core/src/dataProvider/undo/index.js +6 -0
  216. package/dist/ra-core/src/dataProvider/undo/types.d.ts +3 -0
  217. package/dist/ra-core/src/dataProvider/undo/types.js +1 -0
  218. package/dist/ra-core/src/dataProvider/undoableEventEmitter.d.ts +3 -0
  219. package/dist/ra-core/src/dataProvider/undoableEventEmitter.js +2 -0
  220. package/dist/ra-core/src/dataProvider/useCreate.d.ts +89 -0
  221. package/dist/ra-core/src/dataProvider/useCreate.js +155 -0
  222. package/dist/ra-core/src/dataProvider/useDataProvider.d.ts +2 -0
  223. package/dist/ra-core/src/dataProvider/useDataProvider.js +140 -0
  224. package/dist/ra-core/src/dataProvider/useDelete.d.ts +83 -0
  225. package/dist/ra-core/src/dataProvider/useDelete.js +171 -0
  226. package/dist/ra-core/src/dataProvider/useDeleteMany.d.ts +81 -0
  227. package/dist/ra-core/src/dataProvider/useDeleteMany.js +193 -0
  228. package/dist/ra-core/src/dataProvider/useGetList.d.ts +58 -0
  229. package/dist/ra-core/src/dataProvider/useGetList.js +131 -0
  230. package/dist/ra-core/src/dataProvider/useGetMany.d.ts +49 -0
  231. package/dist/ra-core/src/dataProvider/useGetMany.js +143 -0
  232. package/dist/ra-core/src/dataProvider/useGetManyAggregate.d.ts +62 -0
  233. package/dist/ra-core/src/dataProvider/useGetManyAggregate.js +295 -0
  234. package/dist/ra-core/src/dataProvider/useGetManyReference.d.ts +62 -0
  235. package/dist/ra-core/src/dataProvider/useGetManyReference.js +117 -0
  236. package/dist/ra-core/src/dataProvider/useGetOne.d.ts +48 -0
  237. package/dist/ra-core/src/dataProvider/useGetOne.js +94 -0
  238. package/dist/ra-core/src/dataProvider/useGetRecordId.d.ts +14 -0
  239. package/dist/ra-core/src/dataProvider/useGetRecordId.js +22 -0
  240. package/dist/ra-core/src/dataProvider/useInfiniteGetList.d.ts +64 -0
  241. package/dist/ra-core/src/dataProvider/useInfiniteGetList.js +177 -0
  242. package/dist/ra-core/src/dataProvider/useIsDataLoaded.d.ts +13 -0
  243. package/dist/ra-core/src/dataProvider/useIsDataLoaded.js +35 -0
  244. package/dist/ra-core/src/dataProvider/useLoading.d.ts +12 -0
  245. package/dist/ra-core/src/dataProvider/useLoading.js +41 -0
  246. package/dist/ra-core/src/dataProvider/useMutationWithMutationMode.d.ts +51 -0
  247. package/dist/ra-core/src/dataProvider/useMutationWithMutationMode.js +238 -0
  248. package/dist/ra-core/src/dataProvider/useRefresh.d.ts +14 -0
  249. package/dist/ra-core/src/dataProvider/useRefresh.js +21 -0
  250. package/dist/ra-core/src/dataProvider/useUpdate.d.ts +89 -0
  251. package/dist/ra-core/src/dataProvider/useUpdate.js +183 -0
  252. package/dist/ra-core/src/dataProvider/useUpdateMany.d.ts +81 -0
  253. package/dist/ra-core/src/dataProvider/useUpdateMany.js +171 -0
  254. package/dist/ra-core/src/dataProvider/validateResponseFormat.d.ts +5 -0
  255. package/dist/ra-core/src/dataProvider/validateResponseFormat.js +35 -0
  256. package/dist/ra-core/src/dataProvider/withLifecycleCallbacks.d.ts +162 -0
  257. package/dist/ra-core/src/dataProvider/withLifecycleCallbacks.js +377 -0
  258. package/dist/ra-core/src/dataTable/DataTableCallbacksContext.d.ts +18 -0
  259. package/dist/ra-core/src/dataTable/DataTableCallbacksContext.js +3 -0
  260. package/dist/ra-core/src/dataTable/DataTableColumnFilterContext.d.ts +2 -0
  261. package/dist/ra-core/src/dataTable/DataTableColumnFilterContext.js +3 -0
  262. package/dist/ra-core/src/dataTable/DataTableColumnRankContext.d.ts +2 -0
  263. package/dist/ra-core/src/dataTable/DataTableColumnRankContext.js +3 -0
  264. package/dist/ra-core/src/dataTable/DataTableConfigContext.d.ts +22 -0
  265. package/dist/ra-core/src/dataTable/DataTableConfigContext.js +7 -0
  266. package/dist/ra-core/src/dataTable/DataTableDataContext.d.ts +4 -0
  267. package/dist/ra-core/src/dataTable/DataTableDataContext.js +3 -0
  268. package/dist/ra-core/src/dataTable/DataTableRenderContext.d.ts +3 -0
  269. package/dist/ra-core/src/dataTable/DataTableRenderContext.js +3 -0
  270. package/dist/ra-core/src/dataTable/DataTableSelectedIdsContext.d.ts +3 -0
  271. package/dist/ra-core/src/dataTable/DataTableSelectedIdsContext.js +3 -0
  272. package/dist/ra-core/src/dataTable/DataTableSortContext.d.ts +3 -0
  273. package/dist/ra-core/src/dataTable/DataTableSortContext.js +3 -0
  274. package/dist/ra-core/src/dataTable/DataTableStoreContext.d.ts +8 -0
  275. package/dist/ra-core/src/dataTable/DataTableStoreContext.js +6 -0
  276. package/dist/ra-core/src/dataTable/index.d.ts +11 -0
  277. package/dist/ra-core/src/dataTable/index.js +11 -0
  278. package/dist/ra-core/src/dataTable/types.d.ts +2 -0
  279. package/dist/ra-core/src/dataTable/types.js +1 -0
  280. package/dist/ra-core/src/export/ExporterContext.d.ts +2 -0
  281. package/dist/ra-core/src/export/ExporterContext.js +4 -0
  282. package/dist/ra-core/src/export/defaultExporter.d.ts +2 -0
  283. package/dist/ra-core/src/export/defaultExporter.js +3 -0
  284. package/dist/ra-core/src/export/downloadCSV.d.ts +1 -0
  285. package/dist/ra-core/src/export/downloadCSV.js +17 -0
  286. package/dist/ra-core/src/export/fetchRelatedRecords.d.ts +14 -0
  287. package/dist/ra-core/src/export/fetchRelatedRecords.js +19 -0
  288. package/dist/ra-core/src/export/getRelatedIds.d.ts +24 -0
  289. package/dist/ra-core/src/export/getRelatedIds.js +26 -0
  290. package/dist/ra-core/src/export/index.d.ts +5 -0
  291. package/dist/ra-core/src/export/index.js +5 -0
  292. package/dist/ra-core/src/export/useBulkExport.d.ts +11 -0
  293. package/dist/ra-core/src/export/useBulkExport.js +30 -0
  294. package/dist/ra-core/src/form/WarnWhenUnsavedChanges.d.ts +5 -0
  295. package/dist/ra-core/src/form/WarnWhenUnsavedChanges.js +5 -0
  296. package/dist/ra-core/src/form/choices/ChoicesContext.d.ts +65 -0
  297. package/dist/ra-core/src/form/choices/ChoicesContext.js +7 -0
  298. package/dist/ra-core/src/form/choices/index.d.ts +4 -0
  299. package/dist/ra-core/src/form/choices/index.js +4 -0
  300. package/dist/ra-core/src/form/choices/useChoicesContext.d.ts +5 -0
  301. package/dist/ra-core/src/form/choices/useChoicesContext.js +62 -0
  302. package/dist/ra-core/src/form/getFormInitialValues.d.ts +8 -0
  303. package/dist/ra-core/src/form/getFormInitialValues.js +14 -0
  304. package/dist/ra-core/src/form/groups/FormGroupContext.d.ts +9 -0
  305. package/dist/ra-core/src/form/groups/FormGroupContext.js +9 -0
  306. package/dist/ra-core/src/form/groups/index.d.ts +6 -0
  307. package/dist/ra-core/src/form/groups/index.js +6 -0
  308. package/dist/ra-core/src/form/groups/useFormGroup.d.ts +67 -0
  309. package/dist/ra-core/src/form/groups/useFormGroup.js +146 -0
  310. package/dist/ra-core/src/form/groups/useFormGroupContext.d.ts +4 -0
  311. package/dist/ra-core/src/form/groups/useFormGroupContext.js +9 -0
  312. package/dist/ra-core/src/form/groups/useFormGroups.d.ts +4 -0
  313. package/dist/ra-core/src/form/groups/useFormGroups.js +9 -0
  314. package/dist/ra-core/src/form/index.d.ts +14 -0
  315. package/dist/ra-core/src/form/index.js +14 -0
  316. package/dist/ra-core/src/form/sanitizeEmptyValues.d.ts +7 -0
  317. package/dist/ra-core/src/form/sanitizeEmptyValues.js +26 -0
  318. package/dist/ra-core/src/form/useApplyInputDefaultValues.d.ts +19 -0
  319. package/dist/ra-core/src/form/useApplyInputDefaultValues.js +71 -0
  320. package/dist/ra-core/src/form/useAugmentedForm.d.ts +32 -0
  321. package/dist/ra-core/src/form/useAugmentedForm.js +101 -0
  322. package/dist/ra-core/src/form/useFormIsDirty.d.ts +4 -0
  323. package/dist/ra-core/src/form/useFormIsDirty.js +39 -0
  324. package/dist/ra-core/src/form/useInput.d.ts +33 -0
  325. package/dist/ra-core/src/form/useInput.js +100 -0
  326. package/dist/ra-core/src/form/useRecordFromLocation.d.ts +22 -0
  327. package/dist/ra-core/src/form/useRecordFromLocation.js +59 -0
  328. package/dist/ra-core/src/form/useSuggestions.d.ts +43 -0
  329. package/dist/ra-core/src/form/useSuggestions.js +186 -0
  330. package/dist/ra-core/src/form/validation/getSimpleValidationResolver.d.ts +31 -0
  331. package/dist/ra-core/src/form/validation/getSimpleValidationResolver.js +87 -0
  332. package/dist/ra-core/src/form/validation/index.d.ts +7 -0
  333. package/dist/ra-core/src/form/validation/index.js +7 -0
  334. package/dist/ra-core/src/form/validation/setSubmissionErrors.d.ts +21 -0
  335. package/dist/ra-core/src/form/validation/setSubmissionErrors.js +34 -0
  336. package/dist/ra-core/src/form/validation/useGetValidationErrorMessage.d.ts +26 -0
  337. package/dist/ra-core/src/form/validation/useGetValidationErrorMessage.js +35 -0
  338. package/dist/ra-core/src/form/validation/useNotifyIsFormInvalid.d.ts +9 -0
  339. package/dist/ra-core/src/form/validation/useNotifyIsFormInvalid.js +30 -0
  340. package/dist/ra-core/src/form/validation/useUnique.d.ts +57 -0
  341. package/dist/ra-core/src/form/validation/useUnique.js +107 -0
  342. package/dist/ra-core/src/form/validation/validate.d.ts +168 -0
  343. package/dist/ra-core/src/form/validation/validate.js +218 -0
  344. package/dist/ra-core/src/i18n/I18nContext.d.ts +3 -0
  345. package/dist/ra-core/src/i18n/I18nContext.js +11 -0
  346. package/dist/ra-core/src/i18n/TranslatableContext.d.ts +16 -0
  347. package/dist/ra-core/src/i18n/TranslatableContext.js +2 -0
  348. package/dist/ra-core/src/i18n/TranslationMessages.d.ts +221 -0
  349. package/dist/ra-core/src/i18n/TranslationMessages.js +1 -0
  350. package/dist/ra-core/src/i18n/TranslationUtils.d.ts +60 -0
  351. package/dist/ra-core/src/i18n/TranslationUtils.js +70 -0
  352. package/dist/ra-core/src/i18n/index.d.ts +20 -0
  353. package/dist/ra-core/src/i18n/index.js +20 -0
  354. package/dist/ra-core/src/i18n/substituteTokens.d.ts +8 -0
  355. package/dist/ra-core/src/i18n/substituteTokens.js +18 -0
  356. package/dist/ra-core/src/i18n/useI18nProvider.d.ts +12 -0
  357. package/dist/ra-core/src/i18n/useI18nProvider.js +14 -0
  358. package/dist/ra-core/src/i18n/useLocales.d.ts +31 -0
  359. package/dist/ra-core/src/i18n/useLocales.js +28 -0
  360. package/dist/ra-core/src/i18n/useResourceTranslation.d.ts +8 -0
  361. package/dist/ra-core/src/i18n/useResourceTranslation.js +18 -0
  362. package/dist/ra-core/src/i18n/useTranslatable.d.ts +29 -0
  363. package/dist/ra-core/src/i18n/useTranslatable.js +98 -0
  364. package/dist/ra-core/src/i18n/useTranslatableContext.d.ts +31 -0
  365. package/dist/ra-core/src/i18n/useTranslatableContext.js +38 -0
  366. package/dist/ra-core/src/i18n/useTranslate.d.ts +21 -0
  367. package/dist/ra-core/src/i18n/useTranslate.js +29 -0
  368. package/dist/ra-core/src/i18n/useTranslateLabel.d.ts +6 -0
  369. package/dist/ra-core/src/i18n/useTranslateLabel.js +26 -0
  370. package/dist/ra-core/src/index.d.ts +16 -0
  371. package/dist/ra-core/src/index.js +16 -0
  372. package/dist/ra-core/src/inference/InferredElement.d.ts +12 -0
  373. package/dist/ra-core/src/inference/InferredElement.js +40 -0
  374. package/dist/ra-core/src/inference/assertions.d.ts +26 -0
  375. package/dist/ra-core/src/inference/assertions.js +38 -0
  376. package/dist/ra-core/src/inference/getElementsFromRecords.d.ts +35 -0
  377. package/dist/ra-core/src/inference/getElementsFromRecords.js +39 -0
  378. package/dist/ra-core/src/inference/getValuesFromRecords.d.ts +28 -0
  379. package/dist/ra-core/src/inference/getValuesFromRecords.js +40 -0
  380. package/dist/ra-core/src/inference/index.d.ts +6 -0
  381. package/dist/ra-core/src/inference/index.js +6 -0
  382. package/dist/ra-core/src/inference/inferTypeFromValues.d.ts +21 -0
  383. package/dist/ra-core/src/inference/inferTypeFromValues.js +141 -0
  384. package/dist/ra-core/src/inference/types.d.ts +9 -0
  385. package/dist/ra-core/src/inference/types.js +1 -0
  386. package/dist/ra-core/src/notification/CloseNotificationContext.d.ts +2 -0
  387. package/dist/ra-core/src/notification/CloseNotificationContext.js +2 -0
  388. package/dist/ra-core/src/notification/NotificationContext.d.ts +37 -0
  389. package/dist/ra-core/src/notification/NotificationContext.js +35 -0
  390. package/dist/ra-core/src/notification/index.d.ts +9 -0
  391. package/dist/ra-core/src/notification/index.js +9 -0
  392. package/dist/ra-core/src/notification/types.d.ts +14 -0
  393. package/dist/ra-core/src/notification/types.js +1 -0
  394. package/dist/ra-core/src/notification/useCloseNotification.d.ts +1 -0
  395. package/dist/ra-core/src/notification/useCloseNotification.js +9 -0
  396. package/dist/ra-core/src/notification/useNotificationContext.d.ts +1 -0
  397. package/dist/ra-core/src/notification/useNotificationContext.js +3 -0
  398. package/dist/ra-core/src/notification/useNotify.d.ts +20 -0
  399. package/dist/ra-core/src/notification/useNotify.js +28 -0
  400. package/dist/ra-core/src/preferences/index.d.ts +7 -0
  401. package/dist/ra-core/src/preferences/index.js +7 -0
  402. package/dist/ra-core/src/preferences/usePreference.d.ts +18 -0
  403. package/dist/ra-core/src/preferences/usePreference.js +10 -0
  404. package/dist/ra-core/src/preferences/usePreferenceInput.d.ts +22 -0
  405. package/dist/ra-core/src/preferences/usePreferenceInput.js +43 -0
  406. package/dist/ra-core/src/preferences/usePreferencesEditor.d.ts +2 -0
  407. package/dist/ra-core/src/preferences/usePreferencesEditor.js +9 -0
  408. package/dist/ra-core/src/preferences/useSetInspectorTitle.d.ts +7 -0
  409. package/dist/ra-core/src/preferences/useSetInspectorTitle.js +19 -0
  410. package/dist/ra-core/src/routing/BasenameContext.d.ts +1 -0
  411. package/dist/ra-core/src/routing/BasenameContext.js +2 -0
  412. package/dist/ra-core/src/routing/RouterProvider.d.ts +163 -0
  413. package/dist/ra-core/src/routing/RouterProvider.js +1 -0
  414. package/dist/ra-core/src/routing/index.d.ts +28 -0
  415. package/dist/ra-core/src/routing/index.js +28 -0
  416. package/dist/ra-core/src/routing/types.d.ts +3 -0
  417. package/dist/ra-core/src/routing/types.js +1 -0
  418. package/dist/ra-core/src/routing/useBasename.d.ts +21 -0
  419. package/dist/ra-core/src/routing/useBasename.js +23 -0
  420. package/dist/ra-core/src/routing/useBlocker.d.ts +14 -0
  421. package/dist/ra-core/src/routing/useBlocker.js +17 -0
  422. package/dist/ra-core/src/routing/useCanBlock.d.ts +7 -0
  423. package/dist/ra-core/src/routing/useCanBlock.js +11 -0
  424. package/dist/ra-core/src/routing/useCreatePath.d.ts +42 -0
  425. package/dist/ra-core/src/routing/useCreatePath.js +69 -0
  426. package/dist/ra-core/src/routing/useGetPathForRecord.d.ts +42 -0
  427. package/dist/ra-core/src/routing/useGetPathForRecord.js +135 -0
  428. package/dist/ra-core/src/routing/useGetPathForRecordCallback.d.ts +6 -0
  429. package/dist/ra-core/src/routing/useGetPathForRecordCallback.js +82 -0
  430. package/dist/ra-core/src/routing/useInRouterContext.d.ts +11 -0
  431. package/dist/ra-core/src/routing/useInRouterContext.js +15 -0
  432. package/dist/ra-core/src/routing/useLocation.d.ts +10 -0
  433. package/dist/ra-core/src/routing/useLocation.js +13 -0
  434. package/dist/ra-core/src/routing/useMatch.d.ts +15 -0
  435. package/dist/ra-core/src/routing/useMatch.js +15 -0
  436. package/dist/ra-core/src/routing/useMatchPath.d.ts +17 -0
  437. package/dist/ra-core/src/routing/useMatchPath.js +17 -0
  438. package/dist/ra-core/src/routing/useNavigate.d.ts +12 -0
  439. package/dist/ra-core/src/routing/useNavigate.js +15 -0
  440. package/dist/ra-core/src/routing/useParams.d.ts +9 -0
  441. package/dist/ra-core/src/routing/useParams.js +13 -0
  442. package/dist/ra-core/src/routing/useRedirect.d.ts +30 -0
  443. package/dist/ra-core/src/routing/useRedirect.js +66 -0
  444. package/dist/ra-core/src/routing/useResetErrorBoundaryOnLocationChange.d.ts +7 -0
  445. package/dist/ra-core/src/routing/useResetErrorBoundaryOnLocationChange.js +17 -0
  446. package/dist/ra-core/src/routing/useRestoreScrollPosition.d.ts +40 -0
  447. package/dist/ra-core/src/routing/useRestoreScrollPosition.js +70 -0
  448. package/dist/ra-core/src/routing/useSplatPathBase.d.ts +13 -0
  449. package/dist/ra-core/src/routing/useSplatPathBase.js +21 -0
  450. package/dist/ra-core/src/store/index.d.ts +11 -0
  451. package/dist/ra-core/src/store/index.js +11 -0
  452. package/dist/ra-core/src/store/localStorageStore.d.ts +27 -0
  453. package/dist/ra-core/src/store/localStorageStore.js +198 -0
  454. package/dist/ra-core/src/store/types.d.ts +11 -0
  455. package/dist/ra-core/src/store/types.js +1 -0
  456. package/dist/ra-core/src/store/useRemoveFromStore.d.ts +17 -0
  457. package/dist/ra-core/src/store/useRemoveFromStore.js +29 -0
  458. package/dist/ra-core/src/store/useRemoveItemsFromStore.d.ts +17 -0
  459. package/dist/ra-core/src/store/useRemoveItemsFromStore.js +29 -0
  460. package/dist/ra-core/src/store/useResetStore.d.ts +17 -0
  461. package/dist/ra-core/src/store/useResetStore.js +21 -0
  462. package/dist/ra-core/src/store/useStore.d.ts +48 -0
  463. package/dist/ra-core/src/store/useStore.js +32 -0
  464. package/dist/ra-core/src/store/useStoreContext.d.ts +4 -0
  465. package/dist/ra-core/src/store/useStoreContext.js +6 -0
  466. package/dist/ra-core/src/test-ui/defaultI18nProvider.d.ts +2 -0
  467. package/dist/ra-core/src/test-ui/defaultI18nProvider.js +10 -0
  468. package/dist/ra-core/src/test-ui/index.d.ts +21 -0
  469. package/dist/ra-core/src/test-ui/index.js +21 -0
  470. package/dist/ra-core/src/types.d.ts +284 -0
  471. package/dist/ra-core/src/types.js +5 -0
  472. package/dist/ra-core/src/util/asyncDebounce.d.ts +7 -0
  473. package/dist/ra-core/src/util/asyncDebounce.js +29 -0
  474. package/dist/ra-core/src/util/escapePath.d.ts +11 -0
  475. package/dist/ra-core/src/util/escapePath.js +10 -0
  476. package/dist/ra-core/src/util/genericMemo.d.ts +5 -0
  477. package/dist/ra-core/src/util/genericMemo.js +14 -0
  478. package/dist/ra-core/src/util/getFieldLabelTranslationArgs.d.ts +22 -0
  479. package/dist/ra-core/src/util/getFieldLabelTranslationArgs.js +73 -0
  480. package/dist/ra-core/src/util/getMutationMode.d.ts +1 -0
  481. package/dist/ra-core/src/util/getMutationMode.js +13 -0
  482. package/dist/ra-core/src/util/hooks.d.ts +15 -0
  483. package/dist/ra-core/src/util/hooks.js +73 -0
  484. package/dist/ra-core/src/util/index.d.ts +20 -0
  485. package/dist/ra-core/src/util/index.js +19 -0
  486. package/dist/ra-core/src/util/mergeRefs.d.ts +2 -0
  487. package/dist/ra-core/src/util/mergeRefs.js +13 -0
  488. package/dist/ra-core/src/util/removeEmpty.d.ts +2 -0
  489. package/dist/ra-core/src/util/removeEmpty.js +16 -0
  490. package/dist/ra-core/src/util/removeKey.d.ts +2 -0
  491. package/dist/ra-core/src/util/removeKey.js +22 -0
  492. package/dist/ra-core/src/util/shallowEqual.d.ts +1 -0
  493. package/dist/ra-core/src/util/shallowEqual.js +29 -0
  494. package/dist/ra-core/src/util/useCheckForApplicationUpdate.d.ts +21 -0
  495. package/dist/ra-core/src/util/useCheckForApplicationUpdate.js +84 -0
  496. package/dist/ra-core/src/util/useDebouncedEvent.d.ts +8 -0
  497. package/dist/ra-core/src/util/useDebouncedEvent.js +28 -0
  498. package/dist/ra-core/src/util/useEvent.d.ts +7 -0
  499. package/dist/ra-core/src/util/useEvent.js +19 -0
  500. package/dist/ra-core/src/util/useFieldValue.d.ts +21 -0
  501. package/dist/ra-core/src/util/useFieldValue.js +27 -0
  502. package/dist/ra-core/src/util/useWhyDidYouUpdate.d.ts +12 -0
  503. package/dist/ra-core/src/util/useWhyDidYouUpdate.js +42 -0
  504. package/dist/ra-core/src/util/warning.d.ts +2 -0
  505. package/dist/ra-core/src/util/warning.js +5 -0
  506. package/dist/strato-faker-ecommerce/src/dataProvider.d.ts +2 -0
  507. package/dist/strato-faker-ecommerce/src/dataProvider.js +6 -0
  508. package/dist/strato-faker-ecommerce/src/generate.d.ts +8 -0
  509. package/dist/strato-faker-ecommerce/src/generate.js +148 -0
  510. package/dist/strato-faker-ecommerce/src/index.d.ts +3 -0
  511. package/dist/strato-faker-ecommerce/src/index.js +3 -0
  512. package/dist/strato-faker-ecommerce/src/types.d.ts +69 -0
  513. package/dist/strato-faker-ecommerce/src/types.js +1 -0
  514. package/dist/types.d.ts +1 -1
  515. package/package.json +5 -4
  516. package/src/dataProvider.ts +3 -3
  517. package/src/generate.test.ts +12 -12
  518. package/src/generate.ts +21 -14
  519. package/src/types.ts +1 -1
@@ -0,0 +1,146 @@
1
+ import { useEffect, useState } from 'react';
2
+ import get from 'lodash/get.js';
3
+ import isEqual from 'lodash/isEqual.js';
4
+ import { useFormState } from 'react-hook-form';
5
+ import { useFormGroups } from './useFormGroups';
6
+ import { useEvent } from '../../util';
7
+ /**
8
+ * Retrieve a specific form group data such as its validation status (valid/invalid) or
9
+ * or whether its inputs have been updated (dirty/pristine)
10
+ *
11
+ * @example
12
+ * import { Edit, SimpleForm, TextInput, FormGroupContextProvider, useFormGroup, minLength } from 'react-admin';
13
+ * import { Accordion, AccordionDetails, AccordionSummary, Typography } from '@mui/material';
14
+ * import ExpandMoreIcon from '@mui/icons-material/ExpandMoreIcon';
15
+ *
16
+ * const PostEdit = () => (
17
+ * <Edit>
18
+ * <SimpleForm>
19
+ * <TextInput source="title" />
20
+ * <FormGroupContextProvider name="options">
21
+ * <Accordion>
22
+ * <AccordionSummary
23
+ * expandIcon={<ExpandMoreIcon />}
24
+ * aria-controls="options-content"
25
+ * id="options-header"
26
+ * >
27
+ * <AccordionSectionTitle name="options">Options</AccordionSectionTitle>
28
+ * </AccordionSummary>
29
+ * <AccordionDetails id="options-content" aria-labelledby="options-header">
30
+ * <TextInput source="teaser" validate={minLength(20)} />
31
+ * </AccordionDetails>
32
+ * </Accordion>
33
+ * </FormGroupContextProvider>
34
+ * </SimpleForm>
35
+ * </Edit>
36
+ * );
37
+ *
38
+ * const AccordionSectionTitle = ({ children, name }) => {
39
+ * const formGroupState = useFormGroup(name);
40
+ * return (
41
+ * <Typography color={!formGroupState.isValid && formGroupState.isDirty ? 'error' : 'inherit'}>
42
+ * {children}
43
+ * </Typography>
44
+ * );
45
+ * }
46
+ *
47
+ * @param {string} name The form group name
48
+ * @returns {FormGroupState} The form group state
49
+ */
50
+ export const useFormGroup = (name) => {
51
+ const { dirtyFields, touchedFields, validatingFields, errors } = useFormState();
52
+ // dirtyFields, touchedFields, validatingFields and errors are objects with keys being the field names
53
+ // Ex: { title: true }
54
+ // However, they are not correctly serialized when using JSON.stringify
55
+ // To avoid our effects to not be triggered when they should, we extract the keys and use that as a dependency
56
+ const dirtyFieldsNames = Object.keys(dirtyFields);
57
+ const touchedFieldsNames = Object.keys(touchedFields);
58
+ const validatingFieldsNames = Object.keys(validatingFields);
59
+ const errorsNames = Object.keys(errors);
60
+ const formGroups = useFormGroups();
61
+ const [state, setState] = useState({
62
+ errors: undefined,
63
+ isDirty: false,
64
+ isTouched: false,
65
+ isValid: true,
66
+ isValidating: true,
67
+ });
68
+ const updateGroupState = useEvent(() => {
69
+ if (!formGroups)
70
+ return;
71
+ const fields = formGroups.getGroupFields(name);
72
+ const fieldStates = fields
73
+ .map(field => {
74
+ return {
75
+ name: field,
76
+ error: get(errors, field, undefined),
77
+ isDirty: get(dirtyFields, field, false) !== false,
78
+ isValid: get(errors, field, undefined) == null,
79
+ isValidating: get(validatingFields, field, undefined) == null,
80
+ isTouched: get(touchedFields, field, false) !== false,
81
+ };
82
+ })
83
+ .filter(fieldState => fieldState != undefined); // eslint-disable-line
84
+ const newState = getFormGroupState(fieldStates);
85
+ setState(oldState => {
86
+ if (!isEqual(oldState, newState)) {
87
+ return newState;
88
+ }
89
+ return oldState;
90
+ });
91
+ });
92
+ useEffect(() => {
93
+ updateGroupState();
94
+ }, [
95
+ // eslint-disable-next-line react-hooks/exhaustive-deps
96
+ JSON.stringify(dirtyFieldsNames),
97
+ // eslint-disable-next-line react-hooks/exhaustive-deps
98
+ JSON.stringify(errorsNames),
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ JSON.stringify(touchedFieldsNames),
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102
+ JSON.stringify(validatingFieldsNames),
103
+ updateGroupState,
104
+ name,
105
+ formGroups,
106
+ ]);
107
+ useEffect(() => {
108
+ if (!formGroups)
109
+ return;
110
+ // Whenever the group content changes (input are added or removed)
111
+ // we must update its state
112
+ const unsubscribe = formGroups.subscribe(name, () => {
113
+ updateGroupState();
114
+ });
115
+ return unsubscribe;
116
+ }, [formGroups, name, updateGroupState]);
117
+ return state;
118
+ };
119
+ /**
120
+ * Get the state of a form group
121
+ *
122
+ * @param {FieldState[]} fieldStates A map of field states from react-hook-form where the key is the field name.
123
+ * @returns {FormGroupState} The state of the group.
124
+ */
125
+ export const getFormGroupState = (fieldStates) => {
126
+ return fieldStates.reduce((acc, fieldState) => {
127
+ const errors = acc.errors || {};
128
+ if (fieldState.error) {
129
+ errors[fieldState.name] = fieldState.error;
130
+ }
131
+ const newState = {
132
+ isDirty: acc.isDirty || fieldState.isDirty,
133
+ errors,
134
+ isTouched: acc.isTouched || fieldState.isTouched,
135
+ isValid: acc.isValid && fieldState.isValid,
136
+ isValidating: acc.isValidating && fieldState.isValidating,
137
+ };
138
+ return newState;
139
+ }, {
140
+ isDirty: false,
141
+ errors: undefined,
142
+ isValid: true,
143
+ isTouched: false,
144
+ isValidating: false,
145
+ });
146
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Retrieve the name of the form group the consumer belongs to. May be undefined if the consumer is not inside a form group.
3
+ */
4
+ export declare const useFormGroupContext: () => string | null;
@@ -0,0 +1,9 @@
1
+ import { useContext } from 'react';
2
+ import { FormGroupContext } from './FormGroupContext';
3
+ /**
4
+ * Retrieve the name of the form group the consumer belongs to. May be undefined if the consumer is not inside a form group.
5
+ */
6
+ export const useFormGroupContext = () => {
7
+ const context = useContext(FormGroupContext);
8
+ return context;
9
+ };
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Retrieve the form groups management context. Used by inputs to register themselves into a form group.
3
+ */
4
+ export declare const useFormGroups: () => unknown;
@@ -0,0 +1,9 @@
1
+ import { useContext } from 'react';
2
+ import { FormGroupsContext } from './FormGroupsContext';
3
+ /**
4
+ * Retrieve the form groups management context. Used by inputs to register themselves into a form group.
5
+ */
6
+ export const useFormGroups = () => {
7
+ const context = useContext(FormGroupsContext);
8
+ return context;
9
+ };
@@ -0,0 +1,14 @@
1
+ export * from './choices';
2
+ export * from './Form';
3
+ export * from './FormDataConsumer';
4
+ export * from './groups';
5
+ export * from './useApplyInputDefaultValues';
6
+ export * from './useAugmentedForm';
7
+ export * from './useInput';
8
+ export * from './useRecordFromLocation';
9
+ export * from './useSuggestions';
10
+ export * from './useWarnWhenUnsavedChanges';
11
+ export * from './validation';
12
+ export * from './WarnWhenUnsavedChanges';
13
+ export * from './FilterLiveForm';
14
+ export * from './useFormIsDirty';
@@ -0,0 +1,14 @@
1
+ export * from './choices';
2
+ export * from './Form';
3
+ export * from './FormDataConsumer';
4
+ export * from './groups';
5
+ export * from './useApplyInputDefaultValues';
6
+ export * from './useAugmentedForm';
7
+ export * from './useInput';
8
+ export * from './useRecordFromLocation';
9
+ export * from './useSuggestions';
10
+ export * from './useWarnWhenUnsavedChanges';
11
+ export * from './validation';
12
+ export * from './WarnWhenUnsavedChanges';
13
+ export * from './FilterLiveForm';
14
+ export * from './useFormIsDirty';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Remove empty strings from form state
3
+ *
4
+ * @example
5
+ * sanitizeEmptyValues({ foo: '', bar: 'baz' }) // { bar: 'baz' }
6
+ */
7
+ export declare const sanitizeEmptyValues: (values: any, record?: any) => any;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Remove empty strings from form state
3
+ *
4
+ * @example
5
+ * sanitizeEmptyValues({ foo: '', bar: 'baz' }) // { bar: 'baz' }
6
+ */
7
+ export const sanitizeEmptyValues = (values, record = {}) => {
8
+ const sanitizedValues = {};
9
+ Object.keys(values).forEach(key => {
10
+ if (values[key] == null || values[key] === '') {
11
+ if (record.hasOwnProperty(key)) {
12
+ // user has emptied a field, make the value null
13
+ sanitizedValues[key] = null;
14
+ }
15
+ else {
16
+ // user has emptied a field, but the initial value was undefined
17
+ // so we don't include it in the sanitized values
18
+ }
19
+ }
20
+ else {
21
+ // this is a non-empty value, so we include it in the sanitized values
22
+ sanitizedValues[key] = values[key];
23
+ }
24
+ });
25
+ return sanitizedValues;
26
+ };
@@ -0,0 +1,19 @@
1
+ import { FieldValues, UseFieldArrayReturn } from 'react-hook-form';
2
+ import { InputProps } from './useInput';
3
+ interface StandardInput {
4
+ inputProps: Partial<InputProps> & {
5
+ source: string;
6
+ };
7
+ isArrayInput?: undefined;
8
+ fieldArrayInputControl?: undefined;
9
+ }
10
+ interface ArrayInput {
11
+ inputProps: Partial<InputProps> & {
12
+ source: string;
13
+ };
14
+ isArrayInput: true;
15
+ fieldArrayInputControl: UseFieldArrayReturn<FieldValues, string, 'id'>;
16
+ }
17
+ type Props = StandardInput | ArrayInput;
18
+ export declare const useApplyInputDefaultValues: ({ inputProps, isArrayInput, fieldArrayInputControl, }: Props) => void;
19
+ export {};
@@ -0,0 +1,71 @@
1
+ import { useEffect, useRef } from 'react';
2
+ import { useFormContext, } from 'react-hook-form';
3
+ import get from 'lodash/get.js';
4
+ import { useRecordContext } from '../controller';
5
+ import { useWrappedSource } from '../core';
6
+ /*
7
+ * This hook updates the input with the default value if default value is present
8
+ * and field input is not already populated or dirty
9
+ */
10
+ export const useApplyInputDefaultValues = ({ inputProps, isArrayInput, fieldArrayInputControl, }) => {
11
+ const { defaultValue, source, disabled } = inputProps;
12
+ const finalSource = useWrappedSource(source);
13
+ const record = useRecordContext(inputProps);
14
+ const { getValues, resetField, reset, subscribe } = useFormContext();
15
+ const recordValue = get(record, finalSource);
16
+ const formValue = get(getValues(), finalSource);
17
+ const isDirty = useRef(undefined);
18
+ useEffect(() => {
19
+ return subscribe({
20
+ // Even though we only need dirtyFields, we subscribe to values as well to
21
+ // ensure we properly receive dirtyFields updates for newly added items in an ArrayInput
22
+ formState: { values: true, dirtyFields: true },
23
+ callback: ({ dirtyFields }) => {
24
+ isDirty.current = get(dirtyFields ?? {}, finalSource, false);
25
+ },
26
+ });
27
+ }, [finalSource, subscribe]);
28
+ useEffect(() => {
29
+ if (defaultValue == null ||
30
+ formValue != null ||
31
+ // When the input is disabled, its value may always be undefined, no matter the default value.
32
+ // This prevents from trying to reset the value indefinitely.
33
+ disabled ||
34
+ // We check strictly for undefined to avoid setting default value
35
+ // when the field is null
36
+ recordValue !== undefined ||
37
+ isDirty.current === true) {
38
+ return;
39
+ }
40
+ // Side note: For Array Input but checked for all to avoid possible regression
41
+ // Since we use get(record, source), if source is like foo.23.bar,
42
+ // this effect will run. However we only want to set the default value
43
+ // for the subfield bar if the record actually has a value for foo.23
44
+ const pathContainsIndex = finalSource
45
+ .split('.')
46
+ .some(pathPart => numericRegex.test(pathPart));
47
+ if (pathContainsIndex) {
48
+ const parentPath = finalSource.split('.').slice(0, -1).join('.');
49
+ const parentValue = get(getValues(), parentPath);
50
+ if (parentValue == null) {
51
+ // the parent is undefined, so we don't want to set the default value
52
+ return;
53
+ }
54
+ }
55
+ if (isArrayInput) {
56
+ if (!fieldArrayInputControl) {
57
+ throw new Error('useApplyInputDefaultValues: No fieldArrayInputControl passed in props for array input usage');
58
+ }
59
+ // We need to update inputs nested in array using react hook forms
60
+ // own array controller rather then the generic reset to prevent control losing
61
+ // context of the nested inputs
62
+ fieldArrayInputControl.replace(defaultValue);
63
+ // resets the form so that control no longer sees the form as dirty after
64
+ // defaults applied
65
+ reset({}, { keepValues: true });
66
+ return;
67
+ }
68
+ resetField(finalSource, { defaultValue });
69
+ });
70
+ };
71
+ const numericRegex = /^\d+$/;
@@ -0,0 +1,32 @@
1
+ import { BaseSyntheticEvent } from 'react';
2
+ import { FieldValues, SubmitHandler, UseFormProps } from 'react-hook-form';
3
+ import { RaRecord } from '../types';
4
+ import { SaveHandler } from '../controller';
5
+ import { ValidateForm } from './validation/getSimpleValidationResolver';
6
+ /**
7
+ * Wrapper around react-hook-form's useForm
8
+ *
9
+ * This hook adds the following features to react-hook-form's useForm:
10
+ *
11
+ * - form initialization based on RecordContext
12
+ * - validation based on a validate function
13
+ * - sanitization of empty values
14
+ * - notification on invalid form
15
+ * - stop form submission event propagation
16
+ */
17
+ export declare const useAugmentedForm: <RecordType = any>(props: UseAugmentedFormProps<RecordType>) => {
18
+ form: import("react-hook-form").UseFormReturn<any, any, FieldValues>;
19
+ handleSubmit: (values: any, event: any) => Promise<void>;
20
+ formHandleSubmit: (event: BaseSyntheticEvent) => void;
21
+ };
22
+ export type UseAugmentedFormProps<RecordType = any> = UseFormOwnProps<RecordType> & Omit<UseFormProps, 'onSubmit'> & {
23
+ validate?: ValidateForm;
24
+ };
25
+ export interface UseFormOwnProps<RecordType = any> {
26
+ defaultValues?: any;
27
+ formRootPathname?: string;
28
+ record?: Partial<RaRecord>;
29
+ onSubmit?: SubmitHandler<FieldValues> | SaveHandler<RecordType>;
30
+ sanitizeEmptyValues?: boolean;
31
+ disableInvalidFormNotification?: boolean;
32
+ }
@@ -0,0 +1,101 @@
1
+ import { useCallback, useEffect, useMemo, useRef, } from 'react';
2
+ import { useForm, } from 'react-hook-form';
3
+ import merge from 'lodash/merge.js';
4
+ import { useRecordContext, useSaveContext } from '../controller';
5
+ import getFormInitialValues from './getFormInitialValues';
6
+ import { getSimpleValidationResolver, } from './validation/getSimpleValidationResolver';
7
+ import { setSubmissionErrors } from './validation/setSubmissionErrors';
8
+ import { useNotifyIsFormInvalid } from './validation/useNotifyIsFormInvalid';
9
+ import { sanitizeEmptyValues as sanitizeValues } from './sanitizeEmptyValues';
10
+ import { useRecordFromLocation } from './useRecordFromLocation';
11
+ /**
12
+ * Wrapper around react-hook-form's useForm
13
+ *
14
+ * This hook adds the following features to react-hook-form's useForm:
15
+ *
16
+ * - form initialization based on RecordContext
17
+ * - validation based on a validate function
18
+ * - sanitization of empty values
19
+ * - notification on invalid form
20
+ * - stop form submission event propagation
21
+ */
22
+ export const useAugmentedForm = (props) => {
23
+ const { criteriaMode = 'firstError', defaultValues, formRootPathname, resolver, resetOptions, reValidateMode = 'onChange', onSubmit, sanitizeEmptyValues, validate, disableInvalidFormNotification, ...rest } = props;
24
+ const saveContext = useSaveContext();
25
+ const record = useRecordContext(props);
26
+ const defaultValuesIncludingRecord = useMemo(() => getFormInitialValues(defaultValues, record),
27
+ // eslint-disable-next-line
28
+ [
29
+ // eslint-disable-next-line
30
+ JSON.stringify({
31
+ defaultValues: typeof defaultValues === 'function'
32
+ ? 'function'
33
+ : defaultValues,
34
+ record,
35
+ }),
36
+ ]);
37
+ const finalResolver = resolver
38
+ ? resolver
39
+ : validate
40
+ ? getSimpleValidationResolver(validate)
41
+ : undefined;
42
+ const form = useForm({
43
+ criteriaMode,
44
+ defaultValues: defaultValuesIncludingRecord,
45
+ reValidateMode,
46
+ resolver: finalResolver,
47
+ ...rest,
48
+ });
49
+ const formRef = useRef(form);
50
+ const { reset, formState } = form;
51
+ const { isReady } = formState;
52
+ const previousRecordId = useRef(record?.id);
53
+ useEffect(() => {
54
+ const recordIdChanged = record?.id !== previousRecordId.current;
55
+ previousRecordId.current = record?.id;
56
+ reset(defaultValuesIncludingRecord, recordIdChanged ? undefined : resetOptions);
57
+ }, [defaultValuesIncludingRecord, reset, resetOptions, record?.id]);
58
+ // notify on invalid form
59
+ useNotifyIsFormInvalid(form.control, !disableInvalidFormNotification);
60
+ const recordFromLocation = useRecordFromLocation();
61
+ const recordFromLocationApplied = useRef(false);
62
+ useEffect(() => {
63
+ if (!isReady)
64
+ return;
65
+ if (recordFromLocation && !recordFromLocationApplied.current) {
66
+ reset(merge({}, defaultValuesIncludingRecord, recordFromLocation), {
67
+ keepDefaultValues: true,
68
+ });
69
+ recordFromLocationApplied.current = true;
70
+ }
71
+ }, [defaultValuesIncludingRecord, recordFromLocation, reset, isReady]);
72
+ // submit callbacks
73
+ const handleSubmit = useCallback(async (values, event) => {
74
+ let errors;
75
+ const finalValues = sanitizeEmptyValues
76
+ ? sanitizeValues(values, record)
77
+ : values;
78
+ if (onSubmit) {
79
+ errors = await onSubmit(finalValues, event);
80
+ }
81
+ if (onSubmit == null && saveContext?.save) {
82
+ errors = await saveContext.save(finalValues, event);
83
+ }
84
+ if (errors != null) {
85
+ setSubmissionErrors(errors, formRef.current.setError);
86
+ }
87
+ }, [onSubmit, saveContext, sanitizeEmptyValues, record]);
88
+ const formHandleSubmit = useCallback((event) => {
89
+ if (!event.defaultPrevented) {
90
+ // Prevent outer forms to receive the event
91
+ event.stopPropagation();
92
+ form.handleSubmit(handleSubmit)(event);
93
+ }
94
+ return;
95
+ }, [form, handleSubmit]);
96
+ return {
97
+ form,
98
+ handleSubmit,
99
+ formHandleSubmit,
100
+ };
101
+ };
@@ -0,0 +1,4 @@
1
+ export declare const useFormIsDirty: () => boolean;
2
+ export declare const checkHasDirtyFields: (dirtyFields: Partial<Readonly<{
3
+ [x: string]: any;
4
+ }>>) => boolean;
@@ -0,0 +1,39 @@
1
+ import { useFormState } from 'react-hook-form';
2
+ import isEmpty from 'lodash/isEmpty.js';
3
+ // useFormState().isDirty might differ from useFormState().dirtyFields (https://github.com/react-hook-form/react-hook-form/issues/4740)
4
+ export const useFormIsDirty = () => {
5
+ const { dirtyFields } = useFormState();
6
+ return checkHasDirtyFields(dirtyFields);
7
+ };
8
+ export const checkHasDirtyFields = (dirtyFields) => {
9
+ // dirtyFields can contains simple keys with boolean values, nested objects or arrays
10
+ // We must ignore values that are false
11
+ return Object.values(dirtyFields).some(value => {
12
+ if (typeof value === 'boolean') {
13
+ return value;
14
+ }
15
+ else if (Array.isArray(value)) {
16
+ // Some arrays contain only booleans (scalar arrays), some arrays contain objects (object arrays)
17
+ for (const item of value) {
18
+ if (item === true) {
19
+ return true;
20
+ }
21
+ // FIXME: because we currently don't set default values correctly for arrays,
22
+ // new items are either empty objects, or undefined in dirtyFields. Consider them as dirty.
23
+ if ((typeof item === 'object' && isEmpty(item)) ||
24
+ item === undefined) {
25
+ return true;
26
+ }
27
+ if (typeof item === 'object' &&
28
+ item !== null &&
29
+ checkHasDirtyFields(item)) {
30
+ return true;
31
+ }
32
+ }
33
+ }
34
+ else if (typeof value === 'object' && value !== null) {
35
+ return checkHasDirtyFields(value);
36
+ }
37
+ return false;
38
+ });
39
+ };
@@ -0,0 +1,33 @@
1
+ import { FocusEvent, ReactNode } from 'react';
2
+ import { ControllerFieldState, ControllerRenderProps, UseControllerProps, UseControllerReturn, UseFormStateReturn } from 'react-hook-form';
3
+ import type { EditorEvents } from '@tiptap/react';
4
+ import { Validator } from './validation';
5
+ export declare const useInput: <ValueType = any>(props: InputProps<ValueType>) => UseInputValue;
6
+ export type InputProps<ValueType = any> = Omit<UseControllerProps, 'name' | 'defaultValue' | 'rules'> & Partial<UseControllerReturn> & {
7
+ alwaysOn?: any;
8
+ defaultValue?: any;
9
+ format?: (value: ValueType) => any;
10
+ id?: string;
11
+ isRequired?: boolean;
12
+ label?: ReactNode;
13
+ helperText?: ReactNode;
14
+ name?: string;
15
+ onBlur?: (...event: any[]) => void;
16
+ onChange?: (...event: any[]) => void;
17
+ parse?: (value: any) => ValueType;
18
+ type?: string;
19
+ resource?: string;
20
+ source: string;
21
+ validate?: Validator | Validator[];
22
+ readOnly?: boolean;
23
+ disabled?: boolean;
24
+ };
25
+ export type UseInputValue = {
26
+ id: string;
27
+ isRequired: boolean;
28
+ field: Omit<ControllerRenderProps, 'onBlur'> & {
29
+ onBlur: (event?: FocusEvent<HTMLElement> | EditorEvents['blur']) => void;
30
+ };
31
+ formState: UseFormStateReturn<Record<string, string>>;
32
+ fieldState: ControllerFieldState;
33
+ };
@@ -0,0 +1,100 @@
1
+ import { useEffect, useId } from 'react';
2
+ import { useController, } from 'react-hook-form';
3
+ import get from 'lodash/get.js';
4
+ import { useRecordContext } from '../controller';
5
+ import { composeValidators, isRequired } from './validation';
6
+ import { useFormGroupContext, useFormGroups } from './groups';
7
+ import { useApplyInputDefaultValues } from './useApplyInputDefaultValues';
8
+ import { useEvent } from '../util';
9
+ import { useWrappedSource } from '../core';
10
+ // replace null or undefined values by empty string to avoid controlled/uncontrolled input warning
11
+ const defaultFormat = (value) => (value == null ? '' : value);
12
+ // parse empty string into null as it's more suitable for a majority of backends
13
+ const defaultParse = (value) => (value === '' ? null : value);
14
+ export const useInput = (props) => {
15
+ const { defaultValue, format = defaultFormat, id, isRequired: isRequiredOption, name, onBlur: initialOnBlur, onChange: initialOnChange, parse: parseProp = defaultParse, source, validate, ...options } = props;
16
+ const finalSource = useWrappedSource(source);
17
+ const finalName = name || finalSource;
18
+ const formGroupName = useFormGroupContext();
19
+ const formGroups = useFormGroups();
20
+ const record = useRecordContext();
21
+ // @ts-ignore
22
+ const parse = useEvent(parseProp);
23
+ const defaultId = useId();
24
+ if (!finalName && process.env.NODE_ENV === 'development') {
25
+ console.warn('Input components require either a source or a name prop.');
26
+ }
27
+ useEffect(() => {
28
+ if (!formGroups || formGroupName == null) {
29
+ return;
30
+ }
31
+ formGroups.registerField(finalSource, formGroupName);
32
+ return () => {
33
+ formGroups.unregisterField(finalSource, formGroupName);
34
+ };
35
+ }, [formGroups, formGroupName, finalSource]);
36
+ const sanitizedValidate = Array.isArray(validate)
37
+ ? composeValidators(validate)
38
+ : validate;
39
+ // Fetch the defaultValue from the record if available or apply the provided defaultValue.
40
+ // This ensures dynamically added inputs have their value set correctly (ArrayInput for example).
41
+ // We don't do this for the form level defaultValues so that it works as it should in react-hook-form
42
+ // (i.e. field level defaultValue override form level defaultValues for this field).
43
+ const { field: controllerField, fieldState, formState, } = useController({
44
+ name: finalName,
45
+ defaultValue: get(record, finalSource, defaultValue),
46
+ rules: {
47
+ validate: async (value, values) => {
48
+ if (!sanitizedValidate)
49
+ return true;
50
+ const error = await sanitizedValidate(value, values, {
51
+ ...props,
52
+ finalSource,
53
+ });
54
+ if (!error)
55
+ return true;
56
+ // react-hook-form expects errors to be plain strings but our validators can return objects
57
+ // that have message and args.
58
+ // To avoid double translation for users that validate with a schema instead of our validators
59
+ // we use a special format for our validators errors.
60
+ // The ValidationError component will check for this format and extract the message and args
61
+ // to translate.
62
+ return `@@react-admin@@${JSON.stringify(error)}`;
63
+ },
64
+ },
65
+ ...options,
66
+ });
67
+ // Because our forms may receive an asynchronously loaded record for instance,
68
+ // they may reset their default values which would override the input default value.
69
+ // This hook ensures that the input default value is applied when a new record is loaded but has
70
+ // no value for the input.
71
+ useApplyInputDefaultValues({ inputProps: props });
72
+ const onBlur = useEvent((...event) => {
73
+ controllerField.onBlur();
74
+ if (initialOnBlur) {
75
+ initialOnBlur(...event);
76
+ }
77
+ });
78
+ const onChange = useEvent((...event) => {
79
+ const eventOrValue = (props.type === 'checkbox' && event[0]?.target?.value === 'on'
80
+ ? event[0].target.checked
81
+ : event[0]?.target?.value ?? event[0]);
82
+ controllerField.onChange(parse ? parse(eventOrValue) : eventOrValue);
83
+ if (initialOnChange) {
84
+ initialOnChange(...event);
85
+ }
86
+ });
87
+ const field = {
88
+ ...controllerField,
89
+ value: format ? format(controllerField.value) : controllerField.value,
90
+ onBlur,
91
+ onChange,
92
+ };
93
+ return {
94
+ id: id || defaultId,
95
+ field,
96
+ fieldState,
97
+ formState,
98
+ isRequired: isRequiredOption || isRequired(validate),
99
+ };
100
+ };