메인 콘텐츠로 건너뛰기
보기는 객체 레코드가 어떻게 표시될지에 대한 저장된 구성입니다. 어떤 필드가 표시되는지, 그 순서, 표시 여부, 적용된 필터나 그룹 등을 정의합니다. 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
유사한 이름을 가진 필드 타입이라도 전혀 다른 피연산자를 사용할 수 있습니다. 대표적인 예로 SELECTMULTI_SELECT가 있습니다.

피연산자별 값 구조

value 필드는 항상 JSON으로 직렬화할 수 있는 값이지만, 기대되는 구조는 피연산자에 따라 달라집니다:
피연산자 그룹값 구조예시
SELECT에서의 IS, IS_NOT옵션 키(문자열) 배열['ACTIVE', 'PENDING']
MULTI_SELECT에서의 CONTAINS, DOES_NOT_CONTAIN옵션 키(문자열) 배열['TAG_A']
RELATION에서의 IS, IS_NOT레코드 ID(uuid) 배열['c5a1...']
텍스트 계열 필드에서의 CONTAINS, DOES_NOT_CONTAIN문자열'acme'
NUMBER에서의 IS, IS_NOT문자열(값)'5'
RATING / UUID에서의 IS문자열(값)'5'
GREATER_THAN_OR_EQUAL, LESS_THAN_OR_EQUAL문자열(경계값)'10'
DATE / DATE_TIME에서의 IS, IS_BEFORE, IS_AFTERISO 8601 문자열'2025-01-01T00:00:00Z'
IS_EMPTY, IS_NOT_EMPTY빈 문자열''
BOOLEAN에서의 IS'true' 또는 'false''true'

보기가 UI에 표시되는 방식

보기만으로는 사이드바에서 직접 접근할 수 없습니다. 사이드바에 표시하려면, 해당 보기의 universalIdentifier를 가리키는 VIEW 타입의 탐색 메뉴 항목과 연결해야 합니다. 이것이 표준적인 패턴입니다. 일반적으로 각 커스텀 객체는 기본 보기와, 그 보기를 여는 사이드바 항목을 함께 제공합니다.