diff --git a/app/assets/javascripts/discourse/controllers/users.js.es6 b/app/assets/javascripts/discourse/controllers/users.js.es6 index f5bb1963025..cb2cafbc1f3 100644 --- a/app/assets/javascripts/discourse/controllers/users.js.es6 +++ b/app/assets/javascripts/discourse/controllers/users.js.es6 @@ -2,11 +2,13 @@ import debounce from 'discourse/lib/debounce'; export default Ember.Controller.extend({ application: Ember.inject.controller(), - queryParams: ["period", "order", "asc", "name"], + queryParams: ["period", "order", "asc", "name", "group", "exclude_usernames"], period: "weekly", order: "likes_received", asc: null, name: "", + group: null, + exclude_usernames: null, showTimeRead: Ember.computed.equal("period", "all"), diff --git a/app/assets/javascripts/discourse/routes/users.js.es6 b/app/assets/javascripts/discourse/routes/users.js.es6 index ab3cbe32060..9cb825c0f47 100644 --- a/app/assets/javascripts/discourse/routes/users.js.es6 +++ b/app/assets/javascripts/discourse/routes/users.js.es6 @@ -3,7 +3,9 @@ export default Discourse.Route.extend({ period: { refreshModel: true }, order: { refreshModel: true }, asc: { refreshModel: true }, - name: { refreshModel: true, replace: true } + name: { refreshModel: true, replace: true }, + group: { refreshModel: true }, + exclude_usernames: { refreshModel: true } }, refreshQueryWithoutTransition: true, @@ -18,7 +20,9 @@ export default Discourse.Route.extend({ period: "weekly", order: "likes_received", asc: null, - name: "" + name: "", + group: null, + exclude_usernames: null }); } }, diff --git a/app/controllers/directory_items_controller.rb b/app/controllers/directory_items_controller.rb index 17f20ea338d..041d8276852 100644 --- a/app/controllers/directory_items_controller.rb +++ b/app/controllers/directory_items_controller.rb @@ -10,6 +10,14 @@ class DirectoryItemsController < ApplicationController result = DirectoryItem.where(period_type: period_type).includes(:user) + if params[:group] + result = result.includes(user: :groups).where(users: {groups: {name: params[:group]}}) + end + + if params[:exclude_usernames] + result = result.references(:user).where.not(users: {username: params[:exclude_usernames].split(",")}) + end + order = params[:order] || DirectoryItem.headings.first if DirectoryItem.headings.include?(order.to_sym) dir = params[:asc] ? 'ASC' : 'DESC' diff --git a/spec/requests/directory_items_controller_spec.rb b/spec/requests/directory_items_controller_spec.rb index a3626fc496f..3c365ba00fc 100644 --- a/spec/requests/directory_items_controller_spec.rb +++ b/spec/requests/directory_items_controller_spec.rb @@ -2,6 +2,10 @@ require 'rails_helper' describe DirectoryItemsController do let!(:user) { Fabricate(:user) } + let!(:evil_trout) { Fabricate(:evil_trout) } + let!(:walter_white) { Fabricate(:walter_white) } + let!(:stage_user) { Fabricate(:staged, username: 'stage_user') } + let!(:group) { Fabricate(:group, users: [evil_trout,stage_user]) } it "requires a `period` param" do get '/directory_items.json' @@ -28,10 +32,6 @@ describe DirectoryItemsController do context "with data" do before do - Fabricate(:evil_trout) - Fabricate(:walter_white) - Fabricate(:staged, username: 'stage_user') - DirectoryItem.refresh! end @@ -77,5 +77,29 @@ describe DirectoryItemsController do expect(json['total_rows_directory_items']).to eq(1) expect(json['directory_items'][0]['user']['username']).to eq('stage_user') end + + it "excludes users by username" do + get '/directory_items.json', params: { period: 'all', exclude_usernames: "stage_user,eviltrout" } + expect(response).to be_success + + json = ::JSON.parse(response.body) + expect(json).to be_present + expect(json['directory_items'].length).to eq(2) + expect(json['total_rows_directory_items']).to eq(2) + expect(json['directory_items'][0]['user']['username']).to eq(walter_white.username) | eq(user.username) + expect(json['directory_items'][1]['user']['username']).to eq(walter_white.username) | eq(user.username) + end + + it "filters users by group" do + get '/directory_items.json', params: { period: 'all', group: group.name } + expect(response).to be_success + + json = ::JSON.parse(response.body) + expect(json).to be_present + expect(json['directory_items'].length).to eq(2) + expect(json['total_rows_directory_items']).to eq(2) + expect(json['directory_items'][0]['user']['username']).to eq(evil_trout.username) | eq(stage_user.username) + expect(json['directory_items'][1]['user']['username']).to eq(evil_trout.username) | eq(stage_user.username) + end end end diff --git a/test/javascripts/acceptance/users-test.js.es6 b/test/javascripts/acceptance/users-test.js.es6 index 99d1aff0633..648b41890d1 100644 --- a/test/javascripts/acceptance/users-test.js.es6 +++ b/test/javascripts/acceptance/users-test.js.es6 @@ -2,12 +2,24 @@ import { acceptance } from "helpers/qunit-helpers"; acceptance("User Directory"); QUnit.test("Visit Page", async assert => { - await visit("/users"); + await visit("/u"); assert.ok($('body.users-page').length, "has the body class"); assert.ok(exists('.directory table tr'), "has a list of users"); }); QUnit.test("Visit All Time", async assert => { - await visit("/users?period=all"); + await visit("/u?period=all"); assert.ok(exists('.time-read'), "has time read column"); }); + +QUnit.test("Visit Without Usernames", async assert => { + await visit("/u?exclude_usernames=system"); + assert.ok($('body.users-page').length, "has the body class"); + assert.ok(exists('.directory table tr'), "has a list of users"); +}); + +QUnit.test("Visit With Group Filter", async assert => { + await visit("/u?group=trust_level_0"); + assert.ok($('body.users-page').length, "has the body class"); + assert.ok(exists('.directory table tr'), "has a list of users"); +}); \ No newline at end of file