foto tampilan user

This commit is contained in:
rahmagustin 2026-03-13 05:37:44 +07:00
parent 81a0553379
commit 824c727592
9 changed files with 69 additions and 30 deletions

View File

@ -5,6 +5,7 @@
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\AduanTps; use App\Models\AduanTps;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class AduanController extends Controller class AduanController extends Controller
{ {
@ -27,12 +28,18 @@ public function index(Request $request)
return view('admin.aduan.index', compact('aduan')); return view('admin.aduan.index', compact('aduan'));
} }
/**
* Detail aduan
*/
public function show($id) public function show($id)
{ {
$aduan = AduanTps::findOrFail($id); $aduan = AduanTps::findOrFail($id);
return view('admin.aduan.edit', compact('aduan')); return view('admin.aduan.edit', compact('aduan'));
} }
/**
* Simpan tanggapan admin
*/
public function tanggapi(Request $request, $id) public function tanggapi(Request $request, $id)
{ {
$request->validate([ $request->validate([
@ -44,6 +51,7 @@ public function tanggapi(Request $request, $id)
]); ]);
$aduan = AduanTps::findOrFail($id); $aduan = AduanTps::findOrFail($id);
$aduan->tanggapan_admin = $request->tanggapan_admin; $aduan->tanggapan_admin = $request->tanggapan_admin;
$aduan->tanggal_tanggapan = now(); $aduan->tanggal_tanggapan = now();
$aduan->save(); $aduan->save();
@ -53,18 +61,18 @@ public function tanggapi(Request $request, $id)
} }
/** /**
* Hapus tanggapan admin * Hapus aduan
*/ */
public function destroy($id) public function destroy($id)
{ {
$aduan = AduanTps::findOrFail($id); $aduan = AduanTps::findOrFail($id);
// Hapus file bukti foto jika ada // Hapus foto bukti dari storage
if ($aduan->bukti_foto && file_exists(public_path('assets/user/img/aduan/' . $aduan->bukti_foto))) { if ($aduan->bukti_foto && Storage::disk('public')->exists($aduan->bukti_foto)) {
unlink(public_path('assets/user/img/aduan/' . $aduan->bukti_foto)); Storage::disk('public')->delete($aduan->bukti_foto);
} }
// Hapus data aduan dari database // Hapus data dari database
$aduan->delete(); $aduan->delete();
return redirect()->route('admin.aduan.index') return redirect()->route('admin.aduan.index')

View File

@ -62,17 +62,12 @@ public function store(Request $request)
'bukti_foto.max' => 'Ukuran gambar maksimal 2 MB', 'bukti_foto.max' => 'Ukuran gambar maksimal 2 MB',
]); ]);
// Upload foto bukti ke folder publik langsung
$fotoPath = null; $fotoPath = null;
if ($request->hasFile('bukti_foto')) { if ($request->hasFile('bukti_foto')) {
$file = $request->file('bukti_foto'); $fotoPath = $request->file('bukti_foto')->store('aduan', 'public');
$filename = strtolower(str_replace(' ', '_', pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME)))
. '_' . time() . '.' . $file->getClientOriginalExtension();
$file->move(public_path('assets/user/img/aduan'), $filename);
$fotoPath = $filename;
} }
// 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,

View File

@ -23,6 +23,7 @@ class="forms-sample">
<label>TPS yang Diadukan</label> <label>TPS yang Diadukan</label>
<input type="text" class="form-control" value="{{ $aduan->lokasiTps->nama_tps ?? '-' }}" <input type="text" class="form-control" value="{{ $aduan->lokasiTps->nama_tps ?? '-' }}"
readonly> readonly>
<small class="text-muted"> <small class="text-muted">
{{ $aduan->lokasiTps->alamat_tps ?? '' }} {{ $aduan->lokasiTps->alamat_tps ?? '' }}
</small> </small>
@ -50,27 +51,32 @@ class="forms-sample">
@if ($aduan->bukti_foto) @if ($aduan->bukti_foto)
<div class="form-group"> <div class="form-group">
<label>Bukti Foto</label><br> <label>Bukti Foto</label><br>
<img src="{{ asset('assets/user/img/aduan/' . $aduan->bukti_foto) }}" alt="Bukti Aduan"
class="border rounded img-fluid" style="max-height: 260px;"> <img src="{{ asset('storage/' . $aduan->bukti_foto) }}" alt="Bukti Aduan"
class="border rounded img-fluid" style="max-height:260px;">
</div> </div>
@endif @endif
{{-- Tanggapan Admin --}} {{-- Tanggapan Admin --}}
<div class="form-group"> <div class="form-group">
<label>Tanggapan Admin</label> <label>Tanggapan Admin</label>
<textarea name="tanggapan_admin" class="form-control @error('tanggapan_admin') is-invalid @enderror" rows="4" <textarea name="tanggapan_admin" class="form-control @error('tanggapan_admin') is-invalid @enderror" rows="4"
placeholder="Masukkan tanggapan admin...">{{ old('tanggapan_admin', $aduan->tanggapan_admin) }}</textarea> placeholder="Masukkan tanggapan admin...">{{ old('tanggapan_admin', $aduan->tanggapan_admin) }}</textarea>
@error('tanggapan_admin') @error('tanggapan_admin')
<small class="text-danger">{{ $message }}</small> <small class="text-danger">{{ $message }}</small>
@enderror @enderror
</div>
</div>
{{-- Tombol --}} {{-- Tombol --}}
<button type="submit" class="mr-2 btn btn-primary"> <button type="submit" class="mr-2 btn btn-primary">
Simpan Tanggapan Simpan Tanggapan
</button> </button>
<a href="{{ route('admin.aduan.index') }}" class="btn btn-light"> <a href="{{ route('admin.aduan.index') }}" class="btn btn-light">
Kembali Kembali
</a> </a>

View File

@ -11,19 +11,20 @@
<!-- Header --> <!-- Header -->
<div class="mb-3 d-flex justify-content-between align-items-center"> <div class="mb-3 d-flex justify-content-between align-items-center">
<div> <div>
<h4 class="mb-0 card-title">Data Aduan TPS</h4> <h4 class="mb-0 card-title">Data Aduan TPS</h4>
<p class="mb-0 card-description"> <p class="mb-0 card-description">
Daftar aduan masyarakat terhadap TPS Daftar aduan masyarakat terhadap TPS
</p> </p>
</div> </div>
<div class="mb-3 d-flex align-items-center">
<!-- SEARCH --> <div class="d-flex align-items-center">
<form action="{{ route('admin.aduan.index') }}" method="GET" <form action="{{ route('admin.aduan.index') }}" method="GET"
style="width:300px; margin-right:20px;"> style="width:300px;margin-right:20px;">
<input type="text" name="search" value="{{ request('search') }}" <input type="text" name="search" value="{{ request('search') }}"
class="form-control" placeholder="Cari Aduan..."> class="form-control" placeholder="Cari nama TPS...">
</form> </form>
</div> </div>
@ -41,9 +42,12 @@ class="form-control" placeholder="Cari Aduan...">
<th class="text-center">Aksi</th> <th class="text-center">Aksi</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@forelse ($aduan as $item) @forelse ($aduan as $item)
<tr> <tr>
<td> <td>
<strong> <strong>
{{ $item->lokasiTps->nama_tps ?? '-' }} {{ $item->lokasiTps->nama_tps ?? '-' }}
@ -53,10 +57,15 @@ class="form-control" placeholder="Cari Aduan...">
{{ $item->lokasiTps->alamat_tps ?? '' }} {{ $item->lokasiTps->alamat_tps ?? '' }}
</small> </small>
</td> </td>
<td>{{ $item->nama_pelapor }}</td>
<td>
{{ $item->nama_pelapor }}
</td>
<td> <td>
{{ \Carbon\Carbon::parse($item->tanggal_aduan)->format('d M Y') }} {{ \Carbon\Carbon::parse($item->tanggal_aduan)->format('d M Y') }}
</td> </td>
<td> <td>
@if ($item->tanggapan_admin) @if ($item->tanggapan_admin)
<span class="badge badge-success">Ditanggapi</span> <span class="badge badge-success">Ditanggapi</span>
@ -64,7 +73,9 @@ class="form-control" placeholder="Cari Aduan...">
<span class="badge badge-danger">Belum</span> <span class="badge badge-danger">Belum</span>
@endif @endif
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{{ route('admin.aduan.show', $item->id_aduan) }}" <a href="{{ route('admin.aduan.show', $item->id_aduan) }}"
class="btn btn-warning btn-sm" title="Tanggapi Aduan"> class="btn btn-warning btn-sm" title="Tanggapi Aduan">
<i class="bi bi-pencil-square"></i> <i class="bi bi-pencil-square"></i>
@ -74,23 +85,31 @@ class="btn btn-warning btn-sm" title="Tanggapi Aduan">
method="POST" class="d-inline form-hapus"> method="POST" class="d-inline form-hapus">
@csrf @csrf
@method('DELETE') @method('DELETE')
<button type="submit" class="btn btn-danger btn-sm" <button type="submit" class="btn btn-danger btn-sm"
title="Hapus Aduan"> title="Hapus Aduan">
<i class="bi bi-trash"></i> <i class="bi bi-trash"></i>
</button> </button>
</form> </form>
</td> </td>
</tr> </tr>
@empty @empty
<tr> <tr>
<td colspan="6" class="text-center text-muted"> <td colspan="5" class="text-center text-muted">
Data aduan belum tersedia Data aduan belum tersedia
</td> </td>
</tr> </tr>
@endforelse @endforelse
</tbody> </tbody>
</table> </table>
</div> </div>
<!-- PAGINATION --> <!-- PAGINATION -->
<div class="mt-3"> <div class="mt-3">
{{ $aduan->appends(request()->query())->links() }} {{ $aduan->appends(request()->query())->links() }}
@ -102,10 +121,13 @@ class="btn btn-warning btn-sm" title="Tanggapi Aduan">
</div> </div>
</div> </div>
{{-- SweetAlert Hapus --}} {{-- SweetAlert Hapus --}}
<script> <script>
document.querySelectorAll('.form-hapus').forEach(form => { document.querySelectorAll('.form-hapus').forEach(form => {
form.addEventListener('submit', function(e) { form.addEventListener('submit', function(e) {
e.preventDefault(); e.preventDefault();
Swal.fire({ Swal.fire({
@ -117,15 +139,21 @@ class="btn btn-warning btn-sm" title="Tanggapi Aduan">
cancelButtonColor: '#6c757d', cancelButtonColor: '#6c757d',
confirmButtonText: 'Ya, Hapus', confirmButtonText: 'Ya, Hapus',
cancelButtonText: 'Batal' cancelButtonText: 'Batal'
}).then((result) => { }).then((result) => {
if (result.isConfirmed) { if (result.isConfirmed) {
form.submit(); form.submit();
} }
}); });
}); });
}); });
</script> </script>
{{-- SweetAlert Success --}} {{-- SweetAlert Success --}}
@if (session('success')) @if (session('success'))
<script> <script>
@ -138,4 +166,5 @@ class="btn btn-warning btn-sm" title="Tanggapi Aduan">
}); });
</script> </script>
@endif @endif
@endsection @endsection

View File

@ -10,7 +10,6 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
```
<div class="mb-3 d-flex justify-content-between align-items-center"> <div class="mb-3 d-flex justify-content-between align-items-center">
<div> <div>
@ -123,8 +122,6 @@ class="btn btn-warning btn-sm me-1">
</div> </div>
</div> </div>
</div> </div>
```
</div> </div>
<script> <script>

View File

@ -49,7 +49,7 @@ class="{{ $kat->id_kategori_tps == $kategori->id_kategori_tps ? 'active' : '' }}
{{-- Foto --}} {{-- Foto --}}
@if($kategori->foto_kategori) @if($kategori->foto_kategori)
<img src="{{ asset('assets/admin/images/kategori-tps/' . $kategori->foto_kategori) }}" <img src="{{ asset('storage/' . $kategori->foto_kategori) }}"
alt="{{ $kategori->nama_kategori }}" class="mb-3 img-fluid services-img"> alt="{{ $kategori->nama_kategori }}" class="mb-3 img-fluid services-img">
@else @else
<img src="{{ asset('assets/user/img/services.jpg') }}" <img src="{{ asset('assets/user/img/services.jpg') }}"

View File

@ -47,7 +47,7 @@
<option value="{{ $item->id_tps }}" <option value="{{ $item->id_tps }}"
data-nama="{{ $item->nama_tps }}" data-nama="{{ $item->nama_tps }}"
data-alamat="{{ $item->alamat_tps }}" data-alamat="{{ $item->alamat_tps }}"
data-foto="{{ $item->foto_tps ? asset('assets/admin/images/tps/'.$item->foto_tps) : asset('assets/user/img/no-image.png') }}"> data-foto="{{ $item->foto_tps ? asset('storage/' . $item->foto_tps) : asset('assets/user/img/no-image.png') }}">
{{ $item->nama_tps }} {{ $item->nama_tps }}
</option> </option>
@endforeach @endforeach

View File

@ -40,7 +40,7 @@ function toDMS($decimal, $type = 'lat') {
<div class="mb-4 border-0 shadow-sm card"> <div class="mb-4 border-0 shadow-sm card">
<div class="row g-0"> <div class="row g-0">
<div class="col-lg-5"> <div class="col-lg-5">
<img src="{{ $tps->foto_tps ? asset('assets/admin/images/tps/'.$tps->foto_tps) : asset('assets/user/img/about-portrait.jpg') }}" <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" class="img-fluid h-100 w-100 rounded-start"
style="object-fit:cover"> style="object-fit:cover">
</div> </div>

View File

@ -184,16 +184,19 @@
<div class="service-item"> <div class="service-item">
<div class="img"> <div class="img">
@if ($item->foto_kategori && file_exists(public_path('assets/admin/images/kategori-tps/' . $item->foto_kategori)))
<img src="{{ asset('assets/admin/images/kategori-tps/' . $item->foto_kategori) }}" @if ($item->foto_kategori)
class="img-fluid" alt="{{ $item->nama_kategori }}"> <img src="{{ asset('storage/' . $item->foto_kategori) }}" class="img-fluid"
alt="{{ $item->nama_kategori }}">
@else @else
<img src="{{ asset('assets/user/img/services-1.jpg') }}" class="img-fluid" <img src="{{ asset('assets/user/img/services-1.jpg') }}" class="img-fluid"
alt="Default"> alt="Default">
@endif @endif
</div> </div>
<div class="details position-relative"> <div class="details position-relative">
<div class="icon"> <div class="icon">
@if ($item->nama_kategori == 'TPS') @if ($item->nama_kategori == 'TPS')
<i class="bi bi-trash"></i> <i class="bi bi-trash"></i>
@ -214,6 +217,7 @@ class="stretched-link">
<p> <p>
{{ explode('.', $item->deskripsi)[0] }}. {{ explode('.', $item->deskripsi)[0] }}.
</p> </p>
</div> </div>
</div> </div>