FEATURE: Allow filtering users in group assigned tab (#95)

This commit is contained in:
Ahmed Gagan 2020-08-13 04:09:14 +05:30 committed by GitHub
parent a844da7656
commit f250dca93f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 73 additions and 10 deletions

View File

@ -144,6 +144,10 @@ module DiscourseAssign
.order('COUNT(users.id) DESC') .order('COUNT(users.id) DESC')
.group('users.id') .group('users.id')
.select('users.*, COUNT(users.id) as "assignments_count"') .select('users.*, COUNT(users.id) as "assignments_count"')
members = members.where("users.name ILIKE :pattern OR users.username_lower ILIKE :pattern", pattern: "%#{params[:filter]}%") if params[:filter]
members = members
.limit(limit) .limit(limit)
.offset(offset) .offset(offset)

View File

@ -1,13 +1,42 @@
import { inject as service } from "@ember/service"; import { inject as service } from "@ember/service";
import Controller, { inject as controller } from "@ember/controller"; import Controller, { inject as controller } from "@ember/controller";
import { ajax } from "discourse/lib/ajax"; import { ajax } from "discourse/lib/ajax";
import { observes } from "discourse-common/utils/decorators"; import discourseComputed, { observes } from "discourse-common/utils/decorators";
import discourseDebounce from "discourse/lib/debounce";
export default Controller.extend({ export default Controller.extend({
router: service(), router: service(),
application: controller(), application: controller(),
loading: false, loading: false,
offset: 0, offset: 0,
filterName: "",
filter: "",
@discourseComputed("site.mobileView")
isDesktop(mobileView) {
return !mobileView;
},
@observes("filterName")
_setFilter: discourseDebounce(function() {
this.set("filter", this.filterName);
}, 500),
@observes("filter")
_filterModel() {
this.set("loading", true);
this.set("offset", 0);
ajax(`/assign/members/${this.group.name}`, {
type: "GET",
data: { filter: this.filter, offset: this.offset }
}).then(result => {
if (this.router.currentRoute.params.filter !== "everyone") {
this.transitionToRoute("group.assigned.show", "everyone");
}
this.set("members", result.members);
this.set("loading", false);
});
},
@observes("model.assignment_count") @observes("model.assignment_count")
assignmentCountChanged() { assignmentCountChanged() {
@ -27,12 +56,13 @@ export default Controller.extend({
if (this.model.members.length >= this.offset + 50) { if (this.model.members.length >= this.offset + 50) {
this.set("loading", true); this.set("loading", true);
this.set("offset", this.offset + 50); this.set("offset", this.offset + 50);
ajax(`/assign/members/${this.group.name}?offset=${this.offset}`).then( ajax(`/assign/members/${this.group.name}`, {
result => { type: "GET",
data: { filter: this.filter, offset: this.offset }
}).then(result => {
this.members.pushObjects(result.members); this.members.pushObjects(result.members);
this.set("loading", false); this.set("loading", false);
} });
);
} }
}, },

View File

@ -1,5 +1,10 @@
<section class="user-secondary-navigation group-assignments"> <section class="user-secondary-navigation group-assignments">
{{#mobile-nav class="activity-nav" desktopClass="action-list activity-list nav-stacked" currentPath=router._router.currentPath}} {{#mobile-nav class="activity-nav" desktopClass="action-list activity-list nav-stacked" currentPath=router._router.currentPath}}
{{#if isDesktop}}
<div class="search-div">
{{input type="text" placeholder=(i18n "discourse_assign.sidebar_name_filter_placeholder") value=filterName class="search"}}
</div>
{{/if}}
{{#load-more selector=".activity-nav li" action=(action "loadMore")}} {{#load-more selector=".activity-nav li" action=(action "loadMore")}}
{{group-assigned-filter show-avatar=false filter="everyone" routeType=route_type assignment_count=group.assignment_count}} {{group-assigned-filter show-avatar=false filter="everyone" routeType=route_type assignment_count=group.assignment_count}}
{{#each members as |member|}} {{#each members as |member|}}

View File

@ -117,4 +117,11 @@
grid-area: count; grid-area: count;
} }
} }
.search {
height: 1em;
width: 100%;
}
.search-div {
padding: 13px;
}
} }

View File

@ -39,7 +39,7 @@
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
img { a {
width: 1em; width: 1em;
height: 1em; height: 1em;
} }

View File

@ -11,6 +11,7 @@ en:
add_unassigned_filter: "Add 'unassigned' filter to category" add_unassigned_filter: "Add 'unassigned' filter to category"
cant_act: "You cannot act on flags that have been assigned to other users" cant_act: "You cannot act on flags that have been assigned to other users"
cant_act_unclaimed: "You must claim this topic before acting on flags." cant_act_unclaimed: "You must claim this topic before acting on flags."
sidebar_name_filter_placeholder: "Name/Username"
assigned: "Assigned" assigned: "Assigned"
group_everyone: "Everyone" group_everyone: "Everyone"
assigned_to: "Assigned to" assigned_to: "Assigned to"

View File

@ -8,9 +8,9 @@ RSpec.describe DiscourseAssign::AssignController do
before { SiteSetting.assign_enabled = true } before { SiteSetting.assign_enabled = true }
let(:default_allowed_group) { Group.find_by(name: 'staff') } let(:default_allowed_group) { Group.find_by(name: 'staff') }
let(:user) { Fabricate(:admin, groups: [default_allowed_group]) } let(:user) { Fabricate(:admin, groups: [default_allowed_group], name: 'Robin Ward', username: 'eviltrout') }
let(:post) { Fabricate(:post) } let(:post) { Fabricate(:post) }
let(:user2) { Fabricate(:active_user) } let(:user2) { Fabricate(:active_user, name: 'David Tylor', username: 'david') }
let(:nonadmin) { Fabricate(:user, groups: [default_allowed_group]) } let(:nonadmin) { Fabricate(:user, groups: [default_allowed_group]) }
let(:normal_user) { Fabricate(:user) } let(:normal_user) { Fabricate(:user) }
let(:normal_admin) { Fabricate(:admin) } let(:normal_admin) { Fabricate(:admin) }
@ -231,6 +231,22 @@ RSpec.describe DiscourseAssign::AssignController do
expect(JSON.parse(response.body)['members'].map { |m| m['id'] }).to match_array([user.id, user2.id]) expect(JSON.parse(response.body)['members'].map { |m| m['id'] }).to match_array([user.id, user2.id])
end end
it "returns members as according to filter" do
sign_in(user)
get "/assign/members/#{get_assigned_allowed_group_name}.json", params: { filter: 'a' }
expect(response.status).to eq(200)
expect(JSON.parse(response.body)['members'].map { |m| m['id'] }).to match_array([user.id, user2.id])
get "/assign/members/#{get_assigned_allowed_group_name}.json", params: { filter: 'david' }
expect(response.status).to eq(200)
expect(JSON.parse(response.body)['members'].map { |m| m['id'] }).to match_array([user2.id])
get "/assign/members/#{get_assigned_allowed_group_name}.json", params: { filter: 'Tylor' }
expect(response.status).to eq(200)
expect(JSON.parse(response.body)['members'].map { |m| m['id'] }).to match_array([user2.id])
end
it "404 error to non-group-members" do it "404 error to non-group-members" do
sign_in(normal_user) sign_in(normal_user)