Вопрос

Обновление ленты

Коллеги, добрый день. Версия 7.15.4.

 

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

Изображение удалено.

Или хотя бы при переоткрытии панели? Т.е. закрыл панель (переключил на другую), открыл заново - отобразились новые сообщения, поступившие за тот период, пока панель не обновлялась?

 

Понятно, что можно вызвать сортировку onSortClick в схеме SocialFeed, но хотелось бы хотя бы отловить момент загрузки структуры открытой боковой панели, по аналогии с onEntityInitialized на странице карточки. Есть ли такое событие в схеме?

Нравится

1 комментарий

Денис, есть уже давно заведенная идея «Уведомление о появлении нового сообщения в Ленте, на которую подписан», но там пока не дошли до реализации. Видимо, есть технические трудности.

 

А по логике в SocialFeed, обратите внимание на кнопку ShowNewMessagesButton внутри ShowNewMessagesContainer. Там в обработчике нажатия происходит такое обновление:

/**
 * New messages button event handler.
 * @private
 */
onShowNewMessageClick: function() {
	this.set("sortColumnName", this.get("SocialMessageSortColumns")[0]);
	this.set("sortColumnLastValue", null);
	this.set("newSocialMessagesCount", 0);
	this.set("showNewSocialMessagesVisible", false);
	this.get("SocialMessages").clear();
	var newMessageContainer = this.Ext.get(this.get("ESNRightPanelSandboxId") + "_postList-container");
	if (newMessageContainer && this.getIsRightPanel()) {
		newMessageContainer.removeCls("showNewMessageContainerTop");
		newMessageContainer.removeCls("headerWithChannelListAndMessageTop");
	}
	var channelFilter = this.get("channelFilter");
	var initMessageCount = this.get("InitMessageCount");
	if (channelFilter) {
		this.loadPosts(initMessageCount, channelFilter);
	} else {
		this.loadPosts(initMessageCount);
	}
	this.Ext.getBody().dom.scrollTop = 0;
	this.Ext.getDoc().dom.documentElement.scrollTop = 0;
},

А логика отображения этой кнопки при добавлении нового сообщения реализована в showLoadNewMessageButton, которую вызывает onInsertSocialMessageReceived, а её  onSocialMessageReceived. А последняя подписывается на событие в init:

this.Terrasoft.ServerChannel.on(this.Terrasoft.EventName.ON_MESSAGE, this.onSocialMessageReceived, this);

 Возможно, если разобраться в логике этих функций, получится не показывать кнопку «Показать 1 новое сообщение/Показать {0} новых сообщений», а сразу обновлять при помощи loadSocialMessages, которая тоже там вызывается? Сейчас, насколько я понял, сразу, без кнопки, показывает только для сообщений от текущего пользователя, то есть самого себя:

/**
 * Insert social message handler.
 * @private
 * @param {Object} config Configuration object.
 * @param {Object} config.response Social message response.
 * @param {Object} [config.receivedMessage] Received message.
 */
onInsertSocialMessageReceived: function(config) {
	var receivedMessage = config.receivedMessage || this.Ext.decode(config.response.Body);
	var channelFilter = this.get("channelFilter");
	if (!channelFilter || receivedMessage.channelId === channelFilter.rightExpression.parameterValue) {
		if (this.Terrasoft.SysValue.CURRENT_USER.value === receivedMessage.sysAdminUnitId) {
			this.loadSocialMessages(config.loadSocialMessagesConfig, config.loadSocialMessagesCallback,
this);
		} else {
			this.showLoadNewMessageButton();
		}
	}
},

Но с кнопкой было сделано неспроста, возможно из-за низкой производительности при загрузке всего?

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