discourse/app/assets/javascripts/admin/models/flagged-post.js.es6

164 lines
4.2 KiB
Plaintext
Raw Normal View History

2018-06-15 23:03:24 +08:00
import { ajax } from "discourse/lib/ajax";
import Post from "discourse/models/post";
import computed from "ember-addons/ember-computed-decorators";
import { popupAjaxError } from "discourse/lib/ajax-error";
2017-09-12 04:44:20 +08:00
export default Post.extend({
2017-09-06 22:21:07 +08:00
@computed
summary() {
2013-06-17 15:15:56 +08:00
return _(this.post_actions)
2018-06-15 23:03:24 +08:00
.groupBy(function(a) {
return a.post_action_type_id;
})
.map(function(v, k) {
return I18n.t("admin.flags.summary.action_type_" + k, {
count: v.length
});
})
.join(",");
2017-09-06 22:21:07 +08:00
},
2018-06-15 23:03:24 +08:00
@computed("last_revised_at", "post_actions.@each.created_at")
2017-09-06 22:21:07 +08:00
wasEdited(lastRevisedAt) {
2018-06-15 23:03:24 +08:00
if (Ember.isEmpty(this.get("last_revised_at"))) {
return false;
}
2017-09-06 22:21:07 +08:00
lastRevisedAt = Date.parse(lastRevisedAt);
2018-06-15 23:03:24 +08:00
return _.some(this.get("post_actions"), function(postAction) {
return Date.parse(postAction.created_at) < lastRevisedAt;
});
2017-09-06 22:21:07 +08:00
},
2018-06-15 23:03:24 +08:00
@computed("post_actions")
hasDisposedBy() {
2018-06-15 23:03:24 +08:00
return this.get("post_actions").some(action => action.disposed_by);
},
2018-06-15 23:03:24 +08:00
@computed("post_actions.@each.name_key")
2017-09-06 22:21:07 +08:00
flaggedForSpam() {
2018-06-15 23:03:24 +08:00
return this.get("post_actions").every(action => action.name_key === "spam");
2017-09-06 22:21:07 +08:00
},
2018-06-15 23:03:24 +08:00
@computed("post_actions.@each.targets_topic")
2017-09-06 22:21:07 +08:00
topicFlagged() {
2018-06-15 23:03:24 +08:00
return _.any(this.get("post_actions"), function(action) {
return action.targets_topic;
});
2017-09-06 22:21:07 +08:00
},
2014-02-06 06:54:16 +08:00
2018-06-15 23:03:24 +08:00
@computed("post_actions.@each.targets_topic")
2017-09-06 22:21:07 +08:00
postAuthorFlagged() {
2018-06-15 23:03:24 +08:00
return _.any(this.get("post_actions"), function(action) {
return !action.targets_topic;
});
2017-09-06 22:21:07 +08:00
},
2014-02-06 06:54:16 +08:00
2018-06-15 23:03:24 +08:00
@computed("flaggedForSpam")
2017-09-06 22:21:07 +08:00
canDeleteAsSpammer(flaggedForSpam) {
2018-06-15 23:03:24 +08:00
return (
flaggedForSpam &&
this.get("user.can_delete_all_posts") &&
this.get("user.can_be_deleted")
);
2017-09-06 22:21:07 +08:00
},
2017-09-06 22:21:07 +08:00
deletePost() {
2018-06-15 23:03:24 +08:00
if (this.get("post_number") === 1) {
return ajax("/t/" + this.topic_id, { type: "DELETE", cache: false });
} else {
2018-06-15 23:03:24 +08:00
return ajax("/posts/" + this.id, { type: "DELETE", cache: false });
}
},
2017-09-06 22:21:07 +08:00
disagreeFlags() {
2018-06-15 23:03:24 +08:00
return ajax("/admin/flags/disagree/" + this.id, {
type: "POST",
cache: false
}).catch(popupAjaxError);
},
2017-09-06 22:21:07 +08:00
deferFlags(deletePost) {
const action = () => {
2018-06-15 23:03:24 +08:00
return ajax("/admin/flags/defer/" + this.id, {
type: "POST",
cache: false,
data: { delete_post: deletePost }
});
};
if (deletePost && this._hasDeletableReplies()) {
return this._actOnFlagAndDeleteReplies(action);
} else {
return action().catch(popupAjaxError);
}
},
2017-09-06 22:21:07 +08:00
agreeFlags(actionOnPost) {
const action = () => {
2018-06-15 23:03:24 +08:00
return ajax("/admin/flags/agree/" + this.id, {
type: "POST",
cache: false,
data: { action_on_post: actionOnPost }
});
};
2018-06-15 23:03:24 +08:00
if (actionOnPost === "delete" && this._hasDeletableReplies()) {
return this._actOnFlagAndDeleteReplies(action);
} else {
return action().catch(popupAjaxError);
}
},
_hasDeletableReplies() {
2018-06-15 23:03:24 +08:00
return this.get("post_number") > 1 && this.get("reply_count") > 0;
},
_actOnFlagAndDeleteReplies(action) {
return new Ember.RSVP.Promise((resolve, reject) => {
2018-06-15 23:03:24 +08:00
return ajax(`/posts/${this.id}/reply-ids/all.json`)
.then(replies => {
const buttons = [];
buttons.push({
label: I18n.t("no_value"),
callback() {
action()
.then(resolve)
.catch(error => {
popupAjaxError(error);
reject();
});
}
});
buttons.push({
label: I18n.t("yes_value"),
class: "btn-danger",
callback() {
Post.deleteMany(replies.map(r => r.id))
.then(action)
.then(resolve)
.catch(error => {
popupAjaxError(error);
reject();
});
}
});
bootbox.dialog(
I18n.t("admin.flags.delete_replies", { count: replies.length }),
buttons
);
})
.catch(error => {
popupAjaxError(error);
reject();
});
});
},
2018-06-15 23:03:24 +08:00
postHidden: Ember.computed.alias("hidden"),
2018-06-15 23:03:24 +08:00
deleted: Ember.computed.or("deleted_at", "topic_deleted_at")
});