DEV: Remove plugin sidebar rendering fallback (#31012)

We used this flag for experimenting with admin plugin sidebars. We have now settled on a tabbed layout, and this is no longer needed.

This PR simply ignores the flag in a backwards-compatible way, so we can discontinue usage in plugins and then remove the backwards-compatibility in core.
This commit is contained in:
Ted Johansson 2025-01-28 09:42:24 +08:00 committed by GitHub
parent 90e4c3e2f7
commit 907db4d5fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 27 additions and 127 deletions

View File

@ -1,7 +1,5 @@
import Component from "@glimmer/component";
import { LinkTo } from "@ember/routing";
import { service } from "@ember/service";
import concatClass from "discourse/helpers/concat-class";
import { i18n } from "discourse-i18n";
export default class AdminPluginConfigArea extends Component {
@ -16,31 +14,6 @@ export default class AdminPluginConfigArea extends Component {
}
<template>
{{#if this.adminPluginNavManager.isSidebarMode}}
<nav class="admin-nav admin-plugin-inner-sidebar-nav pull-left">
<ul class="nav nav-stacked">
{{#each
this.adminPluginNavManager.currentConfigNav.links
as |navLink|
}}
<li
class={{concatClass
"admin-plugin-inner-sidebar-nav__item"
navLink.route
}}
>
<LinkTo
@route={{navLink.route}}
@model={{navLink.model}}
title={{this.linkText navLink}}
>
{{this.linkText navLink}}
</LinkTo>
</li>
{{/each}}
</ul>
</nav>
{{/if}}
<section class="admin-plugin-config-area">
{{yield}}
</section>

View File

@ -11,18 +11,6 @@ export default class AdminPluginConfigPage extends Component {
@service currentUser;
@service adminPluginNavManager;
get mainAreaClasses() {
let classes = ["admin-plugin-config-page__main-area"];
if (this.adminPluginNavManager.isSidebarMode) {
classes.push("-with-inner-sidebar");
} else {
classes.push("-without-inner-sidebar");
}
return classes.join(" ");
}
get actionsOutletName() {
return `admin-plugin-config-page-actions-${this.args.plugin.dasherizedName}`;
}
@ -59,26 +47,24 @@ export default class AdminPluginConfigPage extends Component {
/>
</:breadcrumbs>
<:tabs>
{{#if this.adminPluginNavManager.isTopMode}}
{{#each
this.adminPluginNavManager.currentConfigNav.links
as |navLink|
}}
<NavItem
@route={{navLink.route}}
@i18nLabel={{this.linkText navLink}}
title={{this.linkText navLink}}
class="admin-plugin-config-page__top-nav-item"
>
{{this.linkText navLink}}
</NavItem>
{{/each}}
{{/if}}
{{#each
this.adminPluginNavManager.currentConfigNav.links
as |navLink|
}}
<NavItem
@route={{navLink.route}}
@i18nLabel={{this.linkText navLink}}
title={{this.linkText navLink}}
class="admin-plugin-config-page__top-nav-item"
>
{{this.linkText navLink}}
</NavItem>
{{/each}}
</:tabs>
</DPageHeader>
<div class="admin-plugin-config-page__content">
<div class={{this.mainAreaClasses}}>
<div class="admin-plugin-config-page__main-area -without-inner-sidebar">
<AdminPluginConfigArea>
{{yield}}
</AdminPluginConfigArea>

View File

@ -31,8 +31,7 @@ export default class AdminPluginsController extends Controller {
get showTopNav() {
return (
!this.adminPluginNavManager.viewingPluginsList &&
(!this.adminPluginNavManager.currentPlugin ||
this.adminPluginNavManager.isSidebarMode)
!this.adminPluginNavManager.currentPlugin
);
}
}

View File

@ -1,10 +1,6 @@
import { tracked } from "@glimmer/tracking";
import Service, { service } from "@ember/service";
import {
configNavForPlugin,
PLUGIN_NAV_MODE_SIDEBAR,
PLUGIN_NAV_MODE_TOP,
} from "discourse/lib/admin-plugin-config-nav";
import { configNavForPlugin } from "discourse/lib/admin-plugin-config-nav";
export default class AdminPluginNavManager extends Service {
@service currentUser;
@ -22,7 +18,6 @@ export default class AdminPluginNavManager extends Service {
get currentConfigNav() {
const configNav = configNavForPlugin(this.currentPlugin.id);
const settingsNav = {
mode: PLUGIN_NAV_MODE_TOP,
links: [
{
label: "admin.plugins.change_settings_short",
@ -59,12 +54,4 @@ export default class AdminPluginNavManager extends Service {
return linksExceptSettings[0].route;
}
get isSidebarMode() {
return this.currentConfigNav.mode === PLUGIN_NAV_MODE_SIDEBAR;
}
get isTopMode() {
return this.currentConfigNav.mode === PLUGIN_NAV_MODE_TOP;
}
}

View File

@ -1,8 +1,8 @@
export const PLUGIN_NAV_MODE_SIDEBAR = "sidebar";
export const PLUGIN_NAV_MODE_TOP = "top";
let pluginConfigNav = {};
export function registerAdminPluginConfigNav(pluginId, mode, links) {
pluginConfigNav[pluginId] = { mode, links };
export function registerAdminPluginConfigNav(pluginId, links) {
pluginConfigNav[pluginId] = { links };
}
export function resetAdminPluginConfigNav() {
pluginConfigNav = {};

View File

@ -3258,24 +3258,20 @@ class PluginApi {
* And the mode must be one of "sidebar" or "top", which controls
* where in the admin plugin show UI the links will be displayed.
*/
addAdminPluginConfigurationNav(pluginId, mode, links) {
addAdminPluginConfigurationNav(pluginId, ...links) {
if (!pluginId) {
// eslint-disable-next-line no-console
console.warn(consolePrefix(), "A pluginId must be provided!");
return;
}
// TODO (Ted - 2024-01-27): Remove once usage discontinued in plugins.
const validModes = [PLUGIN_NAV_MODE_SIDEBAR, PLUGIN_NAV_MODE_TOP];
if (!validModes.includes(mode)) {
// eslint-disable-next-line no-console
console.warn(
consolePrefix(),
`${mode} is an invalid mode for admin plugin config pages, only ${validModes} are usable.`
);
return;
if (validModes.includes(links[0])) {
links.shift();
}
registerAdminPluginConfigNav(pluginId, mode, links);
registerAdminPluginConfigNav(pluginId, links.flat());
}
/**

View File

@ -2,55 +2,15 @@ import { getOwner } from "@ember/owner";
import { render } from "@ember/test-helpers";
import { hbs } from "ember-cli-htmlbars";
import { module, test } from "qunit";
import {
PLUGIN_NAV_MODE_SIDEBAR,
PLUGIN_NAV_MODE_TOP,
registerAdminPluginConfigNav,
} from "discourse/lib/admin-plugin-config-nav";
import { registerAdminPluginConfigNav } from "discourse/lib/admin-plugin-config-nav";
import { setupRenderingTest } from "discourse/tests/helpers/component-test";
import AdminPlugin from "admin/models/admin-plugin";
module("Integration | Component | admin-plugin-config-area", function (hooks) {
setupRenderingTest(hooks);
test("it renders the plugin config nav and content in the sidebar mode but not along the top", async function (assert) {
registerAdminPluginConfigNav(
"discourse-test-plugin",
PLUGIN_NAV_MODE_SIDEBAR,
[
{
route: "adminPlugins.show.discourse-test-plugin.one",
label: "admin.title",
},
{
route: "adminPlugins.show.discourse-test-plugin.two",
label: "admin.back_to_forum",
},
]
);
getOwner(this).lookup("service:admin-plugin-nav-manager").currentPlugin =
new AdminPlugin({ id: "discourse-test-plugin" });
await render(hbs`
<AdminPluginConfigArea>
Test content
</AdminPluginConfigArea>
`);
assert
.dom(".admin-plugin-inner-sidebar-nav__item")
.exists(
{ count: 3 },
"renders the correct number of sidebar nav items (including always adding a Settings link)"
);
assert
.dom(".admin-plugin-config-area")
.hasText("Test content", "renders the yielded content");
});
test("it does not render the nav items in the sidebar when using top mode but it does along the top", async function (assert) {
registerAdminPluginConfigNav("discourse-test-plugin", PLUGIN_NAV_MODE_TOP, [
test("it renders the nav items along the top", async function (assert) {
registerAdminPluginConfigNav("discourse-test-plugin", [
{
route: "adminPlugins.show.discourse-test-plugin.one",
label: "admin.title",

View File

@ -1,4 +1,3 @@
import { PLUGIN_NAV_MODE_TOP } from "discourse/lib/admin-plugin-config-nav";
import { withPluginApi } from "discourse/lib/plugin-api";
import ChatAdminPluginActions from "discourse/plugins/chat/admin/components/chat-admin-plugin-actions";
@ -12,7 +11,7 @@ export default {
}
withPluginApi("1.1.0", (api) => {
api.addAdminPluginConfigurationNav("chat", PLUGIN_NAV_MODE_TOP, [
api.addAdminPluginConfigurationNav("chat", [
{
label: "chat.incoming_webhooks.title",
route: "adminPlugins.show.discourse-chat-incoming-webhooks",