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/controllers/grant-badge.js.es6
2019-11-07 15:38:28 -06:00

86 lines
2.2 KiB
JavaScript

import discourseComputed from "discourse-common/utils/decorators";
import { inject } from "@ember/controller";
import Controller from "@ember/controller";
import { extractError } from "discourse/lib/ajax-error";
import ModalFunctionality from "discourse/mixins/modal-functionality";
import GrantBadgeController from "discourse/mixins/grant-badge-controller";
import Badge from "discourse/models/badge";
import UserBadge from "discourse/models/user-badge";
import { all } from "rsvp";
export default Controller.extend(ModalFunctionality, GrantBadgeController, {
topicController: inject("topic"),
loading: true,
saving: false,
selectedBadgeId: null,
init() {
this._super(...arguments);
this.allBadges = [];
this.userBadges = [];
},
@discourseComputed("topicController.selectedPosts")
post() {
return this.get("topicController.selectedPosts")[0];
},
@discourseComputed("post")
badgeReason(post) {
const url = post.get("url");
const protocolAndHost =
window.location.protocol + "//" + window.location.host;
return url.indexOf("/") === 0 ? protocolAndHost + url : url;
},
@discourseComputed("saving", "selectedBadgeGrantable")
buttonDisabled(saving, selectedBadgeGrantable) {
return saving || !selectedBadgeGrantable;
},
onShow() {
this.set("loading", true);
all([
Badge.findAll(),
UserBadge.findByUsername(this.get("post.username"))
]).then(([allBadges, userBadges]) => {
this.setProperties({
allBadges: allBadges,
userBadges: userBadges,
loading: false
});
});
},
actions: {
grantBadge() {
this.set("saving", true);
this.grantBadge(
this.selectedBadgeId,
this.get("post.username"),
this.badgeReason
)
.then(
newBadge => {
this.set("selectedBadgeId", null);
this.flash(
I18n.t("badges.successfully_granted", {
username: this.get("post.username"),
badge: newBadge.get("badge.name")
}),
"success"
);
},
error => {
this.flash(extractError(error), "error");
}
)
.finally(() => this.set("saving", false));
}
}
});