/** * mailManagement.js * Pagina di gestione mail: include la gestione dei Gruppi di Indirizzi * e la gestione delle firme email per l'agente attivo. */ const MailManagementView = { agentId: null, signatures: [], groups: [], editingSigId: null, editingGroupId: null, signatureQuill: null, async render() { this.agentId = App.currentAgentId || 0; const container = document.getElementById('view-container'); // Inject styles for tooltip and layout this.injectStyles(); container.innerHTML = `

👥 Gruppi di Indirizzi

Crea gruppi di contatti da inserire rapidamente nei campi A, CC o BCC.

✉️ Le Mie Firme Email

Gestisci le firme da allegare automaticamente alle tue email.

`; // Signatures events document.getElementById('btn-new-signature').addEventListener('click', () => this.openSigEditor(null)); // Address Groups events document.getElementById('btn-new-group').addEventListener('click', () => this.openGroupEditor(null)); // Load data await Promise.all([ this.loadSignatures(), this.loadGroups() ]); }, injectStyles() { if (document.getElementById('mail-management-styles')) return; const style = document.createElement('style'); style.id = 'mail-management-styles'; style.textContent = ` .g-card { background: var(--bg-secondary); border: 1px solid var(--border-subtle); border-radius: var(--radius-md); padding: var(--space-md); position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 12px; transition: transform 0.2s, box-shadow 0.2s; } .g-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-sm); border-color: var(--accent-primary); } .g-tooltip { visibility: hidden; opacity: 0; position: absolute; bottom: 105%; left: 50%; transform: translateX(-50%); background: var(--bg-tertiary, #2c2c3e); border: 1px solid var(--border-light, #444); color: var(--text-primary, #fff); padding: 8px 12px; border-radius: 6px; font-size: 0.78rem; z-index: 100; white-space: pre-line; box-shadow: var(--shadow-lg); pointer-events: none; transition: opacity 0.2s, visibility 0.2s; max-width: 280px; width: max-content; } .g-card:hover .g-tooltip { visibility: visible; opacity: 1; } `; document.head.appendChild(style); }, // ─── SIGNATURES LOGIC ──────────────────────────────────────────────────────── async loadSignatures() { try { this.signatures = await App.api(`/api/email/signatures?agent_id=${this.agentId}`); this.renderSignatures(); } catch (err) { Toast.error('Errore caricamento firme: ' + err.message); } }, renderSignatures() { const list = document.getElementById('signatures-list'); if (!list) return; if (!this.signatures.length) { list.innerHTML = `
✉️
Nessuna firma configurata
`; return; } list.innerHTML = this.signatures.map(sig => `
${App.escapeHtml(sig.name)} ${sig.is_default ? 'Predefinita' : ''}
${!sig.is_default ? `` : ''}
${sig.body_html ? `
${sig.body_html}
` : ''}
`).join(''); // Bind buttons list.querySelectorAll('.sig-btn-edit').forEach(btn => { btn.addEventListener('click', () => this.openSigEditor(parseInt(btn.dataset.id, 10))); }); list.querySelectorAll('.sig-btn-delete').forEach(btn => { btn.addEventListener('click', () => this.deleteSig(parseInt(btn.dataset.id, 10))); }); list.querySelectorAll('.sig-btn-default').forEach(btn => { btn.addEventListener('click', () => this.setDefaultSig(parseInt(btn.dataset.id, 10))); }); }, openSigEditor(id) { this.editingSigId = id; const sig = id ? this.signatures.find(s => s.id === id) : null; const modal = document.getElementById('signature-editor-modal'); modal.style.display = 'flex'; document.getElementById('sig-modal-title').textContent = id ? 'Modifica Firma' : 'Nuova Firma'; document.getElementById('sig-name').value = sig ? sig.name : ''; document.getElementById('sig-is-default').checked = sig ? !!sig.is_default : false; // Init or reset Quill if (this.signatureQuill) { this.signatureQuill.root.innerHTML = sig ? (sig.body_html || '') : ''; } else { this.signatureQuill = new Quill('#sig-quill-editor', { theme: 'snow', placeholder: 'Inserisci la tua firma...', modules: { toolbar: [ ['bold', 'italic', 'underline'], [{ 'color': [] }], ['link', 'image'], ['clean'] ] } }); if (sig && sig.body_html) { this.signatureQuill.clipboard.dangerouslyPasteHTML(sig.body_html); } } document.getElementById('sig-modal-close').onclick = () => this.closeSigEditor(); document.getElementById('sig-cancel').onclick = () => this.closeSigEditor(); document.getElementById('sig-save').onclick = () => this.saveSig(); modal.onclick = (e) => { if (e.target === modal) this.closeSigEditor(); }; }, closeSigEditor() { const modal = document.getElementById('signature-editor-modal'); if (modal) modal.style.display = 'none'; this.editingSigId = null; }, async saveSig() { const name = document.getElementById('sig-name').value.trim(); const body_html = this.signatureQuill ? this.signatureQuill.root.innerHTML : ''; const is_default = document.getElementById('sig-is-default').checked ? 1 : 0; if (!name) { Toast.warning('Inserisci un nome per la firma'); return; } const saveBtn = document.getElementById('sig-save'); saveBtn.disabled = true; saveBtn.textContent = 'Salvataggio...'; try { const payload = { agent_id: this.agentId, name, body_html, is_default }; if (this.editingSigId) { await App.api(`/api/email/signatures/${this.editingSigId}`, { method: 'PUT', body: JSON.stringify(payload), }); Toast.success('Firma aggiornata'); } else { await App.api('/api/email/signatures', { method: 'POST', body: JSON.stringify(payload), }); Toast.success('Firma creata'); } this.closeSigEditor(); await this.loadSignatures(); } catch (err) { Toast.error('Errore salvataggio: ' + err.message); } finally { saveBtn.disabled = false; saveBtn.textContent = 'Salva Firma'; } }, async deleteSig(id) { const ok = await App.confirm('Elimina Firma', 'Sei sicuro di voler eliminare questa firma?'); if (!ok) return; try { await App.api(`/api/email/signatures/${id}`, { method: 'DELETE' }); Toast.success('Firma eliminata'); await this.loadSignatures(); } catch (err) { Toast.error('Errore eliminazione: ' + err.message); } }, async setDefaultSig(id) { try { await App.api(`/api/email/signatures/${id}/default`, { method: 'PATCH', body: JSON.stringify({ agent_id: this.agentId }), }); Toast.success('Firma impostata come predefinita'); await this.loadSignatures(); } catch (err) { Toast.error('Errore: ' + err.message); } }, // ─── ADDRESS GROUPS LOGIC ────────────────────────────────────────────────── async loadGroups() { try { this.groups = await App.api(`/api/email/address-groups?agent_id=${this.agentId}`); this.renderGroups(); } catch (err) { Toast.error('Errore caricamento gruppi: ' + err.message); } }, renderGroups() { const list = document.getElementById('groups-list'); if (!list) return; if (!this.groups.length) { list.innerHTML = `
👥
Nessun gruppo configurato
`; return; } list.innerHTML = this.groups.map(g => { const emailList = g.emails.split(',').map(e => e.trim()).filter(Boolean); const tooltipText = emailList.length ? emailList.join('\n') : '(nessun indirizzo)'; const count = emailList.length; return `
Contatti (${count}):\n${App.escapeHtml(tooltipText)}
${App.escapeHtml(g.name)}
${count} indirizz${count === 1 ? 'o' : 'i'} email
`; }).join(''); // Bind group buttons list.querySelectorAll('.group-btn-edit').forEach(btn => { btn.addEventListener('click', () => this.openGroupEditor(parseInt(btn.dataset.id, 10))); }); list.querySelectorAll('.group-btn-delete').forEach(btn => { btn.addEventListener('click', () => this.deleteGroup(parseInt(btn.dataset.id, 10))); }); }, openGroupEditor(id) { this.editingGroupId = id; const group = id ? this.groups.find(g => g.id === id) : null; const modal = document.getElementById('group-editor-modal'); modal.style.display = 'flex'; document.getElementById('group-modal-title').textContent = id ? 'Modifica Gruppo' : 'Nuovo Gruppo'; document.getElementById('group-name').value = group ? group.name : ''; document.getElementById('group-emails').value = group ? group.emails : ''; document.getElementById('group-modal-close').onclick = () => this.closeGroupEditor(); document.getElementById('group-cancel').onclick = () => this.closeGroupEditor(); document.getElementById('group-save').onclick = () => this.saveGroup(); modal.onclick = (e) => { if (e.target === modal) this.closeGroupEditor(); }; }, closeGroupEditor() { const modal = document.getElementById('group-editor-modal'); if (modal) modal.style.display = 'none'; this.editingGroupId = null; }, async saveGroup() { const name = document.getElementById('group-name').value.trim(); const emails = document.getElementById('group-emails').value.trim(); if (!name) { Toast.warning('Inserisci un nome per il gruppo'); return; } if (!emails) { Toast.warning('Inserisci almeno un indirizzo email'); return; } const parsedEmails = emails.split(',').map(e => e.trim()).filter(Boolean); const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; const invalid = parsedEmails.filter(e => !emailRegex.test(e)); if (invalid.length > 0) { Toast.warning('I seguenti indirizzi non sono validi: ' + invalid.join(', ')); return; } const saveBtn = document.getElementById('group-save'); saveBtn.disabled = true; saveBtn.textContent = 'Salvataggio...'; try { const payload = { agent_id: this.agentId, name, emails: parsedEmails.join(', ') }; if (this.editingGroupId) { await App.api(`/api/email/address-groups/${this.editingGroupId}`, { method: 'PUT', body: JSON.stringify(payload), }); Toast.success('Gruppo aggiornato'); } else { await App.api('/api/email/address-groups', { method: 'POST', body: JSON.stringify(payload), }); Toast.success('Gruppo creato'); } this.closeGroupEditor(); await this.loadGroups(); } catch (err) { Toast.error('Errore salvataggio: ' + err.message); } finally { saveBtn.disabled = false; saveBtn.textContent = 'Salva Gruppo'; } }, async deleteGroup(id) { const ok = await App.confirm('Elimina Gruppo', 'Sei sicuro di voler eliminare questo gruppo di indirizzi?'); if (!ok) return; try { await App.api(`/api/email/address-groups/${id}`, { method: 'DELETE' }); Toast.success('Gruppo eliminato'); await this.loadGroups(); } catch (err) { Toast.error('Errore eliminazione: ' + err.message); } } }; window.MailManagementView = MailManagementView;