Заполняем поле менеджер(пользователь системы), заполняем поле даты/время, при заполнении этого поля нужно проверить свободен ли в это время(и следующих 15 мин) менеджер, если да то делаем кнопку доступной.
Интересует как сделать саму проверку.

Нравится

9 комментариев

Добрый вечер, Виталий.

Для решения Вашей задачи необходимо:
1) Привязать доступность кнопки к булевому атрибуту, имеющему по умолчанию значение false.
2) При каждом изменении поля Дата/Время делать запрос к базе данных проверяя свободен ли он и на основании результат менять значение атрибута из пункта 1.

Вот что получилось:
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {rootSchemaName: "Activity"});
esq.addAggregationSchemaColumn("Id", Terrasoft.AggregationType.COUNT, "Id");
esq.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"Owner",
this.get("Owner").value
));
esq.filters.addItem(this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.Greater,
"StartDate",
new Date()
));
esq.getEntityCollection(
function(response) {
var e = response.collection.getByIndex(0).get("Id");
e = e + e;
},
this
);
на строке var e = response.collection.getByIndex(0).get("Id"); выбивает ошибку - елемент не найден, если убрать фильтр по дате - выбирает все как есть, значит проблема в фильтре, что я сделал не так? возможно формат другой? я не смог найти пример с датами

... жесть, не Greater а GREATER

так, наткнулся на другую проблему, как я понял оно работает:
формируем запрос и отправили его на сервер и когда придет ответ - обрабатываем его, но не ждем пока он придет код выполняется дальше. когда приходит ответ - выполняется функция "getEntityCollection( function(response". И тут 2 вопроса можно ли сделать так чтоб все висло и ждало пока придет ответ и как передать в эту функцию параметры

Виталий, javascript асинхронный по умолчанию и с этим ничего сделать нельзя.

По поводу параметров:

1) В метод getEntityCollection вторым параметром передается scope выполнения функции обратного вызова. Т.е. если в него передать this - функция сможет работать с любыми атрибутами или методами карточки.

2) Аналогично можно перед вызовом getEntityCollection закешировать this.
var scope = this;
Тогда можно будет получить или изменить любой атрибут обращаясь к scope внутри функции обратного вызова.
var param = scope.get("Owner");
scope.set("Owner", {id: "", displayValue: "Supervisor"})

да но что делать когда нужно выполнить вот такой код:

esq.getEntityCollection(
	function(response) {
		var ActivitytCount = response.collection.getByIndex(0).get("Id");
		if (ActivitytCount === 0) {
			this.callParent([function() {
				this.Terrasoft.chain(this.publishOnSaveEvents, function() {
					this.onSaved(callback, scope);
				}, this);
			}, this]);

выбивает ошибку:
TypeError: e is undefined

Как вариант зависания - используйте метод showBodyMask() перед вызовом getEntityCollection. Это позволит отобразить на карточке маску загрузки которая не позволит менять данные.

В функции обратного вызова скройте маску this.hideBodyMask()

this.showBodyMask();
esq.getEntityCollection(function(response) {
	//вычисления
	this.hideBodyMask()
}, this);

рекомендую также смотреть в сторону использования try catch что бы избежать вечной маски загрузки если в коллбэке возникнет ошибка

Ошибка в том, что вызвать callParent в функции обратного вызова невозможно, контекст уже утерян.

Пример решения (метод onEntityInitialized взят для примера):

onEntityInitialized: function() {
	if(this.get("test") === true){
		this.set("test", false);
		this.callParent([function() {
			this.Terrasoft.chain(this.publishOnSaveEvents, function() {
				this.onSaved(callback, scope);
			}, this);
		}, this]
                return;
	}
	esq.getEntityCollection(
		function(response) {
			var ActivitytCount = response.collection.getByIndex(0).get("Id");
			if (ActivitytCount === 0) {
				this.set("test", true)
				this.onEntityInitialized();
			}
		},
	this);
}

Вау! Никогда не использовал такую логику!!! Сработало, благодарю!

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