FEATURE: Allow filtering users in group assigned tab (#95)
This commit is contained in:
parent
a844da7656
commit
f250dca93f
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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",
|
||||||
this.members.pushObjects(result.members);
|
data: { filter: this.filter, offset: this.offset }
|
||||||
this.set("loading", false);
|
}).then(result => {
|
||||||
}
|
this.members.pushObjects(result.members);
|
||||||
);
|
this.set("loading", false);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -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|}}
|
||||||
|
|
|
@ -117,4 +117,11 @@
|
||||||
grid-area: count;
|
grid-area: count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.search {
|
||||||
|
height: 1em;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.search-div {
|
||||||
|
padding: 13px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
img {
|
a {
|
||||||
width: 1em;
|
width: 1em;
|
||||||
height: 1em;
|
height: 1em;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue