Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion catatan_rilis.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ Di rilis ini, versi 2601.0.0 berisi penambahan dan perbaikan yang diminta penggu
#### Perubahan Teknis

1. [#892](https://github.com/OpenSID/OpenKab/issues/892) Perbaikan tag style agar tidak dianggap error ketika csp aktif.
2. [#886](https://github.com/OpenSID/OpenKab/issues/886) Ubah label cetak menjadi excel pada laporan bulanan.
2. [#886](https://github.com/OpenSID/OpenKab/issues/886) Ubah label cetak menjadi excel pada laporan bulanan.
3. [#903](https://github.com/OpenSID/OpenKab/issues/903) Ubah fungsi cetak ke expor excel pada halaman rincian kependudukan bulanan.
102 changes: 51 additions & 51 deletions resources/views/laporan-bulanan/detail/index.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
@section('title', $page_title ?? 'Page Title')

@section('content_header')
<h1>{{ $page_description ?? '' }}</h1>
<h1>{{ $page_description ?? '' }}</h1>
@stop

@section('content')
Expand All @@ -15,9 +15,9 @@
<div class="row">
<div class="col-sm-12">
<a href="{{ route('laporan-bulanan.export-excel-detail', ['rincian' => $rincian, 'tipe' => $tipe]) }}"
class="btn btn-primary btn-sm">
<i class="fa fa-print"></i>
Cetak
class="btn btn-success btn-sm">
<i class="fa fa-file-excel"></i>
Export Excel
</a>
<a href="{{ route('laporan-bulanan.index') }}" class="btn btn-sm btn-secondary">
<i class="fas fa-arrow-left"></i>
Expand Down Expand Up @@ -58,7 +58,7 @@ class="btn btn-primary btn-sm">
const header = @include('layouts.components.header_bearer_api_gabungan');
var url = new URL("{{ config('app.databaseGabunganUrl') . '/api/v1/statistik/laporan-bulanan/sumber-data' }}");

document.addEventListener("DOMContentLoaded", function(event) {
document.addEventListener("DOMContentLoaded", function (event) {
let nama_desa = `{{ session('desa.nama_desa') }}`;
var penduduk = $('#detail_penduduk').DataTable({
processing: true,
Expand All @@ -74,13 +74,13 @@ class="btn btn-primary btn-sm">
url: url.href,
method: 'get',
headers: header,
data: function(row) {
data: function (row) {
return {
"page[size]": row.length,
"page[number]": (row.start / row.length) + 1,
"filter[search]": row.search.value,
"sort": (row.order[0]?.dir === "asc" ? "" : "-") + row.columns[row.order[0]
?.column]
?.column]
?.name,
'filter[rincian]': '{{ $rincian }}',
'filter[tipe]': '{{ $tipe }}',
Expand All @@ -94,71 +94,71 @@ class="btn btn-primary btn-sm">
'kode_desa': '{{ $kode_desa }}',
};
},
dataSrc: function(json) {
dataSrc: function (json) {
json.recordsTotal = json.meta.pagination.total
json.recordsFiltered = json.meta.pagination.total

return json.data
},
},
columnDefs: [{
targets: '_all',
className: 'text-nowrap',
},
{
targets: [0, 1, 4, 5, 6],
orderable: false,
searchable: false,
},
targets: '_all',
className: 'text-nowrap',
},
{
targets: [0, 1, 4, 5, 6],
orderable: false,
searchable: false,
},
],
columns: [{
data: null,
},
{
data: "attributes.nama",
name: "nama",
defaultContent: '-',
},
{
data: "attributes.nik",
name: "nik",
defaultContent: '-',
},
{
data: "attributes.tempatlahir",
searcable: false,
className: 'text-center',
defaultContent: '-',
},
{
data: function(data) {
return data.attributes.tanggallahir ?? '';
},
},
{
data: "attributes.nama_ayah",
name: "nama_ayah",
defaultContent: '-',
},
{
data: "attributes.nama_ibu",
name: "nama_ibu",
defaultContent: '-',
data: null,
},
{
data: "attributes.nama",
name: "nama",
defaultContent: '-',
},
{
data: "attributes.nik",
name: "nik",
defaultContent: '-',
},
{
data: "attributes.tempatlahir",
searcable: false,
className: 'text-center',
defaultContent: '-',
},
{
data: function (data) {
return data.attributes.tanggallahir ?? '';
},
},
{
data: "attributes.nama_ayah",
name: "nama_ayah",
defaultContent: '-',
},
{
data: "attributes.nama_ibu",
name: "nama_ibu",
defaultContent: '-',
},
],
order: [
[2, 'asc']
]
})

penduduk.on('draw.dt', function() {
penduduk.on('draw.dt', function () {
var PageInfo = $('#detail_penduduk').DataTable().page.info();
penduduk.column(0, {
page: 'current'
}).nodes().each(function(cell, i) {
}).nodes().each(function (cell, i) {
cell.innerHTML = i + 1 + PageInfo.start;
});
});
});
</script>
@endsection
@endsection
58 changes: 58 additions & 0 deletions tests/Feature/LaporanBulananDetailExportTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
<?php

namespace Tests\Feature;

use Tests\BaseTestCase;

class LaporanBulananDetailExportTest extends BaseTestCase
{
/** @test */
public function test_detail_page_has_export_excel_button()
{
// Set up session data yang diperlukan
session([
'bulanku' => 1,
'tahunku' => 2026,
'kode_kabupaten' => '35',
]);

$response = $this->get(route('laporan-bulanan.detail-penduduk', [
'rincian' => 'awal',
'tipe' => 'wni_l',
]));

$response->assertStatus(200);
$content = $response->getContent();

// Verifikasi tombol Export Excel ada dengan icon dan class yang benar
$this->assertStringContainsString('fa-file-excel', $content, 'Icon Excel tidak ditemukan');
$this->assertStringContainsString('Export Excel', $content, 'Label Export Excel tidak ditemukan');
$this->assertStringContainsString('btn-success', $content, 'Class btn-success tidak ditemukan');

// Verifikasi tombol lama (Cetak) sudah tidak ada
$this->assertStringNotContainsString('fa-print', $content, 'Icon print seharusnya sudah dihapus');
$this->assertStringNotContainsString('>Cetak<', $content, 'Label Cetak seharusnya sudah dihapus');
}

/** @test */
public function test_detail_page_export_excel_button_has_correct_route()
{
session([
'bulanku' => 1,
'tahunku' => 2026,
'kode_kabupaten' => '35',
]);

$response = $this->get(route('laporan-bulanan.detail-penduduk', [
'rincian' => 'lahir',
'tipe' => 'wni_p',
]));

$response->assertStatus(200);
$content = $response->getContent();

// Verifikasi URL export ada dengan parameter yang benar
$expectedRoutePattern = 'laporan-bulanan/export-excel-detail/lahir/wni_p';
$this->assertStringContainsString($expectedRoutePattern, $content, 'Route export excel detail tidak ditemukan');
}
}