From 7c8b0b986961de388d6979a4f67584a8023fb2ee Mon Sep 17 00:00:00 2001 From: Isaac Janzen <50783505+janzenisaac@users.noreply.github.com> Date: Tue, 1 Aug 2023 15:49:26 -0500 Subject: [PATCH] DEV: Convert `delete-user-posts-progress` modal to component-based API (#22916) https://github.com/discourse/discourse/assets/50783505/414ffcc5-06e9-470f-b160-83b4c12bbb96 --- .../modal/delete-user-posts-progress.hbs | 14 ++++++ .../modal/delete-user-posts-progress.js | 42 ++++++++++++++++ .../addon/controllers/admin-user-index.js | 50 +++++-------------- .../admin-delete-user-posts-progress.js | 8 --- .../admin-delete-user-posts-progress.hbs | 9 ---- .../discourse/app/services/modal.js | 1 - 6 files changed, 69 insertions(+), 55 deletions(-) create mode 100644 app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.hbs create mode 100644 app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.js delete mode 100644 app/assets/javascripts/admin/addon/controllers/modals/admin-delete-user-posts-progress.js delete mode 100644 app/assets/javascripts/admin/addon/templates/modal/admin-delete-user-posts-progress.hbs diff --git a/app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.hbs b/app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.hbs new file mode 100644 index 00000000000..52e7d880f34 --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.hbs @@ -0,0 +1,14 @@ + + <:body> +

{{i18n "admin.user.delete_posts.progress.description"}}

+
+ +
+ +
\ No newline at end of file diff --git a/app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.js b/app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.js new file mode 100644 index 00000000000..f4b9448b40d --- /dev/null +++ b/app/assets/javascripts/admin/addon/components/modal/delete-user-posts-progress.js @@ -0,0 +1,42 @@ +import Component from "@glimmer/component"; +import { action } from "@ember/object"; +import { tracked } from "@glimmer/tracking"; +import AdminUser from "admin/models/admin-user"; +import { extractError } from "discourse/lib/ajax-error"; +import I18n from "I18n"; + +export default class DeleteUserPostsProgress extends Component { + @tracked deletedPosts = 0; + @tracked flash; + + constructor() { + super(...arguments); + this.deletePosts(); + } + + get userPostCount() { + return this.args.model.user.get("post_count"); + } + + get deletedPercentage() { + return Math.floor((this.deletedPosts * 100) / this.userPostCount); + } + + @action + async deletePosts() { + try { + const progress = await this.args.model.user.deleteAllPosts(); + this.deletedPosts = progress.posts_deleted; + this.args.model.updateUserPostCount( + this.userPostCount - this.deletedPosts + ); + // continue deleting posts if more remain, otherwise exit + this.userPostCount > 0 ? this.deletePosts() : this.args.closeModal(); + } catch (e) { + AdminUser.find(this.args.model.user.id).then((u) => + this.args.model.user.setProperties(u) + ); + this.flash = extractError(e, I18n.t("admin.user.delete_posts_failed")); + } + } +} diff --git a/app/assets/javascripts/admin/addon/controllers/admin-user-index.js b/app/assets/javascripts/admin/addon/controllers/admin-user-index.js index b44ef8f8f3d..d041d8ca2de 100644 --- a/app/assets/javascripts/admin/addon/controllers/admin-user-index.js +++ b/app/assets/javascripts/admin/addon/controllers/admin-user-index.js @@ -3,7 +3,6 @@ import { inject as service } from "@ember/service"; import { and, notEmpty } from "@ember/object/computed"; import DiscourseURL, { userPath } from "discourse/lib/url"; import { fmt, propertyNotEqual, setting } from "discourse/lib/computed"; -import AdminUser from "admin/models/admin-user"; import CanCheckEmails from "discourse/mixins/can-check-emails"; import Controller from "@ember/controller"; import I18n from "I18n"; @@ -11,12 +10,13 @@ import { ajax } from "discourse/lib/ajax"; import discourseComputed from "discourse-common/utils/decorators"; import getURL from "discourse-common/lib/get-url"; import { htmlSafe } from "@ember/template"; -import { extractError, popupAjaxError } from "discourse/lib/ajax-error"; -import showModal from "discourse/lib/show-modal"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import AdminUser from "admin/models/admin-user"; import MergeUsersConfirmationModal from "../components/modal/merge-users-confirmation"; import MergeUsersPromptModal from "../components/modal/merge-users-prompt"; import MergeUsersProgressModal from "../components/modal/merge-users-progress"; import DeletePostsConfirmationModal from "../components/modal/delete-posts-confirmation"; +import DeleteUserPostsProgressModal from "../components/modal/delete-user-posts-progress"; export default class AdminUserIndexController extends Controller.extend( CanCheckEmails @@ -628,42 +628,18 @@ export default class AdminUserIndexController extends Controller.extend( }); } + @action + updateUserPostCount(count) { + this.model.set("post_count", count); + } + @action deleteAllPosts() { - let deletedPosts = 0; - let deletedPercentage = 0; - const user = this.model; - - const performDelete = (progressModal) => { - this.model - .deleteAllPosts() - .then(({ posts_deleted }) => { - if (posts_deleted === 0) { - user.set("post_count", 0); - progressModal.send("closeModal"); - } else { - deletedPosts += posts_deleted; - deletedPercentage = Math.floor( - (deletedPosts * 100) / user.get("post_count") - ); - progressModal.setProperties({ - deletedPercentage, - }); - performDelete(progressModal); - } - }) - .catch((e) => { - progressModal.send("closeModal"); - let error; - AdminUser.find(user.get("id")).then((u) => user.setProperties(u)); - error = extractError(e, I18n.t("admin.user.delete_posts_failed")); - this.dialog.alert(error); - }); - }; - - const progressModal = showModal("admin-delete-user-posts-progress", { - admin: true, + this.modal.show(DeleteUserPostsProgressModal, { + model: { + user: this.model, + updateUserPostCount: this.updateUserPostCount, + }, }); - performDelete(progressModal); } } diff --git a/app/assets/javascripts/admin/addon/controllers/modals/admin-delete-user-posts-progress.js b/app/assets/javascripts/admin/addon/controllers/modals/admin-delete-user-posts-progress.js deleted file mode 100644 index 62723a4ab3f..00000000000 --- a/app/assets/javascripts/admin/addon/controllers/modals/admin-delete-user-posts-progress.js +++ /dev/null @@ -1,8 +0,0 @@ -import Controller from "@ember/controller"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; - -export default class AdminDeleteUserPostsProgressController extends Controller.extend( - ModalFunctionality -) { - deletedPercentage = 0; -} diff --git a/app/assets/javascripts/admin/addon/templates/modal/admin-delete-user-posts-progress.hbs b/app/assets/javascripts/admin/addon/templates/modal/admin-delete-user-posts-progress.hbs deleted file mode 100644 index 64cc0f479e8..00000000000 --- a/app/assets/javascripts/admin/addon/templates/modal/admin-delete-user-posts-progress.hbs +++ /dev/null @@ -1,9 +0,0 @@ - -

{{I18n "admin.user.delete_posts.progress.description"}}

-
-
\ 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 144df0d7ae0..2e4cba44881 100644 --- a/app/assets/javascripts/discourse/app/services/modal.js +++ b/app/assets/javascripts/discourse/app/services/modal.js @@ -49,7 +49,6 @@ const KNOWN_LEGACY_MODALS = [ "topic-summary", "user-status", "admin-watched-word-test", - "admin-delete-user-posts-progress", "admin-install-theme", "admin-penalize-user", "admin-theme-change",