style: add page laporan rincian taget rumah memilah
parent
7dfd021333
commit
92f6f5890f
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue