change popup
This commit is contained in:
@@ -1 +1 @@
|
|||||||
1.2.27
|
1.2.28
|
||||||
@@ -60,8 +60,65 @@ export function initEditor() {
|
|||||||
let currentVersionId = 0;
|
let currentVersionId = 0;
|
||||||
let currentVersionMeta = null;
|
let currentVersionMeta = null;
|
||||||
|
|
||||||
const ok = (m) => toast(m, true);
|
const ok = (m) => toast(m, true);
|
||||||
const err = (m) => toast(m, false);
|
const err = (m) => toast(m, false);
|
||||||
|
|
||||||
|
const showConfirmDialog = (() => {
|
||||||
|
let dialog;
|
||||||
|
let titleEl;
|
||||||
|
let textEl;
|
||||||
|
let btnOk;
|
||||||
|
let btnCancel;
|
||||||
|
let pendingResolve = null;
|
||||||
|
|
||||||
|
const ensure = () => {
|
||||||
|
if (dialog) return;
|
||||||
|
dialog = document.createElement('dialog');
|
||||||
|
dialog.className = 'rounded-2xl p-0 w-[520px]';
|
||||||
|
dialog.innerHTML = `
|
||||||
|
<div class="p-4 bg-white rounded-2xl space-y-4">
|
||||||
|
<h3 class="text-lg font-semibold" data-confirm-title></h3>
|
||||||
|
<p class="text-sm text-slate-600" data-confirm-text></p>
|
||||||
|
<div class="flex justify-end gap-2">
|
||||||
|
<button type="button" class="btn" data-confirm-cancel>Abbrechen</button>
|
||||||
|
<button type="button" class="btn btn-danger" data-confirm-ok>Bestätigen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
document.body.appendChild(dialog);
|
||||||
|
titleEl = dialog.querySelector('[data-confirm-title]');
|
||||||
|
textEl = dialog.querySelector('[data-confirm-text]');
|
||||||
|
btnOk = dialog.querySelector('[data-confirm-ok]');
|
||||||
|
btnCancel = dialog.querySelector('[data-confirm-cancel]');
|
||||||
|
|
||||||
|
btnOk?.addEventListener('click', () => {
|
||||||
|
if (pendingResolve) pendingResolve(true);
|
||||||
|
pendingResolve = null;
|
||||||
|
dialog.close();
|
||||||
|
});
|
||||||
|
btnCancel?.addEventListener('click', () => {
|
||||||
|
if (pendingResolve) pendingResolve(false);
|
||||||
|
pendingResolve = null;
|
||||||
|
dialog.close();
|
||||||
|
});
|
||||||
|
dialog.addEventListener('close', () => {
|
||||||
|
if (pendingResolve) pendingResolve(false);
|
||||||
|
pendingResolve = null;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return async ({ title, text, confirmLabel = 'Bestätigen', cancelLabel = 'Abbrechen' }) => {
|
||||||
|
ensure();
|
||||||
|
if (titleEl) titleEl.textContent = title || 'Bestätigung';
|
||||||
|
if (textEl) textEl.textContent = text || '';
|
||||||
|
if (btnOk) btnOk.textContent = confirmLabel;
|
||||||
|
if (btnCancel) btnCancel.textContent = cancelLabel;
|
||||||
|
if (!dialog.open) dialog.showModal();
|
||||||
|
return await new Promise(resolve => {
|
||||||
|
pendingResolve = resolve;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
// ---------- Hilfen ----------
|
// ---------- Hilfen ----------
|
||||||
function activeMode() {
|
function activeMode() {
|
||||||
@@ -1107,13 +1164,21 @@ export function initEditor() {
|
|||||||
if (!current?.id || !isTemplateSection()) return true;
|
if (!current?.id || !isTemplateSection()) return true;
|
||||||
const res = await apiAction('templates.references', { method: 'GET', data: { template_id: current.id } }).catch(() => null);
|
const res = await apiAction('templates.references', { method: 'GET', data: { template_id: current.id } }).catch(() => null);
|
||||||
if (!res || res.ok === false) {
|
if (!res || res.ok === false) {
|
||||||
return confirm(`Referenzen konnten nicht geprüft werden. ${actionLabel} trotzdem?`);
|
return await showConfirmDialog({
|
||||||
|
title: 'Referenzen nicht geprüft',
|
||||||
|
text: `Referenzen konnten nicht geprüft werden. ${actionLabel} trotzdem?`,
|
||||||
|
confirmLabel: actionLabel,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
const refs = Array.isArray(res?.references) ? res.references : [];
|
const refs = Array.isArray(res?.references) ? res.references : [];
|
||||||
if (!refs.length) return true;
|
if (!refs.length) return true;
|
||||||
const preview = refs.slice(0, 6).map(r => `${r.name || 'Template'} #${r.id}`).join(', ');
|
const preview = refs.slice(0, 6).map(r => `${r.name || 'Template'} #${r.id}`).join(', ');
|
||||||
const more = refs.length > 6 ? ` und ${refs.length - 6} weitere` : '';
|
const more = refs.length > 6 ? ` und ${refs.length - 6} weitere` : '';
|
||||||
return confirm(`Dieses Template wird in ${refs.length} anderen Template(s) verwendet (${preview}${more}). ${actionLabel} trotzdem?`);
|
return await showConfirmDialog({
|
||||||
|
title: 'Template wird verwendet',
|
||||||
|
text: `Dieses Template wird in ${refs.length} anderen Template(s) verwendet (${preview}${more}). ${actionLabel} trotzdem?`,
|
||||||
|
confirmLabel: actionLabel,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
@@ -1146,7 +1211,11 @@ export function initEditor() {
|
|||||||
if (!okRefs) return;
|
if (!okRefs) return;
|
||||||
let 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) {
|
if (res && res.ok === false && Array.isArray(res.references) && res.references.length) {
|
||||||
const ok = confirm('Dieses Template wird in anderen Templates verwendet. Trotzdem deaktivieren?');
|
const ok = await showConfirmDialog({
|
||||||
|
title: 'Template wird verwendet',
|
||||||
|
text: 'Dieses Template wird in anderen Templates verwendet. Trotzdem deaktivieren?',
|
||||||
|
confirmLabel: 'Deaktivieren',
|
||||||
|
});
|
||||||
if (!ok) return;
|
if (!ok) return;
|
||||||
res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: current.id, force: 1 } });
|
res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: current.id, force: 1 } });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,63 @@ function esc(s = '') {
|
|||||||
.replace(/'/g, ''');
|
.replace(/'/g, ''');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const showConfirmDialog = (() => {
|
||||||
|
let dialog;
|
||||||
|
let titleEl;
|
||||||
|
let textEl;
|
||||||
|
let btnOk;
|
||||||
|
let btnCancel;
|
||||||
|
let pendingResolve = null;
|
||||||
|
|
||||||
|
const ensure = () => {
|
||||||
|
if (dialog) return;
|
||||||
|
dialog = document.createElement('dialog');
|
||||||
|
dialog.className = 'rounded-2xl p-0 w-[520px]';
|
||||||
|
dialog.innerHTML = `
|
||||||
|
<div class="p-4 bg-white rounded-2xl space-y-4">
|
||||||
|
<h3 class="text-lg font-semibold" data-confirm-title></h3>
|
||||||
|
<p class="text-sm text-slate-600" data-confirm-text></p>
|
||||||
|
<div class="flex justify-end gap-2">
|
||||||
|
<button type="button" class="btn" data-confirm-cancel>Abbrechen</button>
|
||||||
|
<button type="button" class="btn btn-danger" data-confirm-ok>Bestätigen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
document.body.appendChild(dialog);
|
||||||
|
titleEl = dialog.querySelector('[data-confirm-title]');
|
||||||
|
textEl = dialog.querySelector('[data-confirm-text]');
|
||||||
|
btnOk = dialog.querySelector('[data-confirm-ok]');
|
||||||
|
btnCancel = dialog.querySelector('[data-confirm-cancel]');
|
||||||
|
|
||||||
|
btnOk?.addEventListener('click', () => {
|
||||||
|
if (pendingResolve) pendingResolve(true);
|
||||||
|
pendingResolve = null;
|
||||||
|
dialog.close();
|
||||||
|
});
|
||||||
|
btnCancel?.addEventListener('click', () => {
|
||||||
|
if (pendingResolve) pendingResolve(false);
|
||||||
|
pendingResolve = null;
|
||||||
|
dialog.close();
|
||||||
|
});
|
||||||
|
dialog.addEventListener('close', () => {
|
||||||
|
if (pendingResolve) pendingResolve(false);
|
||||||
|
pendingResolve = null;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return async ({ title, text, confirmLabel = 'Bestätigen', cancelLabel = 'Abbrechen' }) => {
|
||||||
|
ensure();
|
||||||
|
if (titleEl) titleEl.textContent = title || 'Bestätigung';
|
||||||
|
if (textEl) textEl.textContent = text || '';
|
||||||
|
if (btnOk) btnOk.textContent = confirmLabel;
|
||||||
|
if (btnCancel) btnCancel.textContent = cancelLabel;
|
||||||
|
if (!dialog.open) dialog.showModal();
|
||||||
|
return await new Promise(resolve => {
|
||||||
|
pendingResolve = resolve;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
function formatVersionDate(value) {
|
function formatVersionDate(value) {
|
||||||
if (!value) return '';
|
if (!value) return '';
|
||||||
try {
|
try {
|
||||||
@@ -105,12 +162,20 @@ async function openTemplateManager(item, section) {
|
|||||||
if (!isTemplateSection()) return true;
|
if (!isTemplateSection()) return true;
|
||||||
const refs = await fetchTemplateReferences();
|
const refs = await fetchTemplateReferences();
|
||||||
if (refs === null) {
|
if (refs === null) {
|
||||||
return confirm(`Referenzen konnten nicht geprüft werden. ${actionLabel} trotzdem?`);
|
return await showConfirmDialog({
|
||||||
|
title: 'Referenzen nicht geprüft',
|
||||||
|
text: `Referenzen konnten nicht geprüft werden. ${actionLabel} trotzdem?`,
|
||||||
|
confirmLabel: actionLabel,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (!refs.length) return true;
|
if (!refs.length) return true;
|
||||||
const preview = refs.slice(0, 6).map(r => `${r.name || 'Template'} #${r.id}`).join(', ');
|
const preview = refs.slice(0, 6).map(r => `${r.name || 'Template'} #${r.id}`).join(', ');
|
||||||
const more = refs.length > 6 ? ` und ${refs.length - 6} weitere` : '';
|
const more = refs.length > 6 ? ` und ${refs.length - 6} weitere` : '';
|
||||||
return confirm(`Dieses Template wird in ${refs.length} anderen Template(s) verwendet (${preview}${more}). ${actionLabel} trotzdem?`);
|
return await showConfirmDialog({
|
||||||
|
title: 'Template wird verwendet',
|
||||||
|
text: `Dieses Template wird in ${refs.length} anderen Template(s) verwendet (${preview}${more}). ${actionLabel} trotzdem?`,
|
||||||
|
confirmLabel: actionLabel,
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const updateDeleteState = () => {
|
const updateDeleteState = () => {
|
||||||
@@ -262,7 +327,11 @@ async function openTemplateManager(item, section) {
|
|||||||
}
|
}
|
||||||
let 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) {
|
if (res && res.ok === false && Array.isArray(res.references) && res.references.length) {
|
||||||
const ok = confirm('Dieses Template wird in anderen Templates verwendet. Trotzdem deaktivieren?');
|
const ok = await showConfirmDialog({
|
||||||
|
title: 'Template wird verwendet',
|
||||||
|
text: 'Dieses Template wird in anderen Templates verwendet. Trotzdem deaktivieren?',
|
||||||
|
confirmLabel: 'Deaktivieren',
|
||||||
|
});
|
||||||
if (!ok) return;
|
if (!ok) return;
|
||||||
res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: item.id, force: 1 } });
|
res = await apiAction('content_versions.deactivate', { method: 'POST', data: { content_id: item.id, force: 1 } });
|
||||||
}
|
}
|
||||||
@@ -277,7 +346,11 @@ async function openTemplateManager(item, section) {
|
|||||||
if (!confirm('Version wirklich löschen?')) return;
|
if (!confirm('Version wirklich löschen?')) return;
|
||||||
let 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) {
|
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?');
|
const ok = await showConfirmDialog({
|
||||||
|
title: 'Template wird verwendet',
|
||||||
|
text: 'Dieses Template wird in anderen Templates verwendet. Trotzdem löschen?',
|
||||||
|
confirmLabel: 'Löschen',
|
||||||
|
});
|
||||||
if (!ok) return;
|
if (!ok) return;
|
||||||
res = await apiAction('content_versions.delete', { method: 'POST', data: { id: vid, content_id: item.id, force: 1 } });
|
res = await apiAction('content_versions.delete', { method: 'POST', data: { id: vid, content_id: item.id, force: 1 } });
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user