pembaruan halaman admin

This commit is contained in:
rahmagustin 2026-02-11 10:37:07 +07:00
parent ccf66298ab
commit 83ffa58000
6 changed files with 209 additions and 337 deletions

View File

@ -9,7 +9,15 @@ class DashboardController extends Controller
{ {
public function index() public function index()
{ {
$title = 'Dashboard Admin'; $totalTps = \App\Models\LokasiTps::count();
return view('admin.index', compact('title')); $totalAduan = \App\Models\AduanTps::count();
$sampahTerbaru = \App\Models\Sampah::orderBy('created_at', 'desc')->first();
return view('admin.index', compact(
'totalTps',
'totalAduan',
'sampahTerbaru'
));
} }
} }

View File

@ -8,22 +8,16 @@
class AduanController extends Controller class AduanController extends Controller
{ {
/**
* Halaman aduan TPS (user)
*/
public function index(Request $request) public function index(Request $request)
{ {
$title = 'Aduan TPS'; $title = 'Aduan TPS';
// TPS terpilih (jika dari detail / SIG)
$tps = null; $tps = null;
if ($request->filled('tps_id')) { if ($request->filled('tps_id')) {
$tps = LokasiTps::with('kategori') $tps = LokasiTps::with('kategori')
->where('id_tps', $request->tps_id) ->where('id_tps', $request->tps_id)
->first(); ->first();
} }
// List TPS untuk dropdown
$listTps = LokasiTps::orderBy('nama_tps')->get(); $listTps = LokasiTps::orderBy('nama_tps')->get();
return view('user.aduan-tps', compact( return view('user.aduan-tps', compact(
@ -33,12 +27,8 @@ public function index(Request $request)
)); ));
} }
/**
* Simpan aduan TPS
*/
public function store(Request $request) public function store(Request $request)
{ {
// VALIDASI (FOTO WAJIB)
$request->validate([ $request->validate([
'lokasi_tps_id' => 'required|exists:lokasi_tps,id_tps', 'lokasi_tps_id' => 'required|exists:lokasi_tps,id_tps',
'nama_pelapor' => 'required|string|max:100', 'nama_pelapor' => 'required|string|max:100',
@ -52,11 +42,9 @@ public function store(Request $request)
'bukti_foto.image' => 'File harus berupa gambar', 'bukti_foto.image' => 'File harus berupa gambar',
]); ]);
// SIMPAN FOTO
$fotoPath = $request->file('bukti_foto') $fotoPath = $request->file('bukti_foto')
->store('aduan', 'public'); ->store('aduan', 'public');
// SIMPAN KE DATABASE
AduanTps::create([ AduanTps::create([
'lokasi_tps_id' => $request->lokasi_tps_id, 'lokasi_tps_id' => $request->lokasi_tps_id,
'nama_pelapor' => $request->nama_pelapor, 'nama_pelapor' => $request->nama_pelapor,
@ -64,7 +52,7 @@ public function store(Request $request)
'no_pelapor' => $request->no_pelapor, 'no_pelapor' => $request->no_pelapor,
'isi_aduan' => $request->isi_aduan, 'isi_aduan' => $request->isi_aduan,
'bukti_foto' => $fotoPath, 'bukti_foto' => $fotoPath,
'tanggal_aduan' => now(), // OTOMATIS 'tanggal_aduan' => now(),
]); ]);
return redirect() return redirect()

View File

@ -21970,195 +21970,81 @@ .bg-inverse-dark.breadcrumb-custom .breadcrumb-item:last-child {
background: transparent; background: transparent;
} }
/* Cards */ /* ===== DASHBOARD CARD (SIG TPS FIX) ===== */
.card { .card {
box-shadow: none; box-shadow: 0 10px 22px rgba(0,0,0,0.08);
-webkit-box-shadow: none; transition: all 0.25s ease;
-moz-box-shadow: none;
-ms-box-shadow: none;
transition: background 0.25s ease;
-webkit-transition: background 0.25s ease;
-moz-transition: background 0.25s ease;
-ms-transition: background 0.25s ease;
border: none; border: none;
border-radius: 14px;
} }
.card.tale-bg { /* =========================
background: #DAE7FF; TOTAL TPS (HIJAU UTAMA)
} ========================= */
.card.transparent {
background: transparent;
}
.card .card-body {
padding: 1.25rem 1.25rem;
}
.card .card-body + .card-body {
padding-top: 1rem;
}
.card .card-title {
color: #010101;
margin-bottom: 1.2rem;
text-transform: capitalize;
font-size: 1.125rem;
font-weight: 600;
}
.card .card-subtitle {
font-weight: 400;
margin-top: 0.625rem;
margin-bottom: 0.625rem;
}
.card .card-description {
margin-bottom: .875rem;
font-weight: 400;
color: #76838f;
}
.card.card-outline-success {
border: 1px solid #57B657;
}
.card.card-outline-primary {
border: 1px solid #00A86B;
}
.card.card-outline-warning {
border: 1px solid #FFC100;
}
.card.card-outline-danger {
border: 1px solid #FF4747;
}
.card.card-rounded {
border-radius: 5px;
}
.card.card-faded {
background: #b5b0b2;
border-color: #b5b0b2;
}
.card.card-circle-progress {
color: #ffffff;
text-align: center;
}
.card.card-img-holder {
position: relative;
}
.card.card-img-holder .card-img-absolute {
position: absolute;
top: 0;
right: 0;
height: 100%;
}
.card.card-weather .weather-daily .weather-day {
opacity: .5;
font-weight: 900;
}
.card.card-weather .weather-daily i {
font-size: 20px;
}
.card.card-weather .weather-daily .weather-temp {
margin-top: .5rem;
margin-bottom: 0;
opacity: .5;
font-size: .75rem;
}
.card.card-tale {
background: #7DA0FA;
color: #ffffff;
}
.card.card-tale:hover {
background: #96b2fb;
}
.card.card-dark-green { .card.card-dark-green {
background: #00A86B; background: linear-gradient(135deg, #00A86B, #00915d);
color: #ffffff; color: #ffffff;
} }
.card.card-dark-green:hover { .card.card-dark-green:hover {
background: #1dbf84; background: linear-gradient(135deg, #00915d, #007e52);
} }
.card.card-dark-green p,
.card.card-dark-green small {
color: #ffffff !important;
}
/* =========================
TOTAL TPS (KUNING DIGANTI HIJAU MUDA KONTRAS)
========================= */
.card.card-light-green { .card.card-light-green {
background: #EFF669; background: linear-gradient(135deg, #E8F9F1, #BFF0DC);
color: #ffffff; color: #00A86B;
border: 2px solid #00A86B;
} }
.card.card-light-green:hover { .card.card-light-green:hover {
background: #7fd8a2; background: linear-gradient(135deg, #D6F5E8, #A6EACF);
} }
.card.card-light-green p,
.card.card-light-green small {
color: #006f48 !important;
font-weight: 600;
}
/* =========================
DATA SAMPAH (ORANYE LOGO)
========================= */
.card.card-light-danger { .card.card-light-danger {
background: #F3797E; background: linear-gradient(135deg, #FF7A21, #e66a18);
color: #ffffff; color: #ffffff;
} }
.card.card-light-danger:hover { .card.card-light-danger:hover {
background: #f59095; background: linear-gradient(135deg, #e66a18, #cc5f15);
} }
.card-inverse-primary { .card.card-light-danger p,
background: rgba(75, 73, 172, 0.2); .card.card-light-danger small {
border: 1px solid #45439e; color: #ffffff !important;
color: #393783;
} }
.card-inverse-secondary { /* =========================
background: rgba(163, 164, 165, 0.2); TYPOGRAPHY
border: 1px solid #969798; ========================= */
color: #7c7d7d; .card .fs-30 {
font-size: 40px;
font-weight: 800;
letter-spacing: 0.5px;
} }
.card-inverse-success { .card .card-body {
background: rgba(87, 182, 87, 0.2); padding: 1.5rem 1.5rem;
border: 1px solid #50a750;
color: #428a42;
} }
.card-inverse-info {
background: rgba(36, 138, 253, 0.2);
border: 1px solid #217fe9;
color: #1b69c0;
}
.card-inverse-warning {
background: rgba(255, 193, 0, 0.2);
border: 1px solid #ebb200;
color: #c29300;
}
.card-inverse-danger {
background: rgba(255, 71, 71, 0.2);
border: 1px solid #eb4141;
color: #c23636;
}
.card-inverse-light {
background: rgba(248, 249, 250, 0.2);
border: 1px solid #e4e5e6;
color: #bcbdbe;
}
.card-inverse-dark {
background: rgba(40, 47, 58, 0.2);
border: 1px solid #252b35;
color: #1e242c;
}
.data-icon-card-primary { .data-icon-card-primary {
background: #00A86B; background: #00A86B;
@ -29970,3 +29856,4 @@ @media (max-width: 991px) {
/*# sourceMappingURL=../maps/vertical-layout-light/style.css.map */ /*# sourceMappingURL=../maps/vertical-layout-light/style.css.map */

View File

@ -5,46 +5,67 @@
<div class="row"> <div class="row">
<div class="col-md-12 grid-margin"> <div class="col-md-12 grid-margin">
<div class="row"> <div class="row">
<div class="col-12 col-xl-8 mb-4 mb-xl-0"> <div class="mb-4 col-12 col-xl-8 mb-xl-0">
<h3 class="font-weight-bold">Selamat Datang Admin!</h3> <h3 class="font-weight-bold">Selamat Datang Admin!</h3>
<h6 class="font-weight-normal mb-0">All systems are running smoothly! You have <span <h6 class="mb-0 font-weight-normal">Sistem ini membantu admin dalam pengelolaan TPS di <span
class="text-primary">3 unread alerts!</span></h6> class="text-primary">Kabupaten Nganjuk</span></h6>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-12 col-sm-6 col-md-4 mb-4 stretch-card transparent"> {{-- TOTAL TPS --}}
<div class="mb-4 col-12 col-sm-6 col-md-4 stretch-card transparent">
<div class="card card-light-green h-100"> <div class="card card-light-green h-100">
<div class="card-body"> <div class="card-body">
<p class="mb-4">Todays Bookings</p> <p class="mb-2">Total TPS</p>
<p class="fs-30 mb-2">4006</p> <p class="mb-1 fs-30 fw-bold">
<p>10.00% (30 days)</p> {{ $totalTps }}
</p>
<br>
<small class="text-muted">
TPS terdaftar di sistem
</small>
</div> </div>
</div> </div>
</div> </div>
<div class="col-12 col-sm-6 col-md-4 mb-4 stretch-card transparent"> {{-- TOTAL ADUAN TPS --}}
<div class="mb-4 col-12 col-sm-6 col-md-4 stretch-card transparent">
<div class="card card-dark-green h-100"> <div class="card card-dark-green h-100">
<div class="card-body"> <div class="card-body">
<p class="mb-4">Total Bookings</p> <p class="mb-2">Total Aduan TPS</p>
<p class="fs-30 mb-2">61344</p> <p class="mb-1 fs-30 fw-bold">
<p>22.00% (30 days)</p> {{ $totalAduan }}
</p>
<br>
<small class="text-muted">
Aduan dari masyarakat
</small>
</div> </div>
</div> </div>
</div> </div>
<div class="col-12 col-sm-6 col-md-4 mb-4 stretch-card transparent"> {{-- DATA SAMPAH TERBARU --}}
<div class="mb-4 col-12 col-sm-6 col-md-4 stretch-card transparent">
<div class="card card-light-danger h-100"> <div class="card card-light-danger h-100">
<div class="card-body"> <div class="card-body">
<p class="mb-4">Number of Meetings</p> <p class="mb-2">Data Sampah Terbaru</p>
<p class="fs-30 mb-2">34040</p> <p class="mb-1 fs-30 fw-bold">
<p>2.00% (30 days)</p> {{ number_format($sampahTerbaru->total_sampah ?? 0, 0, ',', '.') }}
</p>
<small class="text-muted">
Total sampah (Ton) <br>
Update terakhir:
{{ $sampahTerbaru ? \Carbon\Carbon::parse($sampahTerbaru->created_at)->translatedFormat('d M Y') : '-' }}
</small>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -42,7 +42,7 @@
</p> </p>
<select id="pilih-tps" class="form-select"> <select id="pilih-tps" class="form-select">
<option value="">-- Pilih TPS --</option> <option value="">Pilih TPS</option>
@foreach ($listTps as $item) @foreach ($listTps as $item)
<option value="{{ $item->id_tps }}" data-nama="{{ $item->nama_tps }}" <option value="{{ $item->id_tps }}" data-nama="{{ $item->nama_tps }}"
data-alamat="{{ $item->alamat_tps }}" data-alamat="{{ $item->alamat_tps }}"

View File

@ -1,168 +1,136 @@
@extends('user.template') @extends('user.template')
@section('content') @section('content')
<!-- Page Title -->
@php
function toDMS($decimal, $type = 'lat') {
$direction = $decimal < 0
? ($type === 'lat' ? 'LS' : 'BB')
: ($type === 'lat' ? 'LU' : 'BT');
$decimal = abs($decimal);
$degrees = floor($decimal);
$minutesFloat = ($decimal - $degrees) * 60;
$minutes = floor($minutesFloat);
$seconds = round(($minutesFloat - $minutes) * 60, 2);
return $degrees . '° ' . $minutes . "' " . $seconds . '" ' . $direction;
}
@endphp
<div class="page-title"> <div class="page-title">
<div class="container d-lg-flex justify-content-between align-items-center"> <div class="container d-lg-flex justify-content-between align-items-center">
<h1 class="mb-2 mb-lg-0">Detail TPS</h1> <h1>Detail TPS</h1>
<nav class="breadcrumbs"> <nav class="breadcrumbs">
<ol> <ol>
<li><a href="index.html">Beranda</a></li> <li><a href="/">Beranda</a></li>
<li class="current">Sebaran TPS</li> <li>Sebaran TPS</li>
<li class="current">Detail TPS</li> <li class="current">Detail TPS</li>
</ol> </ol>
</nav> </nav>
</div> </div>
</div><!-- End Page Title -->
<section id="about" class="about section" style="padding-top: 0;">
<div class="container" data-aos="fade-up">
<div class="row g-4 g-lg-5" data-aos="fade-up" data-aos-delay="200">
<div class="col-lg-5">
<div class="about-img">
<img src="{{ $tps->foto_tps ? asset('storage/' . $tps->foto_tps) : asset('assets/user/img/about-portrait.jpg') }}"
class="img-fluid" alt="">
</div> </div>
<section class="section">
<div class="container">
{{-- HERO TPS --}}
<div class="mb-4 border-0 shadow-sm card">
<div class="row g-0">
<div class="col-lg-5">
<img src="{{ $tps->foto_tps ? asset('storage/'.$tps->foto_tps) : asset('assets/user/img/about-portrait.jpg') }}"
class="img-fluid h-100 w-100 rounded-start"
style="object-fit:cover">
</div> </div>
<div class="col-lg-7"> <div class="col-lg-7">
<h3 class="pt-0 pt-lg-5">{{ $tps->nama_tps }}</h3> <div class="p-4 card-body">
<h3 class="mb-1 fw-bold">{{ $tps->nama_tps }}</h3>
<p class="mb-3 text-muted">{{ $tps->alamat_tps }}</p>
<!-- Tab Content --> <span class="mb-3 badge bg-success">
<div class="tab-content"> {{ $tps->status_tps ?? 'Tidak diketahui' }}
</span>
<div class="tab-pane fade show active" id="about-tab1"> {{-- INFO GRID --}}
<div class="mt-3 row">
<div class="mb-3 col-md-6">
<small class="text-muted">Kategori TPS</small>
<div class="fw-semibold">
{{ $tps->kategori->nama_kategori ?? '-' }}
</div>
</div>
<p class="mb-4 fst-italic"> <div class="mb-3 col-md-6">
{{ $tps->alamat_tps }} <small class="text-muted">Kapasitas</small>
</p> <div class="fw-semibold">
{{ $tps->kapasitas_tps ?? '-' }}
</div>
</div>
<div class="table-responsive"> <div class="mb-3 col-md-6">
<table class="table align-middle table-borderless"> <small class="text-muted">Tahun Pembuatan</small>
<tbody> <div class="fw-semibold">
<tr> {{ $tps->tahun_pembuatan ?? '-' }}
<th width="40%"> </div>
<i class="bi bi-tags me-1"></i> </div>
Kategori TPS
</th>
<td>{{ $tps->kategori->nama_kategori ?? '-' }}</td>
</tr>
<tr> <div class="mb-3 col-md-6">
<th> <small class="text-muted">Koordinat</small>
<i class="bi bi-info-circle me-1"></i> <div class="fw-semibold">
Status TPS {{ toDMS($tps->latitude, 'lat') }} <br>
</th> {{ toDMS($tps->longitude, 'lng') }}
<td>{{ $tps->status_tps ?? '-' }}</td> </div>
</tr> </div>
</div>
<tr> <a href="{{ route('user.aduan', ['tps_id' => $tps->id_tps]) }}"
<th> class="mt-3 btn btn-danger">
<i class="bi bi-box me-1"></i>
Kapasitas TPS
</th>
<td>{{ $tps->kapasitas_tps ?? '-' }}</td>
</tr>
<tr>
<th>
<i class="bi bi-calendar me-1"></i>
Tahun Pembuatan
</th>
<td>{{ $tps->tahun_pembuatan ?? '-' }}</td>
</tr>
<tr>
<th>
<i class="bi bi-crosshair me-1"></i>
Koordinat
</th>
<td>
{{ $tps->latitude }}, {{ $tps->longitude }}
</td>
</tr>
</tbody>
</table>
<div class="mt-4 d-flex justify-content-between align-items-center">
<small class="text-muted">
Laporkan jika TPS bermasalah atau penuh
</small>
<a href="{{ route('user.aduan', ['tps_id' => $tps->id_tps]) }}" class="btn-aduan-tps">
Adukan TPS Adukan TPS
</a> </a>
</div>
</div>
</div>
</div> </div>
</div> {{-- ADUAN TPS --}}
<div class="border-0 shadow-sm card">
</div><!-- End Tab 1 Content --> <div class="p-4 card-body">
<h5 class="mb-3 fw-bold">Aduan yang Telah Ditanggapi</h5>
</div>
</div>
{{-- ===================== --}}
{{-- ADUAN TPS (DITANGGAPI) --}}
{{-- ===================== --}}
<section class="mt-4 section bg-light">
<div class="container">
<h5 class="mb-3 fw-semibold">Aduan yang Telah Ditanggapi</h5>
@if($aduanTps->count()) @if($aduanTps->count())
<div class="list-group list-group-flush">
@foreach($aduanTps as $aduan) @foreach($aduanTps as $aduan)
<div class="px-3 py-3 mb-2 bg-white rounded shadow-sm list-group-item"> <div class="p-3 mb-3 rounded bg-light">
<div class="mb-1 d-flex justify-content-between">
{{-- HEADER --}} <strong>{{ $aduan->nama_pelapor }}</strong>
<div class="mb-1 d-flex justify-content-between align-items-center">
<small class="fw-semibold text-dark">
{{ $aduan->nama_pelapor }}
</small>
<small class="text-muted"> <small class="text-muted">
{{ \Carbon\Carbon::parse($aduan->tanggal_aduan)->translatedFormat('d M Y') }} {{ \Carbon\Carbon::parse($aduan->tanggal_aduan)->translatedFormat('d M Y') }}
</small> </small>
</div> </div>
{{-- ISI ADUAN --}} <p class="mb-2 small text-secondary">
<p class="mb-2 text-secondary small">
{{ $aduan->isi_aduan }} {{ $aduan->isi_aduan }}
</p> </p>
{{-- TANGGAPAN --}} <div class="border-start border-success ps-3">
<div class="border-start border-success ps-2">
<small class="text-success fw-semibold"> <small class="text-success fw-semibold">
Tanggapan Admin: Tanggapan Admin
</small> </small>
<div class="small text-dark"> <div class="small">
{{ $aduan->tanggapan_admin }} {{ $aduan->tanggapan_admin }}
</div> </div>
</div> </div>
</div> </div>
@endforeach @endforeach
</div>
@else @else
<small class="text-muted"> <small class="text-muted">
Belum ada aduan yang ditanggapi. Belum ada aduan yang ditanggapi.
</small> </small>
@endif @endif
</div> </div>
</section>
</div> </div>
</div> </div>
</section> </section>
</div>
</section>
@endsection @endsection