From 471ca5ac0e273b0798d4824f75ea67031be0dae3 Mon Sep 17 00:00:00 2001 From: SyaharaniSalsabilla Date: Wed, 23 Sep 2026 10:13:13 +0700 Subject: [PATCH] filter profil petani --- .../Web/Produktivitas/PetaniController.php | 72 ++++- .../produktivitas/petani/index.blade.php | 288 +++++++++++++++++- 2 files changed, 350 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Web/Produktivitas/PetaniController.php b/app/Http/Controllers/Web/Produktivitas/PetaniController.php index 73dc694..5474510 100644 --- a/app/Http/Controllers/Web/Produktivitas/PetaniController.php +++ b/app/Http/Controllers/Web/Produktivitas/PetaniController.php @@ -12,6 +12,8 @@ use Illuminate\Support\Str; use Illuminate\Support\Facades\Storage; use App\Models\Wilayah\Provinsi; +use App\Models\Wilayah\KabupatenKota; +use App\Models\Wilayah\Kecamatan; use App\Models\Pertanian\Petani; use App\Models\Wilayah\DesaKelurahan; use App\Models\Pertanian\Komoditas; @@ -35,6 +37,20 @@ class PetaniController extends Controller } $provinsi = Provinsi::select('id', 'kode', 'nama')->orderBy('kode', 'asc')->get(); + $userRole = auth()->user()->role->value; + $showFasilitatorColumn = in_array($userRole, ['super_admin', 'admin'], true); + $defaultKabupaten = KabupatenKota::select('id', 'nama') + ->whereRaw('lower(nama) like ?', ['%ngada%']) + ->orderBy('nama') + ->first(); + $selectedKabupatenId = $request->query('kabupaten_kota_id', $defaultKabupaten?->id); + $filters = [ + 'search' => $request->query('search'), + 'komoditas_id' => $request->query('komoditas_id'), + 'kabupaten_kota_id' => $selectedKabupatenId, + 'kecamatan_id' => $request->query('kecamatan_id'), + 'desa_kelurahan_id' => $request->query('desa_kelurahan_id'), + ]; $query = Petani::with([ 'desaKelurahan:id,nama,kecamatan_id', @@ -43,6 +59,7 @@ class PetaniController extends Controller 'desaKelurahan.kecamatan.kabupatenKota.provinsi:id,nama', 'komoditas:id,nama', 'skor:id,petani_id,skor_kesiapan_adopsi', + 'creator:id,name,role', ]) ->orderBy('created_at', 'desc'); @@ -53,7 +70,27 @@ class PetaniController extends Controller }); } - if (auth()->user()->role->value === 'fasilitator') { + if ($request->filled('komoditas_id')) { + $query->where('komoditas_id', $request->komoditas_id); + } + + if ($filters['kabupaten_kota_id']) { + $query->whereHas('desaKelurahan.kecamatan', function ($query) use ($filters) { + $query->where('kabupaten_kota_id', $filters['kabupaten_kota_id']); + }); + } + + if ($request->filled('kecamatan_id')) { + $query->whereHas('desaKelurahan', function ($query) use ($request) { + $query->where('kecamatan_id', $request->kecamatan_id); + }); + } + + if ($request->filled('desa_kelurahan_id')) { + $query->where('desa_kelurahan_id', $request->desa_kelurahan_id); + } + + if ($userRole === 'fasilitator') { $query->where('created_by', auth()->user()->id); } @@ -61,8 +98,23 @@ class PetaniController extends Controller $petani = $query->paginate($request->per_page ?? 10); $komoditas = Komoditas::select('id', 'nama')->where('is_utama', true)->get(); + $komoditasOptions = Komoditas::select('id', 'nama')->orderBy('nama')->get(); + $kabupatenOptions = KabupatenKota::select('id', 'nama')->orderBy('nama')->get(); + $selectedKabupaten = $filters['kabupaten_kota_id'] + ? KabupatenKota::select('id', 'nama')->find($filters['kabupaten_kota_id']) + : null; + $kecamatanOptions = $filters['kabupaten_kota_id'] + ? Kecamatan::select('id', 'nama')->where('kabupaten_kota_id', $filters['kabupaten_kota_id'])->orderBy('nama')->get() + : collect(); + $desaOptions = $request->filled('kecamatan_id') + ? DesaKelurahan::select('id', 'nama')->where('kecamatan_id', $request->kecamatan_id)->orderBy('nama')->get() + : collect(); $lahanQuery = Lahan::whereIn('petani_id', $summaryPetaniIds) - ->whereIn('komoditas_id', $komoditas->pluck('id')); + ->when( + $request->filled('komoditas_id'), + fn ($query) => $query->where('komoditas_id', $request->komoditas_id), + fn ($query) => $query->whereIn('komoditas_id', $komoditas->pluck('id')) + ); $lahanIds = (clone $lahanQuery)->pluck('id'); $totalLuasLahan = (clone $lahanQuery)->sum('luas_lahan'); $totalTanaman = Tanaman::whereIn('lahan_id', $lahanIds)->count(); @@ -81,7 +133,21 @@ class PetaniController extends Controller ->groupByRaw($case) ->get(); - return view('produktivitas.petani.index', compact('petani', 'provinsi', 'komoditas', 'skor', 'totalLuasLahan', 'totalTanaman')); + return view('produktivitas.petani.index', compact( + 'petani', + 'provinsi', + 'komoditas', + 'komoditasOptions', + 'kabupatenOptions', + 'selectedKabupaten', + 'kecamatanOptions', + 'desaOptions', + 'filters', + 'skor', + 'totalLuasLahan', + 'totalTanaman', + 'showFasilitatorColumn' + )); } public function create() diff --git a/resources/views/produktivitas/petani/index.blade.php b/resources/views/produktivitas/petani/index.blade.php index 1db4611..31700c6 100644 --- a/resources/views/produktivitas/petani/index.blade.php +++ b/resources/views/produktivitas/petani/index.blade.php @@ -1,5 +1,87 @@ @extends('layout.main') +@push('style') + +@endpush + @section('content')
@@ -32,13 +114,154 @@
+
+
+
+
+
+ + +
+
+ + +
+ +
+ {{ preg_replace('/^(kabupaten|kota)\s+/i', '', $selectedKabupaten?->nama ?? 'Ngada') }} +
+
+ +
+ +
+ +
+ +
+
+ +
+ +
+ + +
+ +
+ +
+
+ + +
+
+ + + + + + Reset + +
+
+
+
+
+
+
+
Data Petani
-
+ + + + + + +
@@ -49,11 +272,7 @@
-
-
- - -
+
Tambah @@ -71,6 +290,9 @@ Usia Desa/Kelurahan Komoditas Utama + @if($showFasilitatorColumn) + Fasilitator + @endif Segmentasi Aksi @@ -84,6 +306,9 @@ {{ $item->umur }} tahun {{ $item->desaKelurahan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->nama }}, {{ $item->desaKelurahan?->kecamatan?->kabupatenKota?->provinsi?->nama }} {{ $item->komoditas?->nama }} + @if($showFasilitatorColumn) + {{ $item->creator?->name ?? '-' }} + @endif @if($item->segmen() == 'Penggerak') Penggerak @@ -104,7 +329,7 @@ @empty - Tidak ada data ditemukan. + Tidak ada data ditemukan. @endforelse @@ -122,6 +347,55 @@ const csrfToken = "{{ csrf_token() }}"; $(document).ready(function () { + const kecamatanUrlTemplate = '{{ route("kecamatan.bykabupatenkota", ":id") }}'; + const desaUrlTemplate = '{{ route("desakelurahan.bykecamatan", ":id") }}'; + const $kabupatenFilter = $('#filter-kabupaten'); + const $kecamatanFilter = $('#filter-kecamatan'); + const $desaFilter = $('#filter-desa'); + + function resetSelect($select, placeholder, disabled = true) { + $select.empty().append(``); + $select.prop('disabled', disabled); + } + + function fillSelect($select, data, selectedValue, placeholder) { + resetSelect($select, placeholder, false); + + data.forEach(function (item) { + const option = new Option(item.nama, item.id, false, String(selectedValue || '') === String(item.id)); + $select.append(option); + }); + } + + $kabupatenFilter.on('change', function () { + const kabupatenId = $(this).val(); + + resetSelect($kecamatanFilter, 'Semua Kecamatan'); + resetSelect($desaFilter, 'Semua Desa'); + + if (!kabupatenId) { + return; + } + + $.get(kecamatanUrlTemplate.replace(':id', kabupatenId), function (data) { + fillSelect($kecamatanFilter, data, '', 'Semua Kecamatan'); + }); + }); + + $kecamatanFilter.on('change', function () { + const kecamatanId = $(this).val(); + + resetSelect($desaFilter, 'Semua Desa'); + + if (!kecamatanId) { + return; + } + + $.get(desaUrlTemplate.replace(':id', kecamatanId), function (data) { + fillSelect($desaFilter, data, '', 'Semua Desa'); + }); + }); + $(document).on('click', '.delete-record', function () { const id = $(this).data('id'); const name = $(this).data('nama');