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';
}
});