This commit is contained in:
2026-01-26 00:42:55 +01:00
parent 4e17211cf0
commit 8d73d95219
2 changed files with 6 additions and 59 deletions

View File

@@ -67,7 +67,6 @@ async function openTemplateManager(item, section) {
const apiWarn = document.getElementById('manage_tpl_api_warn'); const apiWarn = document.getElementById('manage_tpl_api_warn');
const badge = document.getElementById('manage_tpl_badge'); const badge = document.getElementById('manage_tpl_badge');
const versionsWrap = document.getElementById('manage_tpl_versions'); const versionsWrap = document.getElementById('manage_tpl_versions');
const previewFrame = document.getElementById('manage_tpl_preview');
const btnClose = document.getElementById('manageTemplateClose'); const btnClose = document.getElementById('manageTemplateClose');
const btnSave = document.getElementById('manageTemplateSave'); const btnSave = document.getElementById('manageTemplateSave');
const btnDelete = document.getElementById('manageTemplateDelete'); const btnDelete = document.getElementById('manageTemplateDelete');
@@ -86,11 +85,6 @@ async function openTemplateManager(item, section) {
let versions = []; let versions = [];
let activeId = 0; let activeId = 0;
const renderPreview = (html) => {
if (!previewFrame) return;
previewFrame.srcdoc = '<!doctype html><html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"></head><body>' + (html || '<em>(leer)</em>') + '</body></html>';
};
const updateDeleteState = () => { const updateDeleteState = () => {
const hasActive = !!activeId; const hasActive = !!activeId;
if (btnDelete) btnDelete.disabled = hasActive; if (btnDelete) btnDelete.disabled = hasActive;
@@ -121,13 +115,13 @@ async function openTemplateManager(item, section) {
versionsWrap.innerHTML = versions.map(v => { versionsWrap.innerHTML = versions.map(v => {
const isActive = Number(v.is_active) === 1; const isActive = Number(v.is_active) === 1;
const label = `${isActive ? '✓ ' : ''}#${v.version_no} ${formatVersionDate(v.created_at)}` + (isActive ? ' (aktiv)' : ''); const label = `${isActive ? '✓ ' : ''}#${v.version_no} ${formatVersionDate(v.created_at)}` + (isActive ? ' (aktiv)' : '');
const deleteBtn = isActive ? '' : `<button class=\"btn btn-danger\" data-version-delete=\"${v.id}\">Löschen</button>`;
return `<div class=\"flex items-center gap-2 border rounded-lg px-3 py-2\" data-version-row=\"${v.id}\"> return `<div class=\"flex items-center gap-2 border rounded-lg px-3 py-2\" data-version-row=\"${v.id}\">
<div class=\"text-xs text-slate-600\">${label}</div> <div class=\"text-xs text-slate-600\">${label}</div>
<div class=\"ms-auto flex gap-2\"> <div class=\"ms-auto flex gap-2\">
<button class=\"btn\" data-version-preview=\"${v.id}\">Vorschau</button>
<button class=\"btn\" data-version-edit=\"${v.id}\">Bearbeiten</button> <button class=\"btn\" data-version-edit=\"${v.id}\">Bearbeiten</button>
${isActive ? `<button class=\"btn\" data-version-deactivate=\"${v.id}\">Deaktivieren</button>` : `<button class=\"btn\" data-version-activate=\"${v.id}\">Aktivieren</button>`} ${isActive ? `<button class=\"btn\" data-version-deactivate=\"${v.id}\">Deaktivieren</button>` : `<button class=\"btn\" data-version-activate=\"${v.id}\">Aktivieren</button>`}
<button class=\"btn btn-danger\" data-version-delete=\"${v.id}\" ${isActive ? 'disabled' : ''}>Löschen</button> ${deleteBtn}
</div> </div>
</div>`; </div>`;
}).join(''); }).join('');
@@ -179,15 +173,9 @@ async function openTemplateManager(item, section) {
const onVersionsClick = async (ev) => { const onVersionsClick = async (ev) => {
const target = ev.target; const target = ev.target;
if (!target || !target.dataset) return; if (!target || !target.dataset) return;
const vid = Number(target.dataset.versionPreview || target.dataset.versionEdit || target.dataset.versionActivate || target.dataset.versionDeactivate || target.dataset.versionDelete || 0); const vid = Number(target.dataset.versionEdit || target.dataset.versionActivate || target.dataset.versionDeactivate || target.dataset.versionDelete || 0);
if (!vid) return; if (!vid) return;
if (target.dataset.versionPreview !== undefined) {
const res = await apiAction('content_versions.get', { method: 'GET', data: { id: vid, content_id: item.id } }).catch(() => ({}));
const html = res?.item?.html || res?.item?.content || res?.html || res?.content || '';
renderPreview(html);
return;
}
if (target.dataset.versionEdit !== undefined) { if (target.dataset.versionEdit !== undefined) {
dlg && dlg.close(); dlg && dlg.close();
const versionItem = { ...item, version_id: vid }; const versionItem = { ...item, version_id: vid };
@@ -224,13 +212,6 @@ async function openTemplateManager(item, section) {
versionsWrap && versionsWrap.addEventListener('click', onVersionsClick); versionsWrap && versionsWrap.addEventListener('click', onVersionsClick);
await loadVersions(); await loadVersions();
if (activeId) {
const res = await apiAction('content_versions.get', { method: 'GET', data: { id: activeId, content_id: item.id } }).catch(() => ({}));
const html = res?.item?.html || res?.item?.content || res?.html || res?.content || '';
renderPreview(html);
} else {
renderPreview('');
}
dlg && dlg.addEventListener('close', cleanup, { once: true }); dlg && dlg.addEventListener('close', cleanup, { once: true });
dlg && dlg.showModal(); dlg && dlg.showModal();
@@ -388,15 +369,13 @@ export async function loadList(section) {
const editTplBtn = isTemplate ? `<button class='btn' data-edit='${item.id}'>Verwaltung</button>` : ''; const editTplBtn = isTemplate ? `<button class='btn' data-edit='${item.id}'>Verwaltung</button>` : '';
const testBtn = isTemplate ? `<button class='btn' data-test='${item.id}' data-name='${name}'>Testversand</button>` : ''; const testBtn = isTemplate ? `<button class='btn' data-test='${item.id}' data-name='${name}'>Testversand</button>` : '';
const prevBtn = `<button class='btn' data-preview='${item.id}'>Vorschau</button>`; const prevBtn = `<button class='btn' data-preview='${item.id}'>Vorschau</button>`;
const delBtn = `<button class='btn btn-danger' data-del='${item.id}' data-name='${name}'>Löschen</button>`;
return `<div class='p-3 flex items-center gap-3'> return `<div class='p-3 flex items-center gap-3'>
${nameCell} ${nameCell}
<div class='text-xs text-gray-500'>#${item.id}</div> <div class='text-xs text-gray-500'>#${item.id}</div>
<div class='ms-auto flex gap-2 items-center'> <div class='ms-auto flex gap-2 items-center'>
${openBtn} ${openBtn}
${versionSelect} ${versionSelect}
${[editTplBtn, testBtn, prevBtn, delBtn].filter(Boolean).join('')} ${[editTplBtn, testBtn, prevBtn].filter(Boolean).join('')}
</div> </div>
</div>`; </div>`;
}).join(''); }).join('');
@@ -495,32 +474,7 @@ export async function loadList(section) {
} }
})); }));
const delDlg = document.getElementById('deleteDialog'); // delete handling removed from overview
const delText = document.getElementById('deleteText');
const delForm = document.getElementById('deleteForm');
const delCancel = document.getElementById('deleteCancel');
let pending = null;
delCancel && (delCancel.onclick = () => { pending = null; delDlg.close(); });
scope.querySelectorAll('[data-del]').forEach(btn => btn.addEventListener('click', () => {
const id = Number(btn.dataset.del || 0);
const nm = btn.dataset.name || '';
pending = { id, name: nm };
if (delText) {
delText.innerHTML = `Soll <strong>${nm || '(ohne Name)'} #${id}</strong> wirklich gelöscht werden?`;
}
delDlg.showModal();
}));
delForm && (delForm.onsubmit = async (ev) => {
ev.preventDefault();
if (!pending) return delDlg.close();
const res = await apiAction('content.delete', { method: 'POST', data: { id: pending.id, section_id: section.id } });
delDlg.close();
toast(res && res.ok ? 'Gelöscht' : 'Löschen fehlgeschlagen', !!(res && res.ok), { duration: 3000 });
loadList(section);
});
} }
} }

View File

@@ -172,7 +172,7 @@ require __DIR__ . '/../partials/structure/layout_start.php';
<button type="button" id="manageTemplateSave" class="btn">Speichern</button> <button type="button" id="manageTemplateSave" class="btn">Speichern</button>
</div> </div>
</div> </div>
<div class="mt-4 grid grid-cols-1 lg:grid-cols-2 gap-4"> <div class="mt-4">
<div class="space-y-3"> <div class="space-y-3">
<label class="block"> <label class="block">
<span class="text-sm text-slate-600">Name</span> <span class="text-sm text-slate-600">Name</span>
@@ -193,13 +193,6 @@ require __DIR__ . '/../partials/structure/layout_start.php';
<span id="manage_tpl_delete_hint" class="text-xs text-slate-500"></span> <span id="manage_tpl_delete_hint" class="text-xs text-slate-500"></span>
</div> </div>
</div> </div>
<div class="space-y-2">
<div class="text-sm font-semibold">Vorschau (gewählte Version)</div>
<div class="rounded-lg border bg-slate-50 p-2">
<iframe id="manage_tpl_preview" class="w-full h-[360px] bg-white rounded-md"></iframe>
</div>
</div>
</div> </div>
</div> </div>
</dialog> </dialog>