4087 refactor object metadata item hooks and utils (#4861)
- Extracted each exported element from useObjectMetadataItem into its own hook.
This commit is contained in:
@ -1,21 +0,0 @@
|
||||
import { renderHook } from '@testing-library/react';
|
||||
|
||||
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useGetObjectOrderByField', () => {
|
||||
it('should work as expected', () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
|
||||
const { result } = renderHook(() =>
|
||||
useGetObjectOrderByField({ objectMetadataItem })('AscNullsLast'),
|
||||
);
|
||||
expect(result.current).toEqual({
|
||||
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,33 @@
|
||||
import { ReactNode } from 'react';
|
||||
import { MockedProvider } from '@apollo/client/testing';
|
||||
import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
|
||||
|
||||
const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
<RecoilRoot>
|
||||
<MockedProvider addTypename={false}>{children}</MockedProvider>
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
describe('useGetObjectOrderByField', () => {
|
||||
it('should work as expected', () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const { getObjectOrderByField } = useGetObjectOrderByField({
|
||||
objectNameSingular: 'person',
|
||||
});
|
||||
|
||||
return getObjectOrderByField('AscNullsLast');
|
||||
},
|
||||
{
|
||||
wrapper: Wrapper,
|
||||
},
|
||||
);
|
||||
|
||||
expect(result.current).toEqual({
|
||||
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
|
||||
});
|
||||
});
|
||||
});
|
||||
@ -2,21 +2,19 @@ import { renderHook } from '@testing-library/react';
|
||||
import { RecoilRoot } from 'recoil';
|
||||
|
||||
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
describe('useMapToObjectRecordIdentifier', () => {
|
||||
it('should work as expected', async () => {
|
||||
const { result } = renderHook(
|
||||
() => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
|
||||
objectNameSingular: 'person',
|
||||
});
|
||||
|
||||
return useMapToObjectRecordIdentifier({
|
||||
objectMetadataItem,
|
||||
})({ id: 'id', name: { firstName: 'Sheldon', lastName: 'Cooper' } });
|
||||
return mapToObjectRecordIdentifier({
|
||||
id: 'id',
|
||||
name: { firstName: 'Sheldon', lastName: 'Cooper' },
|
||||
});
|
||||
},
|
||||
{
|
||||
wrapper: RecoilRoot,
|
||||
|
||||
@ -11,6 +11,7 @@ const Wrapper = ({ children }: { children: ReactNode }) => (
|
||||
</RecoilRoot>
|
||||
);
|
||||
|
||||
// Split into tests for each new hook
|
||||
describe('useObjectMetadataItem', () => {
|
||||
it('should return correct properties', async () => {
|
||||
const { result } = renderHook(
|
||||
@ -20,39 +21,8 @@ describe('useObjectMetadataItem', () => {
|
||||
},
|
||||
);
|
||||
|
||||
const {
|
||||
basePathToShowPage,
|
||||
objectMetadataItem,
|
||||
labelIdentifierFieldMetadata,
|
||||
getRecordFromCache,
|
||||
findManyRecordsQuery,
|
||||
findOneRecordQuery,
|
||||
createOneRecordMutation,
|
||||
updateOneRecordMutation,
|
||||
deleteOneRecordMutation,
|
||||
executeQuickActionOnOneRecordMutation,
|
||||
createManyRecordsMutation,
|
||||
deleteManyRecordsMutation,
|
||||
mapToObjectRecordIdentifier,
|
||||
getObjectOrderByField,
|
||||
} = result.current;
|
||||
const { objectMetadataItem } = result.current;
|
||||
|
||||
expect(labelIdentifierFieldMetadata).toBeUndefined();
|
||||
expect(basePathToShowPage).toBe('/object/opportunity/');
|
||||
expect(objectMetadataItem.id).toBe('20202020-cae9-4ff4-9579-f7d9fe44c937');
|
||||
expect(typeof getRecordFromCache).toBe('function');
|
||||
expect(typeof mapToObjectRecordIdentifier).toBe('function');
|
||||
expect(typeof getObjectOrderByField).toBe('function');
|
||||
expect(findManyRecordsQuery).toHaveProperty('kind', 'Document');
|
||||
expect(findOneRecordQuery).toHaveProperty('kind', 'Document');
|
||||
expect(createOneRecordMutation).toHaveProperty('kind', 'Document');
|
||||
expect(updateOneRecordMutation).toHaveProperty('kind', 'Document');
|
||||
expect(deleteOneRecordMutation).toHaveProperty('kind', 'Document');
|
||||
expect(executeQuickActionOnOneRecordMutation).toHaveProperty(
|
||||
'kind',
|
||||
'Document',
|
||||
);
|
||||
expect(createManyRecordsMutation).toHaveProperty('kind', 'Document');
|
||||
expect(deleteManyRecordsMutation).toHaveProperty('kind', 'Document');
|
||||
});
|
||||
});
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
import { ApolloClient, useApolloClient, useMutation } from '@apollo/client';
|
||||
import { getOperationName } from '@apollo/client/utilities';
|
||||
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
|
||||
import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery';
|
||||
import {
|
||||
CreateObjectInput,
|
||||
CreateOneObjectMetadataItemMutation,
|
||||
@ -17,7 +17,8 @@ import { useApolloMetadataClient } from './useApolloMetadataClient';
|
||||
export const useCreateOneObjectMetadataItem = () => {
|
||||
const apolloMetadataClient = useApolloMetadataClient();
|
||||
const apolloClient = useApolloClient();
|
||||
const { findManyRecordsQuery } = useObjectMetadataItem({
|
||||
|
||||
const { findManyRecordsQuery } = useFindManyRecordsQuery({
|
||||
objectNameSingular: CoreObjectNameSingular.View,
|
||||
});
|
||||
|
||||
|
||||
@ -1,14 +1,20 @@
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
import { OrderBy } from '@/object-metadata/types/OrderBy';
|
||||
import { OrderByField } from '@/object-metadata/types/OrderByField';
|
||||
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField';
|
||||
import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField';
|
||||
|
||||
export const useGetObjectOrderByField = ({
|
||||
objectMetadataItem,
|
||||
objectNameSingular,
|
||||
}: {
|
||||
objectMetadataItem: ObjectMetadataItem;
|
||||
objectNameSingular: string;
|
||||
}) => {
|
||||
return (orderBy: OrderBy): OrderByField => {
|
||||
return getObjectOrderByField(objectMetadataItem, orderBy);
|
||||
const { objectMetadataItem } = useObjectMetadataItem({
|
||||
objectNameSingular,
|
||||
});
|
||||
|
||||
const getObjectOrderByField = (orderBy: OrderBy): OrderByField => {
|
||||
return getOrderByFieldForObjectMetadataItem(objectMetadataItem, orderBy);
|
||||
};
|
||||
|
||||
return { getObjectOrderByField };
|
||||
};
|
||||
|
||||
@ -0,0 +1,17 @@
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
|
||||
|
||||
export const useLabelIdentifierFieldMetadataItem = ({
|
||||
objectNameSingular,
|
||||
}: {
|
||||
objectNameSingular: string;
|
||||
}) => {
|
||||
const { objectMetadataItem } = useObjectMetadataItem({
|
||||
objectNameSingular,
|
||||
});
|
||||
|
||||
const labelIdentifierFieldMetadataItem =
|
||||
getLabelIdentifierFieldMetadataItem(objectMetadataItem);
|
||||
|
||||
return { labelIdentifierFieldMetadataItem };
|
||||
};
|
||||
@ -1,8 +1,19 @@
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
|
||||
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
|
||||
import { ObjectRecord } from '@/object-record/types/ObjectRecord';
|
||||
|
||||
export const useMapToObjectRecordIdentifier =
|
||||
({ objectMetadataItem }: { objectMetadataItem: ObjectMetadataItem }) =>
|
||||
(record: ObjectRecord) =>
|
||||
getObjectRecordIdentifier({ objectMetadataItem, record });
|
||||
export const useMapToObjectRecordIdentifier = ({
|
||||
objectNameSingular,
|
||||
}: {
|
||||
objectNameSingular: string;
|
||||
}) => {
|
||||
const { objectMetadataItem } = useObjectMetadataItem({
|
||||
objectNameSingular,
|
||||
});
|
||||
|
||||
const mapToObjectRecordIdentifier = (record: ObjectRecord) => {
|
||||
return getObjectRecordIdentifier({ objectMetadataItem, record });
|
||||
};
|
||||
|
||||
return { mapToObjectRecordIdentifier };
|
||||
};
|
||||
|
||||
@ -1,47 +1,17 @@
|
||||
import { gql } from '@apollo/client';
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts';
|
||||
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError';
|
||||
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
|
||||
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
|
||||
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
|
||||
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
|
||||
import { useGenerateCreateManyRecordMutation } from '@/object-record/hooks/useGenerateCreateManyRecordMutation';
|
||||
import { useGenerateCreateOneRecordMutation } from '@/object-record/hooks/useGenerateCreateOneRecordMutation';
|
||||
import { useGenerateDeleteManyRecordMutation } from '@/object-record/hooks/useGenerateDeleteManyRecordMutation';
|
||||
import { useGenerateExecuteQuickActionOnOneRecordMutation } from '@/object-record/hooks/useGenerateExecuteQuickActionOnOneRecordMutation';
|
||||
import { useGenerateFindDuplicateRecordsQuery } from '@/object-record/hooks/useGenerateFindDuplicateRecordsQuery';
|
||||
import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenerateFindManyRecordsQuery';
|
||||
import { useGenerateFindOneRecordQuery } from '@/object-record/hooks/useGenerateFindOneRecordQuery';
|
||||
import { useGenerateUpdateOneRecordMutation } from '@/object-record/hooks/useGenerateUpdateOneRecordMutation';
|
||||
import { generateDeleteOneRecordMutation } from '@/object-record/utils/generateDeleteOneRecordMutation';
|
||||
import { isDefined } from '~/utils/isDefined';
|
||||
|
||||
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
|
||||
|
||||
export const EMPTY_QUERY = gql`
|
||||
query EmptyQuery {
|
||||
empty
|
||||
}
|
||||
`;
|
||||
|
||||
export const EMPTY_MUTATION = gql`
|
||||
mutation EmptyMutation {
|
||||
empty
|
||||
}
|
||||
`;
|
||||
|
||||
export const useObjectMetadataItem = (
|
||||
{ objectNameSingular }: ObjectMetadataItemIdentifier,
|
||||
depth?: number,
|
||||
queryFields?: Record<string, any>,
|
||||
computeReferences = false,
|
||||
) => {
|
||||
export const useObjectMetadataItem = ({
|
||||
objectNameSingular,
|
||||
}: ObjectMetadataItemIdentifier) => {
|
||||
const currentWorkspace = useRecoilValue(currentWorkspaceState);
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
@ -71,89 +41,7 @@ export const useObjectMetadataItem = (
|
||||
);
|
||||
}
|
||||
|
||||
const mapToObjectRecordIdentifier = useMapToObjectRecordIdentifier({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const getObjectOrderByField = useGetObjectOrderByField({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const getRecordFromCache = useGetRecordFromCache({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const generateFindManyRecordsQuery = useGenerateFindManyRecordsQuery();
|
||||
const findManyRecordsQuery = generateFindManyRecordsQuery({
|
||||
objectMetadataItem,
|
||||
depth,
|
||||
queryFields,
|
||||
});
|
||||
|
||||
const generateFindDuplicateRecordsQuery =
|
||||
useGenerateFindDuplicateRecordsQuery();
|
||||
const findDuplicateRecordsQuery = generateFindDuplicateRecordsQuery({
|
||||
objectMetadataItem,
|
||||
depth,
|
||||
});
|
||||
|
||||
const generateFindOneRecordQuery = useGenerateFindOneRecordQuery();
|
||||
const findOneRecordQuery = generateFindOneRecordQuery({
|
||||
objectMetadataItem,
|
||||
depth,
|
||||
});
|
||||
|
||||
const createOneRecordMutation = useGenerateCreateOneRecordMutation({
|
||||
objectMetadataItem,
|
||||
depth,
|
||||
});
|
||||
|
||||
const createManyRecordsMutation = useGenerateCreateManyRecordMutation({
|
||||
objectMetadataItem,
|
||||
depth,
|
||||
});
|
||||
|
||||
const updateOneRecordMutation = useGenerateUpdateOneRecordMutation({
|
||||
objectMetadataItem,
|
||||
depth,
|
||||
computeReferences,
|
||||
});
|
||||
|
||||
const deleteOneRecordMutation = generateDeleteOneRecordMutation({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const deleteManyRecordsMutation = useGenerateDeleteManyRecordMutation({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const executeQuickActionOnOneRecordMutation =
|
||||
useGenerateExecuteQuickActionOnOneRecordMutation({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
const labelIdentifierFieldMetadata =
|
||||
getLabelIdentifierFieldMetadataItem(objectMetadataItem);
|
||||
|
||||
const basePathToShowPage = getBasePathToShowPage({
|
||||
objectMetadataItem,
|
||||
});
|
||||
|
||||
return {
|
||||
labelIdentifierFieldMetadata,
|
||||
basePathToShowPage,
|
||||
objectMetadataItem,
|
||||
getRecordFromCache,
|
||||
findManyRecordsQuery,
|
||||
findDuplicateRecordsQuery,
|
||||
findOneRecordQuery,
|
||||
createOneRecordMutation,
|
||||
updateOneRecordMutation,
|
||||
deleteOneRecordMutation,
|
||||
executeQuickActionOnOneRecordMutation,
|
||||
createManyRecordsMutation,
|
||||
deleteManyRecordsMutation,
|
||||
mapToObjectRecordIdentifier,
|
||||
getObjectOrderByField,
|
||||
};
|
||||
};
|
||||
|
||||
@ -1,47 +0,0 @@
|
||||
import { useRecoilValue } from 'recoil';
|
||||
|
||||
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts';
|
||||
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError';
|
||||
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
||||
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { isDefined } from '~/utils/isDefined';
|
||||
|
||||
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
|
||||
|
||||
export const useObjectMetadataItemOnly = ({
|
||||
objectNameSingular,
|
||||
}: ObjectMetadataItemIdentifier) => {
|
||||
const currentWorkspace = useRecoilValue(currentWorkspaceState);
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
let objectMetadataItem = useRecoilValue(
|
||||
objectMetadataItemFamilySelector({
|
||||
objectName: objectNameSingular,
|
||||
objectNameType: 'singular',
|
||||
}),
|
||||
);
|
||||
|
||||
let objectMetadataItems = useRecoilValue(objectMetadataItemsState);
|
||||
|
||||
if (currentWorkspace?.activationStatus !== 'active') {
|
||||
objectMetadataItem =
|
||||
mockObjectMetadataItems.find(
|
||||
(objectMetadataItem) =>
|
||||
objectMetadataItem.nameSingular === objectNameSingular,
|
||||
) ?? null;
|
||||
objectMetadataItems = mockObjectMetadataItems;
|
||||
}
|
||||
|
||||
if (!isDefined(objectMetadataItem)) {
|
||||
throw new ObjectMetadataItemNotFoundError(
|
||||
objectNameSingular,
|
||||
objectMetadataItems,
|
||||
);
|
||||
}
|
||||
|
||||
return {
|
||||
objectMetadataItem,
|
||||
};
|
||||
};
|
||||
@ -1,5 +1,5 @@
|
||||
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
||||
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField';
|
||||
import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField';
|
||||
|
||||
const mockObjectMetadataItems = getObjectMetadataItemsMock();
|
||||
|
||||
@ -8,7 +8,7 @@ describe('getObjectOrderByField', () => {
|
||||
const objectMetadataItem = mockObjectMetadataItems.find(
|
||||
(item) => item.nameSingular === 'person',
|
||||
)!;
|
||||
const res = getObjectOrderByField(objectMetadataItem);
|
||||
const res = getOrderByFieldForObjectMetadataItem(objectMetadataItem);
|
||||
expect(res).toEqual({
|
||||
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
|
||||
});
|
||||
|
||||
@ -1,11 +1,9 @@
|
||||
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
|
||||
|
||||
export const getBasePathToShowPage = ({
|
||||
objectMetadataItem,
|
||||
objectNameSingular,
|
||||
}: {
|
||||
objectMetadataItem: ObjectMetadataItem;
|
||||
objectNameSingular: string;
|
||||
}) => {
|
||||
const basePathToShowPage = `/object/${objectMetadataItem.nameSingular}/`;
|
||||
const basePathToShowPage = `/object/${objectNameSingular}/`;
|
||||
|
||||
return basePathToShowPage;
|
||||
};
|
||||
|
||||
@ -5,7 +5,7 @@ import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/get
|
||||
import { FieldMetadataType } from '~/generated-metadata/graphql';
|
||||
import { isDefined } from '~/utils/isDefined';
|
||||
|
||||
export const getObjectOrderByField = (
|
||||
export const getOrderByFieldForObjectMetadataItem = (
|
||||
objectMetadataItem: ObjectMetadataItem,
|
||||
orderBy?: OrderBy | null,
|
||||
): OrderByField => {
|
||||
|
||||
@ -68,7 +68,7 @@ export const getObjectRecordIdentifier = ({
|
||||
: imageIdentifierFieldValue) ?? '';
|
||||
|
||||
const basePathToShowPage = getBasePathToShowPage({
|
||||
objectMetadataItem,
|
||||
objectNameSingular: objectMetadataItem.nameSingular,
|
||||
});
|
||||
|
||||
const isWorkspaceMemberObjectMetadata =
|
||||
|
||||
Reference in New Issue
Block a user