From 83bded4b229842c39b2e014a0fd2144f83972997 Mon Sep 17 00:00:00 2001 From: Denys Bohdan Date: Wed, 29 Nov 2023 16:14:12 +0100 Subject: [PATCH 1/4] UIQM-588 Use Authority search to get Authority linked records count. --- CHANGELOG.md | 1 + package.json | 3 ++- .../QuickMarcEditorContainer.js | 14 +---------- .../useAuthorityLinksCount.js | 24 ++++++++++++++----- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9787bde3..33920cf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * [UIQM-573](https://issues.folio.org/browse/UIQM-573) Edit MARC authority | Allow user to Add/Edit 010 $a when linking is based on 001. * [UIQM-574](https://issues.folio.org/browse/UIQM-574) Added authority source file selection button and modal to Authority Create view. * [UIQM-591](https://issues.folio.org/browse/UIQM-591) Show permission `quickMARC: Create a new MARC authority record`. Don't load locations when MARC type is not Holdings. +* [UIQM-588](https://issues.folio.org/browse/UIQM-588) Use Authority search to get Authority linked records count. ## [7.0.4](https://github.com/folio-org/ui-quick-marc/tree/v7.0.4) (2023-11-09) diff --git a/package.json b/package.json index a2c622ee..2b138daf 100644 --- a/package.json +++ b/package.json @@ -125,7 +125,8 @@ "marc-records-editor.item.get", "marc-records-editor.item.put", "inventory-storage.locations.collection.get", - "marc-specifications.item.get" + "marc-specifications.item.get", + "search.authorities.collection.get" ], "visible": true }, diff --git a/src/QuickMarcEditor/QuickMarcEditorContainer.js b/src/QuickMarcEditor/QuickMarcEditorContainer.js index 41d8521b..26c81707 100644 --- a/src/QuickMarcEditor/QuickMarcEditorContainer.js +++ b/src/QuickMarcEditor/QuickMarcEditorContainer.js @@ -85,7 +85,6 @@ const QuickMarcEditorContainer = ({ const [marcRecord, setMarcRecord] = useState(); const [locations, setLocations] = useState(); const [isLoading, setIsLoading] = useState(true); - const [linksCount, setLinksCount] = useState(0); const [fixedFieldSpec, setFixedFieldSpec] = useState(); const searchParams = new URLSearchParams(location.search); @@ -96,7 +95,7 @@ const QuickMarcEditorContainer = ({ && action !== QUICK_MARC_ACTIONS.CREATE; const showCallout = useShowCallout(); - const { fetchLinksCount } = useAuthorityLinksCount(); + const { linksCount } = useAuthorityLinksCount({ id: externalId }); const closeEditor = useCallback((id) => { if (marcType === MARC_TYPES.HOLDINGS && action !== QUICK_MARC_ACTIONS.CREATE) { @@ -147,10 +146,6 @@ const QuickMarcEditorContainer = ({ // must be with the central tenant id when user derives shared record const linkingRulesPromise = mutator.linkingRules.GET(headers); - const linksCountPromise = marcType === MARC_TYPES.AUTHORITY - ? fetchLinksCount([externalId]) - : Promise.resolve(); - const fixedFieldSpecPromise = mutator.fixedFieldSpec.GET({ path: `${MARC_SPEC_API}/${marcType}/008`, ...headers, @@ -160,7 +155,6 @@ const QuickMarcEditorContainer = ({ instancePromise, marcRecordPromise, locationsPromise, - linksCountPromise, linkingRulesPromise, fixedFieldSpecPromise, ]) @@ -168,14 +162,9 @@ const QuickMarcEditorContainer = ({ instanceResponse, marcRecordResponse, locationsResponse, - linksCountResponse, linkingRulesResponse, fixedFieldSpecResponse, ]) => { - if (marcType === MARC_TYPES.AUTHORITY) { - setLinksCount(linksCountResponse.links[0].totalLinks); - } - if (action !== QUICK_MARC_ACTIONS.CREATE) { searchParams.set('relatedRecordVersion', instanceResponse._version); @@ -211,7 +200,6 @@ const QuickMarcEditorContainer = ({ externalId, history, marcType, - fetchLinksCount, centralTenantId, token, locale, diff --git a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js index 6dbec4fc..55e6dd20 100644 --- a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js +++ b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js @@ -1,15 +1,27 @@ -import { useMutation } from 'react-query'; +import { useQuery } from 'react-query'; + +import { useNamespace } from '@folio/stripes/core'; + import { useTenantKy } from '../../temp'; -const useAuthorityLinksCount = ({ tenantId } = {}) => { +const useAuthorityLinksCount = ({ id, tenantId } = {}) => { const ky = useTenantKy({ tenantId }); + const [namespace] = useNamespace(); + + const searchParams = { + query: `(id==${id} and authRefType==("Authorized"))`, // only Authorized records have links counts, so we need to get them + }; - const { mutateAsync, isLoading } = useMutation({ - mutationFn: ids => ky.post('links/authorities/bulk/count', { json: { ids } }).json(), - }); + const { data = {}, isLoading } = useQuery( + [namespace, 'authority', id], + () => ky.get('search/authorities', { searchParams }).json(), + { + keepPreviousData: true, + }, + ); return { - fetchLinksCount: mutateAsync, + linksCount: data.authorities?.[0]?.numberOfTitles || 0, isLoading, }; }; From 7a0ff16e36bd23a08ef035275a6659e404b076d6 Mon Sep 17 00:00:00 2001 From: Denys Bohdan Date: Wed, 29 Nov 2023 16:41:51 +0100 Subject: [PATCH 2/4] UIQM-588 Updated tests --- .../QuickMarcEditorContainer.js | 2 +- .../QuickMarcEditorContainer.test.js | 6 +--- .../useAuthorityLinksCount.js | 1 + .../useAuthorityLinksCount.test.js | 29 ++++++++++--------- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/QuickMarcEditor/QuickMarcEditorContainer.js b/src/QuickMarcEditor/QuickMarcEditorContainer.js index 26c81707..e5ad5327 100644 --- a/src/QuickMarcEditor/QuickMarcEditorContainer.js +++ b/src/QuickMarcEditor/QuickMarcEditorContainer.js @@ -95,7 +95,7 @@ const QuickMarcEditorContainer = ({ && action !== QUICK_MARC_ACTIONS.CREATE; const showCallout = useShowCallout(); - const { linksCount } = useAuthorityLinksCount({ id: externalId }); + const { linksCount } = useAuthorityLinksCount({ id: marcType === MARC_TYPES.AUTHORITY && externalId }); const closeEditor = useCallback((id) => { if (marcType === MARC_TYPES.HOLDINGS && action !== QUICK_MARC_ACTIONS.CREATE) { diff --git a/src/QuickMarcEditor/QuickMarcEditorContainer.test.js b/src/QuickMarcEditor/QuickMarcEditorContainer.test.js index 50860a15..b98b752d 100644 --- a/src/QuickMarcEditor/QuickMarcEditorContainer.test.js +++ b/src/QuickMarcEditor/QuickMarcEditorContainer.test.js @@ -160,10 +160,6 @@ describe('Given Quick Marc Editor Container', () => { describe('when the marc type is authority', () => { it('should make a request to get the number of links', async () => { - useAuthorityLinksCount.mockClear().mockReturnValue({ - fetchLinksCount: mockFetchLinksCount, - }); - await act(async () => { await renderQuickMarcEditorContainer({ mutator, @@ -174,7 +170,7 @@ describe('Given Quick Marc Editor Container', () => { }); }); - expect(mockFetchLinksCount).toHaveBeenCalledWith([match.params.externalId]); + expect(useAuthorityLinksCount).toHaveBeenCalledWith({ id: match.params.externalId }); }); }); diff --git a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js index 55e6dd20..c450dbc8 100644 --- a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js +++ b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js @@ -17,6 +17,7 @@ const useAuthorityLinksCount = ({ id, tenantId } = {}) => { () => ky.get('search/authorities', { searchParams }).json(), { keepPreviousData: true, + enabled: Boolean(id), }, ); diff --git a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.test.js b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.test.js index 541bd6db..59b066f5 100644 --- a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.test.js +++ b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.test.js @@ -4,16 +4,11 @@ import { } from 'react-query'; import { renderHook } from '@folio/jest-config-stripes/testing-library/react'; -import '../../../test/jest/__mock__'; - import { useOkapiKy } from '@folio/stripes/core'; import useAuthorityLinksCount from './useAuthorityLinksCount'; -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), - useLocation: jest.fn(), -})); +import '../../../test/jest/__mock__'; const queryClient = new QueryClient(); @@ -23,22 +18,30 @@ const wrapper = ({ children }) => ( ); -const mockPost = jest.fn().mockReturnValue({ - json: jest.fn().mockResolvedValue({ links: [] }), +const mockGet = jest.fn().mockReturnValue({ + json: jest.fn().mockResolvedValue({ authorities: [{ numberOfTitles: 2 }] }), }); describe('Given useAuthorityLinksCount', () => { beforeEach(() => { useOkapiKy.mockClear().mockReturnValue({ - post: mockPost, + get: mockGet, }); }); - it('should fetch links count', async () => { - const { result } = renderHook(() => useAuthorityLinksCount(), { wrapper }); + it('should fetch authorities', async () => { + renderHook(() => useAuthorityLinksCount({ id: 'fakeId' }), { wrapper }); + + expect(mockGet).toHaveBeenCalledWith('search/authorities', { + searchParams: { + query: '(id==fakeId and authRefType==("Authorized"))', + }, + }); + }); - await result.current.fetchLinksCount(['fakeId']); + it('should return links count', async () => { + const { result } = renderHook(() => useAuthorityLinksCount({ id: 'fakeId' }), { wrapper }); - expect(mockPost).toHaveBeenCalledWith('links/authorities/bulk/count', { json: { ids: ['fakeId'] } }); + expect(result.current.linksCount).toEqual(2); }); }); From 68f6fde6848df18870799466f873e06429d6d76a Mon Sep 17 00:00:00 2001 From: Denys Bohdan Date: Mon, 4 Dec 2023 11:26:58 +0100 Subject: [PATCH 3/4] UIQM-588 Added search interface --- package.json | 1 + src/QuickMarcEditor/QuickMarcEditorContainer.test.js | 2 -- .../useAuthorityLinksCount/useAuthorityLinksCount.js | 11 ++++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 2b138daf..89aab5d4 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "inventory": "13.0", "marc-records-editor": "5.0", "permissions": "5.6", + "search": "1.2", "marc-specifications": "1.0", "instance-authority-links": "2.1" }, diff --git a/src/QuickMarcEditor/QuickMarcEditorContainer.test.js b/src/QuickMarcEditor/QuickMarcEditorContainer.test.js index b98b752d..d08f6b1d 100644 --- a/src/QuickMarcEditor/QuickMarcEditorContainer.test.js +++ b/src/QuickMarcEditor/QuickMarcEditorContainer.test.js @@ -24,8 +24,6 @@ import buildStripes from '../../test/jest/__mock__/stripesCore.mock'; import { useAuthorityLinksCount } from '../queries'; import { applyCentralTenantInHeaders } from './utils'; -const mockFetchLinksCount = jest.fn().mockResolvedValue(); - const match = { path: '/marc-authorities/quick-marc/edit-authority/:externalId', url: '/marc-authorities/quick-marc/edit-authority/external-id', diff --git a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js index c450dbc8..cba372f6 100644 --- a/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js +++ b/src/queries/useAuthorityLinksCount/useAuthorityLinksCount.js @@ -1,11 +1,12 @@ import { useQuery } from 'react-query'; -import { useNamespace } from '@folio/stripes/core'; +import { + useNamespace, + useOkapiKy, +} from '@folio/stripes/core'; -import { useTenantKy } from '../../temp'; - -const useAuthorityLinksCount = ({ id, tenantId } = {}) => { - const ky = useTenantKy({ tenantId }); +const useAuthorityLinksCount = ({ id } = {}) => { + const ky = useOkapiKy(); const [namespace] = useNamespace(); const searchParams = { From 6fff95ad7dcdafc86cb072630c5960993ef86878 Mon Sep 17 00:00:00 2001 From: Denys Bohdan Date: Tue, 5 Dec 2023 10:08:00 +0100 Subject: [PATCH 4/4] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33920cf0..e66c4001 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ * [UIQM-573](https://issues.folio.org/browse/UIQM-573) Edit MARC authority | Allow user to Add/Edit 010 $a when linking is based on 001. * [UIQM-574](https://issues.folio.org/browse/UIQM-574) Added authority source file selection button and modal to Authority Create view. * [UIQM-591](https://issues.folio.org/browse/UIQM-591) Show permission `quickMARC: Create a new MARC authority record`. Don't load locations when MARC type is not Holdings. -* [UIQM-588](https://issues.folio.org/browse/UIQM-588) Use Authority search to get Authority linked records count. +* [UIQM-588](https://issues.folio.org/browse/UIQM-588) *BREAKING* Use Authority search to get Authority linked records count. ## [7.0.4](https://github.com/folio-org/ui-quick-marc/tree/v7.0.4) (2023-11-09)