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) {