123 lines
2.9 KiB
JavaScript
123 lines
2.9 KiB
JavaScript
import { ajax } from "discourse/lib/ajax";
|
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
|
import Group from "discourse/models/group";
|
|
import {
|
|
default as computed,
|
|
observes
|
|
} from "ember-addons/ember-computed-decorators";
|
|
import debounce from "discourse/lib/debounce";
|
|
|
|
export default Ember.Controller.extend({
|
|
queryParams: ["order", "desc", "filter"],
|
|
order: "",
|
|
desc: null,
|
|
loading: false,
|
|
limit: null,
|
|
offset: null,
|
|
filter: null,
|
|
filterInput: null,
|
|
application: Ember.inject.controller(),
|
|
|
|
@observes("filterInput")
|
|
_setFilter: debounce(function() {
|
|
this.set("filter", this.filterInput);
|
|
}, 500),
|
|
|
|
@observes("order", "desc", "filter")
|
|
refreshRequesters(force) {
|
|
if (this.loading || !this.model) {
|
|
return;
|
|
}
|
|
|
|
if (
|
|
!force &&
|
|
this.count &&
|
|
this.get("model.requesters.length") >= this.count
|
|
) {
|
|
this.set("application.showFooter", true);
|
|
return;
|
|
}
|
|
|
|
this.set("loading", true);
|
|
this.set("application.showFooter", false);
|
|
|
|
Group.loadMembers(
|
|
this.get("model.name"),
|
|
force ? 0 : this.get("model.requesters.length"),
|
|
this.limit,
|
|
{
|
|
order: this.order,
|
|
desc: this.desc,
|
|
filter: this.filter,
|
|
requesters: true
|
|
}
|
|
).then(result => {
|
|
const requesters = (!force && this.get("model.requesters")) || [];
|
|
requesters.addObjects(result.members.map(m => Discourse.User.create(m)));
|
|
this.set("model.requesters", requesters);
|
|
|
|
this.setProperties({
|
|
loading: false,
|
|
count: result.meta.total,
|
|
limit: result.meta.limit,
|
|
offset: Math.min(
|
|
result.meta.offset + result.meta.limit,
|
|
result.meta.total
|
|
)
|
|
});
|
|
});
|
|
},
|
|
|
|
@computed("model.requesters")
|
|
hasRequesters(requesters) {
|
|
return requesters && requesters.length > 0;
|
|
},
|
|
|
|
@computed
|
|
filterPlaceholder() {
|
|
if (this.currentUser && this.currentUser.admin) {
|
|
return "groups.members.filter_placeholder_admin";
|
|
} else {
|
|
return "groups.members.filter_placeholder";
|
|
}
|
|
},
|
|
|
|
handleRequest(data) {
|
|
ajax(`/groups/${this.get("model.id")}/handle_membership_request.json`, {
|
|
data,
|
|
type: "PUT"
|
|
}).catch(popupAjaxError);
|
|
},
|
|
|
|
actions: {
|
|
loadMore() {
|
|
this.refreshRequesters();
|
|
},
|
|
|
|
acceptRequest(user) {
|
|
this.handleRequest({ user_id: user.get("id"), accept: true });
|
|
user.setProperties({
|
|
request_accepted: true,
|
|
request_denied: false
|
|
});
|
|
},
|
|
|
|
undoAcceptRequest(user) {
|
|
ajax("/groups/" + this.get("model.id") + "/members.json", {
|
|
type: "DELETE",
|
|
data: { user_id: user.get("id") }
|
|
}).then(() => {
|
|
user.set("request_undone", true);
|
|
});
|
|
},
|
|
|
|
denyRequest(user) {
|
|
this.handleRequest({ user_id: user.get("id") });
|
|
user.setProperties({
|
|
request_accepted: false,
|
|
request_denied: true
|
|
});
|
|
}
|
|
}
|
|
});
|