diff --git a/src/components/image-editor/ImageCanvasTaskSidebarView.test.tsx b/src/components/image-editor/ImageCanvasTaskSidebarView.test.tsx index cb008fdac..d8640f038 100644 --- a/src/components/image-editor/ImageCanvasTaskSidebarView.test.tsx +++ b/src/components/image-editor/ImageCanvasTaskSidebarView.test.tsx @@ -172,45 +172,45 @@ describe('ImageCanvasTaskSidebarView', () => { const completedAt = new Date(Date.now() - 20_000).toISOString(); listExternalGenerationTasksMock.mockImplementation( (options: Parameters[0] = {}) => - Promise.resolve({ - overview: { - pendingCount: 0, - runningCount: 1, - unacknowledgedTerminalCount: 1, - updatedAtMicros: 1, - }, - tasks: options.statuses?.includes('running') - ? [ - createExternalTask({ - jobId: 'active-current', - startedAt, - }), - createExternalTask({ - jobId: 'active-other-project', - sourceEntityId: 'project-other', - requestPrompt: '不该显示的外部项目任务', - }), - ] - : [ - createExternalTask({ - jobId: 'done-current', - status: 'completed', - requestPrompt: '已完成提示词', - startedAt: new Date(Date.now() - 90_000).toISOString(), - completedAt, - updatedAt: completedAt, - progress: 100, - phaseDetail: '生成已完成。', - }), - createExternalTask({ - jobId: 'done-other-project', - sourceEntityId: 'project-other', - status: 'completed', - requestPrompt: '另一个项目的已完成任务', - completedAt, - }), - ], - }), + Promise.resolve({ + overview: { + pendingCount: 0, + runningCount: 1, + unacknowledgedTerminalCount: 1, + updatedAtMicros: 1, + }, + tasks: options.statuses?.includes('running') + ? [ + createExternalTask({ + jobId: 'active-current', + startedAt, + }), + createExternalTask({ + jobId: 'active-other-project', + sourceEntityId: 'project-other', + requestPrompt: '不该显示的外部项目任务', + }), + ] + : [ + createExternalTask({ + jobId: 'done-current', + status: 'completed', + requestPrompt: '已完成提示词', + startedAt: new Date(Date.now() - 90_000).toISOString(), + completedAt, + updatedAt: completedAt, + progress: 100, + phaseDetail: '生成已完成。', + }), + createExternalTask({ + jobId: 'done-other-project', + sourceEntityId: 'project-other', + status: 'completed', + requestPrompt: '另一个项目的已完成任务', + completedAt, + }), + ], + }), ); render( @@ -237,4 +237,56 @@ describe('ImageCanvasTaskSidebarView', () => { expect(screen.getByText(/完成于/u)).toBeTruthy(); expect(screen.queryByText(/另一个项目的已完成任务/u)).toBeNull(); }); + + it('keeps the empty active tab selected after manual tab click', async () => { + const completedAt = new Date(Date.now() - 20_000).toISOString(); + listExternalGenerationTasksMock.mockImplementation( + (options: Parameters[0] = {}) => + Promise.resolve({ + overview: { + pendingCount: 0, + runningCount: 0, + unacknowledgedTerminalCount: 1, + updatedAtMicros: 1, + }, + tasks: options.statuses?.includes('running') + ? [] + : [ + createExternalTask({ + jobId: 'done-current', + status: 'completed', + requestPrompt: '已完成提示词', + completedAt, + updatedAt: completedAt, + }), + ], + }), + ); + + render( + , + ); + + await screen.findByText('暂无任务'); + const activeTab = screen.getByRole('tab', { name: /排队\/生成中/u }); + const completedTab = screen.getByRole('tab', { name: /已完成/u }); + + fireEvent.click(completedTab); + expect(await screen.findByText(/已完成提示词/u)).toBeTruthy(); + + fireEvent.click(activeTab); + + expect(activeTab.getAttribute('aria-selected')).toBe('true'); + expect(screen.getByText('暂无任务')).toBeTruthy(); + expect(screen.queryByText(/已完成提示词/u)).toBeNull(); + }); }); diff --git a/src/components/image-editor/ImageCanvasTaskSidebarView.tsx b/src/components/image-editor/ImageCanvasTaskSidebarView.tsx index ae936f9d6..464e6e1c4 100644 --- a/src/components/image-editor/ImageCanvasTaskSidebarView.tsx +++ b/src/components/image-editor/ImageCanvasTaskSidebarView.tsx @@ -555,15 +555,9 @@ export function ImageCanvasTaskSidebarView({ const previousActiveItemCount = previousActiveItemCountRef.current; if (activeItems.length > previousActiveItemCount) { setActiveTab('active'); - } else if ( - activeItems.length === 0 && - activeTab === 'active' && - completedItems.length > 0 - ) { - setActiveTab('completed'); } previousActiveItemCountRef.current = activeItems.length; - }, [activeItems.length, activeTab, completedItems.length]); + }, [activeItems.length]); const visibleItems = activeTab === 'active' ? activeItems : completedItems;