Коллеги, добрый день. Версия 7.15.4.
Можно ли как-нибудь автоматически обновлять ленту в боковой панели автоматически при поступлении в каналы, на которые подписан пользователь, нового сообщения?
![]()
Или хотя бы при переоткрытии панели? Т.е. закрыл панель (переключил на другую), открыл заново - отобразились новые сообщения, поступившие за тот период, пока панель не обновлялась?
Понятно, что можно вызвать сортировку onSortClick в схеме SocialFeed, но хотелось бы хотя бы отловить момент загрузки структуры открытой боковой панели, по аналогии с onEntityInitialized на странице карточки. Есть ли такое событие в схеме?
Нравится
Денис, есть уже давно заведенная идея «Уведомление о появлении нового сообщения в Ленте, на которую подписан», но там пока не дошли до реализации. Видимо, есть технические трудности.
А по логике в 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();
}
}
},
Но с кнопкой было сделано неспроста, возможно из-за низкой производительности при загрузке всего?