FEATURE: Display link with count to user's assigned messages page.

This commit is contained in:
Guo Xiang Tan 2018-05-23 18:16:36 +08:00
parent 3905f8f992
commit 22108df6be
5 changed files with 104 additions and 8 deletions

View File

@ -1,11 +1,18 @@
{{#if canUnassignAll}}
<div class='assign-controls'>
<div class='assign-controls'>
{{#if model.topic_list.assigned_messages_count}}
{{#link-to 'userPrivateMessages.assigned' user.model class="btn assign-messages-assigned"}}
{{d-icon "envelope" class="glyph"}}
{{i18n 'user.messages.assigned_title' count=model.topic_list.assigned_messages_count}}
{{/link-to}}
{{/if}}
{{#if canUnassignAll}}
{{d-button
action=(action "unassignAll")
icon="times"
label="discourse_assign.unassign_all.title"
class="btn-danger"}}
</div>
{{/if}}
{{/if}}
</div>
{{outlet}}

View File

@ -3,6 +3,10 @@
display: flex;
justify-content: flex-end;
margin-bottom: 0.5em;
.assign-messages-assigned {
margin-right: 0.5em;
}
}
}

View File

@ -28,4 +28,5 @@ en:
help: "Assign topic to yourself"
user:
messages:
assigned_title: "Assigned Messages (%{count})"
assigned: "Assigned"

View File

@ -123,13 +123,21 @@ after_initialize do
end
add_to_class(:topic_query, :list_private_messages_assigned) do |user|
list = private_messages_for(user, :all)
list = list.where("topics.id IN (
SELECT topic_id FROM topic_custom_fields WHERE name = 'assigned_to_id' AND value = ?
)", user.id.to_s)
list = private_messages_assigned_query(user)
create_list(:private_messages, {}, list)
end
add_to_class(:topic_query, :private_messages_assigned_query) do |user|
list = private_messages_for(user, :all)
list = list.where("
topics.id IN (
SELECT topic_id FROM topic_custom_fields
WHERE name = 'assigned_to_id'
AND value = ?)
", user.id.to_s)
end
add_to_class(:topic, :assigned_to_user) do
@assigned_to_user ||
if user_id = custom_fields["assigned_to_id"]
@ -145,6 +153,22 @@ after_initialize do
(SiteSetting.assigns_public || scope.is_staff?) && object.assigned_to_user
end
add_to_serializer(:topic_list, :assigned_messages_count) do
TopicQuery.new(object.current_user, guardian: scope, limit: false)
.private_messages_assigned_query(object.current_user)
.count
end
add_to_serializer(:topic_list, 'include_assigned_messages_count?') do
return unless SiteSetting.assigns_public
options = object.instance_variable_get(:@opts)
if assigned_username = options[:assigned]&.downcase
assigned_username == object.current_user&.username_lower
end
end
add_to_serializer(:topic_view, :assigned_to_user, false) do
DiscourseAssign::Helpers.build_assigned_to_user(assigned_to_user_id, object.topic)
end

View File

@ -0,0 +1,60 @@
require 'rails_helper'
RSpec.describe TopicListSerializer do
let(:user) { Fabricate(:user) }
let(:private_message_topic) do
Fabricate(:private_message_topic,
posts: [Fabricate(:post)],
topic_allowed_users: [
Fabricate.build(:topic_allowed_user, user: user)
]
)
end
let(:assigned_topic) do
topic = Fabricate(:private_message_topic,
posts: [Fabricate(:post)],
topic_allowed_users: [
Fabricate.build(:topic_allowed_user, user: user)
]
)
TopicAssigner.new(topic, user).assign(user)
topic
end
let(:guardian) { Guardian.new(user) }
let(:serializer) { TopicListSerializer.new(topic_list, scope: guardian) }
before do
SiteSetting.assign_enabled = true
SiteSetting.assigns_public = true
end
describe '#assigned_messages_count' do
let(:topic_list) do
TopicQuery.new(user, assigned: user.username).list_private_messages_assigned(user)
end
before do
assigned_topic
end
it 'should include right attribute' do
expect(serializer.as_json[:topic_list][:assigned_messages_count])
.to eq(1)
end
describe 'when assigns are not public' do
before do
SiteSetting.assigns_public = false
end
it 'should not include the attributes' do
expect(serializer.as_json[:topic_list][:assigned_messages_count])
.to eq(nil)
end
end
end
end