feat(sources): PDF-Upload auch in der Endkunden-App (Kundenquelle)
- POST /api/sources/upload-pdf: tenant-scoped Upload, gleiche Speicher-
Konvention wie der Verwaltungs-Endpoint (<dirname(DB)>/pdfs/{sha}.pdf).
Duplikat-Check beruecksichtigt globale Quellen.
- dashboard.html: +PDF-Button in der Quellenverwaltungs-Toolbar +
eigenes Modal modal-pdf-upload (closeModal-Quotes via ').
- app.js: App.openPdfUpload + _bindPdfUploadFormOnce (Submit nur einmal
binden).
- api.js: API.upload(path, formData) Helper analog Verwaltung.
Dieser Commit ist enthalten in:
@@ -3106,6 +3106,70 @@ async handleRefresh() {
|
||||
|
||||
_discoveredData: null,
|
||||
|
||||
openPdfUpload() {
|
||||
const form = document.getElementById("pdf-upload-form");
|
||||
if (form) form.reset();
|
||||
const err = document.getElementById("pdf-upload-error");
|
||||
if (err) { err.style.display = "none"; err.textContent = ""; }
|
||||
const prog = document.getElementById("pdf-upload-progress");
|
||||
if (prog) prog.style.display = "none";
|
||||
openModal("modal-pdf-upload");
|
||||
this._bindPdfUploadFormOnce();
|
||||
},
|
||||
|
||||
_bindPdfUploadFormOnce() {
|
||||
const form = document.getElementById("pdf-upload-form");
|
||||
if (!form || form.dataset.bound === "1") return;
|
||||
form.dataset.bound = "1";
|
||||
form.addEventListener("submit", async (e) => {
|
||||
e.preventDefault();
|
||||
const errEl = document.getElementById("pdf-upload-error");
|
||||
const progEl = document.getElementById("pdf-upload-progress");
|
||||
const submitBtn = document.getElementById("pdf-upload-submit");
|
||||
errEl.style.display = "none";
|
||||
|
||||
const fileInput = document.getElementById("pdf-upload-file");
|
||||
const f = fileInput && fileInput.files && fileInput.files[0];
|
||||
if (!f) {
|
||||
errEl.textContent = "Bitte eine PDF-Datei auswaehlen.";
|
||||
errEl.style.display = "block";
|
||||
return;
|
||||
}
|
||||
if (f.size > 50 * 1024 * 1024) {
|
||||
errEl.textContent = "Datei ueberschreitet 50 MB.";
|
||||
errEl.style.display = "block";
|
||||
return;
|
||||
}
|
||||
|
||||
const fd = new FormData();
|
||||
fd.append("file", f);
|
||||
const nm = (document.getElementById("pdf-upload-name").value || "").trim();
|
||||
if (nm) fd.append("name", nm);
|
||||
fd.append("category", document.getElementById("pdf-upload-category").value || "sonstige");
|
||||
const lng = (document.getElementById("pdf-upload-language").value || "").trim();
|
||||
if (lng) fd.append("language", lng);
|
||||
const nt = (document.getElementById("pdf-upload-notes").value || "").trim();
|
||||
if (nt) fd.append("notes", nt);
|
||||
|
||||
submitBtn.disabled = true;
|
||||
progEl.style.display = "block";
|
||||
try {
|
||||
await API.upload("/sources/upload-pdf", fd);
|
||||
closeModal("modal-pdf-upload");
|
||||
if (typeof UI !== "undefined" && UI.showToast) {
|
||||
UI.showToast("PDF hochgeladen -- Verarbeitung laeuft im Hintergrund", "success");
|
||||
}
|
||||
await App.loadSources();
|
||||
} catch (err) {
|
||||
errEl.textContent = err && err.message ? err.message : "Upload fehlgeschlagen";
|
||||
errEl.style.display = "block";
|
||||
} finally {
|
||||
submitBtn.disabled = false;
|
||||
progEl.style.display = "none";
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
toggleSourceForm(show) {
|
||||
const form = document.getElementById('sources-add-form');
|
||||
if (!form) return;
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren