From bb492eb8bfd52e316086dedba114938f1589d7c2 Mon Sep 17 00:00:00 2001 From: Neil Lalonde <neillalonde@gmail.com> Date: Fri, 9 Aug 2013 16:58:57 -0400 Subject: [PATCH] Add filtering to staff logs page --- ...admin_logs_staff_action_logs_controller.js | 46 +++++++++++++------ .../admin/routes/admin_logs_routes.js | 15 +++++- .../logs/staff_action_logs.js.handlebars | 34 ++++++++++++-- .../staff_action_logs_list_item.js.handlebars | 4 +- app/assets/stylesheets/admin/admin_base.scss | 25 ++++++++++ .../admin/staff_action_logs_controller.rb | 2 +- app/models/staff_action_log.rb | 5 ++ config/locales/client.en.yml | 3 +- ...add_filter_indexes_to_staff_action_logs.rb | 7 +++ 9 files changed, 115 insertions(+), 26 deletions(-) create mode 100644 db/migrate/20130809204732_add_filter_indexes_to_staff_action_logs.rb diff --git a/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js b/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js index fc87116c2..ddf94c61b 100644 --- a/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js +++ b/app/assets/javascripts/admin/controllers/admin_logs_staff_action_logs_controller.js @@ -8,36 +8,52 @@ **/ Discourse.AdminLogsStaffActionLogsController = Ember.ArrayController.extend(Discourse.Presence, { loading: false, - filters: null, + filters: {}, - show: function(filters) { + show: function() { var self = this; this.set('loading', true); + Discourse.URL.set('queryParams', this.get('filters')); // TODO: doesn't work Discourse.StaffActionLog.findAll(this.get('filters')).then(function(result) { self.set('content', result); self.set('loading', false); }); - }, + }.observes('filters.action_name', 'filters.staff_user', 'filters.target_user'), toggleFullDetails: function(target) { target.set('showFullDetails', !target.get('showFullDetails')); }, - clearFiltersClass: function() { - if (this.get('filters') === null) { - return 'invisible'; - } else { - return ''; - } - }.property('filters'), + filtersExists: function() { + return (_.size(this.get('filters')) > 0); + }.property('filters.action_name', 'filters.staff_user', 'filters.target_user'), - clearFilters: function() { - this.set('filters', null); - this.show(); + clearFilter: function(key) { + delete this.get('filters')[key]; + this.notifyPropertyChange('filters'); + }, + + clearAllFilters: function() { + this.set('filters', {}); }, filterByAction: function(action) { - this.set('filters', {action_name: action}); - this.show(); + this.set('filters.action_name', action); + }, + + actionFilter: function() { + if (this.get('filters.action_name')) { + return I18n.t("admin.logs.staff_actions.actions." + this.get('filters.action_name')); + } else { + return null; + } + }.property('filters.action_name'), + + filterByStaffUser: function(staff_user) { + this.set('filters.staff_user', staff_user.username); + }, + + filterByTargetUser: function(target_user) { + this.set('filters.target_user', target_user.username); } }); diff --git a/app/assets/javascripts/admin/routes/admin_logs_routes.js b/app/assets/javascripts/admin/routes/admin_logs_routes.js index 73cc4917d..b0a5b716b 100644 --- a/app/assets/javascripts/admin/routes/admin_logs_routes.js +++ b/app/assets/javascripts/admin/routes/admin_logs_routes.js @@ -43,7 +43,18 @@ Discourse.AdminLogsStaffActionLogsRoute = Discourse.Route.extend({ this.render('admin/templates/logs/staff_action_logs', {into: 'adminLogs'}); }, - setupController: function() { - return this.controllerFor('adminLogsStaffActionLogs').show(); + setupController: function(controller) { + var queryParams = Discourse.URL.get('queryParams'); + if (queryParams) { + controller.set('filters', queryParams); + } + return controller.show(); + }, + + deactivate: function() { + this._super(); + + // Clear any filters when we leave the route + Discourse.URL.set('queryParams', null); } }); \ No newline at end of file diff --git a/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars b/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars index 3285811c3..76623eea4 100644 --- a/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars +++ b/app/assets/javascripts/admin/templates/logs/staff_action_logs.js.handlebars @@ -1,8 +1,26 @@ - -<p> - <a {{action clearFilters}} {{bindAttr class="clearFiltersClass"}}>{{i18n admin.logs.staff_actions.clear_filters}}</a> -</p> - +<div class="staff-action-logs-controls"> + <a {{action clearAllFilters}} {{bindAttr class=":clear-filters :filter filtersExists::invisible"}}> + <span class="label">{{i18n admin.logs.staff_actions.clear_filters}}</span> + </a> + {{#if actionFilter}} + <a {{action clearFilter "action_name"}} class="filter"> + <span class="label">{{i18n admin.logs.action}}</span>: {{actionFilter}} + <i class="icon icon-remove-sign"></i> + </a> + {{/if}} + {{#if filters.staff_user}} + <a {{action clearFilter "staff_user"}} class="filter"> + <span class="label">{{i18n admin.logs.staff_actions.staff_user}}</span>: {{filters.staff_user}} + <i class="icon icon-remove-sign"></i> + </a> + {{/if}} + {{#if filters.target_user}} + <a {{action clearFilter "target_user"}} class="filter"> + <span class="label">{{i18n admin.logs.staff_actions.target_user}}</span>: {{filters.target_user}} + <i class="icon icon-remove-sign"></i> + </a> + {{/if}} +</div> <div class='table staff-actions'> <div class="heading-container"> @@ -26,3 +44,9 @@ {{/if}} {{/if}} </div> + +{{#unless loading}} + <div class="staff-action-logs-instructions"> + {{i18n admin.logs.staff_actions.instructions}} + </div> +{{/unless}} \ No newline at end of file diff --git a/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars b/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars index 830c5759f..ea423f0a3 100644 --- a/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars +++ b/app/assets/javascripts/admin/templates/logs/staff_action_logs_list_item.js.handlebars @@ -1,6 +1,6 @@ <div class="col value first staff_user"> {{#linkTo 'adminUser' staff_user}}{{avatar staff_user imageSize="tiny"}}{{/linkTo}} - {{#linkTo 'adminUser' staff_user}}{{staff_user.username}}{{/linkTo}} + <a {{action filterByStaffUser staff_user}}>{{staff_user.username}}</a> </div> <div class="col value action"> <a {{action filterByAction action_name}}>{{actionName}}</a> @@ -8,7 +8,7 @@ <div class="col value target_user"> {{#if target_user}} {{#linkTo 'adminUser' target_user}}{{avatar target_user imageSize="tiny"}}{{/linkTo}} - {{#linkTo 'adminUser' target_user}}{{target_user.username}}{{/linkTo}} + <a {{action filterByTargetUser target_user}}>{{target_user.username}}</a> {{else}} — {{/if}} diff --git a/app/assets/stylesheets/admin/admin_base.scss b/app/assets/stylesheets/admin/admin_base.scss index 9f6ceb0a3..1d17eaada 100644 --- a/app/assets/stylesheets/admin/admin_base.scss +++ b/app/assets/stylesheets/admin/admin_base.scss @@ -739,6 +739,31 @@ table { } } +.staff-action-logs-controls { + margin: 0 0 20px 6px; + a.filter { + display: inline-block; + background-color: #ddd; + padding: 3px 10px; + border-radius: 3px; + margin-left: 5px; + color: #444; + &:hover { + color: $link-color-hover; + } + .label { + font-weight: bold; + } + i { + margin-left: 6px; + } + } +} + +.staff-action-logs-instructions { + margin: 50px 0 0 10px; +} + // Ember.ListView .ember-list-view { diff --git a/app/controllers/admin/staff_action_logs_controller.rb b/app/controllers/admin/staff_action_logs_controller.rb index e9b341a63..c31a03d8f 100644 --- a/app/controllers/admin/staff_action_logs_controller.rb +++ b/app/controllers/admin/staff_action_logs_controller.rb @@ -1,7 +1,7 @@ class Admin::StaffActionLogsController < Admin::AdminController def index - staff_action_logs = StaffActionLog.with_filters(params.slice(:action_name)).limit(200).order('id DESC').includes(:staff_user, :target_user).to_a + staff_action_logs = StaffActionLog.with_filters(params.slice(:action_name, :staff_user, :target_user)).limit(200).order('id DESC').includes(:staff_user, :target_user).to_a render_serialized(staff_action_logs, StaffActionLogSerializer) end diff --git a/app/models/staff_action_log.rb b/app/models/staff_action_log.rb index e829a7927..5d9e2628b 100644 --- a/app/models/staff_action_log.rb +++ b/app/models/staff_action_log.rb @@ -17,6 +17,11 @@ class StaffActionLog < ActiveRecord::Base if filters[:action_name] and action_id = StaffActionLog.actions[filters[:action_name].to_sym] query = query.where('action = ?', action_id) end + [:staff_user, :target_user].each do |key| + if filters[key] and obj_id = User.where(username_lower: filters[key].downcase).pluck(:id) + query = query.where("#{key.to_s}_id = ?", obj_id) + end + end query end end diff --git a/config/locales/client.en.yml b/config/locales/client.en.yml index 5443aec44..b83b89a5e 100644 --- a/config/locales/client.en.yml +++ b/config/locales/client.en.yml @@ -1177,7 +1177,8 @@ en: do_nothing: "do nothing" staff_actions: title: "Staff Actions" - clear_filters: "Show All" + instructions: "Click usernames and actions to filter the list. Click avatars to go to user pages." + clear_filters: "Show Everything" staff_user: "Staff User" target_user: "Target User" when: "When" diff --git a/db/migrate/20130809204732_add_filter_indexes_to_staff_action_logs.rb b/db/migrate/20130809204732_add_filter_indexes_to_staff_action_logs.rb new file mode 100644 index 000000000..24aa1ad1f --- /dev/null +++ b/db/migrate/20130809204732_add_filter_indexes_to_staff_action_logs.rb @@ -0,0 +1,7 @@ +class AddFilterIndexesToStaffActionLogs < ActiveRecord::Migration + def change + add_index :staff_action_logs, [:action, :id] + add_index :staff_action_logs, [:staff_user_id, :id] + add_index :staff_action_logs, [:target_user_id, :id] + end +end