mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-31 07:35: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}
|
style={depth > 0 ? { paddingLeft: rem(depth * 12) } : undefined}
|
||||||
>
|
>
|
||||||
<div className="relative">
|
<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}
|
draggable={canDragFolder}
|
||||||
onDragStart={(e) => {
|
onDragStart={(e) => {
|
||||||
if (!canDragFolder) return;
|
if (!canDragFolder) return;
|
||||||
@@ -294,7 +305,7 @@ export function FolderItem({
|
|||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
</button>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{!flat && isOpen && (
|
{!flat && isOpen && (
|
||||||
<div className="border-l border-border/50 ml-[27px]">
|
<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