feat: consolidate backend improvements, frontend UX fixes and Wasabi storage support

This commit is contained in:
VPS 4 Deploy Agent
2026-05-30 15:23:27 +02:00
parent de3bbc9564
commit 6dfce6723b
21 changed files with 2312 additions and 361 deletions
+66 -27
View File
@@ -7,9 +7,22 @@
<meta name="description" content="Sistema de gerenciamento de imagens de raio-X dental">
<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Outfit:wght@300;400;500;600;700&display=swap">
<link rel="stylesheet" href="/style.css">
</head>
<body>
<!-- Overlay Global de Alerta Wasabi -->
<div id="wasabi-alert-banner" class="wasabi-alert-banner" style="display: none;">
<span class="wasabi-alert-icon">⚠️</span>
<div class="wasabi-alert-content">
<strong>Atenção:</strong> Falha de autenticação com o Wasabi S3 (<span id="wasabi-alert-error">Erro 403</span>). As imagens não poderão ser salvas ou visualizadas. Por favor, verifique suas configurações de armazenamento imediatamente.
</div>
<button class="wasabi-alert-btn" onclick="openSettingsTab()">Configurar Agora</button>
</div>
<!-- App Layout Container -->
<div class="app-container">
<!-- Sidebar -->
<aside class="sidebar">
@@ -22,8 +35,8 @@
<nav class="sidebar-nav">
<div class="nav-section-title">Menu Principal</div>
<a href="/" class="nav-item active" id="menu-dashboard" onclick="if(window.location.pathname === '/') { showView('gallery'); return false; }">
<i class="fa-solid fa-chart-line"></i> Dashboard
<a href="/" class="nav-item active" id="menu-dashboard" onclick="if(window.location.pathname === '/') { showPatientsView(); return false; }">
<i class="fa-solid fa-images"></i> Galeria
</a>
<a href="#" class="nav-item" id="menu-new-patient" onclick="openCreatePatientModal(); return false;">
<i class="fa-solid fa-user-plus"></i> Novo Paciente
@@ -157,28 +170,54 @@
<!-- View 1: Transforms -->
<div id="transformViewWrapper" class="transform-view-wrapper">
<div id="transformOptions" class="transform-grid"></div>
<div id="transformActionArea" class="transform-action-area" style="display: none;">
<!-- Ajuste Fino de Rotação -->
<div class="fine-tune-section">
<span class="fine-tune-title">
📐 Ajuste Fino de Ângulo (Sensor Inclinado)
</span>
<div class="fine-tune-controls">
<button type="button" class="btn btn-secondary btn-small" onclick="adjustFineTune(-5)" title="Rotacionar -5°">🔄 -5°</button>
<button type="button" class="btn btn-secondary btn-small" onclick="adjustFineTune(-1)" title="Rotacionar -1°">🔄 -1°</button>
<div id="fineTuneValDisplay" class="fine-tune-display">
</div>
<button type="button" class="btn btn-secondary btn-small" onclick="adjustFineTune(1)" title="Rotacionar +1°">🔄 +1°</button>
<button type="button" class="btn btn-secondary btn-small" onclick="adjustFineTune(5)" title="Rotacionar +5°">🔄 +5°</button>
<button type="button" class="btn btn-danger btn-small" id="btnResetFineTune" onclick="resetFineTune()" style="display: none;" title="Resetar ajuste fino">Reset</button>
<div id="newTransformLayout" class="new-transform-layout">
<!-- Painel Original -->
<div class="transform-panel panel-original">
<h3 class="panel-title">Original</h3>
<div class="img-container">
<img id="originalImgPreview" src="" alt="Original">
</div>
</div>
<!-- Painel Preview -->
<div class="transform-panel panel-preview">
<h3 class="panel-title">Preview</h3>
<div class="img-container">
<img id="transformedImgPreview" src="" alt="Transformed">
</div>
</div>
<!-- Barra de ferramentas lateral -->
<div class="transform-sidebar">
<h3 class="sidebar-title">Ajuste</h3>
<div class="sidebar-buttons" id="sidebarTransformButtons" style="display: flex; flex-direction: column; gap: 8px; align-items: center; width: 100%;">
<button type="button" class="sidebar-btn" onclick="adjustFineTune(-5)" title="Rotacionar -5°" style="margin-bottom: 4px;">
<span class="icon"></span>
<span class="label">-5°</span>
</button>
<button type="button" class="sidebar-btn" onclick="adjustFineTune(-1)" title="Rotacionar -1°" style="margin-bottom: 4px;">
<span class="icon"></span>
<span class="label">-1°</span>
</button>
<div id="fineTuneValDisplay" class="fine-tune-display" style="min-width: 40px; padding: 6px; font-size: 1rem; margin: 8px 0;"></div>
<button type="button" class="sidebar-btn" onclick="adjustFineTune(1)" title="Rotacionar +1°" style="margin-top: 4px;">
<span class="icon"></span>
<span class="label">+1°</span>
</button>
<button type="button" class="sidebar-btn" onclick="adjustFineTune(5)" title="Rotacionar +5°" style="margin-top: 4px;">
<span class="icon"></span>
<span class="label">+5°</span>
</button>
<button type="button" class="btn btn-danger btn-small" id="btnResetFineTune" onclick="resetFineTune()" style="display: none; margin-top: 12px; width: 100%;" title="Resetar ajuste">Reset</button>
</div>
</div>
</div>
<div id="transformActionArea" class="transform-action-area" style="display: none;">
<!-- Apenas a observação e os botões de salvar ficaram na área inferior -->
<div class="form-group">
<label>Nova Observação / Detalhes (Opcional):</label>
<textarea id="newImageRemark" class="form-control" rows="2" placeholder="Ex: Raio-X Dente 45..."></textarea>
@@ -219,7 +258,7 @@
<div class="modal-content">
<div class="modal-header">
<h2>Novo Paciente</h2>
<div class="modal-close" onclick="closeCreatePatientModal()">&times;</div>
<div class="modal-close">&times;</div>
</div>
<div class="modal-body">
<form id="create-patient-form" onsubmit="submitCreatePatient(event)">
@@ -269,7 +308,7 @@
<div class="modal-content">
<div class="modal-header">
<h2>Nova GTO</h2>
<div class="modal-close" onclick="closeCreateGtoModal()">&times;</div>
<div class="modal-close">&times;</div>
</div>
<div class="modal-body">
<form id="create-gto-form" onsubmit="submitCreateGto(event)">
@@ -297,7 +336,7 @@
<div class="modal-content">
<div class="modal-header">
<h2>⚙️ Configurações da Conta</h2>
<span class="close-modal" onclick="closeSettingsModal()">&times;</span>
<span class="modal-close">&times;</span>
</div>
<div class="modal-body">
<form id="settingsForm" onsubmit="updateCredentials(event)">
@@ -338,7 +377,7 @@
<div class="modal-content">
<div class="modal-header">
<h2>👥 Gerenciamento de Usuários</h2>
<span class="modal-close" onclick="closeUserManagementModal()">&times;</span>
<span class="modal-close">&times;</span>
</div>
<div class="modal-body" style="display: flex; gap: 24px; flex-direction: row; flex-wrap: wrap; align-items: flex-start;">
<!-- Formulário de Cadastro (Esquerda) -->
@@ -395,7 +434,7 @@
<div class="modal-content">
<div class="modal-header">
<h2>🔌 Configuração do Wasabi Storage</h2>
<span class="modal-close" onclick="closePluginsModal()">&times;</span>
<span class="modal-close">&times;</span>
</div>
<div class="modal-body">
<form id="pluginsForm" onsubmit="updatePluginsConfig(event)">
@@ -445,7 +484,7 @@
<div class="modal-content">
<div class="modal-header">
<h2>🔄 Sincronização e Envio de Imagens</h2>
<span class="modal-close" onclick="closeSyncModal()">&times;</span>
<span class="modal-close">&times;</span>
</div>
<div class="modal-body">
<div class="sync-tabs">