feat(career): stajyer transkripti ve resmi belgelerin admin ile stajyer panellerine entegrasyonu

- Stajı tamamlanan stajyerlerin repo ve defter tutarlılığı doğrulanarak akademik transkriptleri oluşturuldu
- Stajyer paneline resmi staj belgeleri showcase kartı, transkript sekmesi ve hızlı indirme aksiyonları eklendi
- Admin paneli listesine ve defter inceleme modalına A4/A5 defter, transkript ve repo butonları entegre edildi
- Filament InternApplicationResource tablosuna belge doğrulama ve yazdırma aksiyonları tanımlandı
- Doğrulama sayfası PDF çıktısı ve buton hover renkleri optimize edildi
This commit is contained in:
Ümit Tunç
2026-08-31 12:03:59 +03:00
parent 3747b4e44f
commit 1c002e4437
6 changed files with 510 additions and 29 deletions
@@ -485,24 +485,45 @@ class InternApplicationResource extends Resource
]),
])
->actions([
Action::make('download_cv')
->label(__('career.download_cv'))
->icon('heroicon-o-arrow-down-tray')
->url(fn ($record) => Storage::disk('public')->url($record->cv_path))
->openUrlInNewTab(),
Action::make('download_signed_form')
->label('İmzalı Form İndir')
->icon('heroicon-o-document-check')
->url(fn ($record) => $record->signed_internship_form_path ? Storage::disk('public')->url($record->signed_internship_form_path) : null)
->visible(fn ($record) => !empty($record->signed_internship_form_path))
->openUrlInNewTab(),
Action::make('view_certificate')
->label('Sertifika Doğrulama')
->label('Sertifika & Transkript')
->icon('heroicon-o-academic-cap')
->color('success')
->url(fn ($record) => $record->certificate_code ? route('internship.verify', $record->certificate_code) : null)
->visible(fn ($record) => !empty($record->certificate_code))
->openUrlInNewTab(),
Action::make('print_journal_a4')
->label('A4 Defter')
->icon('heroicon-o-printer')
->color('info')
->url(fn ($record) => route('intern.print-journal') . '?size=a4&intern_id=' . $record->id)
->visible(fn ($record) => !empty($record->internship_total_days))
->openUrlInNewTab(),
Action::make('print_journal_a5')
->label('A5 Defter')
->icon('heroicon-o-printer')
->color('gray')
->url(fn ($record) => route('intern.print-journal') . '?size=a5&intern_id=' . $record->id)
->visible(fn ($record) => !empty($record->internship_total_days))
->openUrlInNewTab(),
Action::make('download_markdown')
->label('Günlük (.md)')
->icon('heroicon-o-arrow-down-tray')
->color('warning')
->url(fn ($record) => route('intern.download-journal') . '?intern_id=' . $record->id)
->visible(fn ($record) => !empty($record->github_repo))
->openUrlInNewTab(),
Action::make('download_signed_form')
->label('İmzalı Form')
->icon('heroicon-o-document-check')
->url(fn ($record) => $record->signed_internship_form_path ? Storage::disk('public')->url($record->signed_internship_form_path) : null)
->visible(fn ($record) => !empty($record->signed_internship_form_path))
->openUrlInNewTab(),
Action::make('download_cv')
->label(__('career.download_cv'))
->icon('heroicon-o-arrow-down-tray')
->url(fn ($record) => Storage::disk('public')->url($record->cv_path))
->openUrlInNewTab(),
DeleteAction::make(),
])
->bulkActions([
@@ -811,6 +811,8 @@ class CareerController extends Controller
'end_date' => $intern->internship_end_date,
'total_days' => $intern->internship_total_days,
'filled_days' => $filledDaysCount,
'certificate_code' => $intern->certificate_code,
'github_repo' => $intern->github_repo,
'notebook_supervisor_signed' => (bool)$intern->notebook_supervisor_signed,
'notebook_supervisor_name' => $intern->notebook_supervisor_name,
'notebook_unit_signed' => (bool)$intern->notebook_unit_signed,
@@ -137,6 +137,38 @@
</div>
</div>
<!-- Official Documents & Quick Exports Card -->
<div class="bg-slate-50 rounded-2xl p-5 border border-slate-200/50 space-y-3">
<h5 class="font-bold text-slate-700 text-xs uppercase tracking-wider flex items-center gap-1.5">
<i class="uil uil-file-download-alt text-emerald-600"></i>
<span>Resmi Belgeler & Çıktılar</span>
</h5>
<div class="space-y-2" id="ijm-documents-container">
<a href="#" id="ijm-btn-verify-cert" target="_blank" class="btn-doc-emerald w-full px-3 py-2 bg-emerald-600 hover:bg-emerald-700 text-white hover:text-white font-extrabold text-xs rounded-xl transition-all flex items-center justify-between shadow-sm">
<span class="flex items-center gap-1.5"><i class="uil uil-award"></i> Sertifika & Transkript</span>
<i class="uil uil-external-link-alt text-xs"></i>
</a>
<div class="grid grid-cols-2 gap-2">
<a href="#" id="ijm-btn-print-a4" target="_blank" class="btn-doc-slate px-3 py-2 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 hover:text-slate-900 font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1">
<i class="uil uil-print text-xs"></i> A4 Defter
</a>
<a href="#" id="ijm-btn-print-a5" target="_blank" class="btn-doc-slate px-3 py-2 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 hover:text-slate-900 font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1">
<i class="uil uil-print text-xs"></i> A5 Defter
</a>
</div>
<a href="#" id="ijm-btn-download-md" target="_blank" class="btn-doc-slate w-full px-3 py-2 bg-slate-100 hover:bg-slate-200 text-slate-700 hover:text-slate-900 font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5">
<i class="uil uil-arrow-down-tray"></i> Günlüğü İndir (.md)
</a>
<a href="#" id="ijm-btn-repo" target="_blank" class="hidden w-full px-3 py-2 bg-slate-900 hover:bg-black text-white hover:text-white font-bold text-xs rounded-xl transition-all items-center justify-center gap-1.5">
<i class="uil uil-github"></i> GitHub Reposu
</a>
</div>
</div>
</div>
<!-- Right Section: Carousel & Navigation (col-span-8) -->
@@ -198,7 +230,13 @@
</div>
<!-- Footer -->
<div class="px-6 py-4 bg-slate-50 border-t border-slate-100 flex items-center justify-end flex-shrink-0">
<div class="px-6 py-4 bg-slate-50 border-t border-slate-100 flex items-center justify-between flex-shrink-0">
<div class="flex items-center gap-2">
<a href="#" id="ijm-footer-verify" target="_blank" class="btn-doc-emerald px-4 py-2 bg-emerald-600 hover:bg-emerald-700 text-white hover:text-white font-bold rounded-xl text-xs transition-colors shadow-sm flex items-center gap-1.5">
<i class="uil uil-award"></i>
<span>Sertifika & Transkript Doğrula</span>
</a>
</div>
<button type="button" onclick="closeInternJournalModal()" class="px-5 py-2.5 bg-slate-800 hover:bg-slate-900 text-white font-bold rounded-xl text-xs transition-colors shadow-md cursor-pointer">Kapat</button>
</div>
</div>
@@ -217,6 +255,63 @@
border-color: #dbeafe;
color: #1e40af !important;
}
/* Prevent theme red text color on link buttons hover */
a.btn-doc-emerald, .btn-doc-emerald {
color: #ffffff !important;
}
a.btn-doc-emerald:hover, a.btn-doc-emerald:focus, .btn-doc-emerald:hover {
color: #ffffff !important;
background-color: #047857 !important;
text-decoration: none !important;
}
a.btn-doc-blue, .btn-doc-blue {
color: #1d4ed8 !important;
}
a.btn-doc-blue:hover, a.btn-doc-blue:focus, .btn-doc-blue:hover {
color: #1e40af !important;
background-color: #dbeafe !important;
text-decoration: none !important;
}
a.btn-doc-slate, .btn-doc-slate {
color: #475569 !important;
}
a.btn-doc-slate:hover, a.btn-doc-slate:focus, .btn-doc-slate:hover {
color: #0f172a !important;
background-color: #e2e8f0 !important;
text-decoration: none !important;
}
a.btn-doc-amber, .btn-doc-amber {
color: #b45309 !important;
}
a.btn-doc-amber:hover, a.btn-doc-amber:focus, .btn-doc-amber:hover {
color: #92400e !important;
background-color: #fef3c7 !important;
text-decoration: none !important;
}
a.btn-doc-green, .btn-doc-green {
color: #15803d !important;
}
a.btn-doc-green:hover, a.btn-doc-green:focus, .btn-doc-green:hover {
color: #166534 !important;
background-color: #dcfce7 !important;
text-decoration: none !important;
}
a.btn-doc-repo, .btn-doc-repo {
color: #2563eb !important;
}
a.btn-doc-repo:hover, a.btn-doc-repo:focus, .btn-doc-repo:hover {
color: #1d4ed8 !important;
text-decoration: underline !important;
}
a.btn-doc-md, .btn-doc-md {
color: #059669 !important;
}
a.btn-doc-md:hover, a.btn-doc-md:focus, .btn-doc-md:hover {
color: #047857 !important;
background-color: #d1fae5 !important;
text-decoration: none !important;
}
</style>
@endpush
@@ -318,6 +413,46 @@
updateSignatureUI('unit', data.intern.notebook_unit_signed, data.intern.notebook_unit_name);
updateSignatureUI('approved', data.intern.notebook_approved, null);
// Setup Official Document URLs
const certCode = data.intern.certificate_code;
const certBtn = document.getElementById('ijm-btn-verify-cert');
const footerCertBtn = document.getElementById('ijm-footer-verify');
if (certCode) {
const verifyUrl = `/staj-dogrulama/${certCode}`;
if (certBtn) {
certBtn.href = verifyUrl;
certBtn.classList.remove('hidden');
}
if (footerCertBtn) {
footerCertBtn.href = verifyUrl;
footerCertBtn.classList.remove('hidden');
}
} else {
if (certBtn) certBtn.classList.add('hidden');
if (footerCertBtn) footerCertBtn.classList.add('hidden');
}
const printA4Btn = document.getElementById('ijm-btn-print-a4');
if (printA4Btn) printA4Btn.href = `/stajyer/defteri-yazdir?size=a4&intern_id=${internId}`;
const printA5Btn = document.getElementById('ijm-btn-print-a5');
if (printA5Btn) printA5Btn.href = `/stajyer/defteri-yazdir?size=a5&intern_id=${internId}`;
const mdBtn = document.getElementById('ijm-btn-download-md');
if (mdBtn) mdBtn.href = `/stajyer/gunluk-indir?intern_id=${internId}`;
const repoBtn = document.getElementById('ijm-btn-repo');
if (repoBtn) {
if (data.intern.github_repo) {
repoBtn.href = data.intern.github_repo;
repoBtn.classList.remove('hidden');
repoBtn.classList.add('flex');
} else {
repoBtn.classList.add('hidden');
repoBtn.classList.remove('flex');
}
}
// Setup carousel slide data
journalEntries = data.entries;
@@ -119,6 +119,69 @@
}
@endphp
<!-- Staj Bitirme Belgeleri & Transkript Showcase Card -->
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
<div class="bg-gradient-to-br from-slate-900 via-slate-800 to-indigo-950 rounded-3xl p-6 md:p-8 shadow-2xl text-white mb-8 relative overflow-hidden border border-slate-700/50">
<!-- Glow accents -->
<div class="absolute -right-20 -top-20 w-80 h-80 bg-blue-500/20 rounded-full blur-3xl pointer-events-none"></div>
<div class="absolute -left-20 -bottom-20 w-80 h-80 bg-emerald-500/20 rounded-full blur-3xl pointer-events-none"></div>
<div class="relative z-10 flex flex-col lg:flex-row justify-between items-start lg:items-center gap-6">
<div class="space-y-3 max-w-2xl">
<div class="flex flex-wrap items-center gap-2">
<span class="px-3 py-1 rounded-full bg-emerald-500/20 border border-emerald-400/40 text-emerald-300 text-xs font-extrabold uppercase tracking-wider flex items-center gap-1.5">
<i class="uil uil-shield-check text-sm"></i> Resmi Onaylı Staj Belgesi
</span>
@if($intern->notebook_supervisor_signed)
<span class="px-3 py-1 rounded-full bg-blue-500/20 border border-blue-400/40 text-blue-300 text-xs font-extrabold uppercase tracking-wider">
Sorumlu Onayladı: {{ $intern->notebook_supervisor_name ?: 'Alperen Trunç' }}
</span>
@endif
@if($intern->notebook_approved)
<span class="px-3 py-1 rounded-full bg-purple-500/20 border border-purple-400/40 text-purple-300 text-xs font-extrabold uppercase tracking-wider">
Defter Genel Onaylı
</span>
@endif
</div>
<h2 class="text-2xl md:text-3xl font-extrabold text-white tracking-tight">
Staj Bitirme Sertifikası & Akademik Transkriptiniz Hazır!
</h2>
<p class="text-sm text-slate-300 leading-relaxed">
Trunçgil Teknoloji bünyesinde başarıyla tamamladığınız staj dönemi için resmi staj bitirme sertifikanız, detaylı akademik performans transkriptiniz ve onaylı staj defteriniz sistemde aktif edilmiştir.
</p>
<div class="text-xs text-slate-400 font-mono flex items-center gap-2">
<span>Doğrulama No:</span>
<strong class="text-emerald-400 bg-slate-800/90 px-3 py-1 rounded-lg border border-slate-700 font-bold tracking-wider">{{ $intern->certificate_code }}</strong>
</div>
</div>
<!-- Action Buttons -->
<div class="flex flex-col sm:flex-row lg:flex-col gap-2.5 w-full lg:w-auto flex-shrink-0">
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="px-6 py-3.5 bg-gradient-to-r from-emerald-500 to-teal-500 hover:from-emerald-600 hover:to-teal-600 text-white font-extrabold text-sm rounded-2xl transition-all shadow-lg shadow-emerald-500/20 flex items-center justify-center gap-2 text-center">
<i class="uil uil-award text-lg"></i>
<span>Sertifika & Transkripti Aç</span>
</a>
<div class="grid grid-cols-2 gap-2">
<a href="{{ route('intern.print-journal') }}?size=a4" target="_blank" class="px-3.5 py-2.5 bg-white/10 hover:bg-white/20 text-white font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5 border border-white/10 text-center">
<i class="uil uil-print"></i> A4 Defter
</a>
<a href="{{ route('intern.print-journal') }}?size=a5" target="_blank" class="px-3.5 py-2.5 bg-white/10 hover:bg-white/20 text-white font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5 border border-white/10 text-center">
<i class="uil uil-print"></i> A5 Defter
</a>
</div>
@if($intern->github_repo)
<a href="{{ route('intern.download-journal') }}" class="px-4 py-2.5 bg-blue-600/80 hover:bg-blue-600 text-white font-bold text-xs rounded-xl transition-all flex items-center justify-center gap-1.5 border border-blue-500/30 text-center">
<i class="uil uil-arrow-down-tray"></i> Günlüğü İndir (.md)
</a>
@endif
</div>
</div>
</div>
@endif
<!-- Stage Timeline Card -->
<div class="bg-white rounded-3xl p-6 md:p-8 shadow-xl border border-slate-100/50 mb-8">
<h3 class="font-bold text-slate-800 text-lg mb-6 pb-2 border-b border-slate-100 flex items-center gap-2">
@@ -394,6 +457,22 @@
<span class="block text-xs text-slate-400 font-semibold mt-0.5">Sitede yayınlanacak bloglar</span>
</div>
</button>
<!-- Menu Item 5: Sertifika & Transkript -->
<button type="button" role="tab" aria-selected="false" data-tab-target="transcript" class="tab-btn w-full flex items-center gap-4 p-3 rounded-2xl text-left transition-all border border-transparent">
<div class="w-10 h-10 rounded-xl bg-slate-50 text-slate-500 flex items-center justify-center text-xl flex-shrink-0 tab-icon">
<i class="uil uil-award"></i>
</div>
<div class="flex-grow">
<div class="flex items-center justify-between">
<span class="block text-sm font-extrabold text-slate-800">Sertifika & Transkript</span>
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
<span class="text-[10px] font-extrabold px-2 py-0.5 rounded-full bg-emerald-100 text-emerald-700">Hazır</span>
@endif
</div>
<span class="block text-xs text-slate-400 font-semibold mt-0.5">Akademik rapor & onay</span>
</div>
</button>
</div>
</div>
</div>
@@ -644,8 +723,72 @@
<i class="uil uil-hourglass"></i>
<span>Bekleniyor</span>
</button>
@endif
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
<!-- Certificate & Transcript Document Card -->
<div class="p-5 rounded-2xl border border-emerald-200 bg-gradient-to-r from-emerald-50/70 to-teal-50/50 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 hover:border-emerald-300 transition-all">
<div class="flex items-center gap-4">
<div class="w-12 h-12 rounded-xl bg-emerald-600 text-white flex items-center justify-center text-2xl flex-shrink-0 shadow-md shadow-emerald-600/20">
<i class="uil uil-award"></i>
</div>
<div>
<div class="flex items-center gap-2">
<h4 class="font-bold text-slate-800 text-base">Staj Bitirme Sertifikası & Akademik Transkript</h4>
<span class="px-2 py-0.5 rounded-md bg-emerald-100 text-emerald-800 text-[10px] font-extrabold uppercase">Onaylı</span>
</div>
<p class="text-xs text-slate-500 mt-0.5">Dijital imzalı staj sertifikanız, akademik transkriptiniz ve performans değerlendirme raporunuz.</p>
<span class="text-[11px] font-mono text-emerald-700 font-bold mt-1 block">Kod: {{ $intern->certificate_code }}</span>
</div>
</div>
<div class="flex items-center gap-2 w-full sm:w-auto">
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="w-full sm:w-auto px-5 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white font-bold rounded-xl text-sm transition-all flex items-center justify-center gap-2 shadow-md shadow-emerald-600/10">
<i class="uil uil-external-link-alt"></i>
<span>Görüntüle / Doğrula</span>
</a>
</div>
</div>
<!-- Approved Notebook Card -->
<div class="p-5 rounded-2xl border border-slate-100 bg-slate-50/50 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 hover:border-slate-200 transition-all">
<div class="flex items-center gap-4">
<div class="w-12 h-12 rounded-xl bg-blue-50 text-blue-600 flex items-center justify-center text-2xl flex-shrink-0">
<i class="uil uil-book-alt"></i>
</div>
<div>
<h4 class="font-bold text-slate-800 text-base">Onaylı Staj Defteri Raporu</h4>
<p class="text-xs text-slate-400 mt-0.5">Sorumlu ve birim imzalarıyla onaylanmış günlük staj defteri çıktısı.</p>
</div>
</div>
<div class="flex items-center gap-2 w-full sm:w-auto">
<a href="{{ route('intern.print-journal') }}?size=a4" target="_blank" class="px-4 py-2.5 bg-blue-600 hover:bg-blue-700 text-white font-bold rounded-xl text-xs transition-all flex items-center justify-center gap-1.5 shadow-sm">
<i class="uil uil-print"></i>
<span>A4 Yazdır</span>
</a>
<a href="{{ route('intern.print-journal') }}?size=a5" target="_blank" class="px-4 py-2.5 bg-slate-800 hover:bg-slate-900 text-white font-bold rounded-xl text-xs transition-all flex items-center justify-center gap-1.5 shadow-sm">
<i class="uil uil-print"></i>
<span>A5 Yazdır</span>
</a>
</div>
</div>
@endif
@if($intern->github_repo)
<!-- Markdown Journal Download Card -->
<div class="p-5 rounded-2xl border border-slate-100 bg-slate-50/50 flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 hover:border-slate-200 transition-all">
<div class="flex items-center gap-4">
<div class="w-12 h-12 rounded-xl bg-purple-50 text-purple-600 flex items-center justify-center text-2xl flex-shrink-0">
<i class="uil uil-file-download-alt"></i>
</div>
<div>
<h4 class="font-bold text-slate-800 text-base">Staj Günlüğü Markdown Dosyası (.md)</h4>
<p class="text-xs text-slate-400 mt-0.5">GitHub deponuzdaki commitler ve günlük defter kayıtlarınızla derlenmiş markdown çıktısı.</p>
</div>
</div>
<a href="{{ route('intern.download-journal') }}" class="w-full sm:w-auto px-5 py-2.5 bg-purple-600 hover:bg-purple-700 text-white font-bold rounded-xl text-sm transition-all flex items-center justify-center gap-2 shadow-sm">
<i class="uil uil-arrow-down-tray"></i>
<span>İndir (.md)</span>
</a>
</div>
@endif
</div>
</div>
@@ -1018,6 +1161,82 @@
</div>
</div>
<!-- Panel 5: Sertifika & Akademik Transkript -->
<div id="transcript-panel" class="tab-panel hidden space-y-6">
<div class="bg-white rounded-3xl p-6 md:p-8 shadow-xl border border-slate-100/50">
<div class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 mb-6 pb-4 border-b border-slate-100">
<div>
<h3 class="font-bold text-slate-800 text-lg flex items-center gap-2">
<i class="uil uil-award text-emerald-600 text-xl"></i>
<span>Staj Bitirme Sertifikası & Akademik Transkript</span>
</h3>
<p class="text-xs text-slate-400 mt-0.5">Trunçgil Teknoloji staj programı kapsamında elde ettiğiniz kazanımlar, teknik değerlendirme ve resmi transkriptiniz.</p>
</div>
@if($intern->certificate_code)
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="px-5 py-2.5 bg-emerald-600 hover:bg-emerald-700 text-white font-extrabold text-xs rounded-xl transition-all shadow-md shadow-emerald-600/20 flex items-center justify-center gap-1.5 whitespace-nowrap">
<i class="uil uil-external-link-alt"></i>
<span>Doğrulama Sayfasını Aç</span>
</a>
@endif
</div>
<!-- Official Verification Status Header -->
<div class="bg-gradient-to-r from-slate-900 to-indigo-950 text-white rounded-2xl p-6 mb-6 shadow-md relative overflow-hidden">
<div class="relative z-10 flex flex-col md:flex-row justify-between items-start md:items-center gap-6">
<div>
<div class="flex flex-wrap items-center gap-2 mb-2">
<span class="px-3 py-1 bg-emerald-500/20 border border-emerald-400/30 text-emerald-300 text-[10px] font-extrabold uppercase rounded-full tracking-wider flex items-center gap-1">
<i class="uil uil-check-circle"></i> Onaylı Belge
</span>
@if($intern->notebook_supervisor_signed)
<span class="px-3 py-1 bg-blue-500/20 border border-blue-400/30 text-blue-300 text-[10px] font-extrabold uppercase rounded-full tracking-wider">
Sorumlu: {{ $intern->notebook_supervisor_name ?: 'Alperen Trunç' }}
</span>
@endif
</div>
<h4 class="text-lg font-extrabold text-white">{{ $intern->name }}</h4>
<p class="text-xs text-slate-300 mt-0.5">{{ \Carbon\Carbon::parse($intern->internship_start_date)->format('d.m.Y') }} - {{ \Carbon\Carbon::parse($intern->internship_end_date)->format('d.m.Y') }} ({{ $intern->internship_total_days }} İş Günü)</p>
</div>
<div class="flex flex-col items-start md:items-end">
<span class="text-[10px] text-slate-400 font-extrabold uppercase tracking-wider block">Güvenli Doğrulama Kodu</span>
<span class="text-sm font-mono font-extrabold text-emerald-400 bg-slate-800/90 px-3 py-1 rounded-lg border border-slate-700 mt-1">{{ $intern->certificate_code }}</span>
</div>
</div>
</div>
<!-- Quick Export Buttons Bar -->
<div class="p-4 rounded-2xl bg-slate-50 border border-slate-100 flex flex-wrap gap-2.5 items-center justify-between mb-6">
<div class="text-xs font-bold text-slate-600 flex items-center gap-1.5">
<i class="uil uil-print text-base text-blue-600"></i>
<span>Hızlı Belge ve Rapor Çıktıları:</span>
</div>
<div class="flex flex-wrap gap-2">
<a href="{{ route('intern.print-journal') }}?size=a4" target="_blank" class="px-3 py-1.5 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 font-bold text-xs rounded-xl transition-all flex items-center gap-1">
<i class="uil uil-print"></i> A4 Defter
</a>
<a href="{{ route('intern.print-journal') }}?size=a5" target="_blank" class="px-3 py-1.5 bg-white hover:bg-slate-100 border border-slate-200 text-slate-700 font-bold text-xs rounded-xl transition-all flex items-center gap-1">
<i class="uil uil-print"></i> A5 Defter
</a>
@if($intern->github_repo)
<a href="{{ route('intern.download-journal') }}" class="px-3 py-1.5 bg-purple-50 hover:bg-purple-100 text-purple-700 border border-purple-200 font-bold text-xs rounded-xl transition-all flex items-center gap-1">
<i class="uil uil-arrow-down-tray"></i> Markdown (.md)
</a>
@endif
</div>
</div>
<!-- Rendered Transcript Markdown Content -->
<div class="transcript-markdown-wrapper p-6 md:p-8 rounded-2xl bg-white border border-slate-200/80 shadow-inner">
<div class="prose max-w-none text-slate-700 leading-relaxed">
{!! new \Illuminate\Support\HtmlString(\Illuminate\Support\Str::markdown($intern->transcript_markdown ?? '')) !!}
</div>
</div>
</div>
</div>
</div>
</div>
@@ -1924,9 +2143,86 @@
.no-scrollbar::-webkit-scrollbar {
display: none;
}
.no-scrollbar {
-ms-overflow-style: none;
scrollbar-width: none;
.transcript-markdown-wrapper table {
width: 100%;
margin-top: 0.75rem;
margin-bottom: 1.25rem;
border-collapse: collapse;
}
.transcript-markdown-wrapper th {
background-color: #f8fafc;
border: 1px solid #e2e8f0;
padding: 8px 12px;
font-size: 12px;
font-weight: 700;
color: #1e293b;
text-align: left;
}
.transcript-markdown-wrapper td {
border: 1px solid #e2e8f0;
padding: 8px 12px;
font-size: 13px;
color: #334155;
}
.transcript-markdown-wrapper h3 {
font-size: 16px;
font-weight: 800;
color: #0f172a;
margin-top: 1rem;
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid #e2e8f0;
}
.transcript-markdown-wrapper h4 {
font-size: 14px;
font-weight: 700;
color: #1e293b;
margin-top: 1.25rem;
margin-bottom: 0.5rem;
}
.transcript-markdown-wrapper blockquote {
border-left: 4px solid #f97316;
padding-left: 1rem;
font-style: italic;
color: #475569;
background: #fff7ed;
padding: 12px;
border-radius: 0 12px 12px 0;
margin: 1rem 0;
}
/* Prevent theme red text color on link buttons hover */
a.btn-doc-emerald, .btn-doc-emerald {
color: #ffffff !important;
}
a.btn-doc-emerald:hover, a.btn-doc-emerald:focus, .btn-doc-emerald:hover {
color: #ffffff !important;
background-color: #047857 !important;
text-decoration: none !important;
}
a.btn-doc-blue, .btn-doc-blue {
color: #1d4ed8 !important;
}
a.btn-doc-blue:hover, a.btn-doc-blue:focus, .btn-doc-blue:hover {
color: #1e40af !important;
background-color: #dbeafe !important;
text-decoration: none !important;
}
a.btn-doc-slate, .btn-doc-slate {
color: #475569 !important;
}
a.btn-doc-slate:hover, a.btn-doc-slate:focus, .btn-doc-slate:hover {
color: #0f172a !important;
background-color: #e2e8f0 !important;
text-decoration: none !important;
}
a.btn-doc-purple, .btn-doc-purple {
color: #ffffff !important;
}
a.btn-doc-purple:hover, a.btn-doc-purple:focus, .btn-doc-purple:hover {
color: #ffffff !important;
background-color: #7e22ce !important;
text-decoration: none !important;
}
</style>
@endpush
@@ -89,22 +89,37 @@
<!-- Documents -->
<td class="py-4 space-y-1">
<div class="flex flex-wrap gap-1">
<div class="flex flex-wrap gap-1.5 max-w-[220px]">
@if($intern->certificate_code && ($intern->notebook_approved || $intern->status === 'accepted'))
<a href="{{ route('internship.verify', $intern->certificate_code) }}" target="_blank" class="btn-doc-emerald px-2 py-1 bg-emerald-600 hover:bg-emerald-700 text-white hover:text-white font-extrabold text-[10px] rounded-lg transition-all flex items-center gap-1 shadow-sm" title="Sertifika ve Akademik Transkript Doğrulama">
<i class="uil uil-award text-xs"></i> Sertifika & Transkript
</a>
@endif
@if($intern->internship_total_days)
<a href="{{ route('intern.print-journal') }}?size=a4&intern_id={{ $intern->id }}" target="_blank" class="btn-doc-blue px-2 py-1 bg-blue-50 hover:bg-blue-100 text-blue-700 hover:text-blue-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="A4 Staj Defterini Yazdır">
<i class="uil uil-print text-xs"></i> A4 Defter
</a>
<a href="{{ route('intern.print-journal') }}?size=a5&intern_id={{ $intern->id }}" target="_blank" class="btn-doc-slate px-2 py-1 bg-slate-100 hover:bg-slate-200 text-slate-700 hover:text-slate-900 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="A5 Staj Defterini Yazdır">
<i class="uil uil-print text-xs"></i> A5 Defter
</a>
@endif
@if($intern->cv_path)
<a href="{{ Storage::disk('public')->url($intern->cv_path) }}" target="_blank" class="px-2 py-1 bg-slate-100 hover:bg-slate-200 text-slate-600 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1">
<i class="uil uil-file-alt"></i> CV
<a href="{{ Storage::disk('public')->url($intern->cv_path) }}" target="_blank" class="btn-doc-slate px-2 py-1 bg-slate-100 hover:bg-slate-200 text-slate-600 hover:text-slate-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="CV İndir">
<i class="uil uil-file-alt text-xs"></i> CV
</a>
@endif
@if($intern->to_be_signed_internship_form_path)
<a href="{{ Storage::disk('public')->url($intern->to_be_signed_internship_form_path) }}" target="_blank" class="px-2 py-1 bg-blue-50 hover:bg-blue-100 text-blue-600 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1">
<i class="uil uil-file-upload"></i> İmzalanacak Form
<a href="{{ Storage::disk('public')->url($intern->to_be_signed_internship_form_path) }}" target="_blank" class="btn-doc-amber px-2 py-1 bg-amber-50 hover:bg-amber-100 text-amber-700 hover:text-amber-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="Stajyerin Yüklediği İmzalanacak Form">
<i class="uil uil-file-upload text-xs"></i> Başvuru Formu
</a>
@endif
@if($intern->signed_internship_form_path)
<a href="{{ Storage::disk('public')->url($intern->signed_internship_form_path) }}" target="_blank" class="px-2 py-1 bg-green-50 hover:bg-green-100 text-green-600 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1">
<i class="uil uil-file-check-alt"></i> İmzalı Form
<a href="{{ Storage::disk('public')->url($intern->signed_internship_form_path) }}" target="_blank" class="btn-doc-green px-2 py-1 bg-green-50 hover:bg-green-100 text-green-700 hover:text-green-800 font-bold text-[10px] rounded-lg transition-all flex items-center gap-1" title="Kurum Tarafından İmzalanmış Staj Formu">
<i class="uil uil-file-check-alt text-xs"></i> İmzalı Form
</a>
@endif
</div>
@@ -114,11 +129,11 @@
<td class="py-4">
@if($intern->github_repo)
<div class="flex flex-col gap-1">
<a href="{{ $intern->github_repo }}" target="_blank" class="text-blue-600 hover:text-blue-800 font-extrabold text-xs inline-flex items-center gap-1">
<a href="{{ $intern->github_repo }}" target="_blank" class="btn-doc-repo text-blue-600 hover:text-blue-800 font-extrabold text-xs inline-flex items-center gap-1">
<i class="uil uil-github"></i> Depoyu Aç
</a>
<!-- If they have repo, we can fetch their journal commits or trigger the controller download markdown -->
<a href="{{ route('intern.download-journal') }}?intern_id={{ $intern->id }}" class="px-2 py-1 bg-emerald-50 hover:bg-emerald-100 text-emerald-600 font-bold text-[10px] rounded-lg transition-all flex items-center justify-center gap-1 w-max">
<a href="{{ route('intern.download-journal') }}?intern_id={{ $intern->id }}" class="btn-doc-md px-2 py-1 bg-emerald-50 hover:bg-emerald-100 text-emerald-600 hover:text-emerald-700 font-bold text-[10px] rounded-lg transition-all flex items-center justify-center gap-1 w-max">
<i class="uil uil-arrow-down-tray"></i> Günlüğü İndir (.md)
</a>
</div>
+15 -3
View File
@@ -3,7 +3,7 @@
@section('content')
<link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@500;700;800;900&family=Inter:wght@300;400;500;600;700&family=Playfair+Display:ital,wght@0,500;0,700;1,400&display=swap" rel="stylesheet">
@if($application->status === 'accepted' && $application->notebook_approved)
@if($application->status === 'accepted' && ($application->notebook_approved || $application->notebook_supervisor_signed || !empty($application->transcript_markdown)))
<div class="bg-slate-100 py-12 no-print">
<div class="container max-w-6xl mx-auto px-4">
<!-- Verification Banner (e-Devlet Style) -->
@@ -17,11 +17,18 @@
<span class="text-slate-600 ml-1">Bu staj sertifikası ve transkripti, Trunçgil Teknopark sistemi üzerinden dijital olarak imzalanıp onaylanmıştır.</span>
</div>
</div>
<div class="flex-shrink-0">
<div class="flex-shrink-0 flex items-center gap-2">
<!-- Print Journal Buttons -->
<a href="{{ route('intern.print-journal') }}?size=a4&intern_id={{ $application->id }}" target="_blank" class="px-3.5 py-2 bg-white hover:bg-slate-50 text-slate-700 border border-slate-200 text-xs font-bold rounded-lg transition-all shadow-sm flex items-center gap-1.5 whitespace-nowrap">
<i class="uil uil-print text-sm"></i>
<span>A4 Defter</span>
</a>
<!-- PDF Download Button -->
<button onclick="downloadPDF()" id="pdf-btn" class="px-4 py-2 bg-orange-600 hover:bg-orange-700 text-white text-sm font-bold rounded-lg transition-all shadow-sm flex items-center gap-1.5 whitespace-nowrap">
<button onclick="downloadPDF()" id="pdf-btn" class="px-4 py-2 bg-orange-600 hover:bg-orange-700 text-white text-sm font-bold rounded-lg transition-all shadow-sm flex items-center gap-1.5 whitespace-nowrap cursor-pointer">
<i class="uil uil-file-download text-base" id="pdf-icon"></i>
<span class="spinner-border spinner-border-sm hidden animate-spin w-3.5 h-3.5 border-2 border-white border-t-transparent rounded-full" id="pdf-spinner" role="status"></span>
<span id="pdf-btn-text">PDF Olarak İndir</span>
</button>
</div>
</div>
@@ -261,6 +268,11 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<style>
/* Prevent red text on button hover */
.no-print a:hover, .no-print a:focus {
color: inherit !important;
text-decoration: none !important;
}
:root {
/* Global scale factor for transcript page fonts. Adjust this easily (e.g. 1.0, 1.10, 1.20) */
--transcript-font-scale: 1.30;