Вопрос

Автопрокрутка после загрузки списка

Добрый день. Столкнулись со следующей проблемой, что есть много писем и после обработки одного письма из списка - обновляется весь список писем и надо перейти к обратно к последнему. Понял как реализовать прокрутку, но никак не получается запустить ее после полной загрузки (писем более 30).

 

Может есть какое-то событие и к нему можно привязаться? Только я не могу разобраться какое и как

Нравится

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

Сергей, опишите подробнее со скриншотами и кодом, не вполне понятно, что Вы хотите сделать и что уже реализовали.

Зверев Александр пишет:

Сергей, опишите подробнее со скриншотами и кодом, не вполне понятно, что Вы хотите сделать и что уже реализовали.

Был создан БП, который отправляет сообщение после создания обращения и его привязки к письму. Он же обрабатывает письмо, чтобы оно ушло в обработанное. В схеме 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);

 

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