mirror of
https://github.com/discourse/discourse.git
synced 2025-04-08 09:20:45 +08:00
169 lines
5.2 KiB
JavaScript
169 lines
5.2 KiB
JavaScript
import ModalFunctionality from 'discourse/mixins/modal-functionality';
|
|
import ActionSummary from 'discourse/models/action-summary';
|
|
import { MAX_MESSAGE_LENGTH } from 'discourse/models/post-action-type';
|
|
import computed from 'ember-addons/ember-computed-decorators';
|
|
import optionalService from 'discourse/lib/optional-service';
|
|
|
|
export default Ember.Controller.extend(ModalFunctionality, {
|
|
adminTools: optionalService(),
|
|
userDetails: null,
|
|
selected: null,
|
|
flagTopic: null,
|
|
message: null,
|
|
isWarning: false,
|
|
topicActionByName: null,
|
|
spammerDetails: null,
|
|
|
|
onShow() {
|
|
this.setProperties({
|
|
selected: null,
|
|
spammerDetails: null
|
|
});
|
|
|
|
let adminTools = this.get('adminTools');
|
|
if (adminTools) {
|
|
adminTools.checkSpammer(this.get('model.user_id')).then(result => {
|
|
this.set('spammerDetails', result);
|
|
});
|
|
}
|
|
},
|
|
|
|
@computed('spammerDetails.canDelete', 'selected.name_key')
|
|
showDeleteSpammer(canDeleteSpammer, nameKey) {
|
|
return canDeleteSpammer && nameKey === 'spam';
|
|
},
|
|
|
|
@computed('flagTopic')
|
|
title(flagTopic) {
|
|
return flagTopic ? 'flagging_topic.title' : 'flagging.title';
|
|
},
|
|
|
|
flagsAvailable: function() {
|
|
if (!this.get('flagTopic')) {
|
|
// flagging post
|
|
let flagsAvailable = this.get('model.flagsAvailable');
|
|
|
|
// "message user" option should be at the top
|
|
const notifyUserIndex = flagsAvailable.indexOf(flagsAvailable.filterBy('name_key', 'notify_user')[0]);
|
|
if (notifyUserIndex !== -1) {
|
|
const notifyUser = flagsAvailable[notifyUserIndex];
|
|
flagsAvailable.splice(notifyUserIndex, 1);
|
|
flagsAvailable.splice(0, 0, notifyUser);
|
|
}
|
|
return flagsAvailable;
|
|
} else {
|
|
// flagging topic
|
|
let lookup = Em.Object.create();
|
|
let model = this.get('model');
|
|
model.get('actions_summary').forEach(a => {
|
|
a.flagTopic = model;
|
|
a.actionType = this.site.topicFlagTypeById(a.id);
|
|
lookup.set(a.actionType.get('name_key'), ActionSummary.create(a));
|
|
});
|
|
this.set('topicActionByName', lookup);
|
|
|
|
return this.site.get('topic_flag_types').filter(item => {
|
|
return _.any(this.get("model.actions_summary"), a => {
|
|
return (a.id === item.get('id') && a.can_act);
|
|
});
|
|
});
|
|
}
|
|
}.property('post', 'flagTopic', 'model.actions_summary.@each.can_act'),
|
|
|
|
staffFlagsAvailable: function() {
|
|
return (this.get('model.flagsAvailable') && this.get('model.flagsAvailable').length > 1);
|
|
}.property('post', 'flagTopic', 'model.actions_summary.@each.can_act'),
|
|
|
|
submitEnabled: function() {
|
|
const selected = this.get('selected');
|
|
if (!selected) return false;
|
|
|
|
if (selected.get('is_custom_flag')) {
|
|
const len = this.get('message.length') || 0;
|
|
return len >= Discourse.SiteSettings.min_private_message_post_length &&
|
|
len <= MAX_MESSAGE_LENGTH;
|
|
}
|
|
return true;
|
|
}.property('selected.is_custom_flag', 'message.length'),
|
|
|
|
submitDisabled: Em.computed.not('submitEnabled'),
|
|
|
|
// Staff accounts can "take action"
|
|
@computed('flagTopic', 'selected.is_custom_flag')
|
|
canTakeAction(flagTopic, isCustomFlag) {
|
|
return !flagTopic && !isCustomFlag && this.currentUser.get('staff');
|
|
},
|
|
|
|
@computed('selected.is_custom_flag')
|
|
submitIcon(isCustomFlag) {
|
|
return isCustomFlag ? "envelope" : "flag";
|
|
},
|
|
|
|
@computed('selected.is_custom_flag', 'flagTopic')
|
|
submitLabel(isCustomFlag, flagTopic) {
|
|
if (isCustomFlag) {
|
|
return flagTopic ? "flagging_topic.notify_action" : "flagging.notify_action";
|
|
}
|
|
return flagTopic ? "flagging_topic.action" : "flagging.action";
|
|
},
|
|
|
|
actions: {
|
|
deleteSpammer() {
|
|
let details = this.get('spammerDetails');
|
|
if (details) {
|
|
details.deleteUser().then(() => window.location.reload());
|
|
}
|
|
},
|
|
|
|
takeAction() {
|
|
this.send('createFlag', {takeAction: true});
|
|
this.set('model.hidden', true);
|
|
},
|
|
|
|
createFlag(opts) {
|
|
let postAction; // an instance of ActionSummary
|
|
|
|
if (!this.get('flagTopic')) {
|
|
postAction = this.get('model.actions_summary').findBy('id', this.get('selected.id'));
|
|
} else {
|
|
postAction = this.get('topicActionByName.' + this.get('selected.name_key'));
|
|
}
|
|
|
|
let params = this.get('selected.is_custom_flag') ? {message: this.get('message') } : {};
|
|
if (opts) { params = $.extend(params, opts); }
|
|
|
|
this.send('hideModal');
|
|
|
|
postAction.act(this.get('model'), params).then(() => {
|
|
this.send('closeModal');
|
|
if (params.message) {
|
|
this.set('message', '');
|
|
}
|
|
this.appEvents.trigger('post-stream:refresh', { id: this.get('model.id') });
|
|
}).catch(errors => {
|
|
this.send('closeModal');
|
|
if (errors && errors.responseText) {
|
|
bootbox.alert($.parseJSON(errors.responseText).errors);
|
|
} else {
|
|
bootbox.alert(I18n.t('generic_error'));
|
|
}
|
|
});
|
|
},
|
|
|
|
createFlagAsWarning() {
|
|
this.send('createFlag', {isWarning: true});
|
|
this.set('model.hidden', true);
|
|
},
|
|
|
|
changePostActionType(action) {
|
|
this.set('selected', action);
|
|
},
|
|
},
|
|
|
|
@computed('flagTopic', 'selected.name_key')
|
|
canSendWarning(flagTopic, nameKey) {
|
|
return !flagTopic && this.currentUser.get('staff') && nameKey === 'notify_user';
|
|
}
|
|
|
|
});
|