Обзор
Пользовательские объекты — это новые типы записей, которые ваше приложение добавляет в рабочее пространство — открытка, счёт-фактура, подписка, что‑то специфичное для вашей предметной области. Каждый объект объявляет свою схему (поля, связи, значения по умолчанию) и стабильный универсальный идентификатор, который сохраняется между синхронизациями и развёртываниями.src/objects/post-card.object.ts
Основные моменты
universalIdentifierдолжен быть уникальным и стабильным между развёртываниями.- Каждому полю требуются
name,type,labelи собственный стабильныйuniversalIdentifier. - Массив
fieldsнеобязателен — вы можете определять объекты без пользовательских полей. openRecordInопределяет, где открываются записи этого объекта при щелчке:ObjectOpenRecordIn.USER_CHOICE(по умолчанию, в соответствии с индивидуальными настройками каждого участника рабочего пространства в Settings → Experience),ObjectOpenRecordIn.SIDE_PANELилиObjectOpenRecordIn.RECORD_PAGE. Закрепите его наRECORD_PAGEдля записей, которым для полноценного использования нужна целая страница (как у рабочих процессов и дашбордов), или наSIDE_PANELдля записей, которые уместны только в виде быстрой боковой панели (как события календаря).disabledObjectPermissionActionsперечисляет разрешения объекта, которые нельзя предоставить для объекта: любое из'canReadObjectRecords','canUpdateObjectRecords','canSoftDeleteObjectRecords'и'canDestroyObjectRecords'— те же флаги, которые роль задает для каждого объекта. Пользователи, API-ключи и агенты никогда не получают эти действия для объекта, независимо от того, что позволяет их роль, и сохранение разрешения объекта, предоставляющего одно из них, завершается ошибкой. Их сохраняют собственные логические функции вашего приложения. Например,['canUpdateObjectRecords', 'canSoftDeleteObjectRecords', 'canDestroyObjectRecords']делает объект доступным для записи только вашему приложению, для записей, подобных конфигурационным, которые определяют поведение.colorзадаёт цвет акцента объекта в пользовательском интерфейсе. Не указывайте его, и Twenty выберет его для объекта.imageIdentifierFieldMetadataUniversalIdentifierуказывает поле, значение которого отображается в качестве аватара записи. Не указывайте его, чтобы Twenty выбрала значение по умолчанию.isLabelSyncedWithNameдля объекта или поля синхронизирует имя API с меткой при редактировании метки в настройках. По умолчанию используется значениеfalse, поэтому переименование метки не изменяет имя.isSearchable: trueдля поля включает его значения в полнотекстовый поиск объекта (глобальный поиск и меню команд). Для этого сам объект должен поддерживать поиск, а тип поля должен быть совместим с текстом. Отсутствующее значение означает, что поиск недоступен, за исключением поля идентификатора метки объекта, для которого поиск всегда доступен и которое нельзя исключить. Каждая синхронизация применяет объявленное состояние, поэтому поле, для которого в настройках включили поиск, вернётся к прежнему состоянию при следующей синхронизации приложения, если это не объявлено в манифесте.isAuditLogged: falseдля поля исключает его изменения из хронологии записи. По умолчанию используетсяtrue, кроме поляPOSITION, изменения которого отображаются в хронологии пустыми и никогда не регистрируются. Установите это для полей, которые ваше приложение переписывает по расписанию, например для метки времени последнего контакта или сводной связи, чтобы каждая синхронизация не добавляла строку активности в каждую затронутую запись. Обновление, вся разница которого состоит из не журналируемых для аудита полей, вообще не создаёт активности в хронологии. Как иisSearchable, каждая синхронизация обеспечивает объявленное состояние.disabledFieldPermissionActionsв поле перечисляет разрешения поля, которые нельзя предоставить для него:'canReadFieldValue','canUpdateFieldValue'или оба — те же флаги, которые роль задаёт для каждого поля. Пользователи, ключи API, агенты и другие приложения никогда не получают эти действия для поля независимо от разрешений, предоставленных их ролью, а сохранение разрешения поля, предоставляющего одно из них, завершается ошибкой. Собственные логические функции вашего приложения сохраняют их. Например,['canUpdateFieldValue']сохраняет значение, которое ваше приложение вычисляет или синхронизирует, например статус или оценку, доступным только для чтения для всех остальных. Это также работает с полями, которые вы добавляете в объекты, не принадлежащие вам, с помощьюdefineField().- Встроенным полям, определённым здесь, не нужен
objectUniversalIdentifier— он наследуется от родительского объекта. ИспользуйтеdefineField(), чтобы добавить поля к объектам, которые вам не принадлежат. - Вы можете сгенерировать заготовки новых объектов с помощью
twenty app add object, который проведёт вас через настройку названий, полей и связей. См. Architecture → Scaffolding entities.
Базовые поля добавляются автоматически. Когда вы определяете пользовательский объект,
Twenty создаёт для вас стандартные поля, такие как
id, name, createdAt, updatedAt,
createdBy, updatedBy и deletedAt. Вам не нужно объявлять
их в массиве fields — только ваши пользовательские поля. Вы можете переопределить
базовое поле, объявив поле с тем же именем, но это редко бывает хорошей
идеей.Типы полей
Полный набор значенийFieldType, экспортируемых из twenty-sdk/define:
Составные типы хранят несколько подполей (например,
FULL_NAME = имя + фамилия; CURRENCY = amountMicros + currencyCode). SELECT и MULTI_SELECT требуют массива options, как в примере выше.
Выберите параметры
ДляSELECT и MULTI_SELECT укажите непустой массив объектов options. У каждого варианта есть value, label и position. Его color необязателен; при отсутствии или значении null по умолчанию используется gray.
Если указано, значение color должно быть одним из следующих: red, ruby, crimson, tomato, orange, amber, yellow, lime, grass, green, jade, mint, turquoise, cyan, sky, blue, iris, violet, purple, plum, pink, bronze, gold, brown, gray.
И defineObject(), и defineField() возвращают ошибки валидации для неподдерживаемых цветов или записей параметров, являющихся null, примитивами или массивами.
Значения по умолчанию
Строковые значения по умолчанию должны быть заключены в одинарные кавычки внутри строки —defaultValue: "'Draft'", а не defaultValue: "Draft". Именно поэтому поле status выше использует `'${PostCardStatus.DRAFT}'`.
Незаключённые в кавычки строки зарезервированы для вычисляемых значений по умолчанию, которые рассчитываются при создании записи:
'uuid'— генерирует UUID (для полейUUID)'now'— текущая временная метка (для полейDATE_TIME)
{ source: "'MANUAL'" } в поле ACTOR) и к значениям SELECT/MULTI_SELECT. Строковый литерал по умолчанию, оставленный без кавычек, вызывает предупреждение при сборке приложения.
Допустимость значения NULL
isNullable определяет, допускает ли поле значение NULL. По умолчанию установлено значение true — опускайте этот параметр для необязательных полей. Установите isNullable: false, чтобы сделать поле обязательным на уровне базы данных.
Изменения isNullable применяются при каждой синхронизации, включая синхронизации, которые обновляют существующее поле, — таким образом, вы можете изменить допустимость значения NULL для поля, отредактировав манифест и повторно выполнив синхронизацию.
Для существующего обязательного поля требуется значение по умолчанию. При изменении поля на
isNullable: false необходимо также указать не равное NULL значение defaultValue. Значение по умолчанию заполняет все существующие строки с NULL перед применением ограничения NOT NULL; без него синхронизация завершится с ошибкой Default value cannot be null for non-nullable fields. Поля связей и поля TS_VECTOR
всегда допускают значение NULL, поэтому параметр isNullable на них не влияет.Что дальше
- Свяжите этот объект с другими — см. Relations для двунаправленного шаблона связей.
- Добавляйте поля к объектам из других приложений — см. Extending Objects о
defineField(). - Отображать этот объект в интерфейсе — см. пункты меню навигации, чтобы добавить пункт бокового меню; см. представления, чтобы добавить пользовательские настройки списков.