Заполняем поле менеджер(пользователь системы), заполняем поле даты/время, при заполнении этого поля нужно проверить свободен ли в это время(и следующих 15 мин) менеджер, если да то делаем кнопку доступной.
Интересует как сделать саму проверку.
Нравится
Добрый вечер, Виталий.
Для решения Вашей задачи необходимо:
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"); выбивает ошибку - елемент не найден, если убрать фильтр по дате - выбирает все как есть, значит проблема в фильтре, что я сделал не так? возможно формат другой? я не смог найти пример с датами
так, наткнулся на другую проблему, как я понял оно работает:
формируем запрос и отправили его на сервер и когда придет ответ - обрабатываем его, но не ждем пока он придет код выполняется дальше. когда приходит ответ - выполняется функция "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); }
Вау! Никогда не использовал такую логику!!! Сработало, благодарю!