Add persistent default temp directory setting with web UI

- Add settings.json persistence (load/save) in backend
- Add GET/POST /api/settings endpoints for default_temp_dir
- Add Default Temp Directory config UI in Temporary Storage section
- Auto-fallback: jobs use saved default if no per-job temp_dir set
- Per-job Advanced Options placeholder syncs with saved default
- Add settings.json to .gitignore for per-machine config
This commit is contained in:
2026-06-29 09:51:12 -04:00
parent b14fc8cd05
commit 006eece417
4 changed files with 140 additions and 3 deletions
+67
View File
@@ -2122,6 +2122,55 @@ async function initializeApp() {
// Load initial temp info
loadTempInfo();
// Default temp directory setting
const saveTempDirBtn = document.getElementById("save-temp-dir-btn");
const defaultTempDirInput = document.getElementById("default-temp-dir-input");
const tempDirStatus = document.getElementById("temp-dir-status");
// Load saved default temp dir on init
loadDefaultTempDir();
if (saveTempDirBtn) {
saveTempDirBtn.addEventListener("click", async () => {
const newDir = defaultTempDirInput ? defaultTempDirInput.value.trim() : "";
tempDirStatus.textContent = "";
tempDirStatus.style.color = "";
saveTempDirBtn.disabled = true;
saveTempDirBtn.innerHTML = '<i class="fa-solid fa-spinner fa-spin"></i> Saving...';
try {
const res = await fetch("/api/settings", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ default_temp_dir: newDir })
});
if (res.ok) {
tempDirStatus.style.color = "var(--success, #4caf50)";
tempDirStatus.textContent = newDir
? `\u2713 Default temp directory saved: ${newDir}`
: "\u2713 Reset to project default temp/ directory.";
// Also update the per-job input placeholder/value
const perJobInput = document.getElementById("temp-dir-input");
if (perJobInput && !perJobInput.value.trim()) {
perJobInput.placeholder = newDir
? `Default: ${newDir} (override here)`
: "e.g. /mnt/fast_ssd/temp (Leave empty for default temp/)";
}
} else {
const errData = await res.json().catch(() => ({}));
tempDirStatus.style.color = "var(--danger, #f44336)";
tempDirStatus.textContent = `\u2717 ${errData.detail || "Failed to save setting."}`;
}
} catch (err) {
tempDirStatus.style.color = "var(--danger, #f44336)";
tempDirStatus.textContent = "\u2717 Network error saving setting.";
console.error(err);
} finally {
saveTempDirBtn.disabled = false;
saveTempDirBtn.innerHTML = '<i class="fa-solid fa-floppy-disk"></i> Save';
}
});
}
}
async function loadTempInfo() {
@@ -2220,4 +2269,22 @@ async function loadTempInfo() {
}
}
async function loadDefaultTempDir() {
try {
const res = await fetch("/api/settings");
if (!res.ok) return;
const settings = await res.json();
const savedDir = settings.default_temp_dir || "";
const defaultInput = document.getElementById("default-temp-dir-input");
if (defaultInput) defaultInput.value = savedDir;
// Update per-job input placeholder
const perJobInput = document.getElementById("temp-dir-input");
if (perJobInput && savedDir && !perJobInput.value.trim()) {
perJobInput.placeholder = `Default: ${savedDir} (override here)`;
}
} catch (err) {
console.error("Failed to load settings:", err);
}
}
initializeApp();