diff --git a/app/Http/Controllers/Web/Program/DetailKelompokController.php b/app/Http/Controllers/Web/Program/DetailKelompokController.php new file mode 100644 index 0000000..15fafc5 --- /dev/null +++ b/app/Http/Controllers/Web/Program/DetailKelompokController.php @@ -0,0 +1,99 @@ +validate([ + 'kelompok_id' => 'required|exists:kelompok_belajar_tani,id', + 'user_id' => [ + 'required', + Rule::exists('users', 'id')->where('role', Role::PETANI->value), + ], + 'jabatan' => 'required|string|max:255', + ]); + + $user = User::with('profile') + ->where('role', Role::PETANI->value) + ->findOrFail($request->user_id); + + DetailKelompok::create([ + 'kelompok_id' => $request->kelompok_id, + 'user_id' => $user->id, + 'nama_anggota' => $user->name, + 'jabatan' => $request->jabatan, + 'no_hp' => $user->profile->telepon ?? null, + 'alamat' => $user->profile->desakelurahan->nama ?? null, + ]); + + return back()->with( + 'success', + 'Anggota berhasil ditambahkan.' + ); + } + + public function update(Request $request, $id) + { + $request->validate([ + 'user_id' => [ + 'required', + Rule::exists('users', 'id')->where('role', Role::PETANI->value), + ], + 'jabatan' => 'required|string|max:255', + ]); + + $anggota = DetailKelompok::findOrFail($id); + + $user = User::with('profile') + ->where('role', Role::PETANI->value) + ->findOrFail($request->user_id); + + $anggota->update([ + 'user_id' => $user->id, + 'nama_anggota' => $user->name, + 'jabatan' => $request->jabatan, + 'no_hp' => $user->profile->telepon ?? null, + 'alamat' => $user->profile->desakelurahan->nama ?? null, + ]); + + return back()->with( + 'success', + 'Anggota berhasil diperbarui.' + ); + } + + public function destroy($id) + { + $anggota = DetailKelompok::findOrFail($id); + + $anggota->delete(); + + return back()->with('success', 'Anggota berhasil dihapus.'); + } + + public function detail($id) + { + $kelompok = KelompokBelajarTani::with('detailAnggota.user') + ->findOrFail($id); + + $petani = User::with('profile') + ->where('role', Role::PETANI->value) + ->orderBy('name') + ->get(); + + return view('program.kelompokbelajar.detailkelompok', compact( + 'kelompok', + 'petani' + )); + } +} diff --git a/app/Http/Controllers/Web/Program/KelompokBelajarTaniController.php b/app/Http/Controllers/Web/Program/KelompokBelajarTaniController.php index 9f79182..32875a2 100644 --- a/app/Http/Controllers/Web/Program/KelompokBelajarTaniController.php +++ b/app/Http/Controllers/Web/Program/KelompokBelajarTaniController.php @@ -5,6 +5,8 @@ namespace App\Http\Controllers\Web\Program; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Models\Program\KelompokBelajarTani; +use App\Models\Program\DetailKelompok; +use App\Models\User; class KelompokBelajarTaniController extends Controller { @@ -145,4 +147,19 @@ class KelompokBelajarTaniController extends Controller 'data' => $kelompok ]); } + + public function detail($id) + { + $kelompok = KelompokBelajarTani::with('detailAnggota.user') + ->findOrFail($id); + + $petani = User::where('role', 'petani') + ->orderBy('name') + ->get(); + + return view('program.kelompokbelajar.detailkelompok', compact( + 'kelompok', + 'petani' + )); + } } \ No newline at end of file diff --git a/app/Models/Program/DetailKelompok.php b/app/Models/Program/DetailKelompok.php new file mode 100644 index 0000000..bc3755a --- /dev/null +++ b/app/Models/Program/DetailKelompok.php @@ -0,0 +1,38 @@ +belongsTo( + KelompokBelajarTani::class, + 'kelompok_id' + ); + } + + // RELASI KE USER + public function user() + { + return $this->belongsTo( + User::class, + 'user_id' + ); + } +} \ No newline at end of file diff --git a/app/Models/Program/KelompokBelajarTani.php b/app/Models/Program/KelompokBelajarTani.php index a3cf92c..4726493 100644 --- a/app/Models/Program/KelompokBelajarTani.php +++ b/app/Models/Program/KelompokBelajarTani.php @@ -4,6 +4,7 @@ namespace App\Models\Program; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use App\Models\Program\DetailKelompok; class KelompokBelajarTani extends Model { @@ -19,4 +20,11 @@ class KelompokBelajarTani extends Model 'updated_by', 'deleted_by', ]; + + public function detailAnggota(){ + return $this->hasMany( + DetailKelompok::class, + 'kelompok_id' + ); + } } \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index a35ec1f..8351492 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -37,7 +37,7 @@ class User extends Authenticatable ]; } - protected function profile(): HasOne + public function profile(): HasOne { return $this->hasOne(\App\Models\Profile::class); } diff --git a/database/migrations/2026_05_12_104615_create_detail_kelompok_table.php b/database/migrations/2026_05_12_104615_create_detail_kelompok_table.php new file mode 100644 index 0000000..ef3d4a4 --- /dev/null +++ b/database/migrations/2026_05_12_104615_create_detail_kelompok_table.php @@ -0,0 +1,37 @@ +id(); + + $table->foreignId('kelompok_id') + ->constrained('kelompok_belajar_tani') + ->onDelete('cascade'); + + $table->string('nama_anggota'); + $table->string('jabatan')->nullable(); + $table->string('no_hp')->nullable(); + $table->text('alamat')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('detail_kelompok'); + } +}; diff --git a/database/migrations/2026_05_13_100715_update_detail_kelompok_table.php b/database/migrations/2026_05_13_100715_update_detail_kelompok_table.php new file mode 100644 index 0000000..1f5e199 --- /dev/null +++ b/database/migrations/2026_05_13_100715_update_detail_kelompok_table.php @@ -0,0 +1,31 @@ +foreignId('user_id') + ->nullable() + ->after('kelompok_id') + ->constrained('users') + ->nullOnDelete(); + + }); + } + + public function down(): void + { + Schema::table('detail_kelompok', function (Blueprint $table) { + + $table->dropForeign(['user_id']); + $table->dropColumn('user_id'); + + }); + } +}; \ No newline at end of file diff --git a/resources/views/program/kelompokbelajar/detailkelompok.blade.php b/resources/views/program/kelompokbelajar/detailkelompok.blade.php new file mode 100644 index 0000000..a11d2f0 --- /dev/null +++ b/resources/views/program/kelompokbelajar/detailkelompok.blade.php @@ -0,0 +1,384 @@ +@extends('layout.main') + +@section('content') +
+ + {{-- HEADER --}} +
+ +
+ +
+

+ {{ $kelompok->nama_kelompok }} +

+ + + {{ $kelompok->deskripsi ?? 'Tidak ada deskripsi' }} + +
+ +
+ + + + + + Kembali + + +
+ +
+ +
+ + {{-- TABEL --}} +
+ +
+
+ Detail Anggota Kelompok +
+
+ +
+ + + + + + + + + + + + + + + + + + + @forelse($kelompok->detailAnggota as $index => $anggota) + + + + + + + + + + + + + + + + + + @empty + + + + + + @endforelse + + + +
NoNama AnggotaJabatanTeleponDesa/KelurahanActions
{{ $index + 1 }}{{ $anggota->user->name ?? '-' }}{{ $anggota->jabatan ?? '-' }}{{ $anggota->no_hp ?? '-' }}{{ $anggota->alamat ?? '-' }} + +
+ + {{-- EDIT --}} + + + {{-- DELETE --}} +
+ + @csrf + @method('DELETE') + + + +
+ +
+ +
+ + Belum ada anggota kelompok. +
+ +
+ +
+ +
+ +{{-- OFFCANVAS ADD --}} +
+ +
+ +
+ Tambah Anggota +
+ + + +
+ +
+ +
+ + @csrf + + + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ + + +
+ +
+ +
+ +{{-- OFFCANVAS EDIT --}} +
+ +
+ +
+ Edit Anggota +
+ + + +
+ +
+ +
+ + @csrf + @method('PUT') + +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ + + +
+ +
+ +
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/program/kelompokbelajar/index.blade.php b/resources/views/program/kelompokbelajar/index.blade.php index 3308c19..9764b70 100644 --- a/resources/views/program/kelompokbelajar/index.blade.php +++ b/resources/views/program/kelompokbelajar/index.blade.php @@ -310,6 +310,13 @@ + + + + + diff --git a/routes/web.php b/routes/web.php index 9ceb9fb..31b37e4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -108,6 +108,8 @@ Route::middleware('auth') Route::resource('program.lokasi', App\Http\Controllers\Web\ProgramLokasiController::class)->only(['store', 'update', 'destroy']); Route::resource('workshop', App\Http\Controllers\Web\Program\WorkshopController::class); Route::resource('kelompok-belajar-tani', App\Http\Controllers\Web\Program\KelompokBelajarTaniController::class); + Route::resource('detail-anggota', App\Http\Controllers\Web\Program\DetailKelompokController::class); + Route::get('/kelompok-belajar-tani/{id}/detail',[App\Http\Controllers\Web\Program\KelompokBelajarTaniController::class, 'detail'])->name('kelompok-belajar-tani.detail'); // Basis Data Ekosistem Route::resource('group', App\Http\Controllers\Web\Ekosistem\GroupBasisDataController::class);