diff --git a/app/assets/javascripts/discourse/components/mount-widget.js.es6 b/app/assets/javascripts/discourse/components/mount-widget.js.es6 index cd108d449..dbdf7d841 100644 --- a/app/assets/javascripts/discourse/components/mount-widget.js.es6 +++ b/app/assets/javascripts/discourse/components/mount-widget.js.es6 @@ -1,5 +1,6 @@ import { diff, patch } from 'virtual-dom'; import { WidgetClickHook } from 'discourse/widgets/click-hook'; +import { renderedKey } from 'discourse/widgets/widget'; export default Ember.Component.extend({ _tree: null, @@ -51,6 +52,8 @@ export default Ember.Component.extend({ this._afterRender(); this._afterRender = null; } + + renderedKey('*'); } } diff --git a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 index 2eaaf8e3f..b18152e8c 100644 --- a/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 +++ b/app/assets/javascripts/discourse/components/scrolling-post-stream.js.es6 @@ -150,9 +150,13 @@ export default MountWidget.extend({ $('button.widget-button').removeClass('d-hover'); }); - this.appEvents.on('post-stream:refresh', postId => { - if (postId) { - keyDirty(`post-${postId}`); + this.appEvents.on('post-stream:refresh', args => { + if (args) { + if (args.id) { + keyDirty(`post-${args.id}`); + } else if (args.force) { + keyDirty(`*`); + } } this.queueRerender(); }); diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index a3680e8e6..39ab7630e 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -310,7 +310,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { } else { return this.get("model").toggleBookmark().then(changedIds => { if (!changedIds) { return; } - changedIds.forEach(id => this.appEvents.trigger('post-stream:refresh', id)); + changedIds.forEach(id => this.appEvents.trigger('post-stream:refresh', { id })); }); } }, @@ -326,14 +326,14 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { selectedPosts.addObjects(posts); } this.set('allPostsSelected', true); - this.appEvents.trigger('post-stream:refresh'); + this.appEvents.trigger('post-stream:refresh', { force: true }); }, deselectAll() { this.get('selectedPosts').clear(); this.get('selectedReplies').clear(); this.set('allPostsSelected', false); - this.appEvents.trigger('post-stream:refresh'); + this.appEvents.trigger('post-stream:refresh', { force: true }); }, toggleParticipant(user) { @@ -354,7 +354,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { toggleMultiSelect() { this.toggleProperty('multiSelect'); - this.appEvents.trigger('post-stream:refresh'); + this.appEvents.trigger('post-stream:refresh', { force: true }); }, finishedEditingTopic() { @@ -643,7 +643,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { // Unsubscribe before subscribing again this.unsubscribe(); - const refresh = (id) => this.appEvents.trigger('post-stream:refresh', id); + const refresh = (id) => this.appEvents.trigger('post-stream:refresh', { id }); this.messageBus.subscribe("/topic/" + this.get('model.id'), data => { const topic = this.get('model'); @@ -729,7 +729,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, { postStream.get('posts').forEach(post => { if (!post.read && postNumbers.indexOf(post.post_number) !== -1) { post.set('read', true); - this.appEvents.trigger('post-stream:refresh', post.id); + this.appEvents.trigger('post-stream:refresh', { id: post.id }); } }); diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index c83d2f9cb..f67a1e682 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -228,7 +228,7 @@ export default { // TODO: Use ember closure actions const result = topicController._actions[action].call(topicController, post); if (result && result.then) { - this.appEvents.trigger('post-stream:refresh', selectedPostId); + this.appEvents.trigger('post-stream:refresh', { id: selectedPostId }); } } } diff --git a/app/assets/javascripts/discourse/widgets/widget.js.es6 b/app/assets/javascripts/discourse/widgets/widget.js.es6 index 9b1af297a..26df22bce 100644 --- a/app/assets/javascripts/discourse/widgets/widget.js.es6 +++ b/app/assets/javascripts/discourse/widgets/widget.js.es6 @@ -4,12 +4,16 @@ import { h } from 'virtual-dom'; function emptyContent() { } const _registry = {}; -const _dirty = {}; +let _dirty = {}; export function keyDirty(key) { _dirty[key] = true; } +export function renderedKey(key) { + delete _dirty[key]; +} + function drawWidget(builder, attrs, state) { const properties = {}; @@ -95,7 +99,11 @@ export default class Widget { if (prev && prev.shadowTree) { this.shadowTree = true; - if (!_dirty[prev.key]) { return prev.vnode; } + if (!_dirty[prev.key] && !_dirty['*']) { + return prev.vnode; + } + + renderedKey(prev.key); } return this.draw(h, this.attrs, this.state);