Skip to main content
Макет страницы управляет тем, как устроена страница деталей записи: какие вкладки отображаются и какие виджеты они содержат. Используйте definePageLayout() для объявления макета для объекта, которым вы владеете, или definePageLayoutTab() для добавления одной вкладки к макету, который уже существует (вашему или стандартному Twenty).

definePageLayout

Используйте это, когда вы управляете всей страницей деталей — обычно для пользовательского объекта, который вы определили сами.
src/page-layouts/example-record-page-layout.ts

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

  • type — одно из значений 'RECORD_INDEX', 'RECORD_PAGE', 'DASHBOARD' или 'STANDALONE_PAGE'. Используйте 'RECORD_PAGE' для настройки детального представления конкретного объекта.
  • objectUniversalIdentifier указывает, к какому объекту применяется этот макет.
  • Каждая tab определяет раздел страницы с title, position и layoutMode: VERTICAL_LIST для страниц записей и автономных страниц, GRID для панелей мониторинга и CANVAS для одного виджета, который должен заполнять область просмотра вкладки. Во вкладке VERTICAL_LIST виджеты располагаются вертикально. Встроенные виджеты, которые самостоятельно управляют прокруткой, такие как временные шкалы, файлы, заметки, задачи и рабочие процессы, заполняют одну область просмотра; поля, фронтальные компоненты, графики и другие виджеты с подгонкой по содержимому отображаются с высотой по содержимому или заданной высотой. Во вкладке GRID виджеты всегда размещаются в виде карточек в 12-колоночной сетке. Виджет CANVAS не имеет явно заданного положения; если вкладка холста содержит несколько виджетов, они отображаются на высоте своего содержимого, а не заполняют область просмотра.
  • Явно задайте layoutMode. Если его не указывать, вы получите VERTICAL_LIST на STANDALONE_PAGE и GRID в остальных случаях, что редко бывает нужно на странице записи.
  • Каждый widget внутри вкладки может отображать front component, список связей или другие встроенные типы виджетов.
  • Виджет FRONT_COMPONENT может задавать для headerCommandMenuItemUniversalIdentifiers упорядоченный массив универсальных идентификаторов элементов меню команд из того же приложения. Эти действия отображаются как кнопки со значками в заголовке карточки виджета и сохраняют доступность и проверки разрешений на уровне команд. Идентификаторы должны быть уникальными и разрешаться при установке приложения.
  • position у вкладок управляет их порядком. Используйте большие значения (например, 50), чтобы разместить пользовательские вкладки после встроенных.

Виджеты полей

Виджет FIELD отображает одно поле записи. Для полей связи он также может встраивать список связанных записей:
  • fieldMetadataId принимает универсальный идентификатор поля в объекте макета.
  • fieldDisplayMode может иметь одно из следующих значений: 'FIELD', 'CARD', 'EDITOR', 'VIEW' или 'TABLE'. TABLE встраивает представление, отображающее записи поля связи «один‑ко‑многим».
  • nestedRelationFieldMetadataId является необязательным и принимает универсальный идентификатор поля связи «один‑ко‑многим» на целевом объекте связи, чтобы перечислять записи на два перехода связи дальше (например, страница Company, перечисляющая сделки людей этой компании, или страница Person, перечисляющая сделки компании этого человека). Первый переход может быть полем связи «один‑ко‑многим» или «многие‑к‑одному», второй обязан быть «один‑ко‑многим» (соединительные связи не поддерживаются), и это требует fieldDisplayMode: 'TABLE' — комбинирование его с любым другим режимом отображения является ошибкой валидации, поскольку вложенный виджет всегда отображается как встраиваемое представление.

definePageLayoutTab

Используйте это, когда вы хотите только добавить вкладку к существующему макету — например, вкладку аналитики на стандартной странице Company или вкладку с AI-сводкой, прикреплённую к макету вашего собственного объекта.
src/page-layouts/example-extra-tab.ts

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

  • pageLayoutUniversalIdentifier является обязательным и должен указывать на макет страницы, который уже существует на момент установки — либо стандартный макет Twenty, либо определённый вашим собственным приложением. Кросс-приложенческие ссылки на макеты, которыми владеет другое установленное приложение, на данный момент не поддерживаются. Если родительский макет отсутствует, установка завершается с понятной ошибкой проверки.
  • Для стандартных макетов Twenty импортируйте идентификаторы из twenty-sdk/define:
    Каждый элемент макета также предоставляет свои tabs и их widgets, поэтому вы можете ссылаться на любой уровень:
    Также доступен короткий псевдоним STANDARD_PAGE_LAYOUT:
  • widgets ограничены только этой вкладкой — они ссылаются на front components, представления и т. п. точно так же, как виджеты, определённые непосредственно в definePageLayout.
  • position управляет порядком относительно существующих вкладок в целевом макете. Выберите значение, которое поместит вашу вкладку в нужное место относительно встроенных вкладок.
  • Используйте это вместо definePageLayout, когда вы хотите только добавить к существующему макету. Используйте definePageLayout, когда вы управляете всем макетом.