mirror of
https://github.com/discourse/discourse.git
synced 2025-01-22 19:55:39 +08:00
33e58c0587
Also refactors post action users to be a new object type since they can have `post_url` which is not a field of a `User`
120 lines
2.9 KiB
JavaScript
120 lines
2.9 KiB
JavaScript
import RestModel from 'discourse/models/rest';
|
|
import { popupAjaxError } from 'discourse/lib/ajax-error';
|
|
|
|
export default RestModel.extend({
|
|
|
|
// Description for the action
|
|
description: function() {
|
|
const action = this.get('actionType.name_key');
|
|
if (this.get('acted')) {
|
|
if (this.get('count') <= 1) {
|
|
return I18n.t('post.actions.by_you.' + action);
|
|
} else {
|
|
return I18n.t('post.actions.by_you_and_others.' + action, { count: this.get('count') - 1 });
|
|
}
|
|
} else {
|
|
return I18n.t('post.actions.by_others.' + action, { count: this.get('count') });
|
|
}
|
|
}.property('count', 'acted', 'actionType'),
|
|
|
|
canToggle: function() {
|
|
return this.get('can_undo') || this.get('can_act');
|
|
}.property('can_undo', 'can_act'),
|
|
|
|
// Remove it
|
|
removeAction: function() {
|
|
this.setProperties({
|
|
acted: false,
|
|
count: this.get('count') - 1,
|
|
can_act: true,
|
|
can_undo: false
|
|
});
|
|
},
|
|
|
|
toggle: function(post) {
|
|
if (!this.get('acted')) {
|
|
this.act(post);
|
|
return true;
|
|
} else {
|
|
this.undo(post);
|
|
return false;
|
|
}
|
|
},
|
|
|
|
// Perform this action
|
|
act: function(post, opts) {
|
|
|
|
if (!opts) opts = {};
|
|
|
|
const action = this.get('actionType.name_key');
|
|
|
|
// Mark it as acted
|
|
this.setProperties({
|
|
acted: true,
|
|
count: this.get('count') + 1,
|
|
can_act: false,
|
|
can_undo: true
|
|
});
|
|
|
|
if (action === 'notify_moderators' || action === 'notify_user') {
|
|
this.set('can_undo',false);
|
|
this.set('can_defer_flags',false);
|
|
}
|
|
|
|
// Create our post action
|
|
const self = this;
|
|
return Discourse.ajax("/post_actions", {
|
|
type: 'POST',
|
|
data: {
|
|
id: this.get('flagTopic') ? this.get('flagTopic.id') : post.get('id'),
|
|
post_action_type_id: this.get('id'),
|
|
message: opts.message,
|
|
take_action: opts.takeAction,
|
|
flag_topic: this.get('flagTopic') ? true : false
|
|
}
|
|
}).then(function(result) {
|
|
if (!self.get('flagTopic')) {
|
|
return post.updateActionsSummary(result);
|
|
}
|
|
}).catch(function(error) {
|
|
popupAjaxError(error);
|
|
self.removeAction(post);
|
|
});
|
|
},
|
|
|
|
// Undo this action
|
|
undo: function(post) {
|
|
this.removeAction(post);
|
|
|
|
// Remove our post action
|
|
return Discourse.ajax("/post_actions/" + post.get('id'), {
|
|
type: 'DELETE',
|
|
data: {
|
|
post_action_type_id: this.get('id')
|
|
}
|
|
}).then(function(result) {
|
|
return post.updateActionsSummary(result);
|
|
});
|
|
},
|
|
|
|
deferFlags: function(post) {
|
|
const self = this;
|
|
return Discourse.ajax("/post_actions/defer_flags", {
|
|
type: "POST",
|
|
data: {
|
|
post_action_type_id: this.get("id"),
|
|
id: post.get('id')
|
|
}
|
|
}).then(function () {
|
|
self.set("count", 0);
|
|
});
|
|
},
|
|
|
|
loadUsers(post) {
|
|
return this.store.find('post-action-user', {
|
|
id: post.get('id'),
|
|
post_action_type_id: this.get('id')
|
|
});
|
|
}
|
|
});
|