bmc_hub/static/js/contact-mail-import.js

60 lines
4.7 KiB
JavaScript
Raw Permalink Normal View History

(() => {
document.addEventListener('DOMContentLoaded', () => {
const zone = document.querySelector('.contact-mail-drop');
if (!zone) return;
const input = zone.querySelector('input'), status = zone.querySelector('[data-import-status]');
const form = document.getElementById('contactMailImportForm');
const kind = location.pathname.startsWith('/vendors/') ? 'vendors' : 'customers';
const ownerId = Number(location.pathname.split('/').filter(Boolean).pop());
const labels = {first_name:'Fornavn',last_name:'Efternavn',email:'E-mail',phone:'Telefon',mobile:'Mobil',title:'Titel',department:'Afdeling'};
let busy = false, createdId = null;
async function request(url, options) {
const response = await fetch(url, options), data = await response.json().catch(()=>({}));
if (!response.ok) throw new Error(data.detail || 'Kunne ikke gemme kontaktpersonen');
return data;
}
const post = (url, data) => request(url,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(data)});
async function analyze(file) {
if (busy || !file) return;
if (!/\.(msg|eml)$/i.test(file.name) || file.size > 10*1024*1024) { status.textContent='Vælg en .msg- eller .eml-mail på højst 10 MB.';return; }
busy=true;status.textContent='AI analyserer mailen…';zone.setAttribute('aria-busy','true');
try {
const payload=new FormData();payload.append('file',file);
const data=await request('/api/v1/contacts/analyze-email?use_ai=true',{method:'POST',body:payload});
createdId=null;
const host=form.querySelector('[data-import-fields]');host.replaceChildren();
Object.entries(labels).forEach(([key,label])=>{
const wrapper=document.createElement('div');wrapper.className='mb-2';
const caption=document.createElement('label');caption.className='form-label';caption.textContent=label;caption.htmlFor=`mailImport-${key}`;
const field=document.createElement('input');field.className='form-control';field.id=caption.htmlFor;field.name=key;field.type=key==='email'?'email':'text';field.required=key==='first_name';field.maxLength=250;field.value=data.contact?.[key]||'';
wrapper.append(caption,field);host.append(wrapper);
});
form.querySelector('[data-save-status]').textContent='';
status.textContent='AI-forslagene er klar til gennemgang.';
bootstrap.Modal.getOrCreateInstance(document.getElementById('contactMailImportModal')).show();
} catch(error){status.textContent=error.message;}
finally{busy=false;zone.removeAttribute('aria-busy');input.value='';}
}
zone.onclick=event=>{if(event.target!==input&&!busy) input.click();};
zone.onkeydown=event=>{if(event.key==='Enter'||event.key===' '){event.preventDefault();if(!busy)input.click();}};
input.onchange=()=>analyze(input.files[0]);
['dragenter','dragover'].forEach(type=>zone.addEventListener(type,event=>{event.preventDefault();event.stopPropagation();zone.classList.add('bg-light');}));
zone.ondragleave=()=>zone.classList.remove('bg-light');
zone.ondrop=event=>{event.preventDefault();event.stopPropagation();zone.classList.remove('bg-light');const file=event.dataTransfer?.files?.[0];if(file)analyze(file);else status.textContent='Gem mailen som .msg/.eml og træk filen hertil.';};
form.onsubmit=async event=>{
event.preventDefault();const button=form.querySelector('[type=submit]'), saveStatus=form.querySelector('[data-save-status]');button.disabled=true;
try {
if (!createdId) {
const data=Object.fromEntries([...new FormData(form)].map(([key,value])=>[key,String(value).trim()||null]));data.last_name=data.last_name||'';
if(kind==='customers')data.company_ids=[ownerId];
const contact=await post('/api/v1/contacts',data);createdId=Number(contact.id);
if(!createdId)throw new Error('Kontakten blev oprettet uden et kontakt-ID. Genindlæs før du prøver igen.');
form.querySelectorAll('input').forEach(field=>field.readOnly=true);
}
if(kind==='vendors')await post(`/api/v1/vendors/${ownerId}/contacts`,{contact_id:createdId,role:''});
location.hash=kind==='vendors'?'kontakter':'contacts';location.reload();
} catch(error){saveStatus.textContent=(createdId?'Kontakten er oprettet. Tryk igen for at tilknytte den. ':'')+error.message;button.disabled=false;}
};
});
})();