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

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

View File

@ -21970,195 +21970,81 @@ .bg-inverse-dark.breadcrumb-custom .breadcrumb-item:last-child {
background: transparent;
}
/* Cards */
/* ===== DASHBOARD CARD (SIG TPS FIX) ===== */
.card {
box-shadow: none;
-webkit-box-shadow: none;
-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;
box-shadow: 0 10px 22px rgba(0,0,0,0.08);
transition: all 0.25s ease;
border: none;
border-radius: 14px;
}
.card.tale-bg {
background: #DAE7FF;
}
.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;
}
/* =========================
TOTAL TPS (HIJAU UTAMA)
========================= */
.card.card-dark-green {
background: #00A86B;
background: linear-gradient(135deg, #00A86B, #00915d);
color: #ffffff;
}
.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 {
background: #EFF669;
color: #ffffff;
background: linear-gradient(135deg, #E8F9F1, #BFF0DC);
color: #00A86B;
border: 2px solid #00A86B;
}
.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 {
background: #F3797E;
background: linear-gradient(135deg, #FF7A21, #e66a18);
color: #ffffff;
}
.card.card-light-danger:hover {
background: #f59095;
background: linear-gradient(135deg, #e66a18, #cc5f15);
}
.card-inverse-primary {
background: rgba(75, 73, 172, 0.2);
border: 1px solid #45439e;
color: #393783;
.card.card-light-danger p,
.card.card-light-danger small {
color: #ffffff !important;
}
.card-inverse-secondary {
background: rgba(163, 164, 165, 0.2);
border: 1px solid #969798;
color: #7c7d7d;
/* =========================
TYPOGRAPHY
========================= */
.card .fs-30 {
font-size: 40px;
font-weight: 800;
letter-spacing: 0.5px;
}
.card-inverse-success {
background: rgba(87, 182, 87, 0.2);
border: 1px solid #50a750;
color: #428a42;
.card .card-body {
padding: 1.5rem 1.5rem;
}
.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 {
background: #00A86B;
@ -29970,3 +29856,4 @@ @media (max-width: 991px) {
/*# sourceMappingURL=../maps/vertical-layout-light/style.css.map */

View File

@ -5,46 +5,67 @@
<div class="row">
<div class="col-md-12 grid-margin">
<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>
<h6 class="font-weight-normal mb-0">All systems are running smoothly! You have <span
class="text-primary">3 unread alerts!</span></h6>
<h6 class="mb-0 font-weight-normal">Sistem ini membantu admin dalam pengelolaan TPS di <span
class="text-primary">Kabupaten Nganjuk</span></h6>
</div>
</div>
</div>
</div>
<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-body">
<p class="mb-4">Todays Bookings</p>
<p class="fs-30 mb-2">4006</p>
<p>10.00% (30 days)</p>
<p class="mb-2">Total TPS</p>
<p class="mb-1 fs-30 fw-bold">
{{ $totalTps }}
</p>
<br>
<small class="text-muted">
TPS terdaftar di sistem
</small>
</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-body">
<p class="mb-4">Total Bookings</p>
<p class="fs-30 mb-2">61344</p>
<p>22.00% (30 days)</p>
<p class="mb-2">Total Aduan TPS</p>
<p class="mb-1 fs-30 fw-bold">
{{ $totalAduan }}
</p>
<br>
<small class="text-muted">
Aduan dari masyarakat
</small>
</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-body">
<p class="mb-4">Number of Meetings</p>
<p class="fs-30 mb-2">34040</p>
<p>2.00% (30 days)</p>
<p class="mb-2">Data Sampah Terbaru</p>
<p class="mb-1 fs-30 fw-bold">
{{ 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>
@endsection

View File

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

View File

@ -1,168 +1,136 @@
@extends('user.template')
@section('content')
<!-- Page Title -->
<div class="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="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">
<ol>
<li><a href="index.html">Beranda</a></li>
<li class="current">Sebaran TPS</li>
<li><a href="/">Beranda</a></li>
<li>Sebaran TPS</li>
<li class="current">Detail TPS</li>
</ol>
</nav>
</div>
</div><!-- End Page Title -->
</div>
<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">
<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">
<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>
<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 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 -->
<div class="tab-content">
<span class="mb-3 badge bg-success">
{{ $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">
{{ $tps->alamat_tps }}
</p>
<div class="mb-3 col-md-6">
<small class="text-muted">Kapasitas</small>
<div class="fw-semibold">
{{ $tps->kapasitas_tps ?? '-' }}
</div>
</div>
<div class="table-responsive">
<table class="table align-middle table-borderless">
<tbody>
<tr>
<th width="40%">
<i class="bi bi-tags me-1"></i>
Kategori TPS
</th>
<td>{{ $tps->kategori->nama_kategori ?? '-' }}</td>
</tr>
<div class="mb-3 col-md-6">
<small class="text-muted">Tahun Pembuatan</small>
<div class="fw-semibold">
{{ $tps->tahun_pembuatan ?? '-' }}
</div>
</div>
<tr>
<th>
<i class="bi bi-info-circle me-1"></i>
Status TPS
</th>
<td>{{ $tps->status_tps ?? '-' }}</td>
</tr>
<div class="mb-3 col-md-6">
<small class="text-muted">Koordinat</small>
<div class="fw-semibold">
{{ toDMS($tps->latitude, 'lat') }} <br>
{{ toDMS($tps->longitude, 'lng') }}
</div>
</div>
</div>
<tr>
<th>
<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">
<a href="{{ route('user.aduan', ['tps_id' => $tps->id_tps]) }}"
class="mt-3 btn btn-danger">
Adukan TPS
</a>
</div>
</div>
</div>
</div>
</div>
</div><!-- End Tab 1 Content -->
</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())
<div class="list-group list-group-flush">
@foreach ($aduanTps as $aduan)
<div class="px-3 py-3 mb-2 bg-white rounded shadow-sm list-group-item">
{{-- HEADER --}}
<div class="mb-1 d-flex justify-content-between align-items-center">
<small class="fw-semibold text-dark">
{{ $aduan->nama_pelapor }}
</small>
{{-- ADUAN TPS --}}
<div class="border-0 shadow-sm card">
<div class="p-4 card-body">
<h5 class="mb-3 fw-bold">Aduan yang Telah Ditanggapi</h5>
@if($aduanTps->count())
@foreach($aduanTps as $aduan)
<div class="p-3 mb-3 rounded bg-light">
<div class="mb-1 d-flex justify-content-between">
<strong>{{ $aduan->nama_pelapor }}</strong>
<small class="text-muted">
{{ \Carbon\Carbon::parse($aduan->tanggal_aduan)->translatedFormat('d M Y') }}
</small>
</div>
{{-- ISI ADUAN --}}
<p class="mb-2 text-secondary small">
<p class="mb-2 small text-secondary">
{{ $aduan->isi_aduan }}
</p>
{{-- TANGGAPAN --}}
<div class="border-start border-success ps-2">
<div class="border-start border-success ps-3">
<small class="text-success fw-semibold">
Tanggapan Admin:
Tanggapan Admin
</small>
<div class="small text-dark">
<div class="small">
{{ $aduan->tanggapan_admin }}
</div>
</div>
</div>
@endforeach
</div>
@else
<small class="text-muted">
Belum ada aduan yang ditanggapi.
</small>
@endif
</div>
</div>
</div>
</section>
</div>
</div>
</section>
</div>
</section>
@endsection