Appearance
Настройка редакторов и источников объектов
Редактор собирает значения полей и отправляет запрос для объекта, Link или метода. Редактор описывают внутри действия или варианта панели для редактирования; самостоятельным вариантом панели он не является.
Сначала определите, что именно изменяется и откуда берётся каждый объект, который участвует в операции. Затем выберите режим отображения и поля. Такой порядок не даёт внешне готовой форме отправить GUID не того объекта или не того Link.
Что изменяет редактор
| Задача | entityType или переопределение | Что нужно указать |
|---|---|---|
| Создать или изменить объект | entityType.object.metaTypeName | Метатип и поля |
| Создать Link | entityType.link | source, target и обычно linkName |
| Создать объект и связать его через Link | И object, и link | Один из концов Link обычно задаётся через getFromCreatedObject |
| Запустить метаметод | runMethod | parent, method, при необходимости объекты и параметры |
runMethod перенаправляет отправку формы в /MetaMethods/Run; это не дополнительный обработчик после сохранения. Сценарий запуска метода объединяет объекты и параметры из конфигурации со значениями формы.
Режимы отображения
| Режим | Поведение | Когда использовать |
|---|---|---|
modal | Открывает диалог и ждёт ввода пользователя | Обычное создание и редактирование |
panel | Использует область редактирования, которой управляет панель | Вариант панели, в который встроен редактор, явно поддерживает этот режим |
direct-request | Отправляет запрос без формы. create сначала применяет значения по умолчанию из редактора; http без модального редактора не передаёт значения полей редактора. Редактор runMethod учитывает режим только при создании узла BPMN и тогда не передаёт значения по умолчанию | Все обязательные значения и источники объектов известны заранее |
В текущих сценариях действий на практике используется modal, но контракт EditorType требует явно указать mode. Не используйте direct-request, если пользователь должен выбрать объект для источника или ввести значение.
Поля, вкладки и строки
Задайте либо fields на верхнем уровне, либо tabs. Каждой вкладке нужны постоянный id, локализованный title и собственные поля. Группа { "layout": "row", "fields": [...] } выводит компактные элементы управления рядом, в одну строку.
Каждое конечное поле, то есть поле, которое не является группой, должно содержать attribute. Основные свойства поля:
editAttributeзадаёт путь для отправки значения, если он отличается от отображаемогоattribute;readonlyпоказывает значение, но не даёт его изменить;hiddenисключает поле из отображения и общей проверки;- явно заданные
type,label,listOfValue,comment,regExиdefaultValueимеют приоритет над метаданными с сервера; propertyAsIdиselectPanelнастраивают выбор объекта;control: "scratchFile"в редакторе действия сmethod: "runMethod"заменяет поле ввода выбором файла. Когда пользователь отправляет форму, панель загружает выбранный файл как временный файл и передаёт методу его токен; подробнее — в разделе Файл для метода. Полю нужен явный"type": "String", аdefaultValueу него не задают. Всё остальное — ошибка конфигурации:scratchFileв другом редакторе, в том числе вeditor.runMethodдействияcreate, который тоже запускает метод; любое другое значениеcontrol, в том числе пустое;scratchFileбез"type": "String"или сdefaultValue. Тогда вместо поля ввода показана ошибка, и действие не выполняется, пока настройку не исправят. Скрытые поля и поля на других вкладках тоже проверяются: их ошибки появляются в уведомлении, когда пользователь отправляет форму. Действие, которое выполняется без формы, —createсeditor.mode: "direct-request",httpбез своего модального редактора илиrunMethod, запущенный изattributes.panelActionsлибо при создании узла BPMN без формы или его удалении, — не может заполнить поле сcontrol, поэтому такое поле останавливает действие с таким же уведомлением.
Подробнее о приоритете метаданных и типизированных элементах управления.
Откуда берутся объекты
LinkEndpoint описывает, откуда взять объект, например для source или target Link. В момент выполнения действия приложение определяет по каждому LinkEndpoint один селектор объекта.
| Источник | Откуда берётся объект | Типичное применение |
|---|---|---|
objectId | Фиксированный ObjectSelector | Заранее известный объект из конфигурации |
getFromItem | Текущий элемент Table или Tree | Действие строки |
getFromCreatedObject | Объект, созданный ранее в том же сценарии | Создать объект, затем связать его |
getSelectedObjectForPanelId | Последний выбор в указанной панели | Действие с участием другой панели, если её ID не меняется |
getSelectedObjectForEventId | Выбор, сохранённый в реестре событий | Зависимый запрос или редактор |
getFromActionId | Контекст результата действия | Цепочка действий |
selectPanel | Выбор пользователя во встроенной модальной панели | Объект нельзя определить заранее |
Для селектора, полученного через Link, idSource определяет, какой GUID использовать:
- не указан или
"linkedObject"— GUID целевого объекта; "link"— GUID самого Link.
Указывайте "link", чтобы удалить или изменить сам Link. Значение по умолчанию подходит для создания, чтения, изменения и удаления объекта и для методов, которые принимают связанный объект.
Набор поддерживаемых источников зависит от потребителя. Тип-объединение перечисляет возможные источники, но конкретный сценарий создания, изменения, runMethod, перезагрузки или события может поддерживать только часть из них. Прежде чем сочетать разные формы источников, сверьтесь с руководством по нужному действию.
Минимальный редактор объекта
json
{
"mode": "modal",
"entityType": {
"object": { "metaTypeName": "ProductionOrder" }
},
"fields": [
{ "attribute": "name", "label": "Name" }
]
}Метатип ProductionOrder должен существовать. Форма использует метаданные этого типа, если их возвращает API метаданных.
Создание объекта и связь с выбранным элементом
Используйте этот редактор в действии строки родительского объекта. Новая операция становится источником Link, а заказ, в строке которого запущено действие, — его целью.
json
{
"mode": "modal",
"header": {
"title": { "en": "Create operation", "ru": "Создать операцию" },
"propertyAsId": "code"
},
"entityType": {
"object": {
"metaTypeName": "Operation"
},
"link": {
"linkName": "OrderOperation",
"source": { "getFromCreatedObject": true },
"target": { "getFromItem": true }
}
},
"fields": [
{
"attribute": "code",
"type": "String",
"label": { "en": "Code", "ru": "Код" },
"regEx": "^OP-[0-9]+$"
},
{
"attribute": "duration",
"type": "Integer",
"label": { "en": "Duration, min", "ru": "Длительность, мин" }
},
{
"attribute": "link.sequence",
"type": "Integer",
"label": { "en": "Sequence", "ru": "Порядок" }
}
]
}link.sequence относится к метаданным и телу запроса Link, остальные поля — к новому объекту.
Выбор цели через панель
json
{
"entityType": {
"link": {
"linkName": "OrderProduct",
"source": { "getFromItem": true },
"target": {
"selectPanel": {
"label": { "en": "Choose product", "ru": "Выберите изделие" },
"width": "48rem",
"height": "28rem",
"panel": {
"id": "product-picker",
"type": "table",
"request": { "metaTypeName": "Product" },
"pagination": { "rowsPerPage": [10] },
"columns": [
{ "attribute": "code", "label": "Code" },
{ "attribute": "name", "label": "Name" }
]
}
}
}
}
}
}Панели выбора нужны полный запрос и вариант, который поддерживает выбор. Её ID не должен совпадать с ID в приложении, внутри которого она открывается.
Редактор для запуска метода
json
{
"mode": "modal",
"runMethod": {
"parent": "ProductionOrder",
"method": "release",
"objects": [
{ "getSelectedObjectForEventId": "order-selected" }
],
"params": {
"source": "configurator"
}
},
"fields": [
{
"attribute": "comment",
"type": "Text",
"label": "Release comment"
}
]
}Фактический контракт объектов и параметров задаёт сам метаметод. JSON-конфигурация не проверяет ни имя метода, ни передаваемые ему данные.
Открыть формы редактора: модальные, встроенные, с типизированными полями и выбором объекта Открыть сценарии создания, изменения, просмотра выбранного объекта и чтения связанных объектовЗначения по умолчанию, приоритет и отправка
- Действие или вариант панели передаёт текущий элемент, выбор и ID действия.
- Редактор определяет объекты по источникам объекта и Link для этого потребителя.
- Для существующего объекта приложение запрашивает его детальные данные по путям из
attribute. ПутьeditAttributeтоже попадает в запрос, если это не та агрегация, через которуюattributeчитает значение: приattribute: "uom|designatorNational"иeditAttribute: "uom"запрос перечисляет толькоuom|designatorNational. - Явно заданные в поле метаданные имеют приоритет над метаданными атрибута, полученными от API.
- Значения, полученные от API, имеют приоритет над значениями по умолчанию: значения по умолчанию заполняют только поля, значение которых не определено.
- Общая проверка применяет
regExи проверяет JSON, после чего потребитель отправляет запрос. - Последующие действия по ответу или действия перезагрузки обновляют зависимые области интерфейса.
Для обычных данных пустые значения Guid и Object при отправке заменяются на null. Это правило действует только на границе отправки; общего правила «все пустые строки становятся null» нет.
Ограничения и текущие расхождения
- Общая проверка не применяет
required. - Поддержка режимов редактора зависит от потребителя: объявление в типе не означает, что каждое действие отображает режим
panel. withLinkedAttributeобъявлен дляentityType.object, но его фактическое поведение проверено недостаточно, чтобы рекомендовать сценарий с ним.- Не каждый обработчик действия поддерживает все варианты источников объектов.
- Обработчики локальных тестовых данных для прямого создания и изменения Link и для операций с Link по GUID существуют, но встроенная интерактивная демонстрация Object API их не вызывает. Не считайте этот маршрут работающим подтверждением прямых изменений Link.
- Имена методов, схемы параметров и правила доступа определяет контракт сервера.
Справочник параметров
Страницы параметров пока представлены на английском языке.
Отображение и структура:
Поля редактора:
editor.{fields|tabs[].fields}[].attributeeditor.{fields|tabs[].fields}[].editAttributeeditor.{fields|tabs[].fields}[].typeeditor.{fields|tabs[].fields}[].controleditor.{fields|tabs[].fields}[].labeleditor.{fields|tabs[].fields}[].requirededitor.{fields|tabs[].fields}[].readonlyeditor.{fields|tabs[].fields}[].hiddeneditor.{fields|tabs[].fields}[].defaultValueeditor.{fields|tabs[].fields}[].listOfValueeditor.{fields|tabs[].fields}[].commenteditor.{fields|tabs[].fields}[].regExeditor.{fields|tabs[].fields}[].propertyAsIdeditor.{fields|tabs[].fields}[].selectPaneleditor.{fields|tabs[].fields}[].layout
Объект, Link и метод, с которыми работает редактор:
editor.entityType.object.metaTypeNameeditor.entityType.object.withLinkedAttributeeditor.entityType.link.linkNameeditor.runMethod.parenteditor.runMethod.methodeditor.runMethod.objects[]editor.runMethod.params
Источники объектов в LinkEndpoint:
LinkEndpoint.objectIdLinkEndpoint.getFromActionIdLinkEndpoint.idSourceLinkEndpoint.getFromItemLinkEndpoint.getFromCreatedObjectLinkEndpoint.getSelectedObjectForPanelIdLinkEndpoint.getSelectedObjectForEventIdLinkEndpoint.selectPanel.panelLinkEndpoint.selectPanel.labelLinkEndpoint.selectPanel.heightLinkEndpoint.selectPanel.width