From 50ec1811779332f0124046e96c74646d0bd5f01c Mon Sep 17 00:00:00 2001 From: Lemon-miaow Date: Sun, 27 Sep 2026 15:21:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(panel):=20=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=97=A0=E5=8C=B9=E9=85=8D=E6=97=B6=E7=BB=99?= =?UTF-8?q?=E5=87=BA=E7=9C=9F=E7=9A=84=E6=B8=85=E9=99=A4=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E6=8C=89=E9=92=AE=EF=BC=8C=E6=B8=85=E6=8E=89=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E5=92=8C=E7=8A=B6=E6=80=81=E7=AD=9B=E9=80=89=E5=B9=B6=E5=9B=9E?= =?UTF-8?q?=E5=88=B0=E7=AC=AC=E4=B8=80=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- panel/src/pages/servers/ServersPage.test.tsx | 61 +++++++++++++++++++- panel/src/pages/servers/ServersPage.tsx | 16 ++++- 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/panel/src/pages/servers/ServersPage.test.tsx b/panel/src/pages/servers/ServersPage.test.tsx index 33f4a62..51c1eba 100644 --- a/panel/src/pages/servers/ServersPage.test.tsx +++ b/panel/src/pages/servers/ServersPage.test.tsx @@ -1,6 +1,6 @@ // @vitest-environment jsdom -import { describe, it, expect, vi, beforeEach, beforeAll } from "vitest"; -import { render, screen, within } from "@testing-library/react"; +import { describe, it, expect, vi, beforeEach, beforeAll, afterEach } from "vitest"; +import { act, render, screen, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { MemoryRouter } from "react-router-dom"; import type { FleetServer, MyServerView } from "@/lib/types"; @@ -341,3 +341,60 @@ describe("ServersPage order and paging", () => { expect(await tableOrder()).toEqual(names.slice(0, 20)); }); }); + +describe("ServersPage with nothing matching", () => { + afterEach(() => { + vi.useRealTimers(); + }); + + it("clears the search and the phase filter from the empty state", async () => { + tier.isAdmin = false; + const mine = (name: string): MyServerView => ({ + name, + subdomain: name, + owned: true, + claimable: false, + phase: "Running", + playersOnline: 0, + playersMax: 20, + }); + calls.myServers.mockResolvedValue([mine("survival"), mine("creative")]); + const user = renderPage(); + await tableOrder(); + + const search = screen.getByPlaceholderText(/Search/) as HTMLInputElement; + await user.type(search, "zzz"); + await user.click(screen.getByRole("combobox", { name: "Filter by phase" })); + await user.click(await screen.findByRole("option", { name: "Stopping" })); + expect(screen.getByText("No matching servers found.")).toBeTruthy(); + expect(screen.getByText("No server matches the current search or filter.")).toBeTruthy(); + + await user.click(screen.getByRole("button", { name: "Clear filters" })); + expect(await tableOrder()).toEqual(["creative", "survival"]); + expect(search.value).toBe(""); + expect(screen.getByRole("combobox", { name: "Filter by phase" }).textContent).toBe("All phases"); + }); + + it("starts the cleared list from its first page", async () => { + vi.useFakeTimers({ shouldAdvanceTime: true }); + const names = Array.from({ length: 21 }, (_, i) => `srv-${String(i + 1).padStart(2, "0")}`); + calls.fleet.mockResolvedValue(names.map((n) => row(n, { phase: "Running", ready: true }))); + const user = userEvent.setup({ advanceTimers: vi.advanceTimersByTime }); + render( + + + , + ); + await tableOrder(); + await user.click(screen.getByRole("combobox", { name: "Filter by phase" })); + await user.click(await screen.findByRole("option", { name: "Running" })); + await user.click(screen.getByRole("button", { name: /Next/ })); + expect(await tableOrder()).toEqual(["srv-21"]); + + // The next reread finds every server stopped, so the filtered page empties. + calls.fleet.mockResolvedValue(names.map((n) => row(n, {}))); + await act(() => vi.advanceTimersByTimeAsync(10_000)); + await user.click(await screen.findByRole("button", { name: "Clear filters" })); + expect(await tableOrder()).toEqual(names.slice(0, 20)); + }); +}); diff --git a/panel/src/pages/servers/ServersPage.tsx b/panel/src/pages/servers/ServersPage.tsx index ff7e05b..fe990ae 100644 --- a/panel/src/pages/servers/ServersPage.tsx +++ b/panel/src/pages/servers/ServersPage.tsx @@ -402,8 +402,20 @@ export function ServersPage() { ) : visible.length === 0 ? ( + hint={t("fleet_no_match_hint")} + > + + ) : ( <> {/* Cards until the table fits (two per row from md). The admin