From 8dd883d4e583b242df4e2d31a045fae715a97976 Mon Sep 17 00:00:00 2001 From: Jan Cernik <66427541+jancernik@users.noreply.github.com> Date: Mon, 29 Apr 2024 10:44:38 -0500 Subject: [PATCH] DEV: Refactor topic admin menu to use `` (#26678) * DEV: Refactor topic admin menu to use `` This PR also introduces a new plugin API to add buttons to the topic admin menu ```javascript api.addTopicAdminMenuButton((topic) => { return { action: () => { alert('Sunrise!'); }, icon: 'sun', className: 'sunrise-button', label: 'actions.rise', }; }); ``` The plugins that needed to be updated are: - [discourse-zoom](https://github.com/discourse/discourse-zoom/pull/73) - [discourse-salesforce](https://github.com/discourse/discourse-salesforce/pull/74) - [discourse-topic-noindex](https://github.com/discourse/discourse-topic-noindex/pull/11) --- .../app/components/admin-post-menu.gjs | 28 +- .../app/components/topic-admin-menu-button.js | 11 - .../app/components/topic-admin-menu.gjs | 311 +++++++++++++ .../app/components/topic-footer-buttons.hbs | 2 +- .../components/topic-timeline/container.hbs | 4 +- .../discourse/app/lib/plugin-api.gjs | 26 +- .../app/services/admin-topic-menu-buttons.js | 9 + .../discourse/app/templates/topic.hbs | 2 +- .../discourse/app/widgets/post-menu.js | 1 + .../discourse/app/widgets/topic-admin-menu.js | 409 ------------------ .../tests/acceptance/topic-admin-menu-test.js | 30 +- .../widgets/topic-admin-menu-test.js | 79 ---- .../addon/components/d-inline-float.gjs | 70 ++- .../float-kit/addon/components/d-menu.gjs | 1 + .../stylesheets/common/base/_index.scss | 1 - .../stylesheets/common/base/popup-menu.scss | 66 --- .../common/base/topic-admin-menu.scss | 115 +---- app/assets/stylesheets/common/base/topic.scss | 14 - .../common/components/admin-post-menu.scss | 11 + app/assets/stylesheets/mobile/topic.scss | 33 -- docs/CHANGELOG-JAVASCRIPT-PLUGIN-API.md | 4 + 21 files changed, 464 insertions(+), 763 deletions(-) delete mode 100644 app/assets/javascripts/discourse/app/components/topic-admin-menu-button.js create mode 100644 app/assets/javascripts/discourse/app/components/topic-admin-menu.gjs create mode 100644 app/assets/javascripts/discourse/app/services/admin-topic-menu-buttons.js delete mode 100644 app/assets/javascripts/discourse/app/widgets/topic-admin-menu.js delete mode 100644 app/assets/javascripts/discourse/tests/integration/components/widgets/topic-admin-menu-test.js delete mode 100644 app/assets/stylesheets/common/base/popup-menu.scss diff --git a/app/assets/javascripts/discourse/app/components/admin-post-menu.gjs b/app/assets/javascripts/discourse/app/components/admin-post-menu.gjs index 0dd0fe1e927..e5686a1f70e 100644 --- a/app/assets/javascripts/discourse/app/components/admin-post-menu.gjs +++ b/app/assets/javascripts/discourse/app/components/admin-post-menu.gjs @@ -52,7 +52,7 @@ export default class AdminPostMenu extends Component { @@ -68,7 +68,7 @@ export default class AdminPostMenu extends Component { }} @icon="shield-alt" class={{concatClass - "btn popup-menu-btn toggle-post-type" + "btn btn-transparent toggle-post-type" (if @data.transformedPost.isModeratorAction "btn-success") }} @action={{fn this.topicAction "togglePostType"}} @@ -87,7 +87,7 @@ export default class AdminPostMenu extends Component { }} title="post.controls.unhide" class={{concatClass - "btn popup-menu-btn" + "btn btn-transparent" (if @data.transformedPost.notice "change-notice" "add-notice") (if @data.transformedPost.notice "btn-success") }} @@ -101,7 +101,7 @@ export default class AdminPostMenu extends Component { @@ -121,7 +121,7 @@ export default class AdminPostMenu extends Component { @label="post.controls.change_owner" @icon="user" title="post.controls.lock_post_description" - class="btn popup-menu-btn change-owner" + class="btn btn-transparent change-owner" @action={{fn this.topicAction "changePostOwner"}} /> @@ -133,7 +133,7 @@ export default class AdminPostMenu extends Component { @@ -146,7 +146,7 @@ export default class AdminPostMenu extends Component { @icon="unlock" title="post.controls.unlock_post_description" class={{concatClass - "btn popup-menu-btn unlock-post" + "btn btn-transparent unlock-post" (if @data.post.locked "btn-success") }} @action={{fn this.topicAction "unlockPost"}} @@ -158,7 +158,7 @@ export default class AdminPostMenu extends Component { @label="post.controls.lock_post" @icon="lock" title="post.controls.lock_post_description" - class="btn popup-menu-btn lock-post" + class="btn btn-transparent lock-post" @action={{fn this.topicAction "lockPost"}} /> @@ -170,7 +170,7 @@ export default class AdminPostMenu extends Component { @@ -183,7 +183,7 @@ export default class AdminPostMenu extends Component { @label="post.controls.unwiki" @icon="far-edit" class={{concatClass - "btn popup-menu-btn wiki wikied" + "btn btn-transparent wiki wikied" (if @data.transformedPost.wiki "btn-success") }} @action={{fn this.topicAction "toggleWiki"}} @@ -194,7 +194,7 @@ export default class AdminPostMenu extends Component { @@ -206,7 +206,7 @@ export default class AdminPostMenu extends Component { @@ -217,7 +217,7 @@ export default class AdminPostMenu extends Component { @@ -229,7 +229,7 @@ export default class AdminPostMenu extends Component { @label={{button.label}} @translatedLabel={{button.translatedLabel}} @icon={{button.icon}} - class={{concatClass "btn popup-menu-btn" button.className}} + class={{concatClass "btn btn-transparent" button.className}} @action={{fn this.extraAction button}} /> diff --git a/app/assets/javascripts/discourse/app/components/topic-admin-menu-button.js b/app/assets/javascripts/discourse/app/components/topic-admin-menu-button.js deleted file mode 100644 index ef58dfdad79..00000000000 --- a/app/assets/javascripts/discourse/app/components/topic-admin-menu-button.js +++ /dev/null @@ -1,11 +0,0 @@ -import MountWidget from "discourse/components/mount-widget"; - -export default MountWidget.extend({ - classNames: "topic-admin-menu-button-container", - tagName: "span", - widget: "topic-admin-menu-button", - - buildArgs() { - return this.getProperties("topic", "openUpwards", "rightSide"); - }, -}); diff --git a/app/assets/javascripts/discourse/app/components/topic-admin-menu.gjs b/app/assets/javascripts/discourse/app/components/topic-admin-menu.gjs new file mode 100644 index 00000000000..e185e31de15 --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/topic-admin-menu.gjs @@ -0,0 +1,311 @@ +import Component from "@glimmer/component"; +import { fn } from "@ember/helper"; +import { action } from "@ember/object"; +import { inject as service } from "@ember/service"; +import { and, not, or } from "truth-helpers"; +import DButton from "discourse/components/d-button"; +import concatClass from "discourse/helpers/concat-class"; +import icon from "discourse-common/helpers/d-icon"; +import getURL from "discourse-common/lib/get-url"; +import DMenu from "float-kit/components/d-menu"; + +export default class TopicAdminMenu extends Component { + @service adminTopicMenuButtons; + @service currentUser; + + @action + onRegisterApi(api) { + this.dMenu = api; + } + + @action + onButtonAction(buttonAction) { + this.args[buttonAction]?.(); + this.dMenu.close(); + } + + @action + onExtraButtonAction(buttonAction) { + buttonAction?.(); + this.dMenu.close(); + } + + get extraButtons() { + return this.adminTopicMenuButtons.callbacks + .map((callback) => { + return callback(this.args.topic); + }) + .filter(Boolean); + } + + get details() { + return this.args.topic.get("details"); + } + + get isPrivateMessage() { + return this.args.topic.get("isPrivateMessage"); + } + + get featured() { + return ( + !!this.args.topic.get("pinned_at") || this.args.topic.get("isBanner") + ); + } + + get visible() { + return this.args.topic.get("visible"); + } + + get canDelete() { + return this.details.get("can_delete"); + } + + get canRecover() { + return this.details.get("can_recover"); + } + + get archived() { + return this.args.topic.get("archived"); + } + + get topicModerationHistoryUrl() { + return getURL(`/review?topic_id=${this.args.topic.id}&status=all`); + } + + +} diff --git a/app/assets/javascripts/discourse/app/components/topic-footer-buttons.hbs b/app/assets/javascripts/discourse/app/components/topic-footer-buttons.hbs index 5e57f6057e3..007f58cb0f4 100644 --- a/app/assets/javascripts/discourse/app/components/topic-footer-buttons.hbs +++ b/app/assets/javascripts/discourse/app/components/topic-footer-buttons.hbs @@ -1,5 +1,5 @@