Saltar al contenido principal
Una vista es una configuración guardada de cómo se muestran los registros de un objeto: qué campos aparecen, su orden, si son visibles y qué filtros o grupos se aplican. Usa defineView() para incluir vistas preconfiguradas con tu aplicación — normalmente una vista de índice predeterminada para cada objeto personalizado que crees.
src/views/example-view.ts
import { defineView, ViewKey } from 'twenty-sdk/define';
import { EXAMPLE_OBJECT_UNIVERSAL_IDENTIFIER } from '../objects/example-object';
import { NAME_FIELD_UNIVERSAL_IDENTIFIER } from '../objects/example-object';

export default defineView({
  universalIdentifier: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
  name: 'All example items',
  objectUniversalIdentifier: EXAMPLE_OBJECT_UNIVERSAL_IDENTIFIER,
  icon: 'IconList',
  key: ViewKey.INDEX,
  position: 0,
  fields: [
    {
      universalIdentifier: 'f926bdb7-6af7-4683-9a09-adbca56c29f0',
      fieldMetadataUniversalIdentifier: NAME_FIELD_UNIVERSAL_IDENTIFIER,
      position: 0,
      isVisible: true,
      size: 200,
    },
  ],
});

Puntos clave

  • objectUniversalIdentifier especifica a qué objeto se aplica esta vista. Puede ser un objeto personalizado que hayas definido o un objeto estándar de Twenty.
  • key determina el tipo de vista — ViewKey.INDEX es la vista de lista principal para el objeto.
  • fields controla qué columnas aparecen y en qué orden. Cada campo referencia un fieldMetadataUniversalIdentifier.
  • También puedes definir filters, filterGroups, groups y fieldGroups para configuraciones avanzadas.
  • position controla el orden cuando existen múltiples vistas para el mismo objeto.

Filtros

Una vista puede incluir filtros preaplicados. Cada filtro tiene tres coordenadas: el campo que se está filtrando, el operando (cómo comparar) y el valor (contra qué comparar). Las tres deben alinearse: usar un operando que no aplique a un tipo de campo será rechazado en el momento de la sincronización.
import { ViewFilterOperand } from 'twenty-shared/types';

filters: [
  {
    universalIdentifier: '...',
    fieldMetadataUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
    operand: ViewFilterOperand.IS,
    value: ['ACTIVE'],
  },
],

Operandos admitidos por tipo de campo

Tipo de campoOperandos admitidos
TEXT, EMAILS, FULL_NAME, ADDRESS, LINKS, PHONES, RAW_JSON, FILES, ACTOR, ARRAYCONTAINS, DOES_NOT_CONTAIN, IS_EMPTY, IS_NOT_EMPTY
ACTOR.source, ACTOR.workspaceMemberIdIS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
SELECTIS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
MULTI_SELECTCONTAINS, DOES_NOT_CONTAIN, IS_EMPTY, IS_NOT_EMPTY
RELATIONIS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
NUMBERIS, IS_NOT, GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUAL, IS_EMPTY, IS_NOT_EMPTY
RATINGIS, GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUAL, IS_EMPTY, IS_NOT_EMPTY
CURRENCY, CURRENCY.amountMicrosGREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUAL, IS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
CURRENCY.currencyCodeIS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
DATE, DATE_TIMEIS, IS_RELATIVE, IS_IN_PAST, IS_IN_FUTURE, IS_TODAY, IS_BEFORE, IS_AFTER, IS_EMPTY, IS_NOT_EMPTY
BOOLEANIS
UUIDIS, IS_NOT, IS_EMPTY, IS_NOT_EMPTY
TS_VECTORVECTOR_SEARCH
Los tipos de campo con nombres similares pueden usar operandos completamente diferentes; SELECT y MULTI_SELECT son un caso común.

Forma del valor por operando

El campo value siempre es un valor serializable en JSON, pero su forma esperada depende del operando:
Familia de operandosForma del valorEjemplo
IS, IS_NOT en SELECTarray de claves de opciones (cadenas)['ACTIVE', 'PENDING']
CONTAINS, DOES_NOT_CONTAIN en MULTI_SELECTarray de claves de opciones (cadenas)['TAG_A']
IS, IS_NOT en RELATIONarray de IDs de registros (uuids)['c5a1...']
CONTAINS, DOES_NOT_CONTAIN en campos de tipo textocadena'acme'
IS, IS_NOT en NUMBERcadena (el valor)'5'
IS en RATING / UUIDcadena (el valor)'5'
GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUALcadena (el límite)'10'
IS, IS_BEFORE, IS_AFTER en DATE / DATE_TIMEcadena ISO 8601'2025-01-01T00:00:00Z'
IS_EMPTY, IS_NOT_EMPTYcadena vacía''
IS en BOOLEAN'true' o 'false''true'

Cómo aparecen las vistas en la interfaz de usuario

Una vista por sí sola no es accesible desde la barra lateral. Para que aparezca allí, vincúlala con un elemento del menú de navegación de tipo VIEW que apunte al universalIdentifier de la vista. Ese es el patrón canónico: cada objeto personalizado suele incluir una vista predeterminada + una entrada en la barra lateral que la abre.