Jira aanpassingen

This commit is contained in:
2026-09-14 16:24:23 +02:00
parent 7a85f612b1
commit f992ca1ec9
4 changed files with 1004 additions and 569 deletions
+49 -21
View File
@@ -171,15 +171,29 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
}
// 2d. Teamleden toewijzen aan Jira Wachtrijfilter
// 2d. Teamleden toewijzen aan Jira Wachtrijfilters (meervoudig)
elseif ($action === 'save_user_jira_assignments') {
$activeTab = 'jira';
$assignments = $_POST['user_filter'] ?? [];
if (is_array($assignments)) {
$upd = $db->prepare("UPDATE users SET default_jira_filter_code = ? WHERE id = ?");
foreach ($assignments as $uId => $fCode) {
$fCode = trim($fCode);
$upd->execute([$fCode !== '' ? $fCode : null, (int)$uId]);
$assignments = $_POST['user_filters'] ?? [];
$submittedUserIds = isset($_POST['user_ids']) && is_array($_POST['user_ids']) ? array_map('intval', $_POST['user_ids']) : [];
// Fallback als user_ids niet meegestuurd werd (bv. oude formulier submission met user_filter)
if (empty($submittedUserIds) && !empty($_POST['user_filter']) && is_array($_POST['user_filter'])) {
$submittedUserIds = array_map('intval', array_keys($_POST['user_filter']));
foreach ($_POST['user_filter'] as $uId => $sCode) {
$sCode = trim($sCode);
$assignments[$uId] = $sCode !== '' ? [$sCode] : [];
}
}
if (!empty($submittedUserIds)) {
$upd = $db->prepare("UPDATE users SET default_jira_filter_codes = ?, default_jira_filter_code = ? WHERE id = ?");
foreach ($submittedUserIds as $uId) {
$rawList = isset($assignments[$uId]) && is_array($assignments[$uId]) ? $assignments[$uId] : [];
$cleanCodes = array_values(array_unique(array_filter(array_map('trim', $rawList))));
$jsonVal = !empty($cleanCodes) ? json_encode($cleanCodes) : null;
$firstVal = !empty($cleanCodes) ? $cleanCodes[0] : null;
$upd->execute([$jsonVal, $firstVal, (int)$uId]);
}
fociz_log_audit($userId, 'SETTINGS_UPDATED', 'jira_assignments', null, [], 'SUCCESS', $adminUser['email']);
$message = "Standaard Jira wachtrijtoewijzingen voor het team zijn succesvol opgeslagen.";
@@ -511,7 +525,7 @@ try {
$allUsersForJira = [];
$allJiraFilters = [];
try {
$allUsersForJira = $db->query("SELECT id, name, email, role, avatar_url, default_jira_filter_code FROM users ORDER BY name ASC")->fetchAll() ?: [];
$allUsersForJira = $db->query("SELECT id, name, email, role, avatar_url, default_jira_filter_code, default_jira_filter_codes FROM users ORDER BY name ASC")->fetchAll() ?: [];
$allJiraFilters = $db->query("SELECT * FROM jira_queue_filters ORDER BY sort_order ASC, id ASC")->fetchAll() ?: [];
} catch (Throwable $e) {
error_log("Fout bij ophalen jira filters/users: " . $e->getMessage());
@@ -1373,10 +1387,10 @@ require_once __DIR__ . '/includes/header.php';
<div>
<h3 class="text-xs font-bold text-slate-900 dark:text-white uppercase tracking-wider flex items-center space-x-1.5">
<i data-lucide="users" class="w-3.5 h-3.5 text-indigo-500"></i>
<span>Team Wachtrijmatrix: Standaard Wachtrij per Collega</span>
<span>Team Wachtrijmatrix: Gekoppelde Wachtrijen per Collega</span>
</h3>
<p class="text-[11px] text-slate-500 dark:text-slate-400 mt-0.5">
Wijs collega's toe aan hun primaire wachtrij (bijv. DX of SD). Wanneer zij de Jira pagina openen, wordt deze wachtrij direct als standaard getoond.
Koppel collega's aan één of meerdere wachtrijfilters (bijv. SD, IN, AAN, GEN of DX). Collega's zien in de Jira Hub direct de tickets van hun gekoppelde wachtrijen.
</p>
</div>
</div>
@@ -1393,13 +1407,25 @@ require_once __DIR__ . '/includes/header.php';
<th class="py-3 px-4">Teamlid</th>
<th class="py-3 px-4">E-mailadres</th>
<th class="py-3 px-4">Rol</th>
<th class="py-3 px-4 w-72">Standaard Wachtrijfilter</th>
<th class="py-3 px-4">Gekoppelde Wachtrijen (Meervoudig)</th>
</tr>
</thead>
<tbody class="divide-y divide-slate-100 dark:divide-slate-800/80 bg-white dark:bg-[#111622]">
<?php foreach ($allUsersForJira as $usr): ?>
<?php foreach ($allUsersForJira as $usr):
$userSelectedCodes = [];
if (!empty($usr['default_jira_filter_codes'])) {
$decoded = json_decode($usr['default_jira_filter_codes'], true);
if (is_array($decoded)) {
$userSelectedCodes = $decoded;
}
}
if (empty($userSelectedCodes) && !empty($usr['default_jira_filter_code'])) {
$userSelectedCodes = [$usr['default_jira_filter_code']];
}
?>
<tr class="hover:bg-slate-50/50 dark:hover:bg-slate-800/30 transition">
<td class="py-3 px-4">
<input type="hidden" name="user_ids[]" value="<?= (int)$usr['id'] ?>">
<div class="flex items-center space-x-2.5">
<?php if (!empty($usr['avatar_url'])): ?>
<img src="<?= htmlspecialchars($usr['avatar_url']) ?>" alt="Avatar" class="w-7 h-7 rounded-full object-cover border border-slate-200 dark:border-slate-700" onerror="this.classList.add('hidden'); if(this.nextElementSibling) this.nextElementSibling.classList.remove('hidden');">
@@ -1423,16 +1449,18 @@ require_once __DIR__ . '/includes/header.php';
</span>
</td>
<td class="py-3 px-4">
<select name="user_filter[<?= (int)$usr['id'] ?>]" class="w-full bg-slate-50 dark:bg-[#0c0f17] border border-slate-300 dark:border-slate-700 rounded-xl px-3 py-1.5 text-xs text-slate-900 dark:text-white focus:outline-none focus:ring-1 focus:ring-indigo-500 cursor-pointer">
<option value="">Geen voorkeur (alles tonen)</option>
<?php foreach ($allJiraFilters as $f): ?>
<?php if ($f['is_active']): ?>
<option value="<?= htmlspecialchars($f['filter_code']) ?>" <?= ($usr['default_jira_filter_code'] === $f['filter_code']) ? 'selected' : '' ?>>
<?= htmlspecialchars($f['filter_code']) ?> — <?= htmlspecialchars($f['filter_name']) ?>
</option>
<?php endif; ?>
<div class="flex flex-wrap gap-1.5 items-center">
<?php foreach ($allJiraFilters as $f):
if (!$f['is_active']) continue;
$code = $f['filter_code'];
$isChecked = in_array($code, $userSelectedCodes, true);
?>
<label class="inline-flex items-center space-x-1.5 px-2.5 py-1 rounded-lg border text-xs font-semibold cursor-pointer transition select-none <?= $isChecked ? 'bg-indigo-50 border-indigo-300 text-indigo-700 dark:bg-indigo-950/60 dark:border-indigo-700 dark:text-indigo-300' : 'bg-slate-50 border-slate-200 text-slate-600 dark:bg-slate-900/40 dark:border-slate-800 dark:text-slate-400 hover:border-slate-300 dark:hover:border-slate-700' ?>">
<input type="checkbox" name="user_filters[<?= (int)$usr['id'] ?>][]" value="<?= htmlspecialchars($code) ?>" <?= $isChecked ? 'checked' : '' ?> class="w-3.5 h-3.5 rounded text-indigo-600 border-slate-300 dark:border-slate-700 focus:ring-indigo-500 cursor-pointer">
<span title="<?= htmlspecialchars($f['filter_name']) ?>"><?= htmlspecialchars($code) ?></span>
</label>
<?php endforeach; ?>
</select>
</div>
</td>
</tr>
<?php endforeach; ?>