This is an automated email from the ASF dual-hosted git repository.

lizhimins pushed a commit to branch rocketmq-studio
in repository https://gitbox.apache.org/repos/asf/rocketmq-dashboard.git


The following commit(s) were added to refs/heads/rocketmq-studio by this push:
     new 3d5f625d2 fix(topic): refresh paginated inventory after create (#3339)
3d5f625d2 is described below

commit 3d5f625d2952cf0d38d6e98e5956921cc04af32f
Author: qiyu <[email protected]>
AuthorDate: Wed Sep 9 17:28:05 2026 +0800

    fix(topic): refresh paginated inventory after create (#3339)
    
    Signed-off-by: qiyu-lu <[email protected]>
---
 .../pages/instance/__tests__/TopicPage.test.tsx    | 45 ++++++++++++++++++++++
 web/src/pages/instance/topic.tsx                   |  8 ++--
 2 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/web/src/pages/instance/__tests__/TopicPage.test.tsx 
b/web/src/pages/instance/__tests__/TopicPage.test.tsx
index 9a5c69e1c..4a15c614a 100644
--- a/web/src/pages/instance/__tests__/TopicPage.test.tsx
+++ b/web/src/pages/instance/__tests__/TopicPage.test.tsx
@@ -219,6 +219,51 @@ describe('TopicPage', () => {
     expect(screen.getByText(/与 Broker 同进程部署的 Proxy 地址/)).toBeInTheDocument();
   });
 
+  it('reloads the authoritative server page after creating a topic', async () 
=> {
+    const existingTopic = { ...buildTopics(1)[0], name: 'topic-b' };
+    const createdTopic = {
+      ...buildTopics(1)[0],
+      name: 'topic-a',
+      clusterId: 'server-cluster',
+      remark: 'create response',
+      gmtCreate: '2026-01-02T00:00:00Z',
+      gmtModified: '2026-01-02T00:00:00Z',
+    };
+    const serverCreatedTopic = { ...createdTopic, remark: 'server page 
response' };
+    topicServiceMocks.listTopicsPage
+      .mockResolvedValueOnce({ items: [existingTopic], total: 1, page: 1, 
size: 20 })
+      .mockResolvedValueOnce({
+        items: [serverCreatedTopic, existingTopic],
+        total: 2,
+        page: 1,
+        size: 20,
+      });
+    topicServiceMocks.createTopic.mockResolvedValue(createdTopic);
+    const user = userEvent.setup();
+    renderWithProviders();
+
+    expect(await screen.findByText('共 1 个 Topic')).toBeInTheDocument();
+    await user.click(screen.getByRole('button', { name: /创建 Topic/ }));
+    const dialog = await screen.findByRole('dialog');
+    await user.type(within(dialog).getByLabelText('Topic 名称'), 'topic-a');
+    await user.click(within(dialog).getByRole('button', { name: /创\s*建/ }));
+
+    await waitFor(() => 
expect(topicServiceMocks.createTopic).toHaveBeenCalledTimes(1));
+    await waitFor(() => 
expect(topicServiceMocks.listTopicsPage).toHaveBeenCalledTimes(2));
+    expect(topicServiceMocks.listTopicsPage).toHaveBeenLastCalledWith({
+      instanceId: 'instance-proxy-1',
+      type: undefined,
+      search: undefined,
+      page: 1,
+      pageSize: 20,
+    });
+    expect(screen.getByText('共 2 个 Topic')).toBeInTheDocument();
+    expect(within(getTableBody()).getByText('topic-a')).toBeInTheDocument();
+    expect(within(getTableBody()).getByText('topic-b')).toBeInTheDocument();
+    expect(within(getTableBody()).getByText('server page 
response')).toBeInTheDocument();
+    expect(within(getTableBody()).queryByText('create 
response')).not.toBeInTheDocument();
+  });
+
   it('ignores duplicate Topic creates while the first request is pending', 
async () => {
     topicServiceMocks.createTopic.mockImplementation(() => new Promise(() => 
{}));
     const user = userEvent.setup();
diff --git a/web/src/pages/instance/topic.tsx b/web/src/pages/instance/topic.tsx
index 9abb4cc93..a10ddb9c2 100644
--- a/web/src/pages/instance/topic.tsx
+++ b/web/src/pages/instance/topic.tsx
@@ -453,7 +453,7 @@ const TopicPage = () => {
     [selectedInstanceId, typeFilter, searchText],
   );
 
-  const reloadTopicPageAfterDelete = useCallback(async () => {
+  const reloadTopicPage = useCallback(async () => {
     await loadTopicPage(tablePage, tablePageSize);
   }, [loadTopicPage, tablePage, tablePageSize]);
 
@@ -644,7 +644,7 @@ const TopicPage = () => {
         onOk: async () => {
           try {
             await deleteTopic(topic.name, selectedInstanceId || undefined);
-            await reloadTopicPageAfterDelete();
+            await reloadTopicPage();
             message.success(`Topic「${topic.name}」已删除`);
           } catch {
             message.error('删除 Topic 失败,请稍后重试');
@@ -1134,7 +1134,7 @@ const TopicPage = () => {
         ...values,
         instanceId: selectedInstanceId,
       });
-      setTopics((previous) => [created, ...previous]);
+      await reloadTopicPage();
       message.success(`Topic「${created.name}」创建成功`);
       setModalOpen(false);
       form.resetFields();
@@ -1504,7 +1504,7 @@ const TopicPage = () => {
                         names,
                         selectedInstanceId || undefined,
                       );
-                      if (deleted.length > 0) await 
reloadTopicPageAfterDelete();
+                      if (deleted.length > 0) await reloadTopicPage();
                       setSelectedRowKeys(failed);
 
                       if (failed.length === 0) {

Reply via email to