Add Suspend User to flags page
This commit is contained in:
@@ -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}}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user