@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.
- package/dist/dataProvider.js +1 -2
- package/dist/generate.d.ts +2 -1
- package/dist/generate.js +15 -8
- package/dist/ra-core/src/auth/LogoutOnMount.d.ts +8 -0
- package/dist/ra-core/src/auth/LogoutOnMount.js +16 -0
- package/dist/ra-core/src/auth/addRefreshAuthToAuthProvider.d.ts +22 -0
- package/dist/ra-core/src/auth/addRefreshAuthToAuthProvider.js +41 -0
- package/dist/ra-core/src/auth/addRefreshAuthToDataProvider.d.ts +21 -0
- package/dist/ra-core/src/auth/addRefreshAuthToDataProvider.js +30 -0
- package/dist/ra-core/src/auth/convertLegacyAuthProvider.d.ts +12 -0
- package/dist/ra-core/src/auth/convertLegacyAuthProvider.js +19 -0
- package/dist/ra-core/src/auth/index.d.ts +27 -0
- package/dist/ra-core/src/auth/index.js +34 -0
- package/dist/ra-core/src/auth/types.d.ts +7 -0
- package/dist/ra-core/src/auth/types.js +5 -0
- package/dist/ra-core/src/auth/useAuthProvider.d.ts +10 -0
- package/dist/ra-core/src/auth/useAuthProvider.js +11 -0
- package/dist/ra-core/src/auth/useAuthState.d.ts +48 -0
- package/dist/ra-core/src/auth/useAuthState.js +171 -0
- package/dist/ra-core/src/auth/useAuthenticated.d.ts +36 -0
- package/dist/ra-core/src/auth/useAuthenticated.js +34 -0
- package/dist/ra-core/src/auth/useCanAccess.d.ts +56 -0
- package/dist/ra-core/src/auth/useCanAccess.js +108 -0
- package/dist/ra-core/src/auth/useCanAccessCallback.d.ts +39 -0
- package/dist/ra-core/src/auth/useCanAccessCallback.js +45 -0
- package/dist/ra-core/src/auth/useCanAccessResources.d.ts +67 -0
- package/dist/ra-core/src/auth/useCanAccessResources.js +92 -0
- package/dist/ra-core/src/auth/useCheckAuth.d.ts +48 -0
- package/dist/ra-core/src/auth/useCheckAuth.js +76 -0
- package/dist/ra-core/src/auth/useGetIdentity.d.ts +41 -0
- package/dist/ra-core/src/auth/useGetIdentity.js +86 -0
- package/dist/ra-core/src/auth/useGetPermissions.d.ts +41 -0
- package/dist/ra-core/src/auth/useGetPermissions.js +47 -0
- package/dist/ra-core/src/auth/useHandleAuthCallback.d.ts +20 -0
- package/dist/ra-core/src/auth/useHandleAuthCallback.js +83 -0
- package/dist/ra-core/src/auth/useIsAuthPending.d.ts +13 -0
- package/dist/ra-core/src/auth/useIsAuthPending.js +30 -0
- package/dist/ra-core/src/auth/useLogin.d.ts +34 -0
- package/dist/ra-core/src/auth/useLogin.js +78 -0
- package/dist/ra-core/src/auth/useLogout.d.ts +31 -0
- package/dist/ra-core/src/auth/useLogout.js +117 -0
- package/dist/ra-core/src/auth/useLogoutIfAccessDenied.d.ts +42 -0
- package/dist/ra-core/src/auth/useLogoutIfAccessDenied.js +111 -0
- package/dist/ra-core/src/auth/usePermissions.d.ts +41 -0
- package/dist/ra-core/src/auth/usePermissions.js +123 -0
- package/dist/ra-core/src/controller/button/index.d.ts +7 -0
- package/dist/ra-core/src/controller/button/index.js +7 -0
- package/dist/ra-core/src/controller/button/useBulkDeleteController.d.ts +14 -0
- package/dist/ra-core/src/controller/button/useBulkDeleteController.js +66 -0
- package/dist/ra-core/src/controller/create/index.d.ts +6 -0
- package/dist/ra-core/src/controller/create/index.js +6 -0
- package/dist/ra-core/src/controller/create/useCreateController.d.ts +50 -0
- package/dist/ra-core/src/controller/create/useCreateController.js +149 -0
- package/dist/ra-core/src/controller/edit/index.d.ts +6 -0
- package/dist/ra-core/src/controller/edit/index.js +6 -0
- package/dist/ra-core/src/controller/edit/useEditController.d.ts +72 -0
- package/dist/ra-core/src/controller/edit/useEditController.js +206 -0
- package/dist/ra-core/src/controller/field/index.d.ts +12 -0
- package/dist/ra-core/src/controller/field/index.js +12 -0
- package/dist/ra-core/src/controller/field/sanitizeFieldRestProps.d.ts +1 -0
- package/dist/ra-core/src/controller/field/sanitizeFieldRestProps.js +1 -0
- package/dist/ra-core/src/controller/field/types.d.ts +28 -0
- package/dist/ra-core/src/controller/field/types.js +1 -0
- package/dist/ra-core/src/controller/field/useReferenceArrayFieldController.d.ts +39 -0
- package/dist/ra-core/src/controller/field/useReferenceArrayFieldController.js +82 -0
- package/dist/ra-core/src/controller/field/useReferenceFieldController.d.ts +14 -0
- package/dist/ra-core/src/controller/field/useReferenceFieldController.js +31 -0
- package/dist/ra-core/src/controller/field/useReferenceManyFieldController.d.ts +49 -0
- package/dist/ra-core/src/controller/field/useReferenceManyFieldController.js +264 -0
- package/dist/ra-core/src/controller/index.d.ts +17 -0
- package/dist/ra-core/src/controller/index.js +16 -0
- package/dist/ra-core/src/controller/input/ArrayInputContext.d.ts +9 -0
- package/dist/ra-core/src/controller/input/ArrayInputContext.js +8 -0
- package/dist/ra-core/src/controller/input/SimpleFormIteratorContext.d.ts +15 -0
- package/dist/ra-core/src/controller/input/SimpleFormIteratorContext.js +8 -0
- package/dist/ra-core/src/controller/input/SimpleFormIteratorItemContext.d.ts +13 -0
- package/dist/ra-core/src/controller/input/SimpleFormIteratorItemContext.js +8 -0
- package/dist/ra-core/src/controller/input/index.d.ts +17 -0
- package/dist/ra-core/src/controller/input/index.js +17 -0
- package/dist/ra-core/src/controller/input/referenceDataStatus.d.ts +32 -0
- package/dist/ra-core/src/controller/input/referenceDataStatus.js +74 -0
- package/dist/ra-core/src/controller/input/sanitizeInputRestProps.d.ts +1 -0
- package/dist/ra-core/src/controller/input/sanitizeInputRestProps.js +1 -0
- package/dist/ra-core/src/controller/input/types.d.ts +3 -0
- package/dist/ra-core/src/controller/input/types.js +1 -0
- package/dist/ra-core/src/controller/input/useArrayInput.d.ts +8 -0
- package/dist/ra-core/src/controller/input/useArrayInput.js +29 -0
- package/dist/ra-core/src/controller/input/useGetArrayInputNewItemDefaults.d.ts +3 -0
- package/dist/ra-core/src/controller/input/useGetArrayInputNewItemDefaults.js +37 -0
- package/dist/ra-core/src/controller/input/useReferenceArrayInputController.d.ts +48 -0
- package/dist/ra-core/src/controller/input/useReferenceArrayInputController.js +137 -0
- package/dist/ra-core/src/controller/input/useReferenceInputController.d.ts +54 -0
- package/dist/ra-core/src/controller/input/useReferenceInputController.js +208 -0
- package/dist/ra-core/src/controller/input/useReferenceParams.d.ts +106 -0
- package/dist/ra-core/src/controller/input/useReferenceParams.js +226 -0
- package/dist/ra-core/src/controller/input/useSimpleFormIterator.d.ts +7 -0
- package/dist/ra-core/src/controller/input/useSimpleFormIterator.js +15 -0
- package/dist/ra-core/src/controller/input/useSimpleFormIteratorItem.d.ts +7 -0
- package/dist/ra-core/src/controller/input/useSimpleFormIteratorItem.js +15 -0
- package/dist/ra-core/src/controller/list/InfinitePaginationContext.d.ts +25 -0
- package/dist/ra-core/src/controller/list/InfinitePaginationContext.js +32 -0
- package/dist/ra-core/src/controller/list/index.d.ts +30 -0
- package/dist/ra-core/src/controller/list/index.js +30 -0
- package/dist/ra-core/src/controller/list/queryReducer.d.ts +45 -0
- package/dist/ra-core/src/controller/list/queryReducer.js +85 -0
- package/dist/ra-core/src/controller/list/useFilterContext.d.ts +2 -0
- package/dist/ra-core/src/controller/list/useFilterContext.js +5 -0
- package/dist/ra-core/src/controller/list/useInfiniteListController.d.ts +44 -0
- package/dist/ra-core/src/controller/list/useInfiniteListController.js +175 -0
- package/dist/ra-core/src/controller/list/useInfinitePaginationContext.d.ts +16 -0
- package/dist/ra-core/src/controller/list/useInfinitePaginationContext.js +17 -0
- package/dist/ra-core/src/controller/list/useList.d.ts +55 -0
- package/dist/ra-core/src/controller/list/useList.js +223 -0
- package/dist/ra-core/src/controller/list/useListContext.d.ts +59 -0
- package/dist/ra-core/src/controller/list/useListContext.js +65 -0
- package/dist/ra-core/src/controller/list/useListContextWithProps.d.ts +44 -0
- package/dist/ra-core/src/controller/list/useListContextWithProps.js +84 -0
- package/dist/ra-core/src/controller/list/useListController.d.ts +296 -0
- package/dist/ra-core/src/controller/list/useListController.js +234 -0
- package/dist/ra-core/src/controller/list/useListFilterContext.d.ts +11 -0
- package/dist/ra-core/src/controller/list/useListFilterContext.js +18 -0
- package/dist/ra-core/src/controller/list/useListPaginationContext.d.ts +12 -0
- package/dist/ra-core/src/controller/list/useListPaginationContext.js +19 -0
- package/dist/ra-core/src/controller/list/useListParams.d.ts +116 -0
- package/dist/ra-core/src/controller/list/useListParams.js +281 -0
- package/dist/ra-core/src/controller/list/useListSortContext.d.ts +12 -0
- package/dist/ra-core/src/controller/list/useListSortContext.js +19 -0
- package/dist/ra-core/src/controller/list/useRecordSelection.d.ts +32 -0
- package/dist/ra-core/src/controller/list/useRecordSelection.js +93 -0
- package/dist/ra-core/src/controller/list/useSavedQueries.d.ts +14 -0
- package/dist/ra-core/src/controller/list/useSavedQueries.js +29 -0
- package/dist/ra-core/src/controller/list/useUnselect.d.ts +10 -0
- package/dist/ra-core/src/controller/list/useUnselect.js +18 -0
- package/dist/ra-core/src/controller/list/useUnselectAll.d.ts +9 -0
- package/dist/ra-core/src/controller/list/useUnselectAll.js +18 -0
- package/dist/ra-core/src/controller/record/index.d.ts +5 -0
- package/dist/ra-core/src/controller/record/index.js +5 -0
- package/dist/ra-core/src/controller/record/useRecordContext.d.ts +34 -0
- package/dist/ra-core/src/controller/record/useRecordContext.js +36 -0
- package/dist/ra-core/src/controller/saveContext/SaveContext.d.ts +20 -0
- package/dist/ra-core/src/controller/saveContext/SaveContext.js +2 -0
- package/dist/ra-core/src/controller/saveContext/index.d.ts +6 -0
- package/dist/ra-core/src/controller/saveContext/index.js +6 -0
- package/dist/ra-core/src/controller/saveContext/useMutationMiddlewares.d.ts +39 -0
- package/dist/ra-core/src/controller/saveContext/useMutationMiddlewares.js +79 -0
- package/dist/ra-core/src/controller/saveContext/usePickSaveContext.d.ts +5 -0
- package/dist/ra-core/src/controller/saveContext/usePickSaveContext.js +25 -0
- package/dist/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.d.ts +6 -0
- package/dist/ra-core/src/controller/saveContext/useRegisterMutationMiddleware.js +18 -0
- package/dist/ra-core/src/controller/saveContext/useSaveContext.d.ts +14 -0
- package/dist/ra-core/src/controller/saveContext/useSaveContext.js +17 -0
- package/dist/ra-core/src/controller/show/index.d.ts +6 -0
- package/dist/ra-core/src/controller/show/index.js +6 -0
- package/dist/ra-core/src/controller/show/useShowController.d.ts +75 -0
- package/dist/ra-core/src/controller/show/useShowController.js +110 -0
- package/dist/ra-core/src/controller/useFilterState.d.ts +46 -0
- package/dist/ra-core/src/controller/useFilterState.js +70 -0
- package/dist/ra-core/src/controller/usePaginationState.d.ts +33 -0
- package/dist/ra-core/src/controller/usePaginationState.js +45 -0
- package/dist/ra-core/src/controller/usePrevNextController.d.ts +127 -0
- package/dist/ra-core/src/controller/usePrevNextController.js +215 -0
- package/dist/ra-core/src/controller/useReference.d.ts +49 -0
- package/dist/ra-core/src/controller/useReference.js +42 -0
- package/dist/ra-core/src/controller/useSortState.d.ts +61 -0
- package/dist/ra-core/src/controller/useSortState.js +96 -0
- package/dist/ra-core/src/core/DefaultTitleContext.d.ts +15 -0
- package/dist/ra-core/src/core/DefaultTitleContext.js +15 -0
- package/dist/ra-core/src/core/HasDashboardContext.d.ts +21 -0
- package/dist/ra-core/src/core/HasDashboardContext.js +22 -0
- package/dist/ra-core/src/core/ResourceContext.d.ts +19 -0
- package/dist/ra-core/src/core/ResourceContext.js +19 -0
- package/dist/ra-core/src/core/UserMenuContext.d.ts +34 -0
- package/dist/ra-core/src/core/UserMenuContext.js +28 -0
- package/dist/ra-core/src/core/index.d.ts +27 -0
- package/dist/ra-core/src/core/index.js +27 -0
- package/dist/ra-core/src/core/useGetRecordRepresentation.d.ts +13 -0
- package/dist/ra-core/src/core/useGetRecordRepresentation.js +44 -0
- package/dist/ra-core/src/core/useGetResourceLabel.d.ts +22 -0
- package/dist/ra-core/src/core/useGetResourceLabel.js +42 -0
- package/dist/ra-core/src/core/useIsOffline.d.ts +7 -0
- package/dist/ra-core/src/core/useIsOffline.js +18 -0
- package/dist/ra-core/src/core/useResourceContext.d.ts +36 -0
- package/dist/ra-core/src/core/useResourceContext.js +38 -0
- package/dist/ra-core/src/core/useResourceDefinition.d.ts +31 -0
- package/dist/ra-core/src/core/useResourceDefinition.js +48 -0
- package/dist/ra-core/src/core/useResourceDefinitionContext.d.ts +1 -0
- package/dist/ra-core/src/core/useResourceDefinitionContext.js +3 -0
- package/dist/ra-core/src/core/useResourceDefinitions.d.ts +21 -0
- package/dist/ra-core/src/core/useResourceDefinitions.js +20 -0
- package/dist/ra-core/src/core/useUserMenu.d.ts +28 -0
- package/dist/ra-core/src/core/useUserMenu.js +30 -0
- package/dist/ra-core/src/core/useWrappedSource.d.ts +11 -0
- package/dist/ra-core/src/core/useWrappedSource.js +15 -0
- package/dist/ra-core/src/dataProvider/DataProviderContext.d.ts +3 -0
- package/dist/ra-core/src/dataProvider/DataProviderContext.js +4 -0
- package/dist/ra-core/src/dataProvider/HttpError.d.ts +6 -0
- package/dist/ra-core/src/dataProvider/HttpError.js +19 -0
- package/dist/ra-core/src/dataProvider/combineDataProviders.d.ts +21 -0
- package/dist/ra-core/src/dataProvider/combineDataProviders.js +32 -0
- package/dist/ra-core/src/dataProvider/convertLegacyDataProvider.d.ts +12 -0
- package/dist/ra-core/src/dataProvider/convertLegacyDataProvider.js +40 -0
- package/dist/ra-core/src/dataProvider/dataFetchActions.d.ts +15 -0
- package/dist/ra-core/src/dataProvider/dataFetchActions.js +49 -0
- package/dist/ra-core/src/dataProvider/defaultDataProvider.d.ts +2 -0
- package/dist/ra-core/src/dataProvider/defaultDataProvider.js +12 -0
- package/dist/ra-core/src/dataProvider/fetch.d.ts +32 -0
- package/dist/ra-core/src/dataProvider/fetch.js +78 -0
- package/dist/ra-core/src/dataProvider/index.d.ts +34 -0
- package/dist/ra-core/src/dataProvider/index.js +33 -0
- package/dist/ra-core/src/dataProvider/populateQueryCache.d.ts +22 -0
- package/dist/ra-core/src/dataProvider/populateQueryCache.js +30 -0
- package/dist/ra-core/src/dataProvider/testDataProvider.d.ts +2 -0
- package/dist/ra-core/src/dataProvider/testDataProvider.js +41 -0
- package/dist/ra-core/src/dataProvider/undo/index.d.ts +6 -0
- package/dist/ra-core/src/dataProvider/undo/index.js +6 -0
- package/dist/ra-core/src/dataProvider/undo/types.d.ts +3 -0
- package/dist/ra-core/src/dataProvider/undo/types.js +1 -0
- package/dist/ra-core/src/dataProvider/undoableEventEmitter.d.ts +3 -0
- package/dist/ra-core/src/dataProvider/undoableEventEmitter.js +2 -0
- package/dist/ra-core/src/dataProvider/useCreate.d.ts +89 -0
- package/dist/ra-core/src/dataProvider/useCreate.js +155 -0
- package/dist/ra-core/src/dataProvider/useDataProvider.d.ts +2 -0
- package/dist/ra-core/src/dataProvider/useDataProvider.js +140 -0
- package/dist/ra-core/src/dataProvider/useDelete.d.ts +83 -0
- package/dist/ra-core/src/dataProvider/useDelete.js +171 -0
- package/dist/ra-core/src/dataProvider/useDeleteMany.d.ts +81 -0
- package/dist/ra-core/src/dataProvider/useDeleteMany.js +193 -0
- package/dist/ra-core/src/dataProvider/useGetList.d.ts +58 -0
- package/dist/ra-core/src/dataProvider/useGetList.js +131 -0
- package/dist/ra-core/src/dataProvider/useGetMany.d.ts +49 -0
- package/dist/ra-core/src/dataProvider/useGetMany.js +143 -0
- package/dist/ra-core/src/dataProvider/useGetManyAggregate.d.ts +62 -0
- package/dist/ra-core/src/dataProvider/useGetManyAggregate.js +295 -0
- package/dist/ra-core/src/dataProvider/useGetManyReference.d.ts +62 -0
- package/dist/ra-core/src/dataProvider/useGetManyReference.js +117 -0
- package/dist/ra-core/src/dataProvider/useGetOne.d.ts +48 -0
- package/dist/ra-core/src/dataProvider/useGetOne.js +94 -0
- package/dist/ra-core/src/dataProvider/useGetRecordId.d.ts +14 -0
- package/dist/ra-core/src/dataProvider/useGetRecordId.js +22 -0
- package/dist/ra-core/src/dataProvider/useInfiniteGetList.d.ts +64 -0
- package/dist/ra-core/src/dataProvider/useInfiniteGetList.js +177 -0
- package/dist/ra-core/src/dataProvider/useIsDataLoaded.d.ts +13 -0
- package/dist/ra-core/src/dataProvider/useIsDataLoaded.js +35 -0
- package/dist/ra-core/src/dataProvider/useLoading.d.ts +12 -0
- package/dist/ra-core/src/dataProvider/useLoading.js +41 -0
- package/dist/ra-core/src/dataProvider/useMutationWithMutationMode.d.ts +51 -0
- package/dist/ra-core/src/dataProvider/useMutationWithMutationMode.js +238 -0
- package/dist/ra-core/src/dataProvider/useRefresh.d.ts +14 -0
- package/dist/ra-core/src/dataProvider/useRefresh.js +21 -0
- package/dist/ra-core/src/dataProvider/useUpdate.d.ts +89 -0
- package/dist/ra-core/src/dataProvider/useUpdate.js +183 -0
- package/dist/ra-core/src/dataProvider/useUpdateMany.d.ts +81 -0
- package/dist/ra-core/src/dataProvider/useUpdateMany.js +171 -0
- package/dist/ra-core/src/dataProvider/validateResponseFormat.d.ts +5 -0
- package/dist/ra-core/src/dataProvider/validateResponseFormat.js +35 -0
- package/dist/ra-core/src/dataProvider/withLifecycleCallbacks.d.ts +162 -0
- package/dist/ra-core/src/dataProvider/withLifecycleCallbacks.js +377 -0
- package/dist/ra-core/src/dataTable/DataTableCallbacksContext.d.ts +18 -0
- package/dist/ra-core/src/dataTable/DataTableCallbacksContext.js +3 -0
- package/dist/ra-core/src/dataTable/DataTableColumnFilterContext.d.ts +2 -0
- package/dist/ra-core/src/dataTable/DataTableColumnFilterContext.js +3 -0
- package/dist/ra-core/src/dataTable/DataTableColumnRankContext.d.ts +2 -0
- package/dist/ra-core/src/dataTable/DataTableColumnRankContext.js +3 -0
- package/dist/ra-core/src/dataTable/DataTableConfigContext.d.ts +22 -0
- package/dist/ra-core/src/dataTable/DataTableConfigContext.js +7 -0
- package/dist/ra-core/src/dataTable/DataTableDataContext.d.ts +4 -0
- package/dist/ra-core/src/dataTable/DataTableDataContext.js +3 -0
- package/dist/ra-core/src/dataTable/DataTableRenderContext.d.ts +3 -0
- package/dist/ra-core/src/dataTable/DataTableRenderContext.js +3 -0
- package/dist/ra-core/src/dataTable/DataTableSelectedIdsContext.d.ts +3 -0
- package/dist/ra-core/src/dataTable/DataTableSelectedIdsContext.js +3 -0
- package/dist/ra-core/src/dataTable/DataTableSortContext.d.ts +3 -0
- package/dist/ra-core/src/dataTable/DataTableSortContext.js +3 -0
- package/dist/ra-core/src/dataTable/DataTableStoreContext.d.ts +8 -0
- package/dist/ra-core/src/dataTable/DataTableStoreContext.js +6 -0
- package/dist/ra-core/src/dataTable/index.d.ts +11 -0
- package/dist/ra-core/src/dataTable/index.js +11 -0
- package/dist/ra-core/src/dataTable/types.d.ts +2 -0
- package/dist/ra-core/src/dataTable/types.js +1 -0
- package/dist/ra-core/src/export/ExporterContext.d.ts +2 -0
- package/dist/ra-core/src/export/ExporterContext.js +4 -0
- package/dist/ra-core/src/export/defaultExporter.d.ts +2 -0
- package/dist/ra-core/src/export/defaultExporter.js +3 -0
- package/dist/ra-core/src/export/downloadCSV.d.ts +1 -0
- package/dist/ra-core/src/export/downloadCSV.js +17 -0
- package/dist/ra-core/src/export/fetchRelatedRecords.d.ts +14 -0
- package/dist/ra-core/src/export/fetchRelatedRecords.js +19 -0
- package/dist/ra-core/src/export/getRelatedIds.d.ts +24 -0
- package/dist/ra-core/src/export/getRelatedIds.js +26 -0
- package/dist/ra-core/src/export/index.d.ts +5 -0
- package/dist/ra-core/src/export/index.js +5 -0
- package/dist/ra-core/src/export/useBulkExport.d.ts +11 -0
- package/dist/ra-core/src/export/useBulkExport.js +30 -0
- package/dist/ra-core/src/form/WarnWhenUnsavedChanges.d.ts +5 -0
- package/dist/ra-core/src/form/WarnWhenUnsavedChanges.js +5 -0
- package/dist/ra-core/src/form/choices/ChoicesContext.d.ts +65 -0
- package/dist/ra-core/src/form/choices/ChoicesContext.js +7 -0
- package/dist/ra-core/src/form/choices/index.d.ts +4 -0
- package/dist/ra-core/src/form/choices/index.js +4 -0
- package/dist/ra-core/src/form/choices/useChoicesContext.d.ts +5 -0
- package/dist/ra-core/src/form/choices/useChoicesContext.js +62 -0
- package/dist/ra-core/src/form/getFormInitialValues.d.ts +8 -0
- package/dist/ra-core/src/form/getFormInitialValues.js +14 -0
- package/dist/ra-core/src/form/groups/FormGroupContext.d.ts +9 -0
- package/dist/ra-core/src/form/groups/FormGroupContext.js +9 -0
- package/dist/ra-core/src/form/groups/index.d.ts +6 -0
- package/dist/ra-core/src/form/groups/index.js +6 -0
- package/dist/ra-core/src/form/groups/useFormGroup.d.ts +67 -0
- package/dist/ra-core/src/form/groups/useFormGroup.js +146 -0
- package/dist/ra-core/src/form/groups/useFormGroupContext.d.ts +4 -0
- package/dist/ra-core/src/form/groups/useFormGroupContext.js +9 -0
- package/dist/ra-core/src/form/groups/useFormGroups.d.ts +4 -0
- package/dist/ra-core/src/form/groups/useFormGroups.js +9 -0
- package/dist/ra-core/src/form/index.d.ts +14 -0
- package/dist/ra-core/src/form/index.js +14 -0
- package/dist/ra-core/src/form/sanitizeEmptyValues.d.ts +7 -0
- package/dist/ra-core/src/form/sanitizeEmptyValues.js +26 -0
- package/dist/ra-core/src/form/useApplyInputDefaultValues.d.ts +19 -0
- package/dist/ra-core/src/form/useApplyInputDefaultValues.js +71 -0
- package/dist/ra-core/src/form/useAugmentedForm.d.ts +32 -0
- package/dist/ra-core/src/form/useAugmentedForm.js +101 -0
- package/dist/ra-core/src/form/useFormIsDirty.d.ts +4 -0
- package/dist/ra-core/src/form/useFormIsDirty.js +39 -0
- package/dist/ra-core/src/form/useInput.d.ts +33 -0
- package/dist/ra-core/src/form/useInput.js +100 -0
- package/dist/ra-core/src/form/useRecordFromLocation.d.ts +22 -0
- package/dist/ra-core/src/form/useRecordFromLocation.js +59 -0
- package/dist/ra-core/src/form/useSuggestions.d.ts +43 -0
- package/dist/ra-core/src/form/useSuggestions.js +186 -0
- package/dist/ra-core/src/form/validation/getSimpleValidationResolver.d.ts +31 -0
- package/dist/ra-core/src/form/validation/getSimpleValidationResolver.js +87 -0
- package/dist/ra-core/src/form/validation/index.d.ts +7 -0
- package/dist/ra-core/src/form/validation/index.js +7 -0
- package/dist/ra-core/src/form/validation/setSubmissionErrors.d.ts +21 -0
- package/dist/ra-core/src/form/validation/setSubmissionErrors.js +34 -0
- package/dist/ra-core/src/form/validation/useGetValidationErrorMessage.d.ts +26 -0
- package/dist/ra-core/src/form/validation/useGetValidationErrorMessage.js +35 -0
- package/dist/ra-core/src/form/validation/useNotifyIsFormInvalid.d.ts +9 -0
- package/dist/ra-core/src/form/validation/useNotifyIsFormInvalid.js +30 -0
- package/dist/ra-core/src/form/validation/useUnique.d.ts +57 -0
- package/dist/ra-core/src/form/validation/useUnique.js +107 -0
- package/dist/ra-core/src/form/validation/validate.d.ts +168 -0
- package/dist/ra-core/src/form/validation/validate.js +218 -0
- package/dist/ra-core/src/i18n/I18nContext.d.ts +3 -0
- package/dist/ra-core/src/i18n/I18nContext.js +11 -0
- package/dist/ra-core/src/i18n/TranslatableContext.d.ts +16 -0
- package/dist/ra-core/src/i18n/TranslatableContext.js +2 -0
- package/dist/ra-core/src/i18n/TranslationMessages.d.ts +221 -0
- package/dist/ra-core/src/i18n/TranslationMessages.js +1 -0
- package/dist/ra-core/src/i18n/TranslationUtils.d.ts +60 -0
- package/dist/ra-core/src/i18n/TranslationUtils.js +70 -0
- package/dist/ra-core/src/i18n/index.d.ts +20 -0
- package/dist/ra-core/src/i18n/index.js +20 -0
- package/dist/ra-core/src/i18n/substituteTokens.d.ts +8 -0
- package/dist/ra-core/src/i18n/substituteTokens.js +18 -0
- package/dist/ra-core/src/i18n/useI18nProvider.d.ts +12 -0
- package/dist/ra-core/src/i18n/useI18nProvider.js +14 -0
- package/dist/ra-core/src/i18n/useLocales.d.ts +31 -0
- package/dist/ra-core/src/i18n/useLocales.js +28 -0
- package/dist/ra-core/src/i18n/useResourceTranslation.d.ts +8 -0
- package/dist/ra-core/src/i18n/useResourceTranslation.js +18 -0
- package/dist/ra-core/src/i18n/useTranslatable.d.ts +29 -0
- package/dist/ra-core/src/i18n/useTranslatable.js +98 -0
- package/dist/ra-core/src/i18n/useTranslatableContext.d.ts +31 -0
- package/dist/ra-core/src/i18n/useTranslatableContext.js +38 -0
- package/dist/ra-core/src/i18n/useTranslate.d.ts +21 -0
- package/dist/ra-core/src/i18n/useTranslate.js +29 -0
- package/dist/ra-core/src/i18n/useTranslateLabel.d.ts +6 -0
- package/dist/ra-core/src/i18n/useTranslateLabel.js +26 -0
- package/dist/ra-core/src/index.d.ts +16 -0
- package/dist/ra-core/src/index.js +16 -0
- package/dist/ra-core/src/inference/InferredElement.d.ts +12 -0
- package/dist/ra-core/src/inference/InferredElement.js +40 -0
- package/dist/ra-core/src/inference/assertions.d.ts +26 -0
- package/dist/ra-core/src/inference/assertions.js +38 -0
- package/dist/ra-core/src/inference/getElementsFromRecords.d.ts +35 -0
- package/dist/ra-core/src/inference/getElementsFromRecords.js +39 -0
- package/dist/ra-core/src/inference/getValuesFromRecords.d.ts +28 -0
- package/dist/ra-core/src/inference/getValuesFromRecords.js +40 -0
- package/dist/ra-core/src/inference/index.d.ts +6 -0
- package/dist/ra-core/src/inference/index.js +6 -0
- package/dist/ra-core/src/inference/inferTypeFromValues.d.ts +21 -0
- package/dist/ra-core/src/inference/inferTypeFromValues.js +141 -0
- package/dist/ra-core/src/inference/types.d.ts +9 -0
- package/dist/ra-core/src/inference/types.js +1 -0
- package/dist/ra-core/src/notification/CloseNotificationContext.d.ts +2 -0
- package/dist/ra-core/src/notification/CloseNotificationContext.js +2 -0
- package/dist/ra-core/src/notification/NotificationContext.d.ts +37 -0
- package/dist/ra-core/src/notification/NotificationContext.js +35 -0
- package/dist/ra-core/src/notification/index.d.ts +9 -0
- package/dist/ra-core/src/notification/index.js +9 -0
- package/dist/ra-core/src/notification/types.d.ts +14 -0
- package/dist/ra-core/src/notification/types.js +1 -0
- package/dist/ra-core/src/notification/useCloseNotification.d.ts +1 -0
- package/dist/ra-core/src/notification/useCloseNotification.js +9 -0
- package/dist/ra-core/src/notification/useNotificationContext.d.ts +1 -0
- package/dist/ra-core/src/notification/useNotificationContext.js +3 -0
- package/dist/ra-core/src/notification/useNotify.d.ts +20 -0
- package/dist/ra-core/src/notification/useNotify.js +28 -0
- package/dist/ra-core/src/preferences/index.d.ts +7 -0
- package/dist/ra-core/src/preferences/index.js +7 -0
- package/dist/ra-core/src/preferences/usePreference.d.ts +18 -0
- package/dist/ra-core/src/preferences/usePreference.js +10 -0
- package/dist/ra-core/src/preferences/usePreferenceInput.d.ts +22 -0
- package/dist/ra-core/src/preferences/usePreferenceInput.js +43 -0
- package/dist/ra-core/src/preferences/usePreferencesEditor.d.ts +2 -0
- package/dist/ra-core/src/preferences/usePreferencesEditor.js +9 -0
- package/dist/ra-core/src/preferences/useSetInspectorTitle.d.ts +7 -0
- package/dist/ra-core/src/preferences/useSetInspectorTitle.js +19 -0
- package/dist/ra-core/src/routing/BasenameContext.d.ts +1 -0
- package/dist/ra-core/src/routing/BasenameContext.js +2 -0
- package/dist/ra-core/src/routing/RouterProvider.d.ts +163 -0
- package/dist/ra-core/src/routing/RouterProvider.js +1 -0
- package/dist/ra-core/src/routing/index.d.ts +28 -0
- package/dist/ra-core/src/routing/index.js +28 -0
- package/dist/ra-core/src/routing/types.d.ts +3 -0
- package/dist/ra-core/src/routing/types.js +1 -0
- package/dist/ra-core/src/routing/useBasename.d.ts +21 -0
- package/dist/ra-core/src/routing/useBasename.js +23 -0
- package/dist/ra-core/src/routing/useBlocker.d.ts +14 -0
- package/dist/ra-core/src/routing/useBlocker.js +17 -0
- package/dist/ra-core/src/routing/useCanBlock.d.ts +7 -0
- package/dist/ra-core/src/routing/useCanBlock.js +11 -0
- package/dist/ra-core/src/routing/useCreatePath.d.ts +42 -0
- package/dist/ra-core/src/routing/useCreatePath.js +69 -0
- package/dist/ra-core/src/routing/useGetPathForRecord.d.ts +42 -0
- package/dist/ra-core/src/routing/useGetPathForRecord.js +135 -0
- package/dist/ra-core/src/routing/useGetPathForRecordCallback.d.ts +6 -0
- package/dist/ra-core/src/routing/useGetPathForRecordCallback.js +82 -0
- package/dist/ra-core/src/routing/useInRouterContext.d.ts +11 -0
- package/dist/ra-core/src/routing/useInRouterContext.js +15 -0
- package/dist/ra-core/src/routing/useLocation.d.ts +10 -0
- package/dist/ra-core/src/routing/useLocation.js +13 -0
- package/dist/ra-core/src/routing/useMatch.d.ts +15 -0
- package/dist/ra-core/src/routing/useMatch.js +15 -0
- package/dist/ra-core/src/routing/useMatchPath.d.ts +17 -0
- package/dist/ra-core/src/routing/useMatchPath.js +17 -0
- package/dist/ra-core/src/routing/useNavigate.d.ts +12 -0
- package/dist/ra-core/src/routing/useNavigate.js +15 -0
- package/dist/ra-core/src/routing/useParams.d.ts +9 -0
- package/dist/ra-core/src/routing/useParams.js +13 -0
- package/dist/ra-core/src/routing/useRedirect.d.ts +30 -0
- package/dist/ra-core/src/routing/useRedirect.js +66 -0
- package/dist/ra-core/src/routing/useResetErrorBoundaryOnLocationChange.d.ts +7 -0
- package/dist/ra-core/src/routing/useResetErrorBoundaryOnLocationChange.js +17 -0
- package/dist/ra-core/src/routing/useRestoreScrollPosition.d.ts +40 -0
- package/dist/ra-core/src/routing/useRestoreScrollPosition.js +70 -0
- package/dist/ra-core/src/routing/useSplatPathBase.d.ts +13 -0
- package/dist/ra-core/src/routing/useSplatPathBase.js +21 -0
- package/dist/ra-core/src/store/index.d.ts +11 -0
- package/dist/ra-core/src/store/index.js +11 -0
- package/dist/ra-core/src/store/localStorageStore.d.ts +27 -0
- package/dist/ra-core/src/store/localStorageStore.js +198 -0
- package/dist/ra-core/src/store/types.d.ts +11 -0
- package/dist/ra-core/src/store/types.js +1 -0
- package/dist/ra-core/src/store/useRemoveFromStore.d.ts +17 -0
- package/dist/ra-core/src/store/useRemoveFromStore.js +29 -0
- package/dist/ra-core/src/store/useRemoveItemsFromStore.d.ts +17 -0
- package/dist/ra-core/src/store/useRemoveItemsFromStore.js +29 -0
- package/dist/ra-core/src/store/useResetStore.d.ts +17 -0
- package/dist/ra-core/src/store/useResetStore.js +21 -0
- package/dist/ra-core/src/store/useStore.d.ts +48 -0
- package/dist/ra-core/src/store/useStore.js +32 -0
- package/dist/ra-core/src/store/useStoreContext.d.ts +4 -0
- package/dist/ra-core/src/store/useStoreContext.js +6 -0
- package/dist/ra-core/src/test-ui/defaultI18nProvider.d.ts +2 -0
- package/dist/ra-core/src/test-ui/defaultI18nProvider.js +10 -0
- package/dist/ra-core/src/test-ui/index.d.ts +21 -0
- package/dist/ra-core/src/test-ui/index.js +21 -0
- package/dist/ra-core/src/types.d.ts +284 -0
- package/dist/ra-core/src/types.js +5 -0
- package/dist/ra-core/src/util/asyncDebounce.d.ts +7 -0
- package/dist/ra-core/src/util/asyncDebounce.js +29 -0
- package/dist/ra-core/src/util/escapePath.d.ts +11 -0
- package/dist/ra-core/src/util/escapePath.js +10 -0
- package/dist/ra-core/src/util/genericMemo.d.ts +5 -0
- package/dist/ra-core/src/util/genericMemo.js +14 -0
- package/dist/ra-core/src/util/getFieldLabelTranslationArgs.d.ts +22 -0
- package/dist/ra-core/src/util/getFieldLabelTranslationArgs.js +73 -0
- package/dist/ra-core/src/util/getMutationMode.d.ts +1 -0
- package/dist/ra-core/src/util/getMutationMode.js +13 -0
- package/dist/ra-core/src/util/hooks.d.ts +15 -0
- package/dist/ra-core/src/util/hooks.js +73 -0
- package/dist/ra-core/src/util/index.d.ts +20 -0
- package/dist/ra-core/src/util/index.js +19 -0
- package/dist/ra-core/src/util/mergeRefs.d.ts +2 -0
- package/dist/ra-core/src/util/mergeRefs.js +13 -0
- package/dist/ra-core/src/util/removeEmpty.d.ts +2 -0
- package/dist/ra-core/src/util/removeEmpty.js +16 -0
- package/dist/ra-core/src/util/removeKey.d.ts +2 -0
- package/dist/ra-core/src/util/removeKey.js +22 -0
- package/dist/ra-core/src/util/shallowEqual.d.ts +1 -0
- package/dist/ra-core/src/util/shallowEqual.js +29 -0
- package/dist/ra-core/src/util/useCheckForApplicationUpdate.d.ts +21 -0
- package/dist/ra-core/src/util/useCheckForApplicationUpdate.js +84 -0
- package/dist/ra-core/src/util/useDebouncedEvent.d.ts +8 -0
- package/dist/ra-core/src/util/useDebouncedEvent.js +28 -0
- package/dist/ra-core/src/util/useEvent.d.ts +7 -0
- package/dist/ra-core/src/util/useEvent.js +19 -0
- package/dist/ra-core/src/util/useFieldValue.d.ts +21 -0
- package/dist/ra-core/src/util/useFieldValue.js +27 -0
- package/dist/ra-core/src/util/useWhyDidYouUpdate.d.ts +12 -0
- package/dist/ra-core/src/util/useWhyDidYouUpdate.js +42 -0
- package/dist/ra-core/src/util/warning.d.ts +2 -0
- package/dist/ra-core/src/util/warning.js +5 -0
- package/dist/strato-faker-ecommerce/src/dataProvider.d.ts +2 -0
- package/dist/strato-faker-ecommerce/src/dataProvider.js +6 -0
- package/dist/strato-faker-ecommerce/src/generate.d.ts +8 -0
- package/dist/strato-faker-ecommerce/src/generate.js +148 -0
- package/dist/strato-faker-ecommerce/src/index.d.ts +3 -0
- package/dist/strato-faker-ecommerce/src/index.js +3 -0
- package/dist/strato-faker-ecommerce/src/types.d.ts +69 -0
- package/dist/strato-faker-ecommerce/src/types.js +1 -0
- package/dist/types.d.ts +1 -1
- package/package.json +5 -4
- package/src/dataProvider.ts +3 -3
- package/src/generate.test.ts +12 -12
- package/src/generate.ts +21 -14
- 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,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,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,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,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
|
+
};
|