4087 refactor object metadata item hooks and utils (#4861)

- Extracted each exported element from useObjectMetadataItem into its
own hook.
This commit is contained in:
Lucas Bordeau
2024-04-09 09:19:52 +02:00
committed by GitHub
parent 651af1c0e1
commit b1242bb850
89 changed files with 699 additions and 622 deletions

View File

@ -3,7 +3,7 @@ import styled from '@emotion/styled';
import { IconCalendarEvent } from 'twenty-ui'; import { IconCalendarEvent } from 'twenty-ui';
import { CalendarEvent } from '@/activities/calendar/types/CalendarEvent'; import { CalendarEvent } from '@/activities/calendar/types/CalendarEvent';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsFieldDefinition'; import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsFieldDefinition';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
@ -71,7 +71,7 @@ export const CalendarEventDetails = ({
calendarEvent, calendarEvent,
}: CalendarEventDetailsProps) => { }: CalendarEventDetailsProps) => {
const theme = useTheme(); const theme = useTheme();
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular: CoreObjectNameSingular.CalendarEvent, objectNameSingular: CoreObjectNameSingular.CalendarEvent,
}); });

View File

@ -14,7 +14,7 @@ import { activityTitleHasBeenSetFamilyState } from '@/activities/states/activity
import { canCreateActivityState } from '@/activities/states/canCreateActivityState'; import { canCreateActivityState } from '@/activities/states/canCreateActivityState';
import { Activity } from '@/activities/types/Activity'; import { Activity } from '@/activities/types/Activity';
import { ActivityEditorHotkeyScope } from '@/activities/types/ActivityEditorHotkeyScope'; import { ActivityEditorHotkeyScope } from '@/activities/types/ActivityEditorHotkeyScope';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache'; import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
@ -58,7 +58,7 @@ export const ActivityBodyEditor = ({
); );
const { objectMetadataItem: objectMetadataItemActivity } = const { objectMetadataItem: objectMetadataItemActivity } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: CoreObjectNameSingular.Activity, objectNameSingular: CoreObjectNameSingular.Activity,
}); });

View File

@ -4,7 +4,6 @@ import { useRecoilValue } from 'recoil';
import { useUpsertActivity } from '@/activities/hooks/useUpsertActivity'; import { useUpsertActivity } from '@/activities/hooks/useUpsertActivity';
import { ActivityTargetsInlineCell } from '@/activities/inline-cell/components/ActivityTargetsInlineCell'; import { ActivityTargetsInlineCell } from '@/activities/inline-cell/components/ActivityTargetsInlineCell';
import { Activity } from '@/activities/types/Activity'; import { Activity } from '@/activities/types/Activity';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache'; import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useFieldContext } from '@/object-record/hooks/useFieldContext'; import { useFieldContext } from '@/object-record/hooks/useFieldContext';
@ -28,12 +27,8 @@ export const ActivityEditorFields = ({
}) => { }) => {
const { upsertActivity } = useUpsertActivity(); const { upsertActivity } = useUpsertActivity();
const { objectMetadataItem } = useObjectMetadataItemOnly({
objectNameSingular: CoreObjectNameSingular.Activity,
});
const getRecordFromCache = useGetRecordFromCache({ const getRecordFromCache = useGetRecordFromCache({
objectMetadataItem, objectNameSingular: CoreObjectNameSingular.Activity,
}); });
const activityFromCache = getRecordFromCache<Activity>(activityId); const activityFromCache = getRecordFromCache<Activity>(activityId);

View File

@ -12,7 +12,7 @@ import { activityTitleHasBeenSetFamilyState } from '@/activities/states/activity
import { canCreateActivityState } from '@/activities/states/canCreateActivityState'; import { canCreateActivityState } from '@/activities/states/canCreateActivityState';
import { Activity } from '@/activities/types/Activity'; import { Activity } from '@/activities/types/Activity';
import { ActivityEditorHotkeyScope } from '@/activities/types/ActivityEditorHotkeyScope'; import { ActivityEditorHotkeyScope } from '@/activities/types/ActivityEditorHotkeyScope';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache'; import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState'; import { recordStoreFamilyState } from '@/object-record/record-store/states/recordStoreFamilyState';
@ -111,7 +111,7 @@ export const ActivityTitle = ({ activityId }: ActivityTitleProps) => {
); );
const { objectMetadataItem: objectMetadataItemActivity } = const { objectMetadataItem: objectMetadataItemActivity } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: CoreObjectNameSingular.Activity, objectNameSingular: CoreObjectNameSingular.Activity,
}); });

View File

@ -4,7 +4,6 @@ import { useRecoilValue } from 'recoil';
import { Activity } from '@/activities/types/Activity'; import { Activity } from '@/activities/types/Activity';
import { ActivityTarget } from '@/activities/types/ActivityTarget'; import { ActivityTarget } from '@/activities/types/ActivityTarget';
import { ActivityTargetWithTargetRecord } from '@/activities/types/ActivityTargetObject'; import { ActivityTargetWithTargetRecord } from '@/activities/types/ActivityTargetObject';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache'; import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
@ -16,13 +15,8 @@ export const useActivityTargetObjectRecords = (activity: Activity) => {
const activityTargets = activity.activityTargets ?? []; const activityTargets = activity.activityTargets ?? [];
const { objectMetadataItem: objectMetadataItemActivityTarget } =
useObjectMetadataItemOnly({
objectNameSingular: CoreObjectNameSingular.ActivityTarget,
});
const getRecordFromCache = useGetRecordFromCache({ const getRecordFromCache = useGetRecordFromCache({
objectMetadataItem: objectMetadataItemActivityTarget, objectNameSingular: CoreObjectNameSingular.ActivityTarget,
}); });
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();

View File

@ -7,7 +7,7 @@ import { ActivityTarget } from '@/activities/types/ActivityTarget';
import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity'; import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { makeActivityTargetsToCreateFromTargetableObjects } from '@/activities/utils/getActivityTargetsToCreateFromTargetableObjects'; import { makeActivityTargetsToCreateFromTargetableObjects } from '@/activities/utils/getActivityTargetsToCreateFromTargetableObjects';
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState'; import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useCreateManyRecordsInCache } from '@/object-record/cache/hooks/useCreateManyRecordsInCache'; import { useCreateManyRecordsInCache } from '@/object-record/cache/hooks/useCreateManyRecordsInCache';
@ -38,12 +38,12 @@ export const useCreateActivityInCache = () => {
}); });
const { objectMetadataItem: objectMetadataItemActivity } = const { objectMetadataItem: objectMetadataItemActivity } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: CoreObjectNameSingular.Activity, objectNameSingular: CoreObjectNameSingular.Activity,
}); });
const { objectMetadataItem: objectMetadataItemActivityTarget } = const { objectMetadataItem: objectMetadataItemActivityTarget } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: CoreObjectNameSingular.ActivityTarget, objectNameSingular: CoreObjectNameSingular.ActivityTarget,
}); });

View File

@ -4,7 +4,7 @@ import { FIND_MANY_ACTIVITIES_QUERY_KEY } from '@/activities/query-keys/FindMany
import { Activity } from '@/activities/types/Activity'; import { Activity } from '@/activities/types/Activity';
import { ActivityTarget } from '@/activities/types/ActivityTarget'; import { ActivityTarget } from '@/activities/types/ActivityTarget';
import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity'; import { ActivityTargetableObject } from '@/activities/types/ActivityTargetableEntity';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache'; import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
@ -16,12 +16,12 @@ import { isDefined } from '~/utils/isDefined';
export const usePrepareFindManyActivitiesQuery = () => { export const usePrepareFindManyActivitiesQuery = () => {
const { objectMetadataItem: objectMetadataItemActivity } = const { objectMetadataItem: objectMetadataItemActivity } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: CoreObjectNameSingular.Activity, objectNameSingular: CoreObjectNameSingular.Activity,
}); });
const getActivityFromCache = useGetRecordFromCache({ const getActivityFromCache = useGetRecordFromCache({
objectMetadataItem: objectMetadataItemActivity, objectNameSingular: CoreObjectNameSingular.Activity,
}); });
const cache = useApolloClient().cache; const cache = useApolloClient().cache;

View File

@ -10,7 +10,7 @@ import { ActivityTarget } from '@/activities/types/ActivityTarget';
import { ActivityTargetWithTargetRecord } from '@/activities/types/ActivityTargetObject'; import { ActivityTargetWithTargetRecord } from '@/activities/types/ActivityTargetObject';
import { getActivityTargetObjectFieldIdName } from '@/activities/utils/getActivityTargetObjectFieldIdName'; import { getActivityTargetObjectFieldIdName } from '@/activities/utils/getActivityTargetObjectFieldIdName';
import { getActivityTargetObjectFieldName } from '@/activities/utils/getActivityTargetObjectFieldName'; import { getActivityTargetObjectFieldName } from '@/activities/utils/getActivityTargetObjectFieldName';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useCreateManyRecordsInCache } from '@/object-record/cache/hooks/useCreateManyRecordsInCache'; import { useCreateManyRecordsInCache } from '@/object-record/cache/hooks/useCreateManyRecordsInCache';
import { useCreateManyRecords } from '@/object-record/hooks/useCreateManyRecords'; import { useCreateManyRecords } from '@/object-record/hooks/useCreateManyRecords';
@ -61,7 +61,7 @@ export const ActivityTargetInlineCellEditMode = ({
const { upsertActivity } = useUpsertActivity(); const { upsertActivity } = useUpsertActivity();
const { objectMetadataItem: objectMetadataItemActivityTarget } = const { objectMetadataItem: objectMetadataItemActivityTarget } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: CoreObjectNameSingular.ActivityTarget, objectNameSingular: CoreObjectNameSingular.ActivityTarget,
}); });

View File

@ -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' },
});
});
});

View File

@ -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' },
});
});
});

View File

@ -2,21 +2,19 @@ import { renderHook } from '@testing-library/react';
import { RecoilRoot } from 'recoil'; import { RecoilRoot } from 'recoil';
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier'; import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
const mockObjectMetadataItems = getObjectMetadataItemsMock();
describe('useMapToObjectRecordIdentifier', () => { describe('useMapToObjectRecordIdentifier', () => {
it('should work as expected', async () => { it('should work as expected', async () => {
const { result } = renderHook( const { result } = renderHook(
() => { () => {
const objectMetadataItem = mockObjectMetadataItems.find( const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
(item) => item.nameSingular === 'person', objectNameSingular: 'person',
)!; });
return useMapToObjectRecordIdentifier({ return mapToObjectRecordIdentifier({
objectMetadataItem, id: 'id',
})({ id: 'id', name: { firstName: 'Sheldon', lastName: 'Cooper' } }); name: { firstName: 'Sheldon', lastName: 'Cooper' },
});
}, },
{ {
wrapper: RecoilRoot, wrapper: RecoilRoot,

View File

@ -11,6 +11,7 @@ const Wrapper = ({ children }: { children: ReactNode }) => (
</RecoilRoot> </RecoilRoot>
); );
// Split into tests for each new hook
describe('useObjectMetadataItem', () => { describe('useObjectMetadataItem', () => {
it('should return correct properties', async () => { it('should return correct properties', async () => {
const { result } = renderHook( const { result } = renderHook(
@ -20,39 +21,8 @@ describe('useObjectMetadataItem', () => {
}, },
); );
const { const { objectMetadataItem } = result.current;
basePathToShowPage,
objectMetadataItem,
labelIdentifierFieldMetadata,
getRecordFromCache,
findManyRecordsQuery,
findOneRecordQuery,
createOneRecordMutation,
updateOneRecordMutation,
deleteOneRecordMutation,
executeQuickActionOnOneRecordMutation,
createManyRecordsMutation,
deleteManyRecordsMutation,
mapToObjectRecordIdentifier,
getObjectOrderByField,
} = result.current;
expect(labelIdentifierFieldMetadata).toBeUndefined();
expect(basePathToShowPage).toBe('/object/opportunity/');
expect(objectMetadataItem.id).toBe('20202020-cae9-4ff4-9579-f7d9fe44c937'); 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');
}); });
}); });

View File

@ -1,8 +1,8 @@
import { ApolloClient, useApolloClient, useMutation } from '@apollo/client'; import { ApolloClient, useApolloClient, useMutation } from '@apollo/client';
import { getOperationName } from '@apollo/client/utilities'; import { getOperationName } from '@apollo/client/utilities';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery';
import { import {
CreateObjectInput, CreateObjectInput,
CreateOneObjectMetadataItemMutation, CreateOneObjectMetadataItemMutation,
@ -17,7 +17,8 @@ import { useApolloMetadataClient } from './useApolloMetadataClient';
export const useCreateOneObjectMetadataItem = () => { export const useCreateOneObjectMetadataItem = () => {
const apolloMetadataClient = useApolloMetadataClient(); const apolloMetadataClient = useApolloMetadataClient();
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const { findManyRecordsQuery } = useObjectMetadataItem({
const { findManyRecordsQuery } = useFindManyRecordsQuery({
objectNameSingular: CoreObjectNameSingular.View, objectNameSingular: CoreObjectNameSingular.View,
}); });

View File

@ -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 { OrderBy } from '@/object-metadata/types/OrderBy';
import { OrderByField } from '@/object-metadata/types/OrderByField'; import { OrderByField } from '@/object-metadata/types/OrderByField';
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField'; import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField';
export const useGetObjectOrderByField = ({ export const useGetObjectOrderByField = ({
objectMetadataItem, objectNameSingular,
}: { }: {
objectMetadataItem: ObjectMetadataItem; objectNameSingular: string;
}) => { }) => {
return (orderBy: OrderBy): OrderByField => { const { objectMetadataItem } = useObjectMetadataItem({
return getObjectOrderByField(objectMetadataItem, orderBy); objectNameSingular,
});
const getObjectOrderByField = (orderBy: OrderBy): OrderByField => {
return getOrderByFieldForObjectMetadataItem(objectMetadataItem, orderBy);
}; };
return { getObjectOrderByField };
}; };

View File

@ -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 };
};

View File

@ -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 { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
export const useMapToObjectRecordIdentifier = export const useMapToObjectRecordIdentifier = ({
({ objectMetadataItem }: { objectMetadataItem: ObjectMetadataItem }) => objectNameSingular,
(record: ObjectRecord) => }: {
getObjectRecordIdentifier({ objectMetadataItem, record }); objectNameSingular: string;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const mapToObjectRecordIdentifier = (record: ObjectRecord) => {
return getObjectRecordIdentifier({ objectMetadataItem, record });
};
return { mapToObjectRecordIdentifier };
};

View File

@ -1,47 +1,17 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts';
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError'; 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 { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; 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 { 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 { isDefined } from '~/utils/isDefined';
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier'; import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
export const EMPTY_QUERY = gql` export const useObjectMetadataItem = ({
query EmptyQuery { objectNameSingular,
empty }: ObjectMetadataItemIdentifier) => {
}
`;
export const EMPTY_MUTATION = gql`
mutation EmptyMutation {
empty
}
`;
export const useObjectMetadataItem = (
{ objectNameSingular }: ObjectMetadataItemIdentifier,
depth?: number,
queryFields?: Record<string, any>,
computeReferences = false,
) => {
const currentWorkspace = useRecoilValue(currentWorkspaceState); const currentWorkspace = useRecoilValue(currentWorkspaceState);
const mockObjectMetadataItems = getObjectMetadataItemsMock(); 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 { return {
labelIdentifierFieldMetadata,
basePathToShowPage,
objectMetadataItem, objectMetadataItem,
getRecordFromCache,
findManyRecordsQuery,
findDuplicateRecordsQuery,
findOneRecordQuery,
createOneRecordMutation,
updateOneRecordMutation,
deleteOneRecordMutation,
executeQuickActionOnOneRecordMutation,
createManyRecordsMutation,
deleteManyRecordsMutation,
mapToObjectRecordIdentifier,
getObjectOrderByField,
}; };
}; };

View File

@ -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,
};
};

View File

@ -1,5 +1,5 @@
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock'; import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField'; import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField';
const mockObjectMetadataItems = getObjectMetadataItemsMock(); const mockObjectMetadataItems = getObjectMetadataItemsMock();
@ -8,7 +8,7 @@ describe('getObjectOrderByField', () => {
const objectMetadataItem = mockObjectMetadataItems.find( const objectMetadataItem = mockObjectMetadataItems.find(
(item) => item.nameSingular === 'person', (item) => item.nameSingular === 'person',
)!; )!;
const res = getObjectOrderByField(objectMetadataItem); const res = getOrderByFieldForObjectMetadataItem(objectMetadataItem);
expect(res).toEqual({ expect(res).toEqual({
name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' }, name: { firstName: 'AscNullsLast', lastName: 'AscNullsLast' },
}); });

View File

@ -1,11 +1,9 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
export const getBasePathToShowPage = ({ export const getBasePathToShowPage = ({
objectMetadataItem, objectNameSingular,
}: { }: {
objectMetadataItem: ObjectMetadataItem; objectNameSingular: string;
}) => { }) => {
const basePathToShowPage = `/object/${objectMetadataItem.nameSingular}/`; const basePathToShowPage = `/object/${objectNameSingular}/`;
return basePathToShowPage; return basePathToShowPage;
}; };

View File

@ -5,7 +5,7 @@ import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/get
import { FieldMetadataType } from '~/generated-metadata/graphql'; import { FieldMetadataType } from '~/generated-metadata/graphql';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
export const getObjectOrderByField = ( export const getOrderByFieldForObjectMetadataItem = (
objectMetadataItem: ObjectMetadataItem, objectMetadataItem: ObjectMetadataItem,
orderBy?: OrderBy | null, orderBy?: OrderBy | null,
): OrderByField => { ): OrderByField => {

View File

@ -68,7 +68,7 @@ export const getObjectRecordIdentifier = ({
: imageIdentifierFieldValue) ?? ''; : imageIdentifierFieldValue) ?? '';
const basePathToShowPage = getBasePathToShowPage({ const basePathToShowPage = getBasePathToShowPage({
objectMetadataItem, objectNameSingular: objectMetadataItem.nameSingular,
}); });
const isWorkspaceMemberObjectMetadata = const isWorkspaceMemberObjectMetadata =

View File

@ -17,7 +17,7 @@ export const useCreateOneRecordInCache = <T extends ObjectRecord>({
objectMetadataItem: ObjectMetadataItem; objectMetadataItem: ObjectMetadataItem;
}) => { }) => {
const getRecordFromCache = useGetRecordFromCache({ const getRecordFromCache = useGetRecordFromCache({
objectMetadataItem, objectNameSingular: objectMetadataItem.nameSingular,
}); });
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();

View File

@ -1,6 +1,6 @@
import { useApolloClient } from '@apollo/client'; import { useApolloClient } from '@apollo/client';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { deleteRecordFromCache } from '@/object-record/cache/utils/deleteRecordFromCache'; import { deleteRecordFromCache } from '@/object-record/cache/utils/deleteRecordFromCache';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
@ -12,7 +12,7 @@ export const useDeleteRecordFromCache = ({
}) => { }) => {
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -2,16 +2,20 @@ import { useCallback } from 'react';
import { useApolloClient } from '@apollo/client'; import { useApolloClient } from '@apollo/client';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getRecordFromCache } from '@/object-record/cache/utils/getRecordFromCache'; import { getRecordFromCache } from '@/object-record/cache/utils/getRecordFromCache';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
export const useGetRecordFromCache = ({ export const useGetRecordFromCache = ({
objectMetadataItem, objectNameSingular,
}: { }: {
objectMetadataItem: ObjectMetadataItem; objectNameSingular: string;
}) => { }) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();

View File

@ -1,11 +1,12 @@
import { useApolloClient } from '@apollo/client'; import { useApolloClient } from '@apollo/client';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection'; import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection';
import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenerateFindManyRecordsQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { ObjectRecordQueryResult } from '@/object-record/types/ObjectRecordQueryResult'; import { ObjectRecordQueryResult } from '@/object-record/types/ObjectRecordQueryResult';
import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables'; import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables';
import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
export const useReadFindManyRecordsQueryInCache = ({ export const useReadFindManyRecordsQueryInCache = ({
@ -15,7 +16,7 @@ export const useReadFindManyRecordsQueryInCache = ({
}) => { }) => {
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const generateFindManyRecordsQuery = useGenerateFindManyRecordsQuery(); const { objectMetadataItems } = useObjectMetadataItems();
const readFindManyRecordsQueryInCache = < const readFindManyRecordsQueryInCache = <
T extends ObjectRecord = ObjectRecord, T extends ObjectRecord = ObjectRecord,
@ -30,6 +31,7 @@ export const useReadFindManyRecordsQueryInCache = ({
}) => { }) => {
const findManyRecordsQueryForCacheRead = generateFindManyRecordsQuery({ const findManyRecordsQueryForCacheRead = generateFindManyRecordsQuery({
objectMetadataItem, objectMetadataItem,
objectMetadataItems,
queryFields, queryFields,
depth, depth,
}); });

View File

@ -5,21 +5,17 @@ import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadat
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { MAX_QUERY_DEPTH_FOR_CACHE_INJECTION } from '@/object-record/cache/constants/MaxQueryDepthForCacheInjection'; import { MAX_QUERY_DEPTH_FOR_CACHE_INJECTION } from '@/object-record/cache/constants/MaxQueryDepthForCacheInjection';
import { getRecordConnectionFromRecords } from '@/object-record/cache/utils/getRecordConnectionFromRecords'; import { getRecordConnectionFromRecords } from '@/object-record/cache/utils/getRecordConnectionFromRecords';
import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenerateFindManyRecordsQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables'; import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables';
import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery';
export const useUpsertFindManyRecordsQueryInCache = ({ export const useUpsertFindManyRecordsQueryInCache = ({
objectMetadataItem, objectMetadataItem,
}: { }: {
objectMetadataItem: Pick< objectMetadataItem: ObjectMetadataItem;
ObjectMetadataItem,
'fields' | 'namePlural' | 'nameSingular'
>;
}) => { }) => {
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const generateFindManyRecordsQuery = useGenerateFindManyRecordsQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
const upsertFindManyRecordsQueryInCache = < const upsertFindManyRecordsQueryInCache = <
@ -39,6 +35,7 @@ export const useUpsertFindManyRecordsQueryInCache = ({
}) => { }) => {
const findManyRecordsQueryForCacheOverwrite = generateFindManyRecordsQuery({ const findManyRecordsQueryForCacheOverwrite = generateFindManyRecordsQuery({
objectMetadataItem, objectMetadataItem,
objectMetadataItems,
depth, depth,
queryFields, queryFields,
computeReferences, computeReferences,

View File

@ -1,7 +1,6 @@
import * as React from 'react'; import * as React from 'react';
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier'; import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { EntityChip } from '@/ui/display/chip/components/EntityChip'; import { EntityChip } from '@/ui/display/chip/components/EntityChip';
@ -18,14 +17,10 @@ export const RecordChip = ({
maxWidth, maxWidth,
className, className,
}: RecordChipProps) => { }: RecordChipProps) => {
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
objectNameSingular, objectNameSingular,
}); });
const mapToObjectRecordIdentifier = useMapToObjectRecordIdentifier({
objectMetadataItem,
});
const objectRecordIdentifier = mapToObjectRecordIdentifier(record); const objectRecordIdentifier = mapToObjectRecordIdentifier(record);
return ( return (

View File

@ -0,0 +1,7 @@
import gql from 'graphql-tag';
export const EMPTY_MUTATION = gql`
mutation EmptyMutation {
empty
}
`;

View File

@ -0,0 +1,7 @@
import gql from 'graphql-tag';
export const EMPTY_QUERY = gql`
query EmptyQuery {
empty
}
`;

View File

@ -6,11 +6,9 @@ import { CachedObjectRecord } from '@/apollo/types/CachedObjectRecord';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useCreateOneRecordInCache } from '@/object-record/cache/hooks/useCreateOneRecordInCache'; import { useCreateOneRecordInCache } from '@/object-record/cache/hooks/useCreateOneRecordInCache';
import { import { useCreateManyRecordsMutation } from '@/object-record/hooks/useCreateManyRecordsMutation';
getCreateManyRecordsMutationResponseField,
useGenerateCreateManyRecordMutation,
} from '@/object-record/hooks/useGenerateCreateManyRecordMutation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { getCreateManyRecordsMutationResponseField } from '@/object-record/utils/getCreateManyRecordsMutationResponseField';
import { sanitizeRecordInput } from '@/object-record/utils/sanitizeRecordInput'; import { sanitizeRecordInput } from '@/object-record/utils/sanitizeRecordInput';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
@ -35,8 +33,8 @@ export const useCreateManyRecords = <
objectNameSingular, objectNameSingular,
}); });
const createManyRecordsMutation = useGenerateCreateManyRecordMutation({ const { createManyRecordsMutation } = useCreateManyRecordsMutation({
objectMetadataItem, objectNameSingular,
queryFields, queryFields,
depth, depth,
}); });

View File

@ -1,37 +1,38 @@
import { gql } from '@apollo/client'; import gql from 'graphql-tag';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
import { getCreateManyRecordsMutationResponseField } from '@/object-record/utils/getCreateManyRecordsMutationResponseField';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
export const getCreateManyRecordsMutationResponseField = ( export const useCreateManyRecordsMutation = ({
objectNamePlural: string, objectNameSingular,
) => `create${capitalize(objectNamePlural)}`;
export const useGenerateCreateManyRecordMutation = ({
objectMetadataItem,
queryFields, queryFields,
depth = 1, depth,
}: { }: {
objectMetadataItem: ObjectMetadataItem; objectNameSingular: string;
queryFields?: Record<string, any>; queryFields?: Record<string, any>;
depth?: number; depth?: number;
}) => { }) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
if (isUndefinedOrNull(objectMetadataItem)) { if (isUndefinedOrNull(objectMetadataItem)) {
return EMPTY_MUTATION; return { createManyRecordsMutation: EMPTY_MUTATION };
} }
const mutationResponseField = getCreateManyRecordsMutationResponseField( const mutationResponseField = getCreateManyRecordsMutationResponseField(
objectMetadataItem.namePlural, objectMetadataItem.namePlural,
); );
return gql` const createManyRecordsMutation = gql`
mutation Create${capitalize( mutation Create${capitalize(
objectMetadataItem.namePlural, objectMetadataItem.namePlural,
)}($data: [${capitalize(objectMetadataItem.nameSingular)}CreateInput!]!) { )}($data: [${capitalize(objectMetadataItem.nameSingular)}CreateInput!]!) {
@ -42,4 +43,8 @@ export const useGenerateCreateManyRecordMutation = ({
depth, depth,
})} })}
}`; }`;
return {
createManyRecordsMutation,
};
}; };

View File

@ -6,11 +6,9 @@ import { CachedObjectRecord } from '@/apollo/types/CachedObjectRecord';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useCreateOneRecordInCache } from '@/object-record/cache/hooks/useCreateOneRecordInCache'; import { useCreateOneRecordInCache } from '@/object-record/cache/hooks/useCreateOneRecordInCache';
import { import { useCreateOneRecordMutation } from '@/object-record/hooks/useCreateOneRecordMutation';
getCreateOneRecordMutationResponseField,
useGenerateCreateOneRecordMutation,
} from '@/object-record/hooks/useGenerateCreateOneRecordMutation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { getCreateOneRecordMutationResponseField } from '@/object-record/utils/getCreateOneRecordMutationResponseField';
import { sanitizeRecordInput } from '@/object-record/utils/sanitizeRecordInput'; import { sanitizeRecordInput } from '@/object-record/utils/sanitizeRecordInput';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
@ -26,17 +24,17 @@ export const useCreateOneRecord = <
>({ >({
objectNameSingular, objectNameSingular,
queryFields, queryFields,
depth = 1,
skipPostOptmisticEffect = false, skipPostOptmisticEffect = false,
}: useCreateOneRecordProps) => { }: useCreateOneRecordProps) => {
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const { objectMetadataItem } = useObjectMetadataItem({ objectNameSingular }); const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const createOneRecordMutation = useGenerateCreateOneRecordMutation({ const { createOneRecordMutation } = useCreateOneRecordMutation({
objectMetadataItem, objectNameSingular,
queryFields, queryFields,
depth,
}); });
const createOneRecordInCache = useCreateOneRecordInCache<CachedObjectRecord>({ const createOneRecordInCache = useCreateOneRecordInCache<CachedObjectRecord>({

View File

@ -1,30 +1,31 @@
import { gql } from '@apollo/client'; import gql from 'graphql-tag';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
import { getCreateOneRecordMutationResponseField } from '@/object-record/utils/getCreateOneRecordMutationResponseField';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
export const getCreateOneRecordMutationResponseField = ( export const useCreateOneRecordMutation = ({
objectNameSingular: string, objectNameSingular,
) => `create${capitalize(objectNameSingular)}`;
export const useGenerateCreateOneRecordMutation = ({
objectMetadataItem,
queryFields, queryFields,
depth = 1, depth,
}: { }: {
objectMetadataItem: ObjectMetadataItem; objectNameSingular: string;
queryFields?: Record<string, any>; queryFields?: Record<string, any>;
depth?: number; depth?: number;
}) => { }) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
if (isUndefinedOrNull(objectMetadataItem)) { if (isUndefinedOrNull(objectMetadataItem)) {
return EMPTY_MUTATION; return { createOneRecordMutation: EMPTY_MUTATION };
} }
const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular); const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular);
@ -33,7 +34,7 @@ export const useGenerateCreateOneRecordMutation = ({
objectMetadataItem.nameSingular, objectMetadataItem.nameSingular,
); );
return gql` const createOneRecordMutation = gql`
mutation CreateOne${capitalizedObjectName}($input: ${capitalizedObjectName}CreateInput!) { mutation CreateOne${capitalizedObjectName}($input: ${capitalizedObjectName}CreateInput!) {
${mutationResponseField}(data: $input) ${mapObjectMetadataToGraphQLQuery({ ${mutationResponseField}(data: $input) ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems, objectMetadataItems,
@ -43,4 +44,8 @@ export const useGenerateCreateOneRecordMutation = ({
})} })}
} }
`; `;
return {
createOneRecordMutation,
};
}; };

View File

@ -3,7 +3,9 @@ import { useApolloClient } from '@apollo/client';
import { triggerDeleteRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect'; import { triggerDeleteRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { getDeleteManyRecordsMutationResponseField } from '@/object-record/hooks/useGenerateDeleteManyRecordMutation'; import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useDeleteManyRecordsMutation } from '@/object-record/hooks/useDeleteManyRecordsMutation';
import { getDeleteManyRecordsMutationResponseField } from '@/object-record/utils/getDeleteManyRecordsMutationResponseField';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
@ -21,8 +23,17 @@ export const useDeleteManyRecords = ({
}: useDeleteOneRecordProps) => { }: useDeleteOneRecordProps) => {
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const { objectMetadataItem, deleteManyRecordsMutation, getRecordFromCache } = const { objectMetadataItem } = useObjectMetadataItem({
useObjectMetadataItem({ objectNameSingular }); objectNameSingular,
});
const getRecordFromCache = useGetRecordFromCache({
objectNameSingular,
});
const { deleteManyRecordsMutation } = useDeleteManyRecordsMutation({
objectNameSingular,
});
const { objectMetadataItems } = useObjectMetadataItems(); const { objectMetadataItems } = useObjectMetadataItems();

View File

@ -0,0 +1,41 @@
import gql from 'graphql-tag';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
import { getDeleteManyRecordsMutationResponseField } from '@/object-record/utils/getDeleteManyRecordsMutationResponseField';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize';
export const useDeleteManyRecordsMutation = ({
objectNameSingular,
}: {
objectNameSingular: string;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
if (isUndefinedOrNull(objectMetadataItem)) {
return { deleteManyRecordsMutation: EMPTY_MUTATION };
}
const capitalizedObjectName = capitalize(objectMetadataItem.namePlural);
const mutationResponseField = getDeleteManyRecordsMutationResponseField(
objectMetadataItem.namePlural,
);
const deleteManyRecordsMutation = gql`
mutation DeleteMany${capitalizedObjectName}($filter: ${capitalize(
objectMetadataItem.nameSingular,
)}FilterInput!) {
${mutationResponseField}(filter: $filter) {
id
}
}
`;
return {
deleteManyRecordsMutation,
};
};

View File

@ -4,7 +4,9 @@ import { useApolloClient } from '@apollo/client';
import { triggerDeleteRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect'; import { triggerDeleteRecordsOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerDeleteRecordsOptimisticEffect';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { getDeleteOneRecordMutationResponseField } from '@/object-record/utils/generateDeleteOneRecordMutation'; import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useDeleteOneRecordMutation } from '@/object-record/hooks/useDeleteOneRecordMutation';
import { getDeleteOneRecordMutationResponseField } from '@/object-record/utils/getDeleteOneRecordMutationResponseField';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
type useDeleteOneRecordProps = { type useDeleteOneRecordProps = {
@ -17,8 +19,17 @@ export const useDeleteOneRecord = ({
}: useDeleteOneRecordProps) => { }: useDeleteOneRecordProps) => {
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const { objectMetadataItem, deleteOneRecordMutation, getRecordFromCache } = const { objectMetadataItem } = useObjectMetadataItem({
useObjectMetadataItem({ objectNameSingular }); objectNameSingular,
});
const getRecordFromCache = useGetRecordFromCache({
objectNameSingular,
});
const { deleteOneRecordMutation } = useDeleteOneRecordMutation({
objectNameSingular,
});
const { objectMetadataItems } = useObjectMetadataItems(); const { objectMetadataItems } = useObjectMetadataItems();

View File

@ -0,0 +1,39 @@
import gql from 'graphql-tag';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
import { getDeleteOneRecordMutationResponseField } from '@/object-record/utils/getDeleteOneRecordMutationResponseField';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize';
export const useDeleteOneRecordMutation = ({
objectNameSingular,
}: {
objectNameSingular: string;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
if (isUndefinedOrNull(objectMetadataItem)) {
return { deleteOneRecordMutation: EMPTY_MUTATION };
}
const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular);
const mutationResponseField = getDeleteOneRecordMutationResponseField(
objectMetadataItem.nameSingular,
);
const deleteOneRecordMutation = gql`
mutation DeleteOne${capitalizedObjectName}($idToDelete: ID!) {
${mutationResponseField}(id: $idToDelete) {
id
}
}
`;
return {
deleteOneRecordMutation,
};
};

View File

@ -3,6 +3,8 @@ import { useApolloClient } from '@apollo/client';
import { getOperationName } from '@apollo/client/utilities'; import { getOperationName } from '@apollo/client/utilities';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useExecuteQuickActionOnOneRecordMutation } from '@/object-record/hooks/useExecuteQuickActionOnOneRecordMutation';
import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
type useExecuteQuickActionOnOneRecordProps = { type useExecuteQuickActionOnOneRecordProps = {
@ -12,11 +14,16 @@ type useExecuteQuickActionOnOneRecordProps = {
export const useExecuteQuickActionOnOneRecord = <T>({ export const useExecuteQuickActionOnOneRecord = <T>({
objectNameSingular, objectNameSingular,
}: useExecuteQuickActionOnOneRecordProps) => { }: useExecuteQuickActionOnOneRecordProps) => {
const { const { objectMetadataItem } = useObjectMetadataItem({
objectMetadataItem, objectNameSingular,
executeQuickActionOnOneRecordMutation, });
findManyRecordsQuery,
} = useObjectMetadataItem({ const { executeQuickActionOnOneRecordMutation } =
useExecuteQuickActionOnOneRecordMutation({
objectNameSingular,
});
const { findManyRecordsQuery } = useFindManyRecordsQuery({
objectNameSingular, objectNameSingular,
}); });

View File

@ -1,10 +1,10 @@
import { gql } from '@apollo/client'; import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
@ -16,15 +16,19 @@ export const getExecuteQuickActionOnOneRecordMutationGraphQLField = ({
return `executeQuickActionOn${capitalize(objectNameSingular)}`; return `executeQuickActionOn${capitalize(objectNameSingular)}`;
}; };
export const useGenerateExecuteQuickActionOnOneRecordMutation = ({ export const useExecuteQuickActionOnOneRecordMutation = ({
objectMetadataItem, objectNameSingular,
}: { }: {
objectMetadataItem: ObjectMetadataItem; objectNameSingular: string;
}) => { }) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
if (isUndefinedOrNull(objectMetadataItem)) { if (isUndefinedOrNull(objectMetadataItem)) {
return EMPTY_MUTATION; return { executeQuickActionOnOneRecordMutation: EMPTY_MUTATION };
} }
const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular); const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular);
@ -34,7 +38,7 @@ export const useGenerateExecuteQuickActionOnOneRecordMutation = ({
objectNameSingular: objectMetadataItem.nameSingular, objectNameSingular: objectMetadataItem.nameSingular,
}); });
return gql` const executeQuickActionOnOneRecordMutation = gql`
mutation ExecuteQuickActionOnOne${capitalizedObjectName}($idToExecuteQuickActionOn: ID!) { mutation ExecuteQuickActionOnOne${capitalizedObjectName}($idToExecuteQuickActionOn: ID!) {
${graphQLFieldForExecuteQuickActionOnOneRecordMutation}(id: $idToExecuteQuickActionOn) ${mapObjectMetadataToGraphQLQuery( ${graphQLFieldForExecuteQuickActionOnOneRecordMutation}(id: $idToExecuteQuickActionOn) ${mapObjectMetadataToGraphQLQuery(
{ {
@ -44,4 +48,6 @@ export const useGenerateExecuteQuickActionOnOneRecordMutation = ({
)} )}
} }
`; `;
return { executeQuickActionOnOneRecordMutation };
}; };

View File

@ -2,6 +2,7 @@ import { ReactNode } from 'react';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
import { import {
FieldContext, FieldContext,
@ -27,7 +28,11 @@ export const useFieldContext = ({
objectRecordId: string; objectRecordId: string;
customUseUpdateOneObjectHook?: RecordUpdateHook; customUseUpdateOneObjectHook?: RecordUpdateHook;
}) => { }) => {
const { basePathToShowPage, objectMetadataItem } = useObjectMetadataItem({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const basePathToShowPage = getBasePathToShowPage({
objectNameSingular, objectNameSingular,
}); });

View File

@ -4,9 +4,10 @@ import { useQuery } from '@apollo/client';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier'; import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection'; import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection';
import { getFindDuplicateRecordsQueryResponseField } from '@/object-record/hooks/useGenerateFindDuplicateRecordsQuery'; import { useFindDuplicateRecordsQuery } from '@/object-record/hooks/useFindDuplicatesRecordsQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection'; import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection';
import { getFindDuplicateRecordsQueryResponseField } from '@/object-record/utils/getFindDuplicateRecordsQueryResponseField';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { logError } from '~/utils/logError'; import { logError } from '~/utils/logError';
@ -25,8 +26,14 @@ export const useFindDuplicateRecords = <T extends ObjectRecord = ObjectRecord>({
}) => { }) => {
const findDuplicateQueryStateIdentifier = objectNameSingular; const findDuplicateQueryStateIdentifier = objectNameSingular;
const { objectMetadataItem, findDuplicateRecordsQuery } = const { objectMetadataItem } = useObjectMetadataItem({
useObjectMetadataItem({ objectNameSingular }, depth); objectNameSingular,
});
const { findDuplicateRecordsQuery } = useFindDuplicateRecordsQuery({
objectNameSingular,
depth,
});
const { enqueueSnackBar } = useSnackBar(); const { enqueueSnackBar } = useSnackBar();

View File

@ -1,25 +1,26 @@
import { gql } from '@apollo/client'; import gql from 'graphql-tag';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { getFindDuplicateRecordsQueryResponseField } from '@/object-record/utils/getFindDuplicateRecordsQueryResponseField';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
export const getFindDuplicateRecordsQueryResponseField = ( export const useFindDuplicateRecordsQuery = ({
objectNameSingular: string, objectNameSingular,
) => `${objectNameSingular}Duplicates`; depth,
}: {
objectNameSingular: string;
depth?: number;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
export const useGenerateFindDuplicateRecordsQuery = () => {
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
return ({ const findDuplicateRecordsQuery = gql`
objectMetadataItem,
depth,
}: {
objectMetadataItem: Pick<ObjectMetadataItem, 'fields' | 'nameSingular'>;
depth?: number;
}) => gql`
query FindDuplicate${capitalize(objectMetadataItem.nameSingular)}($id: ID) { query FindDuplicate${capitalize(objectMetadataItem.nameSingular)}($id: ID) {
${getFindDuplicateRecordsQueryResponseField( ${getFindDuplicateRecordsQueryResponseField(
objectMetadataItem.nameSingular, objectMetadataItem.nameSingular,
@ -41,4 +42,8 @@ export const useGenerateFindDuplicateRecordsQuery = () => {
} }
} }
`; `;
return {
findDuplicateRecordsQuery,
};
}; };

View File

@ -8,6 +8,7 @@ import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMembe
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier'; import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection'; import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection';
import { useFindManyRecordsQuery } from '@/object-record/hooks/useFindManyRecordsQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection'; import { ObjectRecordConnection } from '@/object-record/types/ObjectRecordConnection';
import { ObjectRecordEdge } from '@/object-record/types/ObjectRecordEdge'; import { ObjectRecordEdge } from '@/object-record/types/ObjectRecordEdge';
@ -30,7 +31,6 @@ export const useFindManyRecords = <T extends ObjectRecord = ObjectRecord>({
limit, limit,
onCompleted, onCompleted,
skip, skip,
depth = 1,
queryFields, queryFields,
}: ObjectMetadataItemIdentifier & }: ObjectMetadataItemIdentifier &
ObjectRecordQueryVariables & { ObjectRecordQueryVariables & {
@ -63,13 +63,14 @@ export const useFindManyRecords = <T extends ObjectRecord = ObjectRecord>({
isFetchingMoreRecordsFamilyState(findManyQueryStateIdentifier), isFetchingMoreRecordsFamilyState(findManyQueryStateIdentifier),
); );
const { objectMetadataItem, findManyRecordsQuery } = useObjectMetadataItem( const { objectMetadataItem } = useObjectMetadataItem({
{ objectNameSingular,
objectNameSingular, });
},
depth, const { findManyRecordsQuery } = useFindManyRecordsQuery({
objectNameSingular,
queryFields, queryFields,
); });
const { enqueueSnackBar } = useSnackBar(); const { enqueueSnackBar } = useSnackBar();
const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState);

View File

@ -0,0 +1,36 @@
import { useRecoilValue } from 'recoil';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { QueryFields } from '@/object-record/query-keys/types/QueryFields';
import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery';
export const useFindManyRecordsQuery = ({
objectNameSingular,
queryFields,
depth,
computeReferences,
}: {
objectNameSingular: string;
queryFields?: QueryFields;
depth?: number;
computeReferences?: boolean;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
const findManyRecordsQuery = generateFindManyRecordsQuery({
objectMetadataItem,
objectMetadataItems,
queryFields,
depth,
computeReferences,
});
return {
findManyRecordsQuery,
};
};

View File

@ -4,26 +4,30 @@ import { useQuery } from '@apollo/client';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier'; import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
import { getRecordFromRecordNode } from '@/object-record/cache/utils/getRecordFromRecordNode'; import { getRecordFromRecordNode } from '@/object-record/cache/utils/getRecordFromRecordNode';
import { useFindOneRecordQuery } from '@/object-record/hooks/useFindOneRecordQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
// TODO: fix connection in relation => automatically change to an array
export const useFindOneRecord = <T extends ObjectRecord = ObjectRecord>({ export const useFindOneRecord = <T extends ObjectRecord = ObjectRecord>({
objectNameSingular, objectNameSingular,
objectRecordId = '', objectRecordId = '',
onCompleted, onCompleted,
depth,
skip, skip,
depth,
}: ObjectMetadataItemIdentifier & { }: ObjectMetadataItemIdentifier & {
objectRecordId: string | undefined; objectRecordId: string | undefined;
onCompleted?: (data: T) => void; onCompleted?: (data: T) => void;
skip?: boolean; skip?: boolean;
depth?: number; depth?: number;
}) => { }) => {
const { objectMetadataItem, findOneRecordQuery } = useObjectMetadataItem( const { objectMetadataItem } = useObjectMetadataItem({
{ objectNameSingular }, objectNameSingular,
});
const { findOneRecordQuery } = useFindOneRecordQuery({
objectNameSingular,
depth, depth,
); });
const { data, loading, error } = useQuery< const { data, loading, error } = useQuery<
{ [nameSingular: string]: T }, { [nameSingular: string]: T },
@ -42,6 +46,7 @@ export const useFindOneRecord = <T extends ObjectRecord = ObjectRecord>({
}, },
}); });
// TODO: Remove connection from record
const recordWithoutConnection = useMemo( const recordWithoutConnection = useMemo(
() => () =>
data?.[objectNameSingular] data?.[objectNameSingular]

View File

@ -1,22 +1,25 @@
import { gql } from '@apollo/client'; import gql from 'graphql-tag';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
export const useGenerateFindOneRecordQuery = () => { export const useFindOneRecordQuery = ({
objectNameSingular,
depth,
}: {
objectNameSingular: string;
depth?: number;
}) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
return ({ const findOneRecordQuery = gql`
objectMetadataItem,
depth,
}: {
objectMetadataItem: Pick<ObjectMetadataItem, 'fields' | 'nameSingular'>;
depth?: number;
}) => {
return gql`
query FindOne${capitalize( query FindOne${capitalize(
objectMetadataItem.nameSingular, objectMetadataItem.nameSingular,
)}($objectRecordId: UUID!) { )}($objectRecordId: UUID!) {
@ -31,5 +34,8 @@ export const useGenerateFindOneRecordQuery = () => {
})} })}
} }
`; `;
return {
findOneRecordQuery,
}; };
}; };

View File

@ -1,36 +0,0 @@
import { gql } from '@apollo/client';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize';
export const getDeleteManyRecordsMutationResponseField = (
objectNamePlural: string,
) => `delete${capitalize(objectNamePlural)}`;
export const useGenerateDeleteManyRecordMutation = ({
objectMetadataItem,
}: {
objectMetadataItem: ObjectMetadataItem;
}) => {
if (isUndefinedOrNull(objectMetadataItem)) {
return EMPTY_MUTATION;
}
const capitalizedObjectName = capitalize(objectMetadataItem.namePlural);
const mutationResponseField = getDeleteManyRecordsMutationResponseField(
objectMetadataItem.namePlural,
);
return gql`
mutation DeleteMany${capitalizedObjectName}($filter: ${capitalize(
objectMetadataItem.nameSingular,
)}FilterInput!) {
${mutationResponseField}(filter: $filter) {
id
}
}
`;
};

View File

@ -1,55 +0,0 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { capitalize } from '~/utils/string/capitalize';
export const useGenerateFindManyRecordsQuery = () => {
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
return ({
objectMetadataItem,
depth,
queryFields,
computeReferences = false,
}: {
objectMetadataItem: Pick<
ObjectMetadataItem,
'fields' | 'nameSingular' | 'namePlural'
>;
depth?: number;
queryFields?: Record<string, any>;
computeReferences?: boolean;
}) => gql`
query FindMany${capitalize(
objectMetadataItem.namePlural,
)}($filter: ${capitalize(
objectMetadataItem.nameSingular,
)}FilterInput, $orderBy: ${capitalize(
objectMetadataItem.nameSingular,
)}OrderByInput, $lastCursor: String, $limit: Float) {
${
objectMetadataItem.namePlural
}(filter: $filter, orderBy: $orderBy, first: $limit, after: $lastCursor){
edges {
node ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
depth,
queryFields,
computeReferences,
})}
cursor
}
pageInfo {
hasNextPage
startCursor
endCursor
}
totalCount
}
}
`;
};

View File

@ -1,9 +1,8 @@
import { useLazyQuery } from '@apollo/client'; import { useLazyQuery } from '@apollo/client';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly';
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier'; import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
import { getRecordFromRecordNode } from '@/object-record/cache/utils/getRecordFromRecordNode'; import { getRecordFromRecordNode } from '@/object-record/cache/utils/getRecordFromRecordNode';
import { useGenerateFindOneRecordQuery } from '@/object-record/hooks/useGenerateFindOneRecordQuery'; import { useFindOneRecordQuery } from '@/object-record/hooks/useFindOneRecordQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
type UseLazyFindOneRecordParams = ObjectMetadataItemIdentifier & { type UseLazyFindOneRecordParams = ObjectMetadataItemIdentifier & {
@ -19,14 +18,13 @@ export const useLazyFindOneRecord = <T extends ObjectRecord = ObjectRecord>({
objectNameSingular, objectNameSingular,
depth, depth,
}: UseLazyFindOneRecordParams) => { }: UseLazyFindOneRecordParams) => {
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { findOneRecordQuery } = useFindOneRecordQuery({
objectNameSingular, objectNameSingular,
depth,
}); });
const findOneRecordQuery = useGenerateFindOneRecordQuery();
const [findOneRecord, { loading, error, data, called }] = useLazyQuery( const [findOneRecord, { loading, error, data, called }] =
findOneRecordQuery({ objectMetadataItem, depth }), useLazyQuery(findOneRecordQuery);
);
return { return {
findOneRecord: ({ objectRecordId, onCompleted }: FindOneRecordParams<T>) => findOneRecord: ({ objectRecordId, onCompleted }: FindOneRecordParams<T>) =>

View File

@ -3,10 +3,12 @@ import { useApolloClient } from '@apollo/client';
import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect'; import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/utils/triggerUpdateRecordOptimisticEffect';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { getRecordNodeFromRecord } from '@/object-record/cache/utils/getRecordNodeFromRecord'; import { getRecordNodeFromRecord } from '@/object-record/cache/utils/getRecordNodeFromRecord';
import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordFromCache'; import { updateRecordFromCache } from '@/object-record/cache/utils/updateRecordFromCache';
import { getUpdateOneRecordMutationResponseField } from '@/object-record/hooks/useGenerateUpdateOneRecordMutation'; import { useUpdateOneRecordMutation } from '@/object-record/hooks/useUpdateOneRecordMutation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { getUpdateOneRecordMutationResponseField } from '@/object-record/utils/getUpdateOneRecordMutationResponseField';
import { sanitizeRecordInput } from '@/object-record/utils/sanitizeRecordInput'; import { sanitizeRecordInput } from '@/object-record/utils/sanitizeRecordInput';
type useUpdateOneRecordProps = { type useUpdateOneRecordProps = {
@ -24,8 +26,17 @@ export const useUpdateOneRecord = <
}: useUpdateOneRecordProps) => { }: useUpdateOneRecordProps) => {
const apolloClient = useApolloClient(); const apolloClient = useApolloClient();
const { objectMetadataItem, updateOneRecordMutation, getRecordFromCache } = const { objectMetadataItem } = useObjectMetadataItem({
useObjectMetadataItem({ objectNameSingular }, depth, queryFields); objectNameSingular,
});
const getRecordFromCache = useGetRecordFromCache({
objectNameSingular,
});
const { updateOneRecordMutation } = useUpdateOneRecordMutation({
objectNameSingular,
});
const { objectMetadataItems } = useObjectMetadataItems(); const { objectMetadataItems } = useObjectMetadataItems();

View File

@ -1,30 +1,31 @@
import { gql } from '@apollo/client'; import gql from 'graphql-tag';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery'; import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-record/constants/EmptyMutation';
import { getUpdateOneRecordMutationResponseField } from '@/object-record/utils/getUpdateOneRecordMutationResponseField';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
export const getUpdateOneRecordMutationResponseField = ( export const useUpdateOneRecordMutation = ({
objectNameSingular: string, objectNameSingular,
) => `update${capitalize(objectNameSingular)}`;
export const useGenerateUpdateOneRecordMutation = ({
objectMetadataItem,
depth = 1,
computeReferences = false, computeReferences = false,
depth,
}: { }: {
objectMetadataItem: ObjectMetadataItem; objectNameSingular: string;
depth?: number;
computeReferences?: boolean; computeReferences?: boolean;
depth?: number;
}) => { }) => {
const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState); const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
if (isUndefinedOrNull(objectMetadataItem)) { if (isUndefinedOrNull(objectMetadataItem)) {
return EMPTY_MUTATION; return { updateOneRecordMutation: EMPTY_MUTATION };
} }
const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular); const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular);
@ -33,7 +34,7 @@ export const useGenerateUpdateOneRecordMutation = ({
objectMetadataItem.nameSingular, objectMetadataItem.nameSingular,
); );
return gql` const updateOneRecordMutation = gql`
mutation UpdateOne${capitalizedObjectName}($idToUpdate: ID!, $input: ${capitalizedObjectName}UpdateInput!) { mutation UpdateOne${capitalizedObjectName}($idToUpdate: ID!, $input: ${capitalizedObjectName}UpdateInput!) {
${mutationResponseField}(id: $idToUpdate, data: $input) ${mapObjectMetadataToGraphQLQuery( ${mutationResponseField}(id: $idToUpdate, data: $input) ${mapObjectMetadataToGraphQLQuery(
{ {
@ -45,4 +46,8 @@ export const useGenerateUpdateOneRecordMutation = ({
)} )}
} }
`; `;
return {
updateOneRecordMutation,
};
}; };

View File

@ -1,8 +1,8 @@
import { useQuery } from '@apollo/client'; import { useQuery } from '@apollo/client';
import { EMPTY_QUERY } from '@/object-metadata/hooks/useObjectMetadataItem';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection'; import { getRecordsFromRecordConnection } from '@/object-record/cache/utils/getRecordsFromRecordConnection';
import { EMPTY_QUERY } from '@/object-record/constants/EmptyQuery';
import { useGenerateFindManyRecordsForMultipleMetadataItemsQuery } from '@/object-record/multiple-objects/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery'; import { useGenerateFindManyRecordsForMultipleMetadataItemsQuery } from '@/object-record/multiple-objects/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery';
import { MultiObjectRecordQueryResult } from '@/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray'; import { MultiObjectRecordQueryResult } from '@/object-record/relation-picker/hooks/useMultiObjectRecordsQueryResultFormattedAsObjectRecordForSelectArray';

View File

@ -12,7 +12,9 @@ export const useOptionsForSelect = (fieldMetadataId: string) => {
objectNamePlural, objectNamePlural,
}); });
const { objectMetadataItem } = useObjectMetadataItem({ objectNameSingular }); const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const fieldMetadataItem = objectMetadataItem.fields.find( const fieldMetadataItem = objectMetadataItem.fields.find(
(field) => field.id === fieldMetadataId, (field) => field.id === fieldMetadataId,

View File

@ -0,0 +1 @@
export type QueryFields = Record<string, any>;

View File

@ -1,9 +1,10 @@
import { QueryFields } from '@/object-record/query-keys/types/QueryFields';
import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables'; import { ObjectRecordQueryVariables } from '@/object-record/types/ObjectRecordQueryVariables';
export type QueryKey = { export type QueryKey = {
objectNameSingular: string; objectNameSingular: string;
variables: ObjectRecordQueryVariables; variables: ObjectRecordQueryVariables;
depth?: number; depth?: number;
fields?: Record<string, any>; // Todo: Fields should be required fields?: QueryFields; // Todo: Fields should be required
fieldsFactory?: (fieldsFactoryParam: any) => Record<string, any>; fieldsFactory?: (fieldsFactoryParam: any) => QueryFields;
}; };

View File

@ -1,6 +1,6 @@
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord'; import { useCreateOneRecord } from '@/object-record/hooks/useCreateOneRecord';
import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord'; import { useDeleteOneRecord } from '@/object-record/hooks/useDeleteOneRecord';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
@ -21,7 +21,7 @@ export const RecordIndexBoardContainer = ({
recordBoardId, recordBoardId,
objectNameSingular, objectNameSingular,
}: RecordIndexBoardContainerProps) => { }: RecordIndexBoardContainerProps) => {
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -2,7 +2,7 @@ import { useCallback, useEffect } from 'react';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useRecoilValue, useSetRecoilState } from 'recoil';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useRecordActionBar } from '@/object-record/record-action-bar/hooks/useRecordActionBar'; import { useRecordActionBar } from '@/object-record/record-action-bar/hooks/useRecordActionBar';
import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard'; import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard';
import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection'; import { useRecordBoardSelection } from '@/object-record/record-board/hooks/useRecordBoardSelection';
@ -24,7 +24,7 @@ export const RecordIndexBoardContainerEffect = ({
recordBoardId, recordBoardId,
viewBarId, viewBarId,
}: RecordIndexBoardContainerEffectProps) => { }: RecordIndexBoardContainerEffectProps) => {
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -2,7 +2,7 @@ import styled from '@emotion/styled';
import { useRecoilCallback, useRecoilState, useSetRecoilState } from 'recoil'; import { useRecoilCallback, useRecoilState, useSetRecoilState } from 'recoil';
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural'; import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
import { RecordIndexBoardContainer } from '@/object-record/record-index/components/RecordIndexBoardContainer'; import { RecordIndexBoardContainer } from '@/object-record/record-index/components/RecordIndexBoardContainer';
import { RecordIndexBoardContainerEffect } from '@/object-record/record-index/components/RecordIndexBoardContainerEffect'; import { RecordIndexBoardContainerEffect } from '@/object-record/record-index/components/RecordIndexBoardContainerEffect';
@ -53,7 +53,7 @@ export const RecordIndexContainer = ({
objectNamePlural, objectNamePlural,
}); });
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -2,7 +2,7 @@ import { useEffect } from 'react';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useRecordActionBar } from '@/object-record/record-action-bar/hooks/useRecordActionBar'; import { useRecordActionBar } from '@/object-record/record-action-bar/hooks/useRecordActionBar';
import { useHandleToggleColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleColumnFilter'; import { useHandleToggleColumnFilter } from '@/object-record/record-index/hooks/useHandleToggleColumnFilter';
import { useHandleToggleColumnSort } from '@/object-record/record-index/hooks/useHandleToggleColumnSort'; import { useHandleToggleColumnSort } from '@/object-record/record-index/hooks/useHandleToggleColumnSort';
@ -31,7 +31,7 @@ export const RecordIndexTableContainerEffect = ({
recordTableId, recordTableId,
}); });
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -1,7 +1,7 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useRecoilValue, useSetRecoilState } from 'recoil';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy'; import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard'; import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard';
@ -25,7 +25,7 @@ export const useLoadRecordIndexBoard = ({
viewBarId, viewBarId,
recordBoardId, recordBoardId,
}: UseLoadRecordIndexBoardProps) => { }: UseLoadRecordIndexBoardProps) => {
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });
const { const {

View File

@ -1,7 +1,7 @@
import { useRecoilValue, useSetRecoilState } from 'recoil'; import { useRecoilValue, useSetRecoilState } from 'recoil';
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts'; import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy'; import { turnSortsIntoOrderBy } from '@/object-record/object-sort-dropdown/utils/turnSortsIntoOrderBy';
import { turnObjectDropdownFilterIntoQueryFilter } from '@/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter'; import { turnObjectDropdownFilterIntoQueryFilter } from '@/object-record/record-filter/utils/turnObjectDropdownFilterIntoQueryFilter';
@ -14,7 +14,7 @@ export const useFindManyParams = (
objectNameSingular: string, objectNameSingular: string,
recordTableId?: string, recordTableId?: string,
) => { ) => {
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -3,7 +3,7 @@ import { OnDragEndResponder } from '@hello-pangea/dnd';
import { useRecoilState } from 'recoil'; import { useRecoilState } from 'recoil';
import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata'; import { useColumnDefinitionsFromFieldMetadata } from '@/object-metadata/hooks/useColumnDefinitionsFromFieldMetadata';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard'; import { useRecordBoard } from '@/object-record/record-board/hooks/useRecordBoard';
import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata';
import { recordIndexFieldDefinitionsState } from '@/object-record/record-index/states/recordIndexFieldDefinitionsState'; import { recordIndexFieldDefinitionsState } from '@/object-record/record-index/states/recordIndexFieldDefinitionsState';
@ -38,7 +38,7 @@ export const useRecordIndexOptionsForBoard = ({
isCompactModeActiveState, isCompactModeActiveState,
); );
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -1,6 +1,7 @@
import groupBy from 'lodash.groupby'; import groupBy from 'lodash.groupby';
import { useRecoilState, useRecoilValue } from 'recoil'; import { useRecoilState, useRecoilValue } from 'recoil';
import { useLabelIdentifierFieldMetadataItem } from '@/object-metadata/hooks/useLabelIdentifierFieldMetadataItem';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
@ -41,8 +42,12 @@ export const RecordShowContainer = ({
objectNameSingular, objectNameSingular,
objectRecordId, objectRecordId,
}: RecordShowContainerProps) => { }: RecordShowContainerProps) => {
const { objectMetadataItem, labelIdentifierFieldMetadata } = const { objectMetadataItem } = useObjectMetadataItem({
useObjectMetadataItem({ objectNameSingular,
});
const { labelIdentifierFieldMetadataItem } =
useLabelIdentifierFieldMetadataItem({
objectNameSingular, objectNameSingular,
}); });
@ -105,7 +110,7 @@ export const RecordShowContainer = ({
.filter( .filter(
(fieldMetadataItem) => (fieldMetadataItem) =>
isFieldCellSupported(fieldMetadataItem) && isFieldCellSupported(fieldMetadataItem) &&
fieldMetadataItem.id !== labelIdentifierFieldMetadata?.id, fieldMetadataItem.id !== labelIdentifierFieldMetadataItem?.id,
) )
.sort((fieldMetadataItemA, fieldMetadataItemB) => .sort((fieldMetadataItemA, fieldMetadataItemB) =>
fieldMetadataItemA.name.localeCompare(fieldMetadataItemB.name), fieldMetadataItemA.name.localeCompare(fieldMetadataItemB.name),
@ -135,17 +140,19 @@ export const RecordShowContainer = ({
value={{ value={{
entityId: objectRecordId, entityId: objectRecordId,
recoilScopeId: recoilScopeId:
objectRecordId + labelIdentifierFieldMetadata?.id, objectRecordId + labelIdentifierFieldMetadataItem?.id,
isLabelIdentifier: false, isLabelIdentifier: false,
fieldDefinition: { fieldDefinition: {
type: type:
labelIdentifierFieldMetadata?.type || labelIdentifierFieldMetadataItem?.type ||
FieldMetadataType.Text, FieldMetadataType.Text,
iconName: '', iconName: '',
fieldMetadataId: labelIdentifierFieldMetadata?.id ?? '', fieldMetadataId:
label: labelIdentifierFieldMetadata?.label || '', labelIdentifierFieldMetadataItem?.id ?? '',
label: labelIdentifierFieldMetadataItem?.label || '',
metadata: { metadata: {
fieldName: labelIdentifierFieldMetadata?.name || '', fieldName:
labelIdentifierFieldMetadataItem?.name || '',
}, },
}, },
useUpdateRecord: useUpdateOneObjectRecordMutation, useUpdateRecord: useUpdateOneObjectRecordMutation,

View File

@ -9,7 +9,7 @@ import {
IconUnlink, IconUnlink,
} from 'twenty-ui'; } from 'twenty-ui';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition'; import { formatFieldMetadataItemAsColumnDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsColumnDefinition';
import { RecordChip } from '@/object-record/components/RecordChip'; import { RecordChip } from '@/object-record/components/RecordChip';
@ -92,7 +92,7 @@ export const RecordDetailRelationRecordsListItem = ({
const isToOneObject = relationType === 'TO_ONE_OBJECT'; const isToOneObject = relationType === 'TO_ONE_OBJECT';
const { objectMetadataItem: relationObjectMetadataItem } = const { objectMetadataItem: relationObjectMetadataItem } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: relationObjectMetadataNameSingular, objectNameSingular: relationObjectMetadataNameSingular,
}); });

View File

@ -4,7 +4,7 @@ import qs from 'qs';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { IconForbid, IconPencil, IconPlus } from 'twenty-ui'; import { IconForbid, IconPencil, IconPlus } from 'twenty-ui';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord'; import { useUpdateOneRecord } from '@/object-record/hooks/useUpdateOneRecord';
import { FieldContext } from '@/object-record/record-field/contexts/FieldContext'; import { FieldContext } from '@/object-record/record-field/contexts/FieldContext';
import { usePersistField } from '@/object-record/record-field/hooks/usePersistField'; import { usePersistField } from '@/object-record/record-field/hooks/usePersistField';
@ -42,7 +42,7 @@ export const RecordDetailRelationSection = () => {
const record = useRecoilValue(recordStoreFamilyState(entityId)); const record = useRecoilValue(recordStoreFamilyState(entityId));
const { objectMetadataItem: relationObjectMetadataItem } = const { objectMetadataItem: relationObjectMetadataItem } =
useObjectMetadataItemOnly({ useObjectMetadataItem({
objectNameSingular: relationObjectMetadataNameSingular, objectNameSingular: relationObjectMetadataNameSingular,
}); });

View File

@ -2,7 +2,7 @@ import { css } from '@emotion/react';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { RecordTableBody } from '@/object-record/record-table/components/RecordTableBody'; import { RecordTableBody } from '@/object-record/record-table/components/RecordTableBody';
import { RecordTableBodyEffect } from '@/object-record/record-table/components/RecordTableBodyEffect'; import { RecordTableBodyEffect } from '@/object-record/record-table/components/RecordTableBodyEffect';
import { RecordTableHeader } from '@/object-record/record-table/components/RecordTableHeader'; import { RecordTableHeader } from '@/object-record/record-table/components/RecordTableHeader';
@ -141,7 +141,7 @@ export const RecordTable = ({
const scrollLeft = useRecoilValue(scrollLeftState); const scrollLeft = useRecoilValue(scrollLeftState);
const scrollTop = useRecoilValue(scrollTopState); const scrollTop = useRecoilValue(scrollTopState);
const { objectMetadataItem } = useObjectMetadataItemOnly({ const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular, objectNameSingular,
}); });

View File

@ -43,7 +43,9 @@ export const RecordTableRow = ({ recordId, rowIndex }: RecordTableRowProps) => {
recordId, recordId,
rowIndex, rowIndex,
pathToShowPage: pathToShowPage:
getBasePathToShowPage({ objectMetadataItem }) + recordId, getBasePathToShowPage({
objectNameSingular: objectMetadataItem.nameSingular,
}) + recordId,
isSelected: currentRowSelected, isSelected: currentRowSelected,
}} }}
> >

View File

@ -2,8 +2,8 @@ import { useQuery } from '@apollo/client';
import { isNonEmptyArray } from '@sniptt/guards'; import { isNonEmptyArray } from '@sniptt/guards';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { EMPTY_QUERY } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { EMPTY_QUERY } from '@/object-record/constants/EmptyQuery';
import { useGenerateFindManyRecordsForMultipleMetadataItemsQuery } from '@/object-record/multiple-objects/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery'; import { useGenerateFindManyRecordsForMultipleMetadataItemsQuery } from '@/object-record/multiple-objects/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery';
import { useLimitPerMetadataItem } from '@/object-record/relation-picker/hooks/useLimitPerMetadataItem'; import { useLimitPerMetadataItem } from '@/object-record/relation-picker/hooks/useLimitPerMetadataItem';
import { import {

View File

@ -1,9 +1,9 @@
import { useQuery } from '@apollo/client'; import { useQuery } from '@apollo/client';
import { useRecoilValue } from 'recoil'; import { useRecoilValue } from 'recoil';
import { EMPTY_QUERY } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState'; import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { EMPTY_QUERY } from '@/object-record/constants/EmptyQuery';
import { useGenerateFindManyRecordsForMultipleMetadataItemsQuery } from '@/object-record/multiple-objects/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery'; import { useGenerateFindManyRecordsForMultipleMetadataItemsQuery } from '@/object-record/multiple-objects/hooks/useGenerateFindManyRecordsForMultipleMetadataItemsQuery';
import { useLimitPerMetadataItem } from '@/object-record/relation-picker/hooks/useLimitPerMetadataItem'; import { useLimitPerMetadataItem } from '@/object-record/relation-picker/hooks/useLimitPerMetadataItem';
import { import {

View File

@ -1,5 +1,5 @@
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getObjectOrderByField } from '@/object-metadata/utils/getObjectOrderByField'; import { getOrderByFieldForObjectMetadataItem } from '@/object-metadata/utils/getObjectOrderByField';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
import { capitalize } from '~/utils/string/capitalize'; import { capitalize } from '~/utils/string/capitalize';
@ -11,7 +11,8 @@ export const useOrderByFieldPerMetadataItem = ({
const orderByFieldPerMetadataItem = Object.fromEntries( const orderByFieldPerMetadataItem = Object.fromEntries(
objectMetadataItems objectMetadataItems
.map((objectMetadataItem) => { .map((objectMetadataItem) => {
const orderByField = getObjectOrderByField(objectMetadataItem); const orderByField =
getOrderByFieldForObjectMetadataItem(objectMetadataItem);
return [ return [
`orderBy${capitalize(objectMetadataItem.nameSingular)}`, `orderBy${capitalize(objectMetadataItem.nameSingular)}`,

View File

@ -1,6 +1,7 @@
import { isNonEmptyString } from '@sniptt/guards'; import { isNonEmptyString } from '@sniptt/guards';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
import { OrderBy } from '@/object-metadata/types/OrderBy'; import { OrderBy } from '@/object-metadata/types/OrderBy';
import { DEFAULT_SEARCH_REQUEST_LIMIT } from '@/object-record/constants/DefaultSearchRequestLimit'; import { DEFAULT_SEARCH_REQUEST_LIMIT } from '@/object-record/constants/DefaultSearchRequestLimit';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
@ -24,10 +25,9 @@ export const useRecordsForSelect = ({
excludeEntityIds?: string[]; excludeEntityIds?: string[];
objectNameSingular: string; objectNameSingular: string;
}) => { }) => {
const { mapToObjectRecordIdentifier, getObjectOrderByField } = const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
useObjectMetadataItem({ objectNameSingular,
objectNameSingular, });
});
const filters = [ const filters = [
{ {
@ -36,6 +36,10 @@ export const useRecordsForSelect = ({
}, },
]; ];
const { getObjectOrderByField } = useGetObjectOrderByField({
objectNameSingular,
});
const orderByField = getObjectOrderByField(sortOrder); const orderByField = getObjectOrderByField(sortOrder);
const selectedIdsFilter = { id: { in: selectedIds } }; const selectedIdsFilter = { id: { in: selectedIds } };

View File

@ -19,7 +19,9 @@ export const useSpreadsheetRecordImport = (objectNameSingular: string) => {
const { enqueueSnackBar } = useSnackBar(); const { enqueueSnackBar } = useSnackBar();
const { getIcon } = useIcons(); const { getIcon } = useIcons();
const { objectMetadataItem } = useObjectMetadataItem({ objectNameSingular }); const { objectMetadataItem } = useObjectMetadataItem({
objectNameSingular,
});
const fields = objectMetadataItem.fields const fields = objectMetadataItem.fields
.filter( .filter(
(x) => (x) =>

View File

@ -1,34 +0,0 @@
import { gql } from '@apollo/client';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull';
import { capitalize } from '~/utils/string/capitalize';
export const getDeleteOneRecordMutationResponseField = (
objectNameSingular: string,
) => `delete${capitalize(objectNameSingular)}`;
export const generateDeleteOneRecordMutation = ({
objectMetadataItem,
}: {
objectMetadataItem: ObjectMetadataItem;
}) => {
if (isUndefinedOrNull(objectMetadataItem)) {
return EMPTY_MUTATION;
}
const capitalizedObjectName = capitalize(objectMetadataItem.nameSingular);
const mutationResponseField = getDeleteOneRecordMutationResponseField(
objectMetadataItem.nameSingular,
);
return gql`
mutation DeleteOne${capitalizedObjectName}($idToDelete: ID!) {
${mutationResponseField}(id: $idToDelete) {
id
}
}
`;
};

View File

@ -0,0 +1,49 @@
import gql from 'graphql-tag';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { QueryFields } from '@/object-record/query-keys/types/QueryFields';
import { capitalize } from '~/utils/string/capitalize';
export const generateFindManyRecordsQuery = ({
objectMetadataItem,
objectMetadataItems,
depth,
queryFields,
computeReferences,
}: {
objectMetadataItem: ObjectMetadataItem;
objectMetadataItems: ObjectMetadataItem[];
queryFields?: QueryFields;
depth?: number;
computeReferences?: boolean;
}) => gql`
query FindMany${capitalize(
objectMetadataItem.namePlural,
)}($filter: ${capitalize(
objectMetadataItem.nameSingular,
)}FilterInput, $orderBy: ${capitalize(
objectMetadataItem.nameSingular,
)}OrderByInput, $lastCursor: String, $limit: Float) {
${
objectMetadataItem.namePlural
}(filter: $filter, orderBy: $orderBy, first: $limit, after: $lastCursor){
edges {
node ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
depth,
queryFields,
computeReferences,
})}
cursor
}
pageInfo {
hasNextPage
startCursor
endCursor
}
totalCount
}
}
`;

View File

@ -0,0 +1,5 @@
import { capitalize } from '~/utils/string/capitalize';
export const getCreateManyRecordsMutationResponseField = (
objectNamePlural: string,
) => `create${capitalize(objectNamePlural)}`;

View File

@ -0,0 +1,5 @@
import { capitalize } from '~/utils/string/capitalize';
export const getCreateOneRecordMutationResponseField = (
objectNameSingular: string,
) => `create${capitalize(objectNameSingular)}`;

View File

@ -0,0 +1,5 @@
import { capitalize } from '~/utils/string/capitalize';
export const getDeleteManyRecordsMutationResponseField = (
objectNamePlural: string,
) => `delete${capitalize(objectNamePlural)}`;

View File

@ -0,0 +1,5 @@
import { capitalize } from '~/utils/string/capitalize';
export const getDeleteOneRecordMutationResponseField = (
objectNameSingular: string,
) => `delete${capitalize(objectNameSingular)}`;

View File

@ -0,0 +1,3 @@
export const getFindDuplicateRecordsQueryResponseField = (
objectNameSingular: string,
) => `${objectNameSingular}Duplicates`;

View File

@ -0,0 +1,5 @@
import { capitalize } from '~/utils/string/capitalize';
export const getUpdateOneRecordMutationResponseField = (
objectNameSingular: string,
) => `update${capitalize(objectNameSingular)}`;

View File

@ -1,6 +1,6 @@
import { isNonEmptyString } from '@sniptt/guards'; import { isNonEmptyString } from '@sniptt/guards';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
import { OrderBy } from '@/object-metadata/types/OrderBy'; import { OrderBy } from '@/object-metadata/types/OrderBy';
import { DEFAULT_SEARCH_REQUEST_LIMIT } from '@/object-record/constants/DefaultSearchRequestLimit'; import { DEFAULT_SEARCH_REQUEST_LIMIT } from '@/object-record/constants/DefaultSearchRequestLimit';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
@ -33,9 +33,10 @@ export const useFilteredSearchEntityQuery = ({
excludeEntityIds?: string[]; excludeEntityIds?: string[];
objectNameSingular: string; objectNameSingular: string;
}): EntitiesForMultipleEntitySelect<EntityForSelect> => { }): EntitiesForMultipleEntitySelect<EntityForSelect> => {
const { mapToObjectRecordIdentifier } = useObjectMetadataItem({ const { mapToObjectRecordIdentifier } = useMapToObjectRecordIdentifier({
objectNameSingular, objectNameSingular,
}); });
const mappingFunction = (record: ObjectRecord) => ({ const mappingFunction = (record: ObjectRecord) => ({
...mapToObjectRecordIdentifier(record), ...mapToObjectRecordIdentifier(record),
record, record,

View File

@ -7,17 +7,27 @@ import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useCreateOneRecordMutation } from '@/object-record/hooks/useCreateOneRecordMutation';
import { useUpdateOneRecordMutation } from '@/object-record/hooks/useUpdateOneRecordMutation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { GraphQLView } from '@/views/types/GraphQLView'; import { GraphQLView } from '@/views/types/GraphQLView';
import { ViewField } from '@/views/types/ViewField'; import { ViewField } from '@/views/types/ViewField';
export const usePersistViewFieldRecords = () => { export const usePersistViewFieldRecords = () => {
const { const { objectMetadataItem } = useObjectMetadataItem({
updateOneRecordMutation, objectNameSingular: CoreObjectNameSingular.ViewField,
createOneRecordMutation, });
getRecordFromCache,
objectMetadataItem, const getRecordFromCache = useGetRecordFromCache({
} = useObjectMetadataItem({ objectNameSingular: CoreObjectNameSingular.ViewField,
});
const { createOneRecordMutation } = useCreateOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewField,
});
const { updateOneRecordMutation } = useUpdateOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewField, objectNameSingular: CoreObjectNameSingular.ViewField,
}); });

View File

@ -7,18 +7,32 @@ import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useCreateOneRecordMutation } from '@/object-record/hooks/useCreateOneRecordMutation';
import { useDeleteOneRecordMutation } from '@/object-record/hooks/useDeleteOneRecordMutation';
import { useUpdateOneRecordMutation } from '@/object-record/hooks/useUpdateOneRecordMutation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { GraphQLView } from '@/views/types/GraphQLView'; import { GraphQLView } from '@/views/types/GraphQLView';
import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilter } from '@/views/types/ViewFilter';
export const usePersistViewFilterRecords = () => { export const usePersistViewFilterRecords = () => {
const { const { objectMetadataItem } = useObjectMetadataItem({
updateOneRecordMutation, objectNameSingular: CoreObjectNameSingular.ViewFilter,
createOneRecordMutation, });
deleteOneRecordMutation,
objectMetadataItem, const getRecordFromCache = useGetRecordFromCache({
getRecordFromCache, objectNameSingular: CoreObjectNameSingular.ViewFilter,
} = useObjectMetadataItem({ });
const { deleteOneRecordMutation } = useDeleteOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewFilter,
});
const { createOneRecordMutation } = useCreateOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewFilter,
});
const { updateOneRecordMutation } = useUpdateOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewFilter, objectNameSingular: CoreObjectNameSingular.ViewFilter,
}); });

View File

@ -7,18 +7,32 @@ import { triggerUpdateRecordOptimisticEffect } from '@/apollo/optimistic-effect/
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { useCreateOneRecordMutation } from '@/object-record/hooks/useCreateOneRecordMutation';
import { useDeleteOneRecordMutation } from '@/object-record/hooks/useDeleteOneRecordMutation';
import { useUpdateOneRecordMutation } from '@/object-record/hooks/useUpdateOneRecordMutation';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { GraphQLView } from '@/views/types/GraphQLView'; import { GraphQLView } from '@/views/types/GraphQLView';
import { ViewSort } from '@/views/types/ViewSort'; import { ViewSort } from '@/views/types/ViewSort';
export const usePersistViewSortRecords = () => { export const usePersistViewSortRecords = () => {
const { const { objectMetadataItem } = useObjectMetadataItem({
updateOneRecordMutation, objectNameSingular: CoreObjectNameSingular.ViewSort,
createOneRecordMutation, });
deleteOneRecordMutation,
objectMetadataItem, const getRecordFromCache = useGetRecordFromCache({
getRecordFromCache, objectNameSingular: CoreObjectNameSingular.ViewSort,
} = useObjectMetadataItem({ });
const { deleteOneRecordMutation } = useDeleteOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewSort,
});
const { createOneRecordMutation } = useCreateOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewSort,
});
const { updateOneRecordMutation } = useUpdateOneRecordMutation({
objectNameSingular: CoreObjectNameSingular.ViewSort, objectNameSingular: CoreObjectNameSingular.ViewSort,
}); });

View File

@ -3,16 +3,17 @@ import { useParams, useSearchParams } from 'react-router-dom';
import { useApolloClient } from '@apollo/client'; import { useApolloClient } from '@apollo/client';
import { isNonEmptyString } from '@sniptt/guards'; import { isNonEmptyString } from '@sniptt/guards';
import qs from 'qs'; import qs from 'qs';
import { useRecoilCallback } from 'recoil'; import { useRecoilCallback, useRecoilValue } from 'recoil';
import z from 'zod'; import z from 'zod';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural'; import { useObjectNameSingularFromPlural } from '@/object-metadata/hooks/useObjectNameSingularFromPlural';
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector'; import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions'; import { formatFieldMetadataItemAsFilterDefinition } from '@/object-metadata/utils/formatFieldMetadataItemsAsFilterDefinitions';
import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier'; import { getObjectRecordIdentifier } from '@/object-metadata/utils/getObjectRecordIdentifier';
import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenerateFindManyRecordsQuery';
import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { ObjectRecord } from '@/object-record/types/ObjectRecord';
import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery';
import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilter } from '@/views/types/ViewFilter';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
@ -39,8 +40,11 @@ export const useViewFromQueryParams = () => {
const { objectNameSingular } = useObjectNameSingularFromPlural({ const { objectNameSingular } = useObjectNameSingularFromPlural({
objectNamePlural, objectNamePlural,
}); });
const { objectMetadataItem } = useObjectMetadataItem({ objectNameSingular }); const { objectMetadataItem } = useObjectMetadataItem({
const generateFindManyRecordsQuery = useGenerateFindManyRecordsQuery(); objectNameSingular,
});
const objectMetadataItems = useRecoilValue(objectMetadataItemsState);
const queryParamsValidation = filterQueryParamsSchema.safeParse( const queryParamsValidation = filterQueryParamsSchema.safeParse(
qs.parse(searchParams.toString()), qs.parse(searchParams.toString()),
@ -119,6 +123,7 @@ export const useViewFromQueryParams = () => {
>({ >({
query: generateFindManyRecordsQuery({ query: generateFindManyRecordsQuery({
objectMetadataItem: relationObjectMetadataItem, objectMetadataItem: relationObjectMetadataItem,
objectMetadataItems,
}), }),
variables: { variables: {
filter: { id: { in: filterValueFromURL } }, filter: { id: { in: filterValueFromURL } },
@ -165,9 +170,9 @@ export const useViewFromQueryParams = () => {
[ [
apolloClient, apolloClient,
filterQueryParams, filterQueryParams,
generateFindManyRecordsQuery,
hasFiltersQueryParams, hasFiltersQueryParams,
objectMetadataItem.fields, objectMetadataItem.fields,
objectMetadataItems,
], ],
); );

View File

@ -1,15 +1,15 @@
import { useCallback } from 'react'; import { useCallback } from 'react';
import { useApolloClient } from '@apollo/client'; import { useApolloClient } from '@apollo/client';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
import { View } from '@/views/types/View'; import { View } from '@/views/types/View';
export const useGetViewFromCache = () => { export const useGetViewFromCache = () => {
const client = useApolloClient(); const client = useApolloClient();
const cache = client.cache; const cache = client.cache;
const { getRecordFromCache } = useObjectMetadataItem({ const getRecordFromCache = useGetRecordFromCache({
objectNameSingular: CoreObjectNameSingular.View, objectNameSingular: CoreObjectNameSingular.View,
}); });

View File

@ -3,6 +3,7 @@ import { useParams } from 'react-router-dom';
import { useSetRecoilState } from 'recoil'; import { useSetRecoilState } from 'recoil';
import { useFavorites } from '@/favorites/hooks/useFavorites'; import { useFavorites } from '@/favorites/hooks/useFavorites';
import { useLabelIdentifierFieldMetadataItem } from '@/object-metadata/hooks/useLabelIdentifierFieldMetadataItem';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord'; import { useFindOneRecord } from '@/object-record/hooks/useFindOneRecord';
import { RecordShowContainer } from '@/object-record/record-show/components/RecordShowContainer'; import { RecordShowContainer } from '@/object-record/record-show/components/RecordShowContainer';
@ -32,8 +33,14 @@ export const RecordShowPage = () => {
throw new Error(`Record id is not defined`); throw new Error(`Record id is not defined`);
} }
const { labelIdentifierFieldMetadata, objectMetadataItem } = const { objectMetadataItem } = useObjectMetadataItem({
useObjectMetadataItem({ objectNameSingular }); objectNameSingular,
});
const { labelIdentifierFieldMetadataItem } =
useLabelIdentifierFieldMetadataItem({
objectNameSingular,
});
const { favorites, createFavorite, deleteFavorite } = useFavorites(); const { favorites, createFavorite, deleteFavorite } = useFavorites();
@ -72,9 +79,9 @@ export const RecordShowPage = () => {
}; };
const labelIdentifierFieldValue = const labelIdentifierFieldValue =
record?.[labelIdentifierFieldMetadata?.name ?? '']; record?.[labelIdentifierFieldMetadataItem?.name ?? ''];
const pageName = const pageName =
labelIdentifierFieldMetadata?.type === FieldMetadataType.FullName labelIdentifierFieldMetadataItem?.type === FieldMetadataType.FullName
? [ ? [
labelIdentifierFieldValue?.firstName, labelIdentifierFieldValue?.firstName,
labelIdentifierFieldValue?.lastName, labelIdentifierFieldValue?.lastName,

View File

@ -8,7 +8,7 @@ import { CachedObjectRecordEdge } from '@/apollo/types/CachedObjectRecordEdge';
import { useCreateOneRelationMetadataItem } from '@/object-metadata/hooks/useCreateOneRelationMetadataItem'; import { useCreateOneRelationMetadataItem } from '@/object-metadata/hooks/useCreateOneRelationMetadataItem';
import { useFieldMetadataItem } from '@/object-metadata/hooks/useFieldMetadataItem'; import { useFieldMetadataItem } from '@/object-metadata/hooks/useFieldMetadataItem';
import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems'; import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilteredObjectMetadataItems';
import { useObjectMetadataItemOnly } from '@/object-metadata/hooks/useObjectMetadataItemOnly'; import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache'; import { modifyRecordFromCache } from '@/object-record/cache/utils/modifyRecordFromCache';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
@ -85,10 +85,9 @@ export const SettingsObjectNewFieldStep2 = () => {
const [objectViews, setObjectViews] = useState<View[]>([]); const [objectViews, setObjectViews] = useState<View[]>([]);
const [relationObjectViews, setRelationObjectViews] = useState<View[]>([]); const [relationObjectViews, setRelationObjectViews] = useState<View[]>([]);
const { objectMetadataItem: viewObjectMetadataItem } = const { objectMetadataItem: viewObjectMetadataItem } = useObjectMetadataItem({
useObjectMetadataItemOnly({ objectNameSingular: CoreObjectNameSingular.View,
objectNameSingular: CoreObjectNameSingular.View, });
});
useFindManyRecords<View>({ useFindManyRecords<View>({
objectNameSingular: CoreObjectNameSingular.View, objectNameSingular: CoreObjectNameSingular.View,