/** A data model representing actions users have taken @class UserAction @extends Discourse.Model @namespace Discourse @module Discourse **/ 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.User.current('username')); if (action === null || actions.indexOf(action) >= 0) { if (this.get('isPM')) { icon = ''; if (sameUser) { sentence = I18n.t('user_action.sent_by_you', { userUrl: this.get('userUrl') }); } else { sentence = I18n.t('user_action.sent_by_user', { user: this.get('name'), userUrl: this.get('userUrl') }); } } else { if (sameUser) { sentence = I18n.t('user_action.posted_by_you', { userUrl: this.get('userUrl') }); } else { sentence = I18n.t('user_action.posted_by_user', { user: this.get('name'), userUrl: this.get('userUrl') }); } } } else if (action === ua.NEW_TOPIC) { if (sameUser) { sentence = I18n.t('user_action.you_posted_topic', { userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') }); } else { sentence = I18n.t('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 = I18n.t('user_action.you_replied_to_post', { post_number: '#' + this.get('reply_to_post_number'), userUrl: this.get('userUrl'), postUrl: this.get('postUrl') }); } else { sentence = I18n.t('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 = I18n.t('user_action.you_replied_to_topic', { userUrl: this.get('userUrl'), topicUrl: this.get('replyUrl') }); } else { sentence = I18n.t('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 = I18n.t('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.User.current('username')) { sentence = I18n.t('user_action.user_mentioned_you', { user: this.get('name'), user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') }); } else { sentence = I18n.t('user_action.user_mentioned_user', { user: this.get('name'), another_user: this.get('target_name'), user1Url: this.get('userUrl'), user2Url: this.get('targetUserUrl') }); } } } else { return ""; } 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(), postUrl: function() { return Discourse.Utilities.postUrl(this.get('slug'), this.get('topic_id'), this.get('post_number')); }.property(), replyUrl: function() { return Discourse.Utilities.postUrl(this.get('slug'), this.get('topic_id'), this.get('reply_to_post_number')); }.property(), isPM: function() { var a = this.get('action_type'); return a === Discourse.UserAction.NEW_PRIVATE_MESSAGE || a === Discourse.UserAction.GOT_PRIVATE_MESSAGE; }.property(), isPostAction: function() { var a = this.get('action_type'); return a === Discourse.UserAction.RESPONSE || a === Discourse.UserAction.POST || a === Discourse.UserAction.NEW_TOPIC; }.property(), addChild: function(action) { var groups = this.get("childGroups"); if (!groups) { groups = { likes: Discourse.UserActionGroup.create({ icon: "icon-heart" }), stars: Discourse.UserActionGroup.create({ icon: "icon-star" }), edits: Discourse.UserActionGroup.create({ icon: "icon-pencil" }), bookmarks: Discourse.UserActionGroup.create({ icon: "icon-bookmark" }) }; } this.set("childGroups", groups); var ua = Discourse.UserAction; var bucket = (function() { switch (action.action_type) { case ua.LIKE: case ua.WAS_LIKED: return "likes"; case ua.STAR: return "stars"; case ua.EDIT: return "edits"; case ua.BOOKMARK: return "bookmarks"; } })(); var current = groups[bucket]; if (current) { current.push(action); } }, children: function() { var g = this.get("childGroups"); var rval = []; if (g) { rval = [g.likes, g.stars, g.edits, g.bookmarks].filter(function(i) { return i.get("items") && i.get("items").length > 0; }); } return rval; }.property("childGroups"), switchToActing: function() { this.set('username', this.get('acting_username')); this.set('avatar_template', this.get('acting_avatar_template')); this.set('name', this.get('acting_name')); } }); Discourse.UserAction.reopenClass({ collapseStream: function(stream) { var collapse, collapsed, pos, uniq; collapse = [this.LIKE, this.WAS_LIKED, this.STAR, this.EDIT, this.BOOKMARK]; uniq = {}; collapsed = Em.A(); pos = 0; _.each(stream, function(item) { var current, found, key; key = "" + item.topic_id + "-" + item.post_number; found = uniq[key]; if (found === void 0) { if (collapse.indexOf(item.action_type) >= 0) { current = Discourse.UserAction.create(item); current.set('action_type', null); current.set('description', null); item.switchToActing(); current.addChild(item); } else { current = item; } uniq[key] = pos; collapsed[pos] = current; pos += 1; } else { if (collapse.indexOf(item.action_type) >= 0) { item.switchToActing(); return collapsed[found].addChild(item); } else { collapsed[found].set('action_type', item.get('action_type')); return collapsed[found].set('description', item.get('description')); } } }); return collapsed; }, // in future we should be sending this through from the server LIKE: 1, WAS_LIKED: 2, BOOKMARK: 3, NEW_TOPIC: 4, POST: 5, RESPONSE: 6, MENTION: 7, QUOTE: 9, STAR: 10, EDIT: 11, NEW_PRIVATE_MESSAGE: 12, GOT_PRIVATE_MESSAGE: 13 }); Discourse.UserAction.reopenClass({ statGroups: (function() { var g = {}; g[Discourse.UserAction.RESPONSE] = [Discourse.UserAction.RESPONSE, Discourse.UserAction.MENTION, Discourse.UserAction.QUOTE]; return g; })() });