From 5abe5538afb3d5511cbb65eb986f9c679101d3ee Mon Sep 17 00:00:00 2001 From: Ryan Lee Date: Tue, 5 May 2026 21:51:49 +0000 Subject: [PATCH] Add a preview management property to Search feature component --- CHANGELOG.md | 2 + .../AuthoritiesModal/AuthoritiesModal.tsx | 1 + .../components/modals/HubsModal/HubsModal.tsx | 1 + .../modals/SubjectModal/SubjectModal.tsx | 1 + .../hooks/useSearchControlsHandlers.test.ts | 57 +++++++++++++++++++ .../ui/hooks/useSearchControlsHandlers.ts | 14 +++-- .../search/ui/providers/SearchProvider.tsx | 3 +- .../search/ui/types/provider.types.ts | 1 + 8 files changed, 73 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5df1b7d..d83b5d2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,12 @@ * Fix Sonar issues. Refs [UILD-792]. * Fix for hidden menu bar. Refs [UILD-805]. * Fix for tooltip position. Refs [UILD-806]. +* Fix for blank preview in editor while searching for complex values. Refs [UILD-807]. [UILD-792]:https://folio-org.atlassian.net/browse/UILD-792 [UILD-805]:https://folio-org.atlassian.net/browse/UILD-805 [UILD-806]:https://folio-org.atlassian.net/browse/UILD-806 +[UILD-807]:https://folio-org.atlassian.net/browse/UILD-807 ## 2.0.1 (2026-04-23) * Fix for the case when changes to profile settings are not applied immediately. Fixes [UILD-798]. diff --git a/src/features/complexLookup/components/modals/AuthoritiesModal/AuthoritiesModal.tsx b/src/features/complexLookup/components/modals/AuthoritiesModal/AuthoritiesModal.tsx index 31bd878e..f0e5a5f1 100644 --- a/src/features/complexLookup/components/modals/AuthoritiesModal/AuthoritiesModal.tsx +++ b/src/features/complexLookup/components/modals/AuthoritiesModal/AuthoritiesModal.tsx @@ -81,6 +81,7 @@ export const AuthoritiesModal: FC = ({ flow="value" mode="custom" onSubmitCallback={handleCloseMarcPreview} + managePreview={false} > {/* Segment tabs - clicking triggers onSegmentChange, auto-resolves new config */} diff --git a/src/features/complexLookup/components/modals/HubsModal/HubsModal.tsx b/src/features/complexLookup/components/modals/HubsModal/HubsModal.tsx index bc70564f..b892faa6 100644 --- a/src/features/complexLookup/components/modals/HubsModal/HubsModal.tsx +++ b/src/features/complexLookup/components/modals/HubsModal/HubsModal.tsx @@ -47,6 +47,7 @@ export const HubsModal: FC = ({ isOpen, onClose, assignedValue, flow="value" mode="custom" onSubmitCallback={hubPreviewProps.handleCloseHubPreview} + managePreview={false} > diff --git a/src/features/complexLookup/components/modals/SubjectModal/SubjectModal.tsx b/src/features/complexLookup/components/modals/SubjectModal/SubjectModal.tsx index 0fb970da..930a676a 100644 --- a/src/features/complexLookup/components/modals/SubjectModal/SubjectModal.tsx +++ b/src/features/complexLookup/components/modals/SubjectModal/SubjectModal.tsx @@ -91,6 +91,7 @@ export const SubjectModal: FC = ({ handleCloseMarcPreview(); hubPreviewProps.handleCloseHubPreview(); }} + managePreview={false} > diff --git a/src/features/search/ui/hooks/useSearchControlsHandlers.test.ts b/src/features/search/ui/hooks/useSearchControlsHandlers.test.ts index c9337c04..1fe938a4 100644 --- a/src/features/search/ui/hooks/useSearchControlsHandlers.test.ts +++ b/src/features/search/ui/hooks/useSearchControlsHandlers.test.ts @@ -189,6 +189,25 @@ describe('useSearchControlsHandlers', () => { expect(resetFullDisplayComponentType).toHaveBeenCalled(); expect(resetCurrentlyPreviewedEntityBfid).toHaveBeenCalled(); }); + + it('skips preview management while configured not to when changing segment', () => { + const { result } = renderHook(() => + useSearchControlsHandlers({ + coreConfig: mockConfig, + uiConfig: mockUIConfig, + flow: 'url', + managePreview: false, + }), + ); + + act(() => { + result.current.onSegmentChange('browse'); + }); + + expect(resetPreviewContent).not.toHaveBeenCalled(); + expect(resetFullDisplayComponentType).not.toHaveBeenCalled(); + expect(resetCurrentlyPreviewedEntityBfid).not.toHaveBeenCalled(); + }); }); describe('onSourceChange', () => { @@ -441,6 +460,25 @@ describe('useSearchControlsHandlers', () => { expect(resetCurrentlyPreviewedEntityBfid).toHaveBeenCalled(); }); + it('skips preview management while configured not to on submit', () => { + const { result } = renderHook(() => + useSearchControlsHandlers({ + coreConfig: mockConfig, + uiConfig: mockUIConfig, + flow: 'url', + managePreview: false, + }), + ); + + act(() => { + result.current.onSubmit(); + }); + + expect(resetPreviewContent).not.toHaveBeenCalled(); + expect(resetFullDisplayComponentType).not.toHaveBeenCalled(); + expect(resetCurrentlyPreviewedEntityBfid).not.toHaveBeenCalled(); + }); + it('calls onSubmitCallback on submit when provided', () => { const mockOnSubmitCallback = jest.fn(); const { result } = renderHook(() => @@ -551,6 +589,25 @@ describe('useSearchControlsHandlers', () => { expect(resetCurrentlyPreviewedEntityBfid).toHaveBeenCalled(); }); + it('skips preview management while configured not to on reset', () => { + const { result } = renderHook(() => + useSearchControlsHandlers({ + coreConfig: mockConfig, + uiConfig: mockUIConfig, + flow: 'url', + managePreview: false, + }), + ); + + act(() => { + result.current.onReset(); + }); + + expect(resetPreviewContent).not.toHaveBeenCalled(); + expect(resetFullDisplayComponentType).not.toHaveBeenCalled(); + expect(resetCurrentlyPreviewedEntityBfid).not.toHaveBeenCalled(); + }); + it('sets default source in navigation state when segment has a default source', () => { setInitialGlobalState([ { diff --git a/src/features/search/ui/hooks/useSearchControlsHandlers.ts b/src/features/search/ui/hooks/useSearchControlsHandlers.ts index e94b2bd5..40033427 100644 --- a/src/features/search/ui/hooks/useSearchControlsHandlers.ts +++ b/src/features/search/ui/hooks/useSearchControlsHandlers.ts @@ -31,6 +31,7 @@ interface UseSearchControlsHandlersParams { }; refetch?: () => Promise; onSubmitCallback?: () => void; + managePreview?: boolean; } interface SearchControlsHandlers { @@ -115,6 +116,7 @@ export const useSearchControlsHandlers = ({ results, refetch, onSubmitCallback, + managePreview = true, }: UseSearchControlsHandlersParams): SearchControlsHandlers => { const [searchParams, setSearchParams] = useSearchParams(); @@ -222,9 +224,7 @@ export const useSearchControlsHandlers = ({ saveCurrentDraft(); // Reset preview - resetPreviewContent(); - resetFullDisplayComponentType(); - resetCurrentlyPreviewedEntityBfid(); + resetPreview(); // Resolve configs for the new segment using centralized resolvers const newSegmentConfig = resolveCoreConfig(newSegment); @@ -313,9 +313,11 @@ export const useSearchControlsHandlers = ({ ); const resetPreview = () => { - resetPreviewContent(); - resetFullDisplayComponentType(); - resetCurrentlyPreviewedEntityBfid(); + if (managePreview) { + resetPreviewContent(); + resetFullDisplayComponentType(); + resetCurrentlyPreviewedEntityBfid(); + } }; const handleSubmit = useCallback(() => { diff --git a/src/features/search/ui/providers/SearchProvider.tsx b/src/features/search/ui/providers/SearchProvider.tsx index bb2144a6..0e759aff 100644 --- a/src/features/search/ui/providers/SearchProvider.tsx +++ b/src/features/search/ui/providers/SearchProvider.tsx @@ -16,7 +16,7 @@ function isDynamicMode(props: SearchProviderProps): props is SearchProviderProps } export const SearchProvider: FC = props => { - const { flow, mode = 'custom', children, onSubmitCallback } = props; + const { flow, mode = 'custom', children, onSubmitCallback, managePreview } = props; const { isLoading: isGlobalLoading } = useLoadingState(['isLoading']); // Extract dynamic/static mode params @@ -73,6 +73,7 @@ export const SearchProvider: FC = props => { results, refetch, onSubmitCallback, + managePreview, }); // Sync URL to store (URL flow only) diff --git a/src/features/search/ui/types/provider.types.ts b/src/features/search/ui/types/provider.types.ts index 07e9463e..4f2dc1c6 100644 --- a/src/features/search/ui/types/provider.types.ts +++ b/src/features/search/ui/types/provider.types.ts @@ -104,6 +104,7 @@ interface BaseProviderProps { mode?: RenderMode; children: React.ReactNode; onSubmitCallback?: () => void; + managePreview?: boolean; } export type SearchProviderProps = BaseProviderProps & (StaticModeProps | DynamicModeProps);