* feat: find duplicate objects backend init * refactor: move duplicate criteria to constants * fix: correct constant usage after type change * feat: skip query generation in case its not necessary * feat: filter out existing duplicate * feat: FE queries and hooks * feat: show duplicates on FE * refactor: should-skip-query moved to workspace utils * refactor: naming improvements * refactor: current record typings/parsing improvements * refactor: throw error if existing record not found * fix: domain -> domainName duplicate criteria * refactor: fieldNames -> columnNames * docs: add explanation to duplicate criteria collection * feat: add person linkedinLinkUrl as duplicate criteria * feat: throw early when bot id and data are empty * refactor: trying to improve readability of filter criteria query * refactor: naming improvements * refactor: remove shouldSkipQuery * feat: resolve empty array in case of empty filter * feat: hide whole section in case of no duplicates * feat: FE display list the same way as relations * test: basic unit test coverage * Refactor Record detail section front * Use Create as input argument of findDuplicates * Improve coverage * Fix --------- Co-authored-by: Charles Bochet <charles@twenty.com>
159 lines
5.5 KiB
TypeScript
159 lines
5.5 KiB
TypeScript
import { gql } from '@apollo/client';
|
|
import { useRecoilValue } from 'recoil';
|
|
|
|
import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState.ts';
|
|
import { ObjectMetadataItemNotFoundError } from '@/object-metadata/errors/ObjectMetadataNotFoundError';
|
|
import { useGetObjectOrderByField } from '@/object-metadata/hooks/useGetObjectOrderByField';
|
|
import { useMapToObjectRecordIdentifier } from '@/object-metadata/hooks/useMapToObjectRecordIdentifier';
|
|
import { objectMetadataItemFamilySelector } from '@/object-metadata/states/objectMetadataItemFamilySelector';
|
|
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
|
|
import { getBasePathToShowPage } from '@/object-metadata/utils/getBasePathToShowPage';
|
|
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
|
|
import { getObjectMetadataItemsMock } from '@/object-metadata/utils/getObjectMetadataItemsMock';
|
|
import { useGetRecordFromCache } from '@/object-record/cache/hooks/useGetRecordFromCache';
|
|
import { useModifyRecordFromCache } from '@/object-record/cache/hooks/useModifyRecordFromCache';
|
|
import { useGenerateCreateManyRecordMutation } from '@/object-record/hooks/useGenerateCreateManyRecordMutation';
|
|
import { useGenerateCreateOneRecordMutation } from '@/object-record/hooks/useGenerateCreateOneRecordMutation';
|
|
import { useGenerateDeleteManyRecordMutation } from '@/object-record/hooks/useGenerateDeleteManyRecordMutation';
|
|
import { useGenerateExecuteQuickActionOnOneRecordMutation } from '@/object-record/hooks/useGenerateExecuteQuickActionOnOneRecordMutation';
|
|
import { useGenerateFindDuplicateRecordsQuery } from '@/object-record/hooks/useGenerateFindDuplicateRecordsQuery';
|
|
import { useGenerateFindManyRecordsQuery } from '@/object-record/hooks/useGenerateFindManyRecordsQuery';
|
|
import { useGenerateFindOneRecordQuery } from '@/object-record/hooks/useGenerateFindOneRecordQuery';
|
|
import { useGenerateUpdateOneRecordMutation } from '@/object-record/hooks/useGenerateUpdateOneRecordMutation';
|
|
import { generateDeleteOneRecordMutation } from '@/object-record/utils/generateDeleteOneRecordMutation';
|
|
import { isDefined } from '~/utils/isDefined';
|
|
|
|
import { ObjectMetadataItemIdentifier } from '../types/ObjectMetadataItemIdentifier';
|
|
|
|
export const EMPTY_QUERY = gql`
|
|
query EmptyQuery {
|
|
empty
|
|
}
|
|
`;
|
|
|
|
export const EMPTY_MUTATION = gql`
|
|
mutation EmptyMutation {
|
|
empty
|
|
}
|
|
`;
|
|
|
|
export const useObjectMetadataItem = (
|
|
{ objectNameSingular }: ObjectMetadataItemIdentifier,
|
|
depth?: number,
|
|
) => {
|
|
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,
|
|
);
|
|
}
|
|
|
|
const mapToObjectRecordIdentifier = useMapToObjectRecordIdentifier({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const getObjectOrderByField = useGetObjectOrderByField({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const getRecordFromCache = useGetRecordFromCache({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const modifyRecordFromCache = useModifyRecordFromCache({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const generateFindManyRecordsQuery = useGenerateFindManyRecordsQuery();
|
|
const findManyRecordsQuery = generateFindManyRecordsQuery({
|
|
objectMetadataItem,
|
|
depth,
|
|
});
|
|
|
|
const generateFindDuplicateRecordsQuery =
|
|
useGenerateFindDuplicateRecordsQuery();
|
|
const findDuplicateRecordsQuery = generateFindDuplicateRecordsQuery({
|
|
objectMetadataItem,
|
|
depth,
|
|
});
|
|
|
|
const generateFindOneRecordQuery = useGenerateFindOneRecordQuery();
|
|
const findOneRecordQuery = generateFindOneRecordQuery({
|
|
objectMetadataItem,
|
|
depth,
|
|
});
|
|
|
|
const createOneRecordMutation = useGenerateCreateOneRecordMutation({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const createManyRecordsMutation = useGenerateCreateManyRecordMutation({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const updateOneRecordMutation = useGenerateUpdateOneRecordMutation({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const deleteOneRecordMutation = generateDeleteOneRecordMutation({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const deleteManyRecordsMutation = useGenerateDeleteManyRecordMutation({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const executeQuickActionOnOneRecordMutation =
|
|
useGenerateExecuteQuickActionOnOneRecordMutation({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
const labelIdentifierFieldMetadata =
|
|
getLabelIdentifierFieldMetadataItem(objectMetadataItem);
|
|
|
|
const basePathToShowPage = getBasePathToShowPage({
|
|
objectMetadataItem,
|
|
});
|
|
|
|
return {
|
|
labelIdentifierFieldMetadata,
|
|
basePathToShowPage,
|
|
objectMetadataItem,
|
|
getRecordFromCache,
|
|
modifyRecordFromCache,
|
|
findManyRecordsQuery,
|
|
findDuplicateRecordsQuery,
|
|
findOneRecordQuery,
|
|
createOneRecordMutation,
|
|
updateOneRecordMutation,
|
|
deleteOneRecordMutation,
|
|
executeQuickActionOnOneRecordMutation,
|
|
createManyRecordsMutation,
|
|
deleteManyRecordsMutation,
|
|
mapToObjectRecordIdentifier,
|
|
getObjectOrderByField,
|
|
};
|
|
};
|