Zammad-tiketit: vastaus Zammad API:n kautta + to-osoite + HTML-viestit
1. Zammad-tiketeille näytetään vastaanotto-osoite (esim. support@web1.fi) lähettäjäkentässä eikä SMTP-postilaatikkolistaa — vastaus menee Zammad API:n kautta. 2. Ensimmäisen artikkelin to-osoite tallennetaan zammad_to_email kenttään on-demand artikkelien haussa. 3. Korjattu _dbFetchRow → _dbFetchOne zammad_reply endpointissa. 4. sanitizeHtml() renderöi viestien HTML turvallisesti. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
46
script.js
46
script.js
@@ -1846,29 +1846,33 @@ async function showTicketDetail(id, companyId = '') {
|
||||
const ccField = document.getElementById('reply-cc');
|
||||
if (ccField) ccField.value = ticket.cc || '';
|
||||
|
||||
// Mailbox-valinta — täytetään yrityksen postilaatikoista
|
||||
// Mailbox-valinta — Zammad-tiketit vastaa Zammadin kautta, muut SMTP:llä
|
||||
const mbSelect = document.getElementById('reply-mailbox-select');
|
||||
if (mbSelect) {
|
||||
try {
|
||||
const mailboxes = await apiCall('all_mailboxes');
|
||||
// Suodata pois piilotetut postilaatikot (paitsi jos tiketin oma mailbox on piilotettu — se näytetään silti)
|
||||
const visibleMailboxes = mailboxes.filter(mb =>
|
||||
String(mb.id) === String(ticket.mailbox_id || '') ||
|
||||
(!currentHiddenMailboxes.includes(String(mb.id)) && !currentHiddenMailboxes.includes(mb.id))
|
||||
);
|
||||
const ticketMbId = String(ticket.mailbox_id || '');
|
||||
const hasMatch = ticketMbId && visibleMailboxes.some(mb => String(mb.id) === ticketMbId);
|
||||
let optionsHtml = '';
|
||||
if (!hasMatch) optionsHtml = '<option value="" selected>— Valitse lähettäjä —</option>';
|
||||
optionsHtml += visibleMailboxes.map(mb =>
|
||||
`<option value="${esc(mb.id)}" ${String(mb.id) === ticketMbId ? 'selected' : ''}>${esc(mb.nimi || mb.smtp_from_email)} <${esc(mb.smtp_from_email)}></option>`
|
||||
).join('');
|
||||
mbSelect.innerHTML = optionsHtml;
|
||||
// Vaihda allekirjoitusta kun mailbox vaihtuu
|
||||
mbSelect.addEventListener('change', function() {
|
||||
updateSignaturePreview(this.value);
|
||||
});
|
||||
} catch (e) { mbSelect.innerHTML = '<option>Ei postilaatikoita</option>'; }
|
||||
if (ticket.source === 'zammad' && ticket.zammad_ticket_id) {
|
||||
// Zammad-tiketti: vastaus menee Zammadin kautta
|
||||
const zTo = ticket.zammad_to_email || ticket.zammad_group || 'Zammad';
|
||||
mbSelect.innerHTML = `<option value="zammad" selected>${esc(zTo)} (Zammad)</option>`;
|
||||
} else {
|
||||
try {
|
||||
const mailboxes = await apiCall('all_mailboxes');
|
||||
const visibleMailboxes = mailboxes.filter(mb =>
|
||||
String(mb.id) === String(ticket.mailbox_id || '') ||
|
||||
(!currentHiddenMailboxes.includes(String(mb.id)) && !currentHiddenMailboxes.includes(mb.id))
|
||||
);
|
||||
const ticketMbId = String(ticket.mailbox_id || '');
|
||||
const hasMatch = ticketMbId && visibleMailboxes.some(mb => String(mb.id) === ticketMbId);
|
||||
let optionsHtml = '';
|
||||
if (!hasMatch) optionsHtml = '<option value="" selected>— Valitse lähettäjä —</option>';
|
||||
optionsHtml += visibleMailboxes.map(mb =>
|
||||
`<option value="${esc(mb.id)}" ${String(mb.id) === ticketMbId ? 'selected' : ''}>${esc(mb.nimi || mb.smtp_from_email)} <${esc(mb.smtp_from_email)}></option>`
|
||||
).join('');
|
||||
mbSelect.innerHTML = optionsHtml;
|
||||
} catch (e) { mbSelect.innerHTML = '<option>Ei postilaatikoita</option>'; }
|
||||
}
|
||||
mbSelect.addEventListener('change', function() {
|
||||
updateSignaturePreview(this.value);
|
||||
});
|
||||
}
|
||||
|
||||
// Allekirjoituksen esikatselu
|
||||
|
||||
Reference in New Issue
Block a user