style: add tab kebutuhan sarpras

main-dlh
Yuri Dimas 2025-11-17 20:51:10 +07:00
parent 1fd7448921
commit a055978fe5
No known key found for this signature in database
GPG Key ID: 9FD7E44BC294C68C
4 changed files with 507 additions and 116 deletions

View File

@ -303,5 +303,126 @@ namespace BpsRwApp.Controllers
return Json(response);
}
[HttpGet]
public IActionResult TableKebutuhanSarpras()
{
var data = new[]
{
new {
rt = "001",
tanggal = "11/04/2023",
jumlah_unit = "507",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "002",
tanggal = "09/04/2023",
jumlah_unit = "501",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "003",
tanggal = "21/04/2023",
jumlah_unit = "504",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "004",
tanggal = "17/04/2023",
jumlah_unit = "502",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "005",
tanggal = "18/04/2023",
jumlah_unit = "508",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "006",
tanggal = "14/04/2023",
jumlah_unit = "505",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "007",
tanggal = "02/04/2023",
jumlah_unit = "506",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "008",
tanggal = "22/04/2023",
jumlah_unit = "506",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "009",
tanggal = "01/04/2023",
jumlah_unit = "503",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
new {
rt = "010",
tanggal = "28/04/2023",
jumlah_unit = "504",
aksi = "<div class=\"flex gap-2 \">" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Detail</a>" +
"<a class=\"btn btn-sm btn-outline rounded-full\">Edit</a>" +
"<a class=\"btn btn-sm btn-error btn-outline rounded-full\">Delete</a>" +
"</div>"
},
};
var response = new
{
data = data
};
return Json(response);
}
[HttpGet]
public IActionResult CreateKebutuhanSarpras()
{
return View();
}
}
}

View File

@ -0,0 +1,211 @@
@{
ViewData["Title"] = "Tambah Kebutuhan Sarpras";
}
<!-- Breadcrumb -->
<div class="breadcrumbs text-sm">
<ul>
<li class="text-gray-500"><a>Profil Kelurahan</a></li>
<li><a>Tambah Kebutuhan Sarpras</a></li>
</ul>
</div>
<!-- Header -->
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
<div class="prose">
<h3 class="mb-2">Tambah Kebutuhan Sarpras</h3>
</div>
<div class="justify-self-end lg:self-center flex flex-wrap gap-3">
<a href="@Url.Action("Index", "ProfilRw")" class="btn rounded-full shadow-none">
<span class="icon icon-fill me-2">arrow_back</span>
Kembali
</a>
</div>
</div>
<div class="h-8"></div>
<div class="card bg-white card-border">
<form action="" method="post">
<div class="card-body">
<div id="sarprasFormList" class="space-y-4">
<div class="sarpras-form-item">
<div class="card-title">Sarpras #<span class="sarpras-index">1</span></div>
<div class="grid grid-cols-1 md:grid-cols-3 md:gap-4">
<!-- Tanggal -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Tanggal</legend>
<input type="date" class="input w-full" />
</fieldset>
<!-- RW -->
<fieldset class="fieldset">
<legend class="fieldset-legend">RW</legend>
<select class="select w-full">
<option disabled selected>Pilih RW</option>
<option>01</option>
<option>02</option>
<option>03</option>
</select>
</fieldset>
<!-- Kelurahan -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Kelurahan</legend>
<select class="select w-full">
<option disabled selected>Pilih Kelurahan</option>
</select>
</fieldset>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 md:gap-4">
<!-- Kecamatan -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Kecamatan</legend>
<select class="select w-full">
<option disabled selected>Pilih Kecamatan</option>
</select>
</fieldset>
<!-- Kota/Kabupaten -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Kota/Kabupaten</legend>
<select class="select w-full">
<option disabled selected>Pilih Kota/Kabupaten</option>
</select>
</fieldset>
</div>
<div class="py-3 justify-end flex">
<button type="button" class="btn btn-error text-white rounded-full js-remove-sarpras">
<span class="icon me-2">delete</span>
Hapus
</button>
</div>
<div class="divider"></div>
</div>
</div>
<div class="py-3">
<button type="button" id="addSarprasBtn" class="btn w-full btn-primary btn-outline rounded-full">
<span class="icon me-2">add</span>
Tambah Kebutuhan Sarana Prasarana
</button>
</div>
<div class="card-actions justify-end">
<a href="@Url.Action("Index", "ProfilRw")" class="btn">
<span class="icon me-2">cancel</span>
Batal
</a>
<button type="submit" class="btn btn-primary">
<span class="icon me-2">save</span>
Simpan
</button>
</div>
</div>
</form>
</div>
<template id="sarprasTemplate">
<div class="sarpras-form-item">
<div class="card-title">Sarpras #<span class="sarpras-index"></span></div>
<div class="grid grid-cols-1 md:grid-cols-3 md:gap-4">
<!-- Tanggal -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Tanggal</legend>
<input type="date" class="input w-full" />
</fieldset>
<!-- RW -->
<fieldset class="fieldset">
<legend class="fieldset-legend">RW</legend>
<select class="select w-full">
<option disabled selected>Pilih RW</option>
<option>01</option>
<option>02</option>
<option>03</option>
</select>
</fieldset>
<!-- Kelurahan -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Kelurahan</legend>
<select class="select w-full">
<option disabled selected>Pilih Kelurahan</option>
</select>
</fieldset>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 md:gap-4">
<!-- Kecamatan -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Kecamatan</legend>
<select class="select w-full">
<option disabled selected>Pilih Kecamatan</option>
</select>
</fieldset>
<!-- Kota/Kabupaten -->
<fieldset class="fieldset">
<legend class="fieldset-legend">Kota/Kabupaten</legend>
<select class="select w-full">
<option disabled selected>Pilih Kota/Kabupaten</option>
</select>
</fieldset>
</div>
<div class="py-3 justify-end flex">
<button type="button" class="btn btn-error text-white rounded-full js-remove-sarpras">
<span class="icon me-2">delete</span>
Hapus
</button>
</div>
<div class="divider"></div>
</div>
</template>
@section Scripts {
<script>
(() => {
const listEl = document.getElementById('sarprasFormList');
const template = document.getElementById('sarprasTemplate');
const addButton = document.getElementById('addSarprasBtn');
if (!listEl || !template || !addButton) {
return;
}
const updateIndexes = () => {
const items = listEl.querySelectorAll('.sarpras-form-item');
items.forEach((item, idx) => {
const indexLabel = item.querySelector('.sarpras-index');
if (indexLabel) {
indexLabel.textContent = String(idx + 1);
}
const removeBtn = item.querySelector('.js-remove-sarpras');
if (removeBtn) {
removeBtn.disabled = items.length === 1;
}
});
};
const addForm = () => {
const clone = template.content.firstElementChild.cloneNode(true);
listEl.appendChild(clone);
updateIndexes();
};
addButton.addEventListener('click', (event) => {
event.preventDefault();
addForm();
});
listEl.addEventListener('click', (event) => {
const removeBtn = event.target.closest('.js-remove-sarpras');
if (!removeBtn) {
return;
}
event.preventDefault();
if (listEl.children.length === 1) {
return;
}
const formItem = removeBtn.closest('.sarpras-form-item');
if (formItem) {
formItem.remove();
updateIndexes();
}
});
updateIndexes();
})();
</script>
}

View File

@ -14,17 +14,14 @@
<div class="prose">
<h3 class="mb-2">Profil Rw</h3>
</div>
<div class="justify-self-end lg:self-center">
</div>
</div>
<div class="h-8"></div>
<!-- Tabs -->
<div class="tabs tabs-lift">
<input type="radio" name="tab_profil_rw" checked class="tab checked:text-white [--tab-bg:green]" aria-label="Profil" />
<input type="radio" name="tab_profil_rw" checked class="tab checked:text-white [--tab-bg:green]"
aria-label="Profil" />
<div class="tab-content bg-base-100 border-base-300 p-0">
@await Html.PartialAsync("_TabIndexProfil")
</div>
@ -34,20 +31,26 @@
@await Html.PartialAsync("_TabIndexBpsRw")
</div>
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]" aria-label="Surat Usulan" />
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]"
aria-label="Surat Usulan" />
<div class="tab-content bg-base-100 border-base-300 p-0">
@await Html.PartialAsync("_TabIndexSuratUsulan")
</div>
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]" aria-label="Pengadaan Wadah" />
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]"
aria-label="Pengadaan Wadah" />
<div class="tab-content bg-base-100 border-base-300 p-0">
@await Html.PartialAsync("_TabIndexPengadaanWadah")
</div>
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]" aria-label="Kebutuhan Sarpras" />
<div class="tab-content bg-base-100 border-base-300 p-0"></div>
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]"
aria-label="Kebutuhan Sarpras" />
<div class="tab-content bg-base-100 border-base-300 p-0">
@await Html.PartialAsync("_TabIndexKebutuhanSarpras")
</div>
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]" aria-label="Lokasi TP3SR & Parkir Pengumpulan Sampah" />
<input type="radio" name="tab_profil_rw" class="tab checked:text-white [--tab-bg:green]"
aria-label="Lokasi TP3SR & Parkir Pengumpulan Sampah" />
<div class="tab-content bg-base-100 border-base-300 p-0">
@await Html.PartialAsync("_TabIndexLokasi")
</div>
@ -61,116 +64,151 @@
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script type="text/javascript">
$(document).ready(function () {
// Datatable setup
var tableLokasi = new DataTable('#tableLokasi', {
ajax: '@Url.Action("TableLokasi", "ProfilRw")',
autoWidth: false,
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, orderable: false, searchable: false },
{ data: 'usulan' },
{ data: 'alamat' },
{ data: 'statusLahan' },
{ data: 'pemilikLahan' },
{ data: 'luasLahan' },
{
data: 'statusUsulan',
render: (data) => `
<span class="badge rounded-full bg-green-100 px-3 py-1 text-xs font-medium text-green-700">
${data}
</span>`
},
{
data: null,
className: "text-center",
render: (data, type, row) => `
<div class="flex justify-center gap-2">
<button class="btn btn-xs btn-outline btn-detail rounded-full border-gray-300 text-gray-700 hover:bg-gray-50" data-id="${row.id}">Detail</button>
<button class="btn btn-xs btn-outline btn-edit rounded-full border-gray-300 text-gray-700 hover:bg-gray-50" data-id="${row.id}">Edit</button>
<button class="btn btn-xs btn-outline btn-delete rounded-full border-red-300 text-red-600 hover:bg-red-50" data-id="${row.id}">Delete</button>
</div>
`,
orderable: false,
searchable: false
}
]
});
// Delete Button
tableLokasi.on('click', '.btn-delete', function () {
const id = $(this).data('id');
Swal.fire({
title: 'Apakah Anda yakin?',
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#ef4444',
cancelButtonColor: '#6b7280',
confirmButtonText: 'Ya, Hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
Swal.fire(
'Terhapus!',
'Data berhasil dihapus.',
'success'
);
$(document).ready(function () {
// Datatable setup
var tableLokasi = new DataTable('#tableLokasi', {
ajax: '@Url.Action("TableLokasi", "ProfilRw")',
autoWidth: false,
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, orderable: false, searchable: false },
{ data: 'usulan' },
{ data: 'alamat' },
{ data: 'statusLahan' },
{ data: 'pemilikLahan' },
{ data: 'luasLahan' },
{
data: 'statusUsulan',
render: (data) => `
<span class="badge rounded-full bg-green-100 px-3 py-1 text-xs font-medium text-green-700">
${data}
</span>`
},
{
data: null,
className: "text-center",
render: (data, type, row) => `
<div class="flex justify-center gap-2">
<button class="btn btn-xs btn-outline btn-detail rounded-full border-gray-300 text-gray-700 hover:bg-gray-50" data-id="${row.id}">Detail</button>
<button class="btn btn-xs btn-outline btn-edit rounded-full border-gray-300 text-gray-700 hover:bg-gray-50" data-id="${row.id}">Edit</button>
<button class="btn btn-xs btn-outline btn-delete rounded-full border-red-300 text-red-600 hover:bg-red-50" data-id="${row.id}">Delete</button>
</div>
`,
orderable: false,
searchable: false
}
]
});
});
// Datatable Surat Usulan
var tableSuratUsulan = new DataTable('#tableSuratUsulan', {
ajax: '@Url.Action("TableSuratUsulan", "ProfilRw")',
autoWidth: false,
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, orderable: false, searchable: false },
{ data: 'nama_surat' },
{ data: 'tanggal_surat' },
{ data: 'file_upload' },
{ data: 'status' },
{
data: 'aksi',
orderable: false,
searchable: false
},
]
});
// Delete Button
tableLokasi.on('click', '.btn-delete', function () {
const id = $(this).data('id');
// Delete Button
tableSuratUsulan.on('click', '.btn-error', function () {
const id = $(this).data('id');
Swal.fire({
title: 'Apakah Anda yakin?',
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#ef4444',
cancelButtonColor: '#6b7280',
confirmButtonText: 'Ya, Hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
Swal.fire(
'Terhapus!',
'Data berhasil dihapus.',
'success'
);
Swal.fire({
title: 'Apakah Anda yakin?',
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#ef4444',
cancelButtonColor: '#6b7280',
confirmButtonText: 'Ya, Hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
Swal.fire(
'Terhapus!',
'Data berhasil dihapus.',
'success'
);
});
});
});
// Datatable Pengadaan Wadah
var tablePengadaanWadah= new DataTable('#tablePengadaanWadah', {
ajax: '@Url.Action("TablePengadaanWadah", "ProfilRw")',
autoWidth: false,
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, orderable: false, searchable: false },
{ data: 'rt' },
{ data: 'jumlah_kepala_keluarga' },
{ data: 'total_wadah_unit' },
{ data: 'status' },
]
});
// Datatable Surat Usulan
var tableSuratUsulan = new DataTable('#tableSuratUsulan', {
ajax: '@Url.Action("TableSuratUsulan", "ProfilRw")',
autoWidth: false,
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, orderable: false, searchable: false },
{ data: 'nama_surat' },
{ data: 'tanggal_surat' },
{ data: 'file_upload' },
{ data: 'status' },
{
data: 'aksi',
orderable: false,
searchable: false
},
]
});
});
// Delete Button
tableSuratUsulan.on('click', '.btn-error', function () {
const id = $(this).data('id');
Swal.fire({
title: 'Apakah Anda yakin?',
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#ef4444',
cancelButtonColor: '#6b7280',
confirmButtonText: 'Ya, Hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
Swal.fire(
'Terhapus!',
'Data berhasil dihapus.',
'success'
);
});
});
// Datatable Pengadaan Wadah
var tablePengadaanWadah = new DataTable('#tablePengadaanWadah', {
ajax: '@Url.Action("TablePengadaanWadah", "ProfilRw")',
autoWidth: false,
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, orderable: false, searchable: false },
{ data: 'rt' },
{ data: 'jumlah_kepala_keluarga' },
{ data: 'total_wadah_unit' },
{ data: 'status' },
]
});
// Datatable Kebutuhan Sarpras
var tableKebutuhanSarpras = new DataTable('#tableKebutuhanSarpras', {
ajax: '@Url.Action("TableKebutuhanSarpras", "ProfilRw")',
autoWidth: false,
columns: [
{ data: null, render: (d, t, r, m) => m.row + 1, orderable: false, searchable: false },
{ data: 'rt' },
{ data: 'tanggal' },
{ data: 'jumlah_unit' },
{ data: 'aksi' },
]
});
// Delete Button
tableKebutuhanSarpras.on('click', '.btn-error', function () {
const id = $(this).data('id');
Swal.fire({
title: 'Apakah Anda yakin?',
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#ef4444',
cancelButtonColor: '#6b7280',
confirmButtonText: 'Ya, Hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
Swal.fire(
'Terhapus!',
'Data berhasil dihapus.',
'success'
);
});
});
});
</script>
}

View File

@ -0,0 +1,21 @@
<div class="flex w-full flex-col items-end p-4">
<a href="@Url.Action("CreateKebutuhanSarpras", "ProfilRw")" class="btn btn-primary w-32 rounded-full text-white">
<span class="icon icon-fill me-2">add</span>
Tambah
</a>
</div>
<div class="overflow-x-auto">
<table class="table-zebra table w-full text-sm" id="tableKebutuhanSarpras">
<thead>
<tr>
<th class="w-[5%]">No</th>
<th class="w-[30%]">RT</th>
<th class="w-[25%]">Tanggal</th>
<th class="w-[25%]">Jumlah Unit</th>
<th class="w-[15%]">Aksi</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>