Добрый день. Столкнулись со следующей проблемой, что есть много писем и после обработки одного письма из списка - обновляется весь список писем и надо перейти к обратно к последнему. Понял как реализовать прокрутку, но никак не получается запустить ее после полной загрузки (писем более 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);