mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 06:05:24 +00:00
fix: folder rows no longer nest action buttons inside a button
This commit is contained in:
1 parent
ab2307bab4
commit
0324d27f13
2 files changed
+86
-2
No files matched your search
@@ -168,7 +168,18 @@ export function FolderItem({
|
||||
style={depth > 0 ? { paddingLeft: rem(depth * 12) } : undefined}
|
||||
>
|
||||
<div className="relative">
|
||||
<button
|
||||
{/* A div, not a button: the folder actions inside are buttons. */}
|
||||
<div
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
aria-expanded={isOpen}
|
||||
onKeyDown={(e) => {
|
||||
if (e.target !== e.currentTarget) return;
|
||||
if (e.key === "Enter" || e.key === " ") {
|
||||
e.preventDefault();
|
||||
if (!query) onToggleFolder(folderPath);
|
||||
}
|
||||
}}
|
||||
draggable={canDragFolder}
|
||||
onDragStart={(e) => {
|
||||
if (!canDragFolder) return;
|
||||
@@ -294,7 +305,7 @@ export function FolderItem({
|
||||
)}
|
||||
</>
|
||||
}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
{!flat && isOpen && (
|
||||
<div className="border-l border-border/50 ml-[27px]">
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
import { fireEvent, render } from "@testing-library/react";
|
||||
import { expect, it, vi } from "vitest";
|
||||
import type { HostFolder } from "@/types/ui-types";
|
||||
import { FolderItem } from "@/sidebar/tree/FolderItem/FolderItem";
|
||||
|
||||
vi.mock("@/lib/ServerStatusContext", () => ({
|
||||
useServerStatus: () => ({ getStatus: () => "online" }),
|
||||
}));
|
||||
vi.mock("@/sidebar/tree/HostItem/HostItem", () => ({
|
||||
HostItem: () => null,
|
||||
statusCheckEnabled: () => true,
|
||||
}));
|
||||
|
||||
const folder = {
|
||||
name: "Production",
|
||||
path: "Production",
|
||||
children: [],
|
||||
} as unknown as HostFolder;
|
||||
|
||||
function renderFolder(onToggleFolder = vi.fn()) {
|
||||
const noop = vi.fn();
|
||||
render(
|
||||
<FolderItem
|
||||
folder={folder}
|
||||
flat
|
||||
onOpenTab={noop}
|
||||
onDeleteHost={noop}
|
||||
onDuplicateHost={noop}
|
||||
openFolders={new Set()}
|
||||
onToggleFolder={onToggleFolder}
|
||||
selectionMode={false}
|
||||
selectedHostIds={new Set()}
|
||||
onToggleSelect={noop}
|
||||
onToggleSelectFolder={noop}
|
||||
openMenuHostId={null}
|
||||
onMenuOpenChange={noop}
|
||||
openTrayHostId={null}
|
||||
onTrayOpenChange={noop}
|
||||
onManageFolder={noop}
|
||||
onDeleteFolder={noop}
|
||||
onOpenAllSessions={noop}
|
||||
onMoveHostsToFolder={noop}
|
||||
draggedHostIds={null}
|
||||
onDragHostStart={noop}
|
||||
onDragEnd={noop}
|
||||
/>,
|
||||
);
|
||||
return onToggleFolder;
|
||||
}
|
||||
|
||||
it("never nests the folder actions inside a button element", () => {
|
||||
renderFolder();
|
||||
for (const button of document.querySelectorAll("button")) {
|
||||
expect(button.parentElement?.closest("button")).toBeNull();
|
||||
}
|
||||
});
|
||||
|
||||
it("toggles the folder by click, Enter and Space", () => {
|
||||
const onToggle = renderFolder();
|
||||
const header = document.querySelector('[role="button"][aria-expanded]')!;
|
||||
fireEvent.click(header);
|
||||
fireEvent.keyDown(header, { key: "Enter" });
|
||||
fireEvent.keyDown(header, { key: " " });
|
||||
expect(onToggle).toHaveBeenCalledTimes(3);
|
||||
expect(onToggle).toHaveBeenCalledWith("Production");
|
||||
});
|
||||
|
||||
it("ignores keys pressed on a folder action", () => {
|
||||
const onToggle = renderFolder();
|
||||
const action = document.querySelector("button")!;
|
||||
fireEvent.keyDown(action, { key: "Enter" });
|
||||
expect(onToggle).not.toHaveBeenCalled();
|
||||
});
|
||||
Reference in new issue
Block a user