diff --git a/planner.php b/planner.php index 3f4b3cc..9abe6b0 100644 --- a/planner.php +++ b/planner.php @@ -11,7 +11,7 @@ if ($isAjaxRequest) { require_once __DIR__ . '/includes/auth.php'; $currentUser = require_auth(true); } else { - $pageTitle = 'Fociz β€” Planning & Structuur'; + $pageTitle = 'Fociz'; require_once __DIR__ . '/includes/header.php'; } @@ -231,6 +231,69 @@ try { error_log("Fout bij ophalen Jira issues: " . $e->getMessage()); } +// 5b. Haal recente e-mails op voor de Outlook E-mail Widget +$recentEmails = []; +$unreadEmailCount = 0; +try { + $mailData = microsoft_fetch_inbox_messages($userId, 5); + $recentEmails = $mailData['messages'] ?? []; + $unreadEmailCount = (int)($mailData['unread_count'] ?? 0); +} catch (Throwable $e) { + error_log("Fout bij ophalen recente e-mails in planner: " . $e->getMessage()); +} + +// 5c. Widget Catalogus & Raster Indeling (Fociz v2.0) +$availableWidgets = [ + 'daily_goal' => ['id' => 'daily_goal', 'title' => 'Dagfocus & Hoofddoel', 'category' => 'Planning', 'icon' => 'target', 'enabled' => true, 'col_span' => 12, 'order' => 1, 'desc' => 'Centraal focusdoel voor de dag met snelle tellers'], + 'tasks' => ['id' => 'tasks', 'title' => 'Dagtaken & Prioriteiten', 'category' => 'Planning', 'icon' => 'check-square', 'enabled' => true, 'col_span' => 7, 'order' => 2, 'desc' => 'Volledige takenlijst met P1/P2/P3, tijdvakken en Outlook synchronisatie'], + 'timeline' => ['id' => 'timeline', 'title' => 'Tijdlijn & Time-blocking', 'category' => 'Agenda', 'icon' => 'clock', 'enabled' => true, 'col_span' => 5, 'order' => 3, 'desc' => 'Visueel urenoverzicht met lunchpauze, afspraken en AI Slim Indelen'], + 'outlook_mail' => ['id' => 'outlook_mail', 'title' => 'Outlook E-mail Widget', 'category' => 'Communicatie', 'icon' => 'mail', 'enabled' => true, 'col_span' => 6, 'order' => 4, 'desc' => 'Inkomende e-mails direct inzien en met 1 klik inplannen als taak'], + 'jira_queue' => ['id' => 'jira_queue', 'title' => 'Jira Tickets & Wachtrijen', 'category' => 'Ontwikkeling', 'icon' => 'layers', 'enabled' => true, 'col_span' => 6, 'order' => 5, 'desc' => 'Openstaande Jira tickets (DX/SD wachtrijen) met directe importknop'], + 'calendar_meetings' => ['id' => 'calendar_meetings', 'title' => 'Agenda & Teams Meetings', 'category' => 'Agenda', 'icon' => 'video', 'enabled' => true, 'col_span' => 6, 'order' => 6, 'desc' => 'Vandaag geplande afspraken met 1-klik Teams deelnemen knop'], + 'scratchpad' => ['id' => 'scratchpad', 'title' => 'Dagnotities & Kladblok', 'category' => 'Productiviteit', 'icon' => 'edit-3', 'enabled' => true, 'col_span' => 6, 'order' => 7, 'desc' => 'Vrij notitieblok met automatische achtergrond-opslag'], + 'stats' => ['id' => 'stats', 'title' => 'Productiviteit & KPI\'s', 'category' => 'Inzicht', 'icon' => 'bar-chart-2', 'enabled' => true, 'col_span' => 12, 'order' => 8, 'desc' => 'Voortgangsbalk, voltooide taken, focus uren en meeting totalen'], + 'quick_links' => ['id' => 'quick_links', 'title' => 'Snelle Koppelingen & Tools', 'category' => 'Productiviteit', 'icon' => 'external-link', 'enabled' => false, 'col_span' => 6, 'order' => 9, 'desc' => '1-klik snelkoppelingen naar Jira, Teams, Outlook, Azure en documentatie'], + 'habit_tracker' => ['id' => 'habit_tracker', 'title' => 'Dagelijkse Focus Gewoontes', 'category' => 'Productiviteit', 'icon' => 'sparkles', 'enabled' => false, 'col_span' => 6, 'order' => 10, 'desc' => 'Houd gezonde werkgewoontes bij (water drinken, 15m bewegen, inbox zero)'], + 'focus_sound' => ['id' => 'focus_sound', 'title' => 'Focus Sounds & Omgeving', 'category' => 'Productiviteit', 'icon' => 'headphones', 'enabled' => false, 'col_span' => 6, 'order' => 11, 'desc' => 'Rustgevende focus-geluiden voor concentratie en diep werk'], + 'team_status' => ['id' => 'team_status', 'title' => 'Team & Beschikbaarheid', 'category' => 'Team', 'icon' => 'users', 'enabled' => false, 'col_span' => 6, 'order' => 12, 'desc' => 'Overzicht van collega\'s en wie vandaag bereikbaar of in overleg is'] +]; + +$userWidgetLayout = $availableWidgets; +$savedLayoutJson = $currentUser['fociz_widget_layout'] ?? ''; +if (!empty($savedLayoutJson)) { + $decoded = json_decode($savedLayoutJson, true); + if (is_array($decoded)) { + foreach ($decoded as $item) { + $wId = $item['id'] ?? ''; + if (isset($userWidgetLayout[$wId])) { + $userWidgetLayout[$wId]['enabled'] = !empty($item['enabled']); + if (!empty($item['col_span'])) $userWidgetLayout[$wId]['col_span'] = (int)$item['col_span']; + if (isset($item['order'])) $userWidgetLayout[$wId]['order'] = (int)$item['order']; + } + } + } +} +uasort($userWidgetLayout, function($a, $b) { + return ($a['order'] ?? 0) <=> ($b['order'] ?? 0); +}); + +// Bereken dagstatistieken +$completedTasksCount = 0; +$pendingTasksCount = 0; +$highPriorityCount = 0; +$totalPlannedMinutes = 0; +foreach ($tasks as $t) { + if (!empty($t['is_completed'])) { + $completedTasksCount++; + } else { + $pendingTasksCount++; + if (($t['priority'] ?? '') === 'P1') $highPriorityCount++; + } + $totalPlannedMinutes += (int)($t['duration_minutes'] ?: 30); +} +$totalTaskCount = count($tasks); +$taskProgressPercent = $totalTaskCount > 0 ? round(($completedTasksCount / $totalTaskCount) * 100) : 0; + // Filter Outlook events die afkomstig zijn van Fociz taken voor de geselecteerde dag om duplicaten op de tijdlijn te voorkomen $dayOutlookEvents = $outlookEventsByDate[$selectedDate] ?? []; $syncedTaskExternalIds = []; @@ -330,12 +393,20 @@ for ($h = $startHour; $h <= $endHour; $h++) {

- Planning & Structuur + Fociz

+

+ Jouw centrale werkstation • Taken, Agenda, Mail & Jira +

- +
+ +
@@ -353,7 +424,7 @@ for ($h = $startHour; $h <= $endHour; $h++) { - + Jira: tickets @@ -365,37 +436,6 @@ for ($h = $startHour; $h <= $endHour; $h++) {
- - -
-
-
- -
- -
-
-
- -
- -
-
@@ -498,446 +538,877 @@ for ($h = $startHour; $h <= $endHour; $h++) { - -
- - -
- - -
-
-
-
- -
-
-

Focus Modus

-

Pomodoro werkstation & concentratie

-
-
+ +
+ $widget): + if (empty($widget['enabled'])) continue; + $span = (int)($widget['col_span'] ?? 6); + $colClass = match($span) { + 12 => 'lg:col-span-12', + 8 => 'lg:col-span-8', + 7 => 'lg:col-span-7', + 6 => 'lg:col-span-6', + 5 => 'lg:col-span-5', + 4 => 'lg:col-span-4', + default => 'lg:col-span-6' + }; + ?> +
-
- - - -
-
- -
-
-
- - Doeltaak: - Kies een taak hieronder -
- -
-
-
-
- -
- - -
-
- - -
-
-
-

- Dagtaken & Prioriteiten - -

-
- - -
- - -