Вопрос

Каким образом выполнять проверку, что значение поля было изменено, и в какой момент нужно делать откат

Стоит следующая задача: если в карточке контакта изменилось текущее значение поля [Статус] на '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'.

По моему мнению, более правильно выполнять проверку изменилось ли значение уже в момент сохранения контакта пользователем и тогда задавать ему вопрос, чтобы не пересохранять запись ещё раз.

Более правильным в данной ситуации мне кажется использование механизма добавления валидации к полю. Если пользователь отвечает на вопрос нет, то не разрешать сохранять запись, но тут возникает вопрос: мне же не нужно возращать никаких сообщений пользователю.

В итоге возник вопрос, каким образом выполнять проверку, что значение поля было изменено, и в какой момент нужно делать откат, то есть вернуть первоначальное значение, которое было установлено до изменения?

И насколько целесообразно в данной задаче использовать валидацию для поля или есть другие способы решения данной задачи?

 

 

 

Нравится

1 комментарий

Для контроля изменения в поле - необходимо установить на него 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
}
...
},

в начале же вашего метода-обработчика изменения ориентируйтесь на его значение. 

Показать все комментарии