location list fix

This commit is contained in:
2026-02-16 11:11:56 +01:00
parent 2a1732323d
commit d1d89dd4e3
3 changed files with 286 additions and 244 deletions

View File

@@ -0,0 +1,187 @@
.locations-container {
padding: 20px;
max-width: 1000px;
margin: 0 auto;
}
.locations-filter-form {
display: flex;
gap: 10px;
flex-wrap: wrap;
align-items: center;
}
.locations-filter-add {
margin-left: auto;
}
.search-input {
flex: 1;
min-width: 250px;
}
.locations-list {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
.locations-list th {
background: #f5f5f5;
padding: 12px;
text-align: left;
border-bottom: 2px solid #ddd;
font-weight: bold;
}
.locations-list td {
padding: 12px;
border-bottom: 1px solid #ddd;
}
.locations-list tr:hover {
background: #f9f9f9;
}
.actions {
white-space: nowrap;
}
.button {
display: inline-block;
padding: 8px 12px;
background: #007bff;
color: #fff;
text-decoration: none;
border-radius: 4px;
border: none;
cursor: pointer;
font-size: 0.9em;
}
.button:hover {
background: #0056b3;
}
.button-primary {
background: #28a745;
}
.button-primary:hover {
background: #218838;
}
.button-small {
padding: 4px 8px;
font-size: 0.85em;
}
.button-danger {
background: #dc3545;
}
.button-danger:hover {
background: #c82333;
}
.empty-state {
text-align: center;
padding: 40px 20px;
background: #f9f9f9;
border: 1px solid #eee;
border-radius: 8px;
}
.hierarchy-section {
padding: 20px;
max-width: 1200px;
margin: 30px auto;
border-top: 1px solid #ddd;
}
.hierarchy-section h2 {
margin-bottom: 15px;
font-size: 1.3rem;
}
.hierarchy-table {
width: 100%;
border-collapse: separate;
border-spacing: 0;
border: 1px solid #d8dee5;
border-radius: 10px;
overflow: hidden;
}
.hierarchy-table th {
background: #f3f6fa;
padding: 10px 12px;
text-align: left;
font-size: 0.9rem;
font-weight: 600;
border-bottom: 1px solid #d8dee5;
}
.hierarchy-table td {
padding: 9px 12px;
border-bottom: 1px solid #eef2f6;
vertical-align: top;
}
.hierarchy-row:last-child td {
border-bottom: none;
}
.hierarchy-row--empty {
background: #fcfcfc;
}
.hierarchy-cell {
white-space: nowrap;
}
.hierarchy-cell--location {
background: #fbfcfe;
font-weight: 600;
min-width: 170px;
}
.hierarchy-cell--building {
padding-left: 18px;
min-width: 180px;
}
.hierarchy-cell--floor {
padding-left: 24px;
min-width: 190px;
}
.hierarchy-cell--room {
padding-left: 56px;
min-width: 190px;
}
.hierarchy-cell--empty {
background: #fafbfd;
width: 20px;
}
.hierarchy-meta {
color: #4e5c6b;
font-size: 0.88rem;
}
.hierarchy-meta--muted {
color: #8a94a3;
}
.hierarchy-actions {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.hierarchy-actions .button {
padding: 4px 10px;
font-size: 0.8rem;
}

View File

@@ -0,0 +1,78 @@
(() => {
function postDelete(url) {
return fetch(url, {
method: 'POST',
headers: { 'X-Requested-With': 'XMLHttpRequest' }
}).then((response) => response.json());
}
function handleLocationDelete(id) {
if (!confirm('Diesen Standort wirklich loeschen?')) {
return;
}
postDelete('?module=locations&action=delete&id=' + encodeURIComponent(id))
.then((data) => {
if (data && data.success) {
window.location.reload();
return;
}
alert((data && data.message) ? data.message : 'Loeschen fehlgeschlagen');
})
.catch(() => alert('Loeschen fehlgeschlagen'));
}
function handleBuildingDelete() {
if (confirm('Dieses Gebaeude wirklich loeschen? Alle Stockwerke werden geloescht.')) {
alert('Loeschen noch nicht implementiert');
}
}
function handleFloorDelete() {
if (confirm('Dieses Stockwerk wirklich loeschen? Alle Raeume und Racks werden geloescht.')) {
alert('Loeschen noch nicht implementiert');
}
}
function handleRoomDelete(id) {
if (!confirm('Diesen Raum wirklich loeschen? Zugeordnete Dosen werden mitgeloescht.')) {
return;
}
postDelete('?module=rooms&action=delete&id=' + encodeURIComponent(id))
.then((data) => {
if (data && data.success) {
window.location.reload();
return;
}
alert((data && data.message) ? data.message : 'Loeschen fehlgeschlagen');
})
.catch(() => alert('Loeschen fehlgeschlagen'));
}
function bindDeleteButtons() {
document.querySelectorAll('.js-delete-location').forEach((button) => {
button.addEventListener('click', () => {
handleLocationDelete(Number(button.dataset.locationId || 0));
});
});
document.querySelectorAll('.js-delete-building').forEach((button) => {
button.addEventListener('click', () => {
handleBuildingDelete(Number(button.dataset.buildingId || 0));
});
});
document.querySelectorAll('.js-delete-floor').forEach((button) => {
button.addEventListener('click', () => {
handleFloorDelete(Number(button.dataset.floorId || 0));
});
});
document.querySelectorAll('.js-delete-room').forEach((button) => {
button.addEventListener('click', () => {
handleRoomDelete(Number(button.dataset.roomId || 0));
});
});
}
document.addEventListener('DOMContentLoaded', bindDeleteButtons);
})();