Paul Rastoin bc0ec6b104 Maintain INDEX view system side effects on deactivated views (#23590)
# Introduction

Follow-up on
https://github.com/twentyhq/twenty/pull/23585#discussion_r3683701472.

Two INDEX view side-effect handlers bailed out when the view had
`isActive: false`. This drops those gates.

# Why

`isActive: false` on a view has exactly one writer: the delete path,
when `isCallerOverridingEntity` is true
(`from-delete-view-input-to-flat-view-or-throw.util.ts`,
`view.service.ts`). It is not in `FLAT_VIEW_EDITABLE_PROPERTIES`, so
nothing else sets it.

So the flag means "the workspace deleted an engine-owned view, and since
the engine owns the row we deactivate instead of hard-deleting". It is a
workspace override of a row we still own, not a signal the row is gone
(that is `deletedAt`). Which makes it precisely the state where the
engine must keep maintaining its own rows: the row still exists, still
belongs to the engine, and is expected to be consistent whenever the
override is lifted.

Skipping the side effect instead left the view permanently incomplete,
with no repair path.

The gates were inherited from the candidate-view scan removed in the
same commit as these handlers were introduced
(`compute-flat-view-fields-from-fields-widgets.util.ts`, #23081). There,
`!view.isActive` filtered which of many views were candidates.
Transplanted into handlers that resolve *the* one deterministic
engine-owned INDEX view identifier, the same predicate stops meaning "is
this a candidate" and starts meaning "silently skip the system side
effect".

# Changes

- `fieldIndexViewFieldOnCreate`: create the INDEX view field even when
the view is deactivated.
- `objectIndexViewLabelIdentifierOnUpdate`: reconcile the label
identifier view field even when the view is deactivated.

`deletedAt` gates are unchanged in both.

The `should noop when the object has no active INDEX view` spec case is
inverted accordingly.

# Follow-up

Both handlers also drop inactive view fields when computing positions,
while `FlatViewFieldValidatorService` builds its `otherFlatViewFields`
with no `isActive` filter. An inactive view field below all active ones
would make a handler emit a label identifier position the validator then
rejects. Unreachable today (view fields are only ever soft-deleted,
never deactivated), so left out of this PR.
2026-07-30 15:42:30 +00:00
2026-06-11 11:02:28 +02:00

Twenty logo

The #1 Open-Source CRM

Website · Documentation · Roadmap · Discord · Figma

Twenty banner


Why Twenty

Twenty gives technical teams the building blocks for a custom CRM that meets complex business needs and quickly adapts as the business evolves. Twenty is the CRM you build, ship, and version like the rest of your stack.

Learn more about why we built Twenty


Installation

Cloud

The fastest way to get started. Sign up at twenty.com and spin up a workspace in under a minute, with no infrastructure to manage and always up to date.

Build an app

Scaffold a new app with the Twenty CLI:

npx create-twenty-app my-app

Define objects, fields, and views as code:

import { defineObject, FieldType } from 'twenty-sdk/define';

export default defineObject({
  nameSingular: 'deal',
  namePlural: 'deals',
  labelSingular: 'Deal',
  labelPlural: 'Deals',
  fields: [
    { name: 'name', label: 'Name', type: FieldType.TEXT },
    { name: 'amount', label: 'Amount', type: FieldType.CURRENCY },
    { name: 'closeDate', label: 'Close Date', type: FieldType.DATE_TIME },
  ],
});

Then ship it to your workspace:

npx twenty app:publish --private

See the app development guide for objects, views, agents, and logic functions.

Self-hosting

Run Twenty on your own infrastructure with Docker Compose, or contribute locally via the local setup guide.



Everything you need

Twenty gives you the building blocks of a modern CRM (objects, views, workflows, and agents) and lets you extend them as code. Here's a tour of what's in the box.

Want to go deeper? Read the User Guide for product walkthroughs, or the Documentation for developer reference.

Create your apps

Learn more about apps in doc

Stay on top with version control

Learn more about version control in doc

All the tools you need to build anything

Learn more about primitives in doc

Customize your layouts

Learn more about layouts in doc

AI agents and chats

Learn more about AI in doc

Plus all the tools of a good CRM

Learn more about CRM features in doc


Stack

Thanks

Greptile      Sentry      Crowdin

Thanks to these amazing services that we use and recommend for code review (Greptile), catching bugs (Sentry) and translating (Crowdin).

Join the Community

Star the repo · Discord · Feature requests · Releases · X · LinkedIn · Crowdin · Contribute

S
Description
The open alternative to Salesforce, designed for AI.
Readme AGPL-3.0 1.4 GiB
Languages
TypeScript 79.6%
MDX 17.3%
JavaScript 2.7%
Python 0.2%
SCSS 0.1%