Adiciona responsaveis de assembleia
This commit is contained in:
@@ -1 +1 @@
|
||||
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Assembleia</title><link rel="stylesheet" href="/css/app.css"><script src="/js/auth.js"></script><script src="/js/util.js"></script><script src="/js/api.js"></script><script src="/js/layout.js"></script></head><body><main><div class="topbar"><h1>Assembleia</h1></div><section class="panel"><div class="section-head"><h2>Todas as assembleias</h2><div class="section-actions"><button class="search-icon-btn" type="button" onclick="alternarBuscaAssembleias()" aria-label="Buscar assembleias" title="Buscar"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m16.5 16.5 4 4"></path></svg></button></div></div><div id="assembleia-search" class="search-strip hidden"><input id="assembleia-search-input" placeholder="Buscar por condominio, tipo, data, local ou status"></div><div class="table-wrap"><table><thead><tr><th>Condominio</th><th>Tipo</th><th>Data</th><th>Local</th><th>Status</th><th>Notificados</th><th></th></tr></thead><tbody id="rows"></tbody></table></div></section></main><script>Layout.mount('empresa','assembleias');</script><script src="/cliente/assembleias.js"></script></body></html>
|
||||
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Assembleia</title><link rel="stylesheet" href="/css/app.css"><script src="/js/auth.js"></script><script src="/js/util.js"></script><script src="/js/api.js"></script><script src="/js/layout.js"></script></head><body><main><div class="topbar"><h1>Assembleia</h1></div><section class="panel"><div class="section-head"><h2>Todas as assembleias</h2><div class="section-actions"><button class="search-icon-btn" type="button" onclick="alternarBuscaAssembleias()" aria-label="Buscar assembleias" title="Buscar"><svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="7"></circle><path d="m16.5 16.5 4 4"></path></svg></button></div></div><div id="assembleia-search" class="search-strip hidden"><input id="assembleia-search-input" placeholder="Buscar por condominio, tipo, data, local ou status"></div><div class="table-wrap"><table><thead><tr><th>Condominio</th><th>Tipo</th><th>Data</th><th>Local</th><th>Status</th><th>Notificados</th><th></th></tr></thead><tbody id="rows"></tbody></table></div></section><section class="panel"><div class="section-head"><h2>Responsáveis pela assembleia</h2><div class="section-actions"><button class="btn" type="button" onclick="abrirNovoResponsavel()">Novo</button></div></div><div class="table-wrap"><table><thead><tr><th>Nome</th><th>WhatsApp</th><th>E-mail</th><th>Dias disponíveis</th><th>Status</th><th>Ações</th></tr></thead><tbody id="responsaveis-rows"></tbody></table></div></section><div id="responsavel-modal" class="modal hidden"><div class="modal-backdrop" onclick="fecharResponsavelModal()"></div><section class="modal-panel"><div class="modal-head"><h2 id="responsavel-modal-title">Responsável</h2><button class="btn secondary" type="button" onclick="fecharResponsavelModal()">Fechar</button></div><div id="responsavel-modal-body"></div></section></div></main><script>Layout.mount('empresa','assembleias');</script><script src="/cliente/assembleias.js"></script></body></html>
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
const rows=document.querySelector('#rows');
|
||||
let assembleias=[];
|
||||
const rows=document.querySelector('#rows'),responsaveisRows=document.querySelector('#responsaveis-rows'),modal=document.querySelector('#responsavel-modal'),modalTitle=document.querySelector('#responsavel-modal-title'),modalBody=document.querySelector('#responsavel-modal-body');
|
||||
let assembleias=[],responsaveis=[];
|
||||
const diasNomes=['Domingo','Segunda','Terça','Quarta','Quinta','Sexta','Sábado'];
|
||||
|
||||
function esc(v){return String(v??'').replace(/[&<>'"]/g,c=>({'&':'&','<':'<','>':'>',"'":''','"':'"'}[c]))}
|
||||
function termo(){return document.querySelector('#assembleia-search-input')?.value.trim().toLowerCase()||''}
|
||||
function contem(q,...vals){return !q||vals.some(v=>String(v??'').toLowerCase().includes(q))}
|
||||
function destinatariosLabel(a){return (a.destinatarios||[]).map(x=>x.nome+' ('+x.tipo+')').join(', ')||'-'}
|
||||
function diasLabel(v){return String(v||'').split(',').filter(x=>x!=='').map(x=>diasNomes[Number(x)]||x).join(', ')||'-'}
|
||||
function formHtml(r={}){
|
||||
const dias=new Set(String(r.dias_semana||'').split(','));
|
||||
return `<form id="responsavel-form" class="grid cols"><input type="hidden" name="id" value="${r.id||''}"><div class="field"><label>Nome</label><input name="nome" required value="${esc(r.nome||'')}"></div><div class="field"><label>WhatsApp</label><input name="telefone" value="${esc(r.telefone||'')}"></div><div class="field"><label>E-mail</label><input name="email" type="email" value="${esc(r.email||'')}"></div><div class="field"><label>Status</label><select name="status"><option value="ativo" ${r.status==='ativo'||!r.status?'selected':''}>Ativo</option><option value="inativo" ${r.status==='inativo'?'selected':''}>Inativo</option></select></div><div class="field"><label>Dias da semana</label><div class="row compact">${diasNomes.map((d,i)=>`<label><input type="checkbox" name="dias" value="${i}" ${dias.has(String(i))?'checked':''}> ${d}</label>`).join('')}</div></div><div class="row"><button class="btn">${r.id?'Salvar':'Cadastrar'}</button><button class="btn secondary" type="button" onclick="fecharResponsavelModal()">Cancelar</button></div></form>`;
|
||||
}
|
||||
|
||||
function renderAssembleias(){
|
||||
const q=termo();
|
||||
@@ -19,12 +25,46 @@ async function load(){
|
||||
renderAssembleias();
|
||||
}catch(e){Util.toast(e.message,true)}
|
||||
}
|
||||
async function loadResponsaveis(){
|
||||
try{
|
||||
const d=await Api.get('/api/assembleia-responsaveis');
|
||||
responsaveis=d.responsaveis||[];
|
||||
renderResponsaveis();
|
||||
}catch(e){Util.toast(e.message,true)}
|
||||
}
|
||||
function renderResponsaveis(){
|
||||
const admin=Auth.isAdminEmpresa();
|
||||
responsaveisRows.innerHTML=responsaveis.map(r=>`<tr><td><strong>${esc(r.nome)}</strong></td><td>${esc(r.telefone||'')}</td><td>${esc(r.email||'')}</td><td>${esc(diasLabel(r.dias_semana))}</td><td>${Util.badge(r.status)}</td><td>${admin?`<button class="btn secondary" onclick="editarResponsavel(${r.id})">Editar</button> <button class="btn danger" onclick="excluirResponsavel(${r.id})">Excluir</button>`:'-'}</td></tr>`).join('')||'<tr><td colspan="6">Nenhum responsável cadastrado.</td></tr>';
|
||||
}
|
||||
function abrirResponsavel(r){
|
||||
modalTitle.textContent=r?.id?'Editar responsável':'Novo responsável';
|
||||
modalBody.innerHTML=formHtml(r||{});
|
||||
modal.classList.remove('hidden');
|
||||
document.querySelector('#responsavel-form').onsubmit=async e=>{
|
||||
e.preventDefault();
|
||||
const f=e.target,b=Util.formData(f);
|
||||
b.dias_semana=[...f.querySelectorAll('input[name=dias]:checked')].map(x=>x.value);
|
||||
if(!b.dias_semana.length){Util.toast('Selecione ao menos um dia da semana.',true);return;}
|
||||
try{
|
||||
if(b.id)await Api.put('/api/assembleia-responsaveis/'+b.id,b);else await Api.post('/api/assembleia-responsaveis',b);
|
||||
Util.toast(b.id?'Responsável atualizado':'Responsável cadastrado');
|
||||
fecharResponsavelModal();
|
||||
await loadResponsaveis();
|
||||
await load();
|
||||
}catch(err){Util.toast(err.message,true)}
|
||||
};
|
||||
}
|
||||
|
||||
window.alternarBuscaAssembleias=()=>{
|
||||
const strip=document.querySelector('#assembleia-search'),input=document.querySelector('#assembleia-search-input');
|
||||
strip.classList.toggle('hidden');
|
||||
if(!strip.classList.contains('hidden'))input.focus();
|
||||
};
|
||||
window.abrirNovoResponsavel=()=>abrirResponsavel({});
|
||||
window.editarResponsavel=id=>{const r=responsaveis.find(x=>Number(x.id)===Number(id));if(r)abrirResponsavel(r)};
|
||||
window.fecharResponsavelModal=()=>{modal.classList.add('hidden');modalBody.innerHTML=''};
|
||||
window.excluirResponsavel=async id=>{if(!confirm('Excluir este responsável de assembleia?'))return;try{await Api.request('/api/assembleia-responsaveis/'+id,{method:'DELETE'});Util.toast('Responsável excluído');await loadResponsaveis();await load()}catch(e){Util.toast(e.message,true)}};
|
||||
|
||||
document.querySelector('#assembleia-search-input')?.addEventListener('input',renderAssembleias);
|
||||
load();
|
||||
if(!Auth.isAdminEmpresa())document.querySelector('[onclick="abrirNovoResponsavel()"]')?.classList.add('hidden');
|
||||
(async()=>{await loadResponsaveis();await load()})();
|
||||
|
||||
Reference in New Issue
Block a user