Update 20260130

This commit is contained in:
Stefan Hutter
2026-01-30 16:27:35 +01:00
parent 2d1525575b
commit 41588e8c92
58 changed files with 16895 additions and 402 deletions

View File

@@ -4,24 +4,24 @@
<html>
<head>
<title>JSON Editor → PDF Preview</title>
<script>
</script>
<script>
</script>
<!-- ACE
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.6/ace.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.6/mode-json.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.32.6/theme-tomorrow.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
-->
<script src="/Scripts/ace/ace.js"></script>
<script src="/Scripts/ace/mode-json.min.js"></script>
<script src="/Scripts/ace/theme-tomorrow.min.js"></script>
<script src="/Scripts/ace/worker-json.js"></script>
<script src="/Scripts/jquery.min.js"></script>
<script src="/Scripts/ace/ext-searchbox.js"></script>
<style>
body {
margin: 0;
@@ -34,15 +34,15 @@
border-bottom: 1px solid #ccc;
}
.toolbar input {
width: 220px;
padding: 4px;
}
.toolbar input {
width: 220px;
padding: 4px;
}
.toolbar button {
margin-left: 5px;
padding: 6px 10px;
}
.toolbar button {
margin-left: 5px;
padding: 6px 10px;
}
.container {
display: flex;
@@ -75,91 +75,117 @@
</head>
<body>
<div class="toolbar">
<label>Schlüssel:</label>
<input type="text" id="key" placeholder="provDokumentID" />
<button onclick="loadJson()">Laden</button>
<button onclick="saveJson()">Speichern</button>
<button onclick="generatePdf()">PDF generieren</button>
</div>
<div class="container">
<!-- LINKS: JSON -->
<div class="left">
<div id="editor">{}</div>
<div class="toolbar">
<label>Schlüssel:</label>
<input type="text" id="key" placeholder="provDokumentID" />
<button onclick="loadJson()">Laden</button>
<button onclick="saveJson()">Speichern</button>
<button onclick="generatePdf()">PDF generieren</button>
</div>
<!-- RECHTS: PDF -->
<div class="right">
<iframe id="pdfFrame" title="PDF Vorschau"></iframe>
<div class="container">
<!-- LINKS: JSON -->
<div class="left">
<div id="editor">{}</div>
</div>
<!-- RECHTS: PDF -->
<table>
<tr>
<div class="right">
<iframe id="pdfFrame" title="PDF Vorschau"></iframe>
</div>
</tr>
</table>
</div>
</div>
<script>
const apiBase = "/api/json";
<script>
const apiBase = "/api/json";
// ACE INIT
const editor = ace.edit("editor");
editor.setTheme("ace/theme/tomorrow");
editor.session.setMode("ace/mode/json");
editor.setShowPrintMargin(false);
editor.session.setTabSize(2);
editor.session.setUseSoftTabs(true);
// ACE INIT
const editor = ace.edit("editor");
editor.setTheme("ace/theme/tomorrow");
editor.session.setMode("ace/mode/json");
editor.setShowPrintMargin(false);
editor.session.setTabSize(2);
editor.session.setUseSoftTabs(true);
const editor1 = ace.edit("editor");
editor1.setTheme("ace/theme/tomorrow");
editor1.session.setMode("ace/mode/json");
editor1.setShowPrintMargin(false);
editor1.session.setTabSize(2);
editor1.session.setUseSoftTabs(true);
// JSON LADEN
function loadJson() {
const key = $("#key").val();
if (!key) { alert("Bitte Schlüssel eingeben"); return; }
// JSON LADEN
function loadJson() {
$.get(apiBase + "/load/" + encodeURIComponent(key))
.done(data => editor.setValue(data, -1))
.fail(() => alert("Kein Eintrag gefunden"));
}
editor.setValue("", -1);
clearPdfPreview();
const key = $("#key").val();
if (!key) { alert("Bitte Schlüssel eingeben"); return; }
// JSON SPEICHERN
function saveJson() {
const key = $("#key").val();
const json = editor.getValue();
$.get(apiBase + "/load/" + encodeURIComponent(key))
.done(data => editor.setValue(data, -1))
.fail(() => alert("Kein Eintrag gefunden"));
}
if (!key) { alert("Bitte Schlüssel eingeben"); return; }
// JSON SPEICHERN
function saveJson() {
const key = $("#key").val();
const json = editor.getValue();
try { JSON.parse(json); }
catch { alert("Ungültiges JSON"); return; }
if (!key) { alert("Bitte Schlüssel eingeben"); return; }
$.ajax({
url: apiBase + "/save",
type: "POST",
contentType: "application/json",
data: JSON.stringify({ key: key, json: json }),
success: () => alert("Gespeichert")
});
}
// try { JSON.parse(json); }
// catch { alert("Ungültiges JSON"); return; }
// PDF GENERIEREN & EMBEDDED ANZEIGEN
function generatePdf() {
const key = $("#key").val();
if (!key) { alert("Bitte Schlüssel eingeben"); return; }
$.ajax({
url: apiBase + "/save",
type: "POST",
contentType: "application/json",
data: JSON.stringify({ key: key, json: json }),
success: () => alert("Gespeichert")
});
}
fetch(apiBase + "/generatepdf", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
key: key,
json: editor.getValue()
// PDF GENERIEREN & EMBEDDED ANZEIGEN
function generatePdf() {
const key = $("#key").val();
if (!key) { alert("Bitte Schlüssel eingeben"); return; }
fetch(apiBase + "/generatepdf", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
key: key,
json: editor.getValue()
})
})
})
.then(r => {
if (!r.ok) throw new Error("PDF-Fehler");
return r.blob();
})
.then(blob => {
const url = URL.createObjectURL(blob);
document.getElementById("pdfFrame").src = url;
})
.catch(err => alert(err.message));
}
</script>
.then(r => {
if (!r.ok) throw new Error("PDF-Fehler");
return r.blob();
})
.then(blob => {
const url = URL.createObjectURL(blob);
document.getElementById("pdfFrame").src = url;
})
.catch(err => alert(err.message));
}
function clearPdfPreview() {
const frame = document.getElementById("pdfFrame");
// iframe leeren
frame.src = "";
// optional: alte Blob-URL freigeben
if (frame.dataset.blobUrl) {
URL.revokeObjectURL(frame.dataset.blobUrl);
frame.dataset.blobUrl = "";
}
}
</script>
</body>
</html>