From 26670fcca5e6992aebdc2303616c45ff95af0016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Wed, 1 Jul 2026 23:36:26 +0300 Subject: [PATCH] feat: implement internship journal approval status tracking and add single-day printing functionality --- app/Http/Controllers/CareerController.php | 11 +++ .../front/career/intern_dashboard.blade.php | 68 ++++++++++++++++--- resources/views/front/career/print.blade.php | 4 +- 3 files changed, 70 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/CareerController.php b/app/Http/Controllers/CareerController.php index 398ec8d..4599720 100644 --- a/app/Http/Controllers/CareerController.php +++ b/app/Http/Controllers/CareerController.php @@ -494,6 +494,8 @@ class CareerController extends Controller ], [ 'content' => $request->content, 'is_retroactive' => $isRetroactive, + 'supervisor_approved' => false, + 'supervisor_name' => null, ]); return response()->json([ @@ -521,6 +523,15 @@ class CareerController extends Controller } $days = self::getInternshipDates($intern->internship_start_date, $intern->internship_total_days); + + $dayFilter = $request->query('day'); + if ($dayFilter) { + $days = array_filter($days, function($d) use ($dayFilter) { + return $d['day_number'] == $dayFilter; + }); + $days = array_values($days); + } + $savedEntries = $intern->journalEntries()->get()->keyBy('day_number'); return view('front.career.print', [ diff --git a/resources/views/front/career/intern_dashboard.blade.php b/resources/views/front/career/intern_dashboard.blade.php index 59dd879..c462f0e 100644 --- a/resources/views/front/career/intern_dashboard.blade.php +++ b/resources/views/front/career/intern_dashboard.blade.php @@ -684,6 +684,7 @@ $dayDate = $d['date']; $dayDateFormatted = $d['formatted_date']; $hasSaved = isset($savedEntries[$dayNum]) && trim($savedEntries[$dayNum]->content) !== ''; + $isApproved = isset($savedEntries[$dayNum]) && $savedEntries[$dayNum]->supervisor_approved; @endphp @endforeach @@ -708,17 +715,25 @@
-
+
1. Gün +
- @if($intern->github_repo) - - @endif +
+ @if($intern->github_repo) + + @endif + + +
@@ -900,6 +915,29 @@ } } + function updateEditorStatusBadge(isApproved, hasSaved) { + const statusSpan = document.getElementById('editor-day-status'); + if (!statusSpan) return; + + if (isApproved) { + statusSpan.textContent = 'ONAYLANDI'; + statusSpan.className = 'inline-flex px-2 py-0.5 rounded-full text-[10px] font-extrabold uppercase bg-green-500 text-white border border-green-600 ml-2'; + } else if (hasSaved) { + statusSpan.textContent = 'ONAY BEKLİYOR'; + statusSpan.className = 'inline-flex px-2 py-0.5 rounded-full text-[10px] font-extrabold uppercase bg-amber-50 text-amber-700 border border-amber-200 ml-2'; + } else { + statusSpan.textContent = ''; + statusSpan.className = 'hidden'; + } + } + + function printActiveDay() { + const btn = document.getElementById(`btn-day-${activeDayIdx}`); + if (!btn) return; + const dayNum = btn.getAttribute('data-day-num'); + window.open(`{{ route('intern.print-journal') }}?size=a4&day=${dayNum}`, '_blank'); + } + function appendCommitToQuill(sha, time, msg) { const escapedMsg = msg.replace(//g, ">"); const commitHtml = `
  • [${time}] (${sha}) ${escapedMsg}
  • `; @@ -946,6 +984,7 @@ const dateVal = newBtn.getAttribute('data-date'); const dateFormatted = newBtn.getAttribute('data-formatted-date'); const savedContent = newBtn.getAttribute('data-saved-content'); + const isApproved = newBtn.getAttribute('data-approved') === '1'; document.getElementById('editor-day-title').textContent = `${dayNum}. Gün`; document.getElementById('editor-day-date').textContent = dateFormatted; @@ -956,6 +995,9 @@ } document.getElementById('save-status').textContent = ''; hideFallbackCommits(); + + const hasSaved = savedContent && savedContent.trim() !== '' && savedContent !== '


    '; + updateEditorStatusBadge(isApproved, hasSaved); // Future validation const dateParts = dateVal.split('-'); @@ -1185,17 +1227,21 @@ statusText.className = "text-xs font-semibold text-green-600"; btn.setAttribute('data-saved-content', contentVal); + btn.setAttribute('data-approved', '0'); const badge = document.getElementById(`badge-day-${activeDayIdx}`); + const hasContent = contentVal.trim() !== '' && contentVal !== '


    '; if (badge) { - if (contentVal.trim() !== '') { + if (hasContent) { badge.textContent = 'DOLU'; - badge.className = "inline-flex px-2 py-0.5 rounded-lg text-[9px] font-extrabold uppercase bg-green-50 text-green-700 border border-green-200"; + badge.className = "inline-flex px-2 py-0.5 rounded-lg text-[9px] font-extrabold uppercase bg-amber-50 text-amber-700 border border-amber-200"; } else { badge.textContent = 'BOŞ'; badge.className = "inline-flex px-2 py-0.5 rounded-lg text-[9px] font-extrabold uppercase bg-slate-50 text-slate-400 border border-slate-200"; } } + + updateEditorStatusBadge(false, hasContent); } else { statusText.textContent = data.message || "Kaydedilemedi."; statusText.className = "text-xs font-semibold text-red-600"; diff --git a/resources/views/front/career/print.blade.php b/resources/views/front/career/print.blade.php index 50ba1a6..4712f50 100644 --- a/resources/views/front/career/print.blade.php +++ b/resources/views/front/career/print.blade.php @@ -331,8 +331,8 @@ Panele Dön
    - A4 Boyutu - A5 Boyutu + A4 Boyutu + A5 Boyutu