Add Suspend User to flags page

This commit is contained in:
Robin Ward
2017-09-14 14:10:39 -04:00
parent 079f108ceb
commit 09ed2ed749
17 changed files with 177 additions and 55 deletions
@@ -1,7 +1,10 @@
import showModal from 'discourse/lib/show-modal';
import computed from 'ember-addons/ember-computed-decorators';
export default Ember.Component.extend({
adminTools: Ember.inject.service(),
expanded: false,
suspended: false,
tagName: 'div',
classNameBindings: [
@@ -10,6 +13,11 @@ export default Ember.Component.extend({
'flaggedPost.deleted'
],
@computed('filter')
canAct(filter) {
return filter === 'active';
},
removeAfter(promise) {
return promise.then(() => {
this.attrs.removePost();
@@ -44,6 +52,18 @@ export default Ember.Component.extend({
this.get('flaggedPost').expandHidden().then(() => {
this.set('expanded', true);
});
},
showSuspendModal() {
let post = this.get('flaggedPost');
let user = post.get('user');
this.get('adminTools').showSuspendModal(
user,
{
post,
successCallback: result => this.set('suspended', result.suspended)
}
);
}
}
});
@@ -6,34 +6,45 @@ export default Ember.Controller.extend(ModalFunctionality, {
suspendUntil: null,
reason: null,
message: null,
loading: false,
suspending: false,
user: null,
post: null,
successCallback: null,
onShow() {
this.setProperties({
suspendUntil: null,
reason: null,
message: null,
loading: false
suspending: false,
loadingUser: true,
post: null,
successCallback: null,
});
},
@computed('suspendUntil', 'reason', 'loading')
submitDisabled(suspendUntil, reason, loading) {
return (loading || Ember.isEmpty(suspendUntil) || !reason || reason.length < 1);
@computed('suspendUntil', 'reason', 'suspending')
submitDisabled(suspendUntil, reason, suspending) {
return (suspending || Ember.isEmpty(suspendUntil) || !reason || reason.length < 1);
},
actions: {
suspend() {
if (this.get('submitDisabled')) { return; }
this.set('loading', true);
this.get('model').suspend({
this.set('suspending', true);
this.get('user').suspend({
suspend_until: this.get('suspendUntil'),
reason: this.get('reason'),
message: this.get('message')
}).then(() => {
message: this.get('message'),
post_id: this.get('post.id')
}).then(result => {
this.send('closeModal');
}).catch(popupAjaxError).finally(() => this.set('loading', false));
let callback = this.get('successCallback');
if (callback) {
callback(result);
}
}).catch(popupAjaxError).finally(() => this.set('suspending', false));
}
}
@@ -9,7 +9,7 @@ import TL3Requirements from 'admin/models/tl3-requirements';
import { userPath } from 'discourse/lib/url';
const AdminUser = Discourse.User.extend({
adminUserView: true,
customGroups: Ember.computed.filter("groups", g => !g.automatic && Group.create(g)),
automaticGroups: Ember.computed.filter("groups", g => g.automatic && Group.create(g)),
@@ -20,12 +20,28 @@ export default Ember.Service.extend({
};
},
showSuspendModal(user) {
showModal('admin-suspend-user', {
model: user,
showSuspendModal(user, opts) {
opts = opts || {};
let controller = showModal('admin-suspend-user', {
admin: true,
modalClass: 'suspend-user-modal'
});
if (opts.post) {
controller.set('post', opts.post);
}
let promise = user.adminUserView ?
Ember.RSVP.resolve(user) :
AdminUser.find(user.get('id'));
promise.then(loadedUser => {
controller.setProperties({
user: loadedUser,
loadingUser: false,
successCallback: opts.successCallback
});
});
},
_deleteSpammer(adminUser) {
@@ -97,6 +97,12 @@
{{/if}}
</div>
{{#if suspended}}
<div class='suspended-message'>
The user was suspended for this post.
</div>
{{/if}}
{{#if canAct}}
<div class='flagged-post-controls'>
{{d-button
@@ -136,6 +142,15 @@
action="showDeleteFlagModal"
icon="trash-o"
label="admin.flags.delete"}}
{{#unless suspended}}
{{d-button
class="btn-danger suspend-user"
icon="ban"
label="admin.flags.suspend_user"
title="admin.flags.suspend_user_title"
action=(action "showSuspendModal")}}
{{/unless}}
</div>
{{/if}}
</div>
@@ -4,7 +4,7 @@
{{#each flaggedPosts as |flaggedPost|}}
{{flagged-post
flaggedPost=flaggedPost
canAct=canAct
filter=filter
showResolvedBy=showResolvedBy
removePost=(action "removePost" flaggedPost)
hideTitle=topic}}
@@ -1,39 +1,49 @@
{{#d-modal-body title="admin.user.suspend_modal_title"}}
<div class='until-controls'>
<label>
{{future-date-input
class="suspend-until"
label="admin.user.suspend_duration"
input=suspendUntil}}
</label>
</div>
{{#conditional-loading-spinner condition=loadingUser}}
<div class='reason-controls'>
<label>
<div class='suspend-reason-label'>
{{#if siteSettings.hide_suspension_reasons}}
{{{i18n 'admin.user.suspend_reason_hidden_label'}}}
{{else}}
{{{i18n 'admin.user.suspend_reason_label'}}}
{{/if}}
{{#if user.canSuspend}}
<div class='until-controls'>
<label>
{{future-date-input
class="suspend-until"
label="admin.user.suspend_duration"
input=suspendUntil}}
</label>
</div>
{{text-field
value=reason
class="suspend-reason"
placeholderKey="admin.user.suspend_reason_placeholder"}}
</label>
</div>
<div class='reason-controls'>
<label>
<div class='suspend-reason-label'>
{{#if siteSettings.hide_suspension_reasons}}
{{{i18n 'admin.user.suspend_reason_hidden_label'}}}
{{else}}
{{{i18n 'admin.user.suspend_reason_label'}}}
{{/if}}
</div>
<label>
<div class='suspend-message-label'>
{{i18n "admin.user.suspend_message"}}
</div>
{{textarea
value=message
class="suspend-message"
placeholder=(i18n "admin.user.suspend_message_placeholder")}}
</label>
{{text-field
value=reason
class="suspend-reason"
placeholderKey="admin.user.suspend_reason_placeholder"}}
</label>
</div>
<label>
<div class='suspend-message-label'>
{{i18n "admin.user.suspend_message"}}
</div>
{{textarea
value=message
class="suspend-message"
placeholder=(i18n "admin.user.suspend_message_placeholder")}}
</label>
{{else}}
<div class='cant-suspend'>
{{i18n "admin.user.cant_suspend"}}
</div>
{{/if}}
{{/conditional-loading-spinner}}
{{/d-modal-body}}