diff --git a/web/apps/web-ele/src/views/_core/menu/data.ts b/web/apps/web-ele/src/views/_core/menu/data.ts index b2cb0f1..1606fbd 100644 --- a/web/apps/web-ele/src/views/_core/menu/data.ts +++ b/web/apps/web-ele/src/views/_core/menu/data.ts @@ -15,6 +15,9 @@ export function getMenuTypeOptions() { value: 'embedded', }, { type: 'warning', label: $t('menu.typeLink'), value: 'link' }, + { type: 'primary', label: $t('menu.typeOnlineForm'), value: 'online_form' }, + { type: 'primary', label: $t('menu.typeOnlinePage'), value: 'online_page' }, + { type: 'primary', label: $t('menu.typeOnlineReport'), value: 'online_report' }, { type: 'success', label: $t('menu.typeAgent'), value: 'agent' }, ]; } diff --git a/web/apps/web-ele/src/views/_core/menu/modules/menu-form.vue b/web/apps/web-ele/src/views/_core/menu/modules/menu-form.vue index 3465ee1..f02f909 100644 --- a/web/apps/web-ele/src/views/_core/menu/modules/menu-form.vue +++ b/web/apps/web-ele/src/views/_core/menu/modules/menu-form.vue @@ -26,7 +26,6 @@ import { getAllMenuTreeApi, updateMenuApi, } from '#/api/core/menu'; -import { filterLightMenuTree } from '#/router/light-menu'; import { useAppContextStore } from '#/store/app-context'; import { getMenuTypeOptions } from '../data'; @@ -58,7 +57,7 @@ function processMenuData(menus: any[]): any[] { async function getMenuListProcessed() { const applicationId = appContextStore.currentApp?.id; const data = await getAllMenuTreeApi(applicationId); - return processMenuData(filterLightMenuTree(data)); + return processMenuData(data); } /** @@ -79,7 +78,53 @@ async function isMenuPathExists(path: string, excludeId?: string) { return result.exists; } +const ONLINE_COMPONENT_MAP: Record = { + online_form: 'online-dev/form-render/index', + online_page: '/_core/page-render/index', + online_report: 'online-dev/report-render/index', +}; + +function resolveFormCode(menuData: Record): string | undefined { + return ( + menuData.query?.formCode ?? + menuData.path?.match(/^\/form-render\/([^/]+)$/)?.[1] + ); +} + +function resolvePageCode(menuData: Record): string | undefined { + return ( + menuData.query?.pageCode ?? + menuData.path?.match(/^\/page-render\/([^/]+)$/)?.[1] + ); +} + +function resolveReportCode(menuData: Record): string | undefined { + return ( + menuData.query?.reportCode ?? + menuData.path?.match(/^\/report-render\/([^/]+)$/)?.[1] + ); +} + function normalizeMenuFormFields(menuData: Record) { + switch (menuData.type) { + case 'online_form': { + menuData.formCode = resolveFormCode(menuData); + break; + } + case 'online_page': { + menuData.pageCode = resolvePageCode(menuData); + break; + } + case 'online_report': { + menuData.reportCode = resolveReportCode(menuData); + break; + } + // No default + } + if (ONLINE_COMPONENT_MAP[menuData.type]) { + menuData.onlineComponentPath = + menuData.component || ONLINE_COMPONENT_MAP[menuData.type]; + } return menuData; } @@ -101,13 +146,16 @@ const componentKeys = [ '/_core/fallback/forbidden', '/_core/fallback/not-found', '/_core/menu/index', + '/_core/page-render/index', '/_core/permission/index', '/_core/role/index', '/_core/user/index', + '/ai-platform/agent/editor/index', '/ai-platform/agent/index', '/ai-platform/knowledge/detail/index', '/ai-platform/knowledge/index', '/ai-platform/model/index', + '/ai-platform/workflow/editor/index', '/ai-platform/workflow/index', '/ai-platform/workflow-runs/index', ]; @@ -224,7 +272,15 @@ function getFormSchema( }, dependencies: { show: (values) => { - return ['agent', 'catalog', 'embedded', 'menu'].includes(values.type); + return [ + 'agent', + 'catalog', + 'embedded', + 'menu', + 'online_form', + 'online_page', + 'online_report', + ].includes(values.type); }, triggerFields: ['type'], }, @@ -300,7 +356,15 @@ function getFormSchema( }, dependencies: { show: (values) => { - return ['catalog', 'embedded', 'link', 'menu'].includes(values.type); + return [ + 'catalog', + 'embedded', + 'link', + 'menu', + 'online_form', + 'online_page', + 'online_report', + ].includes(values.type); }, triggerFields: ['type'], }, @@ -315,7 +379,15 @@ function getFormSchema( }, dependencies: { show: (values) => { - return ['agent', 'catalog', 'embedded', 'menu'].includes(values.type); + return [ + 'agent', + 'catalog', + 'embedded', + 'menu', + 'online_form', + 'online_page', + 'online_report', + ].includes(values.type); }, triggerFields: ['type'], }, @@ -343,6 +415,66 @@ function getFormSchema( fieldName: 'component', label: $t('menu.component'), }, + { + component: 'Input', + fieldName: 'formCode', + hide: true, + }, + { + component: 'Input', + componentProps: { + clearable: true, + class: 'w-full', + placeholder: $t('ui.placeholder.input'), + }, + dependencies: { + rules: (values) => { + return values.type === 'online_page' ? 'required' : null; + }, + show: (values) => { + return values.type === 'online_page'; + }, + triggerFields: ['type'], + }, + fieldName: 'pageCode', + label: $t('menu.pageCode'), + }, + { + component: 'Input', + componentProps: { + clearable: true, + class: 'w-full', + placeholder: $t('ui.placeholder.input'), + }, + dependencies: { + rules: (values) => { + return values.type === 'online_report' ? 'required' : null; + }, + show: (values) => { + return values.type === 'online_report'; + }, + triggerFields: ['type'], + }, + fieldName: 'reportCode', + label: $t('menu.reportCode'), + }, + { + component: 'Input', + componentProps: { + disabled: true, + class: 'w-full', + }, + dependencies: { + show: (values) => { + return ['online_form', 'online_page', 'online_report'].includes( + values.type, + ); + }, + triggerFields: ['type'], + }, + fieldName: 'onlineComponentPath', + label: $t('menu.componentPath'), + }, { component: 'ApiSelect', componentProps: { @@ -489,7 +621,13 @@ function getFormSchema( defaultValue: false, dependencies: { show: (values) => { - return ['agent', 'menu'].includes(values.type); + return [ + 'agent', + 'menu', + 'online_form', + 'online_page', + 'online_report', + ].includes(values.type); }, triggerFields: ['type'], }, @@ -509,7 +647,14 @@ function getFormSchema( defaultValue: false, dependencies: { show: (values) => { - return ['agent', 'embedded', 'menu'].includes(values.type); + return [ + 'agent', + 'embedded', + 'menu', + 'online_form', + 'online_page', + 'online_report', + ].includes(values.type); }, triggerFields: ['type'], }, @@ -609,7 +754,14 @@ function getFormSchema( defaultValue: false, dependencies: { show: (values) => { - return ['agent', 'embedded', 'menu'].includes(values.type); + return [ + 'agent', + 'embedded', + 'menu', + 'online_form', + 'online_page', + 'online_report', + ].includes(values.type); }, triggerFields: ['type'], }, @@ -629,7 +781,13 @@ function getFormSchema( defaultValue: true, dependencies: { show: (values) => { - return ['agent', 'menu'].includes(values.type); + return [ + 'agent', + 'menu', + 'online_form', + 'online_page', + 'online_report', + ].includes(values.type); }, triggerFields: ['type'], }, @@ -727,9 +885,55 @@ async function onUpdate() { break; } + case 'online_form': { + data.query = { formCode: data.formCode }; + data.component = ONLINE_COMPONENT_MAP.online_form; + if ( + data.formCode && + (!data.path || data.path.startsWith('/form-render/')) + ) { + data.path = `/form-render/${data.formCode}`; + } + + break; + } + case 'online_page': { + data.query = { pageCode: data.pageCode }; + data.component = ONLINE_COMPONENT_MAP.online_page; + if ( + data.pageCode && + (!data.path || data.path.startsWith('/page-render/')) + ) { + data.path = `/page-render/${data.pageCode}`; + } + + break; + } + case 'online_report': { + const prevQuery = formData.value?.query || {}; + data.query = { + relationId: prevQuery.relationId ?? prevQuery.templateId, + moduleId: prevQuery.moduleId ?? prevQuery.templateId, + templateId: prevQuery.templateId ?? prevQuery.relationId, + reportCode: data.reportCode, + }; + data.component = ONLINE_COMPONENT_MAP.online_report; + if (data.reportCode) { + data.authCode = `report:${data.reportCode}:preview`; + if (!data.path || data.path.startsWith('/report-render/')) { + data.path = `/report-render/${data.reportCode}`; + } + } + + break; + } // No default } delete data.linkSrc; + delete data.formCode; + delete data.pageCode; + delete data.reportCode; + delete data.onlineComponentPath; // 确保 parent_id 清空时发送 null 而不是 undefined if (data.parent_id === undefined || data.parent_id === '') {