From 5e279b75be344ed26fa7ebed63e0401667d4b162 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Fri, 31 Mar 2023 17:39:03 +0200 Subject: [PATCH 1/2] Fix MUI Autocomplete warning on deselection with ReferenceInput --- .../controller/input/useReferenceInputController.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/ra-core/src/controller/input/useReferenceInputController.ts b/packages/ra-core/src/controller/input/useReferenceInputController.ts index a60f63ddd26..3e93ae58c7c 100644 --- a/packages/ra-core/src/controller/input/useReferenceInputController.ts +++ b/packages/ra-core/src/controller/input/useReferenceInputController.ts @@ -1,4 +1,4 @@ -import { useCallback, useMemo } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { useWatch } from 'react-hook-form'; import { useGetList } from '../../dataProvider'; import { FilterPayload, RaRecord, SortPayload } from '../../types'; @@ -106,7 +106,7 @@ export const useReferenceInputController = ( // fetch current value const { - referenceRecord, + referenceRecord: currentReferenceRecord, refetch: refetchReference, error: referenceError, isLoading: referenceLoading, @@ -119,6 +119,15 @@ export const useReferenceInputController = ( meta, }, }); + + // We need to delay the update of the referenceRecord and the finalData + // to the next React state update, because otherwise it can raise a warning + // with AutocompleteInput saying the current value is not in the list of choices + const [referenceRecord, setReferenceRecord] = useState(null); + useEffect(() => { + setReferenceRecord(currentReferenceRecord); + }, [currentReferenceRecord]); + // add current value to possible sources let finalData: RecordType[], finalTotal: number; if ( From 0b8566029f7fa00742e9881c6aa97492bb5d0563 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Fri, 31 Mar 2023 18:45:27 +0200 Subject: [PATCH 2/2] fix unit test --- .../src/controller/input/useReferenceInputController.spec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ra-core/src/controller/input/useReferenceInputController.spec.tsx b/packages/ra-core/src/controller/input/useReferenceInputController.spec.tsx index c03a388ad27..c295e1be815 100644 --- a/packages/ra-core/src/controller/input/useReferenceInputController.spec.tsx +++ b/packages/ra-core/src/controller/input/useReferenceInputController.spec.tsx @@ -165,7 +165,7 @@ describe('useReferenceInputController', () => { ); await waitFor(() => { - expect(children).toBeCalledTimes(4); + expect(children.mock.calls.length).toBeGreaterThanOrEqual(4); }); expect(children).toHaveBeenCalledWith( expect.objectContaining({