style: add page laporan rincian taget rumah memilah

main-dlh
Yuri Dimas 2025-11-18 15:37:33 +07:00
parent 7dfd021333
commit 92f6f5890f
No known key found for this signature in database
GPG Key ID: 9FD7E44BC294C68C
3 changed files with 223 additions and 0 deletions

View File

@ -0,0 +1,95 @@
using Microsoft.AspNetCore.Mvc;
using System.Linq;
namespace BpsRwApp.Controllers
{
public class RincianTargetRumahMemilahController : AppControllerBase
{
public IActionResult Index()
{
return View();
}
[HttpGet]
public IActionResult Table()
{
var wilayahData = new[]
{
new WilayahRow(
No: 1,
Wilayah: "Jakarta Pusat",
TotalJumlahPjlp: 1323,
TotalTargetBulan: 1323,
TotalTargetDelapanBulan: 1323,
Targets: new[]
{
new TargetRow("Cempaka Putih", 40, 40, 40),
new TargetRow("Gambir", 48, 48, 48),
new TargetRow("Johar Baru", 84, 84, 84),
new TargetRow("Kemayoran", 78, 78, 78),
new TargetRow("Menteng", 64, 64, 64),
new TargetRow("Sawah Besar", 84, 84, 84),
new TargetRow("Senen", 11, 11, 11),
new TargetRow("Tanah Abang", 71, 71, 71),
}),
new WilayahRow(
No: 2,
Wilayah: "Jakarta Timur",
TotalJumlahPjlp: 1323,
TotalTargetBulan: 1323,
TotalTargetDelapanBulan: 1323,
Targets: new[]
{
new TargetRow("Cakung", 48, 48, 48),
new TargetRow("Cipayung", 78, 84, 84),
new TargetRow("Ciracas", 48, 78, 78),
new TargetRow("Duren Sawit", 84, 64, 64),
new TargetRow("Jatinegara", 71, 84, 84),
new TargetRow("Kramat Jati", 78, 11, 11),
new TargetRow("Matraman", 84, 71, 71),
new TargetRow("Makasar", 1323, 40, 40),
}),
new WilayahRow(
No: 3,
Wilayah: "Jakarta Barat",
TotalJumlahPjlp: 1323,
TotalTargetBulan: 1323,
TotalTargetDelapanBulan: 1323,
Targets: new[]
{
new TargetRow("Grogol Petamburan", 40, 40, 40),
new TargetRow("Taman Sari", 48, 48, 48),
new TargetRow("Palmerah", 84, 84, 84),
new TargetRow("Kebon Jeruk", 78, 78, 78),
new TargetRow("Cengkareng", 64, 64, 64),
new TargetRow("Kembangan", 84, 84, 84),
new TargetRow("Kalideres", 11, 11, 11),
new TargetRow("Tambora", 71, 71, 71),
}),
};
var data = wilayahData
.SelectMany(region => region.Targets.Select((target, index) => new
{
no = region.No,
row_number = $"{region.No}.{index + 1}",
wilayah = region.Wilayah,
kelurahan = target.Kelurahan,
jumlah_pjlp = target.JumlahPjlp,
target_bulan = target.TargetBulan,
target_8_bulan = target.TargetDelapanBulan,
total_jumlah_pjlp = region.TotalJumlahPjlp,
total_target_bulan = region.TotalTargetBulan,
total_target_8_bulan = region.TotalTargetDelapanBulan
}))
.ToArray();
return Json(new { data });
}
private sealed record WilayahRow(int No, string Wilayah, int TotalJumlahPjlp, int TotalTargetBulan, int TotalTargetDelapanBulan, TargetRow[] Targets);
private sealed record TargetRow(string Kelurahan, int JumlahPjlp, int TargetBulan, int TargetDelapanBulan);
}
}

View File

@ -0,0 +1,115 @@
@{
ViewData["Title"] = "Rincian Target Rumah Memilah";
}
<div class="breadcrumbs text-sm">
<ul>
<li class="text-gray-500"><a>Laporan</a></li>
<li>Rincian Target Rumah Memilah</li>
</ul>
</div>
<!-- Header -->
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
<div class="prose">
<h3 class="mb-2">Rincian Target Rumah Memilah</h3>
</div>
<div class="justify-self-end lg:self-center">
<a class="btn btn-primary text-white rounded-full" href="#">
<span class="icon icon-fill me-2">download</span>
Download
</a>
<button class="btn bg-white rounded-full" type="button">
<span class="icon icon-fill me-2">filter_list</span>
Filter
</button>
</div>
</div>
<div class="h-8"></div>
<div class="card bg-white shadow-sm">
<div class="card-body p-0">
<table class="table-zebra table" id="target-table">
<thead>
<tr>
<th class="w-[5%]">No</th>
<th class="w-[35%]">Wilayah</th>
<th class="w-[20%]">Jumlah PJLP Pendamping BPS RW</th>
<th class="w-[20%]">Target Rumah Memilah per Bulan</th>
<th class="w-[20%]">Target Rumah Memilah 8 Bulan</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<link rel="stylesheet" href="https://cdn.datatables.net/rowgroup/1.5.0/css/rowGroup.dataTables.min.css" />
<script src="https://code.jquery.com/jquery-3.7.1.js"></script>
<script src="https://cdn.datatables.net/2.3.4/js/dataTables.js"></script>
<script src="https://cdn.datatables.net/rowgroup/1.5.0/js/dataTables.rowGroup.min.js"></script>
<script src="/plugins/datatables/dataTables.tailwindcss.js"></script>
<script type="text/javascript">
function formatNumber(value) {
const number = Number(value ?? 0);
return number.toLocaleString('id-ID');
}
$(document).ready(function () {
new DataTable('#target-table', {
ajax: '@Url.Action("Table", "RincianTargetRumahMemilah")',
scrollX: true,
autoWidth: false,
rowGroup: {
dataSrc: 'wilayah',
startRender: function (rows, group) {
const firstRow = rows.data()[0];
const row = $('<tr/>').addClass('bg-gray-50 font-semibold text-gray-800');
row.append(`<td class="align-middle">${firstRow.no}</td>`);
row.append(`<td class="align-middle">${group}</td>`);
row.append(`<td class="align-middle">${formatNumber(firstRow.total_jumlah_pjlp)}</td>`);
row.append(`<td class="align-middle">${formatNumber(firstRow.total_target_bulan)}</td>`);
row.append(`<td class="align-middle">${formatNumber(firstRow.total_target_8_bulan)}</td>`);
return row;
}
},
columns: [
{
data: 'row_number',
orderable: false,
searchable: false,
render: function (data) {
return data || '';
}
},
{ data: 'kelurahan', defaultContent: '-' },
{
data: 'jumlah_pjlp',
render: function (data) {
return formatNumber(data);
}
},
{
data: 'target_bulan',
render: function (data) {
return formatNumber(data);
}
},
{
data: 'target_8_bulan',
render: function (data) {
return formatNumber(data);
}
}
],
order: [[0, 'asc']],
columnDefs: [
{ targets: '_all', className: 'align-middle' }
]
});
});
</script>

View File

@ -176,5 +176,18 @@
</ul>
</details>
</li>
<li>
<details @(controller == "RincianTargetRumahMemilah" ? "open" : "")>
<summary>LAPORAN</summary>
<ul>
<li>
<a asp-controller="RincianTargetRumahMemilah" asp-action="Index" class="@(controller == "RincianTargetRumahMemilah" ? "menu-active" : "")">
<span class="icon icon-fill">flag</span>
Rincian Target Rumah Memilah
</a>
</li>
</ul>
</details>
</li>
</ul>
</aside>