Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 84cc8de833 | |||
| 4b3c7e646f | |||
| f9b013508c | |||
| 2a6c40eb5a | |||
| 432d6da798 |
@@ -122,7 +122,7 @@
|
||||
letter-spacing: 0.04em;
|
||||
color: #64748b;
|
||||
background: var(--ui-surface-soft);
|
||||
user-select: none; /* Verhindert Textmarkierung beim Klicken */
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.library-table tr:hover td {
|
||||
@@ -151,7 +151,7 @@
|
||||
.badge-open { background: #fee2e2; color: #991b1b; }
|
||||
.badge-paid { background: #dcfce7; color: #166534; }
|
||||
.badge-damaged { background: #fee2e2; color: #991b1b; }
|
||||
.badge-class { background: #f1f5f9; color: #475569; border: 1px solid #cbd5e1; } /* Neues Badge für Klasse */
|
||||
.badge-class { background: #f1f5f9; color: #475569; border: 1px solid #cbd5e1; }
|
||||
|
||||
.row-actions {
|
||||
display: flex;
|
||||
@@ -168,6 +168,32 @@
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.row-actions .btn-outline-danger {
|
||||
color: #dc2626;
|
||||
background-color: #fef2f2; /* Light red tint so it doesn't blend into the white table */
|
||||
border: 2px solid #dc2626; /* Thicker, clear border */
|
||||
padding: 6px 14px;
|
||||
border-radius: 6px;
|
||||
font-weight: bold;
|
||||
font-size: 0.85rem;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 2px 4px rgba(220, 38, 38, 0.1); /* Subtle shadow for depth */
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.row-actions .btn-outline-danger:hover {
|
||||
background-color: #dc2626;
|
||||
color: #ffffff;
|
||||
box-shadow: 0 4px 8px rgba(220, 38, 38, 0.25);
|
||||
transform: translateY(-1px); /* Slight lift effect on hover */
|
||||
}
|
||||
|
||||
.row-actions .btn-outline-danger:active {
|
||||
transform: translateY(0);
|
||||
box-shadow: 0 1px 2px rgba(220, 38, 38, 0.15); /* Pressed state */
|
||||
}
|
||||
/* ------------------------------------------------------ */
|
||||
|
||||
.muted {
|
||||
color: #6b7280;
|
||||
font-size: 0.92rem;
|
||||
|
||||
@@ -884,7 +884,7 @@
|
||||
name: "Live",
|
||||
type: "LiveStream",
|
||||
// This MUST match the inner div where the video should appear
|
||||
target: document.querySelector('.library-scan-reader'),
|
||||
target: document.querySelector('.library-scan-reader'),
|
||||
constraints: {
|
||||
width: 640,
|
||||
height: 480,
|
||||
@@ -897,7 +897,7 @@
|
||||
},
|
||||
decoder: {
|
||||
// Keep only the barcode types you actually use to improve performance
|
||||
readers: ["code_128_reader", "ean_reader", "code_39_reader"]
|
||||
readers: ["code_128_reader", "ean_reader", "code_39_reader"]
|
||||
},
|
||||
locate: true
|
||||
}, function(err) {
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
<td>{{ permission_presets.get(user.permission_preset, {}).get('label', user.permission_preset) }}</td>
|
||||
<td class="actions">
|
||||
<form method="POST" action="{{ url_for('delete_user') }}" class="d-inline">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
||||
<input type="hidden" name="username" value="{{ user.username }}">
|
||||
<button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Sind Sie sicher, dass Sie den Benutzer {{ user.username }} löschen möchten?')">
|
||||
Löschen
|
||||
@@ -127,6 +128,7 @@
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<form method="POST" action="{{ url_for('admin_update_user_permissions') }}">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
||||
<div class="modal-body permissions-modal-body">
|
||||
<input type="hidden" id="perm-username" name="username">
|
||||
<div class="mb-3">
|
||||
@@ -183,6 +185,7 @@
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<form method="POST" action="{{ url_for('admin_update_user_name') }}">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
||||
<div class="modal-body">
|
||||
<input type="hidden" id="edit-username" name="username">
|
||||
<div class="mb-3">
|
||||
@@ -216,6 +219,7 @@
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<form method="POST" action="{{ url_for('admin_reset_user_password') }}">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
|
||||
<div class="modal-body">
|
||||
<input type="hidden" id="reset-username" name="username">
|
||||
<div class="mb-3">
|
||||
@@ -328,7 +332,6 @@
|
||||
if (row.style.display !== 'none') {
|
||||
var cells = row.querySelectorAll('td');
|
||||
if (cells.length > 0) {
|
||||
// Der Benutzername ist in der ersten Spalte (Index 0)
|
||||
visibleUsernames.push(cells[0].textContent.trim());
|
||||
}
|
||||
}
|
||||
@@ -339,19 +342,26 @@
|
||||
return;
|
||||
}
|
||||
|
||||
// Dynamisches Formular erstellen, um die gefilterten Daten per POST ans Backend zu senden
|
||||
// Dynamisches Formular erstellen
|
||||
var form = document.createElement('form');
|
||||
form.method = 'POST';
|
||||
form.action = "{{ url_for('export_users_csv') }}"; // Passe dies ggf. an deinen Endpunktnamen an
|
||||
form.action = "{{ url_for('export_users_csv') }}";
|
||||
|
||||
// 1. CSRF-Token als Wert (ohne Klammern) übergeben
|
||||
var csrfInput = document.createElement('input');
|
||||
csrfInput.type = 'hidden';
|
||||
csrfInput.name = 'csrf_token';
|
||||
csrfInput.value = "{{ csrf_token }}";
|
||||
form.appendChild(csrfInput);
|
||||
|
||||
// 2. Gefilterte Benutzernamen hinzufügen
|
||||
var input = document.createElement('input');
|
||||
input.type = 'hidden';
|
||||
input.name = 'usernames';
|
||||
input.value = JSON.stringify(visibleUsernames);
|
||||
|
||||
form.appendChild(input);
|
||||
document.body.appendChild(form);
|
||||
|
||||
document.body.appendChild(form);
|
||||
form.submit();
|
||||
|
||||
// Aufräumen
|
||||
|
||||
Reference in New Issue
Block a user