Files
deskhub/DeskHub-Webseite/staff/queues.php
T
2026-10-16 19:12:21 +00:00

182 lines
7.8 KiB
PHP

<?php
require_once __DIR__ . '/../includes/bootstrap.php';
$staff = require_staff_login();
$pdo = get_db();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
verify_csrf();
$action = $_POST['action'] ?? '';
if ($action === 'rename') {
$id = (int)($_POST['id'] ?? 0);
$name = trim($_POST['name'] ?? '');
if ($id && $name) {
$pdo->prepare('UPDATE saved_queues SET name=?, updated_at=? WHERE id=? AND (staff_id=? OR ?=1)')
->execute([$name, db_now(), $id, $staff['id'], $staff['role'] === 'admin' ? 1 : 0]);
flash('success', 'Queue umbenannt.');
}
redirect('/staff/queues.php');
}
if ($action === 'delete') {
$id = (int)($_POST['id'] ?? 0);
if ($id) {
$pdo->prepare('DELETE FROM saved_queues WHERE id=? AND (staff_id=? OR ?=1)')
->execute([$id, $staff['id'], $staff['role'] === 'admin' ? 1 : 0]);
flash('success', 'Queue gelöscht.');
}
redirect('/staff/queues.php');
}
if ($action === 'reorder') {
$ids = array_map('intval', $_POST['ids'] ?? []);
foreach ($ids as $i => $id) {
$pdo->prepare('UPDATE saved_queues SET sort_order=? WHERE id=? AND staff_id=?')
->execute([$i, $id, $staff['id']]);
}
echo json_encode(['ok' => true]);
exit;
}
}
$queues = queues_for($pdo, (int) $staff['id']);
$pageTitle = 'Gespeicherte Ansichten';
$activePage = 'tickets';
require __DIR__ . '/_header.php';
?>
<div class="topbar">
<h1>Gespeicherte Ansichten</h1>
<a href="/staff/tickets.php" class="btn secondary">← Zur Ticket-Liste</a>
</div>
<?php if (!$queues): ?>
<div class="card">
<div class="empty-state">
<p>Noch keine gespeicherten Ansichten vorhanden.</p>
<p class="muted" style="font-size:.85rem">Filter in der <a href="/staff/tickets.php">Ticket-Liste</a> setzen und auf „Ansicht speichern" klicken.</p>
</div>
</div>
<?php else: ?>
<div class="card">
<h3>Meine Ansichten</h3>
<p class="muted" style="font-size:.85rem; margin-bottom:16px">Reihenfolge per Drag & Drop ändern. Klick auf den Namen öffnet die Ansicht.</p>
<ul id="queue-list" style="list-style:none; padding:0; margin:0; display:flex; flex-direction:column; gap:8px">
<?php foreach ($queues as $q):
$filters = $q['filters'];
$href = '/staff/tickets.php?' . http_build_query(queue_filters_to_web($filters));
$summary = [];
if (!empty($filters['status'])) $summary[] = 'Status: ' . $filters['status'];
if (!empty($filters['assigned'])) $summary[] = 'Zugewiesen: ' . ($filters['assigned'] === 'me' ? 'mir' : ($filters['assigned'] === 'unassigned' ? 'niemand' : 'ID ' . $filters['assigned']));
if (!empty($filters['departmentId'])) $summary[] = 'Abteilung: ' . $filters['departmentId'];
if (!empty($filters['priorityId'])) $summary[] = 'Priorität: ' . $filters['priorityId'];
if (!empty($filters['sla'])) $summary[] = 'SLA: ' . $filters['sla'];
if (!empty($filters['q'])) $summary[] = 'Suche: "' . $filters['q'] . '"';
?>
<li data-id="<?= $q['id'] ?>"
style="background:var(--surface); border:1px solid var(--border); border-radius:8px; padding:14px 16px; display:flex; align-items:center; gap:12px; cursor:grab">
<span style="color:var(--muted); font-size:1rem; cursor:grab">⠿</span>
<div style="flex:1; min-width:0">
<div style="display:flex; align-items:center; gap:10px; margin-bottom:4px">
<a href="<?= e($href) ?>" style="font-weight:600; font-size:.92rem; color:var(--ink)"><?= e($q['name']) ?></a>
<?php if ($q['is_shared']): ?><span class="muted" style="font-size:.75rem">⇄ geteilt<?= $q['mine'] ? '' : ' von ' . e($q['owner_name'] ?? '') ?></span><?php endif; ?>
</div>
<?php if ($summary): ?>
<div class="muted" style="font-size:.78rem"><?= e(implode(' · ', $summary)) ?></div>
<?php else: ?>
<div class="muted" style="font-size:.78rem">Alle Tickets</div>
<?php endif; ?>
</div>
<?php if (queue_can_edit($q, $staff)): ?>
<div style="display:flex; gap:6px; flex-shrink:0">
<!-- Umbenennen -->
<button onclick="renameQueue(<?= $q['id'] ?>, '<?= e(addslashes($q['name'])) ?>')"
class="btn secondary" style="padding:5px 10px; font-size:.78rem">✏️ Umbenennen</button>
<!-- Löschen -->
<form method="post" onsubmit="return confirm('Ansicht löschen?')" style="margin:0">
<?= csrf_field() ?>
<input type="hidden" name="action" value="delete">
<input type="hidden" name="id" value="<?= $q['id'] ?>">
<button type="submit" class="btn secondary"
style="padding:5px 10px; font-size:.78rem; border-color:var(--danger); color:var(--danger)">🗑️</button>
</form>
</div>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<!-- Umbenennen Modal -->
<div id="rename-modal" style="display:none; position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:9999; align-items:center; justify-content:center">
<div style="background:#fff; border-radius:12px; padding:24px; width:100%; max-width:400px; box-shadow:0 8px 32px rgba(0,0,0,.2)">
<h3 style="margin:0 0 16px">Ansicht umbenennen</h3>
<form method="post" id="rename-form">
<?= csrf_field() ?>
<input type="hidden" name="action" value="rename">
<input type="hidden" name="id" id="rename-id">
<label>Name</label>
<input type="text" name="name" id="rename-name" required style="margin-bottom:16px">
<div class="btn-row">
<button type="submit" class="btn">Speichern</button>
<button type="button" class="btn secondary" onclick="document.getElementById('rename-modal').style.display='none'">Abbrechen</button>
</div>
</form>
</div>
</div>
<script>
function renameQueue(id, currentName) {
document.getElementById('rename-id').value = id;
document.getElementById('rename-name').value = currentName;
document.getElementById('rename-modal').style.display = 'flex';
setTimeout(() => document.getElementById('rename-name').focus(), 50);
}
// Drag & Drop Reihenfolge
(function() {
var list = document.getElementById('queue-list');
if (!list) return;
var dragging = null;
list.querySelectorAll('li').forEach(function(li) {
li.addEventListener('dragstart', function(e) {
dragging = li;
li.style.opacity = '.4';
e.dataTransfer.effectAllowed = 'move';
});
li.addEventListener('dragend', function() {
li.style.opacity = '1';
dragging = null;
saveOrder();
});
li.addEventListener('dragover', function(e) {
e.preventDefault();
if (dragging && dragging !== li) {
var rect = li.getBoundingClientRect();
var mid = rect.top + rect.height / 2;
if (e.clientY < mid) {
list.insertBefore(dragging, li);
} else {
list.insertBefore(dragging, li.nextSibling);
}
}
});
li.setAttribute('draggable', 'true');
});
function saveOrder() {
var ids = Array.from(list.querySelectorAll('li')).map(li => li.dataset.id);
var fd = new FormData();
fd.append('action', 'reorder');
fd.append('csrf_token', document.querySelector('[name=csrf_token]').value);
ids.forEach(id => fd.append('ids[]', id));
fetch('/staff/queues.php', { method: 'POST', body: fd });
}
})();
</script>
<?php require __DIR__ . '/_footer.php'; ?>