diff --git a/easyflow-ui-admin/app/src/layouts/AuthenticatedStandaloneLayout.vue b/easyflow-ui-admin/app/src/layouts/AuthenticatedStandaloneLayout.vue new file mode 100644 index 00000000..0c9b3ba1 --- /dev/null +++ b/easyflow-ui-admin/app/src/layouts/AuthenticatedStandaloneLayout.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/easyflow-ui-admin/app/src/router/__tests__/agent-design-route.test.ts b/easyflow-ui-admin/app/src/router/__tests__/agent-design-route.test.ts new file mode 100644 index 00000000..e49afce6 --- /dev/null +++ b/easyflow-ui-admin/app/src/router/__tests__/agent-design-route.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest'; + +import agentDesignRoutes from '../routes/external/agent-design'; +import agentRoutes from '../routes/modules/agent'; + +describe('agent design route', () => { + it('keeps the standalone designer outside dynamic menu routes', () => { + const designRoute = agentDesignRoutes.find( + (route) => route.name === 'AgentDesigner', + ); + + expect(agentRoutes.some((route) => route.name === 'AgentDesigner')).toBe( + false, + ); + expect(designRoute).toBeDefined(); + expect(designRoute?.path).toBe('/ai/agents/designer/:id'); + expect(designRoute?.meta).toMatchObject({ + activePath: '/ai/agents', + hideInBreadcrumb: true, + hideInMenu: true, + hideInTab: true, + noBasicLayout: true, + openInNewWindow: true, + }); + expect(designRoute?.meta?.ignoreAccess).not.toBe(true); + expect(designRoute?.component).toBeTypeOf('function'); + }); +}); diff --git a/easyflow-ui-admin/app/src/router/__tests__/workflow-design-route.test.ts b/easyflow-ui-admin/app/src/router/__tests__/workflow-design-route.test.ts new file mode 100644 index 00000000..b60a894d --- /dev/null +++ b/easyflow-ui-admin/app/src/router/__tests__/workflow-design-route.test.ts @@ -0,0 +1,23 @@ +import { describe, expect, it } from 'vitest'; + +import workflowRoutes from '../routes/modules/workflow'; + +describe('workflow design route', () => { + it('uses the authenticated standalone shell without exposing a menu or tab', () => { + const designRoute = workflowRoutes.find( + (route) => route.name === 'WorkflowDesign', + ); + + expect(designRoute).toBeDefined(); + expect(designRoute?.path).toBe('/ai/workflow/design'); + expect(designRoute?.meta).toMatchObject({ + activePath: '/ai/workflow', + hideInBreadcrumb: true, + hideInMenu: true, + hideInTab: true, + noBasicLayout: true, + }); + expect(designRoute?.meta?.ignoreAccess).not.toBe(true); + expect(designRoute?.component).toBeTypeOf('function'); + }); +}); diff --git a/easyflow-ui-admin/app/src/router/routes/external/agent-design.ts b/easyflow-ui-admin/app/src/router/routes/external/agent-design.ts new file mode 100644 index 00000000..15902691 --- /dev/null +++ b/easyflow-ui-admin/app/src/router/routes/external/agent-design.ts @@ -0,0 +1,23 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + name: 'AgentDesigner', + path: '/ai/agents/designer/:id', + component: () => + import('#/views/ai/agents/AgentDesignerStandaloneView.vue'), + meta: { + title: $t('menus.ai.agents'), + openInNewWindow: true, + hideInMenu: true, + hideInTab: true, + hideInBreadcrumb: true, + noBasicLayout: true, + activePath: '/ai/agents', + }, + }, +]; + +export default routes; diff --git a/easyflow-ui-admin/app/src/router/routes/modules/agent.ts b/easyflow-ui-admin/app/src/router/routes/modules/agent.ts index 16648870..e4c737bb 100644 --- a/easyflow-ui-admin/app/src/router/routes/modules/agent.ts +++ b/easyflow-ui-admin/app/src/router/routes/modules/agent.ts @@ -1,19 +1,6 @@ -import type {RouteRecordRaw} from 'vue-router'; - -import {$t} from '#/locales'; +import type { RouteRecordRaw } from 'vue-router'; const routes: RouteRecordRaw[] = [ - { - name: 'AgentDesigner', - path: '/ai/agents/designer/:id', - component: () => import('#/views/ai/agents/AgentDesigner.vue'), - meta: { - title: $t('menus.ai.agents'), - openInNewWindow: true, - hideInMenu: true, - activePath: '/ai/agents', - }, - }, { name: 'AgentChat', path: '/ai/agent-chat', diff --git a/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts b/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts index 8bce4f3b..808c47ce 100644 --- a/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts +++ b/easyflow-ui-admin/app/src/router/routes/modules/workflow.ts @@ -8,11 +8,15 @@ const routes: RouteRecordRaw[] = [ icon: 'ant-design:apartment-outlined', title: '工作流设计', hideInMenu: true, + hideInTab: true, + hideInBreadcrumb: true, + noBasicLayout: true, activePath: '/ai/workflow', }, name: 'WorkflowDesign', path: '/ai/workflow/design', - component: () => import('#/views/ai/workflow/WorkflowDesign.vue'), + component: () => + import('#/views/ai/workflow/WorkflowDesignStandaloneView.vue'), }, { meta: { diff --git a/easyflow-ui-admin/app/src/views/ai/agents/AgentDesignerStandaloneView.vue b/easyflow-ui-admin/app/src/views/ai/agents/AgentDesignerStandaloneView.vue new file mode 100644 index 00000000..60367294 --- /dev/null +++ b/easyflow-ui-admin/app/src/views/ai/agents/AgentDesignerStandaloneView.vue @@ -0,0 +1,11 @@ + + + diff --git a/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowDesignStandaloneView.vue b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowDesignStandaloneView.vue new file mode 100644 index 00000000..e2819d61 --- /dev/null +++ b/easyflow-ui-admin/app/src/views/ai/workflow/WorkflowDesignStandaloneView.vue @@ -0,0 +1,31 @@ + + + + +