From ac4e854a04d920e265ce2ddd4fa996620e9d2b28 Mon Sep 17 00:00:00 2001
From: Isaac Janzen <50783505+janzenisaac@users.noreply.github.com>
Date: Mon, 14 Aug 2023 12:03:28 -0500
Subject: [PATCH] DEV: Convert `edit-badge-groupings` modal to component-based
API (#22984)
---
.../components/modal/edit-badge-groupings.hbs | 55 ++++++++++
.../components/modal/edit-badge-groupings.js | 84 ++++++++++++++
.../modals/admin-edit-badge-groupings.js | 103 ------------------
.../admin/addon/routes/admin-badges/show.js | 14 ++-
.../modal/admin-edit-badge-groupings.hbs | 46 --------
.../discourse/app/services/modal.js | 1 -
6 files changed, 152 insertions(+), 151 deletions(-)
create mode 100644 app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.hbs
create mode 100644 app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.js
delete mode 100644 app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js
delete mode 100644 app/assets/javascripts/admin/addon/templates/modal/admin-edit-badge-groupings.hbs
diff --git a/app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.hbs b/app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.hbs
new file mode 100644
index 00000000000..44b2d9a282b
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.hbs
@@ -0,0 +1,55 @@
+
+ <:body>
+
+
+
+ <:footer>
+
+
+
+
\ No newline at end of file
diff --git a/app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.js b/app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.js
new file mode 100644
index 00000000000..de40d2b6cec
--- /dev/null
+++ b/app/assets/javascripts/admin/addon/components/modal/edit-badge-groupings.js
@@ -0,0 +1,84 @@
+import Component from "@glimmer/component";
+import { tracked } from "@glimmer/tracking";
+import { inject as service } from "@ember/service";
+import { action } from "@ember/object";
+import I18n from "I18n";
+import { A } from "@ember/array";
+import { ajax } from "discourse/lib/ajax";
+import { TrackedArray } from "@ember-compat/tracked-built-ins";
+
+export default class EditBadgeGroupings extends Component {
+ @service dialog;
+ @service store;
+
+ @tracked workingCopy = new TrackedArray();
+
+ constructor() {
+ super(...arguments);
+ let copy = A();
+ if (this.args.model.badgeGroupings) {
+ this.args.model.badgeGroupings.forEach((o) =>
+ copy.pushObject(this.store.createRecord("badge-grouping", o))
+ );
+ }
+ this.workingCopy = copy;
+ }
+
+ @action
+ up(item) {
+ this.moveItem(item, -1);
+ }
+
+ @action
+ down(item) {
+ this.moveItem(item, 1);
+ }
+
+ @action
+ delete(item) {
+ this.workingCopy.removeObject(item);
+ }
+
+ @action
+ add() {
+ const obj = this.store.createRecord("badge-grouping", {
+ editing: true,
+ name: I18n.t("admin.badges.badge_grouping"),
+ });
+ this.workingCopy.pushObject(obj);
+ }
+
+ @action
+ async saveAll() {
+ const groupIds = this.workingCopy.map((i) => i.id || -1);
+ const names = this.workingCopy.map((i) => i.name);
+ try {
+ const data = await ajax("/admin/badges/badge_groupings", {
+ data: { ids: groupIds, names },
+ type: "POST",
+ });
+ this.workingCopy.clear();
+ data.badge_groupings.forEach((badgeGroup) => {
+ this.workingCopy.pushObject(
+ this.store.createRecord("badge-grouping", {
+ ...badgeGroup,
+ editing: false,
+ })
+ );
+ });
+ this.args.model.updateGroupings(this.workingCopy);
+ this.args.closeModal();
+ } catch {
+ this.dialog.alert(I18n.t("generic_error"));
+ }
+ }
+
+ moveItem(item, delta) {
+ const index = this.workingCopy.indexOf(item);
+ if (index + delta < 0 || index + delta >= this.workingCopy.length) {
+ return;
+ }
+ this.workingCopy.removeAt(index);
+ this.workingCopy.insertAt(index + delta, item);
+ }
+}
diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js
deleted file mode 100644
index d23b9131ed1..00000000000
--- a/app/assets/javascripts/admin/addon/controllers/modals/admin-edit-badge-groupings.js
+++ /dev/null
@@ -1,103 +0,0 @@
-import { action } from "@ember/object";
-import { inject as service } from "@ember/service";
-import { A } from "@ember/array";
-import Controller from "@ember/controller";
-import I18n from "I18n";
-import ModalFunctionality from "discourse/mixins/modal-functionality";
-import { ajax } from "discourse/lib/ajax";
-import { observes } from "discourse-common/utils/decorators";
-
-export default class AdminEditBadgeGroupingsController extends Controller.extend(
- ModalFunctionality
-) {
- @service dialog;
-
- @observes("model")
- modelChanged() {
- const model = this.model;
- const copy = A();
- const store = this.store;
-
- if (model) {
- model.forEach((o) =>
- copy.pushObject(store.createRecord("badge-grouping", o))
- );
- }
-
- this.set("workingCopy", copy);
- }
-
- moveItem(item, delta) {
- const copy = this.workingCopy;
- const index = copy.indexOf(item);
- if (index + delta < 0 || index + delta >= copy.length) {
- return;
- }
-
- copy.removeAt(index);
- copy.insertAt(index + delta, item);
- }
-
- @action
- up(item) {
- this.moveItem(item, -1);
- }
-
- @action
- down(item) {
- this.moveItem(item, 1);
- }
-
- @action
- delete(item) {
- this.workingCopy.removeObject(item);
- }
-
- @action
- cancel() {
- this.setProperties({ model: null, workingCopy: null });
- this.send("closeModal");
- }
-
- @action
- edit(item) {
- item.set("editing", true);
- }
-
- @action
- save(item) {
- item.set("editing", false);
- }
-
- @action
- add() {
- const obj = this.store.createRecord("badge-grouping", {
- editing: true,
- name: I18n.t("admin.badges.badge_grouping"),
- });
- this.workingCopy.pushObject(obj);
- }
-
- @action
- saveAll() {
- let items = this.workingCopy;
- const groupIds = items.map((i) => i.get("id") || -1);
- const names = items.map((i) => i.get("name"));
-
- ajax("/admin/badges/badge_groupings", {
- data: { ids: groupIds, names },
- type: "POST",
- }).then(
- (data) => {
- items = this.model;
- items.clear();
- data.badge_groupings.forEach((g) => {
- items.pushObject(this.store.createRecord("badge-grouping", g));
- });
- this.setProperties({ model: null, workingCopy: null });
- this.send("closeModal");
- },
- () => this.dialog.alert(I18n.t("generic_error"))
- );
- }
-}
diff --git a/app/assets/javascripts/admin/addon/routes/admin-badges/show.js b/app/assets/javascripts/admin/addon/routes/admin-badges/show.js
index b17d253b666..cb7fa0d4ea4 100644
--- a/app/assets/javascripts/admin/addon/routes/admin-badges/show.js
+++ b/app/assets/javascripts/admin/addon/routes/admin-badges/show.js
@@ -5,9 +5,11 @@ import { ajax } from "discourse/lib/ajax";
import { action, get } from "@ember/object";
import showModal from "discourse/lib/show-modal";
import { inject as service } from "@ember/service";
+import EditBadgeGroupingsModal from "../../components/modal/edit-badge-groupings";
export default class AdminBadgesShowRoute extends Route {
@service dialog;
+ @service modal;
serialize(m) {
return { badge_id: get(m, "id") || "new" };
@@ -37,7 +39,17 @@ export default class AdminBadgesShowRoute extends Route {
@action
editGroupings() {
const model = this.controllerFor("admin-badges").get("badgeGroupings");
- showModal("admin-edit-badge-groupings", { model, admin: true });
+ this.modal.show(EditBadgeGroupingsModal, {
+ model: {
+ badgeGroupings: model,
+ updateGroupings: this.updateGroupings,
+ },
+ });
+ }
+
+ @action
+ updateGroupings(groupings) {
+ this.controllerFor("admin-badges").set("badgeGroupings", groupings);
}
@action
diff --git a/app/assets/javascripts/admin/addon/templates/modal/admin-edit-badge-groupings.hbs b/app/assets/javascripts/admin/addon/templates/modal/admin-edit-badge-groupings.hbs
deleted file mode 100644
index 5c786aaac4c..00000000000
--- a/app/assets/javascripts/admin/addon/templates/modal/admin-edit-badge-groupings.hbs
+++ /dev/null
@@ -1,46 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/assets/javascripts/discourse/app/services/modal.js b/app/assets/javascripts/discourse/app/services/modal.js
index f50eefa58cf..f1d5f0e7d51 100644
--- a/app/assets/javascripts/discourse/app/services/modal.js
+++ b/app/assets/javascripts/discourse/app/services/modal.js
@@ -47,7 +47,6 @@ const KNOWN_LEGACY_MODALS = [
"user-status",
"admin-penalize-user",
"admin-badge-preview",
- "admin-edit-badge-groupings",
"admin-reseed",
"admin-theme-item",
"admin-color-scheme-select-base",