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 badge = document.getElementById('manage_tpl_badge');
const versionsWrap = document.getElementById('manage_tpl_versions');
const previewFrame = document.getElementById('manage_tpl_preview');
const btnClose = document.getElementById('manageTemplateClose');
const btnSave = document.getElementById('manageTemplateSave');
const btnDelete = document.getElementById('manageTemplateDelete');
@@ -86,11 +85,6 @@ async function openTemplateManager(item, section) {
let versions = [];
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 hasActive = !!activeId;
if (btnDelete) btnDelete.disabled = hasActive;
@@ -121,13 +115,13 @@ async function openTemplateManager(item, section) {
versionsWrap.innerHTML = versions.map(v => {
const isActive = Number(v.is_active) === 1;
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}\">
<div class=\"text-xs text-slate-600\">${label}</div>
<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>
${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>`;
}).join('');
@@ -179,15 +173,9 @@ async function openTemplateManager(item, section) {
const onVersionsClick = async (ev) => {
const target = ev.target;
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 (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) {
dlg && dlg.close();
const versionItem = { ...item, version_id: vid };
@@ -224,13 +212,6 @@ async function openTemplateManager(item, section) {
versionsWrap && versionsWrap.addEventListener('click', onVersionsClick);
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.showModal();
@@ -388,15 +369,13 @@ export async function loadList(section) {
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 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'>
${nameCell}
<div class='text-xs text-gray-500'>#${item.id}</div>
<div class='ms-auto flex gap-2 items-center'>
${openBtn}
${versionSelect}
${[editTplBtn, testBtn, prevBtn, delBtn].filter(Boolean).join('')}
${[editTplBtn, testBtn, prevBtn].filter(Boolean).join('')}
</div>
</div>`;
}).join('');
@@ -495,32 +474,7 @@ export async function loadList(section) {
}
}));
const delDlg = document.getElementById('deleteDialog');
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);
});
// delete handling removed from overview
}
}