Обзор
Макет страницы управляет тем, как устроена страница деталей записи: какие вкладки отображаются и какие виджеты они содержат. ИспользуйтеdefinePageLayout() для объявления макета для объекта, которым вы владеете, definePageLayoutTab() для добавления одной вкладки к уже существующему макету (вашему или стандартному Twenty one) или definePageLayoutWidget() для добавления одного виджета к уже существующей вкладке.
definePageLayout
Используйте это, когда вы управляете всей страницей деталей — обычно для пользовательского объекта, который вы определили сами.src/page-layouts/example-record-page-layout.ts
Основные моменты
type— одно из значений'RECORD_INDEX','RECORD_PAGE','DASHBOARD','STANDALONE_PAGE'или'RECORD_FORM'. Используйте'RECORD_PAGE'для настройки детального представления конкретного объекта.'RECORD_FORM'описывает форму создания объекта и содержит виджетыFORM_FIELD, каждый из которых отображает одно поле. Twenty предоставляет один макет'RECORD_FORM'на объект с одним виджетом на каждое доступное для создания поле, поэтому вам редко потребуется создавать такой макет; пока он не отображает формы записей.objectUniversalIdentifierуказывает, к какому объекту применяется этот макет.- Каждая
tabопределяет раздел страницы сtitle,positionиlayoutMode: используйтеVERTICAL_LISTдля страниц записей и автономных страниц, аGRID— для панелей мониторинга. Во вкладкеVERTICAL_LISTвиджеты располагаются вертикально. Встроенные виджеты, которые управляют собственной прокруткой, например временные шкалы, файлы, заметки, задачи, рабочие процессы и беседы, по умолчанию занимают одну область просмотра; поля, фронтенд-компоненты, графики и другие виджеты с подгонкой по содержимому отображаются с высотой, соответствующей их содержимому или заданным настройкам. Во вкладкеGRIDвиджеты всегда размещаются в виде карточек в 12-колоночной сетке. - Виджеты на вкладке
VERTICAL_LISTнаследуют режим макета вкладки, а их порядок задается массивомwidgets. Не задавайтеposition; установите необязательноеheightBehaviorверхнего уровня в'TAB_VIEWPORT', если виджет должен занимать одну полную область просмотра вкладки и управлять собственной прокруткой, или в'FIT_CONTENT', чтобы переопределить встроенное значение по умолчанию для полной высоты. Предшествующие виджеты не уменьшают эту высоту. На вкладку допускается только один активный виджетTAB_VIEWPORT, и он должен располагаться после виджетов с подгонкой по содержимому. - Виджеты
GRIDпродолжают использоватьposition: { layoutMode: PageLayoutTabLayoutMode.GRID, row, column, rowSpan, columnSpan }.heightBehaviorверхнего уровня допустим только для вкладокVERTICAL_LIST; его использование сGRIDилиCANVASявляется ошибкой валидации. - Существующие вкладки Canvas и явные позиции виджетов по-прежнему поддерживаются. SDK отображает предупреждения об устаревании с рекомендуемыми заменами.
- Явно задайте
layoutMode. Если его не указывать, вы получитеVERTICAL_LISTнаSTANDALONE_PAGEиGRIDв остальных случаях, что редко бывает нужно на странице записи. - Каждый
widgetвнутри вкладки может отображать front component, список связей или другие встроенные типы виджетов. - Виджет
FRONT_COMPONENTможет задать дляheaderCommandMenuItemUniversalIdentifiersупорядоченный массив универсальных идентификаторов пунктов меню команд из того же приложения. Эти действия отображаются как кнопки со значками в заголовке карточки виджета и сохраняют свои проверки доступности и разрешений на уровне команд. Идентификаторы должны быть уникальными и должны разрешаться при установке приложения. positionу вкладок управляет их порядком. Используйте большие значения (например, 50), чтобы разместить пользовательские вкладки после встроенных.twenty app pullзаписывает макеты страниц обратно вместе с их вкладками и виджетами в строке. О виджете, который экспорт пока не может включить, например о виджете, отображающем собственный front component вашего приложения, или виджете устаревшего типаVIEW, сообщает pull вместо его записи; см. что pull не записывает.
Виджеты полей
ВиджетFIELD отображает одно поле текущей записи. Для полей связи он также может встраивать представление записей, связанных с текущей записью.
Чтобы встроить представление, не ограниченное текущей записью, используйте виджет таблицы записей.
fieldMetadataIdпринимает универсальный идентификатор поля в объекте макета.fieldDisplayModeможет иметь одно из следующих значений:'FIELD','CARD','EDITOR','VIEW'или'TABLE'.TABLEвстраивает представление, отображающее записи поля связи «один‑ко‑многим».isUIEditableприменяется к полям связи в режиме отображенияTABLE. По умолчанию задано значениеtrue; установите значениеfalse, чтобы запретить редактирование записей из встроенной таблицы или канбана.nestedRelationFieldMetadataIdявляется необязательным и принимает универсальный идентификатор поля связи «один‑ко‑многим» на целевом объекте связи, чтобы перечислять записи на два перехода связи дальше (например, страница Company, перечисляющая сделки людей этой компании, или страница Person, перечисляющая сделки компании этого человека). Первый переход может быть полем связи «один‑ко‑многим» или «многие‑к‑одному», второй обязан быть «один‑ко‑многим» (соединительные связи не поддерживаются), и это требуетfieldDisplayMode: 'TABLE'— комбинирование его с любым другим режимом отображения является ошибкой валидации, поскольку вложенный виджет всегда отображается как встраиваемое представление.
Виджеты таблицы записей
ВиджетRECORD_TABLE встраивает сохраненное представление на панель мониторинга, страницу записи или отдельную страницу. Сохраненное представление определяет записи, поля, фильтры, сортировки и макет, отображаемые в виджете.
viewUniversalIdentifierопределяет представление для отображения.recordLimitявляется необязательным и ограничивает количество записей, отображаемых виджетом.isUIEditableприменяется к представлениям таблицы и канбана. Он позволяет редактировать ячейки таблицы или редактировать, перемещать и создавать карточки канбана. По умолчанию задано значениеtrueдля макетовRECORD_PAGEиfalseдля других макетов.isUIEditableуправляет только действиями интерфейса. Разрешения для записей по-прежнему применяются, а настройки представления можно редактировать только в редакторе макета страницы.
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, когда вы управляете всем макетом. -
twenty app pullзаписывает добавленную вами вкладку в макет страницы, который вам не принадлежит, обратно в виде файлаdefinePageLayoutTab()с её виджетами в строке и с теми же ограничениями, что и для виджетовdefinePageLayout().
definePageLayoutWidget
Используйте это, когда хотите только добавить виджет на уже существующую вкладку — например, фронтенд-компонент на вкладке Home стандартной страницы Company или диаграмму на вкладке Home страницы записи вашего собственного объекта.src/page-layout-widgets/example-home-widget.ts
Основные моменты
-
pageLayoutTabUniversalIdentifierявляется обязательным и должен указывать на вкладку, которая уже существует на момент установки: стандартную вкладку Twenty (STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.\<object>RecordPage.tabs.\<tab>.universalIdentifier), вкладку одного из ваших собственных макетов или вкладку страницы записи, которую Twenty создаёт для одного из ваших объектов. Созданные вкладки имеют детерминированные идентификаторы, поэтому вы можете вычислить их: -
positionявляется обязательным, поскольку вкладка не является частью вашего манифеста и её режим макета невозможно определить автоматически. Выберите режим макета, соответствующий вкладке: вкладки страниц записей представляют собой вертикальные списки, поэтому используйте{ layoutMode: PageLayoutTabLayoutMode.VERTICAL_LIST, index }с индексом выше встроенных виджетов (виджет Fields находится на позиции 0). -
Для вертикального списка задайте
position.heightBehaviorкакPageLayoutWidgetVerticalListHeightBehavior.TAB_VIEWPORT, чтобы заполнить область просмотра одной вкладки, или какPageLayoutWidgetVerticalListHeightBehavior.FIT_CONTENT, чтобы использовать содержимое виджета или настроенную высоту. Импортируйте это перечисление изtwenty-sdk/define, как в примере выше. Если значение не указано, виджет сохраняет встроенное значение по умолчанию. Только один активный виджет на вкладку может заполнять область просмотра, и его индекс должен располагать его после всех виджетов с высотой по содержимому.heightBehaviorне поддерживается в позицияхGRIDилиCANVAS. -
configurationработает точно так же, как виджет, определённый встроенно вdefinePageLayoutилиdefinePageLayoutTab: он ссылается на фронтенд-компоненты, представления, поля и т. д. -
Используйте это вместо
definePageLayoutTab, когда вкладка уже существует и вы хотите разместить на ней только один виджет. ИспользуйтеdefinePageLayoutTab, когда вам нужна собственная вкладка. -
twenty app pullзаписывает добавленный вами виджет во вкладку, которая вам не принадлежит, обратно в виде файлаdefinePageLayoutWidget()с теми же ограничениями, что и для виджетовdefinePageLayout().