Implement bulk delete drawer functionality with UI enhancements

This commit is contained in:
2026-04-10 22:38:24 +02:00
parent a2c79c80bc
commit 06ab3e1f4d
+94 -19
View File
@@ -26,20 +26,49 @@
font-weight: 600; font-weight: 600;
} }
.bulk-delete-toolbar { .bulk-delete-drawer-toggle {
display: flex; position: fixed;
flex-wrap: wrap; right: 0;
gap: 12px; top: 46%;
justify-content: space-between; transform: translateY(-50%);
align-items: center; z-index: 220;
border: 1px solid #f2c4c4; border: none;
background: #fff8f8; border-radius: 10px 0 0 10px;
border-radius: 8px; padding: 10px 10px 10px 8px;
padding: 12px 14px; background: #dc3545;
margin: 0 0 18px; color: #fff;
font-weight: 700;
font-size: 0.85rem;
letter-spacing: 0.02em;
cursor: pointer;
box-shadow: 0 8px 18px rgba(220, 53, 69, 0.22);
} }
.bulk-delete-toolbar strong { .bulk-delete-drawer-toggle .drawer-icon {
display: inline-block;
margin-right: 4px;
}
.bulk-delete-drawer {
position: fixed;
right: 12px;
top: 50%;
transform: translate(120%, -50%);
width: min(360px, calc(100vw - 24px));
z-index: 219;
border: 1px solid #f2c4c4;
background: #fff8f8;
border-radius: 14px;
padding: 14px;
box-shadow: 0 18px 34px rgba(0, 0, 0, 0.12);
transition: transform 0.25s ease;
}
.bulk-delete-drawer.open {
transform: translate(0, -50%);
}
.bulk-delete-drawer strong {
display: block; display: block;
margin-bottom: 2px; margin-bottom: 2px;
} }
@@ -50,25 +79,28 @@
margin-top: 4px; margin-top: 4px;
} }
.bulk-delete-toolbar small { .bulk-delete-drawer small {
color: #7a4a4a; color: #7a4a4a;
display: block; display: block;
margin-top: 2px; margin-top: 2px;
line-height: 1.35;
} }
.bulk-delete-actions { .bulk-delete-actions {
display: flex; display: flex;
flex-wrap: wrap; flex-direction: column;
gap: 8px; gap: 8px;
margin-top: 12px;
} }
.bulk-delete-actions button { .bulk-delete-actions button {
border: 1px solid #cfd8dc; border: 1px solid #cfd8dc;
border-radius: 6px; border-radius: 8px;
padding: 8px 12px; padding: 9px 12px;
cursor: pointer; cursor: pointer;
background: #fff; background: #fff;
font-weight: 600; font-weight: 600;
text-align: left;
} }
.bulk-delete-actions .danger { .bulk-delete-actions .danger {
@@ -339,6 +371,18 @@
cursor: pointer; cursor: pointer;
} }
.bulk-delete-drawer-overlay {
position: fixed;
inset: 0;
background: rgba(15, 23, 42, 0.18);
z-index: 218;
display: none;
}
.bulk-delete-drawer-overlay.open {
display: block;
}
.item-card .item-image { .item-card .item-image {
width: 100%; width: 100%;
height: auto; height: auto;
@@ -2194,12 +2238,14 @@ document.addEventListener('DOMContentLoaded', ()=>{
</div> </div>
</h1> </h1>
<div id="items-indicator" class="items-indicator">Objekte im System: 0</div> <div id="items-indicator" class="items-indicator">Objekte im System: 0</div>
<div class="bulk-delete-toolbar"> <button type="button" id="bulk-delete-drawer-toggle" class="bulk-delete-drawer-toggle" aria-expanded="false" onclick="toggleBulkDeleteDrawer()">
<div> <span class="drawer-icon">🗑</span> Löschen
</button>
<div id="bulk-delete-drawer-overlay" class="bulk-delete-drawer-overlay" onclick="setBulkDeleteDrawer(false)"></div>
<div id="bulk-delete-drawer" class="bulk-delete-drawer" aria-hidden="true">
<strong>Massenlöschung nach Kriterien</strong> <strong>Massenlöschung nach Kriterien</strong>
<div class="bulk-delete-summary" id="bulk-delete-summary">0 Elemente ausgewählt</div> <div class="bulk-delete-summary" id="bulk-delete-summary">0 Elemente ausgewählt</div>
<small>Filter zuerst setzen, dann alle sichtbaren Elemente markieren oder einzelne Karten per Checkbox auswählen.</small> <small>Filter zuerst setzen, dann alle sichtbaren Elemente markieren oder einzelne Karten per Checkbox auswählen.</small>
</div>
<div class="bulk-delete-actions"> <div class="bulk-delete-actions">
<button type="button" onclick="selectVisibleItems()">Alle sichtbaren auswählen</button> <button type="button" onclick="selectVisibleItems()">Alle sichtbaren auswählen</button>
<button type="button" onclick="clearBulkSelection()">Auswahl leeren</button> <button type="button" onclick="clearBulkSelection()">Auswahl leeren</button>
@@ -2587,6 +2633,7 @@ document.addEventListener('DOMContentLoaded', ()=>{
let currentUsername = ''; let currentUsername = '';
let allItems = []; // Cache for all items let allItems = []; // Cache for all items
let bulkDeleteSelection = new Set(); let bulkDeleteSelection = new Set();
let bulkDeleteDrawerOpen = false;
const studentCardsModuleEnabled = {{ 'true' if student_cards_module_enabled else 'false' }}; const studentCardsModuleEnabled = {{ 'true' if student_cards_module_enabled else 'false' }};
const studentDefaultBorrowDays = {{ student_default_borrow_days|default(14) }}; const studentDefaultBorrowDays = {{ student_default_borrow_days|default(14) }};
const studentMaxBorrowDays = {{ student_max_borrow_days|default(365) }}; const studentMaxBorrowDays = {{ student_max_borrow_days|default(365) }};
@@ -2932,6 +2979,28 @@ document.addEventListener('DOMContentLoaded', ()=>{
} }
} }
function setBulkDeleteDrawer(open) {
bulkDeleteDrawerOpen = Boolean(open);
const drawer = document.getElementById('bulk-delete-drawer');
const overlay = document.getElementById('bulk-delete-drawer-overlay');
const toggle = document.getElementById('bulk-delete-drawer-toggle');
if (drawer) {
drawer.classList.toggle('open', bulkDeleteDrawerOpen);
drawer.setAttribute('aria-hidden', bulkDeleteDrawerOpen ? 'false' : 'true');
}
if (overlay) {
overlay.classList.toggle('open', bulkDeleteDrawerOpen);
}
if (toggle) {
toggle.setAttribute('aria-expanded', bulkDeleteDrawerOpen ? 'true' : 'false');
toggle.innerHTML = bulkDeleteDrawerOpen ? '<span class="drawer-icon">✕</span> Löschung' : '<span class="drawer-icon">🗑</span> Löschen';
}
}
function toggleBulkDeleteDrawer() {
setBulkDeleteDrawer(!bulkDeleteDrawerOpen);
}
function setBulkDeleteSelection(itemId, checked) { function setBulkDeleteSelection(itemId, checked) {
const normalizedId = String(itemId || '').trim(); const normalizedId = String(itemId || '').trim();
if (!normalizedId) { if (!normalizedId) {
@@ -2988,6 +3057,12 @@ document.addEventListener('DOMContentLoaded', ()=>{
updateBulkDeleteSummary(); updateBulkDeleteSummary();
} }
document.addEventListener('keydown', function(event) {
if (event.key === 'Escape' && bulkDeleteDrawerOpen) {
setBulkDeleteDrawer(false);
}
});
function deleteSelectedItems() { function deleteSelectedItems() {
const selectedIds = [...bulkDeleteSelection]; const selectedIds = [...bulkDeleteSelection];
if (selectedIds.length === 0) { if (selectedIds.length === 0) {