mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-06-24 00:53:55 +08:00
- 新增路由 plugin-app 与壳页,按 nav_key 尝试 AppPage{Pascal}/AppPage/Page
- DefaultLayout 与 appcenter 合并插件侧栏项;plugin/sidebar_nav 经 Pinia 去重缓存
- 工具 pluginSidebarNav、联邦 loader 与文档/示例更新;登出时清空侧栏缓存
Made-with: Cursor
55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import type { Composer } from 'vue-i18n'
|
|
import type { NavMenu } from '@/@layouts/types'
|
|
import type { PluginSidebarNavItem } from '@/api/types'
|
|
import { pluginSidebarSectionToHeaderKey } from '@/router/i18n-menu'
|
|
import { filterMenusByPermission } from '@/utils/permission'
|
|
|
|
export type PluginNavMenuEntry = {
|
|
navMenu: NavMenu & { permission?: string }
|
|
section: string
|
|
}
|
|
|
|
/**
|
|
* 将后端 sidebar_nav 单项转为侧栏 / 应用中心 共用的 NavMenu
|
|
*/
|
|
export function navMenuFromPluginSidebarItem(
|
|
item: PluginSidebarNavItem,
|
|
t: Composer['t'],
|
|
): NavMenu & { permission?: string } {
|
|
const section = item.section || 'system'
|
|
const header = pluginSidebarSectionToHeaderKey(section, t)
|
|
return {
|
|
title: item.title,
|
|
icon: item.icon,
|
|
to: {
|
|
name: 'plugin-app',
|
|
params: {
|
|
pluginId: item.plugin_id,
|
|
navKey: item.nav_key,
|
|
},
|
|
},
|
|
header,
|
|
permission: item.permission ?? undefined,
|
|
} as NavMenu & { permission?: string }
|
|
}
|
|
|
|
/**
|
|
* 过滤有权限的插件导航项,并保留 section 供 DefaultLayout 分栏插入
|
|
*/
|
|
export function filterPluginSidebarNavEntries(
|
|
items: PluginSidebarNavItem[],
|
|
t: Composer['t'],
|
|
userPermissions: Record<string, unknown>,
|
|
): PluginNavMenuEntry[] {
|
|
const out: PluginNavMenuEntry[] = []
|
|
for (const item of items) {
|
|
const section = item.section || 'system'
|
|
const navMenu = navMenuFromPluginSidebarItem(item, t)
|
|
if (!filterMenusByPermission([navMenu], userPermissions).length) {
|
|
continue
|
|
}
|
|
out.push({ navMenu, section })
|
|
}
|
|
return out
|
|
}
|