laporan bulanan
This commit is contained in:
parent
7c804bf715
commit
80057c1acc
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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 | {{ 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>
|
||||
|
|
@ -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">«</span>
|
||||
@else
|
||||
<a href="{{ $riwayat->previousPageUrl() }}&{{ $query }}" class="px-3 py-1.5 rounded-lg border hover:bg-blue-50 text-blue-600 transition">«</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">»</a>
|
||||
@else
|
||||
<span class="px-3 py-1.5 rounded-lg border bg-gray-100 text-gray-400 cursor-not-allowed">»</span>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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 |
|
|
@ -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 | <?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**/ ?>
|
||||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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**/ ?>
|
||||
|
|
@ -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">
|
||||
|
|
|
|||
|
|
@ -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**/ ?>
|
||||
Loading…
Reference in New Issue