Merge pull request 'Fix brainstorm delete and plan button' (#77) from dev into main

Reviewed-on: #77
This commit was merged in pull request #77.
This commit is contained in:
2026-09-14 08:29:13 +00:00
4 changed files with 288 additions and 22 deletions
+47
View File
@@ -368,6 +368,53 @@ try {
exit; exit;
} }
// 5. Brainstormsessie verwijderen (inclusief bijbehorende kaarten)
if ($action === 'delete_session') {
$data = json_decode(file_get_contents('php://input'), true) ?: $_POST;
$sessionId = (int)($data['session_id'] ?? 0);
if (!$sessionId) {
echo json_encode(['success' => false, 'error' => 'Geen geldig sessie ID opgegeven.']);
exit;
}
$stmtCheck = $db->prepare("SELECT id, title, created_by_id FROM brainstorm_sessions WHERE id = ?");
$stmtCheck->execute([$sessionId]);
$session = $stmtCheck->fetch();
if (!$session) {
echo json_encode(['success' => false, 'error' => 'Brainstormsessie niet gevonden.']);
exit;
}
$isCreator = ((int)$session['created_by_id'] === (int)$user['id']);
$isAdmin = ($user['role'] === 'ADMIN');
if (!$isCreator && !$isAdmin) {
http_response_code(403);
echo json_encode(['success' => false, 'error' => 'Alleen de maker van deze sessie of een beheerder kan deze verwijderen.']);
exit;
}
$db->beginTransaction();
try {
// Verwijder kaarten behorend bij deze sessie
$stmtDelCards = $db->prepare("DELETE FROM brainstorm_cards WHERE session_id = ?");
$stmtDelCards->execute([$sessionId]);
// Verwijder de sessie zelf
$stmtDelSession = $db->prepare("DELETE FROM brainstorm_sessions WHERE id = ?");
$stmtDelSession->execute([$sessionId]);
$db->commit();
echo json_encode(['success' => true, 'message' => 'Brainstormsessie en alle bijbehorende kaarten zijn definitief verwijderd.']);
exit;
} catch (Throwable $t) {
if ($db->inTransaction()) $db->rollBack();
throw $t;
}
}
echo json_encode(['error' => 'Onbekende actie']); echo json_encode(['error' => 'Onbekende actie']);
} catch (Exception $e) { } catch (Exception $e) {
if ($db->inTransaction()) $db->rollBack(); if ($db->inTransaction()) $db->rollBack();
+118 -7
View File
@@ -95,9 +95,11 @@ require_once __DIR__ . '/includes/header.php';
</button> </button>
</div> </div>
<?php else: ?> <?php else: ?>
<?php foreach ($sessions as $sess): ?> <?php foreach ($sessions as $sess):
<a href="/brainstorm_canvas.php?id=<?= $sess['id'] ?>" class="group fociz-card-interactive p-5 flex flex-col justify-between hover:border-indigo-400 dark:hover:border-indigo-500/60"> $canDelete = ($currentUser['role'] === 'ADMIN' || (int)$sess['created_by_id'] === (int)$currentUser['id']);
<div> ?>
<div class="group fociz-card-interactive p-5 flex flex-col justify-between hover:border-indigo-400 dark:hover:border-indigo-500/60 relative">
<a href="/brainstorm_canvas.php?id=<?= $sess['id'] ?>" class="block flex-1">
<div class="flex items-center justify-between mb-3"> <div class="flex items-center justify-between mb-3">
<span class="px-2.5 py-0.5 rounded-lg bg-indigo-50 dark:bg-indigo-500/10 border border-indigo-200 dark:border-indigo-500/20 text-indigo-700 dark:text-indigo-400 font-semibold text-[11px]"> <span class="px-2.5 py-0.5 rounded-lg bg-indigo-50 dark:bg-indigo-500/10 border border-indigo-200 dark:border-indigo-500/20 text-indigo-700 dark:text-indigo-400 font-semibold text-[11px]">
<?= htmlspecialchars($sess['theme']) ?> <?= htmlspecialchars($sess['theme']) ?>
@@ -117,16 +119,28 @@ require_once __DIR__ . '/includes/header.php';
<?= htmlspecialchars($sess['description']) ?> <?= htmlspecialchars($sess['description']) ?>
</p> </p>
<?php endif; ?> <?php endif; ?>
</div> </a>
<div class="mt-5 pt-4 border-t border-slate-100 dark:border-slate-800/80 flex items-center justify-between text-xs text-slate-500 dark:text-slate-400"> <div class="mt-5 pt-4 border-t border-slate-100 dark:border-slate-800/80 flex items-center justify-between text-xs text-slate-500 dark:text-slate-400">
<span class="truncate">Door <?= htmlspecialchars($sess['creator_name']) ?></span> <span class="truncate">Door <?= htmlspecialchars($sess['creator_name']) ?></span>
<div class="flex items-center space-x-1 text-indigo-600 dark:text-indigo-400 group-hover:translate-x-1 transition font-bold flex-shrink-0 ml-2"> <div class="flex items-center space-x-2 flex-shrink-0 ml-2">
<?php if ($canDelete): ?>
<button
type="button"
onclick="promptDeleteSession(event, <?= (int)$sess['id'] ?>, '<?= htmlspecialchars(addslashes($sess['title']), ENT_QUOTES) ?>', <?= (int)$sess['cards_count'] ?>)"
class="p-1.5 rounded-lg text-slate-400 hover:text-rose-600 dark:hover:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-500/10 transition cursor-pointer"
title="Sessie verwijderen"
>
<i data-lucide="trash-2" class="w-4 h-4"></i>
</button>
<?php endif; ?>
<a href="/brainstorm_canvas.php?id=<?= $sess['id'] ?>" class="flex items-center space-x-1 text-indigo-600 dark:text-indigo-400 group-hover:translate-x-1 transition font-bold">
<span>Open canvas</span> <span>Open canvas</span>
<i data-lucide="arrow-right" class="w-3.5 h-3.5"></i> <i data-lucide="arrow-right" class="w-3.5 h-3.5"></i>
</div>
</div>
</a> </a>
</div>
</div>
</div>
<?php endforeach; ?> <?php endforeach; ?>
<?php endif; ?> <?php endif; ?>
</div> </div>
@@ -192,11 +206,108 @@ require_once __DIR__ . '/includes/header.php';
</div> </div>
</div> </div>
<!-- Modal: Sessie Verwijderen Bevestiging -->
<div id="deleteSessionModal" onclick="if(event.target === this) closeDeleteSessionModal()" class="hidden fixed inset-0 z-50 bg-slate-950/70 backdrop-blur-sm flex items-center justify-center p-4">
<div class="fociz-card p-6 sm:p-7 shadow-2xl max-w-md w-full space-y-4">
<div class="flex items-start space-x-3.5 pb-2">
<div class="w-10 h-10 rounded-xl bg-rose-50 dark:bg-rose-500/10 border border-rose-200 dark:border-rose-500/20 text-rose-600 dark:text-rose-400 flex items-center justify-center flex-shrink-0">
<i data-lucide="alert-triangle" class="w-5 h-5"></i>
</div>
<div>
<h3 class="text-base font-bold text-slate-900 dark:text-white">Brainstormsessie verwijderen</h3>
<p class="text-xs text-slate-500 dark:text-slate-400 mt-1">
Weet u zeker dat u deze sessie wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.
</p>
</div>
</div>
<div class="p-3.5 rounded-xl bg-rose-50/60 dark:bg-rose-950/20 border border-rose-200/80 dark:border-rose-900/40 text-xs text-rose-800 dark:text-rose-300 space-y-1">
<p class="font-bold text-slate-900 dark:text-white" id="deleteSessionTitle">—</p>
<p id="deleteSessionWarning" class="text-[11px] text-rose-700 dark:text-rose-400">
Alle bijbehorende ideeën, knelpunten en kaarten worden definitief gewist.
</p>
</div>
<div class="flex space-x-2 pt-2 border-t border-slate-100 dark:border-slate-800/80">
<button type="button" onclick="closeDeleteSessionModal()" class="flex-1 px-4 py-2.5 bg-slate-100 hover:bg-slate-200 dark:bg-slate-800 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-300 rounded-xl text-xs font-semibold transition cursor-pointer">
Annuleren
</button>
<button type="button" id="btnConfirmDeleteSession" onclick="executeDeleteSession()" class="flex-1 px-4 py-2.5 bg-rose-600 hover:bg-rose-500 text-white font-bold rounded-xl text-xs transition cursor-pointer shadow-xs flex items-center justify-center space-x-1.5">
<i data-lucide="trash-2" class="w-4 h-4"></i>
<span>Verwijderen</span>
</button>
</div>
</div>
</div>
<script> <script>
let sessionToDeleteId = null;
function promptDeleteSession(e, sessionId, sessionTitle, cardsCount) {
if (e) {
e.preventDefault();
e.stopPropagation();
}
sessionToDeleteId = sessionId;
document.getElementById('deleteSessionTitle').textContent = sessionTitle || 'Brainstormsessie';
const warningEl = document.getElementById('deleteSessionWarning');
if (cardsCount > 0) {
warningEl.textContent = `Let op: Deze sessie bevat ${cardsCount} brainstormkaart(en). Alle kaarten worden definitief verwijderd.`;
} else {
warningEl.textContent = 'Alle inhoud van deze sessie wordt definitief gewist.';
}
const modal = document.getElementById('deleteSessionModal');
modal.classList.remove('hidden');
modal.classList.add('flex');
if (window.lucide) lucide.createIcons();
}
function closeDeleteSessionModal() {
sessionToDeleteId = null;
const modal = document.getElementById('deleteSessionModal');
modal.classList.add('hidden');
modal.classList.remove('flex');
}
async function executeDeleteSession() {
if (!sessionToDeleteId) return;
const btn = document.getElementById('btnConfirmDeleteSession');
const origHtml = btn.innerHTML;
btn.disabled = true;
btn.innerHTML = '<i data-lucide="loader-2" class="w-4 h-4 animate-spin"></i><span>Verwijderen...</span>';
if (window.lucide) lucide.createIcons();
try {
const res = await fetch('/api/brainstorm.php?action=delete_session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ session_id: sessionToDeleteId })
});
const data = await res.json();
if (data.success) {
closeDeleteSessionModal();
window.location.reload();
} else {
alert('Fout bij verwijderen: ' + (data.error || 'Onbekende fout'));
btn.disabled = false;
btn.innerHTML = origHtml;
if (window.lucide) lucide.createIcons();
}
} catch (err) {
alert('Netwerkfout bij verwijderen: ' + err.message);
btn.disabled = false;
btn.innerHTML = origHtml;
if (window.lucide) lucide.createIcons();
}
}
document.addEventListener('keydown', (e) => { document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') { if (e.key === 'Escape') {
const modal = document.getElementById('newSessionModal'); const modal = document.getElementById('newSessionModal');
if (modal) modal.classList.add('hidden'); if (modal) modal.classList.add('hidden');
closeDeleteSessionModal();
} }
}); });
</script> </script>
+85
View File
@@ -189,6 +189,12 @@ $categories = [
<i data-lucide="map" class="w-4 h-4"></i> <i data-lucide="map" class="w-4 h-4"></i>
<span>Zet om naar Roadmap</span> <span>Zet om naar Roadmap</span>
</button> </button>
<?php if (($currentUser['role'] ?? '') === 'ADMIN' || (int)$session['created_by_id'] === (int)$userId): ?>
<button onclick="promptDeleteCurrentCanvasSession()" class="p-2 rounded-xl text-slate-400 hover:text-rose-600 dark:hover:text-rose-400 hover:bg-rose-50 dark:hover:bg-rose-500/10 border border-transparent hover:border-rose-200 dark:hover:border-rose-900/40 transition cursor-pointer" title="Brainstormsessie verwijderen">
<i data-lucide="trash-2" class="w-4 h-4"></i>
</button>
<?php endif; ?>
</div> </div>
</div> </div>
@@ -783,6 +789,37 @@ $categories = [
</button> </button>
</div> </div>
</div> </div>
<!-- Modal: Sessie Verwijderen Bevestiging -->
<div id="deleteCanvasSessionModal" onclick="if(event.target === this) closeDeleteCanvasSessionModal()" class="hidden fixed inset-0 z-50 bg-slate-950/70 backdrop-blur-sm flex items-center justify-center p-4">
<div class="fociz-card p-6 sm:p-7 shadow-2xl max-w-md w-full space-y-4">
<div class="flex items-start space-x-3.5 pb-2">
<div class="w-10 h-10 rounded-xl bg-rose-50 dark:bg-rose-500/10 border border-rose-200 dark:border-rose-500/20 text-rose-600 dark:text-rose-400 flex items-center justify-center flex-shrink-0">
<i data-lucide="alert-triangle" class="w-5 h-5"></i>
</div>
<div>
<h3 class="text-base font-bold text-slate-900 dark:text-white">Brainstormsessie verwijderen</h3>
<p class="text-xs text-slate-500 dark:text-slate-400 mt-1">
Weet u zeker dat u deze sessie wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.
</p>
</div>
</div>
<div class="p-3.5 rounded-xl bg-rose-50/60 dark:bg-rose-950/20 border border-rose-200/80 dark:border-rose-900/40 text-xs text-rose-800 dark:text-rose-300 space-y-1">
<p class="font-bold text-slate-900 dark:text-white"><?= htmlspecialchars($session['title']) ?></p>
<p class="text-[11px] text-rose-700 dark:text-rose-400">
Let op: Alle <?= count($cards) ?> brainstormkaart(en) en bijbehorende inhoud worden definitief verwijderd.
</p>
</div>
<div class="flex space-x-2 pt-2 border-t border-slate-100 dark:border-slate-800/80">
<button type="button" onclick="closeDeleteCanvasSessionModal()" class="flex-1 px-4 py-2.5 bg-slate-100 hover:bg-slate-200 dark:bg-slate-800 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-300 rounded-xl text-xs font-semibold transition cursor-pointer">
Annuleren
</button>
<button type="button" id="btnConfirmDeleteCanvasSession" onclick="executeDeleteCanvasSession()" class="flex-1 px-4 py-2.5 bg-rose-600 hover:bg-rose-500 text-white font-bold rounded-xl text-xs transition cursor-pointer shadow-xs flex items-center justify-center space-x-1.5">
<i data-lucide="trash-2" class="w-4 h-4"></i>
<span>Verwijderen</span>
</button>
</div>
</div> </div>
</div> </div>
@@ -1745,12 +1782,60 @@ async function submitBreakdownExport() {
if (window.lucide) lucide.createIcons(); if (window.lucide) lucide.createIcons();
} }
} }
function promptDeleteCurrentCanvasSession() {
const modal = document.getElementById('deleteCanvasSessionModal');
if (modal) {
modal.classList.remove('hidden');
modal.classList.add('flex');
}
if (window.lucide) lucide.createIcons();
}
function closeDeleteCanvasSessionModal() {
const modal = document.getElementById('deleteCanvasSessionModal');
if (modal) {
modal.classList.add('hidden');
modal.classList.remove('flex');
}
}
async function executeDeleteCanvasSession() {
const btn = document.getElementById('btnConfirmDeleteCanvasSession');
const origHtml = btn.innerHTML;
btn.disabled = true;
btn.innerHTML = '<i data-lucide="loader-2" class="w-4 h-4 animate-spin"></i><span>Verwijderen...</span>';
if (window.lucide) lucide.createIcons();
try {
const res = await fetch('/api/brainstorm.php?action=delete_session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ session_id: <?= (int)$sessionId ?> })
});
const data = await res.json();
if (data.success) {
window.location.href = '/brainstorm.php';
} else {
alert('Fout bij verwijderen: ' + (data.error || 'Onbekende fout'));
btn.disabled = false;
btn.innerHTML = origHtml;
if (window.lucide) lucide.createIcons();
}
} catch (err) {
alert('Netwerkfout bij verwijderen: ' + err.message);
btn.disabled = false;
btn.innerHTML = origHtml;
if (window.lucide) lucide.createIcons();
}
}
document.addEventListener('keydown', (e) => { document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') { if (e.key === 'Escape') {
closeAddCardModal(); closeAddCardModal();
closeConvertModal(); closeConvertModal();
closeAiBreakdownModal(); closeAiBreakdownModal();
closeDeleteCanvasSessionModal();
} }
}); });
</script> </script>
+37 -14
View File
@@ -1444,8 +1444,12 @@ for ($h = $startHour; $h <= $endHour; $h++) {
<div class="flex items-center space-x-1 flex-shrink-0"> <div class="flex items-center space-x-1 flex-shrink-0">
<?php $isMailPlanned = !empty($plannedExternalIds[$mail['id']]); ?> <?php $isMailPlanned = !empty($plannedExternalIds[$mail['id']]); ?>
<button <button
onclick="openPlanEmailDirect('<?= htmlspecialchars(addslashes($mail['id'])) ?>', '<?= htmlspecialchars(addslashes($mail['subject'])) ?>', '<?= htmlspecialchars(addslashes($mail['sender_name'])) ?>', '<?= htmlspecialchars(addslashes($mail['web_link'] ?? '')) ?>', '<?= htmlspecialchars(addslashes($mail['body_preview'] ?? '')) ?>')" onclick="handleEmailPlanClick(this, event)"
data-mail-id="<?= htmlspecialchars($mail['id']) ?>" data-mail-id="<?= htmlspecialchars($mail['id'] ?? '', ENT_QUOTES) ?>"
data-mail-subject="<?= htmlspecialchars($mail['subject'] ?? '', ENT_QUOTES) ?>"
data-mail-sender="<?= htmlspecialchars($mail['sender_name'] ?? 'Outlook Mail', ENT_QUOTES) ?>"
data-mail-link="<?= htmlspecialchars($mail['web_link'] ?? '', ENT_QUOTES) ?>"
data-mail-preview="<?= htmlspecialchars(mb_substr($mail['body_preview'] ?? '', 0, 300), ENT_QUOTES) ?>"
class="plan-btn-mail flex items-center space-x-1 text-[11px] <?= $isMailPlanned ? 'font-bold text-white bg-emerald-600 hover:bg-emerald-500 border border-emerald-600 shadow-xs' : 'font-semibold text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300 bg-indigo-50 dark:bg-indigo-500/10 hover:bg-indigo-100 dark:hover:bg-indigo-500/20 border border-indigo-200 dark:border-indigo-500/20' ?> px-2.5 py-1 rounded-lg transition cursor-pointer" class="plan-btn-mail flex items-center space-x-1 text-[11px] <?= $isMailPlanned ? 'font-bold text-white bg-emerald-600 hover:bg-emerald-500 border border-emerald-600 shadow-xs' : 'font-semibold text-indigo-600 dark:text-indigo-400 hover:text-indigo-700 dark:hover:text-indigo-300 bg-indigo-50 dark:bg-indigo-500/10 hover:bg-indigo-100 dark:hover:bg-indigo-500/20 border border-indigo-200 dark:border-indigo-500/20' ?> px-2.5 py-1 rounded-lg transition cursor-pointer"
title="<?= $isMailPlanned ? 'Deze e-mail is al ingepland als dagtaak (klik om opnieuw/anders in te plannen)' : 'Plan deze e-mail direct in als dagtaak' ?>" title="<?= $isMailPlanned ? 'Deze e-mail is al ingepland als dagtaak (klik om opnieuw/anders in te plannen)' : 'Plan deze e-mail direct in als dagtaak' ?>"
> >
@@ -2858,9 +2862,18 @@ document.addEventListener('click', function(e) {
} }
}); });
// --- Globale Planner Status & Naadloos AJAX Datumbeheer ---
let activePlannerDate = '<?= $selectedDate ?>';
let weekStartDate = '<?= $weekStart ?>';
let weekEndDate = '<?= $weekEnd ?>';
let currentSyncHash = '<?= $initialSyncHash ?? '' ?>';
let isDateSwitching = false;
const FOCIZ_WORKDAY_START = '<?= $workdayStartStr ?>';
const FOCIZ_WORKDAY_END = '<?= $workdayEndStr ?>';
// --- Fociz Widget Beheer & Configuratielogica (v2.0) --- // --- Fociz Widget Beheer & Configuratielogica (v2.0) ---
let focizWidgets = <?= json_encode(array_values($userWidgetLayout), JSON_UNESCAPED_UNICODE) ?>; let focizWidgets = <?= json_encode(array_values($userWidgetLayout), JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) ?>;
const defaultWidgetLayout = <?= json_encode(array_values($availableWidgets), JSON_UNESCAPED_UNICODE) ?>; const defaultWidgetLayout = <?= json_encode(array_values($availableWidgets), JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) ?>;
// --- AI Dagbriefing (laden bij pagina-open, alleen voor vandaag) --- // --- AI Dagbriefing (laden bij pagina-open, alleen voor vandaag) ---
<?php if ($isTodaySelected): ?> <?php if ($isTodaySelected): ?>
@@ -3132,7 +3145,7 @@ function showWidgetToast(htmlMessage, type = 'success', duration = 3500) {
} }
// --- Agenda Dagen Blokkeren & Rechtermuisklik Context Menu --- // --- Agenda Dagen Blokkeren & Rechtermuisklik Context Menu ---
const CAL_BLOCK_REASONS = <?= json_encode(array_values(array_filter($calendarBlockReasons, fn($r) => !empty($r['is_active'])))) ?>; const CAL_BLOCK_REASONS = <?= json_encode(array_values(array_filter($calendarBlockReasons, fn($r) => !empty($r['is_active']))), JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT) ?>;
const CAL_BLOCK_DEFAULT_TITLES = {}; const CAL_BLOCK_DEFAULT_TITLES = {};
if (Array.isArray(CAL_BLOCK_REASONS)) { if (Array.isArray(CAL_BLOCK_REASONS)) {
CAL_BLOCK_REASONS.forEach(r => { CAL_BLOCK_REASONS.forEach(r => {
@@ -5017,6 +5030,9 @@ function openJiraPlanModal(issueKey, fallbackData = null) {
if (descChevron) descChevron.classList.remove('rotate-180'); if (descChevron) descChevron.classList.remove('rotate-180');
if (descLabel) descLabel.textContent = 'Inhoud van het item bekijken'; if (descLabel) descLabel.textContent = 'Inhoud van het item bekijken';
// Target datum: actieve planner datum of vandaag
const targetDate = (typeof activePlannerDate !== 'undefined' && activePlannerDate) ? activePlannerDate : new Date().toISOString().slice(0, 10);
// Controleer of dit ticket al is ingepland // Controleer of dit ticket al is ingepland
const existingTask = (typeof plannedExternalTasksMap !== 'undefined' && plannedExternalTasksMap[issue.key]) ? plannedExternalTasksMap[issue.key] : null; const existingTask = (typeof plannedExternalTasksMap !== 'undefined' && plannedExternalTasksMap[issue.key]) ? plannedExternalTasksMap[issue.key] : null;
const isAlreadyPlanned = Boolean(existingTask); const isAlreadyPlanned = Boolean(existingTask);
@@ -5448,6 +5464,22 @@ function toggleEmailPlanPreview() {
if (typeof lucide !== 'undefined') lucide.createIcons(); if (typeof lucide !== 'undefined') lucide.createIcons();
} }
function handleEmailPlanClick(btn, event = null) {
if (event) {
try {
event.stopPropagation();
event.preventDefault();
} catch (_) {}
}
if (!btn) return;
const mailId = btn.getAttribute('data-mail-id') || '';
const subject = btn.getAttribute('data-mail-subject') || '';
const sender = btn.getAttribute('data-mail-sender') || 'Outlook Mail';
const link = btn.getAttribute('data-mail-link') || '';
const preview = btn.getAttribute('data-mail-preview') || '';
openPlanEmailDirect(mailId, subject, sender, link, preview);
}
function openPlanEmailDirect(mailId, subject, sender, webLink, bodyPreview = '') { function openPlanEmailDirect(mailId, subject, sender, webLink, bodyPreview = '') {
_emailPlanCurrentData = { mailId, subject, sender, webLink, bodyPreview }; _emailPlanCurrentData = { mailId, subject, sender, webLink, bodyPreview };
@@ -5836,15 +5868,6 @@ function resetTimer() {}
function saveTimerStateBeforeReload() {} function saveTimerStateBeforeReload() {}
function restoreTimerStateIfAny() {} function restoreTimerStateIfAny() {}
// --- Globale Planner Status & Naadloos AJAX Datumbeheer ---
let activePlannerDate = '<?= $selectedDate ?>';
let weekStartDate = '<?= $weekStart ?>';
let weekEndDate = '<?= $weekEnd ?>';
let currentSyncHash = '<?= $initialSyncHash ?? '' ?>';
let isDateSwitching = false;
const FOCIZ_WORKDAY_START = '<?= $workdayStartStr ?>';
const FOCIZ_WORKDAY_END = '<?= $workdayEndStr ?>';
/** /**
* Controleert of een gepland tijdstip buiten de gezette werktijden of in het weekend valt * Controleert of een gepland tijdstip buiten de gezette werktijden of in het weekend valt
*/ */