Перейти к основному содержанию
Представление — это сохранённая конфигурация того, как отображаются записи объекта: какие поля появляются, их порядок, видимость, а также применённые фильтры и группы. Используйте defineView() для поставки предварительно настроенных представлений вместе с вашим приложением — обычно это представление списка по умолчанию для каждого создаваемого вами пользовательского объекта.
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,
    },
  ],
});

Основные моменты

  • objectUniversalIdentifier указывает, к какому объекту применяется это представление. Это может быть пользовательский объект, который вы определили, или стандартный объект Twenty.
  • key определяет тип представления — ViewKey.INDEX — это основное представление списка для объекта.
  • fields управляет тем, какие столбцы отображаются и в каком порядке. Каждое поле ссылается на fieldMetadataUniversalIdentifier.
  • Также вы можете определить filters, filterGroups, groups и fieldGroups для более продвинутых конфигураций.
  • position управляет порядком, когда для одного и того же объекта существует несколько представлений.

Фильтры

Представление может поставляться с заранее примененными фильтрами. У каждого фильтра есть три координаты: поле, по которому выполняется фильтрация, операнд (как сравнивать) и значение (с чем сравнивать). Все три должны совпадать — использование операнда, который не подходит для типа поля, будет отклонено во время синхронизации.
import { ViewFilterOperand } from 'twenty-shared/types';

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

Поддерживаемые операнды по типу поля

Тип поляПоддерживаемые операнды
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
Типы полей с похожими названиями могут использовать совершенно разные операнды — типичный пример: SELECT и MULTI_SELECT.

Форма значения для каждого операнда

Поле value всегда содержит значение, сериализуемое в JSON, но ожидаемая форма зависит от операнда:
Семейство операндовФорма значенияПример
IS, IS_NOT для SELECTмассив ключей опций (строки)['ACTIVE', 'PENDING']
CONTAINS, DOES_NOT_CONTAIN для MULTI_SELECTмассив ключей опций (строки)['TAG_A']
IS, IS_NOT для RELATIONмассив идентификаторов записей (uuid)['c5a1...']
CONTAINS, DOES_NOT_CONTAIN для текстовых полейстрока'acme'
IS, IS_NOT для NUMBERстрока (значение)'5'
IS для RATING / UUIDстрока (значение)'5'
GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUALстрока (граница)'10'
IS, IS_BEFORE, IS_AFTER для DATE / DATE_TIMEстрока в формате ISO 8601'2025-01-01T00:00:00Z'
IS_EMPTY, IS_NOT_EMPTYпустая строка''
IS для BOOLEAN'true' или 'false''true'

Как представления отображаются в интерфейсе

Само по себе представление недоступно из боковой панели. Чтобы оно появилось там, свяжите его с пунктом навигационного меню типа VIEW, который указывает на universalIdentifier представления. Это канонический шаблон: каждый пользовательский объект обычно поставляется с представлением по умолчанию и пунктом боковой панели, который его открывает.