diff --git a/app/assets/javascripts/discourse/controllers/user_activity_controller.js b/app/assets/javascripts/discourse/controllers/user_activity_controller.js
index e6d86742c..038d786bc 100644
--- a/app/assets/javascripts/discourse/controllers/user_activity_controller.js
+++ b/app/assets/javascripts/discourse/controllers/user_activity_controller.js
@@ -21,5 +21,8 @@ Discourse.UserActivityController = Discourse.ObjectController.extend({
archetypeId: 'private_message',
draftKey: 'new_private_message'
});
- }
+ },
+
+ privateMessagesActive: Em.computed.equal('pmView', 'index'),
+ privateMessagesSentActive: Em.computed.equal('pmView', 'sent')
});
diff --git a/app/assets/javascripts/discourse/routes/user_routes.js b/app/assets/javascripts/discourse/routes/user_routes.js
index 309fa3a22..9ff40c4b1 100644
--- a/app/assets/javascripts/discourse/routes/user_routes.js
+++ b/app/assets/javascripts/discourse/routes/user_routes.js
@@ -159,13 +159,6 @@ Discourse.UserActivityStreamRoute = Discourse.Route.extend({
});
});
-Discourse.UserPrivateMessagesIndexRoute = Discourse.UserActivityStreamRoute.extend({
- userActionType: Discourse.UserAction.TYPES.messages_received
-});
-Discourse.UserPrivateMessagesSentRoute = Discourse.UserActivityStreamRoute.extend({
- userActionType: Discourse.UserAction.TYPES.messages_sent
-});
-
Discourse.UserTopicListRoute = Discourse.Route.extend({
renderTemplate: function() {
@@ -178,12 +171,41 @@ Discourse.UserTopicListRoute = Discourse.Route.extend({
}
});
+Discourse.UserPrivateMessagesIndexRoute = Discourse.UserTopicListRoute.extend({
+ userActionType: Discourse.UserAction.TYPES.messages_received,
+
+ model: function() {
+ return Discourse.TopicList.find('topics/private-messages/' + this.modelFor('user').get('username_lower'));
+ },
+
+ setupController: function(controller, model) {
+ this._super(controller, model);
+ controller.set('hideCategories', true);
+ this.controllerFor('userActivity').set('pmView', 'index');
+ }
+
+});
+Discourse.UserPrivateMessagesSentRoute = Discourse.UserTopicListRoute.extend({
+ userActionType: Discourse.UserAction.TYPES.messages_sent,
+
+ model: function() {
+ return Discourse.TopicList.find('topics/private-messages-sent/' + this.modelFor('user').get('username_lower'));
+ },
+
+ setupController: function(controller, model) {
+ this._super(controller, model);
+ controller.set('hideCategories', true);
+ this.controllerFor('userActivity').set('pmView', 'sent');
+ }
+});
+
Discourse.UserActivityTopicsRoute = Discourse.UserTopicListRoute.extend({
userActionType: Discourse.UserAction.TYPES.topics,
model: function() {
return Discourse.TopicList.find('topics/created-by/' + this.modelFor('user').get('username_lower'));
}
+
});
Discourse.UserActivityFavoritesRoute = Discourse.UserTopicListRoute.extend({
diff --git a/app/assets/javascripts/discourse/templates/list/basic_topic_list.js.handlebars b/app/assets/javascripts/discourse/templates/list/basic_topic_list.js.handlebars
index 5dd68fbe3..2e488e3ef 100644
--- a/app/assets/javascripts/discourse/templates/list/basic_topic_list.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/list/basic_topic_list.js.handlebars
@@ -1,55 +1,65 @@
-
+{{else}}
+
+ {{i18n choose_topic.none_found}}
+
+{{/if}}
\ No newline at end of file
diff --git a/app/assets/javascripts/discourse/templates/user/activity.js.handlebars b/app/assets/javascripts/discourse/templates/user/activity.js.handlebars
index 5887c6b95..bdf292ff0 100644
--- a/app/assets/javascripts/discourse/templates/user/activity.js.handlebars
+++ b/app/assets/javascripts/discourse/templates/user/activity.js.handlebars
@@ -15,9 +15,13 @@
{{#if privateMessageView}}
- {{#each stat in statsPmsOnly}}
- {{activityFilter content=stat user=model}}
- {{/each}}
+ -
+ {{#linkTo 'userPrivateMessages.index' model}}{{i18n user.private_messages}}{{/linkTo}}
+
+ -
+ {{#linkTo 'userPrivateMessages.sent' model}}{{i18n user.private_messages_sent}}{{/linkTo}}
+
+
{{else}}
{{activityFilter count=statsCountNonPM user=model}}
{{#each stat in statsExcludingPms}}
diff --git a/app/assets/javascripts/discourse/templates/user/topics_list.js.handlebars b/app/assets/javascripts/discourse/templates/user/topics_list.js.handlebars
deleted file mode 100644
index 54299a48f..000000000
--- a/app/assets/javascripts/discourse/templates/user/topics_list.js.handlebars
+++ /dev/null
@@ -1 +0,0 @@
-no
\ No newline at end of file
diff --git a/app/assets/javascripts/discourse/views/user/activity_filter_view.js b/app/assets/javascripts/discourse/views/user/activity_filter_view.js
index 373e094b8..fa16b72d8 100644
--- a/app/assets/javascripts/discourse/views/user/activity_filter_view.js
+++ b/app/assets/javascripts/discourse/views/user/activity_filter_view.js
@@ -40,8 +40,7 @@ Discourse.ActivityFilterView = Discourse.View.extend({
}.property('content.action_type'),
url: function() {
- var section = this.get('content.isPM') ? "/private-messages" : "/activity";
- return "/users/" + this.get('user.username_lower') + section + this.get('typeKey');
+ return "/users/" + this.get('user.username_lower') + "/activity" + this.get('typeKey');
}.property('typeKey', 'user.username_lower'),
description: function() {
diff --git a/app/controllers/list_controller.rb b/app/controllers/list_controller.rb
index 68f39931c..f0b6323fb 100644
--- a/app/controllers/list_controller.rb
+++ b/app/controllers/list_controller.rb
@@ -40,6 +40,22 @@ class ListController < ApplicationController
respond(list)
end
+ def private_messages
+ list_opts = build_topic_list_options
+ list = TopicQuery.new(current_user, list_opts).list_private_messages(fetch_user_from_params)
+ list.more_topics_url = url_for(topics_private_messages_path(list_opts.merge(format: 'json', page: next_page)))
+
+ respond(list)
+ end
+
+ def private_messages_sent
+ list_opts = build_topic_list_options
+ list = TopicQuery.new(current_user, list_opts).list_private_messages_sent(fetch_user_from_params)
+ list.more_topics_url = url_for(topics_private_messages_sent_path(list_opts.merge(format: 'json', page: next_page)))
+
+ respond(list)
+ end
+
def category
query = TopicQuery.new(current_user, page: params[:page])
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index 18060c8c2..53899f8c5 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -188,6 +188,7 @@ en:
download_archive: "download archive of my posts"
private_message: "Private Message"
private_messages: "Messages"
+ private_messages_sent: "Sent Messages"
activity_stream: "Activity"
preferences: "Preferences"
bio: "About me"
diff --git a/config/routes.rb b/config/routes.rb
index 632ec2db4..4ed68e9c3 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -216,6 +216,8 @@ Discourse::Application.routes.draw do
post 'topics/timings'
get 'topics/similar_to'
get 'topics/created-by/:username' => 'list#topics_by', as: 'topics_by', constraints: {username: USERNAME_ROUTE_FORMAT}
+ get 'topics/private-messages/:username' => 'list#private_messages', as: 'topics_private_messages', constraints: {username: USERNAME_ROUTE_FORMAT}
+ get 'topics/private-messages-sent/:username' => 'list#private_messages_sent', as: 'topics_private_messages_sent', constraints: {username: USERNAME_ROUTE_FORMAT}
# Topic routes
get 't/:slug/:topic_id/wordpress' => 'topics#wordpress', constraints: {topic_id: /\d+/}
diff --git a/lib/topic_query.rb b/lib/topic_query.rb
index 571f49fcd..6bd63830a 100644
--- a/lib/topic_query.rb
+++ b/lib/topic_query.rb
@@ -135,6 +135,17 @@ class TopicQuery
end
end
+ def list_private_messages(user)
+ list = private_messages_for(user)
+ TopicList.new(:private_messages, user, list)
+ end
+
+ def list_private_messages_sent(user)
+ list = private_messages_for(user)
+ list = list.where(user_id: user.id)
+ TopicList.new(:private_messages, user, list)
+ end
+
def list_uncategorized
create_list(:uncategorized, unordered: true) do |list|
@@ -190,6 +201,22 @@ class TopicQuery
TopicList.new(filter, @user, topics)
end
+ def private_messages_for(user)
+ options = @options
+ options.reverse_merge!(per_page: SiteSetting.topics_per_page)
+
+ # Start with a list of all topics
+ result = Topic.where(id: TopicAllowedUser.where(user_id: user.id).pluck(:topic_id))
+ result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{user.id.to_i})")
+ result = result.order(TopicQuery.order_nocategory_basic_bumped)
+ result = result.private_messages
+
+ result = result.limit(options[:per_page]) unless options[:limit] == false
+ result = result.visible if options[:visible] || @user.nil? || @user.regular?
+ result = result.offset(options[:page].to_i * options[:per_page]) if options[:page]
+ result
+ end
+
# Create results based on a bunch of default options
def default_results(options={})
options.reverse_merge!(@options)