Add Select All / Deselect All to Library Scan

Lets admins select every not-yet-imported item in the current tab in one
click instead of clicking each row individually.
This commit is contained in:
Myron Blair
2026-07-26 20:47:19 -05:00
parent 64d8945460
commit 1891fd0b7c
+9 -1
View File
@@ -1,7 +1,7 @@
import { useEffect, useState } from "react";
import api from "../lib/api";
import { toast } from "sonner";
import { RefreshCcw, Download, Check, Sparkles } from "lucide-react";
import { RefreshCcw, Download, Check, Sparkles, CheckSquare, Square } from "lucide-react";
const KINDS = [
{ key: "movies", label: "Movies" },
@@ -49,6 +49,11 @@ export default function LibraryScan() {
};
const importable = results.filter((r) => !r.already_imported);
const allSelected = importable.length > 0 && importable.every((r) => selected.has(r.storage_path));
const toggleSelectAll = () => {
setSelected(allSelected ? new Set() : new Set(importable.map((r) => r.storage_path)));
};
const importSelected = async () => {
if (selected.size === 0) return;
@@ -105,6 +110,9 @@ export default function LibraryScan() {
<button onClick={() => load()} disabled={loading} className="flex items-center gap-2 border border-[#222] hover:border-white text-[#8A8A8A] hover:text-white px-5 py-2 text-xs uppercase tracking-[0.2em] transition-colors disabled:opacity-50" data-testid="scan-refresh">
<RefreshCcw size={14} strokeWidth={1.5} className={loading ? "animate-spin" : ""} /> Rescan
</button>
<button onClick={toggleSelectAll} disabled={importable.length === 0} className="flex items-center gap-2 border border-[#222] hover:border-white text-[#8A8A8A] hover:text-white px-5 py-2 text-xs uppercase tracking-[0.2em] transition-colors disabled:opacity-50" data-testid="scan-select-all">
{allSelected ? <CheckSquare size={14} strokeWidth={1.5} /> : <Square size={14} strokeWidth={1.5} />} {allSelected ? "Deselect All" : "Select All"}
</button>
<button onClick={importSelected} disabled={selected.size === 0 || importing} className="flex items-center gap-2 bg-[#D9381E] hover:bg-[#ED4B32] disabled:opacity-50 text-white px-5 py-2 text-xs uppercase tracking-[0.2em]" data-testid="scan-import-btn">
<Download size={14} strokeWidth={1.5} /> Import {selected.size > 0 ? `(${selected.size})` : ""}
</button>