This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/models/action-summary.js.es6
2018-06-15 17:03:24 +02:00

106 lines
2.6 KiB
JavaScript

import { ajax } from "discourse/lib/ajax";
import RestModel from "discourse/models/rest";
import { popupAjaxError } from "discourse/lib/ajax-error";
export default RestModel.extend({
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
});
},
togglePromise(post) {
return this.get("acted") ? this.undo(post) : this.act(post);
},
toggle(post) {
if (!this.get("acted")) {
this.act(post);
return true;
} else {
this.undo(post);
return false;
}
},
// Perform this action
act(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 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,
is_warning: opts.isWarning,
take_action: opts.takeAction,
flag_topic: this.get("flagTopic") ? true : false
},
returnXHR: true
})
.then(function(data) {
if (!self.get("flagTopic")) {
post.updateActionsSummary(data.result);
}
const remaining = parseInt(
data.xhr.getResponseHeader("Discourse-Actions-Remaining") || 0
);
const max = parseInt(
data.xhr.getResponseHeader("Discourse-Actions-Max") || 0
);
return { acted: true, remaining, max };
})
.catch(function(error) {
popupAjaxError(error);
self.removeAction(post);
});
},
// Undo this action
undo(post) {
this.removeAction(post);
// Remove our post action
return ajax("/post_actions/" + post.get("id"), {
type: "DELETE",
data: { post_action_type_id: this.get("id") }
}).then(result => {
post.updateActionsSummary(result);
return { acted: false };
});
},
deferFlags(post) {
return ajax("/post_actions/defer_flags", {
type: "POST",
data: { post_action_type_id: this.get("id"), id: post.get("id") }
}).then(() => this.set("count", 0));
}
});