Weitere Übersetzung deutsch Spanisch

This commit is contained in:
Cay 2026-01-28 18:02:43 -01:00
parent 114f429429
commit 3f70e1f7f9
13 changed files with 252 additions and 170 deletions

View File

@ -8,6 +8,7 @@ async function showDashboard(req, res) {
const waitingPatients = await getWaitingPatients(db);
res.render("dashboard", {
user: req.session.user,
waitingPatients
});

View File

@ -5,7 +5,7 @@ function listMedications(req, res, next) {
const { q, onlyActive } = req.query;
let sql = `
SELECT
SELECT
v.id,
m.id AS medication_id,
m.name AS medication,
@ -44,8 +44,9 @@ function listMedications(req, res, next) {
res.render("medications", {
title: "Medikamentenübersicht",
sidebarPartial: "partials/sidebar-empty", // ✅ schwarzer Balken links
active: "medications",
// ✅ IMMER patient-sidebar verwenden
sidebarPartial: "partials/patient-sidebar",
rows,
query: { q, onlyActive },

View File

@ -26,7 +26,34 @@
"nodata":"keine Daten",
"month":"Monat",
"patientcash":"Umsatz pro Patient",
"patient":"Patient"
"patient":"Patient",
"systeminfo":"Systeminformationen",
"table":"Tabelle",
"lines":"Zeilen",
"size":"Grösse",
"errordatabase":"Fehler beim Auslesen der Datenbankinfos:",
"welcome":"Willkommen",
"waitingroomtext":"Wartezimmer-Monitor",
"waitingroomtextnopatient":"Keine Patienten im Wartezimmer.",
"gender":"Geschlecht",
"birthday":"Geburtstag",
"email":"E-Mail",
"phone":"Telefon",
"address":"Adresse",
"country":"Land",
"notice":"Notizen",
"create":"Erstellt",
"change":"Geändert",
"reset2":"Zurücksetzen",
"edit":"Bearbeiten",
"selection":"Auswahl",
"waiting":"Wartet bereits",
"towaitingroom":"Ins Wartezimmer",
"overview":"Übersicht",
"upload":"Hochladen",
"lock":"Sperren",
"unlock":"Enrsperren",
"name":"Name"
},
"sidebar": {
"patients": "Patienten",
@ -75,6 +102,15 @@
"port":"Port",
"database":"Datenbank",
"password":"Password",
"connectiontest":"Verbindung testen"
"connectiontest":"Verbindung testen",
"tablecount":"Anzahl Tabellen",
"databasesize":"Datenbankgrösse",
"tableoverview":"Tabellenübersicht"
},
"patienteoverview": {
"patienttitle": "Patientenübersicht",
"newpatient":"Neuer Patient",
"nopatientfound":"Keine Patienten gefunden"
}
}

View File

@ -26,8 +26,36 @@
"nodata":"sin datos",
"month":"mes",
"patientcash":"Ingresos por paciente",
"patient":"paciente"
"patient":"paciente",
"systeminfo":"Información del sistema",
"table":"tablas",
"lines":"líneas",
"size":"Tamaño",
"errordatabase":"Error al leer la información de la base de datos:",
"welcome":"Bienvenido",
"waitingroomtext":"Monitor de sala de espera",
"waitingroomtextnopatient":"No hay pacientes en la sala de espera.",
"gender":"Sexo",
"birthday":"Fecha de nacimiento",
"email":"Correo electrónico",
"phone":"Teléfono",
"address":"AdreDirecciónsse",
"country":"País",
"notice":"Notas",
"create":"Creado",
"change":"Modificado",
"reset2":"Restablecer",
"edit":"editar",
"selection":"Selección",
"waiting":"Ya está esperando",
"towaitingroom":"A la sala de espera",
"overview":"Resumen",
"upload":"Cargar",
"lock":"bloquear",
"unlock":"desbloquear",
"name":"Nombre"
},
"sidebar": {
"patients": "Pacientes",
"medications": "Medicamentos",
@ -75,6 +103,15 @@
"database":"Base de datos",
"password":"Contraseña",
"connectiontest":"Probar conexión",
"text":"Aquí puedes probar y guardar la conexión a la base de datos. "
"text":"Aquí puedes probar y guardar la conexión a la base de datos. ",
"tablecount":"Número de tablas",
"databasesize":"Tamaño de la base de datos",
"tableoverview":"Resumen de tablas"
},
"patienteoverview": {
"patienttitle": "Resumen de pacientes",
"newpatient":"Paciente nuevo",
"nopatientfound":"No se han encontrado pacientes."
}
}

Binary file not shown.

View File

@ -40,7 +40,10 @@ async function loginUser(db, username, password, lockTimeMinutes) {
resolve({
id: user.id,
username: user.username,
role: user.role
role: user.role,
title: user.title,
firstname: user.first_name,
lastname: user.last_name
});
}
);

View File

@ -132,13 +132,13 @@
<div class="card-body">
<h4 class="mb-3">
<i class="bi bi-info-circle"></i> Systeminformationen
<i class="bi bi-info-circle"></i> <%=t.global.systeminfo%>
</h4>
<% if (typeof systemInfo !== "undefined" && systemInfo && systemInfo.error) { %>
<div class="alert alert-danger mb-0">
Fehler beim Auslesen der Datenbankinfos:
<%=t.global.errordatabase%>
<div class="mt-2"><code><%= systemInfo.error %></code></div>
</div>
@ -154,14 +154,14 @@
<div class="col-md-4">
<div class="border rounded p-3 h-100">
<div class="text-muted small">Anzahl Tabellen</div>
<div class="text-muted small"><%=t.databaseoverview.tablecount%></div>
<div class="fw-bold"><%= systemInfo.tableCount %></div>
</div>
</div>
<div class="col-md-4">
<div class="border rounded p-3 h-100">
<div class="text-muted small">Datenbankgröße</div>
<div class="text-muted small"><%=t.databaseoverview.databasesize%></div>
<div class="fw-bold"><%= systemInfo.dbSizeMB %> MB</div>
</div>
</div>
@ -170,15 +170,15 @@
<% if (systemInfo.tables && systemInfo.tables.length > 0) { %>
<hr>
<h6 class="mb-2">Tabellenübersicht</h6>
<h6 class="mb-2"><%=t.databaseoverview.tableoverview%></h6>
<div class="table-responsive">
<table class="table table-sm table-bordered table-hover align-middle">
<thead class="table-dark">
<tr>
<th>Tabelle</th>
<th class="text-end">Zeilen</th>
<th class="text-end">Größe (MB)</th>
<th><%=t.global.table%></th>
<th class="text-end"><%=t.global.lines%></th>
<th class="text-end"><%=t.global.size%> (MB)</th>
</tr>
</thead>

View File

@ -24,7 +24,7 @@
WARTEZIMMER MONITOR
========================= -->
<div class="waiting-monitor">
<h5 class="mb-3">🪑 Wartezimmer-Monitor</h5>
<h5 class="mb-3">🪑 <%=t.global.waitingroomtext%></h5>
<div class="waiting-grid">
<% if (waitingPatients && waitingPatients.length > 0) { %>
@ -56,7 +56,7 @@
<% }) %>
<% } else { %>
<div class="text-muted">Keine Patienten im Wartezimmer.</div>
<div class="text-muted"><%=t.global.waitingroomtextnopatient%></div>
<% } %>
</div>
</div>

View File

@ -1,141 +1,140 @@
<%- include("partials/page-header", {
user,
title: "Medikamentenübersicht",
title: t.patienteoverview.patienttitle,
subtitle: "",
showUserName: true
}) %>
<div class="content p-4">
<div class="content p-4">
<%- include("partials/flash") %>
<%- include("partials/flash") %>
<div class="container-fluid p-0">
<div class="container-fluid p-0">
<div class="card shadow">
<div class="card-body">
<div class="card shadow">
<div class="card-body">
<!-- 🔍 Suche -->
<form method="GET" action="/medications" class="row g-2 mb-3">
<!-- 🔍 Suche -->
<form method="GET" action="/medications" class="row g-2 mb-3">
<div class="col-md-6">
<input
type="text"
name="q"
class="form-control"
placeholder="🔍 Suche nach Medikament, Form, Dosierung"
value="<%= query?.q || '' %>"
>
</div>
<div class="col-md-6">
<input
type="text"
name="q"
class="form-control"
placeholder="🔍 Suche nach Medikament, Form, Dosierung"
value="<%= query?.q || '' %>"
>
</div>
<div class="col-md-3 d-flex gap-2">
<button class="btn btn-primary w-100">Suchen</button>
<a href="/medications" class="btn btn-secondary w-100">Reset</a>
</div>
<div class="col-md-3 d-flex gap-2">
<button class="btn btn-primary w-100">Suchen</button>
<a href="/medications" class="btn btn-secondary w-100">Reset</a>
</div>
<div class="col-md-3 d-flex align-items-center">
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="onlyActive"
value="1"
<%= query?.onlyActive === "1" ? "checked" : "" %>
>
<label class="form-check-label">
Nur aktive Medikamente
</label>
<div class="col-md-3 d-flex align-items-center">
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="onlyActive"
value="1"
<%= query?.onlyActive === "1" ? "checked" : "" %>
>
<label class="form-check-label">
Nur aktive Medikamente
</label>
</div>
</div>
</form>
<!-- Neu -->
<a href="/medications/create" class="btn btn-success mb-3">
Neues Medikament
</a>
<div class="table-responsive">
<table class="table table-bordered table-hover table-sm align-middle">
<thead class="table-dark">
<tr>
<th>Medikament</th>
<th>Darreichungsform</th>
<th>Dosierung</th>
<th>Packung</th>
<th>Status</th>
<th>Aktionen</th>
</tr>
</thead>
<tbody>
<% rows.forEach(r => { %>
<tr class="<%= r.active ? '' : 'table-secondary' %>">
<!-- UPDATE-FORM -->
<form method="POST" action="/medications/update/<%= r.id %>">
<td><%= r.medication %></td>
<td><%= r.form %></td>
<td>
<input
type="text"
name="dosage"
value="<%= r.dosage %>"
class="form-control form-control-sm"
disabled
>
</td>
<td>
<input
type="text"
name="package"
value="<%= r.package %>"
class="form-control form-control-sm"
disabled
>
</td>
<td class="text-center">
<%= r.active ? "Aktiv" : "Inaktiv" %>
</td>
<td class="d-flex gap-2">
<button class="btn btn-sm btn-outline-success save-btn" disabled>
💾
</button>
<button type="button" class="btn btn-sm btn-outline-warning lock-btn">
🔓
</button>
</form>
<!-- TOGGLE-FORM -->
<form method="POST" action="/medications/toggle/<%= r.medication_id %>">
<button class="btn btn-sm <%= r.active ? 'btn-outline-danger' : 'btn-outline-success' %>">
<%= r.active ? "⛔" : "✅" %>
</button>
</form>
</td>
</tr>
<% }) %>
</tbody>
</table>
</div>
</div>
</form>
<!-- Neu -->
<a href="/medications/create" class="btn btn-success mb-3">
Neues Medikament
</a>
<div class="table-responsive">
<table class="table table-bordered table-hover table-sm align-middle">
<thead class="table-dark">
<tr>
<th>Medikament</th>
<th>Darreichungsform</th>
<th>Dosierung</th>
<th>Packung</th>
<th>Status</th>
<th>Aktionen</th>
</tr>
</thead>
<tbody>
<% rows.forEach(r => { %>
<tr class="<%= r.active ? '' : 'table-secondary' %>">
<!-- UPDATE-FORM -->
<form method="POST" action="/medications/update/<%= r.id %>">
<td><%= r.medication %></td>
<td><%= r.form %></td>
<td>
<input
type="text"
name="dosage"
value="<%= r.dosage %>"
class="form-control form-control-sm"
disabled
>
</td>
<td>
<input
type="text"
name="package"
value="<%= r.package %>"
class="form-control form-control-sm"
disabled
>
</td>
<td class="text-center">
<%= r.active ? "Aktiv" : "Inaktiv" %>
</td>
<td class="d-flex gap-2">
<button class="btn btn-sm btn-outline-success save-btn" disabled>
💾
</button>
<button type="button" class="btn btn-sm btn-outline-warning lock-btn">
🔓
</button>
</form>
<!-- TOGGLE-FORM -->
<form method="POST" action="/medications/toggle/<%= r.medication_id %>">
<button class="btn btn-sm <%= r.active ? 'btn-outline-danger' : 'btn-outline-success' %>">
<%= r.active ? "⛔" : "✅" %>
</button>
</form>
</td>
</tr>
<% }) %>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- ✅ Externes JS (Helmet/CSP safe) -->
<script src="/js/services-lock.js"></script>
<!-- ✅ Externes JS (Helmet/CSP safe) -->
<script src="/js/services-lock.js"></script>

View File

@ -75,5 +75,10 @@
<% } %>
</a>
<!-- ✅ Logout -->
<a href="/logout" class="nav-item">
<i class="bi bi-box-arrow-right"></i> <%= t.sidebar.logout %>
</a>
</div>
</div>

View File

@ -18,7 +18,7 @@
<div class="page-header-center">
<% if (showUser && user?.username) { %>
<div class="page-header-username">
Willkommen, <%= user.username %>
<%=t.global.welcome%>, <%= user.title + " " + user.firstname + " " + user.lastname %>
</div>
<% } %>

View File

@ -1,7 +1,7 @@
<div class="layout">
<!-- ✅ Sidebar dynamisch über layout.ejs -->
<!-- wird automatisch geladen -->
<!-- wird automatisch geladen -->
<div class="main">

View File

@ -1,6 +1,6 @@
<%- include("partials/page-header", {
user,
title: "Patientenübersicht",
title: t.patienteoverview.patienttitle,
subtitle: "",
showUserName: true
}) %>
@ -12,7 +12,7 @@
<!-- Aktionen oben -->
<div class="d-flex gap-2 mb-3">
<a href="/patients/create" class="btn btn-success">
+ Neuer Patient
+ <%=t.patienteoverview.newpatient%>
</a>
</div>
@ -26,7 +26,7 @@
type="text"
name="firstname"
class="form-control"
placeholder="Vorname"
placeholder=<%=t.global.firstname%>
value="<%= query?.firstname || '' %>"
/>
</div>
@ -36,7 +36,7 @@
type="text"
name="lastname"
class="form-control"
placeholder="Nachname"
placeholder=<%=t.global.lastname%>
value="<%= query?.lastname || '' %>"
/>
</div>
@ -51,9 +51,9 @@
</div>
<div class="col-md-3 d-flex gap-2">
<button class="btn btn-primary w-100">Suchen</button>
<button class="btn btn-primary w-100"><%=t.global.search%></button>
<a href="/patients" class="btn btn-secondary w-100">
Zurücksetzen
<%=t.global.reset2%>
</a>
</div>
</form>
@ -65,19 +65,19 @@
<tr>
<th style="width:40px;"></th>
<th>ID</th>
<th>Name</th>
<th><%=t.global.name%></th>
<th>N.I.E. / DNI</th>
<th>Geschlecht</th>
<th>Geburtstag</th>
<th>E-Mail</th>
<th>Telefon</th>
<th>Adresse</th>
<th>Land</th>
<th>Status</th>
<th>Notizen</th>
<th>Erstellt</th>
<th>Geändert</th>
<th>Aktionen</th>
<th><%=t.global.gender%></th>
<th><%=t.global.birthday%></th>
<th><%=t.global.email%></th>
<th><%=t.global.phone%></th>
<th><%=t.global.address%></th>
<th><%=t.global.country%></th>
<th><%=t.global.status%></th>
<th><%=t.global.notice%></th>
<th><%=t.global.create%></th>
<th><%=t.global.change%></th>
<th><%=t.global.action%></th>
</tr>
</thead>
@ -85,7 +85,7 @@
<% if (patients.length === 0) { %>
<tr>
<td colspan="15" class="text-center text-muted">
Keine Patienten gefunden
<%=t.patientoverview.nopatientfound%>
</td>
</tr>
<% } %>
@ -161,14 +161,14 @@
<td class="text-nowrap">
<div class="dropdown">
<button class="btn btn-sm btn-outline-secondary" data-bs-toggle="dropdown">
Auswahl
<%=t.global.selection%>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="/patients/edit/<%= p.id %>">
✏️ Bearbeiten
✏️ <%=t.global.edit%>
</a>
</li>
@ -176,12 +176,12 @@
<% if (p.waiting_room) { %>
<li>
<span class="dropdown-item text-muted">🪑 Wartet bereits</span>
<span class="dropdown-item text-muted">🪑 <%=t.global.waiting%></span>
</li>
<% } else { %>
<li>
<form method="POST" action="/patients/waiting-room/<%= p.id %>">
<button class="dropdown-item">🪑 Ins Wartezimmer</button>
<button class="dropdown-item">🪑 <%=t.global.towaitingroom%></button>
</form>
</li>
<% } %>
@ -190,7 +190,7 @@
<li>
<a class="dropdown-item" href="/patients/<%= p.id %>/medications">
💊 Medikamente
💊 <%=t.sidebar.medications%>
</a>
</li>
@ -199,18 +199,18 @@
<li>
<% if (p.active) { %>
<form method="POST" action="/patients/deactivate/<%= p.id %>">
<button class="dropdown-item text-warning">🔒 Sperren</button>
<button class="dropdown-item text-warning">🔒 <%=t.global.lock%><</button>
</form>
<% } else { %>
<form method="POST" action="/patients/activate/<%= p.id %>">
<button class="dropdown-item text-success">🔓 Entsperren</button>
<button class="dropdown-item text-success">🔓 <%=t.global.unlock%><</button>
</form>
<% } %>
</li>
<li>
<a class="dropdown-item" href="/patients/<%= p.id %>">
📋 Übersicht
📋 <%=t.global.overview%>
</a>
</li>
@ -220,7 +220,7 @@
<form method="POST" action="/patients/<%= p.id %>/files" enctype="multipart/form-data">
<input type="file" name="file" class="form-control form-control-sm mb-2" required />
<button class="btn btn-sm btn-secondary w-100">
📎 Hochladen
📎 <%=t.global.upload%>
</button>
</form>
</li>