From 1ce65bf1c9bfbd937a4cc0d20268890b75c8d305 Mon Sep 17 00:00:00 2001 From: yyh Date: Wed, 24 Jun 2026 17:19:10 +0800 Subject: [PATCH] feat: router push to agent details page when create agent --- .../__tests__/create-agent-dialog.spec.tsx | 30 ++++++++++++++++++- .../roster/components/create-agent-dialog.tsx | 6 +++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/web/features/agent-v2/roster/components/__tests__/create-agent-dialog.spec.tsx b/web/features/agent-v2/roster/components/__tests__/create-agent-dialog.spec.tsx index 559cfb41f1b..3c06e441635 100644 --- a/web/features/agent-v2/roster/components/__tests__/create-agent-dialog.spec.tsx +++ b/web/features/agent-v2/roster/components/__tests__/create-agent-dialog.spec.tsx @@ -1,4 +1,4 @@ -import { render, screen, waitFor, within } from '@testing-library/react' +import { act, render, screen, waitFor, within } from '@testing-library/react' import userEvent from '@testing-library/user-event' import { CreateAgentDialog } from '../create-agent-dialog' @@ -12,6 +12,8 @@ const toastMock = vi.hoisted(() => ({ success: vi.fn(), })) +const routerPushMock = vi.hoisted(() => vi.fn()) + vi.mock('@tanstack/react-query', () => ({ useMutation: () => ({ isPending: mutationMock.isPending, @@ -23,6 +25,12 @@ vi.mock('@langgenius/dify-ui/toast', () => ({ toast: toastMock, })) +vi.mock('@/next/navigation', () => ({ + useRouter: () => ({ + push: routerPushMock, + }), +})) + vi.mock('@/service/client', () => ({ consoleQuery: { agent: { @@ -67,6 +75,26 @@ describe('CreateAgentDialog', () => { expect(mutationOptions).not.toHaveProperty('onError') }) + it('navigates to the new agent configure page after creating an agent', async () => { + const user = userEvent.setup() + render() + + await user.click(screen.getByRole('button', { name: /agentV2\.roster\.createAgent/ })) + + const dialog = await screen.findByRole('dialog', { name: 'agentV2.roster.createDialog.title' }) + await user.type(within(dialog).getByRole('textbox', { name: 'agentV2.roster.createForm.nameLabel' }), 'Research Agent') + await user.type(within(dialog).getByRole('textbox', { name: 'agentV2.roster.createForm.roleLabel' }), 'Research Assistant') + await user.click(within(dialog).getByRole('button', { name: 'common.operation.create' })) + + const mutationOptions = mutationMock.mutate.mock.calls[0]?.[1] + await act(async () => { + mutationOptions.onSuccess({ id: 'agent-1' }) + }) + + expect(toastMock.success).toHaveBeenCalledWith('agentV2.roster.createSuccess') + expect(routerPushMock).toHaveBeenCalledWith('/roster/agent/agent-1/configure') + }) + it('shows a field error when creating with an empty name', async () => { const user = userEvent.setup() render() diff --git a/web/features/agent-v2/roster/components/create-agent-dialog.tsx b/web/features/agent-v2/roster/components/create-agent-dialog.tsx index 8d31016c54c..e515184091e 100644 --- a/web/features/agent-v2/roster/components/create-agent-dialog.tsx +++ b/web/features/agent-v2/roster/components/create-agent-dialog.tsx @@ -10,13 +10,16 @@ import { useMutation } from '@tanstack/react-query' import { useState } from 'react' import { useTranslation } from 'react-i18next' import AppIconPicker from '@/app/components/base/app-icon-picker' +import { useRouter } from '@/next/navigation' import { consoleQuery } from '@/service/client' +import { getAgentDetailPath } from '../../agent-detail/routes' import { defaultAgentIcon } from './agent-form' import { AgentFormFields } from './agent-form-fields' export function CreateAgentDialog() { const { t } = useTranslation('agentV2') const { t: tCommon } = useTranslation('common') + const router = useRouter() const [open, setOpen] = useState(false) const [formKey, setFormKey] = useState(0) const [name, setName] = useState('') @@ -59,9 +62,10 @@ export function CreateAgentDialog() { createAgentMutation.mutate({ body, }, { - onSuccess: () => { + onSuccess: (createdAgent) => { toast.success(t('roster.createSuccess')) handleOpenChange(false) + router.push(getAgentDetailPath(createdAgent.id, 'configure')) }, }) }