Каким образом выполнять проверку, что значение поля было изменено, и в какой момент нужно делать откат
Стоит следующая задача: если в карточке контакта изменилось текущее значение поля [Статус] на 'Reject', задать пользователю вопрос вида: "Вы, действительно, хотите установить 'Reject' статус", если пользователь отвечает да, тогда должен запускаться БП, который изменит статусы других, связанных объектов, если нет, тогда статус должен возвращаться в предыдущее состояние.
Сейчас это реализовано достаточно костыльным способом.
Для поля [Статус] создано dependencies, в котором реализован вызов следующего метода:
var status = this.get("BTContactStatus");
if (this.Ext.isEmpty(status)) {
return;
}
if (status.value === "f7ade63f-213d-4daa-a73d-75684c4bd689") {
var message = "Do you want set 'Reject' status?";
this.showConfirmationDialog(this.Ext.String.format(message, 1), function (result5) {
if (result5 === Terrasoft.MessageBoxButtons.NO.returnCode) {
var entity = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Contact"
});
entity.addColumn("BTContactStatus");
entity.filters.addItem(entity.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL, "Id", this.get("Id")));
entity.getEntityCollection(function(result) {
if (result.success) {
if(result.collection.getCount() < 1) {
this.set("BTContactStatus", null);
return;
}
this.set("BTContactStatus", result.collection.getByIndex(0).get("BTContactStatus"));
}
}, this);
}
}, ["yes", "no"]);
}
В методе описан сценарий, когда пользователь на вопрос отвечает 'Нет', а если пользователь на вопрос отвечает 'Да', в методе ничего не происходит, но в системе реализован процесс, который запускается по сигналу изменения статуса у контакта на 'Reject'.
По моему мнению, более правильно выполнять проверку изменилось ли значение уже в момент сохранения контакта пользователем и тогда задавать ему вопрос, чтобы не пересохранять запись ещё раз.
Более правильным в данной ситуации мне кажется использование механизма добавления валидации к полю. Если пользователь отвечает на вопрос нет, то не разрешать сохранять запись, но тут возникает вопрос: мне же не нужно возращать никаких сообщений пользователю.
В итоге возник вопрос, каким образом выполнять проверку, что значение поля было изменено, и в какой момент нужно делать откат, то есть вернуть первоначальное значение, которое было установлено до изменения?
И насколько целесообразно в данной задаче использовать валидацию для поля или есть другие способы решения данной задачи?
Нравится
Для контроля изменения в поле - необходимо установить на него dependencies (свойство конфигурационного объекта атрибута)
https://academy.terrasoft.ru/documents/technic-sdk/7-10/atributy-svoystvo-attributes
н/п установим метод обработчик для поля "Contact"
attributes:{
...
"Contact": {
dependencies: [
{
columns: ["Contact"],
methodName: "ContactChangeHandler"
}
]
}
...
},вашу логику вынести в метод обработчик
в котором задайте интересующий вас вопрос пользователю
Terrasoft.utils.showMessage({
caption: "Ваше сообщение пользователю",
//набор используемых кнопок из списка стандартных для диалоговых окон
buttons: ["yes", "no"],
//метод-обработчик выполненных пользователем действий
handler: function(code) {
//если пользователь нажал "Да"
if (code === "yes") {
//ToDo
//если пользователь нажал "Нет"
//проверять необходимо явно, т.к. окно можно и просто закрыть
} else if (code === "no") {
//ToDo
//логика "по умолчанию"
} else {
//ToDo
}
},
defaultButton: 0,
//контекст в котором будет вызвана функция обработчик handler
scope: this
});
т.к. обработчик срабатывает после изменения значения в модели фактически, а вам при каком-то условии придется "откатывать" значение, что в свою очередь тоже изменение и вызовет метод обработчик повторно, необходимо Вам предусмотреть "флаг рекурсивного вызова" и его устанавливать в случае отката, и сбрасывать его при обнаружении в вызове.
н/п создав специальный атрибут
attributes:{
...
"rollbackByContactChangeFlag": {
"type": Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
"dataValueType": Terrasoft.DataValueType.BOOLEAN,
"value": false
}
...
},в начале же вашего метода-обработчика изменения ориентируйтесь на его значение.