Создание детали с редактируемым реестром
Glossary Item Box
Общие положения
Детали — это элементы страницы редактирования раздела. Детали предназначены для отображения записей, связанных с текущей записью раздела по справочной колонке. Это могут быть, например, записи другого раздела, в основном объекте которого есть справочная колонка, ссылающаяся на основной объект текущего раздела. Детали отображаются во вкладках страницы редактирования раздела.
Подробнее детали описаны в статье "Деталь" раздела "Основные элементы интерфейса и их структура".
ВАЖНО
Поскольку деталь с редактируемым реестром не является стандартной деталью приложения bpm'online, то она не может быть добавлена в раздел при помощи Мастера деталей.
Для добавления пользовательской детали с редактируемым реестром в существующий раздел необходимо:
- Создать схему объекта детали.
- Создать и сконфигурировать схему детали.
- Выполнить настройку детали в замещающей схеме страницы редактирования раздела.
- Выполнить настройку полей детали.
Описание примера
Создать пользовательскую деталь "Курьерские службы" для раздела [Заказы]. Деталь должна отображать список курьерских служб для текущего заказа.
Исходный код
Пакет с реализацией примера можно скачать по ссылке.
Алгоритм реализации примера
1. Создать схему объекта детали
В разделе [Конфигурация] на вкладке [Схемы] выполните действие [Добавить] — [Объект] ([Add] — [Object]) (рис. 1).
Рис. 1. — Добавление схемы объекта детали
Для создаваемой схемы объекта установите (рис.2):
- [Название] ([Name]) — "UsrCourierService";
- [Заголовок] ([Title]) — "CourierService";
- [Родительский объект] ([Parent object]) — [Базовый объект] ([Base object]).
Рис. 2. — Настройка свойств схемы объекта детали
В схему объекта добавьте справочную колонку [Заказ] ([Order]), по которой будет осуществляться связь с разделом [Заказ], и справочную колонку [Контрагент] ([Account]), в которой будет храниться контрагент, осуществляющий доставку по данному заказу. Для обеих колонок установите признак обязательности для заполнения, чтобы избежать добавления пустых записей. Настройки свойств колонок показаны на рисунках 3 и 4.
Рис. 3. — Настройка свойств колонки [Заказ] ([Order])
Рис. 4. — Настройка свойств колонки [Контрагент] ([Account])
Схему объекта сохраните и опубликуйте.
2. Создать схему детали
В разделе [Конфигурация] на вкладке [Схемы] выполните пункт меню [Добавить] — [Схема модели представления карточки] ([Add] — [Schema of the Edit Page View Model]) (рис. 1).
Созданный модуль должен наследовать функциональность В качестве родительской схемы укажите базовую схему детали с реестром BaseGridDetailV2, которая определена в пакете NUI.
Установите остальные свойства (рис. 5):
- [Название] ([Name]) — "UsrCourierServiceDetail";
- [Заголовок] ([Title]) — "Схема детали "Курьерская служба в заказе"" ("Courier Service in Order detail schema").
Рис. 5. — Свойства схемы детали
Установите значение [Курьерcкая служба] ([Courier Service]) для локализуемой строки [Caption] схемы реестра детали (рис. 6). В локализуемой строке [Caption] хранится заголовок детали, отображаемый на странице редактирования.
Рис. 6. — Установка значения локализуемой строки [Caption]
Для того чтобы сделать реестр детали редактируемым, в ее схеме необходимо:
- Добавить зависимости от модулей ConfigurationGrid, ConfigurationGridGenerator, ConfigurationGridUtilities.
- Подключить миксин ConfigurationGridUtilities.
- Установить для атрибута IsEditable значение true.
- В массив модификаций diff добавить конфигурационный объект, в котором устанавливаются свойства и выполняется привязка методов-обработчиков событий реестра детали.
Исходный код схемы детали с подробными комментариями:
// Определение схемы и установка ее зависимостей от других модулей. define("UsrCourierServiceDetail", ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities"], function() { return { // Название схемы объекта детали. entitySchemaName: "UsrCourierService", // Перечень атрибутов схемы. attributes: { // Признак возможности редактирования. "IsEditable": { // Тип данных — логический. dataValueType: Terrasoft.DataValueType.BOOLEAN, // Тип атрибута — виртуальная колонка модели представления. type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN, // Устанавливаемое значение. value: true } }, // Используемые миксины. mixins: { ConfigurationGridUtilities: "Terrasoft.ConfigurationGridUtilities" }, // Массив модификаций модели представления. diff: /**SCHEMA_DIFF*/[ { // Тип операции — слияние. "operation": "merge", // Название элемента схемы, над которым производится действие. "name": "DataGrid", // Объект, свойства которого будут объединены со свойствами элемента схемы. "values": { // Имя класса "className": "Terrasoft.ConfigurationGrid", // Генератор представления должен генерировать только часть представления. "generator": "ConfigurationGridGenerator.generatePartial", // Привязка события получения конфигурации элементов редактирования // активной строки к методу-обработчику. "generateControlsConfig": {"bindTo": "generateActiveRowControlsConfig"}, // Привязка события смены активной записи к методу-обработчику. "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": {"bindTo": "MultiSelect"} } } ]/**SCHEMA_DIFF*/ }; });
Для применения внесенных изменений сохраните созданную схему реестра детали.
3. Выполнить настройку детали в замещающей схеме страницы редактирования раздела
Чтобы отобразить деталь на странице редактирования заказа, создайте замещающий клиентский модуль, в котором в качестве родительского объекта укажите [Страница редактирования заказа] ([Order edit page], OrderPageV2) (рис. 7). Процесс создания замещающей страницы описан в статье "Создание клиентской схемы".
Рис. 7. — Свойства замещающей схемы страницы редактирования заказа
Для отображения детали [Курьерcкие службы] ([Courier Service]) на вкладке [Доставка] ([Delivery]) страницы редактирования заказа добавьте следующий исходный код. Здесь в секции 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": Terrasoft.core.enums.ViewItemType.DETAIL, "markerValue": "added-detail" }, // Контейнеры, в котором размещена деталь. // Деталь размещена на вкладке [Доставка]. "parentName": "OrderDeliveryTab", "propertyName": "items", // Индекс в списке добавляемых элементов. "index": 3 } ]/**SCHEMA_DIFF*/ }; });
Сохраните замещающую схему страницы редактирования.
4. Выполнить настройку колонок реестра детали
На этом этапе деталь уже полностью работоспособна. Однако записи контрагентов на детали не отображаются, поскольку не указаны колонки для отображения. Для исправления этого недостатка вызовите меню действий детали и настройте отображаемые колонки (рис. 8).
Рис. 8. — Меню действий детали
Мастер деталей, мастер раздела и деталь с редактируемым реестром
Поскольку деталь с редактируемым реестром не является стандартной деталью приложения bpm'online, то она не может быть добавлена в раздел при помощи мастера деталей. Поэтому при выполнении команды [Настроить деталь] ([Detail setup]) (рис. 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. — Отображение зарегистрированной детали в мастере разделов
Смотрите также:
- Создание детали при помощи мастеров
- Создание детали с редактируемым реестром
- Создание детали с выбором из справочника
- Создание пользовательской детали с полями