diff --git a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx index 2f95c0873..11f3e5605 100644 --- a/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/object-filter-dropdown/components/ObjectFilterDropdownRecordSelect.tsx @@ -18,7 +18,8 @@ import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownM import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { RelationFilterValue } from '@/views/view-filter-value/types/RelationFilterValue'; -import { relationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/relationFilterValueSchema'; +import { jsonRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema'; +import { simpleRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/simpleRelationFilterValueSchema'; import { IconUserCircle } from 'twenty-ui'; import { isDefined } from '~/utils/isDefined'; @@ -63,10 +64,12 @@ export const ObjectFilterDropdownRecordSelect = ({ const [fieldId] = useState(v4()); - const { isCurrentWorkspaceMemberSelected } = relationFilterValueSchema + const { isCurrentWorkspaceMemberSelected } = jsonRelationFilterValueSchema .catch({ isCurrentWorkspaceMemberSelected: false, - selectedRecordIds: [], + selectedRecordIds: simpleRelationFilterValueSchema.parse( + selectedFilter?.value, + ), }) .parse(selectedFilter?.value); diff --git a/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts b/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts index 3b2223a46..12a548404 100644 --- a/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts +++ b/packages/twenty-front/src/modules/object-record/record-filter/utils/computeViewRecordGqlOperationFilter.ts @@ -35,7 +35,8 @@ import { ViewFilterGroup } from '@/views/types/ViewFilterGroup'; import { ViewFilterGroupLogicalOperator } from '@/views/types/ViewFilterGroupLogicalOperator'; import { resolveDateViewFilterValue } from '@/views/view-filter-value/utils/resolveDateViewFilterValue'; import { resolveSelectViewFilterValue } from '@/views/view-filter-value/utils/resolveSelectViewFilterValue'; -import { relationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/relationFilterValueSchema'; +import { jsonRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema'; +import { simpleRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/simpleRelationFilterValueSchema'; import { endOfDay, roundToNearestMinutes, startOfDay } from 'date-fns'; import { z } from 'zod'; @@ -306,7 +307,14 @@ const computeFilterRecordGqlOperationFilter = ( case 'RELATION': { if (!isEmptyOperand) { const { isCurrentWorkspaceMemberSelected, selectedRecordIds } = - relationFilterValueSchema.parse(filter.value); + jsonRelationFilterValueSchema + .catch({ + isCurrentWorkspaceMemberSelected: false, + selectedRecordIds: simpleRelationFilterValueSchema.parse( + filter.value, + ), + }) + .parse(filter.value); const recordIds = isCurrentWorkspaceMemberSelected ? [ diff --git a/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx b/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx index 6de55ad65..1af03e349 100644 --- a/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx +++ b/packages/twenty-front/src/modules/views/components/ViewBarFilterEffect.tsx @@ -12,7 +12,8 @@ import { onFilterSelectComponentState } from '@/object-record/object-filter-drop import { useGetCurrentView } from '@/views/hooks/useGetCurrentView'; import { useUpsertCombinedViewFilters } from '@/views/hooks/useUpsertCombinedViewFilters'; import { availableFilterDefinitionsComponentState } from '@/views/states/availableFilterDefinitionsComponentState'; -import { relationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/relationFilterValueSchema'; +import { jsonRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema'; +import { simpleRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/simpleRelationFilterValueSchema'; import { isDefined } from '~/utils/isDefined'; type ViewBarFilterEffectProps = { @@ -82,10 +83,12 @@ export const ViewBarFilterEffect = ({ filterDefinitionUsedInDropdown?.fieldMetadataId, ); - const { selectedRecordIds } = relationFilterValueSchema + const { selectedRecordIds } = jsonRelationFilterValueSchema .catch({ isCurrentWorkspaceMemberSelected: false, - selectedRecordIds: [], + selectedRecordIds: simpleRelationFilterValueSchema.parse( + viewFilterUsedInDropdown?.value, + ), }) .parse(viewFilterUsedInDropdown?.value); diff --git a/packages/twenty-front/src/modules/views/hooks/internal/useViewFromQueryParams.ts b/packages/twenty-front/src/modules/views/hooks/internal/useViewFromQueryParams.ts index 4169e4ba1..820648808 100644 --- a/packages/twenty-front/src/modules/views/hooks/internal/useViewFromQueryParams.ts +++ b/packages/twenty-front/src/modules/views/hooks/internal/useViewFromQueryParams.ts @@ -16,7 +16,7 @@ import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { generateFindManyRecordsQuery } from '@/object-record/utils/generateFindManyRecordsQuery'; import { ViewFilter } from '@/views/types/ViewFilter'; import { ViewFilterOperand } from '@/views/types/ViewFilterOperand'; -import { relationFilterValueSchemaObject } from '@/views/view-filter-value/validation-schemas/relationFilterValueSchema'; +import { relationFilterValueSchemaObject } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema'; import { isDefined } from '~/utils/isDefined'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; diff --git a/packages/twenty-front/src/modules/views/view-filter-value/types/RelationFilterValue.ts b/packages/twenty-front/src/modules/views/view-filter-value/types/RelationFilterValue.ts index 321fa8a93..165abd67b 100644 --- a/packages/twenty-front/src/modules/views/view-filter-value/types/RelationFilterValue.ts +++ b/packages/twenty-front/src/modules/views/view-filter-value/types/RelationFilterValue.ts @@ -1,4 +1,4 @@ -import { relationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/relationFilterValueSchema'; +import { jsonRelationFilterValueSchema } from '@/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema'; import { z } from 'zod'; -export type RelationFilterValue = z.infer; +export type RelationFilterValue = z.infer; diff --git a/packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/relationFilterValueSchema.ts b/packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema.ts similarity index 91% rename from packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/relationFilterValueSchema.ts rename to packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema.ts index afbe46718..b47023bc1 100644 --- a/packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/relationFilterValueSchema.ts +++ b/packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/jsonRelationFilterValueSchema.ts @@ -5,7 +5,7 @@ export const relationFilterValueSchemaObject = z.object({ selectedRecordIds: z.array(z.string()), }); -export const relationFilterValueSchema = z +export const jsonRelationFilterValueSchema = z .string() .transform((value, ctx) => { try { diff --git a/packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/simpleRelationFilterValueSchema.ts b/packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/simpleRelationFilterValueSchema.ts new file mode 100644 index 000000000..93a2ec867 --- /dev/null +++ b/packages/twenty-front/src/modules/views/view-filter-value/validation-schemas/simpleRelationFilterValueSchema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +export const simpleRelationFilterValueSchema = z + .preprocess((value) => { + try { + return typeof value === 'string' ? JSON.parse(value) : []; + } catch { + return []; + } + }, z.array(z.string().uuid())) + .catch([]);