diff --git a/app/assets/javascripts/discourse/models/user.js b/app/assets/javascripts/discourse/models/user.js index 1c083db60f5..77b1dd3aef0 100644 --- a/app/assets/javascripts/discourse/models/user.js +++ b/app/assets/javascripts/discourse/models/user.js @@ -370,6 +370,7 @@ Discourse.User = Discourse.Model.extend({ var stat = Em.Object.create(s); stat.set('isPM', stat.get('action_type') === Discourse.UserAction.NEW_PRIVATE_MESSAGE || stat.get('action_type') === Discourse.UserAction.GOT_PRIVATE_MESSAGE); + stat.set('description', Em.String.i18n('user_action_groups.' + stat.get('action_type'))); return stat; })); @@ -429,7 +430,7 @@ Discourse.User.reopenClass({ found = true; if (!g[k]) { g[k] = Em.Object.create({ - description: Em.String.i18n("user_action_descriptions." + k), + description: Em.String.i18n("user_action_groups." + k), count: 0, action_type: parseInt(k, 10) }); diff --git a/app/assets/javascripts/discourse/models/user_action.js b/app/assets/javascripts/discourse/models/user_action.js index 207bf362e66..bfbc159392f 100644 --- a/app/assets/javascripts/discourse/models/user_action.js +++ b/app/assets/javascripts/discourse/models/user_action.js @@ -8,6 +8,77 @@ **/ Discourse.UserAction = Discourse.Model.extend({ + descriptionHtml: (function() { + var action = this.get('action_type'); + var ua = Discourse.UserAction; + var actions = [ua.LIKE, ua.WAS_LIKED, ua.STAR, ua.EDIT, ua.BOOKMARK, ua.GOT_PRIVATE_MESSAGE, ua.NEW_PRIVATE_MESSAGE]; + var icon = ""; + var sentence = ""; + var sameUser = (this.get('username') === Discourse.get('currentUser.username')); + + if (action === null || actions.indexOf(action) >= 0) { + if (this.get('isPM')) { + icon = '<i class="icon icon-envelope-alt" title="{{i18n user.stream.private_message}}"></i>'; + if (sameUser) { + sentence = Em.String.i18n('user_action.sent_by_you', { userUrl: this.get('userUrl') }); + } else { + sentence = Em.String.i18n('user_action.sent_by_user', { user: this.get('name'), userUrl: this.get('userUrl') }); + } + } else { + if (sameUser) { + sentence = Em.String.i18n('user_action.posted_by_you', { userUrl: this.get('userUrl') }); + } else { + sentence = Em.String.i18n('user_action.posted_by_user', { user: this.get('name'), userUrl: this.get('userUrl') }); + } + } + } else if (action === ua.NEW_TOPIC) { + if (sameUser) { + sentence = Em.String.i18n('user_action.you_posted_topic', { userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') }); + } else { + sentence = Em.String.i18n('user_action.user_posted_topic', { user: this.get('name'), userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') }); + } + } else if (action === ua.POST || action === ua.RESPONSE) { + if (this.get('reply_to_post_number')) { + if (sameUser) { + sentence = Em.String.i18n('user_action.you_replied_to_post', { post_number: '#' + this.get('reply_to_post_number'), + userUrl: this.get('userUrl'), postUrl: this.get('postUrl') }); + } else { + sentence = Em.String.i18n('user_action.user_replied_to_post', { user: this.get('name'), + post_number: '#' + this.get('reply_to_post_number'), userUrl: this.get('userUrl'), postUrl: this.get('postUrl') }); + } + } else { + if (sameUser) { + sentence = Em.String.i18n('user_action.you_replied_to_topic', { userUrl: this.get('userUrl'), + topicUrl: this.get('replyUrl') }); + } else { + sentence = Em.String.i18n('user_action.user_replied_to_topic', { user: this.get('name'), + userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') }); + } + } + } else if (action === ua.MENTION) { + if (sameUser) { + sentence = Em.String.i18n('user_action.you_mentioned_user', { user: this.get('target_name'), + user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') }); + } else { + if (this.get('target_username') === Discourse.get('currentUser.username')) { + sentence = Em.String.i18n('user_action.user_mentioned_you', { user: this.get('name'), + user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') }); + } else { + sentence = Em.String.i18n('user_action.user_mentioned_user', { user: this.get('name'), + another_user: this.get('target_name'), user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') }); + } + } + } else { + Ember.debug("Invalid user action: " + action); + } + + return new Handlebars.SafeString(icon + " " + sentence); + }).property(), + + targetUserUrl: (function() { + return Discourse.Utilities.userUrl(this.get('target_username')); + }).property(), + userUrl: (function() { return Discourse.Utilities.userUrl(this.get('username')); }).property(), diff --git a/app/assets/javascripts/discourse/templates/user/stream.js.handlebars b/app/assets/javascripts/discourse/templates/user/stream.js.handlebars index 4c53bfb4830..af55af78c54 100644 --- a/app/assets/javascripts/discourse/templates/user/stream.js.handlebars +++ b/app/assets/javascripts/discourse/templates/user/stream.js.handlebars @@ -7,31 +7,7 @@ <span class="title"> <a href="{{unbound postUrl}}">{{unbound title}}</a> </span> - {{#unless description}} - <span class="type"> - {{#if isPM}} - <i class="icon icon-envelope-alt" title="{{i18n user.stream.private_message}}"></i> - {{i18n user.stream.sent_by}} - {{else}} - {{i18n user.stream.posted_by}} - {{/if}} - </span> - {{/unless}} - <a class='name' href="{{unbound userUrl}}">{{personalizedName name usernamePath="username"}}</a> - {{#if description}} - <span class='type'>{{unbound description}}</span> - {{#if isPostAction}} - <a class="post-number" href="{{unbound replyUrl}}"> - {{#if reply_to_post_number}} - #{{unbound reply_to_post_number}} - {{else}} - {{i18n user.stream.the_topic}} - {{/if}} - </a> - {{else}} - <span class="name">{{personalizedName view.parentView.parentView.user.name usernamePath="view.parentView.parentView.user.username"}}</span> - {{/if}} - {{/if}} + <span class="type">{{unbound descriptionHtml}}</span> </div> <p class='excerpt'> {{{unbound excerpt}}} diff --git a/app/models/user_action.rb b/app/models/user_action.rb index 17813b942b8..e007962e9fa 100644 --- a/app/models/user_action.rb +++ b/app/models/user_action.rb @@ -36,7 +36,7 @@ class UserAction < ActiveRecord::Base ].each_with_index.to_a.flatten] def self.stats(user_id, guardian) - results = UserAction.select("action_type, COUNT(*) count, '' AS description") + results = UserAction.select("action_type, COUNT(*) count") .joins(:target_topic) .where(user_id: user_id) .group('action_type') @@ -57,9 +57,6 @@ class UserAction < ActiveRecord::Base results = results.to_a results.sort! { |a,b| ORDER[a.action_type] <=> ORDER[b.action_type] } - results.each do |row| - row.description = self.description(row.action_type, detailed: true) - end results end @@ -83,6 +80,7 @@ class UserAction < ActiveRecord::Base builder = SqlBuilder.new(" SELECT t.title, a.action_type, a.created_at, t.id topic_id, + a.user_id AS target_user_id, au.name AS target_name, au.username AS target_username, coalesce(p.post_number, 1) post_number, p.reply_to_post_number, pu.email ,pu.username, pu.name, pu.id user_id, @@ -94,6 +92,7 @@ LEFT JOIN posts p on p.id = a.target_post_id JOIN posts p2 on p2.topic_id = a.target_topic_id and p2.post_number = 1 JOIN users u on u.id = a.acting_user_id JOIN users pu on pu.id = COALESCE(p.user_id, t.user_id) +JOIN users au on au.id = a.user_id /*where*/ /*order_by*/ /*offset*/ @@ -126,7 +125,6 @@ JOIN users pu on pu.id = COALESCE(p.user_id, t.user_id) data.each do |row| row["action_type"] = row["action_type"].to_i - row["description"] = self.description(row["action_type"]) row["created_at"] = DateTime.parse(row["created_at"]) # we should probably cache the excerpts in the db at some point row["excerpt"] = PrettyText.excerpt(row["cooked"],300) if row["cooked"] @@ -141,60 +139,6 @@ JOIN users pu on pu.id = COALESCE(p.user_id, t.user_id) data end - def self.description(row, opts = {}) - t = I18n.t('user_action_descriptions') - if opts[:detailed] - # will localize as soon as we stablize the names here - desc = case row.to_i - when BOOKMARK - t[:bookmarks] - when NEW_TOPIC - t[:topics] - when WAS_LIKED - t[:likes_received] - when LIKE - t[:likes_given] - when RESPONSE - t[:responses] - when POST - t[:posts] - when MENTION - t[:mentions] - when QUOTE - t[:quotes] - when EDIT - t[:edits] - when STAR - t[:favorites] - when NEW_PRIVATE_MESSAGE - t[:sent_items] - when GOT_PRIVATE_MESSAGE - t[:inbox] - end - else - desc = - case row.to_i - when NEW_TOPIC - then t[:posted] - when LIKE,WAS_LIKED - then t[:liked] - when RESPONSE,POST - then t[:responded_to] - when BOOKMARK - then t[:bookmarked] - when MENTION - then t[:mentioned] - when QUOTE - then t[:quoted] - when STAR - then t[:favorited] - when EDIT - then t[:edited] - end - end - desc - end - def self.log_action!(hash) require_parameters(hash, :action_type, :user_id, :acting_user_id, :target_topic_id, :target_post_id) transaction(requires_new: true) do diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 1711431db7c..e1d20ea0ed7 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -49,8 +49,36 @@ en: saving: "Saving..." saved: "Saved!" - user_action_descriptions: + user_action: + user_posted_topic: "<a href='{{userUrl}}'>{{user}}</a> posted <a href='{{topicUrl}}'>the topic</a>" + you_posted_topic: "<a href='{{userUrl}}'>You</a> posted <a href='{{topicUrl}}'>the topic</a>" + user_replied_to_post: "<a href='{{userUrl}}'>{{user}}</a> replied to <a href='{{postUrl}}'>{{post_number}}</a>" + you_replied_to_post: "<a href='{{userUrl}}'>You</a> replied to <a href='{{postUrl}}'>{{post_number}}</a>" + user_replied_to_topic: "<a href='{{userUrl}}'>{{user}}</a> replied to <a href='{{topicUrl}}'>the topic</a>" + you_replied_to_topic: "<a href='{{userUrl}}'>You</a> replied to <a href='{{topicUrl}}'>the topic</a>" + + user_mentioned_user: "<a href='{{user1Url}}'>{{user}}</a> mentioned <a href='{{user2Url}}'>{{another_user}}</a>" + user_mentioned_you: "<a href='{{user1Url}}'>{{user}}</a> mentioned <a href='{{user2Url}}'>you</a>" + you_mentioned_user: "<a href='{{user1Url}}'>You</a> mentioned <a href='{{user2Url}}'>{{user}}</a>" + + posted_by_user: "Posted by <a href='{{userUrl}}'>{{user}}</a>" + posted_by_you: "Posted by <a href='{{userUrl}}'>you</a>" + sent_by_user: "Sent by <a href='{{userUrl}}'>{{user}}</a>" + sent_by_you: "Sent by <a href='{{userUrl}}'>you</a>" + + user_action_groups: + "1": "Likes Given" + "2": "Likes Received" + "3": "Bookmarks" + "4": "Topics" + "5": "Posts" "6": "Responses" + "7": "Mentions" + "9": "Quotes" + "10": "Favorites" + "11": "Edits" + "12": "Sent Items" + "13": "Inbox" user: information: "User Information" diff --git a/config/locales/server.en.yml b/config/locales/server.en.yml index c0befed9041..0d0a3972a10 100644 --- a/config/locales/server.en.yml +++ b/config/locales/server.en.yml @@ -544,31 +544,6 @@ en: most_recent_poster: "Most Recent Poster" frequent_poster: "Frequent Poster" - user_action_descriptions: - bookmarks: "Bookmarks" - topics: "Topics" - likes_received: "Likes Received" - likes_given: "Likes Given" - responses: "Responses" - topic_responses: "Topic Responses" - posts: "Posts" - mentions: "Mentions" - quotes: "Quotes" - edits: "Edits" - favorites: "Favorites" - sent_items: "Sent Items" - inbox: "Inbox" - - was_liked: "was liked" - liked: "liked" - bookmarked: "bookmarked" - posted: "posted" - responded_to: "replied to" - mentioned: "mentioned" - quoted: "quoted" - favorited: "favorited" - edited: "edited" - move_posts: moderator_post: one: "I moved a post to a new topic: %{topic_link}"