Создание детали с редактируемым реестром
Glossary Item Box
Общие положения
Детали — это элементы страницы редактирования раздела, предназначенные для отображения дополнительных данных для основного объекта раздела. Они отображаются во вкладках страницы редактирования раздела в контейнере вкладок.
В системе bpm'online можно выделить четыре основных типа деталей:
- деталь со страницей добавления;
- деталь с полями редактирования;
- деталь с редактируемым реестром;
- деталь с выбором из справочника.
Подробнее детали описаны в статье "Деталь" раздела "Основные элементы интерфейса и их структура".
ВАЖНО Поскольку деталь с редактируемым реестром не является стандартной деталью приложения bpm'online, то она не может быть добавлена в раздел при помощи Мастера деталей. |
Для добавления пользовательской детали с редактируемым реестром в существующий раздел необходимо выполнить следующую последовательность действий:
- Создать схему объекта детали.
- Создать и сконфигурировать схему детали.
- Выполнить настройку детали в замещающей схеме страницы редактирования раздела.
- Выполнить настройку полей детали.
Описание кейса
Создать пользовательскую деталь "Курьерские службы" для раздела [Заказы]. Деталь должна отображать список курьерских служб для текущего заказа.
Алгоритм реализации кейса
1. Создать схему объекта детали
В режиме настройки перейти в раздел [Конфигурация] и на вкладке [Схемы] выполнить пункт меню [Добавить] > [Объект] (рис. 1, 1).
Рис. 1. — Добавление схемы объекта детали
Для создаваемой схемы объекта в качестве родительского объекта необходимо выбрать [Базовый объект] (BaseEntity), определенный в пакете Base (рис. 2). Остальные свойства необходимо установить так, как показано на рисунке 2. В качестве значения свойства [Пакет] необходимо выбрать пакет, в котором ведется пользовательская разработка. Подробнее об установке свойств схемы объекта в дизайнере объекта изложено в статье "Дизайнер объектов".
Рис. 2. — Настройка свойств схемы объекта детали
В схему объекта необходимо добавить справочную колонку [UsrOrder], по которой будет осуществляться связь с разделом [Заказ], и справочную колонку [UsrAccount], в которой будет храниться контрагент, осуществляющий доставку по данному заказу. Для обеих колонок необходимо установить признак обязательности для заполнения, чтобы избежать добавления пустых записей. Настройки свойств колонок отображены на рисунках 3 и 4.
Рис. 3. — Настройка свойств колонки [Заказ]
Рис. 4. — Настройка свойств колонки [Контрагент]
Схему объекта необходимо сохранить и опубликовать.
2. Создать схему детали
В режиме настройки в разделе [Конфигурация] на вкладке [Схемы] выполнить пункт меню [Добавить] > [Схема модели представления детали с реестром] (рис. 1, 2).
Созданная схема должна наследовать функциональность базовой схемы детали с реестром BaseGridDetailV2, которая определена в пакете NUI. Для этого необходимо указать эту схему в качестве родительской для создаваемой схемы детали (рис. 5). Остальные свойства необходимо установить так, как показано на рисунке 5.
Рис. 5. — Свойства схемы детали
Далее необходимо установить значение "Курьерcкая служба" для локализуемой строки [Caption] схемы детали (рис. 6). В локализуемой строке [Caption] хранится заголовок детали, отображаемый на странице редактирования.
Рис. 6. — Установка значения локализуемой строки [Caption]
Для того чтобы сделать реестр детали редактируемым, в ее схеме необходимо:
- Добавить зависимости от модулей ConfigurationGrid, ConfigurationGridGenerator, ConfigurationGridUtilities.
- Подключить миксины ConfigurationGridUtilites и OrderUtilities.
- Установить для атрибута IsEditable значение true.
- В массив модификаций diff добавить конфигурационный объект, в котором устанавливаются свойства и выполняется привязка методов-обработчиков событий реестра детали.
Ниже приведен исходный код схемы детали с подробными комментариями, который нужно добавить в секцию [Исходный код] дизайнера клиентского модуля.
UsrCourierServiceDetail// Определение схемы и установка ее зависимостей от других модулей. define("UsrCourierServiceDetail", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"], function() { return { // Название схемы объекта детали. entitySchemaName: "UsrCourierService", // Перечень атрибутов схемы. attributes: { // Признак возможности редактирования. "IsEditable": { // Тип данных — логический. dataValueType: Terrasoft.DataValueType.BOOLEAN, // Тип атрибута — виртуальная колонка модели представления. type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, // Устанавливаемое значение. value: true } }, // Используемые миксины. mixins: { ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities", OrderUtilities: "Terrasoft.OrderUtilities" }, // Массив модификаций модели представления. diff: /**SCHEMA_DIFF*/[ { // Тип операции — слияние. "operation": "merge", // Название элемента схемы, над которым производится действие. "name": "DataGrid", // Объект, свойства которого будут объединены со свойствами элемента схемы. "values": { // Имя класса "className": "Terrasoft.ConfigurationGrid", // Генератор представления должен генерировать только часть представления. "generator": "ConfigurationGridGenerator.generatePartial", // Привязка события получения конфигурации элементов редактирования // активной строки к методу-обработчику. "generateControlsConfig": {"bindTo": "generatActiveRowControlsConfig"}, // Привязка события смены активной записи к методу-обработчику. "changeRow": {"bindTo": "changeRow"}, // Привязка события отмены выбора записи к методу-обработчику. "unSelectRow": {"bindTo": "unSelectRow"}, // Привязка события клика на реестре к методу-обработчику. "onGridClick": {"bindTo": "onGridClick"}, // Действия, производимые с активной записью. "activeRowActions": [ // Настройка действия [Сохранить]. { // Имя класса элемента управления, с которым связано действие. "className": "Terrasoft.Button", // Стиль отображения — прозрачная кнопка. "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT, // Тег. "tag": "save", // Значение маркера. "markerValue": "save", // Привязка к изображению кнопки. "imageConfig": {"bindTo": "Resources.Images.SaveIcon"} }, // Настройка действия [Отменить]. { "className": "Terrasoft.Button", "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT, "tag": "cancel", "markerValue": "cancel", "imageConfig": {"bindTo": "Resources.Images.CancelIcon"} }, // Настройка действия [Удалить]. { "className": "Terrasoft.Button", "style": this.Terrasoft.controls.ButtonEnums.style.TRANSPARENT, "tag": "remove", "markerValue": "remove", "imageConfig": {"bindTo": "Resources.Images.RemoveIcon"} } ], // Привязка к методу, который инициализирует подписку на события // нажатия кнопок в активной строке. "initActiveRowKeyMap": {"bindTo": "initActiveRowKeyMap"}, // Привязка события выполнения действия активной записи к методу-обработчику. "activeRowAction": {"bindTo": "onActiveRowAction"}, // Признак возможности выбора нескольких записей. "multiSelect": false } } ]/**SCHEMA_DIFF*/ }; });
Для применения внесенных изменений созданную схему детали необходимо сохранить.
3. Выполнить настройку детали в замещающей схеме страницы редактирования раздела
Чтобы отобразить деталь на странице редактирования заказа, сначала необходимо создать замещающий клиентский модуль, в котором в качестве родительского объекта указать страницу редактирования заказа OrderPageV2, определенную в пакете Order (рис. 7). Последовательность создания замещающих схем подробно изложена в статье "Создание клиентской схемы".
Рис. 7. — Свойства замещающей схемы страницы редактированя заказа
Для отображения детали [Курьерcкие службы] на вкладке [Доставка] страницы редактирования заказа необходимо добавить следующий исходный код. Здесь в секции details определяется новая деталь UsrCourierServiceDetail, а ее расположение на странице редактирования раздела задается в свойстве diff, которое является массивом модификаций модели представления страницы.
define("OrderPageV2", [], function() { return { // Название схемы объекта страницы редактирования. entitySchemaName: "Order", // Перечень добавляемых деталей страницы редактирования. details: /**SCHEMA_DETAILS*/{ // Настройка детали [Курьерcкие службы]. "UsrCourierServiceDetail": { // Название схемы детали. "schemaName": "UsrCourierServiceDetail", // Название схемы объекта детали. "entitySchemaName": "UsrCourierService", // Фильтрация отображения контактов только для текущего заказа. "filter": { // Колонка схемы объекта детали. "detailColumn": "UsrOrder", // Колонка схемы объекта раздела. "masterColumn": "Id" } } }/**SCHEMA_DETAILS*/, // Массив модификаций. diff: /**SCHEMA_DIFF*/[ // Метаданные для добавления детали [Курьерские службы]. { "operation": "insert", // Название детали. "name": "UsrCourierServiceDetail", "values": { "itemType": 2, "markerValue": "added-detail" }, // Контейнеры, в котором размещена деталь. // Деталь размещена на вкладке [Доставка]. "parentName": "OrderDeliveryTab", "propertyName": "items", // Индекс в списке добавляемых элементов. "index": 3 } ]/**SCHEMA_DIFF*/ }; });
Чтобы изменения были применены, замещающую схему страницы редактирования необходимо сохранить.
4. Выполнить настройку колонок реестра детали
На этом этапе деталь уже полностью работоспособна. Для ее отображения на вкладке [Доставка] страницы заказа достаточно обновить страницу в браузере с очисткой кеша. Однако записи контрагентов на детали не отображаются, поскольку не указаны колонки для отображения. Для исправления этого недостатка необходимо вызвать меню действий детали и настроить отображаемые колонки (рис. 8).
Рис. 8. — Меню действий детали
Мастер деталей, мастер раздела и деталь с редактируемым реестром
Поскольку деталь с редактируемым реестром не является стандартной деталью приложения bpm'online, то она не может быть добавлена в раздел при помощи мастера деталей. Поэтому при выполнении команды [Настроить деталь] (рис. 8) появится сообщение о том, что деталь не зарегистрирована. Также информация о том, что деталь не зарегистрирована, отображается в мастере разделов (рис. 9) уже после того, как она была добавлена вручную.
Рис. 9. — Отображение незарегистрированной детали в мастере разделов
В общем случае регистрация детали с редактируемым реестром в системе не нужна. Однако, если по каким-либо причинам деталь все же нужно зарегистрировать в системе, то для этого необходимо выполнить следующий SQL-сценарий:
DECLARE -- Название схемы представления создаваемой миникарточки. @ClientUnitSchemaName NVARCHAR(100) = 'UsrCourierServiceDetail', -- Название схемы объекта, к которому привязывается миникарточка. @EntitySchemaName NVARCHAR(100) = 'UsrCourierService', -- Название детали. @DetailCaption NVARCHAR(100) = 'Курьерская служба' INSERT INTO SysDetail(Caption, DetailSchemaUId, EntitySchemaUId) VALUES(@DetailCaption, (SELECT TOP 1 UId from SysSchema WHERE Name = @ClientUnitSchemaName), (SELECT TOP 1 UId from SysSchema WHERE Name = @EntitySchemaName))
ВАЖНО Для того чтобы осуществить регистрацию создаваемой детали в системе, необходимо внести изменения в системную таблицу SysDetails базы данных bpm’online при помощи SQL-запроса. Однако при составлении и выполнении SQL-запроса к базе данных следует быть предельно внимательным. Выполнение неправильно составленного SQL-запроса может привести к повреждению существующих данных и нарушению работы системы. |
После обновления страницы деталь появится в справочнике деталей, следовательно, в мастере разделов она уже отобразится как зарегистрированная. При этом уже с помощью мастера ее можно добавлять на другие вкладки страницы редактирования раздела [Заказы].
Рис. 9. — Отображение зарегистрированной детали в мастере разделов