diff --git a/app/assets/javascripts/discourse/components/actions-summary.js.es6 b/app/assets/javascripts/discourse/components/actions-summary.js.es6
index bac5779d496..f817f6da58d 100644
--- a/app/assets/javascripts/discourse/components/actions-summary.js.es6
+++ b/app/assets/javascripts/discourse/components/actions-summary.js.es6
@@ -1,6 +1,7 @@
import StringBuffer from 'discourse/mixins/string-buffer';
import { iconHTML } from 'discourse/helpers/fa-icon';
import { autoUpdatingRelativeAge } from 'discourse/lib/formatter';
+import { on } from 'ember-addons/ember-computed-decorators';
export default Ember.Component.extend(StringBuffer, {
tagName: 'section',
@@ -8,32 +9,44 @@ export default Ember.Component.extend(StringBuffer, {
actionsSummary: Em.computed.alias('post.actionsWithoutLikes'),
emptySummary: Em.computed.empty('actionsSummary'),
hidden: Em.computed.and('emptySummary', 'post.notDeleted'),
+ usersByType: null,
- rerenderTriggers: ['actionsSummary.@each', 'actionsSummary.users.length', 'post.deleted'],
+ rerenderTriggers: ['actionsSummary.@each', 'post.deleted'],
+
+ @on('init')
+ initUsersByType() {
+ this.set('usersByType', {});
+ },
// This was creating way too many bound ifs and subviews in the handlebars version.
renderString(buffer) {
+ const usersByType = this.get('usersByType');
+
if (!this.get('emptySummary')) {
this.get('actionsSummary').forEach(function(c) {
+ const id = c.get('id');
+ const users = usersByType[id] || [];
+
buffer.push("
");
- const renderActionIf = function(property, dataAttribute, text) {
- if (!c.get(property)) { return; }
- buffer.push("
" + text + ".");
+ const renderLink = (dataAttribute, text) => {
+ buffer.push(`
${text}.`);
};
// TODO multi line expansion for flags
let iconsHtml = "";
- if (c.get('usersExpanded')) {
+ if (users.length) {
let postUrl;
- c.get('users').forEach(function(u) {
- iconsHtml += "
";
+ users.forEach(function(u) {
+ const username = u.get('username_lower');
+
+ iconsHtml += ``;
if (u.post_url) {
postUrl = postUrl || u.post_url;
}
iconsHtml += Discourse.Utilities.avatarImg({
size: 'small',
- avatarTemplate: u.get('avatarTemplate'),
+ avatarTemplate: u.get('avatar_template'),
title: u.get('username')
});
iconsHtml += "";
@@ -45,9 +58,18 @@ export default Ember.Component.extend(StringBuffer, {
// TODO postUrl might be uninitialized? pick a good default
buffer.push(" " + I18n.t(key, { icons: iconsHtml, postUrl: postUrl}) + ".");
}
- renderActionIf('usersCollapsed', 'who-acted', c.get('description'));
- renderActionIf('can_undo', 'undo', I18n.t("post.actions.undo." + c.get('actionType.name_key')));
- renderActionIf('can_defer_flags', 'defer-flags', I18n.t("post.actions.defer_flags", { count: c.count }));
+
+ if (users.length === 0) {
+ renderLink('who-acted', c.get('description'));
+ }
+
+ if (c.get('can_undo')) {
+ renderLink('undo', I18n.t("post.actions.undo." + c.get('actionType.name_key')));
+ }
+ if (c.get('can_defer_flags')) {
+ renderLink('defer-flags', I18n.t("post.actions.defer_flags", { count: c.count }));
+ }
+
buffer.push("
");
});
@@ -79,8 +101,12 @@ export default Ember.Component.extend(StringBuffer, {
}
// User wants to know who actioned it
+ const usersByType = this.get('usersByType');
if (actionTypeId = $target.data('who-acted')) {
- this.actionTypeById(actionTypeId).loadUsers(post);
+ this.actionTypeById(actionTypeId).loadUsers(post).then(users => {
+ usersByType[actionTypeId] = users;
+ this.rerender();
+ });
return false;
}
diff --git a/app/assets/javascripts/discourse/components/post-menu.js.es6 b/app/assets/javascripts/discourse/components/post-menu.js.es6
index 9981c5330bc..1cfa0114ba9 100644
--- a/app/assets/javascripts/discourse/components/post-menu.js.es6
+++ b/app/assets/javascripts/discourse/components/post-menu.js.es6
@@ -165,15 +165,12 @@ const PostMenuComponent = Ember.Component.extend(StringBuffer, {
},
clickLikeCount() {
- const likeAction = this.get('post.likeAction');
- if (likeAction) {
- const users = likeAction.get('users');
- if (users && users.length) {
- users.clear();
- } else {
- likeAction.loadUsers(this.get('post'));
- }
- }
+ this.sendActionTarget('toggleWhoLiked');
+ },
+
+ sendActionTarget(action, arg) {
+ const target = this.get(`${action}Target`);
+ return target ? target.send(this.get(action), arg) : this.sendAction(action, arg);
},
clickReplies() {
@@ -268,13 +265,13 @@ const PostMenuComponent = Ember.Component.extend(StringBuffer, {
self = this;
if (acted) {
- this.sendAction('toggleLike', post);
+ this.sendActionTarget('toggleLike');
$likeButton.removeClass('has-like').addClass('like');
} else {
const scale = [1.0, 1.5];
animateHeart($heart, scale[0], scale[1], function() {
animateHeart($heart, scale[1], scale[0], function() {
- self.sendAction('toggleLike', post);
+ self.sendActionTarget('toggleLike');
$likeButton.removeClass('like').addClass('has-like');
});
});
diff --git a/app/assets/javascripts/discourse/components/who-liked.js.es6 b/app/assets/javascripts/discourse/components/who-liked.js.es6
index 901c948c55c..a26f468999c 100644
--- a/app/assets/javascripts/discourse/components/who-liked.js.es6
+++ b/app/assets/javascripts/discourse/components/who-liked.js.es6
@@ -1,15 +1,14 @@
import StringBuffer from 'discourse/mixins/string-buffer';
export default Ember.Component.extend(StringBuffer, {
- likedUsers: Ember.computed.alias('post.likeAction.users'),
- rerenderTriggers: ['likedUsers.length'],
+ rerenderTriggers: ['users.length'],
renderString(buffer) {
- const likedUsers = this.get('likedUsers');
- if (likedUsers && likedUsers.length > 0) {
+ const users = this.get('users');
+ if (users && users.length > 0) {
buffer.push("