Каким образом выполнять проверку, что значение поля было изменено, и в какой момент нужно делать откат
Стоит следующая задача: если в карточке контакта изменилось текущее значение поля [Статус] на '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 } ... },
в начале же вашего метода-обработчика изменения ориентируйтесь на его значение.