twentyhq/twenty · error · Error

Failed to create view filter group

Error message

Failed to create view filter group

What it means

Thrown in usePerformViewFilterGroupAPIPersist when the createViewFilterGroup mutation resolves but result.data is undefined. As with createView, this indicates the GraphQL response carried no data payload (errors swallowed or partial response).

Source

Thrown at packages/twenty-front/src/modules/views/hooks/internal/usePerformViewFilterGroupAPIPersist.ts:49

  } = usePerformViewEntityAPIPersistOperation('viewFilterGroup');

  const createViewFilterGroupRecord = useCallback(
    async (viewFilterGroup: ViewFilterGroup, view: Pick<GraphQLView, 'id'>) => {
      const result = await createViewFilterGroupMutation({
        variables: {
          input: {
            id: viewFilterGroup.id,
            viewId: view.id,
            parentViewFilterGroupId: viewFilterGroup.parentViewFilterGroupId,
            logicalOperator: viewFilterGroup.logicalOperator,
            positionInViewFilterGroup:
              viewFilterGroup.positionInViewFilterGroup,
          },
        },
      });

      if (!isDefined(result.data)) {
        throw new Error('Failed to create view filter group');
      }

      return { newRecord: result.data.createViewFilterGroup };
    },
    [createViewFilterGroupMutation],
  );

  const performViewFilterGroupAPICreate = useCallback(
    async (
      viewFilterGroupsToCreate: ViewFilterGroup[],
      view: Pick<GraphQLView, 'id'>,
    ): Promise<MetadataRequestResult<string[]>> => {
      const oldToNewId = new Map<string, string>();
      const newRecordIds: string[] = [];

      for (const viewFilterGroupToCreate of viewFilterGroupsToCreate) {
        const newParentViewFilterGroupId = isDefined(
          viewFilterGroupToCreate.parentViewFilterGroupId,

View on GitHub (pinned to 1f5dd2bbd2)

Solutions

  1. Check the createViewFilterGroup response in DevTools for the errors array.
  2. Validate that viewId is an existing view and parentViewFilterGroupId (if set) exists in the same batch.
  3. Confirm the logicalOperator is a valid enum value.

Example fix

// before: if (!isDefined(result.data)) { throw new Error('Failed to create view filter group'); }
// after:  if (!isDefined(result.data)) {
//           throw new Error(result.errors?.[0]?.message ?? 'Failed to create view filter group');
//         }
Defensive patterns

Strategy: try-catch

Validate before calling

const validateFilterGroupInput = (g: ViewFilterGroup, view: Pick<GraphQLView,'id'>): string[] => {
  const errs: string[] = [];
  if (!g.id) errs.push('missing id');
  if (!view.id) errs.push('missing viewId');
  if (!['AND','OR','and','or'].includes(g.logicalOperator ?? '')) errs.push('invalid logicalOperator');
  return errs;
};

Type guard

const isCreatableViewFilterGroup = (g: Partial<ViewFilterGroup>): g is ViewFilterGroup =>
  typeof g.id === 'string' && typeof g.logicalOperator === 'string';

Try / catch

try {
  await performViewFilterGroupAPICreate(groups, view);
} catch (e) {
  showError((e as Error).message); // 'Failed to create view filter group'
}

Prevention

When it happens

Trigger: Server-side validation failure (invalid logicalOperator, missing viewId, orphan parentViewFilterGroupId) returns errors and null data. Network partial response. Permission issue on view filter group creation.

Common situations: Filter group references a parentViewFilterGroupId that does not exist. logicalOperator value not in the allowed enum. Workspace member lacks create permission.

Related errors


AI-assisted analysis of twentyhq/twenty@1f5dd2bbd2 (2026-08-12). Data as JSON: /api/errors/1b4f9427d030c4a5. Report an issue: GitHub.