Механизм блокировки полей страницы редактирования
Glossary Item Box
Общие сведения
При разработке пользовательской функциональности bpm'online может возникнуть необходимость в одновременной блокировке всех полей и деталей на странице при выполнении некоторого условия. Механизм блокировки страницы редактирования позволяет существенно ускорить процесс решения данной задачи, не прибегая к написанию большого количества бизнес-правил.
ВАЖНО
Механизм блокировки реализован в bpm'online версий 7.11.1 и выше.
ВАЖНО
Функциональность блокировки полей страницы редактирования может быть отключена с помощью опции CompleteCardLockout на странице отключения функциональности (см. "Механизм отключения функциональности Feature Toggle"). Страница отключения функциональности доступна по адресу ../0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage. Например, https://mycompany.bpmonline.com/0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage
В результате применения механизма блокировки на странице редактирования будут заблокированы все поля и детали. Если для поля существует привязка для свойства enabled в элементе массива diff или в бизнес-правиле, то механизм не будет блокировать такое поле. У деталей скрываются кнопки и элементы меню, которые отвечают за выполнение операций над записью. В детали с редактируемым реестром остается возможность перейти на страницу объекта, однако на ней также будут заблокированы все поля с учетом бизнес-правил.
ВАЖНО
Механизм блокировки предназначен для блокировки деталей с реестром и с редактируемым реестром. Если же необходима корректная работа механизма для деталей с полями редактирования, то необходимо создать замещающую схему такой детали и управлять доступностью полей при помощи атрибута IsEnabled.
Чтобы включить механизм блокировки, необходимо в исходном коде страницы редактирования установить значение false для атрибута модели IsModelItemsEnabled:
this.set(“IsModelItemsEnabled”, false);
Или можно установить для атрибута значение по умолчанию:
"IsModelItemsEnabled": { dataValueType: Terrasoft.DataValueType.BOOLEAN, value: true, dependencies: [{ columns: ["PaymentStatus"], methodName: "setCardLockoutStatus" }] }
Также для работы механизма блокировки на конкретной странице редактирования в массиве diff этой страницы необходимо указать генератор DisableControlsGenerator для тех контейнеров, в которых необходимо блокировать поля. Так, для блокировки всех полей страницы редактирования нужно указать глобальный контейнер CardContentWrapper:
diff: /**SCHEMA_DIFF*/[ { "operation": "merge", "name": "CardContentWrapper", "values": { "generator": "DisableControlsGenerator.generatePartial" } } ]/**SCHEMA_DIFF*/
ВАЖНО
Установка значения "generator": "DisableControlsGenerator.generatePartial" приводит к ошибке открытия страницы редактирования в мастере разделов.
Исключение блокировки
Существует возможность исключить блокировку для некоторых полей и деталей. Сделать это можно при помощи переопределения методов getDisableExclusionsDetailSchemaNames() и getDisableExclusionsColumnTags(). Эти методы возвращают списки полей и деталей, которые не должны быть заблокированы механизмом. Пример реализации методов приведен ниже:
getDisableExclusionsColumnTags: function() { return ["SomeField"]; } getDisableExclusionsDetailSchemaNames: function() { return ["SomeDetailV2"] }
Более сложную логику исключений можно реализовать при помощи переопределения метода isModelItemEnabled() для полей редактирования и метода isDetailEnabled() для деталей. Эти методы вызываются для каждого поля и детали. Они получают на вход имя и возвращают признак доступности поля или детали. Пример реализации методов приведен ниже:
isModelItemEnabled: function(fieldName) { var сondition = this.get("SomeConditionAttribute"); if (fieldName === "ExampleField" || сondition)) { return true; } return this.callParent(arguments); } isDetailEnabled: function(detailName) { if (detailName === "ExampleDetail") { var exampleDate = this.get("Date"); var dateNow = new Date(this.Ext.Date.now()); var condition = this.Ext.Date.isDate(exampleDate) && exampleDate >= dateNow; return condition; } return this.callParent(arguments); }