Files
rx.scoreodonto.com/dental-server/public/admin-clinics.html
T

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>