Implement bulk delete drawer functionality with UI enhancements
This commit is contained in:
@@ -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
|
||||||
<strong>Massenlöschung nach Kriterien</strong>
|
</button>
|
||||||
<div class="bulk-delete-summary" id="bulk-delete-summary">0 Elemente ausgewählt</div>
|
<div id="bulk-delete-drawer-overlay" class="bulk-delete-drawer-overlay" onclick="setBulkDeleteDrawer(false)"></div>
|
||||||
<small>Filter zuerst setzen, dann alle sichtbaren Elemente markieren oder einzelne Karten per Checkbox auswählen.</small>
|
<div id="bulk-delete-drawer" class="bulk-delete-drawer" aria-hidden="true">
|
||||||
</div>
|
<strong>Massenlöschung nach Kriterien</strong>
|
||||||
|
<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>
|
||||||
<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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user