fix: fix record deletion optimistic effect (#3683)

* fix: fix record deletion optimistic effect

* fix: fix renamed method after rebase

* Re-add evict

---------

Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
Thaïs
2024-01-30 05:33:28 -03:00
committed by GitHub
parent e951fb70f8
commit 49f33bbe2e
6 changed files with 52 additions and 42 deletions

View File

@ -29,7 +29,7 @@ export const triggerCreateRecordsOptimisticEffect = ({
[objectMetadataItem.namePlural]: ( [objectMetadataItem.namePlural]: (
cachedConnection, cachedConnection,
{ {
INVALIDATE: _INVALIDATE, DELETE: _DELETE,
readField, readField,
storeFieldName: _storeFieldName, storeFieldName: _storeFieldName,
toReference, toReference,
@ -97,7 +97,7 @@ export const triggerCreateRecordsOptimisticEffect = ({
cachedEdges?.length === variables.first && cachedEdges?.length === variables.first &&
nextCachedEdges.length < variables.first nextCachedEdges.length < variables.first
) { ) {
return INVALIDATE; return DELETE;
} }
if (nextCachedEdges.length > variables.first) { if (nextCachedEdges.length > variables.first) {

View File

@ -21,7 +21,7 @@ export const triggerDeleteRecordsOptimisticEffect = ({
fields: { fields: {
[objectMetadataItem.namePlural]: ( [objectMetadataItem.namePlural]: (
cachedConnection, cachedConnection,
{ INVALIDATE, readField, storeFieldName }, { DELETE, readField, storeFieldName },
) => { ) => {
if ( if (
!isCachedObjectConnection( !isCachedObjectConnection(
@ -49,12 +49,14 @@ export const triggerDeleteRecordsOptimisticEffect = ({
return nodeId && !recordIds.includes(nodeId); return nodeId && !recordIds.includes(nodeId);
}) || []; }) || [];
if (nextCachedEdges.length === cachedEdges?.length)
return cachedConnection;
if ( if (
isDefined(variables?.first) && isDefined(variables?.first) &&
cachedEdges?.length === variables.first && cachedEdges?.length === variables.first
nextCachedEdges.length < variables.first
) { ) {
return INVALIDATE; return DELETE;
} }
return { ...cachedConnection, edges: nextCachedEdges }; return { ...cachedConnection, edges: nextCachedEdges };

View File

@ -28,7 +28,7 @@ export const triggerUpdateRecordOptimisticEffect = ({
fields: { fields: {
[objectMetadataItem.namePlural]: ( [objectMetadataItem.namePlural]: (
cachedConnection, cachedConnection,
{ INVALIDATE, readField, storeFieldName, toReference }, { DELETE, readField, storeFieldName, toReference },
) => { ) => {
if ( if (
!isCachedObjectConnection( !isCachedObjectConnection(
@ -93,7 +93,7 @@ export const triggerUpdateRecordOptimisticEffect = ({
cachedEdges?.length === variables.first && cachedEdges?.length === variables.first &&
nextCachedEdges.length < variables.first nextCachedEdges.length < variables.first
) { ) {
return INVALIDATE; return DELETE;
} }
// If next edges length exceeds the required limit, // If next edges length exceeds the required limit,

View File

@ -8,6 +8,7 @@ import { Company } from '@/companies/types/Company';
import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu'; import { useKeyboardShortcutMenu } from '@/keyboard-shortcut-menu/hooks/useKeyboardShortcutMenu';
import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular'; import { CoreObjectNameSingular } from '@/object-metadata/types/CoreObjectNameSingular';
import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords'; import { useFindManyRecords } from '@/object-record/hooks/useFindManyRecords';
import { makeOrFilterVariables } from '@/object-record/utils/makeOrFilterVariables';
import { Person } from '@/people/types/Person'; import { Person } from '@/people/types/Person';
import { IconNotes } from '@/ui/display/icon'; import { IconNotes } from '@/ui/display/icon';
import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem'; import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem';
@ -134,33 +135,35 @@ export const CommandMenu = () => {
const { records: people } = useFindManyRecords<Person>({ const { records: people } = useFindManyRecords<Person>({
skip: !isCommandMenuOpened, skip: !isCommandMenuOpened,
objectNameSingular: CoreObjectNameSingular.Person, objectNameSingular: CoreObjectNameSingular.Person,
filter: { filter: search
or: [ ? makeOrFilterVariables([
{ name: { firstName: { ilike: `%${search}%` } } }, { name: { firstName: { ilike: `%${search}%` } } },
{ name: { firstName: { ilike: `%${search}%` } } }, { name: { firstName: { ilike: `%${search}%` } } },
], ])
}, : undefined,
limit: 3, limit: 3,
}); });
const { records: companies } = useFindManyRecords<Company>({ const { records: companies } = useFindManyRecords<Company>({
skip: !isCommandMenuOpened, skip: !isCommandMenuOpened,
objectNameSingular: CoreObjectNameSingular.Company, objectNameSingular: CoreObjectNameSingular.Company,
filter: { filter: search
name: { ilike: `%${search}%` }, ? {
}, name: { ilike: `%${search}%` },
}
: undefined,
limit: 3, limit: 3,
}); });
const { records: activities } = useFindManyRecords<Activity>({ const { records: activities } = useFindManyRecords<Activity>({
skip: !isCommandMenuOpened, skip: !isCommandMenuOpened,
objectNameSingular: CoreObjectNameSingular.Activity, objectNameSingular: CoreObjectNameSingular.Activity,
filter: { filter: search
or: [ ? makeOrFilterVariables([
{ title: { ilike: `%${search}%` } }, { title: { ilike: `%${search}%` } },
{ body: { ilike: `%${search}%` } }, { body: { ilike: `%${search}%` } },
], ])
}, : undefined,
limit: 3, limit: 3,
}); });

View File

@ -1,5 +1,3 @@
import { isNonEmptyString } from '@sniptt/guards';
import { import {
CurrencyFilter, CurrencyFilter,
DateFilter, DateFilter,
@ -13,6 +11,7 @@ import {
import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables'; import { makeAndFilterVariables } from '@/object-record/utils/makeAndFilterVariables';
import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand';
import { Field } from '~/generated/graphql'; import { Field } from '~/generated/graphql';
import { isDefined } from '~/utils/isDefined';
import { Filter } from '../../object-filter-dropdown/types/Filter'; import { Filter } from '../../object-filter-dropdown/types/Filter';
@ -39,6 +38,10 @@ export const turnObjectDropdownFilterIntoQueryFilter = (
); );
} }
if (!isDefined(rawUIFilter.value) || rawUIFilter.value === '') {
return undefined;
}
switch (rawUIFilter.definition.type) { switch (rawUIFilter.definition.type) {
case 'EMAIL': case 'EMAIL':
case 'PHONE': case 'PHONE':
@ -111,10 +114,6 @@ export const turnObjectDropdownFilterIntoQueryFilter = (
} }
break; break;
case 'RELATION': { case 'RELATION': {
if (!isNonEmptyString(rawUIFilter.value)) {
break;
}
try { try {
JSON.parse(rawUIFilter.value); JSON.parse(rawUIFilter.value);
} catch (e) { } catch (e) {

View File

@ -1,8 +1,7 @@
import { isNonEmptyString } from '@sniptt/guards';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem'; import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem';
import { ObjectRecordQueryFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter'; import { ObjectRecordQueryFilter } from '@/object-record/record-filter/types/ObjectRecordQueryFilter';
import { makeOrFilterVariables } from '@/object-record/utils/makeOrFilterVariables';
import { FieldMetadataType } from '~/generated/graphql'; import { FieldMetadataType } from '~/generated/graphql';
import { isDefined } from '~/utils/isDefined'; import { isDefined } from '~/utils/isDefined';
@ -17,7 +16,7 @@ export const useSearchFilterPerMetadataItem = ({
Object.fromEntries<ObjectRecordQueryFilter>( Object.fromEntries<ObjectRecordQueryFilter>(
objectMetadataItems objectMetadataItems
.map((objectMetadataItem) => { .map((objectMetadataItem) => {
if (!isNonEmptyString(searchFilterValue)) return null; if (searchFilterValue === '') return null;
const labelIdentifierFieldMetadataItem = const labelIdentifierFieldMetadataItem =
getLabelIdentifierFieldMetadataItem(objectMetadataItem); getLabelIdentifierFieldMetadataItem(objectMetadataItem);
@ -27,8 +26,8 @@ export const useSearchFilterPerMetadataItem = ({
if (labelIdentifierFieldMetadataItem) { if (labelIdentifierFieldMetadataItem) {
switch (labelIdentifierFieldMetadataItem.type) { switch (labelIdentifierFieldMetadataItem.type) {
case FieldMetadataType.FullName: { case FieldMetadataType.FullName: {
searchFilter = { if (searchFilterValue) {
or: [ const fullNameFilter = makeOrFilterVariables([
{ {
[labelIdentifierFieldMetadataItem.name]: { [labelIdentifierFieldMetadataItem.name]: {
firstName: { firstName: {
@ -43,16 +42,23 @@ export const useSearchFilterPerMetadataItem = ({
}, },
}, },
}, },
], ]);
};
if (fullNameFilter) {
searchFilter = fullNameFilter;
}
}
break; break;
} }
default: default: {
searchFilter = { if (searchFilterValue) {
[labelIdentifierFieldMetadataItem.name]: { searchFilter = {
ilike: `%${searchFilterValue}%`, [labelIdentifierFieldMetadataItem.name]: {
}, ilike: `%${searchFilterValue}%`,
}; },
};
}
}
} }
} }