mirror of
https://github.com/myronblair/kino-app
synced 2026-07-27 21:18:43 -05:00
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:
@@ -1,7 +1,7 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import api from "../lib/api";
|
import api from "../lib/api";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
import { RefreshCcw, Download, Check, Sparkles } from "lucide-react";
|
import { RefreshCcw, Download, Check, Sparkles, CheckSquare, Square } from "lucide-react";
|
||||||
|
|
||||||
const KINDS = [
|
const KINDS = [
|
||||||
{ key: "movies", label: "Movies" },
|
{ key: "movies", label: "Movies" },
|
||||||
@@ -49,6 +49,11 @@ export default function LibraryScan() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const importable = results.filter((r) => !r.already_imported);
|
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 () => {
|
const importSelected = async () => {
|
||||||
if (selected.size === 0) return;
|
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">
|
<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
|
<RefreshCcw size={14} strokeWidth={1.5} className={loading ? "animate-spin" : ""} /> Rescan
|
||||||
</button>
|
</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">
|
<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})` : ""}
|
<Download size={14} strokeWidth={1.5} /> Import {selected.size > 0 ? `(${selected.size})` : ""}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
Reference in New Issue
Block a user