chore(frontend): slim admin.ts, remove dead library.ts
- Remove dead functions from admin.ts: loadSystemStats, renderSystemStats, triggerLibraryScan, triggerQuickScan, all WebSocket functions - Remove library.ts (695 lines of innerHTML string-building replaced by HTMX server-rendered partials) - Remove library import from main.ts
This commit is contained in:
+3
-140
@@ -1,134 +1,5 @@
|
||||
import { Alpine } from "./alpine";
|
||||
import { showToast } from "./toast";
|
||||
import { createWebSocket } from "./websocket";
|
||||
|
||||
function initializeScanWebSocket(): void {
|
||||
createWebSocket({
|
||||
onMessage: (message) => {
|
||||
switch (message.type) {
|
||||
case "scan_progress":
|
||||
updateScanProgress(message.data);
|
||||
break;
|
||||
case "scan_complete":
|
||||
showScanComplete(message.data);
|
||||
break;
|
||||
case "scan_error":
|
||||
showScanError(message.data);
|
||||
break;
|
||||
}
|
||||
},
|
||||
enableReconnect: true,
|
||||
reconnectDelay: 5000,
|
||||
});
|
||||
}
|
||||
|
||||
function updateScanProgress(data: { progress: number; files_scanned: number; new_items: number }): void {
|
||||
const progressBar = document.getElementById("scan-progress-bar");
|
||||
if (progressBar) {
|
||||
progressBar.style.width = (data.progress * 100) + "%";
|
||||
}
|
||||
|
||||
const progressText = document.getElementById("scan-progress-text");
|
||||
if (progressText) {
|
||||
progressText.textContent = `${data.files_scanned} files scanned (${data.new_items} new)`;
|
||||
}
|
||||
}
|
||||
|
||||
function showScanComplete(_data: unknown): void {
|
||||
console.log("Scan complete:", _data);
|
||||
}
|
||||
|
||||
function showScanError(_data: unknown): void {
|
||||
console.error("Scan error:", _data);
|
||||
}
|
||||
|
||||
async function triggerLibraryScan(): Promise<void> {
|
||||
const token = localStorage.getItem("token");
|
||||
if (!token) return;
|
||||
|
||||
try {
|
||||
const response = await fetch("/api/libraries/scan", {
|
||||
method: "POST",
|
||||
headers: { Authorization: `Bearer ${token}` },
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
showToast("Library scan started", "success");
|
||||
} else {
|
||||
const error = await response.json();
|
||||
showToast(error.error || "Failed to start scan", "error");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Scan error:", error);
|
||||
showToast("Failed to start library scan", "error");
|
||||
}
|
||||
}
|
||||
|
||||
async function triggerQuickScan(): Promise<void> {
|
||||
const token = localStorage.getItem("token");
|
||||
if (!token) return;
|
||||
|
||||
try {
|
||||
const response = await fetch("/api/libraries/quick-scan", {
|
||||
method: "POST",
|
||||
headers: { Authorization: `Bearer ${token}` },
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
showToast("Quick scan started", "success");
|
||||
} else {
|
||||
const error = await response.json();
|
||||
showToast(error.error || "Failed to start quick scan", "error");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Quick scan error:", error);
|
||||
showToast("Failed to start quick scan", "error");
|
||||
}
|
||||
}
|
||||
|
||||
async function loadSystemStats(): Promise<void> {
|
||||
const token = localStorage.getItem("token");
|
||||
if (!token) return;
|
||||
|
||||
try {
|
||||
const response = await fetch("/api/admin/stats", {
|
||||
headers: { Authorization: `Bearer ${token}` },
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const stats = await response.json();
|
||||
renderSystemStats(stats);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Failed to load stats:", error);
|
||||
}
|
||||
}
|
||||
|
||||
function renderSystemStats(stats: Record<string, unknown>): void {
|
||||
const container = document.getElementById("system-stats");
|
||||
if (!container) return;
|
||||
|
||||
container.innerHTML = `
|
||||
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--bg-secondary)">
|
||||
<p class="text-2xl font-bold" style="color: var(--text-primary)">${stats.total_books || 0}</p>
|
||||
<p class="text-sm" style="color: var(--text-secondary)">Total Books</p>
|
||||
</div>
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--bg-secondary)">
|
||||
<p class="text-2xl font-bold" style="color: var(--text-primary)">${stats.total_users || 0}</p>
|
||||
<p class="text-sm" style="color: var(--text-secondary)">Users</p>
|
||||
</div>
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--bg-secondary)">
|
||||
<p class="text-2xl font-bold" style="color: var(--text-primary)">${stats.total_devices || 0}</p>
|
||||
<p class="text-sm" style="color: var(--text-secondary)">Devices</p>
|
||||
</div>
|
||||
<div class="p-4 rounded-lg" style="background-color: var(--bg-secondary)">
|
||||
<p class="text-2xl font-bold" style="color: var(--text-primary)">${stats.total_libraries || 0}</p>
|
||||
<p class="text-sm" style="color: var(--text-secondary)">Libraries</p>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
async function scanAllLibraries(): Promise<void> {
|
||||
const token = localStorage.getItem("token");
|
||||
@@ -227,6 +98,8 @@ function showScanProgress(
|
||||
pollScanProgress(jobIds, libraryNames);
|
||||
}
|
||||
|
||||
let scanPollInterval: ReturnType<typeof setInterval> | undefined = undefined;
|
||||
|
||||
function pollScanProgress(
|
||||
jobIds: string[],
|
||||
_libraryNames: Record<string, string>,
|
||||
@@ -283,7 +156,7 @@ function pollScanProgress(
|
||||
}
|
||||
|
||||
if (allComplete) {
|
||||
clearInterval(scanPollInterval);
|
||||
clearInterval(scanPollInterval!);
|
||||
showScanResults(
|
||||
jobIds.length,
|
||||
totalFiles,
|
||||
@@ -369,8 +242,6 @@ async function loadWatchStatus(): Promise<void> {
|
||||
}
|
||||
}
|
||||
|
||||
let scanPollInterval: ReturnType<typeof setInterval> | undefined = undefined;
|
||||
|
||||
function stopScanStatusPolling(): void {
|
||||
if (scanPollInterval !== undefined) {
|
||||
clearInterval(scanPollInterval);
|
||||
@@ -380,22 +251,14 @@ function stopScanStatusPolling(): void {
|
||||
|
||||
export {
|
||||
hideScanProgress,
|
||||
initializeScanWebSocket,
|
||||
loadSystemStats,
|
||||
loadWatchStatus,
|
||||
scanAllLibraries,
|
||||
stopScanStatusPolling,
|
||||
triggerLibraryScan,
|
||||
triggerQuickScan,
|
||||
};
|
||||
|
||||
Alpine.data("admin", () => ({
|
||||
hideScanProgress,
|
||||
initializeScanWebSocket,
|
||||
loadSystemStats,
|
||||
loadWatchStatus,
|
||||
scanAllLibraries,
|
||||
stopScanStatusPolling,
|
||||
triggerLibraryScan,
|
||||
triggerQuickScan,
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user