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:
@ -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) {
|
||||||
|
|||||||
@ -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 };
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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}%`,
|
||||||
};
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user