feat(sources): PDF-Upload als neuer Quellentyp pdf_document
- POST /api/sources/global/upload-pdf: multipart File-Upload,
50 MB Limit, SHA256-Dedup, speichert PDF unter <dirname(DB)>/pdfs/{sha}.pdf,
legt Source mit processed_at=NULL an (Monitor verarbeitet asynchron)
- pattern in GlobalSourceUpdate um pdf_document erweitert (2x)
- dashboard.html: Button + Modal im Grundquellen-Sub-Tab
- sources.js: openPdfUploadModal + setupPdfUploadForm + FormData-Submit
- app.js: API.upload(path, formData) Helper fuer multipart
- requirements.txt: pypdf (Validierung optional)
Dieser Commit ist enthalten in:
@@ -328,6 +328,7 @@
|
||||
<span class="text-secondary" id="globalSourceCount"></span>
|
||||
</div>
|
||||
<button class="btn btn-secondary" id="discoverSourceBtn">Erkennen</button>
|
||||
<button class="btn btn-secondary" id="newPdfSourceBtn" style="margin-right:8px;">+ PDF hochladen</button>
|
||||
<button class="btn btn-primary" id="newGlobalSourceBtn">+ Neue Grundquelle</button>
|
||||
</div>
|
||||
<div class="card">
|
||||
@@ -641,6 +642,7 @@
|
||||
<option value="telegram_channel">Telegram-Kanal</option>
|
||||
<option value="podcast_feed">Podcast-Feed</option>
|
||||
<option value="excluded">Ausgeschlossen</option>
|
||||
<option value="pdf_document" disabled>PDF-Dokument (nur Upload)</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
@@ -799,6 +801,59 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal: PDF hochladen -->
|
||||
<div class="modal-overlay" id="modalPdfUpload">
|
||||
<div class="modal">
|
||||
<div class="modal-header">
|
||||
<h3>PDF als Quelle hochladen</h3>
|
||||
<button class="modal-close" onclick="closeModal(modalPdfUpload)">×</button>
|
||||
</div>
|
||||
<form id="pdfUploadForm" enctype="multipart/form-data">
|
||||
<div class="modal-body">
|
||||
<p class="text-secondary" style="margin-top:0;">
|
||||
Die PDF wird gespeichert und vom Monitor automatisch verarbeitet:
|
||||
Text extrahieren (OCR-Fallback fuer gescannte Dokumente),
|
||||
Übersetzung nach Deutsch und Englisch.
|
||||
</p>
|
||||
<div class="form-group">
|
||||
<label for="pdfFile">PDF-Datei (max. 50 MB)</label>
|
||||
<input type="file" id="pdfFile" accept="application/pdf,.pdf" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="pdfName">Anzeige-Name (optional)</label>
|
||||
<input type="text" id="pdfName" maxlength="200" placeholder="leer = Dateiname">
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
|
||||
<div class="form-group">
|
||||
<label for="pdfCategory">Kategorie</label>
|
||||
<select id="pdfCategory">
|
||||
<option value="sonstige" selected>Sonstige</option>
|
||||
<option value="behoerde">Behörde</option>
|
||||
<option value="think-tank">Think-Tank</option>
|
||||
<option value="fachmedien">Fachmedien</option>
|
||||
<option value="international">International</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="pdfLanguage">Sprache (optional)</label>
|
||||
<input type="text" id="pdfLanguage" list="languageSuggestions" placeholder="z.B. Deutsch, Englisch">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="pdfNotes">Notizen</label>
|
||||
<input type="text" id="pdfNotes" placeholder="Optional">
|
||||
</div>
|
||||
<div id="pdfUploadError" class="error-msg" style="display:none"></div>
|
||||
<div id="pdfUploadProgress" class="text-secondary" style="display:none;margin-top:8px;">Lädt hoch …</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" onclick="closeModal(modalPdfUpload)">Abbrechen</button>
|
||||
<button type="submit" class="btn btn-primary" id="pdfUploadSubmitBtn">Hochladen</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Modal: Discover Sources -->
|
||||
<div class="modal-overlay" id="modalDiscover">
|
||||
<div class="modal" style="max-width:600px;">
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren