Otimize cadastros com modais
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>Cadastro</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>Cadastro</h1></div><section class="panel"><h2>Novo condominio</h2><form id="cond-form" class="row"><div class="field"><label>Nome</label><input name="nome" required></div><div class="field"><label>CNPJ</label><input name="cnpj" required></div><div class="field"><label>Endereco</label><input name="endereco"></div><button class="btn">Criar</button></form><div class="panel-block"><h2>Condominios</h2><div class="table-wrap"><table><thead><tr><th>ID</th><th>Nome</th><th>CNPJ</th><th>Endereco</th><th></th></tr></thead><tbody id="rows"></tbody></table></div></div></section><section id="funcionarios-panel" class="panel hidden"><h2>Funcionarios</h2><form id="func-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required></div><div class="field"><label>E-mail de login</label><input name="email" type="email" required></div><div class="field"><label>WhatsApp</label><input name="telefone"></div><div class="field"><label>Senha inicial</label><input name="senha" type="password" required></div><button class="btn">Cadastrar funcionario</button></form><div class="table-wrap"><table><thead><tr><th>Nome</th><th>E-mail</th><th>Telefone</th><th>Cargo</th><th>Status</th><th>Condominios</th><th>Opcoes</th></tr></thead><tbody id="func-rows"></tbody></table></div></section><section id="extras-panel" class="panel hidden"><h2>Extra</h2><form id="extra-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required></div><div class="field"><label>E-mail</label><input name="email" type="email"></div><div class="field"><label>WhatsApp</label><input name="telefone"></div><button class="btn">Cadastrar extra</button></form><div class="table-wrap"><table><thead><tr><th>Nome</th><th>E-mail</th><th>WhatsApp</th><th>Status</th><th>Opcoes</th></tr></thead><tbody id="extra-rows"></tbody></table></div></section><div id="cond-modal" class="modal hidden"><div class="modal-backdrop" onclick="fecharModalCondominios()"></div><section class="modal-panel"><div class="modal-head"><h2 id="cond-modal-title">Condominios</h2><button class="btn secondary" type="button" onclick="fecharModalCondominios()">Fechar</button></div><div id="cond-modal-body"></div></section></div></main><script>Layout.mount('empresa','condominios');</script><script src="/cliente/condominios.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>Cadastro</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>Cadastro</h1></div><section class="panel"><div class="section-head"><h2>Condominios</h2><div class="section-actions"><button class="btn secondary" type="button" onclick="alternarBuscaCadastro('cond')">Lupa</button><button class="btn" type="button" onclick="abrirNovoCondominio()">Novo</button></div></div><div id="cond-search" class="search-strip hidden"><input id="cond-search-input" placeholder="Buscar por nome, CNPJ ou endereco"></div><div class="table-wrap"><table><thead><tr><th>ID</th><th>Nome</th><th>CNPJ</th><th>Endereco</th><th></th></tr></thead><tbody id="rows"></tbody></table></div></section><section id="funcionarios-panel" class="panel hidden"><div class="section-head"><h2>Funcionarios</h2><div class="section-actions"><button class="btn secondary" type="button" onclick="alternarBuscaCadastro('func')">Lupa</button><button class="btn" type="button" onclick="abrirNovoFuncionario()">Novo</button></div></div><div id="func-search" class="search-strip hidden"><input id="func-search-input" placeholder="Buscar por nome, e-mail, telefone ou cargo"></div><div class="table-wrap"><table><thead><tr><th>Nome</th><th>E-mail</th><th>Telefone</th><th>Cargo</th><th>Status</th><th>Condominios</th><th>Opcoes</th></tr></thead><tbody id="func-rows"></tbody></table></div></section><section id="extras-panel" class="panel hidden"><div class="section-head"><h2>Extra</h2><div class="section-actions"><button class="btn secondary" type="button" onclick="alternarBuscaCadastro('extra')">Lupa</button><button class="btn" type="button" onclick="abrirNovoExtra()">Novo</button></div></div><div id="extra-search" class="search-strip hidden"><input id="extra-search-input" placeholder="Buscar por nome, e-mail ou WhatsApp"></div><div class="table-wrap"><table><thead><tr><th>Nome</th><th>E-mail</th><th>WhatsApp</th><th>Status</th><th>Opcoes</th></tr></thead><tbody id="extra-rows"></tbody></table></div></section><div id="cond-modal" class="modal hidden"><div class="modal-backdrop" onclick="fecharModalCondominios()"></div><section class="modal-panel"><div class="modal-head"><h2 id="cond-modal-title">Condominios</h2><button class="btn secondary" type="button" onclick="fecharModalCondominios()">Fechar</button></div><div id="cond-modal-body"></div></section></div></main><script>Layout.mount('empresa','condominios');</script><script src="/cliente/condominios.js"></script></body></html>
|
||||
|
||||
@@ -1,29 +1,147 @@
|
||||
const form=document.querySelector('#cond-form'),rows=document.querySelector('#rows');
|
||||
let condominios=[],funcionarios=[],extras=[],funcLinks=new Map(),funcAtual=null,funcEditId=null;
|
||||
async function load(){try{const d=await Api.get('/api/condominios');condominios=d.condominios||[];rows.innerHTML=condominios.map(c=>`<tr><td>${c.id}</td><td>${c.nome}</td><td>${c.cnpj||''}</td><td>${c.endereco||''}</td><td><a class="btn secondary" href="/cliente/condominio-detalhe.html?id=${c.id}">Abrir</a></td></tr>`).join('')}catch(e){Util.toast(e.message,true)}}
|
||||
form.onsubmit=async e=>{e.preventDefault();try{await Api.post('/api/condominios',Util.formData(form));form.reset();Util.toast('Condominio criado');await load();await loadFuncionarios()}catch(err){Util.toast(err.message,true)}};
|
||||
load();
|
||||
const rows=document.querySelector('#rows'),funcPanel=document.querySelector('#funcionarios-panel'),funcRows=document.querySelector('#func-rows'),extraPanel=document.querySelector('#extras-panel'),extraRows=document.querySelector('#extra-rows'),modal=document.querySelector('#cond-modal'),modalTitle=document.querySelector('#cond-modal-title'),modalBody=document.querySelector('#cond-modal-body');
|
||||
let condominios=[],funcionarios=[],extras=[],funcLinks=new Map(),funcAtual=null;
|
||||
|
||||
const funcPanel=document.querySelector('#funcionarios-panel'),funcForm=document.querySelector('#func-form'),funcRows=document.querySelector('#func-rows'),extraPanel=document.querySelector('#extras-panel'),extraForm=document.querySelector('#extra-form'),extraRows=document.querySelector('#extra-rows'),modal=document.querySelector('#cond-modal'),modalTitle=document.querySelector('#cond-modal-title'),modalBody=document.querySelector('#cond-modal-body');
|
||||
function esc(v){return String(v??'').replace(/[&<>'"]/g,c=>({'&':'&','<':'<','>':'>',"'":''','"':'"'}[c]))}
|
||||
async function linksPorFuncionario(){const mapa=new Map();await Promise.all(condominios.map(async c=>{try{const d=await Api.get(`/api/condominios/${c.id}/funcionarios-vinculados`);(d.funcionarios||[]).forEach(f=>{const fid=Number(f.funcionario_id||f.id);if(!mapa.has(fid))mapa.set(fid,[]);mapa.get(fid).push({id:Number(c.id),nome:c.nome});});}catch(e){}}));return mapa;}
|
||||
function termo(id){return document.querySelector(id)?.value.trim().toLowerCase()||''}
|
||||
function contem(item,q,campos){return !q||campos.some(c=>String(item[c]??'').toLowerCase().includes(q))}
|
||||
function abrirModal(titulo,html){modalTitle.textContent=titulo;modalBody.innerHTML=html;modal.classList.remove('hidden')}
|
||||
function formActions(label){return '<div class="row"><button class="btn">'+label+'</button><button class="btn secondary" type="button" onclick="fecharModalCondominios()">Cancelar</button></div>'}
|
||||
|
||||
function renderCondominios(){
|
||||
const q=termo('#cond-search-input');
|
||||
const lista=condominios.filter(c=>contem(c,q,['id','nome','cnpj','endereco']));
|
||||
rows.innerHTML=lista.map(c=>`<tr><td>${c.id}</td><td>${esc(c.nome)}</td><td>${esc(c.cnpj||'')}</td><td>${esc(c.endereco||'')}</td><td><a class="btn secondary" href="/cliente/condominio-detalhe.html?id=${c.id}">Abrir</a></td></tr>`).join('')||'<tr><td colspan="5">Nenhum condominio encontrado.</td></tr>';
|
||||
}
|
||||
|
||||
async function load(){
|
||||
try{
|
||||
const d=await Api.get('/api/condominios');
|
||||
condominios=d.condominios||[];
|
||||
renderCondominios();
|
||||
}catch(e){Util.toast(e.message,true)}
|
||||
}
|
||||
|
||||
window.abrirNovoCondominio=()=>{
|
||||
abrirModal('Novo condominio','<form id="cond-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required></div><div class="field"><label>CNPJ</label><input name="cnpj" required></div><div class="field"><label>Endereco</label><input name="endereco"></div>'+formActions('Criar')+'</form>');
|
||||
document.querySelector('#cond-form').onsubmit=async e=>{
|
||||
e.preventDefault();
|
||||
try{
|
||||
await Api.post('/api/condominios',Util.formData(e.target));
|
||||
Util.toast('Condominio criado');
|
||||
fecharModalCondominios();
|
||||
await load();
|
||||
await loadFuncionarios();
|
||||
}catch(err){Util.toast(err.message,true)}
|
||||
};
|
||||
};
|
||||
|
||||
async function linksPorFuncionario(){
|
||||
const mapa=new Map();
|
||||
await Promise.all(condominios.map(async c=>{
|
||||
try{
|
||||
const d=await Api.get(`/api/condominios/${c.id}/funcionarios-vinculados`);
|
||||
(d.funcionarios||[]).forEach(f=>{
|
||||
const fid=Number(f.funcionario_id||f.id);
|
||||
if(!mapa.has(fid))mapa.set(fid,[]);
|
||||
mapa.get(fid).push({id:Number(c.id),nome:c.nome});
|
||||
});
|
||||
}catch(e){}
|
||||
}));
|
||||
return mapa;
|
||||
}
|
||||
|
||||
async function refreshLinks(){funcLinks=await linksPorFuncionario()}
|
||||
async function loadFuncionarios(){if(!Auth.isAdminEmpresa())return;funcPanel.classList.remove('hidden');try{if(!condominios.length)await load();const d=await Api.get('/api/funcionarios');funcionarios=d.funcionarios||[];await refreshLinks();funcRows.innerHTML=funcionarios.map(f=>{const acao=f.cargo==='admin_empresa'?'<span class="muted">Acesso total</span>':'<button class="btn secondary" type="button" onclick="abrirModalCondominios('+f.id+')">Condominios</button>';const opcoes=f.cargo==='admin_empresa'?'<span class="muted">-</span>':'<button class="btn secondary" type="button" onclick="abrirEditarFuncionario('+f.id+')">Editar</button> <button class="btn danger" type="button" onclick="abrirExcluirFuncionario('+f.id+')">Excluir</button>';return '<tr><td>'+esc(f.nome)+'</td><td>'+esc(f.email)+'</td><td>'+esc(f.telefone||'')+'</td><td>'+esc(f.cargo||'')+'</td><td>'+Util.badge(f.status)+'</td><td>'+acao+'</td><td>'+opcoes+'</td></tr>'}).join('')||'<tr><td colspan="7">Nenhum funcionario cadastrado.</td></tr>'}catch(e){Util.toast(e.message,true)}}
|
||||
if(funcForm){funcForm.onsubmit=async e=>{e.preventDefault();try{await Api.post('/api/funcionarios',Util.formData(funcForm));funcForm.reset();Util.toast('Funcionario cadastrado');loadFuncionarios()}catch(err){Util.toast(err.message,true)}}}
|
||||
|
||||
function renderFuncionarios(){
|
||||
const q=termo('#func-search-input');
|
||||
const lista=funcionarios.filter(f=>contem(f,q,['nome','email','telefone','cargo','status']));
|
||||
funcRows.innerHTML=lista.map(f=>{
|
||||
const acao=f.cargo==='admin_empresa'?'<span class="muted">Acesso total</span>':'<button class="btn secondary" type="button" onclick="abrirModalCondominios('+f.id+')">Condominios</button>';
|
||||
const opcoes=f.cargo==='admin_empresa'?'<span class="muted">-</span>':'<button class="btn secondary" type="button" onclick="abrirEditarFuncionario('+f.id+')">Editar</button> <button class="btn danger" type="button" onclick="abrirExcluirFuncionario('+f.id+')">Excluir</button>';
|
||||
return '<tr><td>'+esc(f.nome)+'</td><td>'+esc(f.email)+'</td><td>'+esc(f.telefone||'')+'</td><td>'+esc(f.cargo||'')+'</td><td>'+Util.badge(f.status)+'</td><td>'+acao+'</td><td>'+opcoes+'</td></tr>';
|
||||
}).join('')||'<tr><td colspan="7">Nenhum funcionario encontrado.</td></tr>';
|
||||
}
|
||||
|
||||
async function loadFuncionarios(){
|
||||
if(!Auth.isAdminEmpresa())return;
|
||||
funcPanel.classList.remove('hidden');
|
||||
try{
|
||||
if(!condominios.length)await load();
|
||||
const d=await Api.get('/api/funcionarios');
|
||||
funcionarios=d.funcionarios||[];
|
||||
await refreshLinks();
|
||||
renderFuncionarios();
|
||||
}catch(e){Util.toast(e.message,true)}
|
||||
}
|
||||
|
||||
window.abrirNovoFuncionario=()=>{
|
||||
abrirModal('Novo funcionario','<form id="func-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required></div><div class="field"><label>E-mail de login</label><input name="email" type="email" required></div><div class="field"><label>WhatsApp</label><input name="telefone"></div><div class="field"><label>Senha inicial</label><input name="senha" type="password" required></div>'+formActions('Cadastrar funcionario')+'</form>');
|
||||
document.querySelector('#func-form').onsubmit=async e=>{
|
||||
e.preventDefault();
|
||||
try{
|
||||
await Api.post('/api/funcionarios',Util.formData(e.target));
|
||||
Util.toast('Funcionario cadastrado');
|
||||
fecharModalCondominios();
|
||||
loadFuncionarios();
|
||||
}catch(err){Util.toast(err.message,true)}
|
||||
};
|
||||
};
|
||||
|
||||
function funcionarioPorId(funcId){return funcionarios.find(x=>Number(x.id)===Number(funcId))}
|
||||
window.abrirEditarFuncionario=funcId=>{const f=funcionarioPorId(funcId);if(!f)return;modalTitle.textContent='Editar funcionario';modalBody.innerHTML='<form id="func-edit-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required value="'+esc(f.nome||'')+'"></div><div class="field"><label>E-mail de login</label><input name="email" type="email" required value="'+esc(f.email||'')+'"></div><div class="field"><label>WhatsApp</label><input name="telefone" value="'+esc(f.telefone||'')+'"></div><div class="field"><label>Status</label><select name="status"><option value="ativo" '+(f.status==='ativo'?'selected':'')+'>Ativo</option><option value="inativo" '+(f.status==='inativo'?'selected':'')+'>Inativo</option></select></div><div class="field"><label>Nova senha</label><input name="senha" type="password"></div><div class="row"><button class="btn">Salvar</button><button class="btn secondary" type="button" onclick="fecharModalCondominios()">Cancelar</button></div></form>';modal.classList.remove('hidden');document.querySelector('#func-edit-form').onsubmit=async e=>{e.preventDefault();try{await Api.put('/api/funcionarios/'+funcId,Util.formData(e.target));Util.toast('Funcionario atualizado');fecharModalCondominios();loadFuncionarios()}catch(err){Util.toast(err.message,true)}}};
|
||||
window.abrirExcluirFuncionario=funcId=>{const f=funcionarioPorId(funcId);if(!f)return;modalTitle.textContent='Excluir funcionario';modalBody.innerHTML='<p>Deseja realmente excluir o acesso de <strong>'+esc(f.nome||'')+'</strong>?</p><p class="muted">O funcionario sera inativado e perdera acesso ao sistema.</p><div class="row"><button class="btn danger" type="button" onclick="confirmarExcluirFuncionario('+funcId+')">Excluir</button><button class="btn secondary" type="button" onclick="fecharModalCondominios()">Cancelar</button></div>';modal.classList.remove('hidden')};
|
||||
window.abrirEditarFuncionario=funcId=>{const f=funcionarioPorId(funcId);if(!f)return;abrirModal('Editar funcionario','<form id="func-edit-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required value="'+esc(f.nome||'')+'"></div><div class="field"><label>E-mail de login</label><input name="email" type="email" required value="'+esc(f.email||'')+'"></div><div class="field"><label>WhatsApp</label><input name="telefone" value="'+esc(f.telefone||'')+'"></div><div class="field"><label>Status</label><select name="status"><option value="ativo" '+(f.status==='ativo'?'selected':'')+'>Ativo</option><option value="inativo" '+(f.status==='inativo'?'selected':'')+'>Inativo</option></select></div><div class="field"><label>Nova senha</label><input name="senha" type="password"></div>'+formActions('Salvar')+'</form>');document.querySelector('#func-edit-form').onsubmit=async e=>{e.preventDefault();try{await Api.put('/api/funcionarios/'+funcId,Util.formData(e.target));Util.toast('Funcionario atualizado');fecharModalCondominios();loadFuncionarios()}catch(err){Util.toast(err.message,true)}}};
|
||||
window.abrirExcluirFuncionario=funcId=>{const f=funcionarioPorId(funcId);if(!f)return;abrirModal('Excluir funcionario','<p>Deseja realmente excluir o acesso de <strong>'+esc(f.nome||'')+'</strong>?</p><p class="muted">O funcionario sera inativado e perdera acesso ao sistema.</p><div class="row"><button class="btn danger" type="button" onclick="confirmarExcluirFuncionario('+funcId+')">Excluir</button><button class="btn secondary" type="button" onclick="fecharModalCondominios()">Cancelar</button></div>')};
|
||||
window.confirmarExcluirFuncionario=async funcId=>{try{await Api.request('/api/funcionarios/'+funcId,{method:'DELETE'});Util.toast('Funcionario inativado');fecharModalCondominios();loadFuncionarios()}catch(err){Util.toast(err.message,true)}};
|
||||
|
||||
function renderModalCondominios(){const f=funcionarios.find(x=>Number(x.id)===Number(funcAtual));if(!f)return;const vinculados=funcLinks.get(Number(funcAtual))||[];const vinculadosIds=new Set(vinculados.map(c=>Number(c.id)));const disponiveis=condominios.filter(c=>!vinculadosIds.has(Number(c.id)));modalTitle.textContent=`Condominios de ${f.nome}`;const listaVinculados=vinculados.map(c=>`<div class="cond-item"><span>${esc(c.nome)}</span><button class="btn danger" type="button" onclick="desvincularFuncionarioCondominio(${funcAtual},${c.id})">Desvincular</button></div>`).join('')||'<p class="muted">Nenhum condominio vinculado.</p>';const listaDisponiveis=disponiveis.map(c=>`<div class="cond-item"><span>${esc(c.nome)}</span><button class="btn secondary" type="button" onclick="vincularFuncionarioCondominio(${funcAtual},${c.id})">Vincular</button></div>`).join('')||'<p class="muted">Todos os condominios ja estao vinculados.</p>';modalBody.innerHTML=`<div class="modal-grid"><section><h3>Vinculados</h3>${listaVinculados}</section><section><h3>Nao vinculados</h3>${listaDisponiveis}</section></div>`}
|
||||
window.abrirModalCondominios=async funcId=>{funcAtual=Number(funcId);try{await refreshLinks();renderModalCondominios();modal.classList.remove('hidden')}catch(err){Util.toast(err.message,true)}};
|
||||
window.fecharModalCondominios=()=>{modal.classList.add('hidden');funcAtual=null};
|
||||
window.fecharModalCondominios=()=>{modal.classList.add('hidden');funcAtual=null;modalBody.innerHTML=''};
|
||||
window.vincularFuncionarioCondominio=async (funcId,condId)=>{try{await Api.post(`/api/condominios/${condId}/funcionarios-vinculados`,{funcionario_id:funcId});Util.toast('Funcionario vinculado');await refreshLinks();renderModalCondominios()}catch(err){Util.toast(err.message,true)}};
|
||||
window.desvincularFuncionarioCondominio=async (funcId,condId)=>{try{await Api.request(`/api/condominios/${condId}/funcionarios-vinculados/${funcId}`,{method:'DELETE'});Util.toast('Funcionario desvinculado');await refreshLinks();renderModalCondominios()}catch(err){Util.toast(err.message,true)}};
|
||||
loadFuncionarios();
|
||||
|
||||
async function loadExtras(){if(!Auth.isAdminEmpresa())return;extraPanel.classList.remove('hidden');try{const d=await Api.get('/api/extras');extras=d.extras||[];extraRows.innerHTML=extras.map(x=>'<tr><td>'+esc(x.nome)+'</td><td>'+esc(x.email||'')+'</td><td>'+esc(x.telefone||'')+'</td><td>'+Util.badge(x.status)+'</td><td><button class="btn secondary" type="button" onclick="abrirEditarExtra('+x.id+')">Editar</button> <button class="btn danger" type="button" onclick="excluirExtra('+x.id+')">Excluir</button></td></tr>').join('')||'<tr><td colspan="5">Nenhum destinatario extra cadastrado.</td></tr>'}catch(e){Util.toast(e.message,true)}}
|
||||
if(extraForm){extraForm.onsubmit=async e=>{e.preventDefault();try{await Api.post('/api/extras',Util.formData(extraForm));extraForm.reset();Util.toast('Extra cadastrado');loadExtras()}catch(err){Util.toast(err.message,true)}}}
|
||||
function renderExtras(){
|
||||
const q=termo('#extra-search-input');
|
||||
const lista=extras.filter(x=>contem(x,q,['nome','email','telefone','status']));
|
||||
extraRows.innerHTML=lista.map(x=>'<tr><td>'+esc(x.nome)+'</td><td>'+esc(x.email||'')+'</td><td>'+esc(x.telefone||'')+'</td><td>'+Util.badge(x.status)+'</td><td><button class="btn secondary" type="button" onclick="abrirEditarExtra('+x.id+')">Editar</button> <button class="btn danger" type="button" onclick="excluirExtra('+x.id+')">Excluir</button></td></tr>').join('')||'<tr><td colspan="5">Nenhum destinatario extra encontrado.</td></tr>';
|
||||
}
|
||||
|
||||
async function loadExtras(){
|
||||
if(!Auth.isAdminEmpresa())return;
|
||||
extraPanel.classList.remove('hidden');
|
||||
try{
|
||||
const d=await Api.get('/api/extras');
|
||||
extras=d.extras||[];
|
||||
renderExtras();
|
||||
}catch(e){Util.toast(e.message,true)}
|
||||
}
|
||||
|
||||
window.abrirNovoExtra=()=>{
|
||||
abrirModal('Novo extra','<form id="extra-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required></div><div class="field"><label>E-mail</label><input name="email" type="email"></div><div class="field"><label>WhatsApp</label><input name="telefone"></div>'+formActions('Cadastrar extra')+'</form>');
|
||||
document.querySelector('#extra-form').onsubmit=async e=>{
|
||||
e.preventDefault();
|
||||
try{
|
||||
await Api.post('/api/extras',Util.formData(e.target));
|
||||
Util.toast('Extra cadastrado');
|
||||
fecharModalCondominios();
|
||||
loadExtras();
|
||||
}catch(err){Util.toast(err.message,true)}
|
||||
};
|
||||
};
|
||||
|
||||
function extraPorId(id){return extras.find(x=>Number(x.id)===Number(id))}
|
||||
window.abrirEditarExtra=id=>{const x=extraPorId(id);if(!x)return;modalTitle.textContent='Editar extra';modalBody.innerHTML='<form id="extra-edit-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required value="'+esc(x.nome||'')+'"></div><div class="field"><label>E-mail</label><input name="email" type="email" value="'+esc(x.email||'')+'"></div><div class="field"><label>WhatsApp</label><input name="telefone" value="'+esc(x.telefone||'')+'"></div><div class="field"><label>Status</label><select name="status"><option value="ativo" '+(x.status==='ativo'?'selected':'')+'>Ativo</option><option value="inativo" '+(x.status==='inativo'?'selected':'')+'>Inativo</option></select></div><div class="row"><button class="btn">Salvar</button><button class="btn secondary" type="button" onclick="fecharModalCondominios()">Cancelar</button></div></form>';modal.classList.remove('hidden');document.querySelector('#extra-edit-form').onsubmit=async e=>{e.preventDefault();try{await Api.put('/api/extras/'+id,Util.formData(e.target));Util.toast('Extra atualizado');fecharModalCondominios();loadExtras()}catch(err){Util.toast(err.message,true)}}};
|
||||
window.abrirEditarExtra=id=>{const x=extraPorId(id);if(!x)return;abrirModal('Editar extra','<form id="extra-edit-form" class="grid cols"><div class="field"><label>Nome</label><input name="nome" required value="'+esc(x.nome||'')+'"></div><div class="field"><label>E-mail</label><input name="email" type="email" value="'+esc(x.email||'')+'"></div><div class="field"><label>WhatsApp</label><input name="telefone" value="'+esc(x.telefone||'')+'"></div><div class="field"><label>Status</label><select name="status"><option value="ativo" '+(x.status==='ativo'?'selected':'')+'>Ativo</option><option value="inativo" '+(x.status==='inativo'?'selected':'')+'>Inativo</option></select></div>'+formActions('Salvar')+'</form>');document.querySelector('#extra-edit-form').onsubmit=async e=>{e.preventDefault();try{await Api.put('/api/extras/'+id,Util.formData(e.target));Util.toast('Extra atualizado');fecharModalCondominios();loadExtras()}catch(err){Util.toast(err.message,true)}}};
|
||||
window.excluirExtra=async id=>{try{await Api.request('/api/extras/'+id,{method:'DELETE'});Util.toast('Extra excluido');loadExtras()}catch(err){Util.toast(err.message,true)}};
|
||||
|
||||
window.alternarBuscaCadastro=tipo=>{
|
||||
const strip=document.querySelector(`#${tipo}-search`),input=document.querySelector(`#${tipo}-search-input`);
|
||||
if(!strip||!input)return;
|
||||
strip.classList.toggle('hidden');
|
||||
if(!strip.classList.contains('hidden'))input.focus();
|
||||
};
|
||||
|
||||
document.querySelector('#cond-search-input')?.addEventListener('input',renderCondominios);
|
||||
document.querySelector('#func-search-input')?.addEventListener('input',renderFuncionarios);
|
||||
document.querySelector('#extra-search-input')?.addEventListener('input',renderExtras);
|
||||
|
||||
load();
|
||||
loadFuncionarios();
|
||||
loadExtras();
|
||||
|
||||
@@ -380,6 +380,23 @@ h2 {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.section-actions {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.section-actions .btn {
|
||||
min-width: 92px;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.search-strip {
|
||||
margin: 0 0 12px;
|
||||
}
|
||||
|
||||
.panel-block {
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user