Files
Edouard Durand a97ade0974 Files tabs (My files, Shared, All); access follows folders only
The Files browser gets tabs instead of a Home screen, also in the Open, Save
and Move dialogs; All (the whole workflows folder) is for admins. Per-workflow
access lists are removed: a live workflow's access is its folder's, and This
tab offers Folder access to the folder's owner.
2026-09-26 02:52:04 +00:00

52 lines
2.4 KiB
JavaScript

// Files browser tabs: My files, Shared, and All for admins.
import { test } from "node:test";
import assert from "node:assert/strict";
// Just enough DOM for the browser to build its elements.
class FakeNode {
constructor(tag) { this.tag = tag; this.children = []; this.style = {}; this.attrs = {}; this.className = ""; }
append(...c) { this.children.push(...c); }
replaceChildren(...c) { this.children = c; }
addEventListener() {}
setAttribute(k, v) { this.attrs[k] = v; }
querySelector() { return new FakeNode("div"); }
get isConnected() { return false; }
}
globalThis.Node ??= FakeNode;
globalThis.document ??= { createElement: (t) => new FakeNode(t), createTextNode: (t) => Object.assign(new FakeNode("#text"), { text: t }) };
const { FilesBrowser } = await import("../../web/rigshare/files.js");
const browser = (admin, start) => new FilesBrowser({
app: {}, sync: {}, mode: "open", start,
client: { self: { key: "bob" }, perms: { admin }, users: [], rooms: [], on() {}, emit() {} },
});
test("tabs: My files and Shared for everyone, All for admins", () => {
assert.deepEqual(browser(false).tabs.map((t) => t.label), ["My files", "Shared"]);
assert.deepEqual(browser(true).tabs.map((t) => t.label), ["My files", "Shared", "All"]);
});
test("starts in My files and picks the tab a folder belongs to", () => {
const b = browser(false);
assert.equal(b.tab, "mine");
assert.equal(b.path, "users/bob");
assert.equal(browser(false, "shared/Team").tab, "shared");
assert.equal(browser(false, "renders").tab, "shared");
assert.equal(browser(true, "users/alice").tab, "all");
assert.equal(browser(true, "").tab, "all");
});
test("people without All never start outside their tabs", () => {
for (const start of ["", "users", "users/alice/x"]) {
const b = browser(false, start);
assert.ok(["users/bob", "@shared"].includes(b.path), `${start} -> ${b.path}`);
}
});
test("breadcrumbs start at the tab", () => {
assert.deepEqual(browser(false, "users/bob/renders/old").trail().map((c) => c.label), ["My files", "renders", "old"]);
assert.deepEqual(browser(false, "shared/Team/sub").trail().map((c) => c.label), ["Shared", "Team", "sub"]);
assert.deepEqual(browser(true, "users/alice").trail().map((c) => c.label), ["All", "users", "alice"]);
assert.equal(browser(false, "shared/Team").label, "Shared / Team");
});