diff --git a/app/assets/javascripts/admin/components/flag-user-lists.js.es6 b/app/assets/javascripts/admin/components/flag-user-lists.js.es6
new file mode 100644
index 00000000000..cd843ff7ab6
--- /dev/null
+++ b/app/assets/javascripts/admin/components/flag-user-lists.js.es6
@@ -0,0 +1,3 @@
+export default Ember.Component.extend({
+ classNames: ['flag-user-lists']
+});
diff --git a/app/assets/javascripts/admin/components/flagged-post-title.js.es6 b/app/assets/javascripts/admin/components/flagged-post-title.js.es6
new file mode 100644
index 00000000000..7c1c013375b
--- /dev/null
+++ b/app/assets/javascripts/admin/components/flagged-post-title.js.es6
@@ -0,0 +1,3 @@
+export default Ember.Component.extend({
+ tagName: 'h3'
+});
diff --git a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6
index 266fdbd02c4..bdc783592da 100644
--- a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6
+++ b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6
@@ -64,6 +64,9 @@ export default Ember.Controller.extend(CanCheckEmails, {
anonymize() { return this.get('model').anonymize(); },
destroy() { return this.get('model').destroy(); },
+ showFlagsReceived() {
+ this.get('adminTools').showFlagsReceived(this.get('model'));
+ },
showSuspendModal() {
this.get('adminTools').showSuspendModal(this.get('model'));
},
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6
new file mode 100644
index 00000000000..bf47fb4ae33
--- /dev/null
+++ b/app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6
@@ -0,0 +1,17 @@
+export default Ember.Controller.extend({
+ loadingFlags: null,
+ user: null,
+
+ onShow() {
+ this.set('loadingFlags', true);
+ this.store.findAll('flagged-post', {
+ filter: 'without_custom',
+ user_id: this.get('model.id')
+ }).then(result => {
+ this.set('loadingFlags', false);
+ console.log(result);
+ this.set('flaggedPosts', result);
+ });
+ }
+
+});
diff --git a/app/assets/javascripts/admin/models/flagged-post.js.es6 b/app/assets/javascripts/admin/models/flagged-post.js.es6
index acd3a0e0dfe..c33f3d3c498 100644
--- a/app/assets/javascripts/admin/models/flagged-post.js.es6
+++ b/app/assets/javascripts/admin/models/flagged-post.js.es6
@@ -22,6 +22,11 @@ export default Post.extend({
});
},
+ @computed('post_actions')
+ hasDisposedBy() {
+ return this.get('post_actions').some(action => action.disposed_by);
+ },
+
@computed('post_actions.@each.name_key')
flaggedForSpam() {
return this.get('post_actions').every(action => action.name_key === 'spam');
diff --git a/app/assets/javascripts/admin/services/admin-tools.js.es6 b/app/assets/javascripts/admin/services/admin-tools.js.es6
index fb78de0663b..42be2eadd75 100644
--- a/app/assets/javascripts/admin/services/admin-tools.js.es6
+++ b/app/assets/javascripts/admin/services/admin-tools.js.es6
@@ -17,6 +17,10 @@ export default Ember.Service.extend({
this.siteSettings = getOwner(this).lookup('site-settings:main');
},
+ showFlagsReceived(user) {
+ showModal(`admin-flags-received`, { admin: true, model: user });
+ },
+
checkSpammer(userId) {
return AdminUser.find(userId).then(au => this.spammerDetails(au));
},
diff --git a/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs b/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs
new file mode 100644
index 00000000000..7c793b98bcf
--- /dev/null
+++ b/app/assets/javascripts/admin/templates/components/flag-user-lists.hbs
@@ -0,0 +1,32 @@
+
+
+ {{i18n "admin.flags.flagged_by"}}
+
+
+ {{#each flaggedPost.post_actions as |postAction|}}
+ {{#flag-user user=postAction.user date=postAction.created_at}}
+
+ {{post-action-title postAction.post_action_type_id postAction.name_key}}
+
+ {{/flag-user}}
+ {{/each}}
+
+
+
+{{#if showResolvedBy}}
+
+
+ {{i18n "admin.flags.resolved_by"}}
+
+
+ {{#each flaggedPost.post_actions as |postAction|}}
+ {{#flag-user user=postAction.disposed_by date=postAction.disposed_at}}
+ {{disposition-icon postAction.disposition}}
+ {{#if postAction.staff_took_action}}
+ {{d-icon "gavel" title="admin.flags.took_action"}}
+ {{/if}}
+ {{/flag-user}}
+ {{/each}}
+
+
+{{/if}}
diff --git a/app/assets/javascripts/admin/templates/components/flagged-post-title.hbs b/app/assets/javascripts/admin/templates/components/flagged-post-title.hbs
new file mode 100644
index 00000000000..161a8f9f926
--- /dev/null
+++ b/app/assets/javascripts/admin/templates/components/flagged-post-title.hbs
@@ -0,0 +1,5 @@
+{{#if flaggedPost.topic.isPrivateMessage}}
+ {{d-icon "envelope"}}
+{{/if}}
+{{topic-status topic=flaggedPost.topic}}
+{{{unbound flaggedPost.topic.fancyTitle}}}
diff --git a/app/assets/javascripts/admin/templates/components/flagged-post.hbs b/app/assets/javascripts/admin/templates/components/flagged-post.hbs
index b5a466fd416..acc27324e59 100644
--- a/app/assets/javascripts/admin/templates/components/flagged-post.hbs
+++ b/app/assets/javascripts/admin/templates/components/flagged-post.hbs
@@ -30,13 +30,7 @@
{{#unless hideTitle}}
-
- {{#if flaggedPost.topic.isPrivateMessage}}
- {{d-icon "envelope"}}
- {{/if}}
- {{topic-status topic=flaggedPost.topic}}
- {{{unbound flaggedPost.topic.fancyTitle}}}
-
+ {{flagged-post-title flaggedPost=flaggedPost}}
{{/unless}}
{{#if flaggedPost.postAuthorFlagged}}
{{#if expanded}}
@@ -72,40 +66,7 @@
{{/each}}
-
-
-
- {{i18n "admin.flags.flagged_by"}}
-
-
- {{#each flaggedPost.post_actions as |postAction|}}
- {{#flag-user user=postAction.user date=postAction.created_at}}
-
- {{post-action-title postAction.post_action_type_id postAction.name_key}}
-
- {{/flag-user}}
- {{/each}}
-
-
-
- {{#if showResolvedBy}}
-
-
- {{i18n "admin.flags.resolved_by"}}
-
-
- {{#each flaggedPost.post_actions as |postAction|}}
- {{#flag-user user=postAction.disposed_by date=postAction.disposed_at}}
- {{disposition-icon postAction.disposition}}
- {{#if postAction.staff_took_action}}
- {{d-icon "gavel" title="admin.flags.took_action"}}
- {{/if}}
- {{/flag-user}}
- {{/each}}
-
-
- {{/if}}
-
+ {{flag-user-lists flaggedPost=flaggedPost showResolvedBy=showResolvedBy}}
{{#if suspended}}
diff --git a/app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs b/app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs
new file mode 100644
index 00000000000..9f05993cf90
--- /dev/null
+++ b/app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs
@@ -0,0 +1,14 @@
+{{#d-modal-body rawTitle=(i18n "admin.user.flags_received_by" username=model.username)}}
+ {{#conditional-loading-spinner condition=loadingFlags}}
+ {{#each flaggedPosts as |flaggedPost|}}
+
+
+ {{flagged-post-title flaggedPost=flaggedPost}}
+
+ {{flag-user-lists flaggedPost=flaggedPost showResolvedBy=flaggedPost.hasDisposedBy}}
+
+ {{else}}
+ {{i18n "admin.user.flags_received_none"}}
+ {{/each}}
+ {{/conditional-loading-spinner}}
+{{/d-modal-body}}
diff --git a/app/assets/javascripts/admin/templates/user-index.hbs b/app/assets/javascripts/admin/templates/user-index.hbs
index 96f962a0b50..24122f3877b 100644
--- a/app/assets/javascripts/admin/templates/user-index.hbs
+++ b/app/assets/javascripts/admin/templates/user-index.hbs
@@ -6,6 +6,7 @@
{{i18n 'admin.user.show_public_profile'}}
{{/link-to}}
{{/if}}
+
{{#if model.can_view_action_logs}}
{{d-button action="viewActionLogs" actionParam=model.username icon="list-alt" label="admin.user.action_logs"}}
{{/if}}
@@ -466,7 +467,18 @@
{{i18n 'admin.user.flags_given_received_count'}}
-
{{model.flags_given_count}} / {{model.flags_received_count}}
+
+ {{model.flags_given_count}} / {{model.flags_received_count}}
+
+
+ {{#if model.flags_received_count}}
+ {{d-button
+ action=(action "showFlagsReceived")
+ label="admin.user.show_flags_received"
+ icon="flag"
+ }}
+ {{/if}}
+
{{i18n 'admin.user.private_topics_count'}}
diff --git a/app/controllers/admin/flags_controller.rb b/app/controllers/admin/flags_controller.rb
index 702479e82a7..23096ae963f 100644
--- a/app/controllers/admin/flags_controller.rb
+++ b/app/controllers/admin/flags_controller.rb
@@ -16,6 +16,7 @@ class Admin::FlagsController < Admin::AdminController
posts, topics, users, post_actions, total_rows = FlagQuery.flagged_posts_report(
current_user,
filter: params[:filter],
+ user_id: params[:user_id],
offset: offset,
topic_id: params[:topic_id],
per_page: per_page,
diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml
index ff150f7fb31..32ef2ee9ab8 100644
--- a/config/locales/client.en.yml
+++ b/config/locales/client.en.yml
@@ -3392,6 +3392,9 @@ en:
grant_moderation: 'Grant Moderation'
unsuspend: 'Unsuspend'
suspend: 'Suspend'
+ show_flags_received: "Show Flags Received"
+ flags_received_by: "Flags Received by %{username}"
+ flags_received_none: "This user has not received any flags."
reputation: Reputation
permissions: Permissions
activity: Activity
diff --git a/lib/flag_query.rb b/lib/flag_query.rb
index f8051853c60..15b1591d3f7 100644
--- a/lib/flag_query.rb
+++ b/lib/flag_query.rb
@@ -145,6 +145,16 @@ module FlagQuery
post_actions = post_actions.where("topics.id = ?", opts[:topic_id])
end
+ if opts[:user_id]
+ post_actions = post_actions.where("posts.user_id = ?", opts[:user_id])
+ end
+
+ if opts[:filter] == 'without_custom'
+ return post_actions.where(
+ 'post_action_type_id' => PostActionType.flag_types_without_custom.values
+ )
+ end
+
if opts[:filter] == "old"
post_actions.where("post_actions.disagreed_at IS NOT NULL OR
post_actions.deferred_at IS NOT NULL OR
diff --git a/spec/components/flag_query_spec.rb b/spec/components/flag_query_spec.rb
index 7e39c61feff..592045e6411 100644
--- a/spec/components/flag_query_spec.rb
+++ b/spec/components/flag_query_spec.rb
@@ -59,6 +59,12 @@ describe FlagQuery do
posts = FlagQuery.flagged_posts_report(admin, topic_id: -1)
expect(posts[0]).to be_blank
+ # Try by user
+ posts = FlagQuery.flagged_posts_report(admin, user_id: post.user_id)
+ expect(posts).to be_present
+ posts = FlagQuery.flagged_posts_report(admin, user_id: -1000)
+ expect(posts[0]).to be_blank
+
# chuck post in category a mod can not see and make sure its missing
category = Fabricate(:category)
category.set_permissions(admins: :full)