diff --git a/app/assets/javascripts/discourse/models/post.js b/app/assets/javascripts/discourse/models/post.js index 60713d646..1baf757b5 100644 --- a/app/assets/javascripts/discourse/models/post.js +++ b/app/assets/javascripts/discourse/models/post.js @@ -25,6 +25,7 @@ Discourse.Post = Discourse.Model.extend({ // Posts can show up as deleted if the topic is deleted deletedViaTopic: Em.computed.and('firstPost', 'topic.deleted_at'), deleted: Em.computed.or('deleted_at', 'deletedViaTopic'), + notDeleted: Em.computed.not('deleted'), postDeletedBy: function() { if (this.get('firstPost')) { return this.get('topic.deleted_by'); } diff --git a/app/assets/javascripts/discourse/templates/post.js.handlebars b/app/assets/javascripts/discourse/templates/post.js.handlebars index ddb7f55a3..089d83065 100644 --- a/app/assets/javascripts/discourse/templates/post.js.handlebars +++ b/app/assets/javascripts/discourse/templates/post.js.handlebars @@ -53,14 +53,7 @@ {{view Discourse.PostMenuView postBinding="this" postViewBinding="view"}} </div> {{view Discourse.RepliesView contentBinding="replies" postViewBinding="view"}} - {{view Discourse.ActionsHistoryView contentBinding="actionsHistory"}} - - {{#if deleted}} - <div class='post-actions'> - {{i18n post.deleted_by}} {{avatar postDeletedBy imageSize="tiny"}} {{unboundAge postDeletedAt}} - </div> - {{/if}} - + {{view Discourse.ActionsHistoryView postBinding="this"}} {{view Discourse.TopicSummaryView postBinding="this"}} </div> diff --git a/app/assets/javascripts/discourse/views/actions_history_view.js b/app/assets/javascripts/discourse/views/actions_history_view.js index b27ef958c..f8afd09c2 100644 --- a/app/assets/javascripts/discourse/views/actions_history_view.js +++ b/app/assets/javascripts/discourse/views/actions_history_view.js @@ -10,51 +10,67 @@ Discourse.ActionsHistoryView = Discourse.View.extend({ tagName: 'section', classNameBindings: [':post-actions', 'hidden'], - hidden: Em.computed.empty('content'), - shouldRerender: Discourse.View.renderIfChanged('content.@each', 'content.users.length'), + content: Em.computed.alias('post.actionsHistory'), + noContent: Em.computed.empty('content'), + hidden: Em.computed.and('noContent', 'post.notDeleted'), + shouldRerender: Discourse.View.renderIfChanged('content.@each', 'content.users.length', 'post.deleted'), // This was creating way too many bound ifs and subviews in the handlebars version. render: function(buffer) { - if (!this.present('content')) return; - this.get('content').forEach(function(c) { - buffer.push("<div class='post-action'>"); + var renderAvatar = function() { - var renderActionIf = function(property, dataAttribute, text) { - if (!c.get(property)) { return; } - buffer.push(" <a href='#' data-" + dataAttribute + "='" + c.get('id') + "'>" + text + "</a>."); - }; + } - // TODO multi line expansion for flags - var iconsHtml = ""; - if (c.get('usersExpanded')) { - var postUrl; - c.get('users').forEach(function(u) { - iconsHtml += "<a href=\"" + Discourse.getURL("/users/") + (u.get('username_lower')) + "\">"; - if (u.post_url) { - postUrl = postUrl || u.post_url; - } - iconsHtml += Discourse.Utilities.avatarImg({ - size: 'small', - username: u.get('username'), - avatarTemplate: u.get('avatar_template'), - title: u.get('username') + if (this.present('content')) { + this.get('content').forEach(function(c) { + buffer.push("<div class='post-action'>"); + + var renderActionIf = function(property, dataAttribute, text) { + if (!c.get(property)) { return; } + buffer.push(" <a href='#' data-" + dataAttribute + "='" + c.get('id') + "'>" + text + "</a>."); + }; + + // TODO multi line expansion for flags + var iconsHtml = ""; + if (c.get('usersExpanded')) { + var postUrl; + c.get('users').forEach(function(u) { + iconsHtml += "<a href=\"" + Discourse.getURL("/users/") + (u.get('username_lower')) + "\">"; + if (u.post_url) { + postUrl = postUrl || u.post_url; + } + iconsHtml += Discourse.Utilities.avatarImg({ + size: 'small', + username: u.get('username'), + avatarTemplate: u.get('avatar_template'), + title: u.get('username') + }); + iconsHtml += "</a>"; }); - iconsHtml += "</a>"; - }); - var key = 'post.actions.people.' + c.get('actionType.name_key'); - if (postUrl) { key = key + "_with_url"; } + var key = 'post.actions.people.' + c.get('actionType.name_key'); + if (postUrl) { key = key + "_with_url"; } - buffer.push(" " + I18n.t(key, { icons: iconsHtml, postUrl: postUrl}) + "."); - } - renderActionIf('usersCollapsed', 'who-acted', c.get('description')); - renderActionIf('canAlsoAction', 'act', I18n.t("post.actions.it_too." + c.get('actionType.name_key'))); - renderActionIf('can_undo', 'undo', I18n.t("post.actions.undo." + c.get('actionType.name_key'))); - renderActionIf('can_clear_flags', 'clear-flags', I18n.t("post.actions.clear_flags", { count: c.count })); + buffer.push(" " + I18n.t(key, { icons: iconsHtml, postUrl: postUrl}) + "."); + } + renderActionIf('usersCollapsed', 'who-acted', c.get('description')); + renderActionIf('canAlsoAction', 'act', I18n.t("post.actions.it_too." + c.get('actionType.name_key'))); + renderActionIf('can_undo', 'undo', I18n.t("post.actions.undo." + c.get('actionType.name_key'))); + renderActionIf('can_clear_flags', 'clear-flags', I18n.t("post.actions.clear_flags", { count: c.count })); - buffer.push("</div>"); - }); + buffer.push("</div>"); + }); + } + + var post = this.get('post'); + if (post.get('deleted')) { + buffer.push("<div class='post-action'>" + + I18n.t("post.deleted_by") + " " + + Discourse.Utilities.tinyAvatar(post.get('postDeletedBy.username')) + + Discourse.Formatter.autoUpdatingRelativeAge(new Date(post.get('postDeletedAt'))) + + "</div>"); + } }, actionTypeById: function(actionTypeId) { @@ -77,12 +93,12 @@ Discourse.ActionsHistoryView = Discourse.View.extend({ } if (actionTypeId = $target.data('act')) { - this.content.findProperty('id', actionTypeId).act(); + this.get('content').findProperty('id', actionTypeId).act(); return false; } if (actionTypeId = $target.data('undo')) { - this.content.findProperty('id', actionTypeId).undo(); + this.get('content').findProperty('id', actionTypeId).undo(); return false; }