mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 06:05:24 +00:00
fix(file-manager): accept OS file drops over existing rows (#1484)
* fix(file-manager): accept OS file drops over existing rows * test(file-manager): target the file label in drop tests * test(css): exercise the configured PostCSS plugin chain * test(identity): preserve full Ed25519 public keys in fixtures * test(remote-desktop): always mutate ciphertext in tamper test
This commit is contained in:
1 parent
4423c4c8ef
commit
98cf62547f
2 files changed
+54
-1
No files matched your search
@@ -458,6 +458,9 @@ export function FileManagerGrid({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleFileDrop = (e: React.DragEvent, targetFile: FileItem) => {
|
const handleFileDrop = (e: React.DragEvent, targetFile: FileItem) => {
|
||||||
|
// OS drops belong to the pane's upload handler, even over an existing row.
|
||||||
|
if (dragState.type !== "internal" && !isLocalFilesDrag(e.dataTransfer))
|
||||||
|
return;
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { afterEach, describe, expect, it, vi } from "vitest";
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
|
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
|
||||||
import "@testing-library/jest-dom/vitest";
|
import "@testing-library/jest-dom/vitest";
|
||||||
import { FileManagerGrid } from "../../src/frontend/FileManagerGrid";
|
import { FileManagerGrid } from "../../src/frontend/FileManagerGrid";
|
||||||
@@ -44,6 +44,7 @@ const props = {
|
|||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
cleanup();
|
cleanup();
|
||||||
vi.restoreAllMocks();
|
vi.restoreAllMocks();
|
||||||
|
vi.unstubAllGlobals();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("remote file rename", () => {
|
describe("remote file rename", () => {
|
||||||
@@ -89,3 +90,52 @@ describe("remote file rename", () => {
|
|||||||
expect(screen.getByText(file.modified!)).toBeInTheDocument();
|
expect(screen.getByText(file.modified!)).toBeInTheDocument();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("external file drops", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.stubGlobal(
|
||||||
|
"ResizeObserver",
|
||||||
|
class {
|
||||||
|
observe() {}
|
||||||
|
disconnect() {}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it.each(["list", "grid"] as const)(
|
||||||
|
"uploads dropped folders over a file in %s view",
|
||||||
|
(viewMode) => {
|
||||||
|
const onUploadItems = vi.fn();
|
||||||
|
render(
|
||||||
|
<FileManagerGrid
|
||||||
|
{...props}
|
||||||
|
viewMode={viewMode}
|
||||||
|
onUploadItems={onUploadItems}
|
||||||
|
/>,
|
||||||
|
);
|
||||||
|
const folder = {
|
||||||
|
name: "logs",
|
||||||
|
isDirectory: true,
|
||||||
|
isFile: false,
|
||||||
|
} as FileSystemEntry;
|
||||||
|
fireEvent.drop(screen.getByText(file.name), {
|
||||||
|
dataTransfer: {
|
||||||
|
types: ["Files"],
|
||||||
|
files: [],
|
||||||
|
getData: () => "",
|
||||||
|
items: [{ webkitGetAsEntry: () => folder }],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(onUploadItems).toHaveBeenCalledExactlyOnceWith([folder]);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
it("uploads a plain OS file dropped over a row", () => {
|
||||||
|
const onUpload = vi.fn();
|
||||||
|
render(<FileManagerGrid {...props} onUpload={onUpload} />);
|
||||||
|
const files = [new File(["log"], "app.log")];
|
||||||
|
fireEvent.drop(screen.getByText(file.name), {
|
||||||
|
dataTransfer: { types: ["Files"], files, items: [], getData: () => "" },
|
||||||
|
});
|
||||||
|
expect(onUpload).toHaveBeenCalledExactlyOnceWith(files);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in new issue
Block a user