Коллеги, добрый день. Версия 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(); } } },
Но с кнопкой было сделано неспроста, возможно из-за низкой производительности при загрузке всего?