Добрый день. Столкнулись со следующей проблемой, что есть много писем и после обработки одного письма из списка - обновляется весь список писем и надо перейти к обратно к последнему. Понял как реализовать прокрутку, но никак не получается запустить ее после полной загрузки (писем более 30).
Может есть какое-то событие и к нему можно привязаться? Только я не могу разобраться какое и как
Нравится
Сергей, опишите подробнее со скриншотами и кодом, не вполне понятно, что Вы хотите сделать и что уже реализовали.
Зверев Александр пишет:
Сергей, опишите подробнее со скриншотами и кодом, не вполне понятно, что Вы хотите сделать и что уже реализовали.
Был создан БП, который отправляет сообщение после создания обращения и его привязки к письму. Он же обрабатывает письмо, чтобы оно ушло в обработанное. В схеме CommunicationPanelEmailSchema ловится это сообщение и запускается this.reloadEmails();
Хотим сделать так, чтобы this.reloadEmails(); загружал все письма, а не просто первые 15 а после уже прокручивал их до самого низа.
По загрузке самое простое что нашли - это увеличить RowCount до обновления и вернуть значение обратно после (в целом работает даже)
По прокрутке:
var element = document.getElementById("EmailContainerListGrid");
element.scrollTo(0,element.scrollHeight);Не получается пока соединить это дело, чтобы прокрутка запускалась строго после загрузки писем
А если просто на уровне JS при помощи setInterval сделать таймер с запуском функции по его срабатыванию? Или длительность загрузки бывает слишком разной?
Да вроде не сильно будет отличаться, но хочется все же привязаться к реальному событию, а не гадать с таймерами
Можно найти в CommunicationPanelEmailSchema эту функцию reloadEmails и вызываемую ею loadEmails и внести в переопределённой схеме туда свои команды для прокрутки (и заодно можно убрать проверку на RowCount в _loadEmdPage)?
Сейчас эти функции выглядят так:
/**
* Calls emails list reload.
*/
reloadEmails: function() {
this.$EmdCollection.clear();
this._saveTabSettings();
this._setLoadingState(true);
this.$DisplayState = EmailConstants.emailPanelDisplayState.Folders;
if (this.get("EmailType") === EmailConstants.emailType.INCOMING && this.get("IsProcessed")) {
this.sandbox.publish("UpdateNewNotProcessedIncomingEmailsCounter", 0);
}
this.loadEmails(true);
},
/**
* Load emails list.
* @protected
* @param {Boolean} clearCollection Clear existing emails list flag.
*/
loadEmails: function(clearCollection) {
if (!this._anyMailboxSelected() && this.$EmailType !== EmailConstants.emailType.DRAFT) {
this._setLoadingState(false);
return;
}
this.Terrasoft.chain(
function(next) {
this._loadEmdPage(clearCollection, next, this);
},
function(next, ids) {
this._loadActivitiesByIds(clearCollection, ids);
},
this
);
},То есть в цепочке после _loadEmdPage и _loadActivitiesByIds вызвать свою функцию для прокрутки.
В итоге озарение пришло неожиданно. Посмотрел на задачу с другой стороны. Так как почтой в основном занимается 1 человек, то вместо обновления и прокрутки решил делать удаление из списка. Для нас это решение вышло даже элегантней
define("CommunicationPanelEmailSchema", ["CommunicationPanelEmailSchemaResources", "ContainerListGenerator",
"ConfigurationConstants", "ConfigurationEnums", "ModalBox", "NetworkUtilities",
"EmailConstants", "ProcessModuleUtilities", "ExchangeNUIConstants", "BusinessRulesApplierV2",
"EntityConnectionLinksUtilities", "css!EntityConnectionLinksUtilities", "CheckModuleDestroyMixin",
"ProcessEntryPointUtilities", "EmptyEmailPanelSchema"],
function(resources, ContainerListGenerator, ConfigurationConstants, ConfigurationEnums, ModalBox, NetworkUtilities,
EmailConstants, ProcessModuleUtilities, ExchangeNUIConstants, BusinessRulesApplier) {
return {
entitySchemaName: EmailConstants.entitySchemaName,
methods: {
init: function () {
this.callParent(arguments);
Terrasoft.ServerChannel.on(Terrasoft.EventName.ON_MESSAGE, this.onMyBpFinish, this);
},
onMyBpFinish: function(scope, message) {
if (!message || message.Header.Sender !== "UpdateEmailHistory") {
return;
}
var ID = message.Body;
var EmailID = "emailContainer-"+ ID + "-ViewModule_RightSideBarModule_EmailModule";
var element = document.getElementById(EmailID);
element.remove();
}
}
};
});
Как оказалось, первая линия работает немного не так как говорила в первый раз. Поэтому поправил код:
var ID = message.Body;
var collection = this.get("EmailCollection");
var foundItem = collection.collection.items.find(item => item.id === ID);
foundItem.set("IsNeedReload", false);
this.reloadEmailsData([ID]); //возможно лишнее, но пусть будет
collection.remove(foundItem);