fix(webui): include grouped tabs in range selection

This commit is contained in:
Xubin Ren
2026-08-15 15:40:52 +08:00
parent e630e78075
commit 86d228b38e
2 changed files with 45 additions and 0 deletions
+1
View File
@@ -563,6 +563,7 @@ export const ChatList = memo(function ChatList({
const next = new Set(current);
if (range) {
for (const key of range) next.add(key);
for (const key of validKeys) next.add(key);
return next;
}
const remove = validKeys.length > 0 && validKeys.every((key) => next.has(key));
+44
View File
@@ -698,6 +698,50 @@ describe("ChatList", () => {
}
});
it("includes every pane when a Shift-click range ends on a grouped tab", async () => {
render(
<ChatList
sessions={[
session({ chatId: "first", title: "First topic" }),
session({ chatId: "root", title: "Root topic" }),
]}
activeKey="websocket:first"
paneGroups={{
"websocket:root": {
tabKey: "websocket:root",
title: "Root topic",
activePaneKey: "websocket:root",
panes: [
{ key: "websocket:root", chatId: "root", title: "Root topic" },
{ key: "websocket:child", chatId: "child", title: "Research pane" },
],
},
}}
onSelect={vi.fn()}
onRequestDelete={vi.fn()}
onTogglePin={vi.fn()}
onRequestRename={vi.fn()}
onToggleArchive={vi.fn()}
/>,
);
fireEvent.pointerDown(screen.getByRole("button", {
name: "Topic actions for First topic",
}), { button: 0, ctrlKey: false });
fireEvent.click(await screen.findByRole("menuitem", { name: "Select" }));
fireEvent.click(screen.getByRole("button", { name: "Group: Root topic" }), {
shiftKey: true,
});
expect(screen.getByText("3 selected")).toBeInTheDocument();
expect(screen.getByRole("button", { name: "Group: Root topic" }))
.toHaveAttribute("aria-pressed", "true");
expect(screen.getByRole("button", { name: "Root topic" }))
.toHaveAttribute("aria-pressed", "true");
expect(screen.getByRole("button", { name: "Research pane" }))
.toHaveAttribute("aria-pressed", "true");
});
it("shows temporary chats separately and lets the user reopen or close them", async () => {
const temporarySession = session({
key: "temporary:temporary-one",