item.title === MORE_GROUP_KEY)) {
- result.push(pluginItems.value);
- }
-
- return result;
+ return applySidebarCustomization(sidebarItems);
}
function collectGroupValues(items, values = new Set()) {
@@ -70,12 +50,6 @@ watch(openedItems, (val) => {
localStorage.setItem('sidebar_openedItems', JSON.stringify(sanitizeOpenedItems(val, sidebarMenu.value)));
}, { deep: true });
-// 当插件项变化时(如插件启用/停用),刷新菜单
-watch(pluginItems, () => {
- sidebarMenu.value = buildSidebarMenu();
- openedItems.value = sanitizeOpenedItems(openedItems.value, sidebarMenu.value);
-});
-
function refreshSidebarMenu() {
sidebarMenu.value = buildSidebarMenu();
openedItems.value = sanitizeOpenedItems(openedItems.value, sidebarMenu.value);
diff --git a/dashboard/src/router/MainRoutes.ts b/dashboard/src/router/MainRoutes.ts
index b75cea1620..4901f8d312 100644
--- a/dashboard/src/router/MainRoutes.ts
+++ b/dashboard/src/router/MainRoutes.ts
@@ -56,6 +56,13 @@ const MainRoutes = {
props: { initialTab: 'market' },
meta: { extensionTab: 'installed', pluginView: 'market' }
},
+ {
+ name: 'ExtensionPluginPages',
+ path: 'pages/:pluginName?/:pageName?',
+ component: () => import('@/views/ExtensionPage.vue'),
+ props: { initialTab: 'installed' },
+ meta: { extensionTab: 'pluginPages', pluginView: 'pluginPages' }
+ },
{
name: 'ExtensionMcp',
path: 'mcp',
@@ -90,11 +97,6 @@ const MainRoutes = {
}
]
},
- {
- name: 'PluginPage',
- path: '/plugin-page/:pluginName/:pageName',
- component: () => import('@/views/PluginPagePage.vue')
- },
{
path: '/extension/:pluginId',
redirect: (to: RouteLocationNormalized) => ({
diff --git a/dashboard/src/views/ExtensionPage.vue b/dashboard/src/views/ExtensionPage.vue
index f632dfa009..cc887a182d 100644
--- a/dashboard/src/views/ExtensionPage.vue
+++ b/dashboard/src/views/ExtensionPage.vue
@@ -4,6 +4,7 @@ import ConsoleDisplayer from "@/components/shared/ConsoleDisplayer.vue";
import ReadmeDialog from "@/components/shared/ReadmeDialog.vue";
import ProxySelector from "@/components/shared/ProxySelector.vue";
import UninstallConfirmDialog from "@/components/shared/UninstallConfirmDialog.vue";
+import PluginPagesSwitcher from "@/components/extension/PluginPagesSwitcher.vue";
import { useExtensionPage } from "./extension/useExtensionPage";
import { computed, defineAsyncComponent } from "vue";
import defaultPluginIcon from "/favicon.svg";
@@ -25,6 +26,12 @@ const MarketPluginsTab = defineAsyncComponent(
const PluginDetailPage = defineAsyncComponent(
() => import("./extension/PluginDetailPage.vue"),
);
+const PluginPagesTab = defineAsyncComponent(
+ () => import("./extension/PluginPagesTab.vue"),
+);
+const PluginPagePage = defineAsyncComponent(
+ () => import("./PluginPagePage.vue"),
+);
const pageState = useExtensionPage(props.initialTab);
const { pluginName, pluginDesc } = usePluginI18n();
@@ -292,6 +299,17 @@ const updateDialogPluginLogo = computed(() => {
+
+
+
{
+
+