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\Models\AduanTps;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class AduanController extends Controller
{
@ -27,12 +28,18 @@ public function index(Request $request)
return view('admin.aduan.index', compact('aduan'));
}
/**
* Detail aduan
*/
public function show($id)
{
$aduan = AduanTps::findOrFail($id);
return view('admin.aduan.edit', compact('aduan'));
}
/**
* Simpan tanggapan admin
*/
public function tanggapi(Request $request, $id)
{
$request->validate([
@ -44,6 +51,7 @@ public function tanggapi(Request $request, $id)
]);
$aduan = AduanTps::findOrFail($id);
$aduan->tanggapan_admin = $request->tanggapan_admin;
$aduan->tanggal_tanggapan = now();
$aduan->save();
@ -53,18 +61,18 @@ public function tanggapi(Request $request, $id)
}
/**
* Hapus tanggapan admin
* Hapus aduan
*/
public function destroy($id)
{
$aduan = AduanTps::findOrFail($id);
// Hapus file bukti foto jika ada
if ($aduan->bukti_foto && file_exists(public_path('assets/user/img/aduan/' . $aduan->bukti_foto))) {
unlink(public_path('assets/user/img/aduan/' . $aduan->bukti_foto));
// Hapus foto bukti dari storage
if ($aduan->bukti_foto && Storage::disk('public')->exists($aduan->bukti_foto)) {
Storage::disk('public')->delete($aduan->bukti_foto);
}
// Hapus data aduan dari database
// Hapus data dari database
$aduan->delete();
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',
]);
// Upload foto bukti ke folder publik langsung
$fotoPath = null;
if ($request->hasFile('bukti_foto')) {
$file = $request->file('bukti_foto');
$filename = strtolower(str_replace(' ', '_', pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME)))
. '_' . time() . '.' . $file->getClientOriginalExtension();
$file->move(public_path('assets/user/img/aduan'), $filename);
$fotoPath = $filename;
$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,

View File

@ -23,6 +23,7 @@ class="forms-sample">
<label>TPS yang Diadukan</label>
<input type="text" class="form-control" value="{{ $aduan->lokasiTps->nama_tps ?? '-' }}"
readonly>
<small class="text-muted">
{{ $aduan->lokasiTps->alamat_tps ?? '' }}
</small>
@ -50,27 +51,32 @@ class="forms-sample">
@if ($aduan->bukti_foto)
<div class="form-group">
<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>
@endif
{{-- Tanggapan Admin --}}
<div class="form-group">
<label>Tanggapan Admin</label>
<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>
@error('tanggapan_admin')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
</div>
{{-- Tombol --}}
<button type="submit" class="mr-2 btn btn-primary">
Simpan Tanggapan
</button>
<a href="{{ route('admin.aduan.index') }}" class="btn btn-light">
Kembali
</a>

View File

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

View File

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

View File

@ -49,7 +49,7 @@ class="{{ $kat->id_kategori_tps == $kategori->id_kategori_tps ? 'active' : '' }}
{{-- Foto --}}
@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">
@else
<img src="{{ asset('assets/user/img/services.jpg') }}"

View File

@ -47,7 +47,7 @@
<option value="{{ $item->id_tps }}"
data-nama="{{ $item->nama_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 }}
</option>
@endforeach

View File

@ -40,7 +40,7 @@ function toDMS($decimal, $type = 'lat') {
<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('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"
style="object-fit:cover">
</div>

View File

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