diff --git a/app/Enums/Modul.php b/app/Enums/Modul.php
index 9d99702d..f9e2d819 100644
--- a/app/Enums/Modul.php
+++ b/app/Enums/Modul.php
@@ -123,6 +123,18 @@ final class Modul extends Enum
'url' => 'data-presisi/statistik/sandang',
'permission' => 'statistik-datapresisi-sandang',
],
+ [
+ 'icon' => 'far fa-fw fa-circle',
+ 'text' => 'Papan',
+ 'url' => 'data-presisi/statistik/papan',
+ 'permission' => 'statistik-datapresisi-papan',
+ ],
+ [
+ 'icon' => 'far fa-fw fa-circle',
+ 'text' => 'Seni Budaya',
+ 'url' => 'data-presisi/statistik/senibudaya',
+ 'permission' => 'statistik-datapresisi-senibudaya',
+ ],
[
'icon' => 'far fa-fw fa-circle',
'text' => 'Pendidikan',
diff --git a/app/Http/Controllers/StatistikPapanController.php b/app/Http/Controllers/StatistikPapanController.php
new file mode 100644
index 00000000..cab69a9f
--- /dev/null
+++ b/app/Http/Controllers/StatistikPapanController.php
@@ -0,0 +1,14 @@
+ url(''),
+ 'judul' => 'Papan'
+ ]);
+ }
+}
diff --git a/app/Http/Controllers/StatistikSenibudayaController.php b/app/Http/Controllers/StatistikSenibudayaController.php
new file mode 100644
index 00000000..1235024d
--- /dev/null
+++ b/app/Http/Controllers/StatistikSenibudayaController.php
@@ -0,0 +1,14 @@
+ url(''),
+ 'judul' => 'seni budaya'
+ ]);
+ }
+}
diff --git a/database/migrations/2025_11_25_160801_update_menu_admin.php b/database/migrations/2025_11_25_160801_update_menu_admin.php
new file mode 100644
index 00000000..389df806
--- /dev/null
+++ b/database/migrations/2025_11_25_160801_update_menu_admin.php
@@ -0,0 +1,27 @@
+Data Statistik {{ $judul }}
+@stop
+
+@section('content')
+ @include('partials.breadcrumbs')
+
+
+
+
+
+
+
+
+
+
+
+
+ | No |
+ Nilai |
+ Jumlah |
+
+
+
+
+
+
+
+
+
+@endsection
+
+@section('js')
+
+ @include('statistik.chart')
+
+@endsection
+@push('css')
+
+@endpush
diff --git a/resources/views/presisi/statistik/senibudaya.blade.php b/resources/views/presisi/statistik/senibudaya.blade.php
new file mode 100644
index 00000000..50e0e0f5
--- /dev/null
+++ b/resources/views/presisi/statistik/senibudaya.blade.php
@@ -0,0 +1,464 @@
+@extends('layouts.index')
+
+@section('plugins.chart', true)
+
+@section('title', 'Data Statistik')
+
+@section('content_header')
+ Data Statistik Seni Budaya
+@stop
+
+@section('content')
+ @include('partials.breadcrumbs')
+
+
+
+
+
+
+
+
+
+
+
+
+ | No |
+ Nilai |
+ Jumlah |
+
+
+
+
+
+
+
+
+
+@endsection
+
+@section('js')
+
+ @include('statistik.chart')
+
+@endsection
+@push('css')
+
+@endpush
diff --git a/routes/web.php b/routes/web.php
index eb4b9556..88d0e2a8 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -324,6 +324,8 @@
Route::get('kesehatan', [App\Http\Controllers\StatistikKesehatanController::class, 'index']);
Route::get('pendidikan', [App\Http\Controllers\StatistikPendidikanController::class, 'index']);
Route::get('sandang', [App\Http\Controllers\StatistikSandangController::class, 'index']);
+ Route::get('papan', [App\Http\Controllers\StatistikPapanController::class, 'index']);
+ Route::get('senibudaya', [App\Http\Controllers\StatistikSenibudayaController::class, 'index']);
Route::get('pangan', [App\Http\Controllers\StatistikPanganController::class, 'index']);
});
});
diff --git a/tests/Feature/DataPresisiLaporanTest.php b/tests/Feature/DataPresisiLaporanTest.php
index ca59b343..33d4fe4e 100644
--- a/tests/Feature/DataPresisiLaporanTest.php
+++ b/tests/Feature/DataPresisiLaporanTest.php
@@ -13,7 +13,7 @@ public function test_can_access_laporan_semua_desa_page()
$response->assertStatus(200);
$response->assertViewIs('data_pokok.data_presisi.laporan.index');
- $response->assertViewHas('title', 'Data Presisi Laporan Semua Desa');
+ $response->assertViewHas('title', 'Data Presisi Pengisian Laporan Semua Desa');
}
/** @test */
@@ -55,7 +55,8 @@ public function test_laporan_semua_desa_has_correct_table_columns()
'Jaminan Sosial',
'Adat',
'Ketenagakerjaan',
- 'Jumlah Penduduk'
+ 'Jumlah Penduduk',
+ 'Jumlah Rumah Tangga'
];
foreach ($expectedColumns as $column) {
@@ -98,20 +99,7 @@ public function test_can_access_laporan_perdesa_page()
$response->assertStatus(200);
$response->assertViewIs('data_pokok.data_presisi.laporan.perdesa');
- $response->assertViewHas('title', 'Data Presisi Laporan Per Desa');
- }
-
- /** @test */
- public function test_laporan_perdesa_has_required_filter_elements()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test all filter elements exist
- $this->assertStringContainsString('id="filter_kabupaten"', $content);
- $this->assertStringContainsString('id="filter_kecamatan"', $content);
- $this->assertStringContainsString('id="filter_desa"', $content);
+ $response->assertViewHas('title', 'Data Presisi Pengisian Laporan Per Desa');
}
/** @test */
@@ -136,71 +124,7 @@ public function test_laporan_perdesa_has_correct_table_columns()
}
/** @test */
- public function test_laporan_perdesa_has_select2_initialization()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test Select2 initialization for all filters
- $this->assertStringContainsString("$('#filter_kabupaten').select2(", $content);
- $this->assertStringContainsString("$('#filter_kecamatan').select2(", $content);
- $this->assertStringContainsString("$('#filter_desa').select2(", $content);
- }
-
- /** @test */
- public function test_laporan_perdesa_has_cascading_filter_logic()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test kabupaten change event
- $this->assertStringContainsString("$('#filter_kabupaten').on('change'", $content);
-
- // Test kecamatan change event
- $this->assertStringContainsString("$('#filter_kecamatan').on('change'", $content);
-
- // Test desa change event with reload
- $this->assertStringContainsString("$('#filter_desa').on('change'", $content);
- $this->assertStringContainsString('laporanTable.ajax.reload()', $content);
- }
-
- /** @test */
- public function test_laporan_perdesa_loads_kabupaten_from_api()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test API call to get kabupaten list
- $this->assertStringContainsString('/api/v1/statistik-web/get-list-kabupaten', $content);
- }
-
- /** @test */
- public function test_laporan_perdesa_loads_kecamatan_from_api()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test API call to get kecamatan list
- $this->assertStringContainsString('/api/v1/statistik-web/get-list-kecamatan', $content);
- }
-
- /** @test */
- public function test_laporan_perdesa_loads_desa_from_api()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test API call to get desa list
- $this->assertStringContainsString('/api/v1/statistik-web/get-list-desa', $content);
- }
-
- /** @test */
- public function test_laporan_perdesa_has_datatable_with_filters()
+ public function test_laporan_perdesa_has_datatable_configuration()
{
$response = $this->get(route('laporan.data-presisi.perdesa'));
@@ -212,52 +136,11 @@ public function test_laporan_perdesa_has_datatable_with_filters()
$this->assertStringContainsString('searching: false', $content);
// Test filter parameters in DataTable
- $this->assertStringContainsString('"filter[config_id]"', $content);
$this->assertStringContainsString('"kode_kabupaten"', $content);
$this->assertStringContainsString('"kode_kecamatan"', $content);
$this->assertStringContainsString('"config_desa"', $content);
}
- /** @test */
- public function test_laporan_perdesa_has_default_session_values()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test that session default values are being set (even if empty)
- // Check that variables exist in JavaScript code
- $this->assertStringContainsString('defaultKabupaten', $content);
- $this->assertStringContainsString('defaultKecamatan', $content);
- $this->assertStringContainsString('defaultDesa', $content);
- }
-
- /** @test */
- public function test_laporan_perdesa_has_prevent_reload_flag()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test preventReload flag to avoid cascading reloads
- $this->assertStringContainsString('preventReload', $content);
- $this->assertStringContainsString('preventReload = true', $content);
- $this->assertStringContainsString('preventReload = false', $content);
- $this->assertStringContainsString('if (!preventReload', $content);
- }
-
- /** @test */
- public function test_laporan_perdesa_disables_child_filters_initially()
- {
- $response = $this->get(route('laporan.data-presisi.perdesa'));
-
- $content = $response->getContent();
-
- // Test that child filters are disabled until parent is selected
- $this->assertStringContainsString("$('#filter_kecamatan').prop('disabled', true)", $content);
- $this->assertStringContainsString("$('#filter_desa').prop('disabled', true)", $content);
- }
-
/** @test */
public function test_laporan_perdesa_number_formatting_for_columns()
{
@@ -310,4 +193,26 @@ public function test_both_pages_extend_correct_layout()
$content2 = $response2->getContent();
$this->assertStringContainsString('class="main-footer"', $content2);
}
+
+ /** @test */
+ public function test_laporan_semua_desa_has_export_buttons()
+ {
+ $response = $this->get(route('laporan.data-presisi.index'));
+ $content = $response->getContent();
+
+ // Test export buttons exist
+ $this->assertStringContainsString('id="cetak"', $content);
+ $this->assertStringContainsString('id="export-excel"', $content);
+ }
+
+ /** @test */
+ public function test_laporan_perdesa_has_export_buttons()
+ {
+ $response = $this->get(route('laporan.data-presisi.perdesa'));
+ $content = $response->getContent();
+
+ // Test export buttons exist
+ $this->assertStringContainsString('id="cetak"', $content);
+ $this->assertStringContainsString('id="export-excel"', $content);
+ }
}