mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
Add front end service for staff controls
This commit is contained in:
@@ -2,7 +2,9 @@ import RestAdapter from 'discourse/adapters/rest';
|
||||
|
||||
export default RestAdapter.extend({
|
||||
pathFor(store, type, findArgs) {
|
||||
return `/admin/flags/${findArgs.filter}.json?rest_api=true`;
|
||||
let args = Object.assign({ rest_api: true }, findArgs);
|
||||
delete args.filter;
|
||||
return `/admin/flags/${findArgs.filter}.json?${$.param(args)}`;
|
||||
},
|
||||
|
||||
afterFindAll(results, helper) {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
||||
import DeleteSpammerModal from 'admin/mixins/delete-spammer-modal';
|
||||
|
||||
export default Ember.Controller.extend(ModalFunctionality, {
|
||||
export default Ember.Controller.extend(ModalFunctionality, DeleteSpammerModal, {
|
||||
removeAfter: null,
|
||||
deleteSpammer: null,
|
||||
|
||||
actions: {
|
||||
agreeDeleteSpammer(user) {
|
||||
|
||||
@@ -1,15 +1,10 @@
|
||||
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
||||
import DeleteSpammerModal from 'admin/mixins/delete-spammer-modal';
|
||||
|
||||
export default Ember.Controller.extend(ModalFunctionality, {
|
||||
export default Ember.Controller.extend(ModalFunctionality, DeleteSpammerModal, {
|
||||
removeAfter: null,
|
||||
|
||||
actions: {
|
||||
deleteSpammer(user) {
|
||||
return this.removeAfter(user.deleteAsSpammer()).then(() => {
|
||||
this.send('closeModal');
|
||||
});
|
||||
},
|
||||
|
||||
deletePostDeferFlag() {
|
||||
let flaggedPost = this.get('model');
|
||||
this.removeAfter(flaggedPost.deferFlags(true)).then(() => {
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
import computed from 'ember-addons/ember-computed-decorators';
|
||||
|
||||
export default Ember.Mixin.create({
|
||||
adminTools: Ember.inject.service(),
|
||||
spammerDetails: null,
|
||||
|
||||
onShow() {
|
||||
let adminTools = this.get('adminTools');
|
||||
let spammerDetails = adminTools.spammerDetails(this.get('model.user'));
|
||||
|
||||
this.setProperties({
|
||||
spammerDetails,
|
||||
canDeleteSpammer: spammerDetails.canDelete && this.get('model.flaggedForSpam')
|
||||
});
|
||||
},
|
||||
|
||||
actions: {
|
||||
deleteSpammer() {
|
||||
let spammerDetails = this.get('spammerDetails');
|
||||
this.removeAfter(spammerDetails.deleteUser()).then(() => {
|
||||
this.send('closeModal');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
@@ -463,59 +463,6 @@ const AdminUser = Discourse.User.extend({
|
||||
bootbox.dialog(message, buttons, { "classes": "delete-user-modal" });
|
||||
},
|
||||
|
||||
deleteAsSpammer() {
|
||||
return this.checkEmail().then(() => {
|
||||
|
||||
let message = I18n.messageFormat('flagging.delete_confirm_MF', {
|
||||
"POSTS": this.get('post_count'),
|
||||
"TOPICS": this.get('topic_count'),
|
||||
email: this.get('email') || I18n.t("flagging.hidden_email_address"),
|
||||
ip_address: this.get('ip_address') || I18n.t("flagging.ip_address_missing")
|
||||
});
|
||||
|
||||
let userId = this.get('id');
|
||||
|
||||
return new Ember.RSVP.Promise((resolve, reject) => {
|
||||
const buttons = [
|
||||
{
|
||||
label: I18n.t("composer.cancel"),
|
||||
class: "cancel-inline",
|
||||
link: true
|
||||
},
|
||||
{
|
||||
label: `${iconHTML('exclamation-triangle')} ` + I18n.t("flagging.yes_delete_spammer"),
|
||||
class: "btn btn-danger confirm-delete",
|
||||
callback() {
|
||||
return ajax(`/admin/users/${userId}.json`, {
|
||||
type: 'DELETE',
|
||||
data: {
|
||||
delete_posts: true,
|
||||
block_email: true,
|
||||
block_urls: true,
|
||||
block_ip: true,
|
||||
delete_as_spammer: true,
|
||||
context: window.location.pathname
|
||||
}
|
||||
}).then(result => {
|
||||
if (result.deleted) {
|
||||
resolve();
|
||||
} else {
|
||||
throw 'failed to delete';
|
||||
}
|
||||
}).catch(() => {
|
||||
bootbox.alert(I18n.t("admin.user.delete_failed"));
|
||||
reject();
|
||||
});
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
bootbox.dialog(message, buttons, {classes: "flagging-delete-spammer"});
|
||||
});
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
loadDetails() {
|
||||
const user = this;
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { loadTopicView } from 'discourse/models/topic';
|
||||
import FlaggedPost from 'admin/models/flagged-post';
|
||||
|
||||
export default Ember.Route.extend({
|
||||
model(params) {
|
||||
@@ -8,7 +7,7 @@ export default Ember.Route.extend({
|
||||
|
||||
return Ember.RSVP.hash({
|
||||
topic,
|
||||
flaggedPosts: FlaggedPost.findAll({
|
||||
flaggedPosts: this.store.findAll('flagged-post', {
|
||||
filter: 'active',
|
||||
topic_id: params.id
|
||||
})
|
||||
|
||||
75
app/assets/javascripts/admin/services/admin-tools.js.es6
Normal file
75
app/assets/javascripts/admin/services/admin-tools.js.es6
Normal file
@@ -0,0 +1,75 @@
|
||||
// A service that can act as a bridge between the front end Discourse application
|
||||
// and the admin application. Use this if you need front end code to access admin
|
||||
// modules. Inject it optionally, and if it exists go to town!
|
||||
|
||||
import AdminUser from 'admin/models/admin-user';
|
||||
import { iconHTML } from 'discourse-common/lib/icon-library';
|
||||
import { ajax } from 'discourse/lib/ajax';
|
||||
|
||||
export default Ember.Service.extend({
|
||||
|
||||
checkSpammer(userId) {
|
||||
return AdminUser.find(userId).then(au => this.spammerDetails(au));
|
||||
},
|
||||
|
||||
spammerDetails(adminUser) {
|
||||
return {
|
||||
deleteUser: () => this._deleteSpammer(adminUser),
|
||||
canDelete: adminUser.get('can_be_deleted') && adminUser.get('can_delete_all_posts')
|
||||
};
|
||||
},
|
||||
|
||||
_deleteSpammer(adminUser) {
|
||||
return adminUser.checkEmail().then(() => {
|
||||
|
||||
let message = I18n.messageFormat('flagging.delete_confirm_MF', {
|
||||
"POSTS": adminUser.get('post_count'),
|
||||
"TOPICS": adminUser.get('topic_count'),
|
||||
email: adminUser.get('email') || I18n.t("flagging.hidden_email_address"),
|
||||
ip_address: adminUser.get('ip_address') || I18n.t("flagging.ip_address_missing")
|
||||
});
|
||||
|
||||
let userId = adminUser.get('id');
|
||||
|
||||
return new Ember.RSVP.Promise((resolve, reject) => {
|
||||
const buttons = [
|
||||
{
|
||||
label: I18n.t("composer.cancel"),
|
||||
class: "cancel-inline",
|
||||
link: true
|
||||
},
|
||||
{
|
||||
label: `${iconHTML('exclamation-triangle')} ` + I18n.t("flagging.yes_delete_spammer"),
|
||||
class: "btn btn-danger confirm-delete",
|
||||
callback() {
|
||||
return ajax(`/admin/users/${userId}.json`, {
|
||||
type: 'DELETE',
|
||||
data: {
|
||||
delete_posts: true,
|
||||
block_email: true,
|
||||
block_urls: true,
|
||||
block_ip: true,
|
||||
delete_as_spammer: true,
|
||||
context: window.location.pathname
|
||||
}
|
||||
}).then(result => {
|
||||
if (result.deleted) {
|
||||
resolve();
|
||||
} else {
|
||||
throw 'failed to delete';
|
||||
}
|
||||
}).catch(() => {
|
||||
bootbox.alert(I18n.t("admin.user.delete_failed"));
|
||||
reject();
|
||||
});
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
bootbox.dialog(message, buttons, {classes: "flagging-delete-spammer"});
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
@@ -10,6 +10,7 @@
|
||||
|
||||
{{plugin-outlet name="flagged-topic-details-header" args=(hash topic=topic)}}
|
||||
</div>
|
||||
|
||||
<div class='topic-flags'>
|
||||
{{flagged-posts
|
||||
flaggedPosts=flaggedPosts
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
icon="thumbs-o-up"
|
||||
label="admin.flags.agree_flag"}}
|
||||
|
||||
{{#if model.canDeleteAsSpammer}}
|
||||
{{#if canDeleteSpammer}}
|
||||
{{d-button
|
||||
title="admin.flags.delete_spammer_title"
|
||||
action=(action "agreeDeleteSpammer" model.user)
|
||||
action="deleteSpammer"
|
||||
class="btn-danger delete-spammer"
|
||||
icon="exclamation-triangle"
|
||||
label="admin.flags.delete_spammer"}}
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
icon="thumbs-o-up"
|
||||
label="admin.flags.delete_post_agree_flag"}}
|
||||
|
||||
{{#if model.canDeleteAsSpammer}}
|
||||
{{#if canDeleteSpammer}}
|
||||
{{d-button
|
||||
class="btn-danger delete-spammer"
|
||||
title="admin.flags.delete_spammer_title"
|
||||
action=(action "deleteSpammer" model.user)
|
||||
action="deleteSpammer"
|
||||
icon="exclamation-triangle"
|
||||
label="admin.flags.delete_spammer"}}
|
||||
{{/if}}
|
||||
|
||||
Reference in New Issue
Block a user