Adiciona backup geral no painel master
This commit is contained in:
@@ -1 +1 @@
|
||||
window.Layout={mount(scope,active){Auth.require(scope);const label=localStorage.getItem('auth_label')||(scope==='master'?'Master':'Escritorio');const master=[['Clientes','/master/clientes.html','clientes'],['Planos','/master/planos.html','planos'],['Financeiro','/master/financeiro.html','financeiro'],['Configuracoes','/master/configuracoes.html','configuracoes']];let cliente=[['Cadastro','/cliente/condominios.html','condominios'],['Lembrete','/cliente/lembretes.html','lembretes'],['Financeiro','/cliente/financeiro.html','financeiro'],['WhatsApp','/cliente/configuracoes.html','configuracoes']];if(scope==='empresa'&&!Auth.isAdminEmpresa())cliente=cliente.filter(x=>x[2]!=='configuracoes');const menu=(scope==='master'?master:cliente).map(([n,h,k])=>`<a class="${k===active?'active':''}" href="${h}">${n}</a>`).join('');document.body.insertAdjacentHTML('afterbegin',`<aside class="sidebar"><div><div class="brand">SeConectai</div><div class="user">${label}</div></div><nav class="menu">${menu}</nav><button class="btn" onclick="Auth.logout()">Sair</button></aside>`);document.body.classList.add('app');document.querySelector('main')?.classList.add('content')}};
|
||||
window.Layout={mount(scope,active){Auth.require(scope);const label=localStorage.getItem('auth_label')||(scope==='master'?'Master':'Escritorio');const master=[['Clientes','/master/clientes.html','clientes'],['Planos','/master/planos.html','planos'],['Financeiro','/master/financeiro.html','financeiro'],['Configuracoes','/master/configuracoes.html','configuracoes'],['Backup','/master/backup.html','backup']];let cliente=[['Cadastro','/cliente/condominios.html','condominios'],['Lembrete','/cliente/lembretes.html','lembretes'],['Financeiro','/cliente/financeiro.html','financeiro'],['WhatsApp','/cliente/configuracoes.html','configuracoes']];if(scope==='empresa'&&!Auth.isAdminEmpresa())cliente=cliente.filter(x=>x[2]!=='configuracoes');const menu=(scope==='master'?master:cliente).map(([n,h,k])=>`<a class="${k===active?'active':''}" href="${h}">${n}</a>`).join('');document.body.insertAdjacentHTML('afterbegin',`<aside class="sidebar"><div><div class="brand">SeConectai</div><div class="user">${label}</div></div><nav class="menu">${menu}</nav><button class="btn" onclick="Auth.logout()">Sair</button></aside>`);document.body.classList.add('app');document.querySelector('main')?.classList.add('content')}};
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<!doctype html><html lang="pt-BR"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Backup</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>Backup</h1></div><section class="panel"><h2>Backup geral</h2><p class="muted">Baixe um arquivo ZIP com o banco Master e os bancos de todos os clientes cadastrados.</p><button id="backup-btn" class="btn" type="button">Gerar e baixar backup</button><div id="backup-status" class="panel-block muted"></div></section></main><script>Layout.mount('master','backup');</script><script src="/master/backup.js"></script></body></html>
|
||||
@@ -0,0 +1,36 @@
|
||||
const btn=document.querySelector('#backup-btn'),statusEl=document.querySelector('#backup-status');
|
||||
btn.onclick=async()=>{
|
||||
if(!confirm('Gerar backup geral do sistema e de todos os clientes?'))return;
|
||||
btn.disabled=true;
|
||||
statusEl.textContent='Gerando backup...';
|
||||
try{
|
||||
const headers={};
|
||||
const token=Auth.token();
|
||||
if(token)headers.Authorization=`Bearer ${token}`;
|
||||
const res=await fetch('/api/master/backup',{headers});
|
||||
if(res.status===401){Auth.logout();return}
|
||||
if(!res.ok){
|
||||
const data=await res.json().catch(()=>({}));
|
||||
throw new Error(data.mensagem||data.erro||`Erro HTTP ${res.status}`);
|
||||
}
|
||||
const blob=await res.blob();
|
||||
const cd=res.headers.get('Content-Disposition')||'';
|
||||
const match=cd.match(/filename="?([^"]+)"?/);
|
||||
const filename=match?match[1]:'seconectai-backup.zip';
|
||||
const url=URL.createObjectURL(blob);
|
||||
const a=document.createElement('a');
|
||||
a.href=url;
|
||||
a.download=filename;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
a.remove();
|
||||
URL.revokeObjectURL(url);
|
||||
statusEl.textContent='Backup baixado com sucesso.';
|
||||
Util.toast('Backup baixado');
|
||||
}catch(e){
|
||||
statusEl.textContent='';
|
||||
Util.toast(e.message,true);
|
||||
}finally{
|
||||
btn.disabled=false;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user