Здравствуйте. Столкнулся с проблемой следующего рода:
Появилась необходимость добавить действие на страницу редактирования активности.
Выполнил все пункты согласно инструкции на https://academy.terrasoft.ru/documents/technic-sdk/7-7/dobavlenie-deystviya-na-stranicu-redaktirovaniya .
В результате получилась вот такая замещающая страница:
define("ActivityPageV2", ["ProcessModuleUtilities", "AbrConstants"],
function(ProcessModuleUtilities, AbrConstants) {
return {
// Название схемы объекта страницы редактирования.
entitySchemaName: "Activity",
methods: {
// Проверяет, в каком состоянии активность.
isRunningMail: function() {
if (this.get("Status") && this.get("Result")) {
return (this.get("Status").value === AbrConstants.Activity.State.Completed && this.get("Result").value === "632afdd2-f616-4ea6-87d2-8ed38eed8aff");
}
return false;
},
// Метод-обработчик действия.
showActionInfo: function() {
var args = {
sysProcessName: "SendEmailAboutTheApproval",
scope: this
};
ProcessModuleUtilities.executeProcess(args);
this.showInformationDialog("Оповещения в ДТ и ОД отправлены.");
},
// Переопределение базового виртуального метода, возвращающего коллекцию действий страницы редактирования.
getActions: function() {
// Вызывается родительская реализация метода для получения
// коллекции проинициализированных действий базовой страницы.
var actionMenuItems = this.callParent(arguments);
// Добавление линии-разделителя.
actionMenuItems.addItem(this.getButtonMenuItem({
Type: "Terrasoft.MenuSeparator",
Caption: ""
}));
// Добавление пункта меню в список действий страницы редактирования.
actionMenuItems.addItem(this.getButtonMenuItem({
// Привязка заголовка пункта меню к локализуемой строке схемы.
"Caption": {bindTo: "Resources.Strings.SendEmailToOdAndDt"},
// Привязка метода-обработчика действия.
"Tag": "showActionInfo",
// Привязка свойства доступности пункта меню к значению, которое возвращает метод isRunning().
"Enabled": {bindTo: "isRunningMail"}
}));
return actionMenuItems;
}
}
};
}
);Кнопка добавилась, но свойство "Enabled" работает некорректно.
Т.е. кнопка должна быть активна, когда задача имеет состояние "Завершена" и результат "Выполнена".
Но, когда мы со страницы активностей открываем задачу, которая имеет состояние "Завершена" и результат "Выполнена", кнопка всегда неактивна и никак не реагирует на изменения состояния или результата.
![]()
Но если просто обновить страницу, кнопка становится активна.
![]()
В чем может быть причина?
Нравится
stique,
//PageV2
attributes: {
//На пейдже первым делом объявляю атрибут
//на который я буду биндить (байндить) свойство "enabled" кнопки
"isOrderButtonEnabled": {
"value": false
}
},
messages: {
//Объявляю сообщение с направлением PUBLISH, которое будем отправлять на секцию
"GetOrderButtonStatus": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.PUBLISH
}
},
methods: {
//Объявляю метод, который буду запускать два раза
//При инициализации страницы и после сохранения
//Он проставляет атрибут для кнопки
//и одновременно отправляет сообщение с текущим статусом на секцию
//Хотя здесь можно сделать лучше и отправлять не статус, а непосредственно значение true/false
getOrderButtonStatus: function() {
this.sandbox.publish("GetOrderButtonStatus", this.get("UsrStatus"), [this.sandbox.id]);
var status = this.$UsrStatus;
if (status && status.value === "caae507b-ccea-4275-967e-bb4f4c73a880") {
this.set("isOrderButtonEnabled", true);
}
else {
this.set("isOrderButtonEnabled", false);
}
},
onEntityInitialized: function() {
this.callParent(arguments);
//вызываем первый раз
this.getOrderButtonStatus();
},
onSaved: function() {
this.callParent(arguments);
//вызываем второй раз
this.getOrderButtonStatus();
}
},
diff: [
//У меня была обычная кнопка на карточке, у Вас в меню Действия
//Так что Вам нужно забиндить кнопку на атрибут в Вашем методе getActions()
{
"operation": "insert",
"name": "creatingOrderButton",
"values": {
"itemType": 5,
"caption": "Create order",
"click": {
"bindTo": "syncCreatingOrder"
},
"style": "green",
"enabled": {
"bindTo": "isOrderButtonEnabled"//забиндить на атрибут
},
"classes": {
"textClass": "actions-button-margin-right"
}
},
"parentName": "LeftContainer",
"propertyName": "items",
"index": 7
}
]
//SectionV2
attributes: {
//Здесь объявляем такой же атрибут
"isOrderButtonEnabled": {
"value": false
}
},
messages: {
//Объявляем такое же сообщение с направлением SUBSCRIBE
"GetOrderButtonStatus": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.SUBSCRIBE
}
},
methods: {
//в init подписываемся на нужное нам сообщение
//и если оно к нам приходит - запускается метод getOrderStatusButton
//Опять таки, здесь можно и нужно логику переделать, чтобы получать сразу значение true/false
//вместо статуса
init: function() {
this.callParent(arguments);
this.sandbox.subscribe("GetOrderButtonStatus", function(value) { this.getOrderButtonStatus(value); }, this, [this.getCardModuleSandboxId()]);
},
getOrderButtonStatus: function(status) {
if (status && status.value === "caae507b-ccea-4275-967e-bb4f4c73a880") {
this.set("isOrderButtonEnabled", true);
}
else {
this.set("isOrderButtonEnabled", false);
}
}
}
Насколько я понимаю и помню, то добавив действие на ActivityPageV2, это действие по-моему создается автоматически и в секции, средствами сообщений, я давно это тестил, уже не помню. В общем, в первом случае у вас кнопка ДЕЙСТВИЯ находится на ActivitySectionV2, а во втором случае кнопка ДЕЙСТВИЯ находится на ActivityPageV2, это две разные кнопки. И на пейдже у вас есть метод isRunningMail(), но на секции его нет. Вам нужно организовать передачу сообщения с пейджи на секцию какой там статус и результат, потому что на секции этой информации нет. У Вас случайно ошибки в консоль не сыпятся, когда вы открываете первый раз активность в совмещенном режиме? Я надеюсь, что хоть немного понятно изъяснился)) I'm doing my best)
stique,
Если открыть задачу, которая поставлена по процессу, которая не завершена, то да, она сразу откроется в пейдже, а остальные задачи, при первом открытии, открываются в совмещенном режиме, насколько я понимаю.

Вот попробуйте в секцию добавить метод isRunningMail() который всегда возвращает true, для примера, и кнопка у вас, скорее всего, заработает.
Но, чтобы она отрабатывала так же, как на пейдже, нужно воспользоваться механизмом сообщений.
stique,
С механизмом сообщений знакомы? Sandbox
Я биндил свойство enabled на атрибут, на пейдже в методах onEntityInitialized и onSaved я отправлял сообщения на секшн и в зависимости от условий проставлял такой же атрибут в true или false.
Если нужно прям подробно, то могу позже описать полностью как я сделал.
Alex Zaslavsky,
Alex Zaslavsky пишет:
С механизмом сообщений знакомы? Sandbox
Увы нет, только неделю как изучаю bpm)
Alex Zaslavsky пишет:
Если нужно прям подробно, то могу позже описать полностью как я сделал.
Если Вас не затруднит, буду признателен. А пока постараюсь самостоятельно поковырять.
stique,
//PageV2
attributes: {
//На пейдже первым делом объявляю атрибут
//на который я буду биндить (байндить) свойство "enabled" кнопки
"isOrderButtonEnabled": {
"value": false
}
},
messages: {
//Объявляю сообщение с направлением PUBLISH, которое будем отправлять на секцию
"GetOrderButtonStatus": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.PUBLISH
}
},
methods: {
//Объявляю метод, который буду запускать два раза
//При инициализации страницы и после сохранения
//Он проставляет атрибут для кнопки
//и одновременно отправляет сообщение с текущим статусом на секцию
//Хотя здесь можно сделать лучше и отправлять не статус, а непосредственно значение true/false
getOrderButtonStatus: function() {
this.sandbox.publish("GetOrderButtonStatus", this.get("UsrStatus"), [this.sandbox.id]);
var status = this.$UsrStatus;
if (status && status.value === "caae507b-ccea-4275-967e-bb4f4c73a880") {
this.set("isOrderButtonEnabled", true);
}
else {
this.set("isOrderButtonEnabled", false);
}
},
onEntityInitialized: function() {
this.callParent(arguments);
//вызываем первый раз
this.getOrderButtonStatus();
},
onSaved: function() {
this.callParent(arguments);
//вызываем второй раз
this.getOrderButtonStatus();
}
},
diff: [
//У меня была обычная кнопка на карточке, у Вас в меню Действия
//Так что Вам нужно забиндить кнопку на атрибут в Вашем методе getActions()
{
"operation": "insert",
"name": "creatingOrderButton",
"values": {
"itemType": 5,
"caption": "Create order",
"click": {
"bindTo": "syncCreatingOrder"
},
"style": "green",
"enabled": {
"bindTo": "isOrderButtonEnabled"//забиндить на атрибут
},
"classes": {
"textClass": "actions-button-margin-right"
}
},
"parentName": "LeftContainer",
"propertyName": "items",
"index": 7
}
]
//SectionV2
attributes: {
//Здесь объявляем такой же атрибут
"isOrderButtonEnabled": {
"value": false
}
},
messages: {
//Объявляем такое же сообщение с направлением SUBSCRIBE
"GetOrderButtonStatus": {
mode: Terrasoft.MessageMode.PTP,
direction: Terrasoft.MessageDirectionType.SUBSCRIBE
}
},
methods: {
//в init подписываемся на нужное нам сообщение
//и если оно к нам приходит - запускается метод getOrderStatusButton
//Опять таки, здесь можно и нужно логику переделать, чтобы получать сразу значение true/false
//вместо статуса
init: function() {
this.callParent(arguments);
this.sandbox.subscribe("GetOrderButtonStatus", function(value) { this.getOrderButtonStatus(value); }, this, [this.getCardModuleSandboxId()]);
},
getOrderButtonStatus: function(status) {
if (status && status.value === "caae507b-ccea-4275-967e-bb4f4c73a880") {
this.set("isOrderButtonEnabled", true);
}
else {
this.set("isOrderButtonEnabled", false);
}
}
}
stique,
Ну я делал именно такую логику, чтобы юзер не мог просто сменить статус (временно, без сохранения) и жмакать кнопку, когда ему захочется))
Если Вам нужно другое поведение, то можно создать на пейдже атрибут, который будет реагировать на изменение полей "Результат" и "Статус" и отправлять сендбоксом сообщение в любой момент, при изменении этих полей. Но как по мне, это не совсем правильно. Но решать Вам)

