diff --git a/assets/javascripts/discourse-assign/assigned-messages-route-map.js.es6 b/assets/javascripts/discourse-assign/assigned-messages-route-map.js.es6 index 32ddd98..05e216e 100644 --- a/assets/javascripts/discourse-assign/assigned-messages-route-map.js.es6 +++ b/assets/javascripts/discourse-assign/assigned-messages-route-map.js.es6 @@ -1,6 +1,7 @@ export default { resource: 'user.userPrivateMessages', map() { - this.route('assigned'); + this.route('assigned'); + this.route('assignedArchived'); } }; diff --git a/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-archived-messages.hbs b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-archived-messages.hbs new file mode 100644 index 0000000..b75e32f --- /dev/null +++ b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-archived-messages.hbs @@ -0,0 +1,3 @@ +{{#link-to 'userPrivateMessages.assignedArchived' model}} + {{i18n 'user.messages.archive'}} +{{/link-to}} diff --git a/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-archived-messages.js.es6 b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-archived-messages.js.es6 new file mode 100644 index 0000000..f9717a6 --- /dev/null +++ b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-archived-messages.js.es6 @@ -0,0 +1,11 @@ +import { shouldShowAssigned } from "discourse/plugins/discourse-assign/discourse-assign/connectors/user-messages-nav/assigned-messages"; + +export default { + setupComponent() { + this.set('classNames', ['archive']); + }, + + shouldRender(args, component) { + return shouldShowAssigned(args, component); + } +}; diff --git a/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.hbs b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.hbs index 5ec9f87..58984c4 100644 --- a/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.hbs +++ b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.hbs @@ -1,3 +1,4 @@ {{#link-to 'userPrivateMessages.assigned' model}} + {{d-icon "user-plus" class="glyph"}} {{i18n 'discourse_assign.assigned'}} {{/link-to}} diff --git a/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.js.es6 b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.js.es6 index ddcd421..153654e 100644 --- a/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.js.es6 +++ b/assets/javascripts/discourse-assign/connectors/user-messages-nav/assigned-messages.js.es6 @@ -1,6 +1,10 @@ +export function shouldShowAssigned(args, component) { + const needsButton = component.currentUser && component.currentUser.get('staff'); + return needsButton && (!component.get('site.mobileView') || args.model.get('isPrivateMessage')); +} + export default { shouldRender(args, component) { - const needsButton = component.currentUser && component.currentUser.get('staff'); - return needsButton && (!component.get('site.mobileView') || args.model.get('isPrivateMessage')); + return shouldShowAssigned(args, component); } }; diff --git a/assets/javascripts/discourse-assign/routes/user-private-messages-assigned-archived.js.es6 b/assets/javascripts/discourse-assign/routes/user-private-messages-assigned-archived.js.es6 new file mode 100644 index 0000000..5d395ae --- /dev/null +++ b/assets/javascripts/discourse-assign/routes/user-private-messages-assigned-archived.js.es6 @@ -0,0 +1,10 @@ +import createPMRoute from "discourse/routes/build-private-messages-route"; + +export default createPMRoute('assignedArchived', 'private-messages-assigned').extend({ + model() { + return this.store.findFiltered("topicList", { + filter: `topics/private-messages-assigned/${this.modelFor("user").get("username_lower")}`, + params: { status: "archived" } + }); + } +}); diff --git a/plugin.rb b/plugin.rb index 0180d0a..5a8bdf2 100644 --- a/plugin.rb +++ b/plugin.rb @@ -115,9 +115,24 @@ after_initialize do add_to_class(:topic_query, :list_private_messages_assigned) do |user| list = private_messages_for(user, :all) - list = list.where("topics.id IN ( + user_id = user.id.to_s + + list = list + .joins("LEFT JOIN group_archived_messages gm ON gm.topic_id = topics.id") + .joins(" + LEFT JOIN user_archived_messages um ON um.topic_id = topics.id AND um.user_id = #{user_id} + ") + .where("topics.id IN ( SELECT topic_id FROM topic_custom_fields WHERE name = 'assigned_to_id' AND value = ? - )", user.id.to_s) + )", user_id) + + list = + if @options[:status] == "archived" + list.where("gm.topic_id IS NOT NULL OR um.topic_id IS NOT NULL") + else + list.where("gm.topic_id IS NULL AND um.topic_id IS NULL") + end + create_list(:private_messages, {}, list) end diff --git a/spec/components/topic_query_spec.rb b/spec/components/topic_query_spec.rb new file mode 100644 index 0000000..9728e8c --- /dev/null +++ b/spec/components/topic_query_spec.rb @@ -0,0 +1,90 @@ +require 'rails_helper' + +describe TopicQuery do + describe '#list_private_messages_assigned' do + let(:user) { Fabricate(:user) } + let(:user2) { Fabricate(:user) } + + let(:user_topic) do + Fabricate(:private_message_topic, + topic_allowed_users: [ + Fabricate.build(:topic_allowed_user, user: user), + Fabricate.build(:topic_allowed_user, user: user2) + ], + posts: [Fabricate(:post)] + ) + end + + let(:assigned_topic) do + topic = Fabricate(:private_message_topic, + topic_allowed_users: [ + Fabricate.build(:topic_allowed_user, user: user), + Fabricate.build(:topic_allowed_user, user: user2) + ], + posts: [Fabricate(:post)] + ) + + TopicAssigner.new(topic, user).assign(user) + topic + end + + let(:group) { Fabricate(:group).add(user) } + + let(:group_assigned_topic) do + topic = Fabricate(:private_message_topic, + topic_allowed_users: [], + topic_allowed_groups: [ + Fabricate.build(:topic_allowed_group, group: group) + ], + posts: [Fabricate(:post)] + ) + + TopicAssigner.new(topic, user).assign(user) + topic + end + + let(:options) { { status: 'archived' } } + + before do + SiteSetting.assign_enabled = true + user_topic + assigned_topic + group_assigned_topic + end + + it 'should return the right topics' do + expect(TopicQuery.new(user).list_private_messages_assigned(user).topics) + .to contain_exactly(assigned_topic, group_assigned_topic) + + UserArchivedMessage.archive!(user2.id, assigned_topic.id) + + expect( + TopicQuery.new(user).list_private_messages_assigned(user).topics + ).to contain_exactly(assigned_topic, group_assigned_topic) + + expect( + TopicQuery.new(user, options).list_private_messages_assigned(user).topics + ).to eq([]) + + UserArchivedMessage.archive!(user.id, assigned_topic.id) + + expect( + TopicQuery.new(user).list_private_messages_assigned(user).topics + ).to contain_exactly(group_assigned_topic) + + expect( + TopicQuery.new(user, options).list_private_messages_assigned(user).topics + ).to contain_exactly(assigned_topic) + + GroupArchivedMessage.archive!(group.id, group_assigned_topic.id) + + expect( + TopicQuery.new(user).list_private_messages_assigned(user).topics + ).to eq([]) + + expect( + TopicQuery.new(user, options).list_private_messages_assigned(user).topics + ).to contain_exactly(assigned_topic, group_assigned_topic) + end + end +end