sdasd
This commit is contained in:
@@ -21,12 +21,16 @@ export function initEditor() {
|
||||
const sendInfo = document.getElementById('send_template_info');
|
||||
const btnCancelSend= document.getElementById('btn-cancel-send');
|
||||
const btnSendNow = document.getElementById('btn-send-now');
|
||||
const sendSender = document.getElementById('send_sender');
|
||||
const sendSenderHint = document.getElementById('send_sender_hint');
|
||||
const prevFrame = document.getElementById('previewFrame');
|
||||
const btnPrevClose = document.getElementById('btn-close-preview');
|
||||
|
||||
let current = null; // { resource, id, name }
|
||||
let bridgeListener = null;
|
||||
let reqToken = 0; // steigender Token pro Öffnen -> ignoriert verspätete Events
|
||||
let senderOptions = [];
|
||||
let senderLoadPromise = null;
|
||||
|
||||
const ok = (m) => toast(m, true);
|
||||
const err = (m) => toast(m, false);
|
||||
@@ -228,6 +232,43 @@ export function initEditor() {
|
||||
return (rows || []).map(r => ({ id: r.id, name: r.name, html: r.content || r.html || '' }));
|
||||
}
|
||||
|
||||
async function loadSenderOptions(force = false) {
|
||||
if (!sendSender) return;
|
||||
if (senderLoadPromise && !force) return senderLoadPromise;
|
||||
senderLoadPromise = apiAction('account.senders.list', { method: 'GET' })
|
||||
.then(res => {
|
||||
senderOptions = res?.items || [];
|
||||
renderSenderOptions();
|
||||
})
|
||||
.catch(() => {
|
||||
senderOptions = [];
|
||||
renderSenderOptions();
|
||||
})
|
||||
.finally(() => {
|
||||
senderLoadPromise = null;
|
||||
});
|
||||
return senderLoadPromise;
|
||||
}
|
||||
|
||||
function renderSenderOptions() {
|
||||
if (!sendSender) return;
|
||||
const previous = sendSender.value;
|
||||
let html = '<option value="">Standard (System)</option>';
|
||||
senderOptions.forEach(opt => {
|
||||
const label = opt.label || opt.from_name || opt.from_email;
|
||||
html += `<option value="${opt.id}">${escapeHtml(label)} <${escapeHtml(opt.from_email)}></option>`;
|
||||
});
|
||||
sendSender.innerHTML = html;
|
||||
if (previous && senderOptions.some(opt => String(opt.id) === previous)) {
|
||||
sendSender.value = previous;
|
||||
} else {
|
||||
sendSender.value = '';
|
||||
}
|
||||
if (sendSenderHint) {
|
||||
sendSenderHint.classList.toggle('hidden', senderOptions.length > 0);
|
||||
}
|
||||
}
|
||||
|
||||
// ---------- Initialen HTML-Inhalt in Editor pushen (mit Token/Race-Schutz) ----------
|
||||
async function pushInitialHtmlToEditor({ mode, html, snippets, ref, token, hasJson, json }) {
|
||||
if (token !== reqToken) return; // veraltete Anfrage ignorieren
|
||||
@@ -423,9 +464,13 @@ export function initEditor() {
|
||||
setSendContext(ctxId, ctxName);
|
||||
if (sendSubject) sendSubject.value = ctx?.subject || 'Testversand';
|
||||
if (sendTo) sendTo.value = ctx?.to || '';
|
||||
await loadSenderOptions(true);
|
||||
sendDlg?.showModal?.();
|
||||
}
|
||||
function closeSend(){ sendDlg?.close?.(); }
|
||||
function closeSend(){
|
||||
sendDlg?.close?.();
|
||||
if (sendSender) sendSender.value = '';
|
||||
}
|
||||
|
||||
async function doSend(ev){
|
||||
ev?.preventDefault?.();
|
||||
@@ -437,7 +482,15 @@ export function initEditor() {
|
||||
if(!id){ toast("Kein Template geladen", false); return; }
|
||||
// Hier wird der gespeicherte HTML-Code verwendet, nicht der Live-HTML, da apiAction
|
||||
// keine Live-Daten erwartet. Es geht um template_id.
|
||||
const r = await apiAction('templates.test_send', { method:'POST', data:{ template_id: id, to, subject: (sendSubject?.value || 'Testversand') } });
|
||||
const payload = {
|
||||
template_id: id,
|
||||
to,
|
||||
subject: (sendSubject?.value || 'Testversand'),
|
||||
};
|
||||
if (sendSender && sendSender.value) {
|
||||
payload.sender_id = Number(sendSender.value);
|
||||
}
|
||||
const r = await apiAction('templates.test_send', { method:'POST', data: payload });
|
||||
if(r?.ok){ toast("Testversand ausgelöst"); closeSend(); } else { toast("Senden fehlgeschlagen", false); }
|
||||
}
|
||||
function closePreview(){ prevDlg?.close?.(); }
|
||||
@@ -488,6 +541,15 @@ export function initEditor() {
|
||||
window.EditorUI = { open, save, close, clear: clearEditor, preview: openPreview };
|
||||
}
|
||||
|
||||
function escapeHtml(str) {
|
||||
return String(str || '')
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"')
|
||||
.replace(/'/g, ''');
|
||||
}
|
||||
|
||||
// Default-Export + globaler Fallback
|
||||
export default initEditor;
|
||||
window.initEditor = initEditor;
|
||||
|
||||
Reference in New Issue
Block a user