Add template upload functionality to Schadenprotokoll
- New Templates tab for PDF and Word template management - API endpoints for listing and uploading templates - Automatic backup of old templates before replacement 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -172,3 +172,79 @@ document.getElementById("vorbericht-btn").addEventListener("click", async () =>
|
||||
showStatus("vorbericht-status", "error", `❌ Fehler: ${err.message}`);
|
||||
}
|
||||
});
|
||||
|
||||
// Admin Tab - Templates laden
|
||||
async function loadTemplates() {
|
||||
try {
|
||||
const response = await fetch(`${API_BASE}/templates`);
|
||||
const data = await response.json();
|
||||
const container = document.getElementById("templates-container");
|
||||
|
||||
if (data.templates.length === 0) {
|
||||
container.innerHTML = "<p>Keine Templates vorhanden.</p>";
|
||||
return;
|
||||
}
|
||||
|
||||
container.innerHTML = data.templates.map(t => `
|
||||
<div class="template-item">
|
||||
<span class="name">${t.type === "pdf" ? "📄" : "📝"} ${t.name}</span>
|
||||
<span class="size">${(t.size / 1024).toFixed(1)} KB</span>
|
||||
</div>
|
||||
`).join("");
|
||||
} catch (err) {
|
||||
document.getElementById("templates-container").innerHTML =
|
||||
`<p style="color:red;">Fehler: ${err.message}</p>`;
|
||||
}
|
||||
}
|
||||
|
||||
// Template Upload
|
||||
function setupTemplateUpload(zoneId, inputId, templateType) {
|
||||
const zone = document.getElementById(zoneId);
|
||||
const input = document.getElementById(inputId);
|
||||
|
||||
zone.addEventListener("click", () => input.click());
|
||||
zone.addEventListener("dragover", (e) => { e.preventDefault(); zone.classList.add("dragover"); });
|
||||
zone.addEventListener("dragleave", () => zone.classList.remove("dragover"));
|
||||
zone.addEventListener("drop", (e) => {
|
||||
e.preventDefault();
|
||||
zone.classList.remove("dragover");
|
||||
if (e.dataTransfer.files.length) {
|
||||
input.files = e.dataTransfer.files;
|
||||
uploadTemplate(input.files[0], templateType);
|
||||
}
|
||||
});
|
||||
input.addEventListener("change", () => {
|
||||
if (input.files.length) uploadTemplate(input.files[0], templateType);
|
||||
});
|
||||
}
|
||||
|
||||
async function uploadTemplate(file, type) {
|
||||
showStatus("admin-status", "loading", `⏳ Lade ${type.toUpperCase()} Template hoch...`);
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append("file", file);
|
||||
formData.append("type", type);
|
||||
|
||||
try {
|
||||
const response = await fetch(`${API_BASE}/templates/upload`, {
|
||||
method: "POST",
|
||||
body: formData
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const err = await response.json();
|
||||
throw new Error(err.error);
|
||||
}
|
||||
|
||||
showStatus("admin-status", "success", "✓ Template erfolgreich hochgeladen");
|
||||
loadTemplates();
|
||||
} catch (err) {
|
||||
showStatus("admin-status", "error", `❌ Fehler: ${err.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
setupTemplateUpload("pdf-template-zone", "pdf-template-input", "pdf");
|
||||
setupTemplateUpload("docx-template-zone", "docx-template-input", "docx");
|
||||
|
||||
// Templates beim Tab-Wechsel laden
|
||||
document.querySelector([data-tab=admin]).addEventListener("click", loadTemplates);
|
||||
|
||||
Reference in New Issue
Block a user