From dd6d61a4487e67bebb82cf02f8cbad83d19e1e50 Mon Sep 17 00:00:00 2001 From: Ahmad Afandi Date: Sat, 25 Apr 2026 07:10:31 +0700 Subject: [PATCH 1/5] simpan dulu --- .../DataPresisiPapanController.php | 23 + .../Controllers/StatistikPapanController.php | 2 +- .../data_presisi/papan/detail_data.blade.php | 218 +++++ .../views/presisi/statistik/papan.blade.php | 753 +++++++++--------- routes/web.php | 5 + 5 files changed, 622 insertions(+), 379 deletions(-) create mode 100644 app/Http/Controllers/DataPresisiPapanController.php create mode 100644 resources/views/data_pokok/data_presisi/papan/detail_data.blade.php diff --git a/app/Http/Controllers/DataPresisiPapanController.php b/app/Http/Controllers/DataPresisiPapanController.php new file mode 100644 index 000000000..c0d33dc74 --- /dev/null +++ b/app/Http/Controllers/DataPresisiPapanController.php @@ -0,0 +1,23 @@ +input('judul'); + $title = htmlspecialchars(strip_tags($title), ENT_QUOTES, 'UTF-8'); + $filter = $request->input('filter'); + + if (isset($filter['tipe'], $filter['nilai']) && $filter['tipe'] && $filter['nilai']) { + $colomn = $filter['tipe'].':'.$filter['nilai']; + } + + return view('data_pokok.data_presisi.papan.detail_data', compact('title', 'colomn')); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/StatistikPapanController.php b/app/Http/Controllers/StatistikPapanController.php index cab69a9f3..2dc5bf786 100644 --- a/app/Http/Controllers/StatistikPapanController.php +++ b/app/Http/Controllers/StatistikPapanController.php @@ -7,7 +7,7 @@ class StatistikPapanController extends Controller public function index() { return view('presisi.statistik.papan', [ - 'detailLink' => url(''), + 'detailLink' => url('data-presisi/papan/detail_data'), 'judul' => 'Papan' ]); } diff --git a/resources/views/data_pokok/data_presisi/papan/detail_data.blade.php b/resources/views/data_pokok/data_presisi/papan/detail_data.blade.php new file mode 100644 index 000000000..2f3984d4a --- /dev/null +++ b/resources/views/data_pokok/data_presisi/papan/detail_data.blade.php @@ -0,0 +1,218 @@ +@extends('layouts.index') + +@section('title', $title) + +@section('content_header') +

{{ $title }}

+@stop + +@section('content') +@include('partials.breadcrumbs') + +
+
+
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NONIKNOMOR KKNAMAJENIS LAHANLUAS LAHANLUAS TANAMSTATUS LAHANKOMODITI UTAMA TANAMAN PANGANKOMODITI TANAMAN PANGAN LAINNYAJUMLAH BERDASARKAN JENIS KOMODITIUSIA KOMODITIJENIS PETERNAKANJUMLAH POPULASIJENIS PERIKANANFREKWENSI MAKANAN PERHARIFREKWENSI KONSUMSI SAYUR PERHARIFREKWENSI KONSUMSI BUAH PERHARIFREKWENSI KONSUMSI DAGING PERHARILONGITUDELATITUDETANGGAL PENGISIANSTATUS PENGISIAN
+
+
+
+
+
+@endsection + +@section('js') + +@endsection \ No newline at end of file diff --git a/resources/views/presisi/statistik/papan.blade.php b/resources/views/presisi/statistik/papan.blade.php index aa1a1fc5f..709a04a26 100644 --- a/resources/views/presisi/statistik/papan.blade.php +++ b/resources/views/presisi/statistik/papan.blade.php @@ -9,364 +9,364 @@ @stop @section('content') - @include('partials.breadcrumbs') -
-
-
-
-

Statistik {{ $judul }}

-
- -
-
-
- +@include('partials.breadcrumbs') +
+
+
+
+

Statistik {{ $judul }}

+
+
+
+ +
-
-
-
-
-

+
+
+
+
+
+

+
+
+ +
+
-
- -
- -
-
- -
-
- -
+
+ +
+
+
-
-
-
-
-
- -
-
+
+
+
+
+
+
+
+
+
-
-
- -
-
+
+
+
+
+
-
- - - - - - - - - -
NoNilaiJumlah
-
+
+ + + + + + + + + +
NoNilaiJumlah
+
@endsection @section('js') - - @include('statistik.chart') - +@include('statistik.chart') + + }); + @endsection @push('css') - + @endpush \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 78f7f0bda..8f39592e5 100644 --- a/routes/web.php +++ b/routes/web.php @@ -326,6 +326,11 @@ Route::get('cetak', [App\Http\Controllers\DataPresisiPanganController::class, 'cetak'])->name('data-pokok.data-presisi-pangan.cetak'); }) ->middleware(['permission:datapresisi-pangan-read']); + + Route::prefix('papan')->group(function () { + Route::get('detail_data', [App\Http\Controllers\DataPresisiPapanController::class, 'detailData'])->name('data-pokok.data-presisi-papan.detail_data'); + }) + ->middleware(['permission:datapresisi-pangan-read']); Route::prefix('adat')->group(function () { Route::get('/', [App\Http\Controllers\DataPresisiAdatController::class, 'index'])->name('data-pokok.data-presisi-adat.index'); From 25eb62659b105c95fae7e8cb70d306bf8169dd0c Mon Sep 17 00:00:00 2001 From: Ahmad Afandi Date: Mon, 27 Apr 2026 09:24:10 +0700 Subject: [PATCH 2/5] feat: detail presisi papan --- .../DataPresisiPapanController.php | 2 +- .../data_presisi/papan/detail_data.blade.php | 120 +++++++----------- .../views/presisi/statistik/papan.blade.php | 21 +-- 3 files changed, 55 insertions(+), 88 deletions(-) diff --git a/app/Http/Controllers/DataPresisiPapanController.php b/app/Http/Controllers/DataPresisiPapanController.php index c0d33dc74..131134392 100644 --- a/app/Http/Controllers/DataPresisiPapanController.php +++ b/app/Http/Controllers/DataPresisiPapanController.php @@ -10,7 +10,7 @@ class DataPresisiPapanController extends Controller public function detailData(Request $request): View { $colomn = ''; - $title = 'Data Presisi Papan '.$request->input('judul'); + $title = 'Data Presisi Papan - '.$request->input('judul'); $title = htmlspecialchars(strip_tags($title), ENT_QUOTES, 'UTF-8'); $filter = $request->input('filter'); diff --git a/resources/views/data_pokok/data_presisi/papan/detail_data.blade.php b/resources/views/data_pokok/data_presisi/papan/detail_data.blade.php index 2f3984d4a..08efef403 100644 --- a/resources/views/data_pokok/data_presisi/papan/detail_data.blade.php +++ b/resources/views/data_pokok/data_presisi/papan/detail_data.blade.php @@ -3,7 +3,7 @@ @section('title', $title) @section('content_header') -

{{ $title }}

+

{{ html_entity_decode($title) }}

@stop @section('content') @@ -14,7 +14,7 @@
- +
@@ -26,23 +26,15 @@ NIK NOMOR KK NAMA - JENIS LAHAN - LUAS LAHAN - LUAS TANAM - STATUS LAHAN - KOMODITI UTAMA TANAMAN PANGAN - KOMODITI TANAMAN PANGAN LAINNYA - JUMLAH BERDASARKAN JENIS KOMODITI - USIA KOMODITI - JENIS PETERNAKAN - JUMLAH POPULASI - JENIS PERIKANAN - FREKWENSI MAKANAN PERHARI - FREKWENSI KONSUMSI SAYUR PERHARI - FREKWENSI KONSUMSI BUAH PERHARI - FREKWENSI KONSUMSI DAGING PERHARI - LONGITUDE - LATITUDE + STATUS KEPEMILIKAN + LUAS LANTAI (M²) + JENIS LANTAI + JENIS DINDING + SUMBER AIR MINUM + SUMBER PENERANGAN + DAYA TERPASANG + DAYA TERPASANG 2 + DAYA TERPASANG 3 TANGGAL PENGISIAN STATUS PENGISIAN @@ -79,11 +71,11 @@ "page[size]": row.length, "page[number]": (row.start / row.length) + 1, "filter[search]": row.search.value, - "filter[tahun]": $('#filter-tahun').val(), + "filter[tahun]": $('#filter-tahun').val(), "filter[colomn]": '{{ $colomn }}', "sort": (row.order[0]?.dir === "asc" ? "" : "-") + row.columns[row.order[0]?.column]?.name, }; - + return data; }, dataSrc: function(json) { @@ -120,73 +112,50 @@ className: 'text-nowrap', orderable: false, }, { - data: 'attributes.jenis_lahan', - orderable: false - }, - { - data: 'attributes.luas_lahan', - orderable: false - }, - { - data: 'attributes.luas_tanam', - orderable: false - }, - { - data: 'attributes.status_lahan', - orderable: false - }, - { - data: 'attributes.komoditi_utama_tanaman_papan', - orderable: false - }, - { - data: 'attributes.komoditi_tanaman_papan_lainnya', - orderable: false - }, - { - data: 'attributes.jumlah_berdasarkan_jenis_komoditi', - orderable: false - }, - { - data: 'attributes.usia_komoditi', - orderable: false - }, - { - data: 'attributes.jenis_peternakan', - orderable: false + data: "attributes.kd_stat_bangunan_tinggal", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.jumlah_populasi', - orderable: false + data: "attributes.luas_lantai", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.jenis_perikanan', - orderable: false + data: "attributes.kd_jenis_lantai_terluas", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.frekwensi_makanan_perhari', - orderable: false + data: "attributes.kd_jenis_dinding", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.frekwensi_konsumsi_sayur_perhari', - orderable: false + data: "attributes.kd_sumber_air_minum", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.frekwensi_konsumsi_buah_perhari', - orderable: false + data: "attributes.kd_sumber_penerangan_utama", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.frekwensi_konsumsi_daging_perhari', - orderable: false + data: "attributes.kd_daya_terpasang", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.longitude', - orderable: false + data: "attributes.kd_daya_terpasang2", + defaultContent: 'N/A', + orderable: false, }, { - data: 'attributes.latitude', - orderable: false - }, + data: "attributes.kd_daya_terpasang3", + defaultContent: 'N/A', + orderable: false, + }, { data: 'attributes.tanggal_pengisian', orderable: false @@ -195,10 +164,7 @@ className: 'text-nowrap', data: 'attributes.status_pengisian', orderable: false }, - ], - order: [ - [10, 'asc'] - ] + ], }); papan.on('draw.dt', function() { var PageInfo = $('#detail-papan').DataTable().page.info(); @@ -211,7 +177,7 @@ className: 'text-nowrap', // Event listener for year filter change $('#filter-tahun').on('change', function() { - papan.ajax.reload(); + papan.ajax.reload(); }); }); diff --git a/resources/views/presisi/statistik/papan.blade.php b/resources/views/presisi/statistik/papan.blade.php index 709a04a26..5bb8db5c1 100644 --- a/resources/views/presisi/statistik/papan.blade.php +++ b/resources/views/presisi/statistik/papan.blade.php @@ -102,15 +102,15 @@ let kategori = `{{ strtolower($judul) }}`; let default_id = null; document.addEventListener("DOMContentLoaded", function(event) { - const headers = @include('layouts.components.header_bearer_api_gabungan'); - let tipeValue; + const header = @include('layouts.components.header_bearer_api_gabungan'); + let tipeValue, judulUtama; var baseUrl = {!!json_encode(config('app.databaseGabunganUrl')) !!} + "/api/v1"; var urlKategoriStatistik = new URL(`${baseUrl}/data-presisi/papan/kategori-statistik`); $.ajax({ url: urlKategoriStatistik.href, - headers: headers, + headers: header, method: 'get', success: function(response) { var daftarKategoriStatistik = response.data[0]['attributes'] @@ -302,17 +302,17 @@ function exportToExcel() { $('#daftar-statistik').on('click', '.pilih-kategori > a', function() { var id = $(this).data('id') tipeValue = id + judulUtama = $(this).text().trim() $('.pilih-kategori > a').removeClass('active') $(this).addClass('active') - $('#title-block').html($(this).text()) + $('#title-block').html($(this).text()) urlStatistik.searchParams.set('kategori', id); statistik.ajax.url(urlStatistik.href, { }).load(); }); - const urlDetailLink = `{{ $detailLink }}?kategori=${kategori}`; - const judulUtama = $('.pilih-kategori > a.active').text().trim(); + const urlDetailLink = `{{ $detailLink }}?kategori=${kategori}`; var urlStatistik = new URL(`${baseUrl}/data-presisi/papan/statistik`); urlStatistik.searchParams.set('kategori', default_id); urlStatistik.searchParams.set("kode_kabupaten", "{{ session('kabupaten.kode_kabupaten') ?? '' }}"); @@ -335,7 +335,7 @@ function exportToExcel() { info: false, ajax: { url: urlStatistik.href, - headers: headers, + headers: header, method: 'get', data: function(row) { return { @@ -384,12 +384,12 @@ className: 'dt-body-right', }, { data: function(data) { const nilai = data.attributes?.nilai || data.id || ''; - + const nilaiDb = data.attributes?.nilai_db || ''; if (nilai !== 'JUMLAH' && nilai !== 'BELUM MENGISI' && nilai !== 'TOTAL') { let judul = judulUtama + ' : ' + nilai; let urlDetail = new URL(urlDetailLink); urlDetail.searchParams.set('judul', judul); - urlDetail.searchParams.set('filter[nilai]', data.id); + urlDetail.searchParams.set('filter[nilai]', nilaiDb); urlDetail.searchParams.set('filter[tipe]', tipeValue); urlDetail.searchParams.set('tahun', $('#filter-tahun').val()); urlDetail.searchParams.set('chart-view', true); @@ -403,12 +403,13 @@ className: 'dt-body-right', }, { data: function(data) { const nilai = data.attributes?.nilai || data.id || ''; + const nilaiDb = data.attributes?.nilai_db || ''; const jumlah = data.attributes?.jumlah || 0; let judul = judulUtama + ' : ' + nilai; let urlDetail = new URL(urlDetailLink); urlDetail.searchParams.set('judul', judul); - urlDetail.searchParams.set('filter[nilai]', nilai); + urlDetail.searchParams.set('filter[nilai]', nilaiDb); urlDetail.searchParams.set('filter[tipe]', tipeValue); return `${jumlah}` From cefa42490b61f63d2701513d076b88cfa733dde7 Mon Sep 17 00:00:00 2001 From: Ahmad Afandi Date: Mon, 27 Apr 2026 10:13:16 +0700 Subject: [PATCH 3/5] tambahkan test --- .gitignore | 3 +- .../DataPresisiPapanControllerTest.php | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/DataPresisiPapanControllerTest.php diff --git a/.gitignore b/.gitignore index 3ada7ae9c..e1996946d 100644 --- a/.gitignore +++ b/.gitignore @@ -25,4 +25,5 @@ package-lock.json /test-results/ /playwright-report/ .env.e2e -/template_ai/ \ No newline at end of file +/template_ai/ +AGENTS.md \ No newline at end of file diff --git a/tests/Feature/DataPresisiPapanControllerTest.php b/tests/Feature/DataPresisiPapanControllerTest.php new file mode 100644 index 000000000..4a7ff5976 --- /dev/null +++ b/tests/Feature/DataPresisiPapanControllerTest.php @@ -0,0 +1,40 @@ +actingAsAdmin($user) + ->get(route('data-pokok.data-presisi-papan.detail_data', [ + 'judul' => 'Test Judul', + 'filter' => [ + 'tipe' => 'test_tipe', + 'nilai' => 'test_nilai' + ] + ])); + + $response->assertStatus(200); + $response->assertViewIs('data_pokok.data_presisi.papan.detail_data'); + } + + public function test_detail_data_returns_success_without_filter() + { + $user = User::first(); + $response = $this->actingAsAdmin($user) + ->get(route('data-pokok.data-presisi-papan.detail_data', [ + 'judul' => 'Test Judul Tanpa Filter' + ])); + + $response->assertStatus(200); + $response->assertViewIs('data_pokok.data_presisi.papan.detail_data'); + } +} \ No newline at end of file From eed159851bf3e07550cf2a0e1f562400d7722cd1 Mon Sep 17 00:00:00 2001 From: Ahmad Afandi Date: Mon, 27 Apr 2026 11:29:35 +0700 Subject: [PATCH 4/5] perbaikan mengikuti rekomendasi AI review --- .../Controllers/DataPresisiPapanController.php | 14 ++++++++++---- routes/web.php | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/DataPresisiPapanController.php b/app/Http/Controllers/DataPresisiPapanController.php index 131134392..3f4450e45 100644 --- a/app/Http/Controllers/DataPresisiPapanController.php +++ b/app/Http/Controllers/DataPresisiPapanController.php @@ -6,18 +6,24 @@ use Illuminate\View\View; class DataPresisiPapanController extends Controller -{ +{ + /** + * Display detail data presisi papan dengan filter opsional. + * + * @param Request $request HTTP request instance + * @return View View detail data dengan DataTables + */ public function detailData(Request $request): View { $colomn = ''; - $title = 'Data Presisi Papan - '.$request->input('judul'); + $title = 'Data Presisi Papan - ' . $request->input('judul'); $title = htmlspecialchars(strip_tags($title), ENT_QUOTES, 'UTF-8'); $filter = $request->input('filter'); if (isset($filter['tipe'], $filter['nilai']) && $filter['tipe'] && $filter['nilai']) { - $colomn = $filter['tipe'].':'.$filter['nilai']; + $colomn = $filter['tipe'] . ':' . $filter['nilai']; } return view('data_pokok.data_presisi.papan.detail_data', compact('title', 'colomn')); } -} \ No newline at end of file +} diff --git a/routes/web.php b/routes/web.php index 8f39592e5..f7402e58f 100644 --- a/routes/web.php +++ b/routes/web.php @@ -330,7 +330,7 @@ Route::prefix('papan')->group(function () { Route::get('detail_data', [App\Http\Controllers\DataPresisiPapanController::class, 'detailData'])->name('data-pokok.data-presisi-papan.detail_data'); }) - ->middleware(['permission:datapresisi-pangan-read']); + ->middleware(['permission:datapresisi-papan-read']); Route::prefix('adat')->group(function () { Route::get('/', [App\Http\Controllers\DataPresisiAdatController::class, 'index'])->name('data-pokok.data-presisi-adat.index'); From 14b5d1e1ce0241964e30105f398d6bd3b3d890ea Mon Sep 17 00:00:00 2001 From: Ahmad Afandi Date: Tue, 5 May 2026 05:55:22 +0700 Subject: [PATCH 5/5] perbaikan filter tahun --- resources/views/presisi/statistik/papan.blade.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/views/presisi/statistik/papan.blade.php b/resources/views/presisi/statistik/papan.blade.php index 5bb8db5c1..50c1d0df4 100644 --- a/resources/views/presisi/statistik/papan.blade.php +++ b/resources/views/presisi/statistik/papan.blade.php @@ -107,7 +107,7 @@ var baseUrl = {!!json_encode(config('app.databaseGabunganUrl')) !!} + "/api/v1"; var urlKategoriStatistik = new URL(`${baseUrl}/data-presisi/papan/kategori-statistik`); - + const filterTahun = $('#filter-tahun'); $.ajax({ url: urlKategoriStatistik.href, headers: header, @@ -339,7 +339,7 @@ function exportToExcel() { method: 'get', data: function(row) { return { - "tahun": $('#filter-tahun').val(), + "tahun": filterTahun.val(), "sort": (row.order[0]?.dir === "asc" ? "" : "-") + row.columns[row .order[0] ?.column] @@ -391,7 +391,7 @@ className: 'dt-body-right', urlDetail.searchParams.set('judul', judul); urlDetail.searchParams.set('filter[nilai]', nilaiDb); urlDetail.searchParams.set('filter[tipe]', tipeValue); - urlDetail.searchParams.set('tahun', $('#filter-tahun').val()); + urlDetail.searchParams.set('tahun', filterTahun.val()); urlDetail.searchParams.set('chart-view', true); return `${nilai}` @@ -411,6 +411,7 @@ className: 'dt-body-right', urlDetail.searchParams.set('judul', judul); urlDetail.searchParams.set('filter[nilai]', nilaiDb); urlDetail.searchParams.set('filter[tipe]', tipeValue); + urlDetail.searchParams.set('tahun', filterTahun.val()); return `${jumlah}` }, @@ -436,7 +437,7 @@ className: 'dt-body-right', }); // Event listener for year filter change - $('#filter-tahun').on('change', function() { + filterTahun.on('change', function() { statistik.ajax.reload(); });