Files
discourse/app/assets/javascripts/admin/addon/controllers/admin-user/badges.js
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

120 lines
3.4 KiB
JavaScript
Raw Normal View History

2023-10-10 19:38:59 +01:00
import Controller, { inject as controller } from "@ember/controller";
import { action } from "@ember/object";
import { alias, empty, sort } from "@ember/object/computed";
2019-10-30 09:48:24 -04:00
import { next } from "@ember/runloop";
2024-03-06 18:05:11 +01:00
import { service } from "@ember/service";
import { compare } from "@ember/utils";
import { popupAjaxError } from "discourse/lib/ajax-error";
import discourseComputed from "discourse/lib/decorators";
2023-10-10 19:38:59 +01:00
import { grantableBadges } from "discourse/lib/grant-badge-utils";
import UserBadge from "discourse/models/user-badge";
2024-11-19 20:45:18 +00:00
import { i18n } from "discourse-i18n";
import AdminUser from "admin/models/admin-user";
2015-08-18 21:24:09 -04:00
export default class AdminUserBadgesController extends Controller {
@service dialog;
@controller adminUser;
@alias("adminUser.model") user;
@alias("model") userBadges;
@alias("badges") allBadges;
@sort("model", "badgeSortOrder") sortedBadges;
@empty("availableBadges") noAvailableBadges;
badgeSortOrder = ["granted_at:desc"];
@discourseComputed("allBadges.[]", "userBadges.[]")
availableBadges() {
return grantableBadges(this.get("allBadges"), this.get("userBadges"));
}
@discourseComputed("model", "model.[]", "model.expandedBadges.[]")
2019-04-26 12:16:21 +02:00
groupedBadges() {
const allBadges = this.model;
2020-09-01 14:24:20 -04:00
let grouped = {};
allBadges.forEach((b) => {
grouped[b.badge_id] = grouped[b.badge_id] || [];
grouped[b.badge_id].push(b);
});
2020-09-01 14:24:20 -04:00
let expanded = [];
2018-11-26 10:24:46 -05:00
const expandedBadges = allBadges.get("expandedBadges") || [];
2020-09-01 14:24:20 -04:00
Object.values(grouped).forEach(function (badges) {
let lastGranted = badges[0].granted_at;
2018-11-26 10:24:46 -05:00
badges.forEach((badge) => {
lastGranted =
lastGranted < badge.granted_at ? badge.granted_at : lastGranted;
});
if (badges.length === 1 || expandedBadges.includes(badges[0].badge.id)) {
2018-11-20 14:46:58 +01:00
badges.forEach((badge) => expanded.push(badge));
return;
}
2020-09-01 14:24:20 -04:00
let result = {
badge: badges[0].badge,
granted_at: lastGranted,
2021-11-10 09:31:41 +10:00
badges,
count: badges.length,
grouped: true,
};
expanded.push(result);
});
expanded.forEach((badgeGroup) => {
const user = badgeGroup.granted_by;
if (user) {
badgeGroup.granted_by = AdminUser.create(user);
}
});
return expanded.sort((a, b) => compare(b?.granted_at, a?.granted_at)); // sort descending
}
@action
expandGroup(userBadge) {
const model = this.model;
model.set("expandedBadges", model.get("expandedBadges") || []);
model.get("expandedBadges").pushObject(userBadge.badge.id);
}
@action
performGrantBadge() {
UserBadge.grant(
this.selectedBadgeId,
this.get("user.username"),
this.badgeReason
).then(
(newBadge) => {
this.set("badgeReason", "");
this.userBadges.pushObject(newBadge);
next(() => {
// Update the selected badge ID after the combobox has re-rendered.
const newSelectedBadge = this.availableBadges[0];
if (newSelectedBadge) {
this.set("selectedBadgeId", newSelectedBadge.get("id"));
}
});
},
function (error) {
popupAjaxError(error);
}
);
}
@action
revokeBadge(userBadge) {
return this.dialog.yesNoConfirm({
2024-11-19 20:45:18 +00:00
message: i18n("admin.badges.revoke_confirm"),
didConfirm: () => {
return userBadge.revoke().then(() => {
this.model.removeObject(userBadge);
});
},
});
}
}