+ <: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 @@
-