Change/edit

This commit is contained in:
2026-02-03 03:34:59 +01:00
parent 0c3a2bffeb
commit aedffcda2d
4 changed files with 79 additions and 29 deletions

View File

@@ -1 +1 @@
1.2.26 1.2.27

View File

@@ -1144,7 +1144,12 @@ export function initEditor() {
try { try {
const okRefs = await confirmTemplateReferences('Deaktivieren'); const okRefs = await confirmTemplateReferences('Deaktivieren');
if (!okRefs) return; if (!okRefs) return;
const res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: current.id } }); let res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: current.id } });
if (res && res.ok === false && Array.isArray(res.references) && res.references.length) {
const ok = confirm('Dieses Template wird in anderen Templates verwendet. Trotzdem deaktivieren?');
if (!ok) return;
res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: current.id, force: 1 } });
}
if (!res?.ok) throw new Error(res?.error || 'Deaktivieren fehlgeschlagen'); if (!res?.ok) throw new Error(res?.error || 'Deaktivieren fehlgeschlagen');
await loadVersionsForCurrent({ keepSelection: true, preferredId: currentVersionId }); await loadVersionsForCurrent({ keepSelection: true, preferredId: currentVersionId });
toast('Aktive Version deaktiviert', true); toast('Aktive Version deaktiviert', true);

View File

@@ -260,7 +260,12 @@ async function openTemplateManager(item, section) {
const ok = await confirmTemplateReferences('Deaktivieren'); const ok = await confirmTemplateReferences('Deaktivieren');
if (!ok) return; if (!ok) return;
} }
const res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: item.id } }); let res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: item.id } });
if (res && res.ok === false && Array.isArray(res.references) && res.references.length) {
const ok = confirm('Dieses Template wird in anderen Templates verwendet. Trotzdem deaktivieren?');
if (!ok) return;
res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: item.id, force: 1 } });
}
toast(res && res.ok ? 'Aktive Version deaktiviert' : 'Deaktivieren fehlgeschlagen', !!(res && res.ok)); toast(res && res.ok ? 'Aktive Version deaktiviert' : 'Deaktivieren fehlgeschlagen', !!(res && res.ok));
await loadVersions(); await loadVersions();
if (typeof window.loadList === 'function') window.loadList(section); if (typeof window.loadList === 'function') window.loadList(section);
@@ -270,7 +275,12 @@ async function openTemplateManager(item, section) {
const versionRow = versions.find(v => Number(v.id) === vid); const versionRow = versions.find(v => Number(v.id) === vid);
if (versionRow && Number(versionRow.is_active) === 1) return; if (versionRow && Number(versionRow.is_active) === 1) return;
if (!confirm('Version wirklich löschen?')) return; if (!confirm('Version wirklich löschen?')) return;
const res = await apiAction('content_versions.delete', { method: 'POST', data: { id: vid, content_id: item.id } }); let res = await apiAction('content_versions.delete', { method: 'POST', data: { id: vid, content_id: item.id } });
if (res && res.ok === false && Array.isArray(res.references) && res.references.length) {
const ok = confirm('Dieses Template wird in anderen Templates verwendet. Trotzdem löschen?');
if (!ok) return;
res = await apiAction('content_versions.delete', { method: 'POST', data: { id: vid, content_id: item.id, force: 1 } });
}
toast(res && res.ok ? 'Version gelöscht' : 'Löschen fehlgeschlagen', !!(res && res.ok)); toast(res && res.ok ? 'Version gelöscht' : 'Löschen fehlgeschlagen', !!(res && res.ok));
await loadVersions(); await loadVersions();
if (typeof window.loadList === 'function') window.loadList(section); if (typeof window.loadList === 'function') window.loadList(section);

View File

@@ -1240,6 +1240,7 @@ class ApiKernel
$versionId = (int)$this->val($this->in, ['id', 'version_id', 'version'], 0); $versionId = (int)$this->val($this->in, ['id', 'version_id', 'version'], 0);
if ($versionId <= 0) $this->fail('version id required', null, 422); if ($versionId <= 0) $this->fail('version id required', null, 422);
$contentId = (int)$this->val($this->in, ['content_id', 'content'], 0); $contentId = (int)$this->val($this->in, ['content_id', 'content'], 0);
$force = (int)$this->val($this->in, ['force', 'override'], 0) === 1;
$versionsTable = $this->contentVersionsTable(); $versionsTable = $this->contentVersionsTable();
$itemsTable = $this->contentItemsTable(); $itemsTable = $this->contentItemsTable();
@@ -1323,32 +1324,35 @@ class ApiKernel
if ($customerId <= 0) $this->fail('Customer context missing', null, 500); if ($customerId <= 0) $this->fail('Customer context missing', null, 500);
$contentId = (int)$this->val($this->in, ['content_id', 'content'], 0); $contentId = (int)$this->val($this->in, ['content_id', 'content'], 0);
if ($contentId <= 0) $this->fail('content_id required', null, 422); if ($contentId <= 0) $this->fail('content_id required', null, 422);
$force = (int)$this->val($this->in, ['force', 'override'], 0) === 1;
$refsDebug = []; if (!$force) {
$refs = $this->findTemplateReferences($customerId, $contentId, $refsDebug); $refsDebug = [];
if (!empty($refsDebug)) { $refs = $this->findTemplateReferences($customerId, $contentId, $refsDebug);
$this->writeDebugLog('templates_references_debug', $refsDebug); if (!empty($refsDebug)) {
} $this->writeDebugLog('templates_references_debug', $refsDebug);
if (!empty($refs)) { }
debug_log_write('templates_toggle', [ if (!empty($refs)) {
'time' => date(DATE_ATOM), debug_log_write('templates_toggle', [
'action' => 'content_versions.deactivate.blocked', 'time' => date(DATE_ATOM),
'customer_id' => $customerId, 'action' => 'content_versions.deactivate.blocked',
'content_id' => $contentId, 'customer_id' => $customerId,
'references' => $refs, 'content_id' => $contentId,
'input' => $this->in, 'references' => $refs,
], [ 'input' => $this->in,
'append' => true, ], [
'json' => true, 'append' => true,
'newline' => true, 'json' => true,
]); 'newline' => true,
$this->respond([ ]);
'ok' => false, $this->respond([
'error' => 'Template wird in anderen Templates verwendet', 'ok' => false,
'content_id' => $contentId, 'error' => 'Template wird in anderen Templates verwendet',
'count' => count($refs), 'content_id' => $contentId,
'references' => $refs, 'count' => count($refs),
], 409); 'references' => $refs,
], 409);
}
} }
$ok = $this->deactivateContentVersion($customerId, $contentId); $ok = $this->deactivateContentVersion($customerId, $contentId);
@@ -1395,6 +1399,37 @@ class ApiKernel
$this->fail('Active versions cannot be deleted', ['id' => $versionId], 422); $this->fail('Active versions cannot be deleted', ['id' => $versionId], 422);
} }
if (!$force && $contentId > 0) {
$refsDebug = [];
$refs = $this->findTemplateReferences($customerId, $contentId, $refsDebug);
if (!empty($refsDebug)) {
$this->writeDebugLog('templates_references_debug', $refsDebug);
}
if (!empty($refs)) {
debug_log_write('templates_toggle', [
'time' => date(DATE_ATOM),
'action' => 'content_versions.delete.blocked',
'customer_id' => $customerId,
'content_id' => $contentId,
'version_id' => $versionId,
'references' => $refs,
'input' => $this->in,
], [
'append' => true,
'json' => true,
'newline' => true,
]);
$this->respond([
'ok' => false,
'error' => 'Template wird in anderen Templates verwendet',
'content_id' => $contentId,
'version_id' => $versionId,
'count' => count($refs),
'references' => $refs,
], 409);
}
}
$stmt = $this->pdo->prepare("DELETE FROM `$table` WHERE `id` = :id AND `customer_id` = :cid LIMIT 1"); $stmt = $this->pdo->prepare("DELETE FROM `$table` WHERE `id` = :id AND `customer_id` = :cid LIMIT 1");
$stmt->execute([':id' => $versionId, ':cid' => $customerId]); $stmt->execute([':id' => $versionId, ':cid' => $customerId]);
$this->respond(['ok' => true, 'deleted' => true, 'id' => $versionId]); $this->respond(['ok' => true, 'deleted' => true, 'id' => $versionId]);