laporan bulanan

This commit is contained in:
MufridaFaraDiani27 2026-05-29 12:53:08 +07:00
parent 7c804bf715
commit 80057c1acc
28 changed files with 1118 additions and 2454 deletions

View File

@ -4,42 +4,50 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Barryvdh\DomPDF\Facade\Pdf;
class LaporanController extends Controller
{
// ─────────────────────────────────────────────
// Laporan BULANAN → /laporan/bulanan?periode_id=X
// ─────────────────────────────────────────────
public function downloadBulanan(Request $request, $periode)
public function downloadBulanan($periode)
{
$periodeId = $periode;
$periodeData = DB::table('periode_analisis')
->where('id', $periode)
->first();
// Ambil info periode
$periode = DB::table('periode_analisis')->where('id', $periodeId)->first();
if (!$periode) {
return back()->with('error', 'Periode tidak ditemukan.');
if (!$periodeData) {
return back()->with('error', 'Periode tidak ditemukan');
}
$data = $this->collectData($periodeId);
$data['periode'] = $periode;
$data['judulLaporan'] = 'Laporan Analisis Sentimen — ' . $periode->nama;
$data = $this->collectData($periode);
$pdf = Pdf::loadView('laporan.bulanan', $data)
->setPaper('a4', 'portrait')
->setOptions(['dpi' => 110, 'defaultFont' => 'sans-serif', 'isHtml5ParserEnabled' => true]);
$data['periode'] = $periodeData;
$data['judulLaporan'] = 'Laporan Analisis Sentimen - ' . ($periodeData->nama ?? '-');
$data['evaluasi'] = DB::table('evaluasi_model')->orderByDesc('id')->first()
?? (object)['accuracy' => 0];
$filename = 'laporan-sentimen-' . strtolower(str_replace(' ', '-', $periode->nama)) . '.pdf';
// Ulasan KOTOR — dari tabel ulasan mentah
$data['totalUlasanKotor'] = DB::table('ulasan')
->where('periode_id', $periode)
->count();
return $pdf->download($filename);
// Trend by tanggal ULASAN (bukan created_at analisis)
$data['trendHarian'] = DB::table('hasil_analisis')
->select(
DB::raw('DATE(created_at) as tanggal'), // ✅ ganti tanggal → created_at
DB::raw("SUM(CASE WHEN sentimen='positif' THEN 1 ELSE 0 END) as positif"),
DB::raw("SUM(CASE WHEN sentimen='netral' THEN 1 ELSE 0 END) as netral"),
DB::raw("SUM(CASE WHEN sentimen='negatif' THEN 1 ELSE 0 END) as negatif")
)
->where('periode_id', $periode)
->groupBy(DB::raw('DATE(created_at)')) // ✅ ganti tanggal → created_at
->orderBy(DB::raw('DATE(created_at)')) // ✅ ganti tanggal → created_at
->get();
return view('laporan.bulanan', $data);
}
// ─────────────────────────────────────────────
// Laporan TAHUNAN → /laporan/tahunan?tahun=2025
// ─────────────────────────────────────────────
public function downloadTahunan(Request $request, $tahun)
public function downloadTahunan(Request $request)
{
$tahun = $request->input('tahun', now()->year);
$tahun = $request->tahun;
$periodeList = DB::table('periode_analisis')
->where('tahun', $tahun)
@ -47,130 +55,59 @@ public function downloadTahunan(Request $request, $tahun)
->get();
if ($periodeList->isEmpty()) {
return back()->with('error', "Tidak ada data untuk tahun $tahun.");
return back()->with('error', 'Tidak ada data tahun tersebut');
}
// Kumpulkan data per bulan
$dataBulanan = [];
foreach ($periodeList as $periode) {
$dataBulanan[] = array_merge(
['periode' => $periode],
$this->collectData($periode->id)
);
}
// Agregat tahunan
$totalUlasan = collect($dataBulanan)->sum(fn($d) => $d['totalUlasan']);
$totalPositif = collect($dataBulanan)->sum(fn($d) => $d['totalPositif']);
$totalNegatif = collect($dataBulanan)->sum(fn($d) => $d['totalNegatif']);
$totalNetral = collect($dataBulanan)->sum(fn($d) => $d['totalNetral']);
$pdf = Pdf::loadView('laporan.tahunan', [
'tahun' => $tahun,
'judulLaporan' => "Laporan Analisis Sentimen Tahunan — $tahun",
'dataBulanan' => $dataBulanan,
'totalUlasan' => $totalUlasan,
'totalPositif' => $totalPositif,
'totalNegatif' => $totalNegatif,
'totalNetral' => $totalNetral,
'persen' => $totalUlasan > 0 ? [
'positif' => round(($totalPositif / $totalUlasan) * 100, 1),
'negatif' => round(($totalNegatif / $totalUlasan) * 100, 1),
'netral' => round(($totalNetral / $totalUlasan) * 100, 1),
] : ['positif' => 0, 'negatif' => 0, 'netral' => 0],
])
->setPaper('a4', 'portrait')
->setOptions(['dpi' => 110, 'defaultFont' => 'sans-serif', 'isHtml5ParserEnabled' => true]);
return $pdf->download("laporan-sentimen-$tahun.pdf");
return view('laporan.tahunan', compact('tahun', 'periodeList'));
}
// ─────────────────────────────────────────────
// Helper: kumpulkan semua data untuk satu periode
// ─────────────────────────────────────────────
private function collectData(int $periodeId): array
private function collectData($periodeId)
{
// Statistik sentimen
$totalUlasan = DB::table('hasil_analisis')->where('periode_id', $periodeId)->count();
$totalPositif = DB::table('hasil_analisis')->where('periode_id', $periodeId)->where('sentimen', 'positif')->count();
$totalNegatif = DB::table('hasil_analisis')->where('periode_id', $periodeId)->where('sentimen', 'negatif')->count();
$totalNetral = DB::table('hasil_analisis')->where('periode_id', $periodeId)->where('sentimen', 'netral')->count();
$persen = $totalUlasan > 0 ? [
'positif' => round(($totalPositif / $totalUlasan) * 100, 1),
'negatif' => round(($totalNegatif / $totalUlasan) * 100, 1),
'netral' => round(($totalNetral / $totalUlasan) * 100, 1),
] : ['positif' => 0, 'negatif' => 0, 'netral' => 0];
// Evaluasi model
$evaluasi = DB::table('evaluasi_model')
$totalUlasan = DB::table('hasil_analisis')
->where('periode_id', $periodeId)
->latest()
->first();
->count();
// Per destinasi
$perWisata = DB::table('hasil_analisis')
$totalPositif = DB::table('hasil_analisis')
->where('periode_id', $periodeId)
->select('wisata',
DB::raw('COUNT(*) as total'),
DB::raw("SUM(CASE WHEN sentimen='positif' THEN 1 ELSE 0 END) as positif"),
DB::raw("SUM(CASE WHEN sentimen='negatif' THEN 1 ELSE 0 END) as negatif"),
DB::raw("SUM(CASE WHEN sentimen='netral' THEN 1 ELSE 0 END) as netral")
)
->groupBy('wisata')
->get();
->where('sentimen', 'positif')
->count();
// Tabel hasil analisis (maks 200 baris agar PDF tidak terlalu besar)
$hasilAnalisis = DB::table('hasil_analisis')
$totalNetral = DB::table('hasil_analisis')
->where('periode_id', $periodeId)
->select('wisata', 'ulasan_asli', 'sentimen', 'probabilitas')
->orderBy('wisata')
->limit(200)
->get();
->where('sentimen', 'netral')
->count();
// Rekomendasi (rule-based dari ulasan negatif)
$ulasanNegatif = DB::table('hasil_analisis')
$totalNegatif = DB::table('hasil_analisis')
->where('periode_id', $periodeId)
->where('sentimen', 'negatif')
->pluck('ulasan_bersih')
->implode(' ');
->count();
$rekomendasi = $this->generateRekomendasi($ulasanNegatif);
return compact(
'totalUlasan', 'totalPositif', 'totalNegatif', 'totalNetral',
'persen', 'evaluasi', 'perWisata', 'hasilAnalisis', 'rekomendasi'
);
}
// ─────────────────────────────────────────────
// Rule-based rekomendasi (sama seperti RekomendasiController)
// ─────────────────────────────────────────────
private function generateRekomendasi(string $text): array
{
$issueRules = [
'Kebersihan' => ['keywords' => ['kotor','sampah','jorok','kumuh','toilet','wc','bau'],
'icon' => '🧹', 'tip' => 'Tambah tempat sampah & jadwal pembersihan rutin.'],
'Aksesibilitas' => ['keywords' => ['parkir','parkiran','motor','mobil','jalan','macet'],
'icon' => '🚗', 'tip' => 'Sistem parkir lebih rapi dan transparan.'],
'Harga / Tiket' => ['keywords' => ['mahal','harga','tiket','bayar','biaya','tarif'],
'icon' => '🎟️', 'tip' => 'Penyesuaian harga tiket agar lebih terjangkau.'],
'Fasilitas' => ['keywords' => ['fasilitas','gazebo','warung','kantin','musholla','wifi','bangku'],
'icon' => '🏗️', 'tip' => 'Fasilitas lengkap & terawat meningkatkan kepuasan.'],
$persen = [
'positif' => $totalUlasan ? round(($totalPositif / $totalUlasan) * 100, 2) : 0,
'netral' => $totalUlasan ? round(($totalNetral / $totalUlasan) * 100, 2) : 0,
'negatif' => $totalUlasan ? round(($totalNegatif / $totalUlasan) * 100, 2) : 0,
];
$result = [];
foreach ($issueRules as $nama => $rule) {
$skor = 0;
foreach ($rule['keywords'] as $kw) {
$skor += substr_count(strtolower($text), $kw);
}
if ($skor > 0) {
$result[] = ['nama' => $nama, 'skor' => $skor, 'icon' => $rule['icon'], 'tip' => $rule['tip']];
}
}
$perWisata = DB::table('hasil_analisis')
->select(
'wisata',
DB::raw('COUNT(*) as total'),
DB::raw("SUM(CASE WHEN sentimen='positif' THEN 1 ELSE 0 END) as positif"),
DB::raw("SUM(CASE WHEN sentimen='netral' THEN 1 ELSE 0 END) as netral"),
DB::raw("SUM(CASE WHEN sentimen='negatif' THEN 1 ELSE 0 END) as negatif")
)
->where('periode_id', $periodeId)
->groupBy('wisata')
->orderByDesc('positif')
->get();
usort($result, fn($a, $b) => $b['skor'] - $a['skor']);
return array_slice($result, 0, 5);
return [
'totalUlasan' => $totalUlasan,
'totalPositif' => $totalPositif,
'totalNetral' => $totalNetral,
'totalNegatif' => $totalNegatif,
'persen' => $persen,
'perWisata' => $perWisata,
];
}
}

View File

@ -59,43 +59,51 @@
</div>
{{-- ================= FILTER ================= --}}
<form id="filter-form" method="GET" action="{{ route('dashboard') }}" class="flex gap-2 mb-4">
<div class="flex items-end gap-3 mb-4">
<input type="hidden" name="tab" value="analisis">
<form id="filter-form"
method="GET"
action="{{ route('dashboard') }}"
class="flex items-end gap-2">
<input type="hidden" name="periode_id" value="{{ $periodeAktif->id ?? '' }}">
<input type="hidden" name="tab" value="analisis">
<input type="hidden" name="periode_id"
value="{{ $periodeAktif->id ?? '' }}">
<select
name="wisata"
class="border rounded px-3 py-2"
>
<select
name="wisata"
class="border rounded px-3 py-2 h-[46px]">
<option value="">Semua Destinasi</option>
<option value="">Semua Destinasi</option>
@foreach($wisataList as $item)
@foreach($wisataList as $item)
<option value="{{ $item }}"
{{ request('wisata') == $item ? 'selected' : '' }}>
{{ $item }}
</option>
@endforeach
<option
value="{{ $item }}"
{{ request('wisata') == $item ? 'selected' : '' }}
>
{{ $item }}
</option>
</select>
@endforeach
<button
type="submit"
class="bg-blue-600 text-white px-4 rounded h-[46px]">
Filter
</button>
</select>
</form>
<button
type="submit"
class="bg-blue-600 text-white px-4 py-2 rounded"
>
Filter
</button>
<a href="{{ route('riwayat.index') }}"
class="inline-flex items-center justify-center bg-blue-600 hover:bg-blue-700 text-white px-5 rounded-lg shadow transition h-[46px]">
</form>
<i class="fas fa-history mr-2"></i>
Lihat Riwayat
</a>
</div>
{{-- ================= TABLE ================= --}}
<div class="bg-white rounded-xl shadow p-4 h-fit">

View File

@ -1,313 +1,376 @@
<!DOCTYPE html>
<html lang="id">
<html>
<head>
<meta charset="UTF-8">
<meta charset="utf-8">
<title>{{ $judulLaporan }}</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: DejaVu Sans, sans-serif; font-size: 11px; color: #1f2937; background: #fff; }
* { box-sizing: border-box; }
.header-wrap { position: relative; background: #1a3a5c; color: white; margin-bottom: 0; overflow: hidden; }
.header-bg { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(135deg, #0f2744 0%, #1a4a7a 50%, #0d3060 100%); }
.header-content { position: relative; padding: 0; }
.header-top { display: flex; align-items: center; padding: 12px 20px 8px 20px; border-bottom: 1px solid rgba(255,255,255,0.15); }
.logo-circle { width: 48px; height: 48px; background: #c8a84b; border-radius: 50%; display: flex; align-items: center; justify-content: center; margin-right: 12px; flex-shrink: 0; font-size: 14px; font-weight: bold; color: #1a3a5c; }
.logo-img { width: 48px; height: 48px; border-radius: 50%; object-fit: contain; margin-right: 12px; background: white; padding: 3px; }
.org1 { font-size: 11px; font-weight: bold; color: #c8a84b; letter-spacing: .5px; }
.org2 { font-size: 10px; color: rgba(255,255,255,.85); }
.header-body { padding: 14px 20px 16px 20px; }
.header-title { font-size: 24px; font-weight: bold; color: white; letter-spacing: 1px; text-transform: uppercase; line-height: 1.1; }
.header-sub { font-size: 14px; color: #c8a84b; font-weight: bold; letter-spacing: .5px; margin-bottom: 8px; text-transform: uppercase; }
.header-desc { font-size: 9.5px; color: rgba(255,255,255,.75); margin-bottom: 12px; line-height: 1.5; }
.periode-badge { display: inline-block; background: #1d4ed8; border-radius: 6px; padding: 7px 14px; }
.pb-label { font-size: 9px; color: rgba(255,255,255,.7); }
.pb-value { font-size: 13px; font-weight: bold; color: white; }
body {
font-family: Arial, sans-serif;
background: #f1f5f9;
color: #1f2937;
margin: 0;
padding: 24px;
}
.page-body { padding: 16px 20px; }
.section { margin-bottom: 14px; }
.section-title { display: flex; align-items: center; gap: 7px; font-size: 11px; font-weight: bold; color: #1d4ed8; letter-spacing: .5px; text-transform: uppercase; margin-bottom: 10px; padding-bottom: 5px; border-bottom: 2px solid #dbeafe; }
/* ── Sticky action bar pojok kanan atas ── */
.action-bar {
position: fixed;
top: 16px;
right: 24px;
display: flex;
gap: 8px;
z-index: 999;
}
.stats { display: flex; gap: 8px; }
.stat-card { flex: 1; background: white; border: 1px solid #e5e7eb; border-radius: 8px; padding: 10px 12px; display: flex; align-items: center; gap: 8px; }
.stat-icon { width: 34px; height: 34px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 16px; flex-shrink: 0; }
.stat-icon.blue { background: #eff6ff; } .stat-icon.green { background: #f0fdf4; } .stat-icon.red { background: #fef2f2; } .stat-icon.yellow { background: #fefce8; }
.slabel { font-size: 8.5px; color: #6b7280; }
.sval { font-size: 18px; font-weight: bold; line-height: 1.1; }
.spct { font-size: 8.5px; }
.sval.blue { color: #1d4ed8; } .sval.green { color: #16a34a; } .sval.red { color: #dc2626; } .sval.yellow { color: #d97706; }
.spct.green { color: #16a34a; } .spct.red { color: #dc2626; } .spct.yellow { color: #d97706; }
.btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 9px 18px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
border: none;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
transition: opacity .2s;
}
.btn:hover { opacity: .85; }
.btn-primary { background: #1d4ed8; color: white; }
.btn-secondary { background: white; color: #374151; border: 1px solid #d1d5db; }
.two-col { display: flex; gap: 12px; }
.col-left { flex: 1; } .col-right { flex: 1; }
.container {
max-width: 960px;
margin: 0 auto;
background: white;
border-radius: 16px;
padding: 28px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
}
.donut-wrap { display: flex; align-items: center; gap: 16px; padding: 8px 0; }
.donut-chart { width: 100px; height: 100px; flex-shrink: 0; }
.donut-svg { width: 100px; height: 100px; transform: rotate(-90deg); }
.legend-item { display: flex; align-items: center; gap: 6px; margin-bottom: 5px; }
.legend-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }
.legend-label { font-size: 9.5px; color: #374151; flex: 1; }
.legend-val { font-size: 9.5px; font-weight: bold; color: #111; }
/* LOGO */
.logo { font-size: 26px; font-weight: 800; color: #1e3a8a; margin-bottom: 20px; }
table { width: 100%; border-collapse: collapse; }
.table-wrap { border-radius: 8px; overflow: hidden; border: 1px solid #e5e7eb; }
thead tr { background: #1d4ed8; }
thead th { color: white; font-size: 9.5px; font-weight: bold; padding: 7px 10px; text-align: left; }
thead th.center { text-align: center; }
tbody tr:nth-child(even) { background: #f8fafc; }
tbody td { font-size: 9.5px; padding: 6px 10px; border-bottom: 1px solid #f1f5f9; color: #374151; }
tbody td.center { text-align: center; }
tfoot td { background: #eff6ff; font-weight: bold; color: #1d4ed8; font-size: 9.5px; padding: 6px 10px; }
/* HERO */
.hero {
border: 1px solid #dbeafe;
background: linear-gradient(135deg, #eff6ff, #f7f8ff);
border-radius: 12px;
padding: 22px 24px;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
}
.badge { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 8.5px; font-weight: bold; }
.badge-positif { background: #dcfce7; color: #15803d; }
.badge-negatif { background: #fee2e2; color: #b91c1c; }
.badge-netral { background: #fef9c3; color: #92400e; }
.hero-title { font-size: 22px; font-weight: 800; color: #132b70; line-height: 1.3; }
.hero-sub { margin-top: 6px; color: #374151; font-size: 13px; }
.rekom-item { display: flex; align-items: flex-start; gap: 10px; background: #f8fafc; border-radius: 8px; padding: 8px 10px; border: 1px solid #e5e7eb; margin-bottom: 6px; }
.rekom-icon { width: 28px; height: 28px; border-radius: 8px; display: flex; align-items: center; justify-content: center; font-size: 14px; flex-shrink: 0; }
.ri-red { background: #fee2e2; } .ri-orange { background: #ffedd5; } .ri-green { background: #dcfce7; } .ri-blue { background: #dbeafe; } .ri-purple { background: #ede9fe; }
.rtitle { font-weight: bold; font-size: 10px; color: #111827; margin-bottom: 2px; }
.rtip { font-size: 9px; color: #6b7280; line-height: 1.4; }
.hero-right {
min-width: 160px;
border: 1px solid #dbeafe;
border-radius: 10px;
padding: 14px 16px;
background: white;
font-size: 13px;
line-height: 1.8;
}
.eval-grid { display: flex; gap: 8px; }
.eval-box { flex: 1; background: #eff6ff; border: 1px solid #bfdbfe; border-radius: 8px; padding: 9px 8px; text-align: center; }
.eval-label { font-size: 8.5px; color: #3b82f6; margin-bottom: 3px; }
.eval-val { font-size: 16px; font-weight: bold; color: #1d4ed8; }
/* SECTION TITLE */
.section-title {
font-weight: 700;
font-size: 13px;
color: #1e3a8a;
letter-spacing: .5px;
margin: 24px 0 14px;
text-transform: uppercase;
}
.metodologi { background: #1a3a5c; color: white; padding: 14px 20px; display: flex; justify-content: space-between; align-items: flex-start; gap: 20px; margin-top: 16px; }
.metod-left h4 { font-size: 10px; font-weight: bold; color: #c8a84b; margin-bottom: 5px; }
.metod-left p { font-size: 8.5px; color: rgba(255,255,255,.75); line-height: 1.5; }
.metod-right { text-align: right; flex-shrink: 0; }
.mdate { font-size: 9px; color: rgba(255,255,255,.7); }
.msys { font-size: 9.5px; font-weight: bold; color: #c8a84b; margin-top: 3px; }
/* CARDS */
.cards { display: flex; gap: 12px; margin-bottom: 24px; }
.page-break { page-break-before: always; }
.no-break { page-break-inside: avoid; }
.card {
flex: 1;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 16px;
}
.card .card-label { font-size: 12px; color: #6b7280; margin-bottom: 6px; }
.card .card-value { font-size: 26px; font-weight: 800; margin: 0; }
.card .card-unit { font-size: 12px; color: #9ca3af; margin-top: 4px; }
.blue { background: #eff6ff; border-color: #bfdbfe; }
.green { background: #f0fdf4; border-color: #bbf7d0; }
.yellow { background: #fffbeb; border-color: #fde68a; }
.purple { background: #faf5ff; border-color: #e9d5ff; }
/* CHARTS */
.chart-row { display: flex; gap: 16px; margin-bottom: 24px; align-items: flex-start; }
.box-pie {
width: 260px;
flex-shrink: 0;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
}
.box-bar {
flex: 1;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 16px;
min-width: 0;
}
.box-pie h4, .box-bar h4 {
margin: 0 0 12px;
font-size: 12px;
color: #1e3a8a;
font-weight: 700;
text-transform: uppercase;
letter-spacing: .4px;
width: 100%;
}
/* TABLE */
table { width: 100%; border-collapse: collapse; margin-top: 8px; }
table th { background: #f8fafc; font-size: 12px; font-weight: 600; }
table th, table td { border: 1px solid #e5e7eb; padding: 9px 11px; font-size: 12px; }
.badge {
background: #dcfce7;
color: #15803d;
border-radius: 20px;
padding: 3px 10px;
font-weight: 600;
font-size: 11px;
}
/* KESIMPULAN */
.kesimpulan {
border: 1px solid #dbeafe;
background: #eff6ff;
border-radius: 10px;
padding: 16px 18px;
margin-top: 20px;
font-size: 13px;
}
/* FOOTER */
.footer {
margin-top: 24px;
padding-top: 14px;
border-top: 1px solid #e5e7eb;
font-size: 12px;
display: flex;
justify-content: space-between;
color: #6b7280;
}
/* Sembunyikan action bar saat print */
@media print {
body { background: white; padding: 0; }
.action-bar { display: none !important; }
}
</style>
</head>
<body>
{{-- HEADER --}}
<div class="header-wrap">
<div class="header-bg"></div>
<div class="header-content">
<div class="header-top">
@php $logoPath = public_path('images/logo-sentara.png'); @endphp
@if(file_exists($logoPath))
<img src="{{ $logoPath }}" class="logo-img" alt="Logo">
@else
<div class="logo-circle">DISPAR</div>
@endif
<div>
<div class="org1">DINAS PARIWISATA</div>
<div class="org2">KABUPATEN JEMBER</div>
</div>
</div>
<div class="header-body">
<div class="header-title">LAPORAN ANALISIS SENTIMEN</div>
<div class="header-sub">Wisata Kabupaten Jember</div>
<div class="header-desc">Laporan ini berisi hasil analisis sentimen terhadap ulasan wisata dari Google Maps menggunakan metode Naive Bayes.</div>
<div class="periode-badge">
<div class="pb-label">Periode Analisis</div>
<div class="pb-value">{{ $periode->nama }}</div>
</div>
</div>
</div>
{{-- ── ACTION BAR pojok kanan atas ── --}}
<div class="action-bar" id="actionBar">
<button class="btn btn-secondary" onclick="cetakHalaman()">🖨️ Cetak</button>
</div>
<div class="page-body">
<div class="container" id="isiLaporan">
{{-- RINGKASAN --}}
<div class="section no-break">
<div class="section-title">📊 RINGKASAN SENTIMEN</div>
<div class="stats">
<div class="stat-card">
<div class="stat-icon blue">💬</div>
<div><div class="slabel">Total Ulasan</div><div class="sval blue">{{ $totalUlasan }}</div><div class="spct" style="color:#6b7280">100% dari keseluruhan</div></div>
</div>
<div class="stat-card">
<div class="stat-icon green">😊</div>
<div><div class="slabel">Sentimen Positif</div><div class="sval green">{{ $totalPositif }}</div><div class="spct green">{{ $persen['positif'] }}%</div></div>
</div>
<div class="stat-card">
<div class="stat-icon red">😟</div>
<div><div class="slabel">Sentimen Negatif</div><div class="sval red">{{ $totalNegatif }}</div><div class="spct red">{{ $persen['negatif'] }}%</div></div>
</div>
<div class="stat-card">
<div class="stat-icon yellow">😐</div>
<div><div class="slabel">Sentimen Netral</div><div class="sval yellow">{{ $totalNetral }}</div><div class="spct yellow">{{ $persen['netral'] }}%</div></div>
</div>
</div>
</div>
{{-- LOGO --}}
<div class="logo">SENTARA</div>
{{-- DISTRIBUSI + EVALUASI --}}
<div class="two-col no-break">
<div class="col-left">
<div class="section-title">🍩 DISTRIBUSI SENTIMEN</div>
@php
$t = max($totalUlasan, 1);
$r = 38; $circ = 2 * 3.14159 * $r;
$pP = $totalPositif / $t;
$pN = $totalNegatif / $t;
$pNt = $totalNetral / $t;
@endphp
<div class="donut-wrap">
<div class="donut-chart">
<svg class="donut-svg" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="{{ $r }}" fill="none" stroke="#e5e7eb" stroke-width="18"/>
@if($pP > 0)<circle cx="50" cy="50" r="{{ $r }}" fill="none" stroke="#22c55e" stroke-width="18" stroke-dasharray="{{ $circ*$pP }} {{ $circ*(1-$pP) }}" stroke-dashoffset="0"/>@endif
@if($pN > 0)<circle cx="50" cy="50" r="{{ $r }}" fill="none" stroke="#ef4444" stroke-width="18" stroke-dasharray="{{ $circ*$pN }} {{ $circ*(1-$pN) }}" stroke-dashoffset="-{{ $circ*$pP }}"/>@endif
@if($pNt > 0)<circle cx="50" cy="50" r="{{ $r }}" fill="none" stroke="#f59e0b" stroke-width="18" stroke-dasharray="{{ $circ*$pNt }} {{ $circ*(1-$pNt) }}" stroke-dashoffset="-{{ $circ*($pP+$pN) }}"/>@endif
<circle cx="50" cy="50" r="22" fill="white"/>
</svg>
</div>
<div>
<div class="legend-item"><div class="legend-dot" style="background:#22c55e"></div><span class="legend-label">Positif</span><span class="legend-val">{{ $persen['positif'] }}% ({{ $totalPositif }})</span></div>
<div class="legend-item"><div class="legend-dot" style="background:#ef4444"></div><span class="legend-label">Negatif</span><span class="legend-val">{{ $persen['negatif'] }}% ({{ $totalNegatif }})</span></div>
<div class="legend-item"><div class="legend-dot" style="background:#f59e0b"></div><span class="legend-label">Netral</span><span class="legend-val">{{ $persen['netral'] }}% ({{ $totalNetral }})</span></div>
</div>
{{-- HERO --}}
<div class="hero">
<div class="hero-left">
<div class="hero-title">LAPORAN ANALISIS SENTIMEN<br>PER BULAN</div>
<div class="hero-sub">SISTEM ANALISIS SENTIMEN WISATA JEMBER</div>
</div>
<div class="hero-right">
<b>Periode</b><br>
{{ $periode->nama ?? '-' }}<br><br>
<b>Tanggal Cetak</b><br>
{{ now()->format('d M Y H:i') }}
</div>
</div>
<div class="col-right">
<div class="section-title">🎯 EVALUASI MODEL</div>
@if($evaluasi)
<div class="eval-grid">
<div class="eval-box"><div class="eval-label">Precision</div><div class="eval-val">{{ number_format($evaluasi->precision,2) }}</div></div>
<div class="eval-box"><div class="eval-label">Recall</div><div class="eval-val">{{ number_format($evaluasi->recall,2) }}</div></div>
<div class="eval-box"><div class="eval-label">F1 Score</div><div class="eval-val">{{ number_format($evaluasi->f1_score,2) }}</div></div>
<div class="eval-box"><div class="eval-label">Akurasi</div><div class="eval-val">{{ number_format($evaluasi->accuracy,2) }}</div></div>
</div>
@else
<p style="font-size:10px;color:#9ca3af;padding:20px 0">Data evaluasi belum tersedia.</p>
@endif
</div>
</div>
{{-- TABEL PER DESTINASI --}}
<div class="two-col no-break" style="margin-top:14px">
<div class="col-left">
<div class="section-title">🔭 TOTAL DATA PER DESTINASI</div>
<div class="table-wrap">
<table>
<thead><tr><th>No</th><th>Destinasi Wisata</th><th class="center">Total Ulasan</th></tr></thead>
<tbody>
@foreach($perWisata as $i => $w)
<tr><td>{{ $i+1 }}</td><td style="font-weight:bold">{{ $w->wisata }}</td><td class="center">{{ $w->total }}</td></tr>
@endforeach
</tbody>
<tfoot><tr><td colspan="2" style="font-weight:bold;padding:6px 10px">Total</td><td class="center" style="padding:6px 10px;font-weight:bold">{{ $totalUlasan }}</td></tr></tfoot>
</table>
</div>
</div>
<div class="col-right">
<div class="section-title">📉 SENTIMEN PER DESTINASI</div>
<div class="table-wrap">
<table>
<thead><tr><th>No</th><th>Destinasi Wisata</th><th class="center" style="color:#86efac">Positif</th><th class="center" style="color:#fca5a5">Negatif</th><th class="center" style="color:#fde68a">Netral</th></tr></thead>
<tbody>
@foreach($perWisata as $i => $w)
<tr>
<td>{{ $i+1 }}</td><td style="font-weight:bold">{{ $w->wisata }}</td>
<td class="center" style="color:#16a34a;font-weight:bold">{{ $w->positif }}</td>
<td class="center" style="color:#dc2626;font-weight:bold">{{ $w->negatif }}</td>
<td class="center" style="color:#d97706;font-weight:bold">{{ $w->netral }}</td>
</tr>
@endforeach
</tbody>
<tfoot><tr>
<td colspan="2" style="padding:6px 10px;font-weight:bold">Total</td>
<td class="center" style="padding:6px 10px;color:#16a34a;font-weight:bold">{{ $totalPositif }}</td>
<td class="center" style="padding:6px 10px;color:#dc2626;font-weight:bold">{{ $totalNegatif }}</td>
<td class="center" style="padding:6px 10px;color:#d97706;font-weight:bold">{{ $totalNetral }}</td>
</tr></tfoot>
</table>
</div>
</div>
</div>
{{-- RINGKASAN --}}
<div class="section-title">Ringkasan</div>
{{-- DETAIL + REKOMENDASI --}}
<div class="two-col no-break" style="margin-top:14px">
<div class="col-left">
<div class="section-title">📋 DETAIL HASIL ANALISIS</div>
<div class="table-wrap">
<table>
<thead><tr><th width="6%">No</th><th width="22%">Destinasi</th><th width="44%">Ulasan</th><th width="16%">Sentimen</th><th width="12%" class="center">Prob.</th></tr></thead>
<tbody>
@foreach($hasilAnalisis->take(8) as $i => $item)
<tr>
<td>{{ $i+1 }}</td>
<td style="font-size:8.5px">{{ $item->wisata }}</td>
<td style="font-size:8.5px">{{ \Illuminate\Support\Str::limit($item->ulasan_asli ?? '-', 75) }}</td>
<td><span class="badge badge-{{ strtolower($item->sentimen) }}">{{ ucfirst($item->sentimen) }}</span></td>
<td class="center">{{ number_format($item->probabilitas,2) }}</td>
</tr>
@endforeach
</tbody>
</table>
<div class="cards">
<div class="card blue">
<div class="card-label">Total Ulasan</div>
<p class="card-value">{{ $totalUlasanKotor }}</p>
<div class="card-unit">Ulasan Masuk</div>
</div>
@if($hasilAnalisis->count() > 8)
<p style="font-size:8.5px;color:#3b82f6;margin-top:5px;text-align:right">* Lihat semua data ulasan pada sistem </p>
@endif
</div>
<div class="col-right">
<div class="section-title">💡 REKOMENDASI LAYANAN</div>
@php $iconColors = ['red','orange','green','blue','purple']; @endphp
@forelse($rekomendasi as $i => $r)
@php $c = $iconColors[$i % count($iconColors)]; @endphp
<div class="rekom-item">
<div class="rekom-icon ri-{{ $c }}">{{ $r['icon'] }}</div>
<div><div class="rtitle">{{ $r['nama'] }}</div><div class="rtip">{{ $r['tip'] }}</div></div>
<div class="card green">
<div class="card-label">Hasil Analisis</div>
<p class="card-value">{{ $totalUlasan }}</p>
<div class="card-unit">Data Bersih</div>
</div>
<div class="card yellow">
<div class="card-label">Wisata Dibahas</div>
<p class="card-value">{{ count($perWisata) }}</p>
<div class="card-unit">Destinasi</div>
</div>
<div class="card purple">
<div class="card-label">Akurasi Analisis</div>
<p class="card-value">{{ number_format(($evaluasi->accuracy ?? 0) * 100, 2) }}%</p>
<div class="card-unit">Model</div>
</div>
@empty
<p style="font-size:10px;color:#9ca3af;padding:20px 0;text-align:center">Tidak ada keluhan signifikan. 🎉</p>
@endforelse
</div>
</div>
{{-- CHARTS --}}
<div class="section-title">Visualisasi</div>
<div class="chart-row">
<div class="box-pie">
<h4>Distribusi Sentimen</h4>
<canvas id="pieChart" width="220" height="220"></canvas>
</div>
<div class="box-bar">
<h4>Sentimen per Destinasi</h4>
<canvas id="barChart"></canvas>
</div>
</div>
{{-- TABEL --}}
<div class="section-title">Top Wisata Berdasarkan Sentimen Positif</div>
<table>
<tr>
<th>No</th>
<th>Wisata</th>
<th>Total</th>
<th>Positif</th>
<th>Netral</th>
<th>Negatif</th>
<th>% Positif</th>
</tr>
@foreach($perWisata as $i => $w)
<tr>
<td>{{ $i + 1 }}</td>
<td>{{ $w->wisata }}</td>
<td>{{ $w->total }}</td>
<td>{{ $w->positif }}</td>
<td>{{ $w->netral }}</td>
<td>{{ $w->negatif }}</td>
<td><span class="badge">{{ $w->total > 0 ? round(($w->positif / $w->total) * 100, 2) : 0 }}%</span></td>
</tr>
@endforeach
</table>
{{-- KESIMPULAN --}}
<div class="kesimpulan">
<b>KESIMPULAN</b>
<p style="margin:8px 0 0">
Pada periode <b>{{ $periode->nama ?? '' }}</b>,
terdapat <b>{{ $totalUlasanKotor }}</b> ulasan masuk dengan
<b>{{ $totalUlasan }}</b> data berhasil dianalisis.
Sentimen positif mendominasi dengan persentase <b>{{ $persen['positif'] ?? 0 }}%</b>,
diikuti netral <b>{{ $persen['netral'] ?? 0 }}%</b>
dan negatif <b>{{ $persen['negatif'] ?? 0 }}%</b>.
</p>
</div>
{{-- FOOTER --}}
<div class="footer">
<div>SENTARA Sistem Analisis Sentimen Wisata Jember</div>
<div>Dicetak oleh: Admin &nbsp;|&nbsp; {{ now()->format('d M Y H:i') }}</div>
</div>
</div>
{{-- FOOTER --}}
<div class="metodologi">
<div class="metod-left">
<h4>METODOLOGI</h4>
<p>Analisis sentimen dilakukan menggunakan metode Naive Bayes Classifier pada data ulasan Google Maps yang telah melalui proses preprocessing (teks cleaning, case folding, tokenizing, filtering, stemming).</p>
</div>
<div class="metod-right">
<div class="mdate">Dicetak pada: {{ now()->translatedFormat('d F Y H:i') }} WIB</div>
<div class="msys">Sistem Analisis Sentimen Wisata</div>
<div style="font-size:8.5px;color:rgba(255,255,255,.6)">Kabupaten Jember</div>
</div>
</div>
<script>
// ── PIE / DOUGHNUT CHART ──
new Chart(document.getElementById('pieChart'), {
type: 'doughnut',
data: {
labels: ['Positif', 'Netral', 'Negatif'],
datasets: [{
data: [{{ $totalPositif }}, {{ $totalNetral }}, {{ $totalNegatif }}],
backgroundColor: ['#22c55e', '#f59e0b', '#ef4444'],
borderWidth: 2,
borderColor: '#fff'
}]
},
options: {
responsive: false,
animation: false,
plugins: {
legend: { position: 'bottom', labels: { font: { size: 11 }, padding: 10 } }
}
}
});
{{-- HALAMAN 2: TABEL LENGKAP --}}
@if($hasilAnalisis->count() > 8)
<div class="page-break"></div>
<div class="page-body">
<div style="margin-bottom:12px">
<div style="font-size:14px;font-weight:bold;color:#1d4ed8">Detail Lengkap Hasil Analisis</div>
<div style="font-size:9px;color:#6b7280">Periode: {{ $periode->nama }} Total {{ $hasilAnalisis->count() }} data</div>
</div>
<div class="table-wrap">
<table>
<thead><tr><th width="5%">No</th><th width="20%">Destinasi</th><th width="55%">Ulasan Asli</th><th width="12%">Sentimen</th><th width="8%" class="center">Prob.</th></tr></thead>
<tbody>
@foreach($hasilAnalisis as $i => $item)
<tr>
<td>{{ $i+1 }}</td>
<td style="font-size:8.5px">{{ $item->wisata }}</td>
<td style="font-size:8.5px">{{ \Illuminate\Support\Str::limit($item->ulasan_asli ?? '-', 130) }}</td>
<td><span class="badge badge-{{ strtolower($item->sentimen) }}">{{ ucfirst($item->sentimen) }}</span></td>
<td class="center">{{ number_format($item->probabilitas,2) }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="metodologi" style="margin-top:16px">
<div class="metod-left"><h4>METODOLOGI</h4><p>Analisis sentimen menggunakan Naive Bayes Classifier dengan preprocessing teks.</p></div>
<div class="metod-right"><div class="mdate">{{ now()->translatedFormat('d F Y H:i') }} WIB</div><div class="msys">SENTARA Sistem Analisis Wisata Jember</div></div>
</div>
</div>
@endif
// ── BAR CHART SENTIMEN PER DESTINASI ──
const wisataLabels = @json($perWisata->pluck('wisata'));
const wisataPos = @json($perWisata->pluck('positif'));
const wisataNet = @json($perWisata->pluck('netral'));
const wisataNeg = @json($perWisata->pluck('negatif'));
new Chart(document.getElementById('barChart'), {
type: 'bar',
data: {
labels: wisataLabels,
datasets: [
{ label: 'Positif', data: wisataPos, backgroundColor: '#22c55e' },
{ label: 'Netral', data: wisataNet, backgroundColor: '#f59e0b' },
{ label: 'Negatif', data: wisataNeg, backgroundColor: '#ef4444' }
]
},
options: {
responsive: true,
maintainAspectRatio: true,
animation: false,
plugins: {
legend: { position: 'bottom', labels: { font: { size: 11 } } }
},
scales: {
y: { beginAtZero: true, ticks: { font: { size: 11 } } },
x: { ticks: { font: { size: 10 } } }
}
}
});
// ── CETAK ──
function cetakHalaman() {
window.print();
}
// ── SIMPAN PDF ──
function simpanPDF() {
const el = document.getElementById('isiLaporan');
const bar = document.getElementById('actionBar');
bar.style.display = 'none';
html2pdf().set({
margin: 10,
filename: 'Laporan-{{ Str::slug($periode->nama ?? "bulanan") }}.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2, useCORS: true },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }
}).from(el).save().then(() => {
bar.style.display = 'flex';
});
}
</script>
</body>
</html>

View File

@ -5,14 +5,64 @@
<div class="max-w-7xl mx-auto space-y-6">
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
<div>
<h2 class="text-2xl font-bold text-gray-800">Riwayat Analisis</h2>
<h2 class="text-2xl font-bold text-gray-800">
Riwayat Analisis
</h2>
<p class="text-sm text-gray-500">
Periode tersimpan otomatis setiap kali Ambil Data dijalankan.
</p>
</div>
{{-- TAMBAHAN BUTTON CETAK TAHUNAN --}}
{{-- TAMBAHAN BUTTON CETAK TAHUNAN --}}
<form
action="{{ route('laporan.tahunan') }}"
method="GET"
class="flex items-center gap-3">
<div class="relative">
<select
name="tahun"
required
class="appearance-none
border-2 border-blue-500
rounded-2xl
pl-4 pr-9
py-2.5
text-sm font-medium
bg-white
shadow-sm
cursor-pointer
focus:outline-none
focus:ring-2
focus:ring-blue-300">
@for($tahun = date('Y'); $tahun >= 2024; $tahun--)
<option value="{{ $tahun }}">{{ $tahun }}</option>
@endfor
</select>
</div>
<button
type="submit"
class="bg-blue-600
hover:bg-blue-700
text-white
px-5 py-2.5
rounded-2xl
text-sm font-medium
shadow">
Cetak Tahunan
</button>
</form>
</div>
@if(session('success'))
@ -20,6 +70,7 @@
{{ session('success') }}
</div>
@endif
@if(session('error'))
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 rounded whitespace-pre-line">
{{ session('error') }}
@ -27,23 +78,46 @@
@endif
<div class="bg-white rounded-xl shadow p-6">
<h3 class="font-semibold text-gray-800 mb-1">Import Data Lama dari CSV</h3>
<h3 class="font-semibold text-gray-800 mb-1">
Import Data Lama dari CSV
</h3>
<p class="text-sm text-gray-500 mb-4">
Gunakan untuk memasukkan ulasan historis. Kolom wajib: wisata, rating, ulasan, tanggal. Kolom reviewer boleh ada.
Gunakan untuk memasukkan ulasan historis. Kolom wajib:
wisata, rating, ulasan, tanggal.
Kolom reviewer boleh ada.
</p>
<form action="{{ route('riwayat.import') }}" method="POST" enctype="multipart/form-data"
<form
action="{{ route('riwayat.import') }}"
method="POST"
enctype="multipart/form-data"
class="grid grid-cols-1 md:grid-cols-[180px_1fr_auto] gap-3 md:items-center">
@csrf
<input type="month" name="periode_bulan" value="{{ now()->format('Y-m') }}"
class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-[150px]" required>
<input type="file" name="file" accept=".csv,.txt"
class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-0" required>
<input
type="month"
name="periode_bulan"
value="{{ now()->format('Y-m') }}"
class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-[150px]"
required>
<input
type="file"
name="file"
accept=".csv,.txt"
class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-0"
required>
<button
class="bg-green-600 hover:bg-green-700 text-white px-5 py-2 rounded-lg text-sm shadow">
<button class="bg-green-600 hover:bg-green-700 text-white px-5 py-2 rounded-lg text-sm shadow">
Import CSV
</button>
</form>
@if($errors->any())
@ -51,61 +125,207 @@ class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-0" required>
{{ $errors->first() }}
</div>
@endif
</div>
<div class="bg-white rounded-xl shadow overflow-hidden">
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead class="bg-gray-100 text-left">
<tr>
<th class="px-4 py-3">Periode</th>
<th class="px-4 py-3 text-center">Total Ulasan</th>
<th class="px-4 py-3 text-center">Hasil Analisis</th>
<th class="px-4 py-3 text-center">Wisata</th>
<th class="px-4 py-3">Terakhir Analisis</th>
<th class="px-4 py-3 text-center">Aksi</th>
<th class="px-4 py-3">
Periode
</th>
<th class="px-4 py-3 text-center">
Total Ulasan
</th>
<th class="px-4 py-3 text-center">
Hasil Analisis
</th>
<th class="px-4 py-3 text-center">
Wisata
</th>
<th class="px-4 py-3">
Terakhir Analisis
</th>
<th class="px-4 py-3 text-center">
Aksi
</th>
</tr>
</thead>
<tbody class="divide-y">
@forelse($riwayat as $item)
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-gray-800">{{ $item->nama }}</td>
<td class="px-4 py-3 text-center">{{ $item->total_ulasan }}</td>
<td class="px-4 py-3 text-center">{{ $item->total_hasil }}</td>
<td class="px-4 py-3 text-center">{{ $item->total_wisata }}</td>
<td class="px-4 py-3 text-gray-500">
{{ $item->terakhir_analisis ? \Carbon\Carbon::parse($item->terakhir_analisis)->format('d M Y H:i') : '-' }}
<td class="px-4 py-3 font-semibold text-gray-800">
{{ $item->nama }}
</td>
<td class="px-4 py-3 text-center">
{{ $item->total_ulasan }}
</td>
<td class="px-4 py-3 text-center">
{{ $item->total_hasil }}
</td>
<td class="px-4 py-3 text-center">
{{ $item->total_wisata }}
</td>
<td class="px-4 py-3 text-gray-500">
{{ $item->terakhir_analisis
? \Carbon\Carbon::parse(
$item->terakhir_analisis
)->format('d M Y H:i')
: '-' }}
</td>
<td class="px-4 py-3">
<div class="flex flex-wrap justify-center gap-2">
<a href="{{ route('dashboard', ['periode_id' => $item->id, 'tab' => 'analisis']) }}"
class="px-3 py-1 rounded-lg bg-green-50 text-green-600 hover:bg-green-100">
<a
href="{{ route('dashboard',
['periode_id'=>$item->id,
'tab'=>'analisis']) }}"
class="px-3 py-1 rounded-lg
bg-green-50 text-green-600
hover:bg-green-100">
Analisis
</a>
<a href="{{ route('ulasan.index', ['periode_id' => $item->id]) }}"
class="px-3 py-1 rounded-lg bg-gray-100 text-gray-700 hover:bg-gray-200">
<a
href="{{ route('ulasan.index',
['periode_id'=>$item->id]) }}"
class="px-3 py-1 rounded-lg
bg-gray-100 text-gray-700
hover:bg-gray-200">
Ulasan
</a>
{{-- TAMBAHAN CETAK BULANAN --}}
<a
href="{{ route('laporan.bulanan', $item->id) }}"
class="px-3 py-1 rounded-lg
bg-blue-50 text-blue-600
hover:bg-blue-100">
Cetak Laporan
</a>
</div>
</td>
</tr>
@empty
<tr>
<td colspan="6" class="px-4 py-8 text-center text-gray-400">
Belum ada riwayat analisis. Jalankan Ambil Data terlebih dahulu.
<td
colspan="6"
class="px-4 py-8 text-center text-gray-400">
Belum ada riwayat analisis.
Jalankan Ambil Data terlebih dahulu.
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
@if($riwayat->hasPages())
<div class="p-4">
{{ $riwayat->links() }}
{{-- ================= PAGINATION ================= --}}
@if($riwayat->hasPages())
@php
$current = $riwayat->currentPage();
$last = $riwayat->lastPage();
$query = http_build_query(request()->except('page'));
$window = collect(range(max(1, $current - 2), min($last, $current + 2)));
@endphp
<div class="px-6 py-4 border-t border-gray-100 flex items-center justify-between text-sm text-gray-600">
{{-- Info --}}
<p>Menampilkan {{ $riwayat->firstItem() }} {{ $riwayat->lastItem() }} dari {{ $riwayat->total() }} data</p>
{{-- Tombol --}}
<div class="flex items-center gap-1">
{{-- « --}}
@if($riwayat->onFirstPage())
<span class="px-3 py-1.5 rounded-lg border bg-gray-100 text-gray-400 cursor-not-allowed">&laquo;</span>
@else
<a href="{{ $riwayat->previousPageUrl() }}&{{ $query }}" class="px-3 py-1.5 rounded-lg border hover:bg-blue-50 text-blue-600 transition">&laquo;</a>
@endif
{{-- Halaman 1 --}}
@if(!$window->contains(1))
<a href="{{ $riwayat->url(1) }}&{{ $query }}" class="px-3 py-1.5 rounded-lg border hover:bg-blue-50 text-blue-600 transition">1</a>
@if($window->min() > 2)
<span class="px-2 py-1.5 text-gray-400">...</span>
@endif
@endif
{{-- Window --}}
@foreach($window as $page)
@if($page == $current)
<span class="px-3 py-1.5 rounded-lg border bg-blue-600 text-white font-semibold">{{ $page }}</span>
@else
<a href="{{ $riwayat->url($page) }}&{{ $query }}" class="px-3 py-1.5 rounded-lg border hover:bg-blue-50 text-blue-600 transition">{{ $page }}</a>
@endif
@endforeach
{{-- Halaman terakhir --}}
@if(!$window->contains($last))
@if($window->max() < $last - 1)
<span class="px-2 py-1.5 text-gray-400">...</span>
@endif
<a href="{{ $riwayat->url($last) }}&{{ $query }}" class="px-3 py-1.5 rounded-lg border hover:bg-blue-50 text-blue-600 transition">{{ $last }}</a>
@endif
{{-- » --}}
@if($riwayat->hasMorePages())
<a href="{{ $riwayat->nextPageUrl() }}&{{ $query }}" class="px-3 py-1.5 rounded-lg border hover:bg-blue-50 text-blue-600 transition">&raquo;</a>
@else
<span class="px-3 py-1.5 rounded-lg border bg-gray-100 text-gray-400 cursor-not-allowed">&raquo;</span>
@endif
</div>
@endif
</div>
@endif
</div>
</div>

View File

@ -9,11 +9,11 @@
use App\Http\Controllers\UserController;
use App\Http\Controllers\Auth\ForgotPasswordController;
use App\Http\Controllers\Auth\ResetPasswordController;
use App\Http\Controllers\LaporanController;
/*
|--------------------------------------------------------------------------
| ROUTE AWAL
|--------------------------------------------------------------------------
*/
@ -124,6 +124,21 @@
[UlasanController::class, 'kosongkanPeriode']
)->name('ulasan.kosongkan-periode');
/*
|--------------------------------------------------------------------------
| LAPORAN
|--------------------------------------------------------------------------
*/
Route::get('/laporan/bulanan/{periode}',
[LaporanController::class, 'downloadBulanan']
)->name('laporan.bulanan');
Route::get('/laporan/tahunan',
[LaporanController::class, 'downloadTahunan']
)->name('laporan.tahunan');
/*
|--------------------------------------------------------------------------
| PROSES ANALISIS

View File

@ -1,12 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
<?php echo e($attributes); ?>
>
<path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z" />
</svg>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/icons/moon.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 609 B

View File

@ -1,51 +0,0 @@
<?php if (isset($component)) { $__componentOriginal74daf2d0a9c625ad90327a6043d15980 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal74daf2d0a9c625ad90327a6043d15980 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.card','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::card'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<div class="md:flex md:items-center md:justify-between md:gap-2">
<div class="min-w-0">
<div class="inline-block rounded-full bg-red-500/20 px-3 py-2 max-w-full text-sm font-bold leading-5 text-red-500 truncate lg:text-base dark:bg-red-500/20">
<span class="hidden md:inline">
<?php echo e($exception->class()); ?>
</span>
<span class="md:hidden">
<?php echo e(implode(' ', array_slice(explode('\\', $exception->class()), -1))); ?>
</span>
</div>
<div class="mt-4 text-lg font-semibold text-gray-900 break-words dark:text-white lg:text-2xl">
<?php echo e($exception->message()); ?>
</div>
</div>
<div class="hidden text-right shrink-0 md:block md:min-w-64 md:max-w-80">
<div>
<span class="inline-block rounded-full bg-gray-200 px-3 py-2 text-sm leading-5 text-gray-900 max-w-full truncate dark:bg-gray-800 dark:text-white">
<?php echo e($exception->request()->method()); ?> <?php echo e($exception->request()->httpHost()); ?>
</span>
</div>
<div class="px-4">
<span class="text-sm text-gray-500 dark:text-gray-400">PHP <?php echo e(PHP_VERSION); ?> — Laravel <?php echo e(app()->version()); ?></span>
</div>
</div>
</div>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $attributes = $__attributesOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $component = $__componentOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__componentOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/header.blade.php ENDPATH**/ ?>

View File

@ -1,33 +0,0 @@
<?php $__currentLoopData = $exception->frames(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<div
class="sm:col-span-2"
x-show="index === <?php echo e($loop->index); ?>"
>
<div class="mb-3">
<div class="text-md text-gray-500 dark:text-gray-400">
<div class="mb-2">
<?php if(config('app.editor')): ?>
<a href="<?php echo e($frame->editorHref()); ?>" class="text-blue-500 hover:underline">
<span class="wrap text-gray-900 dark:text-gray-300"><?php echo e($frame->file()); ?></span>
</a>
<?php else: ?>
<span class="wrap text-gray-900 dark:text-gray-300"><?php echo e($frame->file()); ?></span>
<?php endif; ?>
<span class="font-mono text-xs">:<?php echo e($frame->line()); ?></span>
</div>
</div>
</div>
<div class="pt-4 text-sm text-gray-500 dark:text-gray-400">
<pre class="h-[32.5rem] rounded-md dark:bg-gray-800 border dark:border-gray-700"><template x-if="true"><code
style="display: none;"
id="frame-<?php echo e($loop->index); ?>"
class="language-php highlightable-code <?php if($loop->index === $exception->defaultFrame()): ?> default-highlightable-code <?php endif; ?> scrollbar-hidden overflow-y-hidden"
data-line-number="<?php echo e($frame->line()); ?>"
data-ln-start-from="<?php echo e(max($frame->line() - 5, 1)); ?>"
><?php echo e($frame->snippet()); ?></code></template></pre>
</div>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/editor.blade.php ENDPATH**/ ?>

View File

@ -1,60 +0,0 @@
<?php use \Illuminate\Foundation\Exceptions\Renderer\Renderer; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1"
/>
<title><?php echo e(config('app.name', 'Laravel')); ?></title>
<link rel="icon" type="image/svg+xml"
href="data:image/svg+xml,%3Csvg viewBox='0 -.11376601 49.74245785 51.31690859' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='m49.626 11.564a.809.809 0 0 1 .028.209v10.972a.8.8 0 0 1 -.402.694l-9.209 5.302v10.509c0 .286-.152.55-.4.694l-19.223 11.066c-.044.025-.092.041-.14.058-.018.006-.035.017-.054.022a.805.805 0 0 1 -.41 0c-.022-.006-.042-.018-.063-.026-.044-.016-.09-.03-.132-.054l-19.219-11.066a.801.801 0 0 1 -.402-.694v-32.916c0-.072.01-.142.028-.21.006-.023.02-.044.028-.067.015-.042.029-.085.051-.124.015-.026.037-.047.055-.071.023-.032.044-.065.071-.093.023-.023.053-.04.079-.06.029-.024.055-.05.088-.069h.001l9.61-5.533a.802.802 0 0 1 .8 0l9.61 5.533h.002c.032.02.059.045.088.068.026.02.055.038.078.06.028.029.048.062.072.094.017.024.04.045.054.071.023.04.036.082.052.124.008.023.022.044.028.068a.809.809 0 0 1 .028.209v20.559l8.008-4.611v-10.51c0-.07.01-.141.028-.208.007-.024.02-.045.028-.068.016-.042.03-.085.052-.124.015-.026.037-.047.054-.071.024-.032.044-.065.072-.093.023-.023.052-.04.078-.06.03-.024.056-.05.088-.069h.001l9.611-5.533a.801.801 0 0 1 .8 0l9.61 5.533c.034.02.06.045.09.068.025.02.054.038.077.06.028.029.048.062.072.094.018.024.04.045.054.071.023.039.036.082.052.124.009.023.022.044.028.068zm-1.574 10.718v-9.124l-3.363 1.936-4.646 2.675v9.124l8.01-4.611zm-9.61 16.505v-9.13l-4.57 2.61-13.05 7.448v9.216zm-36.84-31.068v31.068l17.618 10.143v-9.214l-9.204-5.209-.003-.002-.004-.002c-.031-.018-.057-.044-.086-.066-.025-.02-.054-.036-.076-.058l-.002-.003c-.026-.025-.044-.056-.066-.084-.02-.027-.044-.05-.06-.078l-.001-.003c-.018-.03-.029-.066-.042-.1-.013-.03-.03-.058-.038-.09v-.001c-.01-.038-.012-.078-.016-.117-.004-.03-.012-.06-.012-.09v-21.483l-4.645-2.676-3.363-1.934zm8.81-5.994-8.007 4.609 8.005 4.609 8.006-4.61-8.006-4.608zm4.164 28.764 4.645-2.674v-20.096l-3.363 1.936-4.646 2.675v20.096zm24.667-23.325-8.006 4.609 8.006 4.609 8.005-4.61zm-.801 10.605-4.646-2.675-3.363-1.936v9.124l4.645 2.674 3.364 1.937zm-18.422 20.561 11.743-6.704 5.87-3.35-8-4.606-9.211 5.303-8.395 4.833z' fill='%23ff2d20'/%3E%3C/svg%3E" />
<link
href="https://fonts.bunny.net/css?family=figtree:300,400,500,600"
rel="stylesheet"
/>
<?php echo Renderer::css(); ?>
<style>
<?php $__currentLoopData = $exception->frames(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
#frame-<?php echo e($loop->index); ?> .hljs-ln-line[data-line-number='<?php echo e($frame->line()); ?>'] {
background-color: rgba(242, 95, 95, 0.4);
}
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</style>
</head>
<body class="bg-gray-200/80 font-sans antialiased dark:bg-gray-950/95">
<?php echo e($slot); ?>
<?php echo Renderer::js(); ?>
<script>
!function(r,o){"use strict";var e,i="hljs-ln",l="hljs-ln-line",h="hljs-ln-code",s="hljs-ln-numbers",c="hljs-ln-n",m="data-line-number",a=/\r\n|\r|\n/g;function u(e){for(var n=e.toString(),t=e.anchorNode;"TD"!==t.nodeName;)t=t.parentNode;for(var r=e.focusNode;"TD"!==r.nodeName;)r=r.parentNode;var o=parseInt(t.dataset.lineNumber),a=parseInt(r.dataset.lineNumber);if(o==a)return n;var i,l=t.textContent,s=r.textContent;for(a<o&&(i=o,o=a,a=i,i=l,l=s,s=i);0!==n.indexOf(l);)l=l.slice(1);for(;-1===n.lastIndexOf(s);)s=s.slice(0,-1);for(var c=l,u=function(e){for(var n=e;"TABLE"!==n.nodeName;)n=n.parentNode;return n}(t),d=o+1;d<a;++d){var f=p('.{0}[{1}="{2}"]',[h,m,d]);c+="\n"+u.querySelector(f).textContent}return c+="\n"+s}function n(e){try{var n=o.querySelectorAll("code.hljs,code.nohighlight");for(var t in n)n.hasOwnProperty(t)&&(n[t].classList.contains("nohljsln")||d(n[t],e))}catch(e){r.console.error("LineNumbers error: ",e)}}function d(e,n){"object"==typeof e&&r.setTimeout(function(){e.innerHTML=f(e,n)},0)}function f(e,n){var t,r,o=(t=e,{singleLine:function(e){return!!e.singleLine&&e.singleLine}(r=(r=n)||{}),startFrom:function(e,n){var t=1;isFinite(n.startFrom)&&(t=n.startFrom);var r=function(e,n){return e.hasAttribute(n)?e.getAttribute(n):null}(e,"data-ln-start-from");return null!==r&&(t=function(e,n){if(!e)return n;var t=Number(e);return isFinite(t)?t:n}(r,1)),t}(t,r)});return function e(n){var t=n.childNodes;for(var r in t){var o;t.hasOwnProperty(r)&&(o=t[r],0<(o.textContent.trim().match(a)||[]).length&&(0<o.childNodes.length?e(o):v(o.parentNode)))}}(e),function(e,n){var t=g(e);""===t[t.length-1].trim()&&t.pop();if(1<t.length||n.singleLine){for(var r="",o=0,a=t.length;o<a;o++)r+=p('<tr><td class="{0} {1}" {3}="{5}"><div class="{2}" {3}="{5}"></div></td><td class="{0} {4}" {3}="{5}">{6}</td></tr>',[l,s,c,m,h,o+n.startFrom,0<t[o].length?t[o]:" "]);return p('<table class="{0}">{1}</table>',[i,r])}return e}(e.innerHTML,o)}function v(e){var n=e.className;if(/hljs-/.test(n)){for(var t=g(e.innerHTML),r=0,o="";r<t.length;r++){o+=p('<span class="{0}">{1}</span>\n',[n,0<t[r].length?t[r]:" "])}e.innerHTML=o.trim()}}function g(e){return 0===e.length?[]:e.split(a)}function p(e,t){return e.replace(/\{(\d+)\}/g,function(e,n){return void 0!==t[n]?t[n]:e})}r.hljs?(r.hljs.initLineNumbersOnLoad=function(e){"interactive"===o.readyState||"complete"===o.readyState?n(e):r.addEventListener("DOMContentLoaded",function(){n(e)})},r.hljs.lineNumbersBlock=d,r.hljs.lineNumbersValue=function(e,n){if("string"!=typeof e)return;var t=document.createElement("code");return t.innerHTML=e,f(t,n)},(e=o.createElement("style")).type="text/css",e.innerHTML=p(".{0}{border-collapse:collapse}.{0} td{padding:0}.{1}:before{content:attr({2})}",[i,c,m]),o.getElementsByTagName("head")[0].appendChild(e)):r.console.error("highlight.js not detected!"),document.addEventListener("copy",function(e){var n,t=window.getSelection();!function(e){for(var n=e;n;){if(n.className&&-1!==n.className.indexOf("hljs-ln-code"))return 1;n=n.parentNode}}(t.anchorNode)||(n=-1!==window.navigator.userAgent.indexOf("Edge")?u(t):t.toString(),e.clipboardData.setData("text/plain",n),e.preventDefault())})}(window,document);
hljs.initLineNumbersOnLoad()
window.addEventListener('load', function() {
document.querySelectorAll('.renderer').forEach(function(element, index) {
if (index > 0) {
element.remove();
}
});
document.querySelector('.default-highlightable-code').style.display = 'block';
document.querySelectorAll('.highlightable-code').forEach(function(element) {
element.style.display = 'block';
})
});
</script>
</body>
</html>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/layout.blade.php ENDPATH**/ ?>

View File

@ -1,117 +0,0 @@
<?php if($paginator->hasPages()): ?>
<nav role="navigation" aria-label="<?php echo e(__('Pagination Navigation')); ?>" class="flex items-center justify-between">
<div class="flex justify-between flex-1 sm:hidden">
<?php if($paginator->onFirstPage()): ?>
<span class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md dark:text-gray-600 dark:bg-gray-800 dark:border-gray-600">
<?php echo __('pagination.previous'); ?>
</span>
<?php else: ?>
<a href="<?php echo e($paginator->previousPageUrl()); ?>" class="relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:focus:border-blue-700 dark:active:bg-gray-700 dark:active:text-gray-300">
<?php echo __('pagination.previous'); ?>
</a>
<?php endif; ?>
<?php if($paginator->hasMorePages()): ?>
<a href="<?php echo e($paginator->nextPageUrl()); ?>" class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 rounded-md hover:text-gray-500 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-300 dark:focus:border-blue-700 dark:active:bg-gray-700 dark:active:text-gray-300">
<?php echo __('pagination.next'); ?>
</a>
<?php else: ?>
<span class="relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 rounded-md dark:text-gray-600 dark:bg-gray-800 dark:border-gray-600">
<?php echo __('pagination.next'); ?>
</span>
<?php endif; ?>
</div>
<div class="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between">
<div>
<p class="text-sm text-gray-700 leading-5 dark:text-gray-400">
<?php echo __('Showing'); ?>
<?php if($paginator->firstItem()): ?>
<span class="font-medium"><?php echo e($paginator->firstItem()); ?></span>
<?php echo __('to'); ?>
<span class="font-medium"><?php echo e($paginator->lastItem()); ?></span>
<?php else: ?>
<?php echo e($paginator->count()); ?>
<?php endif; ?>
<?php echo __('of'); ?>
<span class="font-medium"><?php echo e($paginator->total()); ?></span>
<?php echo __('results'); ?>
</p>
</div>
<div>
<span class="relative z-0 inline-flex rtl:flex-row-reverse shadow-sm rounded-md">
<?php if($paginator->onFirstPage()): ?>
<span aria-disabled="true" aria-label="<?php echo e(__('pagination.previous')); ?>">
<span class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-l-md leading-5 dark:bg-gray-800 dark:border-gray-600" aria-hidden="true">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
</svg>
</span>
</span>
<?php else: ?>
<a href="<?php echo e($paginator->previousPageUrl()); ?>" rel="prev" class="relative inline-flex items-center px-2 py-2 text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-l-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:active:bg-gray-700 dark:focus:border-blue-800" aria-label="<?php echo e(__('pagination.previous')); ?>">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" />
</svg>
</a>
<?php endif; ?>
<?php $__currentLoopData = $elements; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $element): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(is_string($element)): ?>
<span aria-disabled="true">
<span class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700 bg-white border border-gray-300 cursor-default leading-5 dark:bg-gray-800 dark:border-gray-600"><?php echo e($element); ?></span>
</span>
<?php endif; ?>
<?php if(is_array($element)): ?>
<?php $__currentLoopData = $element; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $page => $url): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if($page == $paginator->currentPage()): ?>
<span aria-current="page">
<span class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default leading-5 dark:bg-gray-800 dark:border-gray-600"><?php echo e($page); ?></span>
</span>
<?php else: ?>
<a href="<?php echo e($url); ?>" class="relative inline-flex items-center px-4 py-2 -ml-px text-sm font-medium text-gray-700 bg-white border border-gray-300 leading-5 hover:text-gray-500 focus:z-10 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-700 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:text-gray-400 dark:hover:text-gray-300 dark:active:bg-gray-700 dark:focus:border-blue-800" aria-label="<?php echo e(__('Go to page :page', ['page' => $page])); ?>">
<?php echo e($page); ?>
</a>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
<?php if($paginator->hasMorePages()): ?>
<a href="<?php echo e($paginator->nextPageUrl()); ?>" rel="next" class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 rounded-r-md leading-5 hover:text-gray-400 focus:z-10 focus:outline-none focus:ring ring-gray-300 focus:border-blue-300 active:bg-gray-100 active:text-gray-500 transition ease-in-out duration-150 dark:bg-gray-800 dark:border-gray-600 dark:active:bg-gray-700 dark:focus:border-blue-800" aria-label="<?php echo e(__('pagination.next')); ?>">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
</svg>
</a>
<?php else: ?>
<span aria-disabled="true" aria-label="<?php echo e(__('pagination.next')); ?>">
<span class="relative inline-flex items-center px-2 py-2 -ml-px text-sm font-medium text-gray-500 bg-white border border-gray-300 cursor-default rounded-r-md leading-5 dark:bg-gray-800 dark:border-gray-600" aria-hidden="true">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" />
</svg>
</span>
</span>
<?php endif; ?>
</span>
</div>
</div>
</nav>
<?php endif; ?>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Pagination/resources/views/tailwind.blade.php ENDPATH**/ ?>

View File

@ -1,186 +0,0 @@
<?php use \Illuminate\Support\Str; ?>
<?php if (isset($component)) { $__componentOriginal74daf2d0a9c625ad90327a6043d15980 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal74daf2d0a9c625ad90327a6043d15980 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.card','data' => ['class' => 'mt-6 overflow-x-auto']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::card'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'mt-6 overflow-x-auto']); ?>
<div>
<span class="text-xl font-bold lg:text-2xl">Request</span>
</div>
<div class="mt-2">
<span><?php echo e($exception->request()->method()); ?></span>
<span class="text-gray-500"><?php echo e(Str::start($exception->request()->path(), '/')); ?></span>
</div>
<div class="mt-4">
<span class="font-semibold text-gray-900 dark:text-white">Headers</span>
</div>
<dl class="mt-1 grid grid-cols-1 rounded border dark:border-gray-800">
<?php $__empty_1 = true; $__currentLoopData = $exception->requestHeaders(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<div class="flex items-center gap-2 <?php echo e($loop->first ? '' : 'border-t'); ?> dark:border-gray-800">
<span
data-tippy-content="<?php echo e($key); ?>"
class="lg:text-md w-[8rem] flex-none cursor-pointer truncate border-r px-5 py-3 text-sm dark:border-gray-800 lg:w-[12rem]"
>
<?php echo e($key); ?>
</span>
<span
class="min-w-0 flex-grow"
style="
-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem));
"
>
<pre class="scrollbar-hidden overflow-y-hidden text-xs lg:text-sm"><code class="px-5 py-3 overflow-y-hidden scrollbar-hidden max-h-32 overflow-x-scroll scrollbar-hidden-x"><?php echo e($value); ?></code></pre>
</span>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<span
class="min-w-0 flex-grow"
style="-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem))"
>
<pre class="scrollbar-hidden mx-5 my-3 overflow-y-hidden text-xs lg:text-sm"><code class="overflow-y-hidden scrollbar-hidden overflow-x-scroll scrollbar-hidden-x">No headers data</code></pre>
</span>
<?php endif; ?>
</dl>
<div class="mt-4">
<span class="font-semibold text-gray-900 dark:text-white">Body</span>
</div>
<div class="mt-1 rounded border dark:border-gray-800">
<div class="flex items-center">
<span
class="min-w-0 flex-grow"
style="-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem))"
>
<pre class="scrollbar-hidden mx-5 my-3 overflow-y-hidden text-xs lg:text-sm"><code class="overflow-y-hidden scrollbar-hidden overflow-x-scroll scrollbar-hidden-x"><?php echo e($exception->requestBody() ?: 'No body data'); ?></code></pre>
</span>
</div>
</div>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $attributes = $__attributesOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $component = $__componentOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__componentOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal74daf2d0a9c625ad90327a6043d15980 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal74daf2d0a9c625ad90327a6043d15980 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.card','data' => ['class' => 'mt-6 overflow-x-auto']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::card'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'mt-6 overflow-x-auto']); ?>
<div>
<span class="text-xl font-bold lg:text-2xl">Application</span>
</div>
<div class="mt-4">
<span class="font-semibold text-gray-900 dark:text-white"> Routing </span>
</div>
<dl class="mt-1 grid grid-cols-1 rounded border dark:border-gray-800">
<?php $__empty_1 = true; $__currentLoopData = $exception->applicationRouteContext(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $name => $value): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<div class="flex items-center gap-2 <?php echo e($loop->first ? '' : 'border-t'); ?> dark:border-gray-800">
<span
data-tippy-content="<?php echo e($name); ?>"
class="lg:text-md w-[8rem] flex-none cursor-pointer truncate border-r px-5 py-3 text-sm dark:border-gray-800 lg:w-[12rem]"
><?php echo e($name); ?></span
>
<span
class="min-w-0 flex-grow"
style="
-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem));
"
>
<pre class="scrollbar-hidden overflow-y-hidden text-xs lg:text-sm"><code class="px-5 py-3 overflow-y-hidden scrollbar-hidden max-h-32 overflow-x-scroll scrollbar-hidden-x"><?php echo e($value); ?></code></pre>
</span>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<span
class="min-w-0 flex-grow"
style="-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem))"
>
<pre class="scrollbar-hidden mx-5 my-3 overflow-y-hidden text-xs lg:text-sm"><code class="overflow-y-hidden scrollbar-hidden overflow-x-scroll scrollbar-hidden-x">No routing data</code></pre>
</span>
<?php endif; ?>
</dl>
<?php if($routeParametersContext = $exception->applicationRouteParametersContext()): ?>
<div class="mt-4">
<span class="text-gray-900 dark:text-white text-sm"> Routing Parameters </span>
</div>
<div class="mt-1 rounded border dark:border-gray-800">
<div class="flex items-center">
<span
class="min-w-0 flex-grow"
style="-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem))"
>
<pre class="scrollbar-hidden mx-5 my-3 overflow-y-hidden text-xs lg:text-sm"><code class="overflow-y-hidden scrollbar-hidden overflow-x-scroll scrollbar-hidden-x"><?php echo e($routeParametersContext); ?></code></pre>
</span>
</div>
</div>
<?php endif; ?>
<div class="mt-4">
<span class="font-semibold text-gray-900 dark:text-white"> Database Queries </span>
<span class="text-xs text-gray-500 dark:text-gray-400">
<?php if(count($exception->applicationQueries()) === 100): ?>
only the first 100 queries are displayed
<?php endif; ?>
</span>
</div>
<dl class="mt-1 grid grid-cols-1 rounded border dark:border-gray-800">
<?php $__empty_1 = true; $__currentLoopData = $exception->applicationQueries(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as ['connectionName' => $connectionName, 'sql' => $sql, 'time' => $time]): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<div class="flex items-center gap-2 <?php echo e($loop->first ? '' : 'border-t'); ?> dark:border-gray-800">
<div class="lg:text-md w-[8rem] flex-none truncate border-r px-5 py-3 text-sm dark:border-gray-800 lg:w-[12rem]">
<span><?php echo e($connectionName); ?></span>
<span class="hidden text-xs text-gray-500 lg:inline-block">(<?php echo e($time); ?> ms)</span>
</div>
<span
class="min-w-0 flex-grow"
style="
-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem));
"
>
<pre class="scrollbar-hidden overflow-y-hidden text-xs lg:text-sm"><code class="px-5 py-3 overflow-y-hidden scrollbar-hidden max-h-32 overflow-x-scroll scrollbar-hidden-x"><?php echo e($sql); ?></code></pre>
</span>
</div>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<span
class="min-w-0 flex-grow"
style="-webkit-mask-image: linear-gradient(90deg, transparent 0, #000 1rem, #000 calc(100% - 3rem), transparent calc(100% - 1rem))"
>
<pre class="scrollbar-hidden mx-5 my-3 overflow-y-hidden text-xs lg:text-sm"><code class="overflow-y-hidden scrollbar-hidden overflow-x-scroll scrollbar-hidden-x">No query data</code></pre>
</span>
<?php endif; ?>
</dl>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $attributes = $__attributesOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $component = $__componentOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__componentOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/context.blade.php ENDPATH**/ ?>

View File

@ -1,40 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Password Berhasil Direset</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-[#f5f7fb] min-h-screen flex items-center justify-center px-4">
<div class="w-full max-w-md bg-white rounded-2xl shadow-lg p-8 text-center">
<div class="flex justify-center mb-5">
<div class="w-20 h-20 rounded-full bg-green-100 flex items-center justify-center">
<svg xmlns="http://www.w3.org/2000/svg" class="h-10 w-10 text-green-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7" />
</svg>
</div>
</div>
<h2 class="text-2xl font-bold text-[#1e3a8a] mb-3">
Password Berhasil Direset
</h2>
<p class="text-gray-500 mb-6">
Password akun Anda berhasil diperbarui. Silakan login kembali menggunakan password baru.
</p>
<a
href="<?php echo e(url('/login')); ?>"
class="inline-block bg-blue-600 hover:bg-blue-700 text-white px-6 py-3 rounded-xl font-semibold transition duration-200"
>
Kembali ke Login
</a>
</div>
</body>
</html><?php /**PATH C:\laragon\www\SistemAnalisisSentimen\resources\views/auth/reset-success.blade.php ENDPATH**/ ?>

View File

@ -1,12 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
<?php echo e($attributes); ?>
>
<path stroke-linecap="round" stroke-linejoin="round" d="M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25" />
</svg>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/icons/computer-desktop.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 700 B

View File

@ -0,0 +1,377 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title><?php echo e($judulLaporan); ?></title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js"></script>
<style>
* { box-sizing: border-box; }
body {
font-family: Arial, sans-serif;
background: #f1f5f9;
color: #1f2937;
margin: 0;
padding: 24px;
}
/* ── Sticky action bar pojok kanan atas ── */
.action-bar {
position: fixed;
top: 16px;
right: 24px;
display: flex;
gap: 8px;
z-index: 999;
}
.btn {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 9px 18px;
border-radius: 8px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
border: none;
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
transition: opacity .2s;
}
.btn:hover { opacity: .85; }
.btn-primary { background: #1d4ed8; color: white; }
.btn-secondary { background: white; color: #374151; border: 1px solid #d1d5db; }
.container {
max-width: 960px;
margin: 0 auto;
background: white;
border-radius: 16px;
padding: 28px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
}
/* LOGO */
.logo { font-size: 26px; font-weight: 800; color: #1e3a8a; margin-bottom: 20px; }
/* HERO */
.hero {
border: 1px solid #dbeafe;
background: linear-gradient(135deg, #eff6ff, #f7f8ff);
border-radius: 12px;
padding: 22px 24px;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 24px;
}
.hero-title { font-size: 22px; font-weight: 800; color: #132b70; line-height: 1.3; }
.hero-sub { margin-top: 6px; color: #374151; font-size: 13px; }
.hero-right {
min-width: 160px;
border: 1px solid #dbeafe;
border-radius: 10px;
padding: 14px 16px;
background: white;
font-size: 13px;
line-height: 1.8;
}
/* SECTION TITLE */
.section-title {
font-weight: 700;
font-size: 13px;
color: #1e3a8a;
letter-spacing: .5px;
margin: 24px 0 14px;
text-transform: uppercase;
}
/* CARDS */
.cards { display: flex; gap: 12px; margin-bottom: 24px; }
.card {
flex: 1;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 16px;
}
.card .card-label { font-size: 12px; color: #6b7280; margin-bottom: 6px; }
.card .card-value { font-size: 26px; font-weight: 800; margin: 0; }
.card .card-unit { font-size: 12px; color: #9ca3af; margin-top: 4px; }
.blue { background: #eff6ff; border-color: #bfdbfe; }
.green { background: #f0fdf4; border-color: #bbf7d0; }
.yellow { background: #fffbeb; border-color: #fde68a; }
.purple { background: #faf5ff; border-color: #e9d5ff; }
/* CHARTS */
.chart-row { display: flex; gap: 16px; margin-bottom: 24px; align-items: flex-start; }
.box-pie {
width: 260px;
flex-shrink: 0;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 16px;
display: flex;
flex-direction: column;
align-items: center;
}
.box-bar {
flex: 1;
border: 1px solid #e5e7eb;
border-radius: 12px;
padding: 16px;
min-width: 0;
}
.box-pie h4, .box-bar h4 {
margin: 0 0 12px;
font-size: 12px;
color: #1e3a8a;
font-weight: 700;
text-transform: uppercase;
letter-spacing: .4px;
width: 100%;
}
/* TABLE */
table { width: 100%; border-collapse: collapse; margin-top: 8px; }
table th { background: #f8fafc; font-size: 12px; font-weight: 600; }
table th, table td { border: 1px solid #e5e7eb; padding: 9px 11px; font-size: 12px; }
.badge {
background: #dcfce7;
color: #15803d;
border-radius: 20px;
padding: 3px 10px;
font-weight: 600;
font-size: 11px;
}
/* KESIMPULAN */
.kesimpulan {
border: 1px solid #dbeafe;
background: #eff6ff;
border-radius: 10px;
padding: 16px 18px;
margin-top: 20px;
font-size: 13px;
}
/* FOOTER */
.footer {
margin-top: 24px;
padding-top: 14px;
border-top: 1px solid #e5e7eb;
font-size: 12px;
display: flex;
justify-content: space-between;
color: #6b7280;
}
/* Sembunyikan action bar saat print */
@media print {
body { background: white; padding: 0; }
.action-bar { display: none !important; }
}
</style>
</head>
<body>
<div class="action-bar" id="actionBar">
<button class="btn btn-secondary" onclick="cetakHalaman()">🖨️ Cetak</button>
</div>
<div class="container" id="isiLaporan">
<div class="logo">SENTARA</div>
<div class="hero">
<div class="hero-left">
<div class="hero-title">LAPORAN ANALISIS SENTIMEN<br>PER BULAN</div>
<div class="hero-sub">SISTEM ANALISIS SENTIMEN WISATA JEMBER</div>
</div>
<div class="hero-right">
<b>Periode</b><br>
<?php echo e($periode->nama ?? '-'); ?><br><br>
<b>Tanggal Cetak</b><br>
<?php echo e(now()->format('d M Y H:i')); ?>
</div>
</div>
<div class="section-title">Ringkasan</div>
<div class="cards">
<div class="card blue">
<div class="card-label">Total Ulasan</div>
<p class="card-value"><?php echo e($totalUlasanKotor); ?></p>
<div class="card-unit">Ulasan Masuk</div>
</div>
<div class="card green">
<div class="card-label">Hasil Analisis</div>
<p class="card-value"><?php echo e($totalUlasan); ?></p>
<div class="card-unit">Data Bersih</div>
</div>
<div class="card yellow">
<div class="card-label">Wisata Dibahas</div>
<p class="card-value"><?php echo e(count($perWisata)); ?></p>
<div class="card-unit">Destinasi</div>
</div>
<div class="card purple">
<div class="card-label">Akurasi Analisis</div>
<p class="card-value"><?php echo e(number_format(($evaluasi->accuracy ?? 0) * 100, 2)); ?>%</p>
<div class="card-unit">Model</div>
</div>
</div>
<div class="section-title">Visualisasi</div>
<div class="chart-row">
<div class="box-pie">
<h4>Distribusi Sentimen</h4>
<canvas id="pieChart" width="220" height="220"></canvas>
</div>
<div class="box-bar">
<h4>Sentimen per Destinasi</h4>
<canvas id="barChart"></canvas>
</div>
</div>
<div class="section-title">Top Wisata Berdasarkan Sentimen Positif</div>
<table>
<tr>
<th>No</th>
<th>Wisata</th>
<th>Total</th>
<th>Positif</th>
<th>Netral</th>
<th>Negatif</th>
<th>% Positif</th>
</tr>
<?php $__currentLoopData = $perWisata; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $i => $w): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<tr>
<td><?php echo e($i + 1); ?></td>
<td><?php echo e($w->wisata); ?></td>
<td><?php echo e($w->total); ?></td>
<td><?php echo e($w->positif); ?></td>
<td><?php echo e($w->netral); ?></td>
<td><?php echo e($w->negatif); ?></td>
<td><span class="badge"><?php echo e($w->total > 0 ? round(($w->positif / $w->total) * 100, 2) : 0); ?>%</span></td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</table>
<div class="kesimpulan">
<b>KESIMPULAN</b>
<p style="margin:8px 0 0">
Pada periode <b><?php echo e($periode->nama ?? ''); ?></b>,
terdapat <b><?php echo e($totalUlasanKotor); ?></b> ulasan masuk dengan
<b><?php echo e($totalUlasan); ?></b> data berhasil dianalisis.
Sentimen positif mendominasi dengan persentase <b><?php echo e($persen['positif'] ?? 0); ?>%</b>,
diikuti netral <b><?php echo e($persen['netral'] ?? 0); ?>%</b>
dan negatif <b><?php echo e($persen['negatif'] ?? 0); ?>%</b>.
</p>
</div>
<div class="footer">
<div>SENTARA Sistem Analisis Sentimen Wisata Jember</div>
<div>Dicetak oleh: Admin &nbsp;|&nbsp; <?php echo e(now()->format('d M Y H:i')); ?></div>
</div>
</div>
<script>
// ── PIE / DOUGHNUT CHART ──
new Chart(document.getElementById('pieChart'), {
type: 'doughnut',
data: {
labels: ['Positif', 'Netral', 'Negatif'],
datasets: [{
data: [<?php echo e($totalPositif); ?>, <?php echo e($totalNetral); ?>, <?php echo e($totalNegatif); ?>],
backgroundColor: ['#22c55e', '#f59e0b', '#ef4444'],
borderWidth: 2,
borderColor: '#fff'
}]
},
options: {
responsive: false,
animation: false,
plugins: {
legend: { position: 'bottom', labels: { font: { size: 11 }, padding: 10 } }
}
}
});
// ── BAR CHART SENTIMEN PER DESTINASI ──
const wisataLabels = <?php echo json_encode($perWisata->pluck('wisata'), 15, 512) ?>;
const wisataPos = <?php echo json_encode($perWisata->pluck('positif'), 15, 512) ?>;
const wisataNet = <?php echo json_encode($perWisata->pluck('netral'), 15, 512) ?>;
const wisataNeg = <?php echo json_encode($perWisata->pluck('negatif'), 15, 512) ?>;
new Chart(document.getElementById('barChart'), {
type: 'bar',
data: {
labels: wisataLabels,
datasets: [
{ label: 'Positif', data: wisataPos, backgroundColor: '#22c55e' },
{ label: 'Netral', data: wisataNet, backgroundColor: '#f59e0b' },
{ label: 'Negatif', data: wisataNeg, backgroundColor: '#ef4444' }
]
},
options: {
responsive: true,
maintainAspectRatio: true,
animation: false,
plugins: {
legend: { position: 'bottom', labels: { font: { size: 11 } } }
},
scales: {
y: { beginAtZero: true, ticks: { font: { size: 11 } } },
x: { ticks: { font: { size: 10 } } }
}
}
});
// ── CETAK ──
function cetakHalaman() {
window.print();
}
// ── SIMPAN PDF ──
function simpanPDF() {
const el = document.getElementById('isiLaporan');
const bar = document.getElementById('actionBar');
bar.style.display = 'none';
html2pdf().set({
margin: 10,
filename: 'Laporan-<?php echo e(Str::slug($periode->nama ?? "bulanan")); ?>.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2, useCORS: true },
jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' }
}).from(el).save().then(() => {
bar.style.display = 'flex';
});
}
</script>
</body>
</html><?php /**PATH C:\laragon\www\SistemAnalisisSentimen\resources\views/laporan/bulanan.blade.php ENDPATH**/ ?>

View File

@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-4 h-4" style="margin-bottom: -8px;">
<path fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06Z" clip-rule="evenodd" />
</svg>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/icons/chevron-down.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 524 B

View File

@ -1,12 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
<?php echo e($attributes); ?>
>
<path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z" />
</svg>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/icons/sun.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 625 B

View File

@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" class="w-4 h-4" style="margin-bottom: -8px;">
<path fill-rule="evenodd" d="M9.47 6.47a.75.75 0 0 1 1.06 0l4.25 4.25a.75.75 0 1 1-1.06 1.06L10 8.06l-3.72 3.72a.75.75 0 0 1-1.06-1.06l4.25-4.25Z" clip-rule="evenodd" />
</svg>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/icons/chevron-up.blade.php ENDPATH**/ ?>

Before

Width:  |  Height:  |  Size: 502 B

View File

@ -1,194 +0,0 @@
<script>
(function () {
const darkStyles = document.querySelector('style[data-theme="dark"]')?.textContent
const lightStyles = document.querySelector('style[data-theme="light"]')?.textContent
const removeStyles = () => {
document.querySelector('style[data-theme="dark"]')?.remove()
document.querySelector('style[data-theme="light"]')?.remove()
}
removeStyles()
setDarkClass = () => {
removeStyles()
const isDark = localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)
isDark ? document.documentElement.classList.add('dark') : document.documentElement.classList.remove('dark')
if (isDark) {
document.head.insertAdjacentHTML('beforeend', `<style data-theme="dark">${darkStyles}</style>`)
} else {
document.head.insertAdjacentHTML('beforeend', `<style data-theme="light">${lightStyles}</style>`)
}
}
setDarkClass()
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', setDarkClass)
})();
</script>
<div
class="relative"
x-data="{
menu: false,
theme: localStorage.theme,
darkMode() {
this.theme = 'dark'
localStorage.theme = 'dark'
setDarkClass()
},
lightMode() {
this.theme = 'light'
localStorage.theme = 'light'
setDarkClass()
},
systemMode() {
this.theme = undefined
localStorage.removeItem('theme')
setDarkClass()
},
}"
@click.outside="menu = false"
>
<button
x-cloak
class="block rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-800"
:class="theme ? 'text-gray-700 dark:text-gray-300' : 'text-gray-400 dark:text-gray-600 hover:text-gray-500 focus:text-gray-500 dark:hover:text-gray-500 dark:focus:text-gray-500'"
@click="menu = ! menu"
>
<?php if (isset($component)) { $__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.sun','data' => ['class' => 'block h-5 w-5 dark:hidden']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.sun'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'block h-5 w-5 dark:hidden']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7)): ?>
<?php $attributes = $__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7; ?>
<?php unset($__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7)): ?>
<?php $component = $__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7; ?>
<?php unset($__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.moon','data' => ['class' => 'hidden h-5 w-5 dark:block']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.moon'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'hidden h-5 w-5 dark:block']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745)): ?>
<?php $attributes = $__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745; ?>
<?php unset($__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745)): ?>
<?php $component = $__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745; ?>
<?php unset($__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745); ?>
<?php endif; ?>
</button>
<div
x-show="menu"
class="absolute right-0 z-10 flex origin-top-right flex-col rounded-md bg-white shadow-xl ring-1 ring-gray-900/5 dark:bg-gray-800"
style="display: none"
@click="menu = false"
>
<button
class="flex items-center gap-3 px-4 py-2 hover:rounded-t-md hover:bg-gray-100 dark:hover:bg-gray-700"
:class="theme === 'light' ? 'text-gray-900 dark:text-gray-100' : 'text-gray-500 dark:text-gray-400'"
@click="lightMode()"
>
<?php if (isset($component)) { $__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.sun','data' => ['class' => 'h-5 w-5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.sun'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'h-5 w-5']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7)): ?>
<?php $attributes = $__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7; ?>
<?php unset($__attributesOriginalbfde029a2e31d1ec96b5017ff81a67a7); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7)): ?>
<?php $component = $__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7; ?>
<?php unset($__componentOriginalbfde029a2e31d1ec96b5017ff81a67a7); ?>
<?php endif; ?>
Light
</button>
<button
class="flex items-center gap-3 px-4 py-2 hover:bg-gray-100 dark:hover:bg-gray-700"
:class="theme === 'dark' ? 'text-gray-900 dark:text-gray-100' : 'text-gray-500 dark:text-gray-400'"
@click="darkMode()"
>
<?php if (isset($component)) { $__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.moon','data' => ['class' => 'h-5 w-5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.moon'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'h-5 w-5']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745)): ?>
<?php $attributes = $__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745; ?>
<?php unset($__attributesOriginal6dda8ad3ea7f20f6c0a87e7037386745); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745)): ?>
<?php $component = $__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745; ?>
<?php unset($__componentOriginal6dda8ad3ea7f20f6c0a87e7037386745); ?>
<?php endif; ?>
Dark
</button>
<button
class="flex items-center gap-3 px-4 py-2 hover:rounded-b-md hover:bg-gray-100 dark:hover:bg-gray-700"
:class="theme === undefined ? 'text-gray-900 dark:text-gray-100' : 'text-gray-500 dark:text-gray-400'"
@click="systemMode()"
>
<?php if (isset($component)) { $__componentOriginala52e607cb40b8eec566206ff9f3ca13c = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginala52e607cb40b8eec566206ff9f3ca13c = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.computer-desktop','data' => ['class' => 'h-5 w-5']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.computer-desktop'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'h-5 w-5']); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginala52e607cb40b8eec566206ff9f3ca13c)): ?>
<?php $attributes = $__attributesOriginala52e607cb40b8eec566206ff9f3ca13c; ?>
<?php unset($__attributesOriginala52e607cb40b8eec566206ff9f3ca13c); ?>
<?php endif; ?>
<?php if (isset($__componentOriginala52e607cb40b8eec566206ff9f3ca13c)): ?>
<?php $component = $__componentOriginala52e607cb40b8eec566206ff9f3ca13c; ?>
<?php unset($__componentOriginala52e607cb40b8eec566206ff9f3ca13c); ?>
<?php endif; ?>
System
</button>
</div>
</div>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/theme-switcher.blade.php ENDPATH**/ ?>

View File

@ -1,117 +0,0 @@
<?php $__env->startSection('content'); ?>
<div class="max-w-7xl mx-auto space-y-6">
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
<div>
<h2 class="text-2xl font-bold text-gray-800">Riwayat Analisis</h2>
<p class="text-sm text-gray-500">
Periode tersimpan otomatis setiap kali Ambil Data dijalankan.
</p>
</div>
</div>
<?php if(session('success')): ?>
<div class="bg-green-100 border-l-4 border-green-500 text-green-700 p-4 rounded">
<?php echo e(session('success')); ?>
</div>
<?php endif; ?>
<?php if(session('error')): ?>
<div class="bg-red-100 border-l-4 border-red-500 text-red-700 p-4 rounded whitespace-pre-line">
<?php echo e(session('error')); ?>
</div>
<?php endif; ?>
<div class="bg-white rounded-xl shadow p-6">
<h3 class="font-semibold text-gray-800 mb-1">Import Data Lama dari CSV</h3>
<p class="text-sm text-gray-500 mb-4">
Gunakan untuk memasukkan ulasan historis. Kolom wajib: wisata, rating, ulasan, tanggal. Kolom reviewer boleh ada.
</p>
<form action="<?php echo e(route('riwayat.import')); ?>" method="POST" enctype="multipart/form-data"
class="grid grid-cols-1 md:grid-cols-[180px_1fr_auto] gap-3 md:items-center">
<?php echo csrf_field(); ?>
<input type="month" name="periode_bulan" value="<?php echo e(now()->format('Y-m')); ?>"
class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-[150px]" required>
<input type="file" name="file" accept=".csv,.txt"
class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-0" required>
<button class="bg-green-600 hover:bg-green-700 text-white px-5 py-2 rounded-lg text-sm shadow">
Import CSV
</button>
</form>
<?php if($errors->any()): ?>
<div class="mt-3 text-sm text-red-600">
<?php echo e($errors->first()); ?>
</div>
<?php endif; ?>
</div>
<div class="bg-white rounded-xl shadow overflow-hidden">
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead class="bg-gray-100 text-left">
<tr>
<th class="px-4 py-3">Periode</th>
<th class="px-4 py-3 text-center">Total Ulasan</th>
<th class="px-4 py-3 text-center">Hasil Analisis</th>
<th class="px-4 py-3 text-center">Wisata</th>
<th class="px-4 py-3">Terakhir Analisis</th>
<th class="px-4 py-3 text-center">Aksi</th>
</tr>
</thead>
<tbody class="divide-y">
<?php $__empty_1 = true; $__currentLoopData = $riwayat; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3 font-semibold text-gray-800"><?php echo e($item->nama); ?></td>
<td class="px-4 py-3 text-center"><?php echo e($item->total_ulasan); ?></td>
<td class="px-4 py-3 text-center"><?php echo e($item->total_hasil); ?></td>
<td class="px-4 py-3 text-center"><?php echo e($item->total_wisata); ?></td>
<td class="px-4 py-3 text-gray-500">
<?php echo e($item->terakhir_analisis ? \Carbon\Carbon::parse($item->terakhir_analisis)->format('d M Y H:i') : '-'); ?>
</td>
<td class="px-4 py-3">
<div class="flex flex-wrap justify-center gap-2">
<a href="<?php echo e(route('dashboard', ['periode_id' => $item->id, 'tab' => 'analisis'])); ?>"
class="px-3 py-1 rounded-lg bg-green-50 text-green-600 hover:bg-green-100">
Analisis
</a>
<a href="<?php echo e(route('ulasan.index', ['periode_id' => $item->id])); ?>"
class="px-3 py-1 rounded-lg bg-gray-100 text-gray-700 hover:bg-gray-200">
Ulasan
</a>
</div>
</td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<tr>
<td colspan="6" class="px-4 py-8 text-center text-gray-400">
Belum ada riwayat analisis. Jalankan Ambil Data terlebih dahulu.
</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
<?php if($riwayat->hasPages()): ?>
<div class="p-4">
<?php echo e($riwayat->links()); ?>
</div>
<?php endif; ?>
</div>
</div>
<?php $__env->stopSection(); ?>
<?php echo $__env->make('layouts.sentara', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH C:\laragon\www\SistemAnalisisSentimen\resources\views/ulasan/riwayat.blade.php ENDPATH**/ ?>

View File

@ -1,110 +0,0 @@
<?php if (isset($component)) { $__componentOriginalbbd4eeea836234825f7514ed20d2d52d = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginalbbd4eeea836234825f7514ed20d2d52d = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.layout','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::layout'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?>
<div class="renderer container mx-auto lg:px-8">
<?php if (isset($component)) { $__componentOriginal10cd8b81fdad4ce00a06c99f27003014 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal10cd8b81fdad4ce00a06c99f27003014 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.navigation','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::navigation'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal10cd8b81fdad4ce00a06c99f27003014)): ?>
<?php $attributes = $__attributesOriginal10cd8b81fdad4ce00a06c99f27003014; ?>
<?php unset($__attributesOriginal10cd8b81fdad4ce00a06c99f27003014); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal10cd8b81fdad4ce00a06c99f27003014)): ?>
<?php $component = $__componentOriginal10cd8b81fdad4ce00a06c99f27003014; ?>
<?php unset($__componentOriginal10cd8b81fdad4ce00a06c99f27003014); ?>
<?php endif; ?>
<main class="px-6 pb-12 pt-6">
<div class="container mx-auto">
<?php if (isset($component)) { $__componentOriginal1e817eb3c41fe3ea9eb0c15213c4b557 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal1e817eb3c41fe3ea9eb0c15213c4b557 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.header','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::header'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal1e817eb3c41fe3ea9eb0c15213c4b557)): ?>
<?php $attributes = $__attributesOriginal1e817eb3c41fe3ea9eb0c15213c4b557; ?>
<?php unset($__attributesOriginal1e817eb3c41fe3ea9eb0c15213c4b557); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal1e817eb3c41fe3ea9eb0c15213c4b557)): ?>
<?php $component = $__componentOriginal1e817eb3c41fe3ea9eb0c15213c4b557; ?>
<?php unset($__componentOriginal1e817eb3c41fe3ea9eb0c15213c4b557); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal1dc7d865c9b6045c4d68faf8bde572ed = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal1dc7d865c9b6045c4d68faf8bde572ed = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.trace-and-editor','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::trace-and-editor'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal1dc7d865c9b6045c4d68faf8bde572ed)): ?>
<?php $attributes = $__attributesOriginal1dc7d865c9b6045c4d68faf8bde572ed; ?>
<?php unset($__attributesOriginal1dc7d865c9b6045c4d68faf8bde572ed); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal1dc7d865c9b6045c4d68faf8bde572ed)): ?>
<?php $component = $__componentOriginal1dc7d865c9b6045c4d68faf8bde572ed; ?>
<?php unset($__componentOriginal1dc7d865c9b6045c4d68faf8bde572ed); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal523928ff754f95aea6faf87444393a04 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal523928ff754f95aea6faf87444393a04 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.context','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::context'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal523928ff754f95aea6faf87444393a04)): ?>
<?php $attributes = $__attributesOriginal523928ff754f95aea6faf87444393a04; ?>
<?php unset($__attributesOriginal523928ff754f95aea6faf87444393a04); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal523928ff754f95aea6faf87444393a04)): ?>
<?php $component = $__componentOriginal523928ff754f95aea6faf87444393a04; ?>
<?php unset($__componentOriginal523928ff754f95aea6faf87444393a04); ?>
<?php endif; ?>
</div>
</main>
</div>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginalbbd4eeea836234825f7514ed20d2d52d)): ?>
<?php $attributes = $__attributesOriginalbbd4eeea836234825f7514ed20d2d52d; ?>
<?php unset($__attributesOriginalbbd4eeea836234825f7514ed20d2d52d); ?>
<?php endif; ?>
<?php if (isset($__componentOriginalbbd4eeea836234825f7514ed20d2d52d)): ?>
<?php $component = $__componentOriginalbbd4eeea836234825f7514ed20d2d52d; ?>
<?php unset($__componentOriginalbbd4eeea836234825f7514ed20d2d52d); ?>
<?php endif; ?>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/show.blade.php ENDPATH**/ ?>

View File

@ -1,150 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Reset Password - SENTARA</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
body{
background:#f5f7fb;
}
.left-panel{
background: linear-gradient(180deg,#0f3fb9,#1546cf);
}
.input-box{
width:100%;
border:1px solid #dbe3ef;
border-radius:10px;
padding:14px 16px;
outline:none;
}
.input-box:focus{
border-color:#2563eb;
box-shadow:0 0 0 3px rgba(37,99,235,.15);
}
</style>
</head>
<body class="min-h-screen flex items-center justify-center p-6">
<div class="bg-white rounded-3xl shadow-xl overflow-hidden max-w-5xl w-full grid md:grid-cols-2">
<!-- LEFT -->
<div class="left-panel text-white p-10 flex flex-col justify-between">
<div>
<img src="<?php echo e(asset('images/logo-sentara.png')); ?>"
class="w-56 mb-10"
alt="logo">
<h1 class="text-3xl font-bold mb-4">
Buat Password Baru
</h1>
<p class="text-blue-100 leading-7">
Masukkan password baru Anda
pada form di samping.
</p>
</div>
<div class="text-center mt-12 text-8xl">
🔐
</div>
</div>
<!-- RIGHT -->
<div class="p-10">
<h2 class="text-4xl font-bold text-slate-800 mb-3">
Reset Password
</h2>
<p class="text-slate-500 mb-8">
Masukkan password baru untuk akun Anda.
</p>
<?php if($errors->any()): ?>
<div class="bg-red-100 text-red-600 p-3 rounded-xl mb-5">
<?php echo e($errors->first()); ?>
</div>
<?php endif; ?>
<form method="POST" action="<?php echo e(route('custom.password.update')); ?>">
<?php echo csrf_field(); ?>
<input type="hidden"
name="token"
value="<?php echo e($token ?? request()->route('token')); ?>">
<input type="hidden"
name="email"
value="<?php echo e($email ?? request()->email); ?>">
<!-- PASSWORD -->
<div class="mb-6">
<label class="font-semibold block mb-2">
Password Baru
</label>
<input
type="password"
name="password"
placeholder="Masukkan password baru"
class="input-box"
required
>
<small class="text-gray-400">
Minimal 8 karakter
</small>
</div>
<!-- CONFIRM -->
<div class="mb-8">
<label class="font-semibold block mb-2">
Konfirmasi Password
</label>
<input
type="password"
name="password_confirmation"
placeholder="Konfirmasi password baru"
class="input-box"
required
>
</div>
<button
class="w-full bg-blue-600 hover:bg-blue-700 transition text-white py-4 rounded-xl font-semibold shadow-lg">
🔒 Reset Password
</button>
</form>
</div>
</div>
</body>
</html><?php /**PATH C:\laragon\www\SistemAnalisisSentimen\resources\views/auth/reset-password.blade.php ENDPATH**/ ?>

View File

@ -1,164 +0,0 @@
<div class="hidden overflow-x-auto sm:col-span-1 lg:block">
<div
class="h-[35.5rem] scrollbar-hidden trace text-sm text-gray-400 dark:text-gray-300"
>
<div class="mb-2 inline-block rounded-full bg-red-500/20 px-3 py-2 dark:bg-red-500/20 sm:col-span-1">
<button
@click="includeVendorFrames = !includeVendorFrames"
class="inline-flex items-center font-bold leading-5 text-red-500"
>
<span x-show="includeVendorFrames">Collapse</span>
<span
x-cloak
x-show="!includeVendorFrames"
>Expand</span
>
<span class="ml-1">vendor frames</span>
<div class="flex flex-col ml-1 -mt-2" x-cloak x-show="includeVendorFrames">
<?php if (isset($component)) { $__componentOriginal707ceba27255eae48fdb0f3529710ddf = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal707ceba27255eae48fdb0f3529710ddf = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevron-down','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevron-down'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal707ceba27255eae48fdb0f3529710ddf)): ?>
<?php $attributes = $__attributesOriginal707ceba27255eae48fdb0f3529710ddf; ?>
<?php unset($__attributesOriginal707ceba27255eae48fdb0f3529710ddf); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal707ceba27255eae48fdb0f3529710ddf)): ?>
<?php $component = $__componentOriginal707ceba27255eae48fdb0f3529710ddf; ?>
<?php unset($__componentOriginal707ceba27255eae48fdb0f3529710ddf); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal14b1cc5db95fcca4a0f06445821cff39 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal14b1cc5db95fcca4a0f06445821cff39 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevron-up','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevron-up'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal14b1cc5db95fcca4a0f06445821cff39)): ?>
<?php $attributes = $__attributesOriginal14b1cc5db95fcca4a0f06445821cff39; ?>
<?php unset($__attributesOriginal14b1cc5db95fcca4a0f06445821cff39); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal14b1cc5db95fcca4a0f06445821cff39)): ?>
<?php $component = $__componentOriginal14b1cc5db95fcca4a0f06445821cff39; ?>
<?php unset($__componentOriginal14b1cc5db95fcca4a0f06445821cff39); ?>
<?php endif; ?>
</div>
<div class="flex flex-col ml-1 -mt-2" x-cloak x-show="! includeVendorFrames">
<?php if (isset($component)) { $__componentOriginal14b1cc5db95fcca4a0f06445821cff39 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal14b1cc5db95fcca4a0f06445821cff39 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevron-up','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevron-up'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal14b1cc5db95fcca4a0f06445821cff39)): ?>
<?php $attributes = $__attributesOriginal14b1cc5db95fcca4a0f06445821cff39; ?>
<?php unset($__attributesOriginal14b1cc5db95fcca4a0f06445821cff39); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal14b1cc5db95fcca4a0f06445821cff39)): ?>
<?php $component = $__componentOriginal14b1cc5db95fcca4a0f06445821cff39; ?>
<?php unset($__componentOriginal14b1cc5db95fcca4a0f06445821cff39); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginal707ceba27255eae48fdb0f3529710ddf = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal707ceba27255eae48fdb0f3529710ddf = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.icons.chevron-down','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::icons.chevron-down'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal707ceba27255eae48fdb0f3529710ddf)): ?>
<?php $attributes = $__attributesOriginal707ceba27255eae48fdb0f3529710ddf; ?>
<?php unset($__attributesOriginal707ceba27255eae48fdb0f3529710ddf); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal707ceba27255eae48fdb0f3529710ddf)): ?>
<?php $component = $__componentOriginal707ceba27255eae48fdb0f3529710ddf; ?>
<?php unset($__componentOriginal707ceba27255eae48fdb0f3529710ddf); ?>
<?php endif; ?>
</div>
</button>
</div>
<div class="mb-12 space-y-2">
<?php $__currentLoopData = $exception->frames(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $frame): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php if(! $frame->isFromVendor()): ?>
<?php
$vendorFramesCollapsed = $exception->frames()->take($loop->index)->reverse()->takeUntil(fn ($frame) => ! $frame->isFromVendor());
?>
<div x-show="! includeVendorFrames">
<?php if($vendorFramesCollapsed->isNotEmpty()): ?>
<div class="text-gray-500">
<?php echo e($vendorFramesCollapsed->count()); ?> vendor frame<?php echo e($vendorFramesCollapsed->count() > 1 ? 's' : ''); ?> collapsed
</div>
<?php endif; ?>
</div>
<?php endif; ?>
<button
class="w-full text-left dark:border-gray-900"
x-show="<?php echo e($frame->isFromVendor() ? 'includeVendorFrames' : 'true'); ?>"
@click="index = <?php echo e($loop->index); ?>"
>
<div
x-bind:class="
index === <?php echo e($loop->index); ?>
? 'rounded-r-md bg-gray-100 dark:bg-gray-800 border-l dark:border dark:border-gray-700 border-l-red-500 dark:border-l-red-500'
: 'hover:bg-gray-100/75 dark:hover:bg-gray-800/75'
"
>
<div class="scrollbar-hidden overflow-x-auto border-l-2 border-transparent p-2">
<div class="nowrap text-gray-900 dark:text-gray-300">
<span class="inline-flex items-baseline">
<span class="text-gray-900 dark:text-gray-300"><?php echo e($frame->source()); ?></span>
<span class="font-mono text-xs">:<?php echo e($frame->line()); ?></span>
</span>
</div>
<div class="text-gray-500 dark:text-gray-400">
<?php echo e($exception->frames()->get($loop->index + 1)?->callable()); ?>
</div>
</div>
</div>
</button>
<?php if(! $frame->isFromVendor() && $exception->frames()->slice($loop->index + 1)->filter(fn ($frame) => ! $frame->isFromVendor())->isEmpty()): ?>
<?php if($exception->frames()->slice($loop->index + 1)->count()): ?>
<div x-show="! includeVendorFrames">
<div class="text-gray-500">
<?php echo e($exception->frames()->slice($loop->index + 1)->count()); ?> vendor
frame<?php echo e($exception->frames()->slice($loop->index + 1)->count() > 1 ? 's' : ''); ?> collapsed
</div>
</div>
<?php endif; ?>
<?php endif; ?>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</div>
</div>
</div>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/trace.blade.php ENDPATH**/ ?>

View File

@ -1,8 +0,0 @@
<section
<?php echo e($attributes->merge(['class' => "@container flex flex-col p-6 sm:p-12 bg-white dark:bg-gray-900/80 text-gray-900 dark:text-gray-100 rounded-lg default:col-span-full default:lg:col-span-6 default:row-span-1 dark:ring-1 dark:ring-gray-800 shadow-xl"])); ?>
>
<?php echo e($slot); ?>
</section>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/card.blade.php ENDPATH**/ ?>

View File

@ -1,366 +0,0 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login - SENTARA</title>
<link rel="icon" type="image/png" href="<?php echo e(asset('favicon.png')); ?>">
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
*{
margin:0;
padding:0;
box-sizing:border-box;
font-family:'Poppins',sans-serif;
}
body{
background:#f3f5fb;
min-height:100vh;
display:flex;
align-items:center;
justify-content:center;
padding:40px;
}
/* CONTAINER */
.container{
width:1350px;
max-width:100%;
height:720px;
background:#fff;
border-radius:25px;
display:flex;
overflow:hidden;
box-shadow:0 30px 80px rgba(0,0,0,0.1);
}
/* LEFT */
.left{
width:50%;
padding:60px 80px;
display:flex;
flex-direction:column;
justify-content:center;
}
/* LOGO */
.logo{
text-align:center;
margin-bottom:25px;
}
.logo img{
width:200px;
}
/* TITLE */
.title{
text-align:center;
font-size:28px;
font-weight:600;
}
.title span{
color:#ff5c8d;
}
.subtitle{
text-align:center;
font-size:14px;
color:#777;
margin:12px 0 35px;
}
/* FORM */
.form-group{
margin-bottom:20px;
}
label{
font-size:13px;
font-weight:500;
}
input{
width:100%;
padding:14px;
border-radius:12px;
border:1px solid #ddd;
margin-top:6px;
font-size:14px;
}
.input-group{
position:relative;
}
.toggle{
position:absolute;
right:12px;
top:14px;
cursor:pointer;
}
.forgot{
text-align:right;
margin-top:6px;
}
.forgot a{
font-size:12px;
color:#2d5be3;
text-decoration:none;
}
/* BUTTON */
.btn{
width:100%;
padding:14px;
border:none;
border-radius:12px;
background:linear-gradient(90deg,#2d5be3,#4c7dff);
color:#fff;
font-weight:500;
margin-top:20px;
cursor:pointer;
transition:0.3s;
}
.btn:hover{
opacity:0.9;
}
.right{
width:50%;
position:relative;
overflow:hidden;
}
/* GAMBAR */
.right img{
position:absolute;
top:0;
right:0;
width:100%;
height:100%;
object-fit:cover;
/* SHAPE DIPERBAIKI */
clip-path: ellipse(120% 100% at 100% 50%);
}
/* OVERLAY */
.overlay{
position:absolute;
width:100%;
height:100%;
display:flex;
flex-direction:column;
align-items:center;
justify-content:center;
text-align:center;
color:#fff;
background:rgba(0,0,0,0.25);
padding:20px;
z-index:2; /* DI ATAS */
}
/* QUOTE */
.quote{
font-size:42px;
color:#ff5c8d;
margin-bottom:10px;
}
/* TEXT */
.overlay p{
font-size:30px;
font-weight:500;
line-height:1.5;
max-width:420px;
}
.overlay span{
color:#ff5c8d;
font-weight:600;
}
/* GARIS */
.line{
width:70px;
height:3px;
background:#fff;
border-radius:10px;
margin-top:18px;
position:relative;
}
.line::after{
content:'';
position:absolute;
width:12px;
height:12px;
border:2px solid #fff;
border-left:none;
border-top:none;
transform:rotate(-45deg);
right:-12px;
top:-5px;
}
/* MOBILE */
@media(max-width:900px){
.container{
flex-direction:column;
height:auto;
}
.left{
width:100%;
padding:40px;
}
.right{
width:100%;
height:260px;
}
.overlay p{
font-size:20px;
}
.logo img{
width:150px;
}
}
@media(max-width:900px){
.container{
flex-direction:column;
height:auto;
}
.left{
width:100%;
padding:40px;
}
.right{
width:100%;
height:260px;
}
.overlay p{
font-size:20px;
}
.logo img{
width:150px;
}
}
/* HILANGKAN ICON PASSWORD BAWAAN BROWSER */
input[type="password"]::-ms-reveal,
input[type="password"]::-ms-clear {
display: none;
}
input::-ms-reveal,
input::-ms-clear {
display: none;
}
</style>
</head>
<body>
<div class="container">
<!-- LEFT -->
<div class="left">
<div class="logo">
<img src="<?php echo e(asset('images/logo-sentara.png')); ?>">
</div>
<?php if($errors->any()): ?>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
Swal.fire({
icon: 'error',
title: 'Login Gagal',
text: 'Email atau password yang dimasukkan salah.',
confirmButtonColor: '#2d5be3'
});
</script>
<?php endif; ?>
<div class="title">
Selamat Datang <span>Kembali!</span>
</div>
<div class="subtitle">
Login untuk mengakses Dashboard Analisis Sentimen Wisata Jember
</div>
<form method="POST" action="<?php echo e(route('login')); ?>">
<?php echo csrf_field(); ?>
<div class="form-group">
<label>Email</label>
<input type="email" name="email" placeholder="Masukkan email Anda" required>
</div>
<div class="form-group">
<label>Password</label>
<div class="input-group">
<input type="password" id="password" name="password" placeholder="Masukkan password Anda" required>
<span class="toggle" onclick="togglePass()">👁</span>
</div>
<div class="forgot">
<a href="<?php echo e(route('password.request')); ?>">Lupa password?</a>
</div>
</div>
<button class="btn">Login</button>
</form>
</div>
<!-- RIGHT -->
<div class="right">
<img src="<?php echo e(asset('images/papuma.jpg')); ?>" alt="bg">
<div class="overlay">
<p>
Memahami opini,<br>
meningkatkan <span>pariwisata</span><br>
Jember.
</p>
</div>
</div>
</div>
<script>
function togglePass(){
let x = document.getElementById("password");
x.type = x.type === "password" ? "text" : "password";
}
</script>
</body>
</html><?php /**PATH C:\laragon\www\SistemAnalisisSentimen\resources\views/auth/login.blade.php ENDPATH**/ ?>

View File

@ -1,70 +0,0 @@
<?php if (isset($component)) { $__componentOriginal74daf2d0a9c625ad90327a6043d15980 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal74daf2d0a9c625ad90327a6043d15980 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.card','data' => ['class' => 'mt-6 overflow-x-auto']] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::card'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['class' => 'mt-6 overflow-x-auto']); ?>
<div
x-data="{
includeVendorFrames: false,
index: <?php echo e($exception->defaultFrame()); ?>,
}"
>
<div class="grid grid-cols-1 gap-6 lg:grid-cols-3" x-clock>
<?php if (isset($component)) { $__componentOriginal92c1a431b4816bac5d5a20d0fc1238ab = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal92c1a431b4816bac5d5a20d0fc1238ab = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.trace','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::trace'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal92c1a431b4816bac5d5a20d0fc1238ab)): ?>
<?php $attributes = $__attributesOriginal92c1a431b4816bac5d5a20d0fc1238ab; ?>
<?php unset($__attributesOriginal92c1a431b4816bac5d5a20d0fc1238ab); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal92c1a431b4816bac5d5a20d0fc1238ab)): ?>
<?php $component = $__componentOriginal92c1a431b4816bac5d5a20d0fc1238ab; ?>
<?php unset($__componentOriginal92c1a431b4816bac5d5a20d0fc1238ab); ?>
<?php endif; ?>
<?php if (isset($component)) { $__componentOriginala2de13eefed6710e7b4064d57c6d0e47 = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginala2de13eefed6710e7b4064d57c6d0e47 = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.editor','data' => ['exception' => $exception]] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::editor'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes(['exception' => \Illuminate\View\Compilers\BladeCompiler::sanitizeComponentAttribute($exception)]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginala2de13eefed6710e7b4064d57c6d0e47)): ?>
<?php $attributes = $__attributesOriginala2de13eefed6710e7b4064d57c6d0e47; ?>
<?php unset($__attributesOriginala2de13eefed6710e7b4064d57c6d0e47); ?>
<?php endif; ?>
<?php if (isset($__componentOriginala2de13eefed6710e7b4064d57c6d0e47)): ?>
<?php $component = $__componentOriginala2de13eefed6710e7b4064d57c6d0e47; ?>
<?php unset($__componentOriginala2de13eefed6710e7b4064d57c6d0e47); ?>
<?php endif; ?>
</div>
</div>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $attributes = $__attributesOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__attributesOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal74daf2d0a9c625ad90327a6043d15980)): ?>
<?php $component = $__componentOriginal74daf2d0a9c625ad90327a6043d15980; ?>
<?php unset($__componentOriginal74daf2d0a9c625ad90327a6043d15980); ?>
<?php endif; ?>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/trace-and-editor.blade.php ENDPATH**/ ?>

View File

@ -1,204 +0,0 @@
<?php $__env->startSection('content'); ?>
<div class="max-w-7xl mx-auto px-4 md:px-0 space-y-6">
<!-- HEADER -->
<div class="flex items-center justify-between">
<div>
<h2 class="text-2xl font-bold text-gray-800">Data Ulasan</h2>
<p class="text-sm text-gray-500">
Periode aktif: <?php echo e($periodeAktif->nama ?? 'Belum ada data'); ?>
<a href="<?php echo e(route('riwayat.index')); ?>" class="text-blue-600 hover:underline ml-2">Lihat riwayat</a>
</p>
</div>
<div class="flex flex-col md:flex-row gap-3 md:items-center">
<form action="<?php echo e(route('ulasan.ambil')); ?>" method="POST" class="flex flex-col md:flex-row gap-3 md:items-center">
<?php echo csrf_field(); ?>
<input type="hidden" name="redirect_to" value="ulasan">
<input type="month" name="periode_bulan" value="<?php echo e($periodeAktif
? $periodeAktif->tahun . '-' . str_pad($periodeAktif->bulan, 2, '0', STR_PAD_LEFT)
: now()->format('Y-m')); ?>"
class="border rounded-lg px-3 py-2 text-sm bg-white shadow-sm min-w-[150px]">
<select name="wisata" class="border rounded-lg pl-3 pr-9 py-2 text-sm bg-white shadow-sm min-w-[220px]">
<option value="">Semua Lokasi</option>
<?php $__currentLoopData = ($scraperDestinations ?? []); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $scraperDestination): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<option value="<?php echo e($scraperDestination); ?>"><?php echo e($scraperDestination); ?></option>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</select>
<button class="border border-blue-500 text-blue-600 px-5 py-2.5 rounded-full hover:bg-blue-50 transition">
Ambil Data
</button>
</form>
<form action="<?php echo e(route('proses.analisis')); ?>" method="POST">
<?php echo csrf_field(); ?>
<input type="hidden" name="periode_id" value="<?php echo e($periodeId); ?>">
<button
<?php echo e($totalUlasan <= 0 ? 'disabled' : ''); ?>
class="bg-blue-600 hover:bg-blue-700 text-white px-6 py-2.5 rounded-full shadow-md transition disabled:opacity-50 disabled:cursor-not-allowed">
Proses Analisis
</button>
</form>
</div>
</div>
</div>
<!-- SUMMARY -->
<div class="bg-white rounded-3xl shadow p-6 mb-6 mt-5">
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="flex items-center gap-3">
<div class="bg-blue-100 text-blue-600 p-3 rounded-full">📄</div>
<div>
<p class="text-xs text-gray-500">Total Ulasan</p>
<p class="font-bold text-lg"><?php echo e($totalUlasan); ?></p>
</div>
</div>
<div class="flex items-center gap-3">
<div class="bg-green-100 text-green-600 p-3 rounded-full">📍</div>
<div>
<p class="text-xs text-gray-500">Total Wisata</p>
<p class="font-bold text-lg"><?php echo e($totalWisata); ?></p>
</div>
</div>
<div class="flex items-center gap-3">
<div class="bg-orange-100 text-orange-600 p-3 rounded-full">📅</div>
<div>
<p class="text-xs text-gray-500">Terakhir Update</p>
<p class="text-sm font-semibold">
<?php echo e($lastUpdate ? \Carbon\Carbon::parse($lastUpdate)->format('d M Y H:i') : '-'); ?>
</p>
</div>
</div>
</div>
</div>
<!-- ALERT -->
<?php if(session('success')): ?>
<div class="bg-green-100 text-green-700 px-4 py-2 rounded-lg text-sm">
<?php echo e(session('success')); ?>
</div>
<?php endif; ?>
<?php if(session('error')): ?>
<div class="bg-red-100 text-red-700 px-4 py-2 rounded-lg text-sm whitespace-pre-line">
<?php echo e(session('error')); ?>
</div>
<?php endif; ?>
<!-- SEARCH -->
<form method="GET" action="<?php echo e(route('ulasan.index')); ?>" class="flex flex-col md:flex-row gap-3 items-center">
<?php if(request('periode_id')): ?>
<input type="hidden" name="periode_id" value="<?php echo e(request('periode_id')); ?>">
<?php endif; ?>
<input type="text" name="search" value="<?php echo e(request('search')); ?>"
placeholder="Cari ulasan atau wisata..."
class="flex-1 border px-3 py-2 rounded-lg text-sm">
<button class="bg-blue-500 text-white px-4 py-2 rounded-lg text-sm">Cari</button>
<button type="button"
onclick="if (confirm('Reset akan mengosongkan semua ulasan dan hasil analisis untuk periode ini. Lanjutkan?')) document.getElementById('resetPeriodeForm').submit();"
class="bg-gray-200 px-4 py-2 rounded-lg text-sm">
Reset
</button>
</form>
<?php if($periodeId): ?>
<form id="resetPeriodeForm" action="<?php echo e(route('ulasan.kosongkan-periode')); ?>" method="POST" class="hidden">
<?php echo csrf_field(); ?>
<?php echo method_field('DELETE'); ?>
<input type="hidden" name="periode_id" value="<?php echo e($periodeId); ?>">
</form>
<?php endif; ?>
<!-- TABLE -->
<div class="bg-white rounded-xl shadow overflow-hidden">
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead class="bg-gray-100">
<tr>
<th class="px-4 py-3 w-[5%]">No</th>
<th class="px-4 py-3 w-[20%]">Nama Wisata</th>
<th class="px-4 py-3 w-[10%] text-center">Rating</th>
<th class="px-4 py-3 w-[45%]">Ulasan</th>
<th class="px-4 py-3 w-[20%] text-center">Tanggal</th>
</tr>
</thead>
<tbody class="divide-y">
<?php $__empty_1 = true; $__currentLoopData = $mentah; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $i => $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
<tr class="hover:bg-gray-50">
<td class="px-4 py-3"><?php echo e($mentah->firstItem() + $i); ?></td>
<td class="px-4 py-3 font-medium"><?php echo e($item->wisata); ?></td>
<td class="px-4 py-3 text-center text-yellow-500">
<?php echo e(str_repeat('★', round($item->rating))); ?>
<span class="text-gray-500 ml-1"><?php echo e($item->rating); ?></span>
</td>
<td class="px-4 py-3">
<div class="line-clamp-2 text-gray-600"><?php echo e($item->ulasan); ?></div>
</td>
<td class="px-4 py-3 text-center text-gray-500">
<?php
try {
$tanggalUlasan = $item->tanggal
? \Carbon\Carbon::parse($item->tanggal)->format('d M Y')
: '-';
} catch (\Throwable $e) {
$tanggalUlasan = $item->tanggal ?: '-';
}
?>
<?php echo e($tanggalUlasan); ?>
</td>
</tr>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
<tr>
<td colspan="5" class="text-center py-6 text-gray-400">Belum ada data</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
<div class="p-4 flex flex-col md:flex-row gap-3 justify-between items-center text-sm text-gray-500">
<div>
Menampilkan <?php echo e($mentah->firstItem() ?? 0); ?> - <?php echo e($mentah->lastItem() ?? 0); ?>
dari <?php echo e($mentah->total()); ?> data
</div>
<div class="flex items-center gap-1">
<?php if($mentah->onFirstPage()): ?>
<span class="px-3 py-1 bg-gray-200 rounded-lg">«</span>
<?php else: ?>
<a href="<?php echo e($mentah->previousPageUrl()); ?>" class="px-3 py-1 bg-gray-100 rounded-lg">«</a>
<?php endif; ?>
<?php for($i = 1; $i <= $mentah->lastPage(); $i++): ?>
<?php if($i == $mentah->currentPage()): ?>
<span class="px-3 py-1 bg-blue-600 text-white rounded-lg"><?php echo e($i); ?></span>
<?php elseif($i <= 3 || $i > $mentah->lastPage() - 2 || abs($i - $mentah->currentPage()) <= 1): ?>
<a href="<?php echo e($mentah->url($i)); ?>" class="px-3 py-1 bg-gray-100 rounded-lg"><?php echo e($i); ?></a>
<?php elseif($i == 4 || $i == $mentah->lastPage() - 3): ?>
<span class="px-2">...</span>
<?php endif; ?>
<?php endfor; ?>
<?php if($mentah->hasMorePages()): ?>
<a href="<?php echo e($mentah->nextPageUrl()); ?>" class="px-3 py-1 bg-gray-100 rounded-lg">»</a>
<?php else: ?>
<span class="px-3 py-1 bg-gray-200 rounded-lg">»</span>
<?php endif; ?>
</div>
</div>
</div>
<?php $__env->stopSection(); ?>
<?php echo $__env->make('layouts.sentara', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH C:\laragon\www\SistemAnalisisSentimen\resources\views/ulasan/index.blade.php ENDPATH**/ ?>

View File

@ -63,45 +63,52 @@
</div>
<form id="filter-form" method="GET" action="<?php echo e(route('dashboard')); ?>" class="flex gap-2 mb-4">
<div class="flex items-end gap-3 mb-4">
<input type="hidden" name="tab" value="analisis">
<form id="filter-form"
method="GET"
action="<?php echo e(route('dashboard')); ?>"
class="flex items-end gap-2">
<input type="hidden" name="periode_id" value="<?php echo e($periodeAktif->id ?? ''); ?>">
<input type="hidden" name="tab" value="analisis">
<input type="hidden" name="periode_id"
value="<?php echo e($periodeAktif->id ?? ''); ?>">
<select
name="wisata"
class="border rounded px-3 py-2"
>
<select
name="wisata"
class="border rounded px-3 py-2 h-[46px]">
<option value="">Semua Destinasi</option>
<option value="">Semua Destinasi</option>
<?php $__currentLoopData = $wisataList; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<?php $__currentLoopData = $wisataList; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
<option value="<?php echo e($item); ?>"
<?php echo e(request('wisata') == $item ? 'selected' : ''); ?>>
<?php echo e($item); ?>
<option
value="<?php echo e($item); ?>"
<?php echo e(request('wisata') == $item ? 'selected' : ''); ?>
</option>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
>
<?php echo e($item); ?>
</select>
</option>
<button
type="submit"
class="bg-blue-600 text-white px-4 rounded h-[46px]">
Filter
</button>
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
</form>
</select>
<a href="<?php echo e(route('riwayat.index')); ?>"
class="inline-flex items-center justify-center bg-blue-600 hover:bg-blue-700 text-white px-5 rounded-lg shadow transition h-[46px]">
<button
type="submit"
class="bg-blue-600 text-white px-4 py-2 rounded"
>
Filter
</button>
<i class="fas fa-history mr-2"></i>
Lihat Riwayat
</a>
</form>
</div>
<div class="bg-white rounded-xl shadow p-4 h-fit">

View File

@ -1,49 +0,0 @@
<header class="mt-3 px-5 sm:mt-10">
<div class="py-3 dark:border-gray-900 sm:py-5">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="rounded-full bg-red-500/20 p-4 dark:bg-red-500/20">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="h-6 w-6 fill-red-500 text-gray-50 dark:text-gray-950"
>
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z" />
</svg>
</div>
<span class="text-dark ml-3 text-2xl font-bold dark:text-white sm:text-3xl">
<?php echo e($exception->title()); ?>
</span>
</div>
<div class="flex items-center gap-3 sm:gap-6">
<?php if (isset($component)) { $__componentOriginal9b6ddd2809dd60ece07dfaf1f3ef876f = $component; } ?>
<?php if (isset($attributes)) { $__attributesOriginal9b6ddd2809dd60ece07dfaf1f3ef876f = $attributes; } ?>
<?php $component = Illuminate\View\AnonymousComponent::resolve(['view' => 'laravel-exceptions-renderer::components.theme-switcher','data' => []] + (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag ? $attributes->all() : [])); ?>
<?php $component->withName('laravel-exceptions-renderer::theme-switcher'); ?>
<?php if ($component->shouldRender()): ?>
<?php $__env->startComponent($component->resolveView(), $component->data()); ?>
<?php if (isset($attributes) && $attributes instanceof Illuminate\View\ComponentAttributeBag): ?>
<?php $attributes = $attributes->except(\Illuminate\View\AnonymousComponent::ignoredParameterNames()); ?>
<?php endif; ?>
<?php $component->withAttributes([]); ?>
<?php echo $__env->renderComponent(); ?>
<?php endif; ?>
<?php if (isset($__attributesOriginal9b6ddd2809dd60ece07dfaf1f3ef876f)): ?>
<?php $attributes = $__attributesOriginal9b6ddd2809dd60ece07dfaf1f3ef876f; ?>
<?php unset($__attributesOriginal9b6ddd2809dd60ece07dfaf1f3ef876f); ?>
<?php endif; ?>
<?php if (isset($__componentOriginal9b6ddd2809dd60ece07dfaf1f3ef876f)): ?>
<?php $component = $__componentOriginal9b6ddd2809dd60ece07dfaf1f3ef876f; ?>
<?php unset($__componentOriginal9b6ddd2809dd60ece07dfaf1f3ef876f); ?>
<?php endif; ?>
</div>
</div>
</div>
</header>
<?php /**PATH C:\laragon\www\SistemAnalisisSentimen\vendor\laravel\framework\src\Illuminate\Foundation\Providers/../resources/exceptions/renderer/components/navigation.blade.php ENDPATH**/ ?>