intsoft's picture
Publicar ferramenta Comenta de avaliação local v0.1
b7a7f96 verified
Raw History Blame Contribute Delete
4.34 kB
'use strict';
const $=id=>document.getElementById(id);
const cfg=window.COMENTA_CONFIG;
$('title').textContent=cfg.title;$('description').textContent=cfg.description;$('limitation').textContent=cfg.limitation;
let busy=false,lastResult=null;
function field(f){const box=document.createElement('div'),lab=document.createElement('label');lab.htmlFor=f.id;lab.textContent=f.label;box.append(lab);let el;
if(f.options){el=document.createElement('select');for(const value of f.options){const o=document.createElement('option');o.value=value;o.textContent=value;el.append(o);}}
else {el=document.createElement(f.type==='input'?'input':'textarea');if(f.json)el.dataset.json='true';if(f.password)el.type='password';if(!['signature','card_id'].includes(f.id))el.required=true;}
el.id=f.id;el.name=f.id;el.value=f.value??'';el.maxLength=30000;el.autocomplete='off';el.spellcheck=false;box.append(el);return box;
}
for(const f of cfg.fields)$('fields').append(field(f));
function values(){return cfg.fields.map(f=>$(f.id).value);}
function show(result){lastResult=result;$('output').textContent=JSON.stringify(result,null,2);$('resultstatus').textContent='Concluído nesta aba · nenhuma ação externa';if(cfg.fn==='moveCards')renderBoard(result.cards);}
async function calculate(){if(busy)return;busy=true;$('run').disabled=true;$('error').textContent='';try{show(await functions[cfg.fn](...values()));}catch(e){$('error').textContent=e.message;$('resultstatus').textContent='Confira os campos';lastResult=null;$('output').textContent='Nenhum resultado válido para esta entrada.';}finally{busy=false;$('run').disabled=false;}}
$('form').addEventListener('submit',e=>{e.preventDefault();calculate();});
$('reset').addEventListener('click',()=>{for(const f of cfg.fields)$(f.id).value=f.value??'';$('error').textContent='';$('output').textContent='Exemplo restaurado. Clique em executar para avaliar.';$('resultstatus').textContent='Aguardando execução';lastResult=null;if($('board'))$('board').replaceChildren();});
$('clear').addEventListener('click',()=>{for(const f of cfg.fields){if(!f.options)$(f.id).value='';}$('output').textContent='Dados removidos desta interface.';$('error').textContent='';lastResult=null;if($('board'))$('board').replaceChildren();});
$('download').addEventListener('click',()=>{if(!lastResult){$('error').textContent='Execute um teste válido antes de exportar.';return;}const blob=new Blob([JSON.stringify(lastResult,null,2)],{type:'application/json'});const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=cfg.slug+'-resultado.json';a.click();setTimeout(()=>URL.revokeObjectURL(a.href),1000);});
function renderBoard(cards){const root=$('board');if(!root)return;root.replaceChildren();const states=['Aguardando','Em atendimento','Resolvida'];
function update(id,status){$('cards').value=JSON.stringify(cards,null,2);$('card_id').value=id;$('status').value=status;calculate();}
for(const status of states){const col=document.createElement('section');col.className='column';const heading=document.createElement('h3');heading.textContent=status;col.append(heading);col.addEventListener('dragover',e=>e.preventDefault());col.addEventListener('drop',e=>{e.preventDefault();update(e.dataTransfer.getData('text/plain'),status);});
for(const c of cards.filter(c=>c.status===status)){const ticket=document.createElement('article');ticket.className='ticket';ticket.draggable=true;ticket.addEventListener('dragstart',e=>e.dataTransfer.setData('text/plain',c.id));const title=document.createElement('strong');title.textContent=c.titulo;ticket.append(title);const select=document.createElement('select');select.setAttribute('aria-label','Mover '+c.titulo);for(const s of states){const o=document.createElement('option');o.value=s;o.textContent=s;select.append(o);}select.value=status;select.addEventListener('change',()=>update(c.id,select.value));ticket.append(select);col.append(ticket);}root.append(col);}
}
if(cfg.fn==='internalChat'){
const b=document.createElement('button');b.type='button';b.className='secondary';b.textContent='Usar conversa resultante como histórico';b.addEventListener('click',()=>{if(lastResult?.conversa_local)$('history').value=JSON.stringify(lastResult.conversa_local,null,2);else $('error').textContent='Execute primeiro uma mensagem.';});$('extra').append(b);
}