Passer au contenu principal
Une vue est une configuration enregistrée pour la façon dont les enregistrements d’un objet sont affichés : quels champs apparaissent, leur ordre, s’ils sont visibles, ainsi que les filtres ou groupes appliqués. Utilisez defineView() pour livrer des vues préconfigurées avec votre application — généralement une vue d’index par défaut pour chaque objet personnalisé que vous créez.
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,
    },
  ],
});

Points clés

  • objectUniversalIdentifier spécifie à quel objet cette vue s’applique. Il peut s’agir d’un objet personnalisé que vous avez défini ou d’un objet Twenty standard.
  • key détermine le type de vue — ViewKey.INDEX est la vue de liste principale pour l’objet.
  • fields contrôle les colonnes affichées et leur ordre. Chaque champ référence un fieldMetadataUniversalIdentifier.
  • Vous pouvez également définir filters, filterGroups, groups et fieldGroups pour des configurations plus avancées.
  • position contrôle l’ordre lorsqu’il existe plusieurs vues pour le même objet.

Filtres

Une vue peut être livrée avec des filtres préappliqués. Chaque filtre possède trois coordonnées : le champ faisant l’objet du filtrage, l’opérateur (comment comparer) et la valeur (par rapport à quoi comparer). Les trois doivent être alignées : l’utilisation d’un opérateur qui ne s’applique pas à un type de champ sera rejetée au moment de la synchronisation.
import { ViewFilterOperand } from 'twenty-shared/types';

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

Opérateurs pris en charge par type de champ

Type de champOpérandes pris en charge
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
Les types de champs avec des noms similaires peuvent utiliser des opérandes complètement différents — SELECT et MULTI_SELECT étant un cas courant.

Forme de valeur par opérande

Le champ value est toujours une valeur sérialisable en JSON, mais sa forme attendue dépend de l’opérande :
Famille d’opérandesForme de la valeurExemple
IS, IS_NOT sur SELECTtableau de clés d’option (chaînes)['ACTIVE', 'PENDING']
CONTAINS, DOES_NOT_CONTAIN sur MULTI_SELECTtableau de clés d’option (chaînes)['TAG_A']
IS, IS_NOT sur RELATIONtableau d’ID d’enregistrement (UUID)['c5a1...']
CONTAINS, DOES_NOT_CONTAIN sur les champs de type textechaîne'acme'
IS, IS_NOT sur NUMBERchaîne (la valeur)'5'
IS sur RATING / UUIDchaîne (la valeur)'5'
GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUALchaîne (la borne)'10'
IS, IS_BEFORE, IS_AFTER sur DATE / DATE_TIMEchaîne ISO 8601'2025-01-01T00:00:00Z'
IS_EMPTY, IS_NOT_EMPTYchaîne vide''
IS sur BOOLEAN'true' ou 'false''true'

Comment les vues apparaissent dans l’interface utilisateur

Une vue seule n’est pas accessible à partir de la barre latérale. Pour la faire apparaître là, associez-la à un élément de menu de navigation de type VIEW qui pointe vers le universalIdentifier de la vue. C’est le modèle canonique : chaque objet personnalisé livre généralement une vue par défaut + une entrée de barre latérale qui l’ouvre.