225 lines
8.9 KiB
HTML
225 lines
8.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="pt-BR">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Gerenciamento de Clínicas - RF Dental</title>
|
|
|
|
<script>
|
|
// Redirecionar se não estiver autenticado ou não for administrador
|
|
if (!localStorage.getItem('auth_token')) {
|
|
window.location.replace('/login');
|
|
} else if (localStorage.getItem('is_admin') !== 'true') {
|
|
window.location.replace('/');
|
|
} else {
|
|
// Adiciona classe de admin no body para que os estilos de admin sejam exibidos
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
document.body.classList.add('is-admin');
|
|
});
|
|
}
|
|
</script>
|
|
|
|
<!-- Fontes -->
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700&family=Inter:wght@400;500;600&display=swap" rel="stylesheet">
|
|
|
|
<!-- Ícones -->
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
|
|
<!-- Estilos -->
|
|
<link rel="stylesheet" href="admin-clinics.css">
|
|
</head>
|
|
<body>
|
|
|
|
<!-- Sidebar -->
|
|
<aside class="sidebar">
|
|
<div class="sidebar-header">
|
|
<div class="logo-icon">
|
|
<i class="fa-solid fa-tooth"></i>
|
|
</div>
|
|
<h2>RF Dental <span style="font-size: 10px; opacity: 0.5; font-weight: 500; margin-left: 4px; vertical-align: middle;">v2.1.2</span></h2>
|
|
</div>
|
|
|
|
<nav class="sidebar-nav">
|
|
<div class="nav-section-title">Menu Principal</div>
|
|
<a href="/" class="nav-item" id="menu-dashboard">
|
|
<i class="fa-solid fa-images"></i> Galeria
|
|
</a>
|
|
<a href="/?action=new-patient" class="nav-item" id="menu-new-patient" onclick="if(window.location.pathname === '/') { openCreatePatientModal(); return false; }">
|
|
<i class="fa-solid fa-user-plus"></i> Novo Paciente
|
|
</a>
|
|
<a href="/?action=sync-upload" class="nav-item" id="menu-upload" onclick="if(window.location.pathname === '/') { openSyncModal('upload'); return false; }">
|
|
<i class="fa-solid fa-upload"></i> Enviar Imagens
|
|
</a>
|
|
<a href="/?action=settings" class="nav-item" id="menu-settings" onclick="if(window.location.pathname === '/') { openSettingsModal(); return false; }">
|
|
<i class="fa-solid fa-user-gear"></i> Minha Conta
|
|
</a>
|
|
|
|
<div class="admin-only">
|
|
<div class="nav-section-title">Área Administrativa</div>
|
|
<a href="/clients" class="nav-item" id="menu-clients">
|
|
<i class="fa-solid fa-network-wired"></i> Conexões
|
|
</a>
|
|
<a href="/admin-clinics" class="nav-item active" id="menu-clinics">
|
|
<i class="fa-solid fa-hospital"></i> Clínicas e Acessos
|
|
</a>
|
|
<a href="/?action=users" class="nav-item" id="menu-users" onclick="if(window.location.pathname === '/') { openUserManagementModal(); return false; }">
|
|
<i class="fa-solid fa-users"></i> Gerenciar Usuários
|
|
</a>
|
|
<a href="/?action=sync-devices" class="nav-item" id="menu-sync" onclick="if(window.location.pathname === '/') { openSyncModal('devices'); return false; }">
|
|
<i class="fa-solid fa-rotate"></i> Sincronização
|
|
</a>
|
|
<a href="/?action=plugins" class="nav-item" id="menu-plugins" onclick="if(window.location.pathname === '/') { openPluginsModal(); return false; }">
|
|
<i class="fa-solid fa-plug"></i> Plugins / Wasabi
|
|
</a>
|
|
<a href="/reset" class="nav-item" id="menu-reset" style="color: #dc2626;">
|
|
<i class="fa-solid fa-triangle-exclamation"></i> Zerar Sistema
|
|
</a>
|
|
</div>
|
|
</nav>
|
|
|
|
<div class="sidebar-footer">
|
|
<button id="logoutBtn" class="logout-btn" onclick="logout(); return false;">
|
|
<i class="fa-solid fa-arrow-right-from-bracket"></i> Sair
|
|
</button>
|
|
</div>
|
|
</aside>
|
|
|
|
<!-- Main Content -->
|
|
<main class="main-content">
|
|
|
|
<header class="top-header">
|
|
<div class="header-title">
|
|
<h1 style="display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 0;">
|
|
Dispositivos e Clínicas
|
|
<span style="font-size: 0.85rem; padding: 6px 12px; border-radius: 20px; background: rgba(79, 70, 229, 0.15); color: var(--primary); font-weight: 600;">
|
|
Total: <span id="totalDevices">0</span>
|
|
</span>
|
|
<span style="font-size: 0.85rem; padding: 6px 12px; border-radius: 20px; background: rgba(16, 185, 129, 0.15); color: var(--success); font-weight: 600;">
|
|
Ativos: <span id="activeDevices">0</span>
|
|
</span>
|
|
<span style="font-size: 0.85rem; padding: 6px 12px; border-radius: 20px; background: rgba(239, 68, 68, 0.15); color: var(--danger); font-weight: 600;">
|
|
Bloqueados: <span id="blockedDevices">0</span>
|
|
</span>
|
|
</h1>
|
|
</div>
|
|
<div class="header-actions">
|
|
<button id="addClinicBtn" class="primary-btn pulse-animation">
|
|
<i class="fa-solid fa-plus"></i> Novo Acesso
|
|
</button>
|
|
</div>
|
|
</header>
|
|
|
|
<section class="data-section glass-card">
|
|
<div class="table-container">
|
|
<table class="modern-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Status</th>
|
|
<th>Clínica</th>
|
|
<th>Computador</th>
|
|
<th>Email de Acesso</th>
|
|
<th>Último IP</th>
|
|
<th>Token de Autenticação</th>
|
|
<th>Ações</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="clinicsTableBody">
|
|
<!-- Loading state -->
|
|
<tr>
|
|
<td colspan="7" class="loading-cell">
|
|
<div class="spinner"></div>
|
|
<p>Carregando dispositivos...</p>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</section>
|
|
|
|
</main>
|
|
|
|
<!-- Modal Cadastro -->
|
|
<div id="clinicModal" class="modal">
|
|
<div class="modal-content glass-card">
|
|
<div class="modal-header">
|
|
<h2>Adicionar Novo Dispositivo</h2>
|
|
<button class="modal-close"><i class="fa-solid fa-xmark"></i></button>
|
|
</div>
|
|
<div class="modal-body-inner">
|
|
<form id="clinicForm" class="modern-form">
|
|
<div class="form-group">
|
|
<label for="clinic_name">Nome da Clínica</label>
|
|
<div class="input-with-icon">
|
|
<i class="fa-solid fa-hospital"></i>
|
|
<input type="text" id="clinic_name" name="clinic_name" placeholder="Ex: Odonto Mais Centro" required>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="pc_name">Identificação do Computador</label>
|
|
<div class="input-with-icon">
|
|
<i class="fa-solid fa-desktop"></i>
|
|
<input type="text" id="pc_name" name="pc_name" placeholder="Ex: Recepção 01" required>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="email">E-mail de Login</label>
|
|
<div class="input-with-icon">
|
|
<i class="fa-solid fa-envelope"></i>
|
|
<input type="email" id="email" name="email" placeholder="recepcao@odontomais.com" required>
|
|
</div>
|
|
<small>O email que o usuário usará no aplicativo Desktop.</small>
|
|
</div>
|
|
|
|
<div class="form-group">
|
|
<label for="password">Senha de Acesso</label>
|
|
<div class="input-with-icon">
|
|
<i class="fa-solid fa-lock"></i>
|
|
<input type="password" id="password" name="password" placeholder="Mínimo 6 caracteres" required minlength="6">
|
|
</div>
|
|
</div>
|
|
|
|
<div class="form-actions">
|
|
<button type="button" class="secondary-btn modal-close">Cancelar</button>
|
|
<button type="submit" class="primary-btn" id="submitBtn">
|
|
<i class="fa-solid fa-check"></i> Salvar e Gerar Token
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Modal Token Gerado -->
|
|
<div id="tokenModal" class="modal">
|
|
<div class="modal-content glass-card success-modal">
|
|
<div class="modal-body-inner" style="display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;">
|
|
<div class="success-icon pulse-animation">
|
|
<i class="fa-solid fa-check-circle"></i>
|
|
</div>
|
|
<h2>Dispositivo Cadastrado!</h2>
|
|
<p>Copie o token abaixo e cole-o no Aplicativo Desktop junto com o email e senha para liberar o envio de raios-x.</p>
|
|
|
|
<div class="token-container">
|
|
<code id="generatedToken">8f8a3b20-1d8c-4b3f-9e7b...</code>
|
|
<button id="copyTokenBtn" class="icon-btn" title="Copiar Token">
|
|
<i class="fa-regular fa-copy"></i>
|
|
</button>
|
|
</div>
|
|
|
|
<button class="primary-btn close-token-modal modal-close" style="width: 100%; margin-top: 20px;">
|
|
Entendido
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="toast" class="toast">Notificação</div>
|
|
|
|
<script src="admin-clinics.js"></script>
|
|
</body>
|
|
</html>
|