Создание собственных страниц JS-модулей Собственные страницы JS-модулей позволяют открыть полноценный экран внутри CRM, добавить пункт меню и объединить страницы с target-виджетами. false W3sidGl0bGUiOiLQnNC+0LTRg9C70LgiLCJ1cmwiOiIvZGV2ZWxvcGVycy9tb2R1bGVzLyJ9LHsidGl0bGUiOiLQn9GD0LHQu9C40LrQsNGG0LjRjyDQvNC+0LTRg9C70Y8g0LIg0JzQsNGA0LrQtdGC0L/Qu9C10LnRgdC1IiwidXJsIjoiL2RldmVsb3BlcnMvbW9kdWxlcy9wdWJsaXNoaW5nLW1vZHVsZS1tYXJrZXRwbGFjZS8ifV0= Модули /developers/modules/ ["developers","Модули"] ["developers","Модули","Публикация модуля в Маркетплейсе"] developers

Создание собственных страниц JS-модулей

Собственные страницы JS-модулей позволяют открыть полноценный экран внутри CRM, добавить пункт меню и объединить страницы с target-виджетами.

Содержание

Помимо виджетов в target, JS-модуль может содержать собственные страницы внутри CRM. Такой сценарий подходит, когда модулю нужен отдельный экран со списком, карточкой, настройками или сложной формой.

Для собственных страниц используются конфигурация pages, endpoint запуска, внутренний адрес CRM и общие правила компоновки интерфейса. Технические детали запуска страниц опираются на пакет @retailcrm/embed-ui-v1-endpoint, а рекомендации по интерфейсу — на v1-components и руководство по компоновке страниц.

Страницы в конфигурации модуля

Чтобы модуль содержал страницы, в его конфигурации нужно указать поле pages.

Для pages поддерживаются два варианта:

  • короткая запись строкой: код страницы;
  • объект с настройками меню и справочной информацией.

Пример:

{
  "pages": [
    {
      "code": "returns",
      "menu": "activity_main_menu",
      "menuItemOrdering": 15,
      "menuItemTitle": {
        "ru": "Возвраты",
        "en": "Returns",
        "es": "Devoluciones"
      },
      "pageHelpLink": null
    }
  ]
}

В объектной форме для страницы могут быть заданы:

  • code — символьный код страницы внутри модуля;
  • menu — код корневого меню CRM, в которое должна быть добавлена страница;
  • parentMenuItemCode — код родительского пункта меню, если страницу нужно вложить в существующий или модульный пункт;
  • menuItemOrdering — числовой порядок отображения пункта меню;
  • menuItemTitle — локализованный заголовок пункта меню;
  • pageHelpLink — локализованная ссылка на справку или документацию страницы.

Примечание

Для значений menu и parentMenuItemCode используйте коды из справочника меню и пунктов меню системы. Это позволит разместить страницу JS-модуля в доступном разделе интерфейса и не использовать несуществующие коды меню.

Если для страницы указаны поля, связанные с меню, CRM добавляет ссылку на эту страницу в навигацию как новый пункт или подпункт того раздела, который был задан в конфигурации.

Какой endpoint использовать

Для модулей со страницами следует использовать точку входа из @retailcrm/embed-ui-v1-endpoint/remote.

Практически это означает, что сценарии со страницами собираются через:

  • definePageRunner(...)
  • или defineRunner(...), если в модуле одновременно есть и страницы, и виджеты

Для сценариев со страницами используется режим v1-endpoint.

В дескрипторе frontend-части для такого сценария нужно указать runner: "worker". Это требуется для запуска endpoint, который обслуживает страницы и, при необходимости, target-виджеты через единую точку входа.

При регистрации модуля значение worker необходимо передать в поле integrationModule[integrations][embedJs][runner]. Для модулей со страницами legacy-режим iframe не используется.

URL страницы

По текущему поведению CRM страница опубликованного модуля открывается по адресу:

/modules/<moduleCode>/<pageCode>

То есть в адресе страницы используется связка moduleCode + pageCode, где moduleCode — это code интеграционного модуля.

Единая точка входа для виджетов и страниц

Одна интеграция может одновременно иметь target-виджеты и отдельные страницы. Такой подход используется, например, в promoModule из библиотеки примеров.

Такой endpoint должен публиковаться как JS-entrypoint и запускаться с runner: "worker".

Пример:

import {
  definePageRunner,
  defineRunner,
  defineWidgetRunner,
  runEndpoint,
} from '@retailcrm/embed-ui-v1-endpoint/remote'

import PromoPicker from './PromoPicker.vue'
import SettingsPage from './SettingsPage.vue'

runEndpoint(defineRunner({
  widgets: [{
    'order/card:common.after': defineWidgetRunner(PromoPicker),
  }],
  pages: [{
    settings: definePageRunner(SettingsPage),
  }],
}))

Компоновка страниц

Для компоновки интерфейсов страниц в v1-endpoint есть отдельное руководство: layout.md.

В этом разделе формулировки дополнены текущими сведениями о компонентах и размерах из v1-components.

Общие правила

ЭлементПравило
Заголовок страницыДля заголовка страницы следует использовать UiPageHeader.
Типографика заголовкаВ текущей реализации UiPageHeader использует типографику h2-accent: 24px, line-height: 32px, font-weight: 500.
Действия в заголовке и внутри экрановДля действий в заголовке и внутри экранов основным компонентом выступает UiButton.

Размеры `UiButton` в текущей реализации:
РазмерВысота
size="md"48px
size="sm"36px
size="lg"56px
size="xs"24px

Варианты приоритета и семантики задаются через `appearance` и `variant`:
ПараметрЗначения
appearanceprimary / secondary / tertiary / outlined
variantdefault / success / danger

Для контентных подложек базовое правило такое:
ОтступЗначение
Отступ от верхнего края подложки24px
Отступы от левого, правого и нижнего края32px

Базовая сетка расстояний строится на шаге 4px: 4, 8, 12, 16, 20, 24, 28, 32.

1. Страница со списком сущностей

Страница со списком сущностей используется в следующих случаях:

Когда использоватьПримеры
Для отдельных страниц со списком сущностейСписок заказов, список клиентов, список рассылок, список задач
Когда нужен список, фильтрация и создание новой сущностиСписок заказов, список клиентов, список рассылок, список задач

Страница состоит из следующих блоков:
БлокОписание
Заголовок страницыЗаголовок страницы на основе UiPageHeader с типографикой 24px / 32px / 500.
Действия справа от заголовкаОдна или несколько кнопок UiButton, обычно size="md" с высотой 48px.
Блок фильтровБлок фильтров на основе Select, Input, Combo-box.
Действия с фильтрамиКнопка применения фильтров и кнопка сброса.
ТаблицаТаблица со списком сущностей.

Компонентная основа:
ОбластьКомпоненты
Верхний блок страницыUiPageHeader
Действия справа от заголовка и кнопки фильтрацииUiButton
ФильтрыUiField, UiTextbox, UiSelect, UiDatePicker, UiTimePicker
Табличный блокUiTable, UiTableColumn, UiTableHeadCell, UiTableBodyCell, UiTableSorter, UiTableFooterSection, UiTableFooterButton

Практические замечания:
ОбластьРекомендация
Кнопки в заголовкеЕсли кнопок несколько, одна из них обычно оформляется как UiButton appearance="primary" size="md", остальные как secondary или tertiary.
Основная кнопкаОсновная кнопка обычно создает новую сущность для списка, остальные выполняют вспомогательные действия.
ФильтрыФильтры выстраиваются друг за другом по 4-5 штук в ряд и затем переносятся на новый ряд.
Сворачивание фильтровБлок фильтров может сворачиваться.
Кнопки фильтрацииКнопка применения фильтров обычно использует UiButton appearance="secondary" size="sm", а кнопка сброса — UiButton appearance="secondary" variant="danger" size="sm" в текстовом или иконочном варианте.
ТаблицаТаблица может поддерживать листание и выгрузку.

Страница со списком сущностей

2. Страница-карточка

Страница-карточка используется для страницы настроек или карточки сущности, которая состоит из форм.

Тип информацииОписание
Когда использоватьДля страницы настроек; для карточки сущности, которая состоит из форм.
ПримерыТрекинг → страница отслеживаемого события; настройки → ограничение отправок; настройки шаблоны → шаблоны писем; страница триггера.

Страница состоит из следующих блоков:
БлокОписание
Заголовок страницыЗаголовок страницы на основе UiPageHeader, который может быть редактируемым через editable.
Действия справа от заголовкаОдна или несколько кнопок UiButton size="md".
Верхнеуровневые вкладкиОпциональные вкладки на основе UiTabGroup и UiTab в верхней части страницы.
Основной контентОсновной контент на подложке.
Панель сохраненияОпциональная панель сохранения внизу страницы.

Компонентная основа:
ОбластьКомпоненты
Заголовок страницыUiPageHeader
Основные и вспомогательные действияUiButton
Верхнеуровневые вкладкиUiTabGroup, UiTab
ФормаUiField, UiTextbox, UiSelect, UiCheckbox, UiRadio, UiRadioSwitch, UiSwitch

Практические замечания:
ОбластьРекомендация
Информация рядом с кнопкамиРядом с кнопками может располагаться текстовая информация или статус.
Контент на подложкеКонтент на подложке может состоять из текста, кнопок, полей, списка чекбоксов, списка радиокнопок и свитчей.
Отступ от левого края подложки32px.
Отступ от верхнего края подложки24px.
Расстояния между компонентамиКомпоненты внутри страницы желательно располагать друг от друга на расстоянии, кратном 4px: 4, 8, 12, 16, 20, 24, 28, 32 и т.д.
Основные кнопкиНа странице обычно оставляют не более одной основной кнопки UiButton appearance="primary" variant="default" и, при необходимости, одной UiButton appearance="primary" variant="success".
Остальные действияОстальные действия лучше оформлять через UiButton appearance="secondary" или UiButton appearance="tertiary" с подходящим variant.

Страница-карточка

3. Страница с несколькими колонками

Страница с несколькими колонками используется для карточки сущности в редактируемом или нередактируемом режиме, а также в случаях, когда смысловые блоки нужно разнести по нескольким колонкам.

Тип информацииОписание
Когда использоватьДля карточки сущности в редактируемом или нередактируемом режиме; когда смысловые блоки нужно разнести по нескольким колонкам.
ПримерыСтраница заказа; страница клиента; страница просмотра товара.

Компонентная основа:
ОбластьКомпоненты
Базовая структураТот же набор, что и у страницы-карточки.
Компактные таблицыПри необходимости — компактные встроенные UiTable.

Практические замечания:
ОбластьРекомендация
Размещение контентаКонтент располагается на подложках.
Ширина подложкиПодложка с контентом чаще всего размещается на всю ширину экрана.
Смысловые блокиЕсли на странице несколько смысловых блоков, их можно размещать в несколько колонок как по вертикали, так и по горизонтали.
Расстояние между блоками24px.
Допустимые схемы по ширине100%, 50% на 50%, 30% на 70%.
Отступы от левого, правого и нижнего края подложки32px.
Отступ от верхнего края подложки24px.
Расстояния между компонентамиКомпоненты внутри блоков также желательно располагать на расстоянии, кратном 4px.

Страница с несколькими колонками

4. Страница с collapse-блоками

Страница с collapse-блоками используется для настроек, разбитых на смысловые группы.

Тип информацииОписание
Когда использоватьДля настроек, разбитых на смысловые группы.
ПримерыРедактирование товара; редактирование рассылки; настройки → Double Opt-In.

Компонентная основа:
ОбластьКомпоненты
Группировка секцийUiCollapseBox и UiCollapseGroup.
Содержимое секцийОбычные form-компоненты и при необходимости небольшие UiTable.

Практические замечания:
ОбластьРекомендация
Белая подложкаЕсли на странице используются Collapse-блоки и кроме них на странице больше ничего нет, белая подложка не нужна.
Панель сохраненияВ таком случае также не нужна панель сохранения внизу, потому что каждый блок имеет свое сохранение.
Содержимое Collapse-блокаВнутри Collapse-блока можно размещать текст, кнопки, поля, контролы и небольшие таблицы.

В `Collapse`-блоках лучше не размещать: * Сложные таблицы. * Другие `Collapse`-блоки. * Контент в 2 колонки на разных подложках.
Страница с collapse-блоками

5. UiModalSidebar (шторка)

UiModalSidebar используется, когда нужна небольшая форма по месту, нужно показать дополнительную информацию по месту или сценарий оформляется как карточка небольшой сущности, где немного полей и настроек.

Тип информацииОписание
Когда использоватьКогда нужна небольшая форма по месту; когда нужно показать дополнительную информацию по месту; когда сценарий оформляется как карточка небольшой сущности, где немного полей и настроек.
ПримерыКарточка задачи; оповещения; новое обращение; редактирование шага в сценариях.

Размеры:
РазмерШирина
size="lg"720px
size="sm"416px

Графические примеры:

UiModalSidebar 720px

UiModalSidebar 416px


Основные составляющие:
СоставляющаяОписание
HeaderЗакрепленный блок вверху с заголовком и кнопкой закрытия.
FooterЗакрепленный блок внизу, обычно содержит кнопки сохранения, отмены, закрытия или удаления.
Содержимое шторкиСодержимое шторки между Header и Footer.

Компонентная основа:
ОбластьКомпоненты
Основной контейнерUiModalSidebar.
СодержимоеТе же form-компоненты, что и на страницах.
ДействияUiButton.

Практические замечания:
ОбластьРекомендация
Содержимое HeaderВ Header также может присутствовать дополнительный текст, иконка, кнопка или метка (Tag).
Возврат назадЕсли шторка открылась из другой шторки, слева от заголовка выводится стрелка для возврата назад.
Содержимое FooterFooter может содержать кнопку копирования или вспомогательный текст.
Контент в шторкеКонтент в шторке может быть любым, но Collapse-блоки туда помещать не рекомендуется, потому что места мало.
ТаблицыНебольшие таблицы в шторках допустимы.
Отступ от правого, левого и нижнего краев32px.
Отступ от верхнего края24px.

В шторки не рекомендуется размещать: * `Collapse`-блоки. * Контент в 2 колонки на разных подложках. * Громоздкие, большие и сложные интерфейсы.

Для таких сценариев лучше делать отдельную полноценную страницу или модальное окно.

6. UiModalWindow (модальное окно)

UiModalWindow используется для отображения вспомогательных больших таблиц по месту, а также для отображения дополнительных настроек по месту, когда шторки уже не хватает.

Тип информацииОписание
Когда использоватьДля отображения вспомогательных больших таблиц по месту; для отображения дополнительных настроек по месту, когда шторки уже не хватает.
ПримерыДобавление товаров в заказ; маркировка товаров в заказе; просмотр email из списка коммуникаций; объединение дублей в разделе «Чистота базы».

Размеры:
СценарийРазмер
appearance="popup"Текущая фиксированная ширина — 880px.
responsiveМожно использовать для адаптивного сценария.
fullscreenМожно использовать для полноэкранного сценария.

Графические примеры:

UiModalWindow popup

UiModalWindow с подложкой


Основные составляющие:
СоставляющаяОписание
HeaderЗакрепленный блок вверху с заголовком и кнопкой закрытия.
FooterЗакрепленный блок внизу, обычно содержит кнопки сохранения, отмены, закрытия или удаления.
Контент модального окнаКонтент модального окна между Header и Footer.

Компонентная основа:
ОбластьКомпоненты
Основной контейнерUiModalWindow.
Низкоуровневый сценарийUiModalWindowSurface.
СодержимоеUiTable, form-компоненты и при необходимости UiTabGroup.

Практические замечания:
ОбластьРекомендация
Содержимое HeaderВ Header также может присутствовать дополнительный текст, иконка, кнопка или метка (Tag).
Содержимое FooterFooter может содержать кнопку копирования или вспомогательный текст.
Контент модального окнаВ целом контент в модалках может быть любым, но обычно это таблицы.
Отступ от правого, левого и нижнего краев32px.
Отступ от верхнего края24px.
Таблица в модальном окнеЕсли в модалке используется таблица, она может растягиваться на всю ширину модалки.
Разделы в модальном окнеЕсли модалка делится на разделы, лучше использовать большие табы вместо хедера модалки.

Когда использовать страницы

Страницы подходят для сценариев, где модулю требуется:

  • отдельный экран внутри CRM;
  • собственная структура интерфейса;
  • работа с меню и описанием страницы;
  • query string и навигация внутри сценария страницы.

Подробно про API навигации хоста, useRouter() и query string см. в статье Навигация и маршрутизация в JS-модулях.

Благодарим за отзыв.
Была ли статья полезна?
Нет
  • Рекомендации не помогли
  • Нет ответа на мой вопрос
  • Текст трудно понять
  • Не нравится описанный функционал
Да
Предыдущая статья
Точки встраивания JS-модулей
Точки интерфейса, куда могут встроиться JS-модули, а также доступные в этих точках объекты
Следующая статья
Навигация и маршрутизация в JS-модулях
JS-модули используют API хоста для переходов внутри CRM, генерации ссылок, чтения текущего адреса и синхронизации query string.