pembaruan admin

This commit is contained in:
rahmagustin 2026-02-19 10:59:40 +07:00
parent 7100ed2342
commit 217fb8907e
15 changed files with 669 additions and 396 deletions

View File

@ -13,7 +13,6 @@ public function index()
{
$title = 'Kategori TPS';
$kategori = KategoriTps::all();
return view('admin.kategori-tps.index', compact('title', 'kategori'));
}
@ -25,30 +24,38 @@ public function create()
public function store(Request $request)
{
$data = $request->validate([
$data = $request->validate(
[
'nama_kategori' => 'required|string|max:100',
'kepanjangan_kategori' => 'nullable|string|max:255',
'deskripsi' => 'nullable|string',
'foto_kategori' => 'nullable|image|mimes:jpg,jpeg,png|max:2048'
]);
'kepanjangan_kategori' => 'required|string|max:255',
'deskripsi' => 'required|string',
'foto_kategori' => 'required|image|mimes:jpg,jpeg,png|max:2048',
],
[
'nama_kategori.required' => 'Nama kategori wajib diisi',
'kepanjangan_kategori.required' => 'Kepanjangan kategori wajib diisi',
'deskripsi.required' => 'Deskripsi kategori wajib diisi',
'foto_kategori.required' => 'Foto kategori wajib diunggah',
'foto_kategori.image' => 'File harus berupa gambar',
'foto_kategori.mimes' => 'Format gambar harus JPG, JPEG, atau PNG',
'foto_kategori.max' => 'Ukuran gambar maksimal 2 MB',
]
);
if ($request->hasFile('foto_kategori')) {
$data['foto_kategori'] = $request->file('foto_kategori')
->store('kategori', 'public');
}
KategoriTps::create($data);
return redirect()
->route('admin.kategori.index')
->with('success', 'Kategori berhasil ditambahkan');
->with('success', 'Kategori TPS berhasil ditambahkan');
}
public function edit($id)
{
$title = 'Edit Kategori TPS';
$kategori = KategoriTps::findOrFail($id);
return view('admin.kategori-tps.edit', compact('title', 'kategori'));
}
@ -56,12 +63,22 @@ public function update(Request $request, $id)
{
$kategori = KategoriTps::findOrFail($id);
$data = $request->validate([
$data = $request->validate(
[
'nama_kategori' => 'required|string|max:100',
'kepanjangan_kategori' => 'nullable|string|max:255',
'deskripsi' => 'nullable|string',
'foto_kategori' => 'nullable|image|mimes:jpg,jpeg,png|max:4096'
]);
'kepanjangan_kategori' => 'required|string|max:255',
'deskripsi' => 'required|string',
'foto_kategori' => 'nullable|image|mimes:jpg,jpeg,png|max:4096',
],
[
'nama_kategori.required' => 'Nama kategori wajib diisi',
'kepanjangan_kategori.required' => 'Kepanjangan kategori wajib diisi',
'deskripsi.required' => 'Deskripsi kategori wajib diisi',
'foto_kategori.image' => 'File harus berupa gambar',
'foto_kategori.mimes' => 'Format gambar harus JPG, JPEG, atau PNG',
'foto_kategori.max' => 'Ukuran gambar maksimal 4 MB',
]
);
if ($request->hasFile('foto_kategori')) {
if ($kategori->foto_kategori) {
@ -76,7 +93,7 @@ public function update(Request $request, $id)
return redirect()
->route('admin.kategori.index')
->with('success', 'Kategori berhasil diperbarui');
->with('success', 'Kategori TPS berhasil diperbarui');
}
public function destroy($id)
@ -91,6 +108,6 @@ public function destroy($id)
return redirect()
->route('admin.kategori.index')
->with('success', 'Kategori berhasil dihapus');
->with('success', 'Kategori TPS berhasil dihapus');
}
}

View File

@ -6,6 +6,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\File;
class ProfilController extends Controller
{
@ -22,19 +23,54 @@ public function update(Request $request)
$request->validate([
'name' => 'required|string|max:255',
'username' => 'required|string|max:100',
'foto' => 'nullable|image|mimes:jpg,jpeg,png|max:2048',
'password' => 'nullable|min:6|confirmed',
]);
// ======================
// UPDATE DATA DASAR
// ======================
$admin->name = $request->name;
$admin->username = $request->username;
// ======================
// PROSES FOTO
// ======================
if ($request->hasFile('foto')) {
$path = public_path('assets/admin/foto-admin');
// buat folder kalau belum ada
if (!File::exists($path)) {
File::makeDirectory($path, 0755, true);
}
// hapus foto lama
if ($admin->foto && File::exists($path.'/'.$admin->foto)) {
File::delete($path.'/'.$admin->foto);
}
$file = $request->file('foto');
$namaFoto = time().'_'.uniqid().'.'.$file->getClientOriginalExtension();
// SIMPAN FOTO (INI KUNCI)
$file->move($path, $namaFoto);
// simpan ke DB
$admin->foto = $namaFoto;
}
// ======================
// PASSWORD
// ======================
if ($request->filled('password')) {
$admin->password = Hash::make($request->password);
}
$admin->save();
return redirect()->route('admin.profil')
return redirect()
->route('admin.profil')
->with('success', 'Profil berhasil diperbarui');
}
}

View File

@ -7,6 +7,7 @@
use App\Models\Sampah;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
class SampahController extends Controller
{
@ -14,7 +15,9 @@ public function index()
{
$title = 'Data Sampah';
$sampah = Sampah::with('user')->orderBy('tahun', 'desc')->get();
$sampah = Sampah::with('user')
->orderBy('tahun', 'desc')
->get();
return view('admin.sampah.index', compact('title', 'sampah'));
}
@ -27,14 +30,49 @@ public function create()
return view('admin.sampah.create', compact('title', 'users'));
}
/* ======================================================
STORE (TAMBAH DATA)
====================================================== */
public function store(Request $request)
{
$request->validate([
'tahun' => 'required|numeric',
'total_sampah' => 'required|numeric',
'total_kelola' => 'required|numeric',
'total_daur_ulang' => 'required|numeric',
]);
$validator = Validator::make(
$request->all(),
[
'tahun' => 'required|digits:4',
'total_sampah' => 'required|numeric|min:0',
'total_kelola' => 'required|numeric|min:0',
'total_daur_ulang' => 'required|numeric|min:0',
],
[
'tahun.required' => 'Tahun wajib diisi.',
'tahun.digits' => 'Tahun harus 4 digit (contoh: 2023).',
'total_sampah.required' => 'Total sampah wajib diisi.',
'total_sampah.numeric' => 'Total sampah harus berupa angka.',
'total_sampah.min' => 'Total sampah tidak boleh negatif.',
'total_kelola.required' => 'Total kelola wajib diisi.',
'total_kelola.numeric' => 'Total kelola harus berupa angka.',
'total_kelola.min' => 'Total kelola tidak boleh negatif.',
'total_daur_ulang.required' => 'Total daur ulang wajib diisi.',
'total_daur_ulang.numeric' => 'Total daur ulang harus berupa angka.',
'total_daur_ulang.min' => 'Total daur ulang tidak boleh negatif.',
]
);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
// VALIDASI LOGIKA DATA
if (($request->total_kelola + $request->total_daur_ulang) > $request->total_sampah) {
return back()
->withErrors([
'total_kelola' => 'Jumlah kelola + daur ulang tidak boleh melebihi total sampah.',
])
->withInput();
}
$sisa_sampah = $request->total_sampah
- ($request->total_kelola + $request->total_daur_ulang);
@ -49,7 +87,7 @@ public function store(Request $request)
]);
return redirect()->route('admin.sampah.index')
->with('success', 'Data sampah berhasil ditambahkan');
->with('success', 'Data sampah berhasil ditambahkan.');
}
public function edit($id)
@ -61,17 +99,52 @@ public function edit($id)
return view('admin.sampah.edit', compact('title', 'sampah', 'users'));
}
/* ======================================================
UPDATE (EDIT DATA)
====================================================== */
public function update(Request $request, $id)
{
$sampah = Sampah::findOrFail($id);
$request->validate([
$validator = Validator::make(
$request->all(),
[
'user_id' => 'required|exists:users,id',
'tahun' => 'required|numeric',
'total_sampah' => 'required|numeric',
'total_kelola' => 'required|numeric',
'total_daur_ulang' => 'required|numeric',
]);
'tahun' => 'required|digits:4',
'total_sampah' => 'required|numeric|min:0',
'total_kelola' => 'required|numeric|min:0',
'total_daur_ulang' => 'required|numeric|min:0',
],
[
'user_id.required' => 'Pengguna wajib dipilih.',
'user_id.exists' => 'Pengguna tidak valid.',
'tahun.required' => 'Tahun wajib diisi.',
'tahun.digits' => 'Tahun harus 4 digit.',
'total_sampah.required' => 'Total sampah wajib diisi.',
'total_sampah.numeric' => 'Total sampah harus berupa angka.',
'total_kelola.required' => 'Total kelola wajib diisi.',
'total_kelola.numeric' => 'Total kelola harus berupa angka.',
'total_daur_ulang.required' => 'Total daur ulang wajib diisi.',
'total_daur_ulang.numeric' => 'Total daur ulang harus berupa angka.',
]
);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
// VALIDASI LOGIKA DATA
if (($request->total_kelola + $request->total_daur_ulang) > $request->total_sampah) {
return back()
->withErrors([
'total_kelola' => 'Jumlah kelola + daur ulang tidak boleh melebihi total sampah.',
])
->withInput();
}
$sisa_sampah = $request->total_sampah
- ($request->total_kelola + $request->total_daur_ulang);
@ -86,7 +159,7 @@ public function update(Request $request, $id)
]);
return redirect()->route('admin.sampah.index')
->with('success', 'Data sampah berhasil diperbarui');
->with('success', 'Data sampah berhasil diperbarui.');
}
public function destroy($id)
@ -95,6 +168,6 @@ public function destroy($id)
$sampah->delete();
return redirect()->route('admin.sampah.index')
->with('success', 'Data sampah berhasil dihapus');
->with('success', 'Data sampah berhasil dihapus.');
}
}

View File

@ -7,6 +7,7 @@
use App\Models\LokasiTps;
use App\Models\KategoriTps;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
class TpsController extends Controller
{
@ -28,28 +29,24 @@ public function create()
return view('admin.tps.create', compact('title', 'kategori'));
}
/*
|--------------------------------------------------------------------------
| KONVERSI KOORDINAT (DECIMAL / DMS)
|--------------------------------------------------------------------------
*/
private function convertToDecimal($coordinate)
{
if (is_numeric($coordinate)) {
return (float) $coordinate;
}
if (!$coordinate) {
return null;
}
$coordinate = html_entity_decode($coordinate);
$coordinate = strtoupper(trim($coordinate));
$coordinate = str_replace(['°', "'", '"'], [' ', ' ', ' '], $coordinate);
preg_match('/([NSEW])/', $coordinate, $dir);
if (!$dir) {
return null;
}
preg_match_all('/\d+(\.\d+)?/', $coordinate, $numbers);
if (count($numbers[0]) < 3) {
if (!$dir || count($numbers[0]) < 3) {
return null;
}
@ -63,15 +60,10 @@ private function convertToDecimal($coordinate)
return $decimal;
}
/*
|--------------------------------------------------------------------------
| STORE (CREATE)
|--------------------------------------------------------------------------
*/
public function store(Request $request)
{
// VALIDASI DASAR + PESAN CUSTOM
$request->validate(
$validator = Validator::make(
$request->all(),
[
'kategori_tps_id' => 'required|exists:kategori_tps,id_kategori_tps',
'nama_tps' => 'required|string|max:255',
@ -81,7 +73,7 @@ public function store(Request $request)
'kapasitas_tps' => 'required|integer|min:1',
'latitude' => 'required',
'longitude' => 'required',
'foto_tps' => 'nullable|image|mimes:jpg,jpeg,png|max:2048',
'foto_tps' => 'required|image|mimes:jpg,jpeg,png|max:2048',
],
[
'kategori_tps_id.required' => 'Kategori TPS wajib dipilih.',
@ -94,7 +86,7 @@ public function store(Request $request)
'status_tps.in' => 'Status TPS tidak valid.',
'tahun_pembuatan.required' => 'Tahun pembuatan wajib diisi.',
'tahun_pembuatan.digits' => 'Tahun pembuatan harus 4 digit (contoh: 2022).',
'tahun_pembuatan.digits' => 'Tahun pembuatan harus 4 digit.',
'kapasitas_tps.required' => 'Kapasitas TPS wajib diisi.',
'kapasitas_tps.integer' => 'Kapasitas TPS harus berupa angka.',
@ -103,33 +95,32 @@ public function store(Request $request)
'latitude.required' => 'Latitude wajib diisi.',
'longitude.required' => 'Longitude wajib diisi.',
'foto_tps.required' => 'Foto TPS wajib diunggah.',
'foto_tps.image' => 'Foto TPS harus berupa gambar.',
'foto_tps.mimes' => 'Format foto TPS harus jpg, jpeg, atau png.',
'foto_tps.mimes' => 'Format foto harus jpg, jpeg, atau png.',
]
);
// VALIDASI KOORDINAT (TIDAK DOBEL ERROR)
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
$latitude = $this->convertToDecimal($request->latitude);
$longitude = $this->convertToDecimal($request->longitude);
$errors = [];
if ($latitude === null || $latitude < -90 || $latitude > 90) {
$errors['latitude'] = 'Latitude tidak valid. Contoh: -7.623 atau 7.623';
$validator->errors()->add('latitude', 'Latitude tidak valid.');
}
if ($longitude === null || $longitude < -180 || $longitude > 180) {
$errors['longitude'] = 'Longitude tidak valid. Contoh: 111.980 atau -111.980';
$validator->errors()->add('longitude', 'Longitude tidak valid.');
}
if (!empty($errors)) {
return back()->withErrors($errors)->withInput();
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
// UPLOAD FOTO
$foto = $request->hasFile('foto_tps')
? $request->file('foto_tps')->store('foto-tps', 'public')
: null;
$foto = $request->file('foto_tps')->store('foto-tps', 'public');
LokasiTps::create([
'kategori_tps_id' => $request->kategori_tps_id,
@ -147,11 +138,6 @@ public function store(Request $request)
->with('success', 'Data TPS berhasil ditambahkan.');
}
/*
|--------------------------------------------------------------------------
| EDIT
|--------------------------------------------------------------------------
*/
public function edit($id)
{
$title = 'Edit TPS';
@ -161,16 +147,12 @@ public function edit($id)
return view('admin.tps.edit', compact('title', 'tps', 'kategori'));
}
/*
|--------------------------------------------------------------------------
| UPDATE
|--------------------------------------------------------------------------
*/
public function update(Request $request, $id)
{
$tps = LokasiTps::findOrFail($id);
$request->validate(
$validator = Validator::make(
$request->all(),
[
'kategori_tps_id' => 'required|exists:kategori_tps,id_kategori_tps',
'nama_tps' => 'required|string|max:255',
@ -183,25 +165,31 @@ public function update(Request $request, $id)
'foto_tps' => 'nullable|image|mimes:jpg,jpeg,png|max:4096',
],
[
'kategori_tps_id.required' => 'Kategori TPS wajib dipilih.',
'nama_tps.required' => 'Nama TPS wajib diisi.',
'alamat_tps.required' => 'Alamat TPS wajib diisi.',
'tahun_pembuatan.digits' => 'Tahun pembuatan harus 4 digit.',
'kapasitas_tps.min' => 'Kapasitas TPS minimal 1.',
]
);
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
$latitude = $this->convertToDecimal($request->latitude);
$longitude = $this->convertToDecimal($request->longitude);
$errors = [];
if ($latitude === null || $latitude < -90 || $latitude > 90) {
$errors['latitude'] = 'Latitude tidak valid.';
$validator->errors()->add('latitude', 'Latitude tidak valid.');
}
if ($longitude === null || $longitude < -180 || $longitude > 180) {
$errors['longitude'] = 'Longitude tidak valid.';
$validator->errors()->add('longitude', 'Longitude tidak valid.');
}
if (!empty($errors)) {
return back()->withErrors($errors)->withInput();
if ($validator->fails()) {
return back()->withErrors($validator)->withInput();
}
if ($request->hasFile('foto_tps')) {
@ -229,11 +217,6 @@ public function update(Request $request, $id)
->with('success', 'Data TPS berhasil diperbarui.');
}
/*
|--------------------------------------------------------------------------
| DELETE
|--------------------------------------------------------------------------
*/
public function destroy($id)
{
$tps = LokasiTps::findOrFail($id);

View File

@ -0,0 +1,25 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('foto')->nullable()->after('role');
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('foto');
});
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 KiB

View File

@ -6,34 +6,67 @@
<div class="col-12 grid-margin stretch-card">
<div class="card">
<div class="card-body">
<h4 class="card-title">Tambah Kategori TPS</h4>
<p class="card-description">Form tambah data kategori TPS</p>
<form action="{{ route('admin.kategori.store') }}" method="POST" enctype="multipart/form-data">
@csrf
{{-- NAMA KATEGORI --}}
<div class="form-group">
<label>Nama Kategori</label>
<input type="text" name="nama_kategori" class="form-control" placeholder="Nama Kategori">
<input type="text"
name="nama_kategori"
class="form-control @error('nama_kategori') is-invalid @enderror"
placeholder="Nama Kategori"
value="{{ old('nama_kategori') }}">
@error('nama_kategori')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- KEPANJANGAN --}}
<div class="form-group">
<label>Kepanjangan Kategori</label>
<input type="text" name="kepanjangan_kategori" class="form-control" placeholder="Kepanjangan Kategori">
<input type="text"
name="kepanjangan_kategori"
class="form-control @error('kepanjangan_kategori') is-invalid @enderror"
placeholder="Kepanjangan Kategori"
value="{{ old('kepanjangan_kategori') }}">
@error('kepanjangan_kategori')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- DESKRIPSI --}}
<div class="form-group">
<label for="exampleTextarea1">Deskripsi</label>
<textarea name="deskripsi" class="form-control" id="exampleTextarea1" rows="8" placeholder="Deskripsi"></textarea>
<label>Deskripsi</label>
<textarea name="deskripsi"
class="form-control @error('deskripsi') is-invalid @enderror"
rows="6"
placeholder="Deskripsi">{{ old('deskripsi') }}</textarea>
@error('deskripsi')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- FOTO --}}
<div class="form-group">
<label>Foto Kategori</label>
<input type="file" name="foto_kategori" id="foto_kategori" class="file-upload-default">
<input type="file"
name="foto_kategori"
id="foto_kategori"
class="file-upload-default @error('foto_kategori') is-invalid @enderror">
<div class="input-group col-xs-12">
<input type="text" class="form-control file-upload-info" disabled
<input type="text"
class="form-control file-upload-info"
disabled
placeholder="Upload Foto">
<span class="input-group-append">
<button class="file-upload-browse btn btn-primary" type="button">
@ -41,10 +74,13 @@
</button>
</span>
</div>
@error('foto_kategori')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<button class="btn btn-primary">Simpan</button>
<button type="submit" class="btn btn-primary">Simpan</button>
<a href="{{ route('admin.kategori.index') }}" class="btn btn-light">Batal</a>
</form>

View File

@ -6,43 +6,73 @@
<div class="col-12 grid-margin stretch-card">
<div class="card">
<div class="card-body">
<h4 class="card-title">Edit Kategori TPS</h4>
<p class="card-description">Form edit data kategori TPS</p>
<form action="{{ route('admin.kategori.update', $kategori->id_kategori_tps) }}" method="POST"
<form action="{{ route('admin.kategori.update', $kategori->id_kategori_tps) }}"
method="POST"
enctype="multipart/form-data">
@csrf
@method('PUT')
{{-- NAMA KATEGORI --}}
<div class="form-group">
<label>Nama Kategori</label>
<input type="text" name="nama_kategori" value="{{ $kategori->nama_kategori }}"
class="form-control" required>
<input type="text"
name="nama_kategori"
class="form-control @error('nama_kategori') is-invalid @enderror"
value="{{ old('nama_kategori', $kategori->nama_kategori) }}"
required>
@error('nama_kategori')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- KEPANJANGAN --}}
<div class="form-group">
<label>Kepanjangan Kategori</label>
<input type="text" name="kepanjangan_kategori" value="{{ $kategori->kepanjangan_kategori }}"
class="form-control">
<input type="text"
name="kepanjangan_kategori"
class="form-control @error('kepanjangan_kategori') is-invalid @enderror"
value="{{ old('kepanjangan_kategori', $kategori->kepanjangan_kategori) }}">
@error('kepanjangan_kategori')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- DESKRIPSI --}}
<div class="form-group">
<label>Deskripsi</label>
<textarea name="deskripsi" rows="8" class="form-control">{{ $kategori->deskripsi }}</textarea>
<textarea name="deskripsi"
rows="6"
class="form-control @error('deskripsi') is-invalid @enderror"
placeholder="Deskripsi">{{ old('deskripsi', $kategori->deskripsi) }}</textarea>
@error('deskripsi')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- FOTO --}}
<div class="form-group">
<label>Foto Kategori</label>
<!-- INPUT FILE ASLI (HIDDEN - TEMPLATE) -->
<input type="file" name="foto_kategori" id="foto_kategori" class="file-upload-default"
<!-- INPUT FILE ASLI -->
<input type="file"
name="foto_kategori"
id="foto_kategori"
class="file-upload-default @error('foto_kategori') is-invalid @enderror"
accept="image/*">
<!-- INPUT DISPLAY -->
<div class="input-group col-xs-12">
<input type="text" class="form-control file-upload-info" disabled
<input type="text"
class="form-control file-upload-info"
disabled
placeholder="Upload Foto">
<span class="input-group-append">
<button class="file-upload-browse btn btn-primary" type="button">
Upload
@ -50,17 +80,21 @@ class="form-control">
</span>
</div>
<!-- PREVIEW FOTO LAMA -->
@error('foto_kategori')
<small class="text-danger">{{ $message }}</small>
@enderror
{{-- PREVIEW FOTO LAMA --}}
@if ($kategori->foto_kategori)
<div class="mt-2">
<img src="{{ asset('storage/' . $kategori->foto_kategori) }}" width="250"
<img src="{{ asset('storage/' . $kategori->foto_kategori) }}"
width="250"
class="img-thumbnail">
</div>
@endif
</div>
<button class="btn btn-primary">Simpan</button>
<button type="submit" class="btn btn-primary">Simpan</button>
<a href="{{ route('admin.kategori.index') }}" class="btn btn-light">Batal</a>
</form>

View File

@ -53,7 +53,7 @@
@endif
</td>
<td>
<div class="deskripsi-truncate-div">
<div class="text-justify deskripsi-truncate-div">
{{ $item->deskripsi ?? '-' }}
</div>
</td>

View File

@ -25,7 +25,7 @@
<img
src="{{ $admin->foto
? asset('storage/foto-admin/' . $admin->foto)
? asset('assets/admin/foto-admin/' . $admin->foto)
: asset('assets/admin/images/user.jpg') }}"
class="mb-3 rounded-circle"
width="160"

View File

@ -16,8 +16,13 @@
<div class="form-group">
<label>Tahun</label>
<input type="number" name="tahun" class="form-control"
placeholder="Contoh: 2024" required>
<input type="number" name="tahun"
class="form-control @error('tahun') is-invalid @enderror"
value="{{ old('tahun') }}"
placeholder="Contoh: 2024">
@error('tahun')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
@ -25,12 +30,16 @@
<div class="input-group">
<input type="number" step="0.01" name="total_sampah"
id="total_sampah"
class="form-control"
placeholder="Total sampah dihasilkan" required>
class="form-control @error('total_sampah') is-invalid @enderror"
value="{{ old('total_sampah') }}"
placeholder="Total sampah dihasilkan">
<div class="input-group-append">
<span class="input-group-text">Ton</span>
</div>
</div>
@error('total_sampah')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
@ -38,12 +47,16 @@ class="form-control"
<div class="input-group">
<input type="number" step="0.01" name="total_kelola"
id="total_kelola"
class="form-control"
placeholder="Total sampah yang dikelola" required>
class="form-control @error('total_kelola') is-invalid @enderror"
value="{{ old('total_kelola') }}"
placeholder="Total sampah yang dikelola">
<div class="input-group-append">
<span class="input-group-text">Ton</span>
</div>
</div>
@error('total_kelola')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
@ -51,12 +64,16 @@ class="form-control"
<div class="input-group">
<input type="number" step="0.01" name="total_daur_ulang"
id="total_daur_ulang"
class="form-control"
placeholder="Total sampah yang didaur ulang" required>
class="form-control @error('total_daur_ulang') is-invalid @enderror"
value="{{ old('total_daur_ulang') }}"
placeholder="Total sampah yang didaur ulang">
<div class="input-group-append">
<span class="input-group-text">Ton</span>
</div>
</div>
@error('total_daur_ulang')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">

View File

@ -17,44 +17,57 @@
<div class="form-group">
<label>Tahun</label>
<input type="number" name="tahun" class="form-control"
value="{{ old('tahun', $sampah->tahun) }}" required>
<input type="number" name="tahun"
class="form-control @error('tahun') is-invalid @enderror"
value="{{ old('tahun', $sampah->tahun) }}">
@error('tahun')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label>Total Sampah</label>
<div class="input-group">
<input type="number" step="0.01" name="total_sampah"
class="form-control"
value="{{ old('total_sampah', $sampah->total_sampah) }}" required>
class="form-control @error('total_sampah') is-invalid @enderror"
value="{{ old('total_sampah', $sampah->total_sampah) }}">
<div class="input-group-append">
<span class="input-group-text">Ton</span>
</div>
</div>
@error('total_sampah')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label>Total Sampah Dikelola</label>
<div class="input-group">
<input type="number" step="0.01" name="total_kelola"
class="form-control"
value="{{ old('total_kelola', $sampah->total_kelola) }}" required>
class="form-control @error('total_kelola') is-invalid @enderror"
value="{{ old('total_kelola', $sampah->total_kelola) }}">
<div class="input-group-append">
<span class="input-group-text">Ton</span>
</div>
</div>
@error('total_kelola')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">
<label>Total Sampah Daur Ulang</label>
<div class="input-group">
<input type="number" step="0.01" name="total_daur_ulang"
class="form-control"
value="{{ old('total_daur_ulang', $sampah->total_daur_ulang) }}" required>
class="form-control @error('total_daur_ulang') is-invalid @enderror"
value="{{ old('total_daur_ulang', $sampah->total_daur_ulang) }}">
<div class="input-group-append">
<span class="input-group-text">Ton</span>
</div>
</div>
@error('total_daur_ulang')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<div class="form-group">

View File

@ -23,6 +23,8 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.1/font/bootstrap-icons.css">
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://unpkg.com/cropperjs/dist/cropper.min.css">
<style>
/* Turunkan icon SweetAlert2 */
.swal2-icon {
@ -51,7 +53,15 @@
<ul class="navbar-nav navbar-nav-right">
<li class="nav-item nav-profile dropdown">
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown" id="profileDropdown">
<img src="{{ asset('assets/admin/images/user.jpg') }}" alt="profile" />
@php
$user = Auth::user();
@endphp
<img src="{{ $user && $user->foto
? asset('assets/admin/foto-admin/' . $user->foto)
: asset('assets/admin/images/user.jpg') }}"
alt="profile" />
</a>
<div class="dropdown-menu dropdown-menu-right navbar-dropdown"
aria-labelledby="profileDropdown">
@ -120,6 +130,8 @@
</div>
</div>
<script src="https://unpkg.com/cropperjs/dist/cropper.min.js"></script>
<!-- plugins:js -->
<script src="{{ asset('assets/admin/vendors/js/vendor.bundle.base.js') }}"></script>
<!-- endinject -->

View File

@ -6,38 +6,46 @@
<div class="col-12 grid-margin stretch-card">
<div class="card">
<div class="card-body">
<h4 class="card-title">Tambah Data TPS</h4>
<p class="card-description">Form tambah data TPS</p>
<form action="{{ route('admin.tps.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<!-- NAMA TPS -->
{{-- NAMA TPS --}}
<div class="form-group">
<label>Nama TPS</label>
<input type="text" name="nama_tps" class="form-control"
<input type="text"
name="nama_tps"
class="form-control @error('nama_tps') is-invalid @enderror"
value="{{ old('nama_tps') }}"
placeholder="Nama TPS">
@error('nama_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- ALAMAT -->
{{-- ALAMAT --}}
<div class="form-group">
<label>Alamat</label>
<input type="text" name="alamat_tps" class="form-control"
<input type="text"
name="alamat_tps"
class="form-control @error('alamat_tps') is-invalid @enderror"
value="{{ old('alamat_tps') }}"
placeholder="Alamat TPS">
@error('alamat_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- KATEGORI -->
{{-- KATEGORI --}}
<div class="form-group">
<label>Kategori TPS</label>
<select name="kategori_tps_id" class="form-control">
<select name="kategori_tps_id"
class="form-control @error('kategori_tps_id') is-invalid @enderror">
<option value="">Pilih Kategori</option>
@foreach ($kategori as $item)
<option value="{{ $item->id_kategori_tps }}"
@ -46,76 +54,97 @@
</option>
@endforeach
</select>
@error('kategori_tps_id')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- TAHUN -->
{{-- TAHUN --}}
<div class="form-group">
<label>Tahun Pembuatan</label>
<input type="number" name="tahun_pembuatan" class="form-control"
<input type="number"
name="tahun_pembuatan"
class="form-control @error('tahun_pembuatan') is-invalid @enderror"
value="{{ old('tahun_pembuatan') }}"
placeholder="Contoh: 2022">
@error('tahun_pembuatan')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- KAPASITAS -->
{{-- KAPASITAS --}}
<div class="form-group">
<label>Kapasitas</label>
<input type="text" name="kapasitas_tps" class="form-control"
<input type="text"
name="kapasitas_tps"
class="form-control @error('kapasitas_tps') is-invalid @enderror"
value="{{ old('kapasitas_tps') }}"
placeholder="Kapasitas TPS">
@error('kapasitas_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- STATUS -->
{{-- STATUS --}}
<div class="form-group">
<label>Status</label>
<select name="status_tps" class="form-control">
<select name="status_tps"
class="form-control @error('status_tps') is-invalid @enderror">
<option value="">Pilih Status</option>
<option value="Aktif" {{ old('status_tps') == 'Aktif' ? 'selected' : '' }}>Aktif</option>
<option value="Tidak Aktif" {{ old('status_tps') == 'Tidak Aktif' ? 'selected' : '' }}>Tidak Aktif</option>
<option value="Pembangunan" {{ old('status_tps') == 'Pembangunan' ? 'selected' : '' }}>Pembangunan</option>
</select>
@error('status_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- LATITUDE -->
{{-- LATITUDE --}}
<div class="form-group">
<label>Latitude</label>
<input type="text" name="latitude" class="form-control"
<input type="text"
name="latitude"
class="form-control @error('latitude') is-invalid @enderror"
value="{{ old('latitude') }}"
placeholder="Contoh: -7.623 atau 7°35'17.25&quot;S">
@error('latitude')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- LONGITUDE -->
{{-- LONGITUDE --}}
<div class="form-group">
<label>Longitude</label>
<input type="text" name="longitude" class="form-control"
<input type="text"
name="longitude"
class="form-control @error('longitude') is-invalid @enderror"
value="{{ old('longitude') }}"
placeholder="Contoh: 111.980 atau 111°55'0.97&quot;E">
@error('longitude')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
<!-- FOTO -->
{{-- FOTO --}}
<div class="form-group">
<label>Foto TPS</label>
<input type="file" name="foto_tps" id="foto_tps" class="file-upload-default">
<input type="file"
name="foto_tps"
id="foto_tps"
class="file-upload-default @error('foto_tps') is-invalid @enderror">
<div class="input-group col-xs-12">
<input type="text" class="form-control file-upload-info" disabled
<input type="text"
class="form-control file-upload-info"
disabled
placeholder="Upload Foto">
<span class="input-group-append">
<button class="file-upload-browse btn btn-primary" type="button">
@ -129,7 +158,7 @@
@enderror
</div>
<button type="submit" class="mr-2 btn btn-primary">Simpan</button>
<button type="submit" class="btn btn-primary">Simpan</button>
<a href="{{ route('admin.tps.index') }}" class="btn btn-light">Batal</a>
</form>

View File

@ -6,7 +6,6 @@ function decimalToDms($decimal, $type = 'lat')
}
$direction = $decimal >= 0 ? ($type === 'lat' ? 'N' : 'E') : ($type === 'lat' ? 'S' : 'W');
$decimal = abs($decimal);
$degree = floor($decimal);
@ -26,126 +25,143 @@ function decimalToDms($decimal, $type = 'lat')
<div class="col-12 grid-margin stretch-card">
<div class="card">
<div class="card-body">
<h4 class="card-title">Edit Data TPS</h4>
<p class="card-description">
Form edit data Tempat Pembuangan Sampah
</p>
<form action="{{ route('admin.tps.update', $tps->id_tps) }}" method="POST"
enctype="multipart/form-data" class="forms-sample">
<h4 class="card-title">Edit Data TPS</h4>
<p class="card-description">Form edit data Tempat Pembuangan Sampah</p>
<form action="{{ route('admin.tps.update', $tps->id_tps) }}"
method="POST"
enctype="multipart/form-data"
class="forms-sample">
@csrf
@method('PUT')
{{-- Nama TPS --}}
{{-- NAMA TPS --}}
<div class="form-group">
<label>Nama TPS</label>
<input type="text" name="nama_tps" class="form-control"
value="{{ old('nama_tps') ?? $tps->nama_tps }}" required>
<input type="text"
name="nama_tps"
class="form-control @error('nama_tps') is-invalid @enderror"
value="{{ old('nama_tps', $tps->nama_tps) }}">
@error('nama_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Alamat --}}
{{-- ALAMAT --}}
<div class="form-group">
<label>Alamat</label>
<input type="text" name="alamat_tps" class="form-control"
value="{{ old('alamat_tps') ?? $tps->alamat_tps }}" required>
<input type="text"
name="alamat_tps"
class="form-control @error('alamat_tps') is-invalid @enderror"
value="{{ old('alamat_tps', $tps->alamat_tps) }}">
@error('alamat_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Kategori TPS --}}
{{-- KATEGORI --}}
<div class="form-group">
<label>Kategori TPS</label>
<select name="kategori_tps_id" class="form-control" required>
<select name="kategori_tps_id"
class="form-control @error('kategori_tps_id') is-invalid @enderror">
<option value="">-- Pilih Kategori --</option>
@foreach ($kategori as $item)
<option value="{{ $item->id_kategori_tps }}"
{{ (old('kategori_tps_id') ?? $tps->kategori_tps_id) == $item->id_kategori_tps ? 'selected' : '' }}>
{{ old('kategori_tps_id', $tps->kategori_tps_id) == $item->id_kategori_tps ? 'selected' : '' }}>
{{ $item->nama_kategori }}
</option>
@endforeach
</select>
@error('kategori_tps_id')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Tahun Pembuatan --}}
{{-- TAHUN --}}
<div class="form-group">
<label>Tahun Pembuatan</label>
<input type="number" name="tahun_pembuatan" class="form-control"
value="{{ old('tahun_pembuatan') ?? $tps->tahun_pembuatan }}" required>
<input type="number"
name="tahun_pembuatan"
class="form-control @error('tahun_pembuatan') is-invalid @enderror"
value="{{ old('tahun_pembuatan', $tps->tahun_pembuatan) }}">
@error('tahun_pembuatan')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Kapasitas TPS --}}
{{-- KAPASITAS --}}
<div class="form-group">
<label>Kapasitas TPS</label>
<input type="number" name="kapasitas_tps" class="form-control"
value="{{ old('kapasitas_tps') ?? $tps->kapasitas_tps }}" required>
<input type="number"
name="kapasitas_tps"
class="form-control @error('kapasitas_tps') is-invalid @enderror"
value="{{ old('kapasitas_tps', $tps->kapasitas_tps) }}">
@error('kapasitas_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Status TPS --}}
{{-- STATUS --}}
<div class="form-group">
<label>Status TPS</label>
<select name="status_tps" class="form-control" required>
<option value="Aktif"
{{ (old('status_tps') ?? $tps->status_tps) == 'Aktif' ? 'selected' : '' }}>Aktif
</option>
<option value="Tidak Aktif"
{{ (old('status_tps') ?? $tps->status_tps) == 'Tidak Aktif' ? 'selected' : '' }}>
Tidak Aktif</option>
<option value="Pembangunan"
{{ (old('status_tps') ?? $tps->status_tps) == 'Pembangunan' ? 'selected' : '' }}>
Pembangunan</option>
<select name="status_tps"
class="form-control @error('status_tps') is-invalid @enderror">
<option value="Aktif" {{ old('status_tps', $tps->status_tps) == 'Aktif' ? 'selected' : '' }}>Aktif</option>
<option value="Tidak Aktif" {{ old('status_tps', $tps->status_tps) == 'Tidak Aktif' ? 'selected' : '' }}>Tidak Aktif</option>
<option value="Pembangunan" {{ old('status_tps', $tps->status_tps) == 'Pembangunan' ? 'selected' : '' }}>Pembangunan</option>
</select>
@error('status_tps')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Latitude --}}
{{-- LATITUDE --}}
<div class="form-group">
<label>Latitude</label>
<input type="text" name="latitude" class="form-control" placeholder="Contoh: 7°35'17.25S"
value="{{ old('latitude') ?? decimalToDms($tps->latitude, 'lat') }}" required>
<input type="text"
name="latitude"
class="form-control @error('latitude') is-invalid @enderror"
value="{{ old('latitude', decimalToDms($tps->latitude, 'lat')) }}"
placeholder="Contoh: 7°35'17.25S">
@error('latitude')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Longitude --}}
{{-- LONGITUDE --}}
<div class="form-group">
<label>Longitude</label>
<input type="text" name="longitude" class="form-control"
placeholder="Contoh: 111°55'0.97E"
value="{{ old('longitude') ?? decimalToDms($tps->longitude, 'lng') }}" required>
<input type="text"
name="longitude"
class="form-control @error('longitude') is-invalid @enderror"
value="{{ old('longitude', decimalToDms($tps->longitude, 'lng')) }}"
placeholder="Contoh: 111°55'0.97E">
@error('longitude')
<small class="text-danger">{{ $message }}</small>
@enderror
</div>
{{-- Foto TPS --}}
{{-- FOTO --}}
<div class="form-group">
<label>Foto TPS</label>
<input type="file" name="foto_tps" id="foto_tps" class="file-upload-default">
<input type="file"
name="foto_tps"
class="file-upload-default @error('foto_tps') is-invalid @enderror">
<div class="input-group col-xs-12">
<input type="text" class="form-control file-upload-info" disabled
placeholder="Upload Foto TPS">
<input type="text" class="form-control file-upload-info" disabled placeholder="Upload Foto TPS">
<span class="input-group-append">
<button class="file-upload-browse btn btn-primary" type="button">
Upload
</button>
<button class="file-upload-browse btn btn-primary" type="button">Upload</button>
</span>
</div>
@ -155,38 +171,20 @@ function decimalToDms($decimal, $type = 'lat')
@if ($tps->foto_tps)
<div class="mt-2">
<img src="{{ asset('storage/' . $tps->foto_tps) }}" width="250"
<img src="{{ asset('storage/' . $tps->foto_tps) }}"
width="250"
class="img-thumbnail">
</div>
@endif
</div>
{{-- Button --}}
<button type="submit" class="mr-2 btn btn-primary">Simpan</button>
<button type="submit" class="btn btn-primary">Simpan</button>
<a href="{{ route('admin.tps.index') }}" class="btn btn-light">Batal</a>
</form>
</div>
</div>
</div>
</div>
</div>
<script>
document.querySelectorAll('.file-upload-browse').forEach(function(button) {
button.addEventListener('click', function() {
this.closest('.form-group')
.querySelector('.file-upload-default')
.click();
});
});
document.querySelectorAll('.file-upload-default').forEach(function(input) {
input.addEventListener('change', function() {
const fileName = this.files[0]?.name || '';
this.closest('.form-group')
.querySelector('.file-upload-info')
.value = fileName;
});
});
</script>
</div>
</div>
</div>
</div>
</div>
@endsection