{"record":{"id":"1b4f9427d030c4a5","repo":"twentyhq/twenty","slug":"failed-to-create-view-filter-group","errorCode":null,"errorMessage":"Failed to create view filter group","messagePattern":"Failed to create view filter group","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/twenty-front/src/modules/views/hooks/internal/usePerformViewFilterGroupAPIPersist.ts","lineNumber":49,"sourceCode":"  } = usePerformViewEntityAPIPersistOperation('viewFilterGroup');\n\n  const createViewFilterGroupRecord = useCallback(\n    async (viewFilterGroup: ViewFilterGroup, view: Pick<GraphQLView, 'id'>) => {\n      const result = await createViewFilterGroupMutation({\n        variables: {\n          input: {\n            id: viewFilterGroup.id,\n            viewId: view.id,\n            parentViewFilterGroupId: viewFilterGroup.parentViewFilterGroupId,\n            logicalOperator: viewFilterGroup.logicalOperator,\n            positionInViewFilterGroup:\n              viewFilterGroup.positionInViewFilterGroup,\n          },\n        },\n      });\n\n      if (!isDefined(result.data)) {\n        throw new Error('Failed to create view filter group');\n      }\n\n      return { newRecord: result.data.createViewFilterGroup };\n    },\n    [createViewFilterGroupMutation],\n  );\n\n  const performViewFilterGroupAPICreate = useCallback(\n    async (\n      viewFilterGroupsToCreate: ViewFilterGroup[],\n      view: Pick<GraphQLView, 'id'>,\n    ): Promise<MetadataRequestResult<string[]>> => {\n      const oldToNewId = new Map<string, string>();\n      const newRecordIds: string[] = [];\n\n      for (const viewFilterGroupToCreate of viewFilterGroupsToCreate) {\n        const newParentViewFilterGroupId = isDefined(\n          viewFilterGroupToCreate.parentViewFilterGroupId,","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/twentyhq/twenty/blob/1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6/packages/twenty-front/src/modules/views/hooks/internal/usePerformViewFilterGroupAPIPersist.ts#L31-L67","documentation":"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).","triggerScenarios":"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.","commonSituations":"Filter group references a parentViewFilterGroupId that does not exist. logicalOperator value not in the allowed enum. Workspace member lacks create permission.","solutions":["Check the createViewFilterGroup response in DevTools for the errors array.","Validate that viewId is an existing view and parentViewFilterGroupId (if set) exists in the same batch.","Confirm the logicalOperator is a valid enum value."],"exampleFix":"// before: if (!isDefined(result.data)) { throw new Error('Failed to create view filter group'); }\n// after:  if (!isDefined(result.data)) {\n//           throw new Error(result.errors?.[0]?.message ?? 'Failed to create view filter group');\n//         }","handlingStrategy":"try-catch","validationCode":"const validateFilterGroupInput = (g: ViewFilterGroup, view: Pick<GraphQLView,'id'>): string[] => {\n  const errs: string[] = [];\n  if (!g.id) errs.push('missing id');\n  if (!view.id) errs.push('missing viewId');\n  if (!['AND','OR','and','or'].includes(g.logicalOperator ?? '')) errs.push('invalid logicalOperator');\n  return errs;\n};","typeGuard":"const isCreatableViewFilterGroup = (g: Partial<ViewFilterGroup>): g is ViewFilterGroup =>\n  typeof g.id === 'string' && typeof g.logicalOperator === 'string';","tryCatchPattern":"try {\n  await performViewFilterGroupAPICreate(groups, view);\n} catch (e) {\n  showError((e as Error).message); // 'Failed to create view filter group'\n}","preventionTips":["Validate logicalOperator is an allowed enum before submission.","Ensure parentViewFilterGroupId (if set) exists in the same batch.","Confirm viewId points to an existing view."],"tags":["views","graphql","apollo","filters","metadata"],"backgroundTag":null,"analyzedSha":"1f5dd2bbd2a8da3419c8cfd52dd545c0024df1a6","analyzedAt":"2026-08-12T15:37:27.593Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}