Добрый день. Подскажите пожалуйста, не как не могу решить данный кейс (причем когда-то такой решал давно но не могу не как вспомнить как).

Есть кнопка в группе кнопок "Действие" - "Отправить на визирование", она запускает процесс визирования. Данная кнопка должна быть активна если в таблице визирования уже есть как минимум одна положительная запись (автор согласовал). Для этого сделал запрос к базе данных и получил результат. Через свойство "Enabled" нужно реализовать доступность кнопки.

Код кнопки:

actionMenuItems.addItem(this.getButtonMenuItem({
	"Caption": VisaHelper.resources.localizableStrings.SendToVisaCaption,
	"Tag": VisaHelper.SendToVisaMenuItem.methodName,
	"Enabled": {"bindTo": "canEntityBeOperated"}
}));

"Enabled": {"bindTo": "canEntityBeOperated"} - сюда и надо отправить true и false.

Код запроса к базе данных:

var opportunityId = this.get("Id");
var ownerContact = "";
if (this.get("Owner")) {
	ownerContact = this.get("Owner").value;
}
var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
	rootSchemaName: "KtOpportunityVisa"
});
esq.addColumn("VisaOwner.Contact", "VisaOwnerContact");
esq.addColumn("KtOpportunity", "KtOpportunity");
esq.addColumn("Status", "Status");
var esqOwnerContactFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"VisaOwner.Contact", ownerContact);
var esqOpportunityFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"KtOpportunity", opportunityId);
var esqVisaСanceledFilter = esq.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
	"Status", KtConfigurationConstantsKarTel.VisaStatus.Positive);
esq.filters.add("esqOwnerContactFilter", esqOwnerContactFilter);
esq.filters.add("esqOpportunityFilter", esqOpportunityFilter);
esq.filters.add("esqVisaСanceledFilter", esqVisaСanceledFilter);
esq.getEntityCollection(function (result) {
	if (result.success && result.collection.getCount() === 0) {
		return false;
	} else {
		return true;
	}
}, this);

Так как запрос асинхронный то на сколько помню решается это через Terrasoft.chain с Callback, но как это сделать хоть убейте не помню.

Нравится

2 комментария
Лучший ответ

По поводу упомянутого механизма Вы недавно задавали вопрос в этой теме. Также см. публикацию.

По поводу упомянутого механизма Вы недавно задавали вопрос в этой теме. Также см. публикацию.

Зверев Александр,

 решил вопрос через создание в таблице процесса что срабатывал при изменении в ней и отправлял сообщение на фронт, а на фронте подписался на него и запускаю функцию что меняет атрибут который и дает ответ в каком состоянии должна быть кнопка. Могу написать код реализации тут если кому нужно. Но в итоге бизнес решил что им это не надо потому далее не оптимизировал код. Сейчас проблема в активности этой кнопки в совмещенном режиме, создал отдельный вопрос

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

Задача в том что бы скрыть группу полей. Осталось только вернуть значение true или false для функции visibleReasons но не как не доходит как, сделал но понимаю что так не работает это

isAutoActivity: function(callback, scope){
	var recordId = this.get("PrimaryColumnValue");
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
	esq.getEntity(recordId, function(result) {
		this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
},
visibleReasons: function() {
	Terrasoft.chain(
		function(next) {
			this.isAutoActivity(next, this);
		},
		function(){
			if (this.get("IsAutoActivity")) {
				return false;
			}
			return true;
		},
		this);
}

 

Нравится

3 комментария
Лучший ответ

А если просто при открытии карточки выполнить 

isAutoActivity и дальше забиндится на 
IsAutoActivity которое при открытии будет проиницилизировано!

А если просто при открытии карточки выполнить 

isAutoActivity и дальше забиндится на 
IsAutoActivity которое при открытии будет проиницилизировано!

Григорий Чех, 

Сработало с init, только теперь вопрос - есть ли смысл делать такую конструкцию?

init: function(callback, scope) {
	this.callParent([function() {
		this.Terrasoft.chain(
			function(next) {
				this.isAutoActivity(next, this);
			},
			function(){
				if (callback) {
					callback.call(scope || this);
				}
			},this);
	}, this]);
},
isAutoActivity: function(callback, scope){
	var recordId = this.get("PrimaryColumnValue");
	var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
		rootSchemaName: "Activity"
	});
	esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
	esq.getEntity(recordId, function(result) {
		this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
		if (callback) {
			callback.call(scope || this);
		}
	}, this);
}

или достаточно сделать?

init: function(callback, scope) {
	this.callParent([function() {
		var recordId = this.get("PrimaryColumnValue");
		var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", {
			rootSchemaName: "Activity"
		});
		esq.addColumn("KtIsAutoActivity", "KtIsAutoActivity");
		esq.getEntity(recordId, function(result) {
			this.set("IsAutoActivity", result.entity.get("KtIsAutoActivity"));
			if (callback) {
				callback.call(scope || this);
			}
		}, this);
	}, this]);
}

 

Если оба варианта работают одинаково и при отладке в браузере  заходит внутрь функции нормально, можете использовать любой из способов.

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

Добрый день.

Заместил схемку LeadAccountProfileSchema - вызываю метод FindSimilar при получение сообщения от карточки лида. В методе реализован Terrasoft.chain, чтобы убрать ассинхронность запроса в initSimilarEntityRecordsCollection. Но в chain почему-отрабатывает только первая функция, а onSimilarButtonClick не работает. Почему?

 

 

 


define("LeadAccountProfileSchema", ["LeadAccountProfileSchemaResources", "LeadSimilarEntitiesProfileSchemaUtilities"],
	function(resources) {
		return {
			entitySchemaName: "Account",
			mixins: {},
			attributes: {},
			messages: {
			"FindSimilarAccount": {
			mode: this.Terrasoft.MessageMode.PTP,
			direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
			}
			},
			methods: {
				initEntity: function() {
					this.callParent(arguments);
					this.sandbox.subscribe("FindSimilarAccount", this.FindSimilar, this, ["123"]);
				},
				FindSimilar: function() {
					this.Terrasoft.chain(
					this.initSimilarEntityRecordsCollection,
					this.onSimilarButtonClick,
					this)
				}
			},
			};
	});

 

Нравится

4 комментария

Метод, находящийся в chain должен принимать и вызывать после выполнения логики callback:
 

initSimilarEntityRecordsCollection: function(callback, scope) {
    // Logic
	if (callback) {
		callback.call(scope || this);
	}
},

 

Толмачев Дмитрий Юрьевич,

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

СД,

попробуйте примерно вот так через next:

Terrasoft.chain(
	function (next) {
		// какие-то действия
		next();
	},
	function(next) {
		// либо в callback
		var config = {
			isSilent: true,
			callback: next
		};
		this.save(config, false);
	}
}

 

СД,

Это просто пример. Вы же спросили почему у вас не выполняет вторая функция. Не выполняется, т.к. не вызывается. Вызвать можно через callback или next.

Конечно блок вызова callback-метода должен находиться в месте получения ответа от первой функции для реализации последовательного вызова.

  

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