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 00000000..c0d33dc7 --- /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 cab69a9f..2dc5bf78 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 00000000..2f3984d4 --- /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 aa1a1fc5..709a04a2 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 78f7f0bd..8f39592e 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 c0d33dc7..13113439 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 2f3984d4..08efef40 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 709a04a2..5bb8db5c 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 3ada7ae9..e1996946 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 00000000..4a7ff597 --- /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 13113439..3f4450e4 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 8f39592e..f7402e58 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 5bb8db5c..50c1d0df 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(); });