@strato-admin/faker-ecommerce 0.1.0 → 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 +6 -5
- 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,22 @@
|
|
|
1
|
+
import { RaRecord } from '../types';
|
|
2
|
+
import { RouterLocation } from '../routing';
|
|
3
|
+
/**
|
|
4
|
+
* A hook that returns the record to use to override the values in a form
|
|
5
|
+
* @param options The hook options
|
|
6
|
+
* @param options.searchSource The key in the location search to use as a source for the record. Its content should be a stringified JSON object.
|
|
7
|
+
* @param options.stateSource The key in the location state to use as a source for the record
|
|
8
|
+
* @returns The record to use to override the values in a form
|
|
9
|
+
*/
|
|
10
|
+
export declare const useRecordFromLocation: (props?: UseRecordFromLocationOptions) => Partial<RaRecord<import("..").Identifier>> | null;
|
|
11
|
+
export type UseRecordFromLocationOptions = {
|
|
12
|
+
searchSource?: string;
|
|
13
|
+
stateSource?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Get the initial record from the location, whether it comes from the location
|
|
17
|
+
* state or is serialized in the url search part.
|
|
18
|
+
*/
|
|
19
|
+
export declare const getRecordFromLocation: ({ state, search }: RouterLocation, { searchSource, stateSource, }?: {
|
|
20
|
+
searchSource?: string;
|
|
21
|
+
stateSource?: string;
|
|
22
|
+
}) => Partial<RaRecord> | null;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { parse } from 'query-string';
|
|
3
|
+
import isEqual from 'lodash/isEqual.js';
|
|
4
|
+
import { useLocation } from '../routing';
|
|
5
|
+
/**
|
|
6
|
+
* A hook that returns the record to use to override the values in a form
|
|
7
|
+
* @param options The hook options
|
|
8
|
+
* @param options.searchSource The key in the location search to use as a source for the record. Its content should be a stringified JSON object.
|
|
9
|
+
* @param options.stateSource The key in the location state to use as a source for the record
|
|
10
|
+
* @returns The record to use to override the values in a form
|
|
11
|
+
*/
|
|
12
|
+
export const useRecordFromLocation = (props = {}) => {
|
|
13
|
+
const { searchSource, stateSource } = props;
|
|
14
|
+
const location = useLocation();
|
|
15
|
+
const [recordFromLocation, setRecordFromLocation] = useState(() => getRecordFromLocation(location, {
|
|
16
|
+
stateSource,
|
|
17
|
+
searchSource,
|
|
18
|
+
}));
|
|
19
|
+
// To avoid having the form resets when the location changes but the final record is the same
|
|
20
|
+
// This is needed for forms such as TabbedForm or WizardForm that may change the location for their sections
|
|
21
|
+
const previousRecordRef = useRef(recordFromLocation);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const newRecordFromLocation = getRecordFromLocation(location, {
|
|
24
|
+
stateSource,
|
|
25
|
+
searchSource,
|
|
26
|
+
});
|
|
27
|
+
if (!isEqual(newRecordFromLocation, previousRecordRef.current)) {
|
|
28
|
+
previousRecordRef.current = newRecordFromLocation;
|
|
29
|
+
setRecordFromLocation(newRecordFromLocation);
|
|
30
|
+
}
|
|
31
|
+
}, [location, stateSource, searchSource]);
|
|
32
|
+
return recordFromLocation;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Get the initial record from the location, whether it comes from the location
|
|
36
|
+
* state or is serialized in the url search part.
|
|
37
|
+
*/
|
|
38
|
+
export const getRecordFromLocation = ({ state, search }, { searchSource = 'source', stateSource = 'record', } = {}) => {
|
|
39
|
+
if (state && state[stateSource]) {
|
|
40
|
+
return state[stateSource];
|
|
41
|
+
}
|
|
42
|
+
if (search) {
|
|
43
|
+
try {
|
|
44
|
+
const searchParams = parse(search);
|
|
45
|
+
const source = searchParams[searchSource];
|
|
46
|
+
if (source) {
|
|
47
|
+
if (Array.isArray(source)) {
|
|
48
|
+
console.error(`Failed to parse location ${searchSource} parameter '${search}'. To pre-fill some fields in the Create form, pass a stringified ${searchSource} parameter (e.g. '?${searchSource}={"title":"foo"}')`);
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return JSON.parse(source);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
console.error(`Failed to parse location ${searchSource} parameter '${search}'. To pre-fill some fields in the Create form, pass a stringified ${searchSource} parameter (e.g. '?${searchSource}={"title":"foo"}')`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ReactElement } from 'react';
|
|
2
|
+
import { UseChoicesOptions } from './choices/useChoices';
|
|
3
|
+
export declare const useSuggestions: ({ allowCreate, choices, createText, createValue, createHintValue, limitChoicesToValue, matchSuggestion, optionText, optionValue, selectedItem, suggestionLimit, translateChoice, }: UseSuggestionsOptions) => {
|
|
4
|
+
getChoiceText: any;
|
|
5
|
+
getChoiceValue: any;
|
|
6
|
+
getSuggestions: (filter: any) => any[];
|
|
7
|
+
};
|
|
8
|
+
export interface UseSuggestionsOptions extends UseChoicesOptions {
|
|
9
|
+
allowCreate?: boolean;
|
|
10
|
+
allowDuplicates?: boolean;
|
|
11
|
+
choices?: any[];
|
|
12
|
+
createText?: string;
|
|
13
|
+
limitChoicesToValue?: boolean;
|
|
14
|
+
matchSuggestion?: (filter: string, suggestion: any, exact?: boolean) => boolean;
|
|
15
|
+
suggestionLimit?: number;
|
|
16
|
+
selectedItem?: any | any[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get the suggestions to display after applying a fuzzy search on the available choices
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
*
|
|
23
|
+
* getSuggestions({
|
|
24
|
+
* choices: [{ id: 1, name: 'admin' }, { id: 2, name: 'publisher' }],
|
|
25
|
+
* optionText: 'name',
|
|
26
|
+
* optionValue: 'id',
|
|
27
|
+
* getSuggestionText: choice => choice[optionText],
|
|
28
|
+
* })('pub')
|
|
29
|
+
*
|
|
30
|
+
* // Will return [{ id: 2, name: 'publisher' }]
|
|
31
|
+
* getSuggestions({
|
|
32
|
+
* choices: [{ id: 1, name: 'admin' }, { id: 2, name: 'publisher' }],
|
|
33
|
+
* optionText: 'name',
|
|
34
|
+
* optionValue: 'id',
|
|
35
|
+
* getSuggestionText: choice => choice[optionText],
|
|
36
|
+
* })('pub')
|
|
37
|
+
*
|
|
38
|
+
* // Will return [{ id: 2, name: 'publisher' }]
|
|
39
|
+
*/
|
|
40
|
+
export declare const getSuggestionsFactory: ({ allowCreate, choices, createText, createValue, optionText, optionValue, getChoiceText, getChoiceValue, limitChoicesToValue, matchSuggestion, selectedItem, suggestionLimit, }: UseSuggestionsOptions & {
|
|
41
|
+
getChoiceText: (choice: any) => string | ReactElement;
|
|
42
|
+
getChoiceValue: (choice: any) => string;
|
|
43
|
+
}) => (filter: any) => any[];
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { useCallback, isValidElement } from 'react';
|
|
2
|
+
import set from 'lodash/set.js';
|
|
3
|
+
import { useChoices, } from './choices/useChoices';
|
|
4
|
+
import { useTranslate } from '../i18n';
|
|
5
|
+
/*
|
|
6
|
+
* Returns helper functions for suggestions handling.
|
|
7
|
+
*
|
|
8
|
+
* @param allowDuplicates A boolean indicating whether a suggestion can be added several times
|
|
9
|
+
* @param choices An array of available choices
|
|
10
|
+
* @param limitChoicesToValue A boolean indicating whether the initial suggestions should be limited to the currently selected one(s)
|
|
11
|
+
* @param matchSuggestion Optional unless `optionText` is a React element. Function which check whether a choice matches a filter. Must return a boolean.
|
|
12
|
+
* @param optionText Either a string defining the property to use to get the choice text, a function or a React element
|
|
13
|
+
* @param optionValue The property to use to get the choice value
|
|
14
|
+
* @param selectedItem The currently selected item. Maybe an array of selected items
|
|
15
|
+
* @param suggestionLimit The maximum number of suggestions returned
|
|
16
|
+
* @param translateChoice A boolean indicating whether to option text should be translated
|
|
17
|
+
*
|
|
18
|
+
* @returns An object with helper functions:
|
|
19
|
+
* - getChoiceText: Returns the choice text or a React element
|
|
20
|
+
* - getChoiceValue: Returns the choice value
|
|
21
|
+
* - getSuggestions: A function taking a filter value (string) and returning the matching suggestions
|
|
22
|
+
*/
|
|
23
|
+
export const useSuggestions = ({ allowCreate, choices, createText = "strato.action.create', createValue = '@@create', createHintValue = '@@ra-create-hint', limitChoicesToValue, matchSuggestion, optionText, optionValue, selectedItem, suggestionLimit = 0, translateChoice, }) => {
|
|
24
|
+
const translate = useTranslate();
|
|
25
|
+
const { getChoiceText, getChoiceValue } = useChoices({
|
|
26
|
+
optionText,
|
|
27
|
+
optionValue,
|
|
28
|
+
translateChoice,
|
|
29
|
+
createValue,
|
|
30
|
+
createHintValue,
|
|
31
|
+
});
|
|
32
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
33
|
+
const getSuggestions = useCallback(getSuggestionsFactory({
|
|
34
|
+
allowCreate,
|
|
35
|
+
choices,
|
|
36
|
+
createText,
|
|
37
|
+
createValue,
|
|
38
|
+
getChoiceText,
|
|
39
|
+
getChoiceValue,
|
|
40
|
+
limitChoicesToValue,
|
|
41
|
+
matchSuggestion,
|
|
42
|
+
optionText,
|
|
43
|
+
optionValue,
|
|
44
|
+
selectedItem,
|
|
45
|
+
suggestionLimit,
|
|
46
|
+
}), [
|
|
47
|
+
allowCreate,
|
|
48
|
+
choices,
|
|
49
|
+
createText,
|
|
50
|
+
createValue,
|
|
51
|
+
getChoiceText,
|
|
52
|
+
getChoiceValue,
|
|
53
|
+
limitChoicesToValue,
|
|
54
|
+
matchSuggestion,
|
|
55
|
+
optionText,
|
|
56
|
+
optionValue,
|
|
57
|
+
selectedItem,
|
|
58
|
+
suggestionLimit,
|
|
59
|
+
translate,
|
|
60
|
+
]);
|
|
61
|
+
return {
|
|
62
|
+
getChoiceText,
|
|
63
|
+
getChoiceValue,
|
|
64
|
+
getSuggestions,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
const escapeRegExp = value => value ? value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') : ''; // $& means the whole matched string
|
|
68
|
+
/**
|
|
69
|
+
* Default matcher implementation which check whether the suggestion text matches the filter.
|
|
70
|
+
*/
|
|
71
|
+
const defaultMatchSuggestion = getChoiceText => (filter, suggestion, exact = false) => {
|
|
72
|
+
const suggestionText = getChoiceText(suggestion);
|
|
73
|
+
const isReactElement = isValidElement(suggestionText);
|
|
74
|
+
const regex = escapeRegExp(filter);
|
|
75
|
+
return isReactElement
|
|
76
|
+
? false
|
|
77
|
+
: suggestionText &&
|
|
78
|
+
!!suggestionText.match(
|
|
79
|
+
// We must escape any RegExp reserved characters to avoid errors
|
|
80
|
+
// For example, the filter might contain * which must be escaped as \*
|
|
81
|
+
new RegExp(exact ? `^${regex}$` : regex, 'i'));
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Get the suggestions to display after applying a fuzzy search on the available choices
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
*
|
|
88
|
+
* getSuggestions({
|
|
89
|
+
* choices: [{ id: 1, name: 'admin' }, { id: 2, name: 'publisher' }],
|
|
90
|
+
* optionText: 'name',
|
|
91
|
+
* optionValue: 'id',
|
|
92
|
+
* getSuggestionText: choice => choice[optionText],
|
|
93
|
+
* })('pub')
|
|
94
|
+
*
|
|
95
|
+
* // Will return [{ id: 2, name: 'publisher' }]
|
|
96
|
+
* getSuggestions({
|
|
97
|
+
* choices: [{ id: 1, name: 'admin' }, { id: 2, name: 'publisher' }],
|
|
98
|
+
* optionText: 'name',
|
|
99
|
+
* optionValue: 'id',
|
|
100
|
+
* getSuggestionText: choice => choice[optionText],
|
|
101
|
+
* })('pub')
|
|
102
|
+
*
|
|
103
|
+
* // Will return [{ id: 2, name: 'publisher' }]
|
|
104
|
+
*/
|
|
105
|
+
export const getSuggestionsFactory = ({ allowCreate = false, choices = [], createText = "strato.action.create', createValue = '@@create', optionText = 'name', optionValue = 'id', getChoiceText, getChoiceValue, limitChoicesToValue = false, matchSuggestion = defaultMatchSuggestion(getChoiceText), selectedItem, suggestionLimit = 0, }) => filter => {
|
|
106
|
+
let suggestions = [];
|
|
107
|
+
// if an item is selected and matches the filter
|
|
108
|
+
if (selectedItem &&
|
|
109
|
+
!Array.isArray(selectedItem) &&
|
|
110
|
+
matchSuggestion(filter, selectedItem)) {
|
|
111
|
+
if (limitChoicesToValue) {
|
|
112
|
+
// display only the selected item
|
|
113
|
+
suggestions = choices.filter(choice => getChoiceValue(choice) === getChoiceValue(selectedItem));
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
suggestions = [...choices];
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
suggestions = choices.filter(choice => matchSuggestion(filter, choice) ||
|
|
121
|
+
(selectedItem != null &&
|
|
122
|
+
(!Array.isArray(selectedItem)
|
|
123
|
+
? getChoiceValue(choice) ===
|
|
124
|
+
getChoiceValue(selectedItem)
|
|
125
|
+
: selectedItem.some(selected => getChoiceValue(choice) ===
|
|
126
|
+
getChoiceValue(selected)))));
|
|
127
|
+
}
|
|
128
|
+
suggestions = limitSuggestions(suggestions, suggestionLimit);
|
|
129
|
+
const hasExactMatch = suggestions.some(suggestion => matchSuggestion(filter, suggestion, true));
|
|
130
|
+
if (allowCreate) {
|
|
131
|
+
const filterIsSelectedItem =
|
|
132
|
+
// If the selectedItem is an array (for example AutocompleteArrayInput)
|
|
133
|
+
// we shouldn't try to match
|
|
134
|
+
!!selectedItem && !Array.isArray(selectedItem)
|
|
135
|
+
? matchSuggestion(filter, selectedItem, true)
|
|
136
|
+
: false;
|
|
137
|
+
if (!hasExactMatch && !filterIsSelectedItem) {
|
|
138
|
+
suggestions.push(getSuggestion({
|
|
139
|
+
optionText,
|
|
140
|
+
optionValue,
|
|
141
|
+
text: createText,
|
|
142
|
+
value: createValue,
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Only keep unique items. Necessary because we might have fetched
|
|
147
|
+
// the currently selected choice in addition of the possible choices
|
|
148
|
+
// that may also contain it
|
|
149
|
+
const result = suggestions.filter((suggestion, index) => suggestions.indexOf(suggestion) === index);
|
|
150
|
+
return result;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* @example
|
|
154
|
+
*
|
|
155
|
+
* limitSuggestions(
|
|
156
|
+
* [{ id: 1, name: 'foo'}, { id: 2, name: 'bar' }],
|
|
157
|
+
* 1
|
|
158
|
+
* );
|
|
159
|
+
*
|
|
160
|
+
* // Will return [{ id: 1, name: 'foo' }]
|
|
161
|
+
*
|
|
162
|
+
* @param suggestions List of suggestions
|
|
163
|
+
* @param limit
|
|
164
|
+
*/
|
|
165
|
+
const limitSuggestions = (suggestions, limit = 0) => Number.isInteger(limit) && limit > 0
|
|
166
|
+
? suggestions.slice(0, limit)
|
|
167
|
+
: suggestions;
|
|
168
|
+
/**
|
|
169
|
+
* addSuggestion(
|
|
170
|
+
* [{ id: 1, name: 'foo'}, { id: 2, name: 'bar' }],
|
|
171
|
+
* );
|
|
172
|
+
*
|
|
173
|
+
* // Will return [{ id: null, name: '' }, { id: 1, name: 'foo' }, { id: 2, name: 'bar' }]
|
|
174
|
+
*
|
|
175
|
+
* @param suggestions List of suggestions
|
|
176
|
+
* @param options
|
|
177
|
+
* @param options.optionText
|
|
178
|
+
*/
|
|
179
|
+
const getSuggestion = ({ optionText = 'name', optionValue = 'id', text = '', value = null, }) => {
|
|
180
|
+
const suggestion = {};
|
|
181
|
+
set(suggestion, optionValue, value);
|
|
182
|
+
if (typeof optionText === 'string') {
|
|
183
|
+
set(suggestion, optionText, text);
|
|
184
|
+
}
|
|
185
|
+
return suggestion;
|
|
186
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { FieldValues } from 'react-hook-form';
|
|
2
|
+
/**
|
|
3
|
+
* Convert a simple validation function that returns an object matching the form shape with errors
|
|
4
|
+
* to a validation resolver compatible with react-hook-form.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const validate = (values: any) => {
|
|
8
|
+
* if (values.username == null || values.username.trim() === '') {
|
|
9
|
+
* return { username: 'Required' };
|
|
10
|
+
* }
|
|
11
|
+
* }
|
|
12
|
+
*
|
|
13
|
+
* const validationResolver = getSimpleValidationResolver(validate);
|
|
14
|
+
*
|
|
15
|
+
* const UserForm = () => (
|
|
16
|
+
* <Form
|
|
17
|
+
* defaultValues={{ username: 'John' }}
|
|
18
|
+
* validationResolver={validationResolver}
|
|
19
|
+
* >
|
|
20
|
+
* <TextField source="username" />
|
|
21
|
+
* </Form>
|
|
22
|
+
* );
|
|
23
|
+
*/
|
|
24
|
+
export declare const getSimpleValidationResolver: (validate: ValidateForm) => (data: FieldValues) => Promise<{
|
|
25
|
+
values: FieldValues;
|
|
26
|
+
errors: {};
|
|
27
|
+
} | {
|
|
28
|
+
values: {};
|
|
29
|
+
errors: any;
|
|
30
|
+
}>;
|
|
31
|
+
export type ValidateForm = (data: FieldValues) => FieldValues | Promise<FieldValues>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a simple validation function that returns an object matching the form shape with errors
|
|
3
|
+
* to a validation resolver compatible with react-hook-form.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* const validate = (values: any) => {
|
|
7
|
+
* if (values.username == null || values.username.trim() === '') {
|
|
8
|
+
* return { username: 'Required' };
|
|
9
|
+
* }
|
|
10
|
+
* }
|
|
11
|
+
*
|
|
12
|
+
* const validationResolver = getSimpleValidationResolver(validate);
|
|
13
|
+
*
|
|
14
|
+
* const UserForm = () => (
|
|
15
|
+
* <Form
|
|
16
|
+
* defaultValues={{ username: 'John' }}
|
|
17
|
+
* validationResolver={validationResolver}
|
|
18
|
+
* >
|
|
19
|
+
* <TextField source="username" />
|
|
20
|
+
* </Form>
|
|
21
|
+
* );
|
|
22
|
+
*/
|
|
23
|
+
export const getSimpleValidationResolver = (validate) => async (data) => {
|
|
24
|
+
const errors = await validate(data);
|
|
25
|
+
// If there are no errors, early return the form values
|
|
26
|
+
if (!errors || isEmptyObject(errors)) {
|
|
27
|
+
return { values: data, errors: {} };
|
|
28
|
+
}
|
|
29
|
+
// Else, we return an error object shaped like errors but having for each leaf
|
|
30
|
+
// `type: 'manual'` and a `message` prop like react-hook-form expects it
|
|
31
|
+
const transformedErrors = transformErrorFields(errors);
|
|
32
|
+
// Sometimes we still need to transform the error object to realize there are actually
|
|
33
|
+
// no errors in it.
|
|
34
|
+
// e.g. with an ArrayInput we can get something like: `{backlinks: [{}, {}]}`
|
|
35
|
+
// If, after transformation, there are no errors, we return the form values
|
|
36
|
+
if (!transformedErrors || isEmptyObject(transformedErrors)) {
|
|
37
|
+
return { values: data, errors: {} };
|
|
38
|
+
}
|
|
39
|
+
// Else return the errors and no values
|
|
40
|
+
return {
|
|
41
|
+
values: {},
|
|
42
|
+
errors: transformedErrors,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
const transformErrorFields = (error) => {
|
|
46
|
+
return Object.keys(error).reduce((acc, field) => {
|
|
47
|
+
// Handle arrays
|
|
48
|
+
if (Array.isArray(error[field])) {
|
|
49
|
+
let arrayHasErrors = false;
|
|
50
|
+
const transformedArrayErrors = error[field].map(item => {
|
|
51
|
+
if (!isEmptyObject(item)) {
|
|
52
|
+
arrayHasErrors = true;
|
|
53
|
+
}
|
|
54
|
+
return transformErrorFields(item);
|
|
55
|
+
});
|
|
56
|
+
if (!arrayHasErrors) {
|
|
57
|
+
return acc;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
...acc,
|
|
61
|
+
[field]: transformedArrayErrors,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Handle objects
|
|
65
|
+
if (isEmptyObject(error[field])) {
|
|
66
|
+
return acc;
|
|
67
|
+
}
|
|
68
|
+
if (typeof error[field] === 'object' &&
|
|
69
|
+
!isRaTranslationObj(error[field])) {
|
|
70
|
+
return {
|
|
71
|
+
...acc,
|
|
72
|
+
[field]: transformErrorFields(error[field]),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Handle leaf (either primary type or RaTranslationObj)
|
|
76
|
+
return {
|
|
77
|
+
...acc,
|
|
78
|
+
[field]: addTypeAndMessage(error[field]),
|
|
79
|
+
};
|
|
80
|
+
}, {});
|
|
81
|
+
};
|
|
82
|
+
const addTypeAndMessage = (error) => ({
|
|
83
|
+
type: 'manual',
|
|
84
|
+
message: isRaTranslationObj(error) ? error : { message: error },
|
|
85
|
+
});
|
|
86
|
+
const isRaTranslationObj = (obj) => Object.keys(obj).includes('message') && Object.keys(obj).includes('args');
|
|
87
|
+
const isEmptyObject = (obj) => obj == null || Object.getOwnPropertyNames(obj).length === 0;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './getSimpleValidationResolver';
|
|
2
|
+
export * from './setSubmissionErrors';
|
|
3
|
+
export * from './useGetValidationErrorMessage';
|
|
4
|
+
export * from './useNotifyIsFormInvalid';
|
|
5
|
+
export * from './useUnique';
|
|
6
|
+
export * from './validate';
|
|
7
|
+
export * from './ValidationError';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './getSimpleValidationResolver';
|
|
2
|
+
export * from './setSubmissionErrors';
|
|
3
|
+
export * from './useGetValidationErrorMessage';
|
|
4
|
+
export * from './useNotifyIsFormInvalid';
|
|
5
|
+
export * from './useUnique';
|
|
6
|
+
export * from './validate';
|
|
7
|
+
export * from './ValidationError';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FieldValues, UseFormSetError } from 'react-hook-form';
|
|
2
|
+
/**
|
|
3
|
+
* This internal function is used to convert an object matching the form shape with errors to a
|
|
4
|
+
* format compatible with react-hook-form. It's used to handle submission errors. Only useful when
|
|
5
|
+
* you are implementing a custom form without leveraging our Form component.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* const MyForm = () => {
|
|
9
|
+
* const { register, handleSubmit, setError } = useForm();
|
|
10
|
+
* const onSubmit = data => {
|
|
11
|
+
* return saveAsync(data).catch(error => setSubmissionErrors(error.body.details));
|
|
12
|
+
* };
|
|
13
|
+
*
|
|
14
|
+
* return (
|
|
15
|
+
* <form onSubmit={handleSubmit(onSubmit)}>
|
|
16
|
+
* ...
|
|
17
|
+
* </form>
|
|
18
|
+
* );
|
|
19
|
+
* };
|
|
20
|
+
*/
|
|
21
|
+
export declare const setSubmissionErrors: (errors: FieldValues, setError: UseFormSetError<FieldValues>) => void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This internal function is used to convert an object matching the form shape with errors to a
|
|
3
|
+
* format compatible with react-hook-form. It's used to handle submission errors. Only useful when
|
|
4
|
+
* you are implementing a custom form without leveraging our Form component.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* const MyForm = () => {
|
|
8
|
+
* const { register, handleSubmit, setError } = useForm();
|
|
9
|
+
* const onSubmit = data => {
|
|
10
|
+
* return saveAsync(data).catch(error => setSubmissionErrors(error.body.details));
|
|
11
|
+
* };
|
|
12
|
+
*
|
|
13
|
+
* return (
|
|
14
|
+
* <form onSubmit={handleSubmit(onSubmit)}>
|
|
15
|
+
* ...
|
|
16
|
+
* </form>
|
|
17
|
+
* );
|
|
18
|
+
* };
|
|
19
|
+
*/
|
|
20
|
+
export const setSubmissionErrors = (errors, setError) => {
|
|
21
|
+
const setErrorFromObject = (errors, rootPath) => {
|
|
22
|
+
Object.entries(errors).forEach(([name, error]) => {
|
|
23
|
+
if (typeof error === 'object') {
|
|
24
|
+
setErrorFromObject(error, `${rootPath}${name}.`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
setError(`${rootPath}${name}`, {
|
|
28
|
+
type: 'server',
|
|
29
|
+
message: error.toString(),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
setErrorFromObject(errors, '');
|
|
34
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ValidationErrorMessage } from './validate';
|
|
2
|
+
/**
|
|
3
|
+
* @deprecated
|
|
4
|
+
* This internal hook returns a function that can translate an error message.
|
|
5
|
+
* It handles simple string errors and those which have a message and args.
|
|
6
|
+
* Only useful if you are implementing custom inputs without leveraging our useInput hook.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const MyInput = props => {
|
|
10
|
+
* const { field, fieldState } = useController(props);
|
|
11
|
+
* useEffect(() => {
|
|
12
|
+
* if (fieldState.error) {
|
|
13
|
+
* const errorMessage = useGetValidationErrorMessage(fieldState.error);
|
|
14
|
+
* alert(errorMessage);
|
|
15
|
+
* }
|
|
16
|
+
* }, [fieldState.error]);
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <input {...field} />
|
|
20
|
+
* );
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* @see ValidationErrorMessage
|
|
24
|
+
* @see ValidationErrorMessageWithArgs
|
|
25
|
+
*/
|
|
26
|
+
export declare const useGetValidationErrorMessage: () => (error: ValidationErrorMessage) => string;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useTranslate } from '../../i18n';
|
|
2
|
+
/**
|
|
3
|
+
* @deprecated
|
|
4
|
+
* This internal hook returns a function that can translate an error message.
|
|
5
|
+
* It handles simple string errors and those which have a message and args.
|
|
6
|
+
* Only useful if you are implementing custom inputs without leveraging our useInput hook.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const MyInput = props => {
|
|
10
|
+
* const { field, fieldState } = useController(props);
|
|
11
|
+
* useEffect(() => {
|
|
12
|
+
* if (fieldState.error) {
|
|
13
|
+
* const errorMessage = useGetValidationErrorMessage(fieldState.error);
|
|
14
|
+
* alert(errorMessage);
|
|
15
|
+
* }
|
|
16
|
+
* }, [fieldState.error]);
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <input {...field} />
|
|
20
|
+
* );
|
|
21
|
+
* }
|
|
22
|
+
*
|
|
23
|
+
* @see ValidationErrorMessage
|
|
24
|
+
* @see ValidationErrorMessageWithArgs
|
|
25
|
+
*/
|
|
26
|
+
export const useGetValidationErrorMessage = () => {
|
|
27
|
+
const translate = useTranslate();
|
|
28
|
+
return (error) => {
|
|
29
|
+
if (error.message != null) {
|
|
30
|
+
const { message, args } = error;
|
|
31
|
+
return translate(message, { _: message, ...args });
|
|
32
|
+
}
|
|
33
|
+
return translate(error, { _: error });
|
|
34
|
+
};
|
|
35
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Control } from 'react-hook-form';
|
|
2
|
+
/**
|
|
3
|
+
* This hook display an error message on submit in Form and SaveButton.
|
|
4
|
+
*
|
|
5
|
+
* We can't do the form validity check in the form submit handler
|
|
6
|
+
* as the form state may not have been updated yet when onSubmit validation mode is enabled
|
|
7
|
+
* or when the form hasn't been touched at all.
|
|
8
|
+
*/
|
|
9
|
+
export declare const useNotifyIsFormInvalid: (control?: Control, enabled?: boolean) => void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { useFormState } from 'react-hook-form';
|
|
3
|
+
import { useNotify } from '../../notification';
|
|
4
|
+
/**
|
|
5
|
+
* This hook display an error message on submit in Form and SaveButton.
|
|
6
|
+
*
|
|
7
|
+
* We can't do the form validity check in the form submit handler
|
|
8
|
+
* as the form state may not have been updated yet when onSubmit validation mode is enabled
|
|
9
|
+
* or when the form hasn't been touched at all.
|
|
10
|
+
*/
|
|
11
|
+
export const useNotifyIsFormInvalid = (control, enabled = true) => {
|
|
12
|
+
const { submitCount, errors } = useFormState(control ? { control } : undefined);
|
|
13
|
+
const submitCountRef = useRef(submitCount);
|
|
14
|
+
const notify = useNotify();
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
// Checking the submit count allows us to only display the notification after users
|
|
17
|
+
// tried to submit
|
|
18
|
+
if (submitCount > submitCountRef.current && enabled) {
|
|
19
|
+
submitCountRef.current = submitCount;
|
|
20
|
+
if (Object.keys(errors).length > 0) {
|
|
21
|
+
const serverError = typeof errors.root?.serverError?.message === 'string'
|
|
22
|
+
? errors.root.serverError.message
|
|
23
|
+
: undefined;
|
|
24
|
+
notify(serverError || "strato.message.invalid_form', {
|
|
25
|
+
type: 'error',
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}, [errors, submitCount, notify, enabled]);
|
|
30
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { InputProps } from '../useInput';
|
|
2
|
+
/**
|
|
3
|
+
* A hook that returns a validation function checking for a record field uniqueness
|
|
4
|
+
* by calling the dataProvider getList function with a filter.
|
|
5
|
+
*
|
|
6
|
+
* @example // Passing options at declaration time
|
|
7
|
+
* const UserCreateForm = () => {
|
|
8
|
+
* const unique = useUnique({ message: 'Username is already used'});
|
|
9
|
+
* return (
|
|
10
|
+
* <SimpleForm>
|
|
11
|
+
* <TextInput source="username" validate={unique()} />
|
|
12
|
+
* </SimpleForm>
|
|
13
|
+
* );
|
|
14
|
+
* }
|
|
15
|
+
*
|
|
16
|
+
* @example // Passing options at call time
|
|
17
|
+
* const UserCreateForm = () => {
|
|
18
|
+
* const unique = useUnique();
|
|
19
|
+
* return (
|
|
20
|
+
* <SimpleForm>
|
|
21
|
+
* <TextInput source="username" validate={unique({ message: 'Username is already used'})} />
|
|
22
|
+
* </SimpleForm>
|
|
23
|
+
* );
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* @example // With additional filters
|
|
27
|
+
* const UserCreateForm = () => {
|
|
28
|
+
* const unique = useUnique();
|
|
29
|
+
* return (
|
|
30
|
+
* <SimpleForm>
|
|
31
|
+
* <ReferenceInput source="organization_id" reference="organizations" />
|
|
32
|
+
* <FormDataConsumer>
|
|
33
|
+
* {({ formData }) => (
|
|
34
|
+
* <TextInput
|
|
35
|
+
* source="username"
|
|
36
|
+
* validate={unique({ filter: { organization_id: formData.organization_id })}
|
|
37
|
+
* />
|
|
38
|
+
* )}
|
|
39
|
+
* </FormDataConsumer>
|
|
40
|
+
* </SimpleForm>
|
|
41
|
+
* );
|
|
42
|
+
* }
|
|
43
|
+
*/
|
|
44
|
+
export declare const useUnique: (options?: UseUniqueOptions) => (callTimeOptions?: UseUniqueOptions) => (value: any, allValues: any, props: InputProps) => Promise<string | {
|
|
45
|
+
message: any;
|
|
46
|
+
args: {
|
|
47
|
+
source: string;
|
|
48
|
+
value: any;
|
|
49
|
+
field: string | number | bigint | true | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null | undefined> | null;
|
|
50
|
+
};
|
|
51
|
+
} | undefined>;
|
|
52
|
+
export type UseUniqueOptions = {
|
|
53
|
+
debounce?: number;
|
|
54
|
+
resource?: string;
|
|
55
|
+
message?: string;
|
|
56
|
+
filter?: Record<string, any>;
|
|
57
|
+
};
|