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

Содержание

Помимо виджетов в 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 — локализованная ссылка на справку или документацию страницы.

Если для страницы указаны поля, связанные с меню, 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:

Параметр Значения
appearance primary / secondary / tertiary / outlined
variant default / 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).
Возврат назад Если шторка открылась из другой шторки, слева от заголовка выводится стрелка для возврата назад.
Содержимое Footer Footer может содержать кнопку копирования или вспомогательный текст.
Контент в шторке Контент в шторке может быть любым, но 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).
Содержимое Footer Footer может содержать кнопку копирования или вспомогательный текст.
Контент модального окна В целом контент в модалках может быть любым, но обычно это таблицы.
Отступ от правого, левого и нижнего краев 32px.
Отступ от верхнего края 24px.
Таблица в модальном окне Если в модалке используется таблица, она может растягиваться на всю ширину модалки.
Разделы в модальном окне Если модалка делится на разделы, лучше использовать большие табы вместо хедера модалки.

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

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

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

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

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