Fix disclosure fading and global package toggles

Fade the shared virtual item group from transparent to opaque while expanding and reverse the opacity while collapsing, preserving the clipping row as the geometry owner.

Move the downloads package toggle to the far toolbar edge and add a collector toolbar toggle backed by raw unfiltered package IDs.

Cover opacity endpoints, intermediate frame geometry, toolbar ordering, and filter-independent collector toggle semantics.
This commit is contained in:
Sucukdeluxe
2026-08-22 11:18:05 +02:00
parent f57b513625
commit a101bd0bed
9 changed files with 195 additions and 14 deletions
+33
View File
@@ -11,6 +11,7 @@ import {
selectCollectorPackageLinks
} from "../src/renderer/views/collector/collector-model";
import { CollectorContent, CollectorInputDialog, CollectorSidebar, CollectorToolbar, CollectorView, type CollectorViewActions } from "../src/renderer/views/collector/CollectorView";
import * as collectorViewModule from "../src/renderer/views/collector/CollectorView";
function visitElements(node: ReactNode, visit: (element: ReactElement) => void): void {
if (Array.isArray(node)) {
@@ -48,6 +49,7 @@ function createActions(overrides: Partial<CollectorViewActions> = {}): Collector
onLinkSelectionChange: () => {},
onPackageSelectionChange: () => {},
onPackageCollapseChange: () => {},
onToggleAllPackages: () => {},
onRemoveSelected: () => {},
...overrides
};
@@ -111,6 +113,19 @@ describe("collector workspace model", () => {
{ id: "all", label: "Alle Links", count: 4 }, { id: "online", label: "Online", count: 2 }, { id: "unknown", label: "Ungeprüft", count: 1 }, { id: "offline", label: "Offline", count: 1 }
]);
});
it("toggles every raw package even when the workspace shows only a filtered subset", () => {
const toggleAllCollectorPackageIds = (collectorViewModule as unknown as {
toggleAllCollectorPackageIds?: (packageIds: readonly string[], collapsedPackageIds: ReadonlySet<string>) => Set<string>;
}).toggleAllCollectorPackageIds;
expect(toggleAllCollectorPackageIds).toBeTypeOf("function");
if (!toggleAllCollectorPackageIds) return;
const rawPackageIds = packages.map((pkg) => pkg.id);
expect([...toggleAllCollectorPackageIds(rawPackageIds, new Set())].sort()).toEqual(["package-mixed", "package-sbs"]);
expect([...toggleAllCollectorPackageIds(rawPackageIds, new Set(["package-sbs"]))].sort()).toEqual(["package-mixed", "package-sbs"]);
expect([...toggleAllCollectorPackageIds(rawPackageIds, new Set(rawPackageIds))]).toEqual([]);
});
});
describe("CollectorView", () => {
@@ -166,6 +181,24 @@ describe("CollectorView", () => {
expect(all).toBe(1);
});
it("keeps the global package toggle enabled at the right toolbar edge despite active filters", () => {
let toggles = 0;
const model = buildCollectorWorkspaceViewModel(packages, "online", "no-visible-result", false, [], [], "", true);
const toolbar = CollectorToolbar({ actions: createActions({ onToggleAllPackages: () => { toggles += 1; } }), model });
const toolbarButtons: ReactElement[] = [];
visitElements(toolbar, (element) => {
if (element.type === "button") toolbarButtons.push(element);
});
const toggle = findButton(toolbar, "Alle ein-/ausklappen");
expect(model.empty).toBe(true);
expect(model.totalCount).toBe(4);
expect(toggle.props.disabled).toBe(false);
expect(toolbarButtons.at(-1)?.props.children).toBe("Alle ein-/ausklappen");
toggle.props.onClick();
expect(toggles).toBe(1);
});
it("renders accessible mixed package selection", () => {
const html = renderToStaticMarkup(<CollectorContent actions={createActions()} model={buildCollectorWorkspaceViewModel(packages, "all", "", false, ["link-1"], [], "", true)} />);
expect(html).toContain("aria-label=\"Paket SBS14HD auswählen\"");