From 34ed6088b9b057e282bf69dee636f40a86ef2376 Mon Sep 17 00:00:00 2001 From: Robin Ward Date: Wed, 17 Jan 2018 13:03:14 -0500 Subject: [PATCH] FEATURE: New modal to show flags received for a user --- .../admin/components/flag-user-lists.js.es6 | 3 ++ .../components/flagged-post-title.js.es6 | 3 ++ .../admin/controllers/admin-user-index.js.es6 | 3 ++ .../modals/admin-flags-received.js.es6 | 17 ++++++++ .../admin/models/flagged-post.js.es6 | 5 +++ .../admin/services/admin-tools.js.es6 | 4 ++ .../templates/components/flag-user-lists.hbs | 32 ++++++++++++++ .../components/flagged-post-title.hbs | 5 +++ .../templates/components/flagged-post.hbs | 43 +------------------ .../templates/modal/admin-flags-received.hbs | 14 ++++++ .../admin/templates/user-index.hbs | 14 +++++- app/controllers/admin/flags_controller.rb | 1 + config/locales/client.en.yml | 3 ++ lib/flag_query.rb | 10 +++++ spec/components/flag_query_spec.rb | 6 +++ 15 files changed, 121 insertions(+), 42 deletions(-) create mode 100644 app/assets/javascripts/admin/components/flag-user-lists.js.es6 create mode 100644 app/assets/javascripts/admin/components/flagged-post-title.js.es6 create mode 100644 app/assets/javascripts/admin/controllers/modals/admin-flags-received.js.es6 create mode 100644 app/assets/javascripts/admin/templates/components/flag-user-lists.hbs create mode 100644 app/assets/javascripts/admin/templates/components/flagged-post-title.hbs create mode 100644 app/assets/javascripts/admin/templates/modal/admin-flags-received.hbs 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)