refactor: move lokasi to profile rw

main-dlh
Yuri Dimas 2025-11-17 14:35:53 +07:00
parent 645fc1b122
commit 225233419e
6 changed files with 232 additions and 299 deletions

View File

@ -1,9 +1,8 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc;
namespace BpsRwApp.Controllers
{
[Route("[controller]/[action]")]
public class LokasiController : AppControllerBase
public class ProfilRwController : AppControllerBase
{
public IActionResult Index()
{
@ -11,7 +10,7 @@ namespace BpsRwApp.Controllers
}
[HttpGet]
public IActionResult Table()
public IActionResult TableLokasi()
{
var data = new[]
{

View File

@ -1,198 +0,0 @@
@{
ViewData["Title"] = "Lokasi TP3SR & Parkir Pengumpulan Sampah";
}
<!-- Breadcrumb -->
<div class="breadcrumbs text-sm">
<ul>
<li class="text-gray-500"><a>Profil RW</a></li>
<li id="breadcrumb-active">Lokasi TP3SR & Parkir Pengumpulan Sampah</li>
</ul>
</div>
<!-- Header -->
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
<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" class="tab checked:text-white [--tab-bg:green]" aria-label="Profil" />
<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="BPS-RW" />
<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="Surat Usulan" />
<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="Pengadaan Wadah" />
<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"></div>
<input type="radio" name="tab_profil_rw" checked 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">
<div class="flex flex-col p-4 items-end w-full">
<button onclick="modal_add_lokasi.showModal()"
class="btn rounded-full btn-primary text-white w-32">
<span class="icon icon-fill me-2">add</span>
Tambah
</button>
</div>
<div class="overflow-x-auto">
<table class="table table-zebra w-full text-sm" id="lokasiTable">
<thead>
<tr>
<th class="w-[5%]">No</th>
<th class="w-[10%]">Usulan</th>
<th class="w-[20%]">Alamat Lokasi</th>
<th class="w-[10%]">Status Lahan</th>
<th class="w-[20%]">Pemilik Lahan</th>
<th class="w-[10%]">Luas Lahan</th>
<th class="w-[10%]">Status Usulan</th>
<th class="w-[15%] text-center">Action</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
</div>
<!-- Modal adding location -->
@await Html.PartialAsync("_ModalTambah")
<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="/plugins/datatables/dataTables.tailwindcss.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script type="text/javascript">
$(document).ready(function () {
// Datatable setup
const table = new DataTable('#lokasiTable', {
ajax: '@Url.Action("Table", "Lokasi")',
scrollX: true,
autoWidth: false,
initComplete: function () {
$('div.dt-scroll-body thead').css('visibility', 'collapse');
},
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 bg-green-100 text-green-700 px-3 py-1 rounded-full text-xs font-medium">
${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 border-gray-300 text-gray-700 rounded-full hover:bg-gray-50 btn-detail" data-id="${row.id}">Detail</button>
<button class="btn btn-xs btn-outline border-gray-300 text-gray-700 rounded-full hover:bg-gray-50 btn-edit" data-id="${row.id}">Edit</button>
<button class="btn btn-xs btn-outline border-red-300 text-red-600 rounded-full hover:bg-red-50 btn-delete" data-id="${row.id}">Delete</button>
</div>
`,
orderable: false,
searchable: false
}
]
});
// Breadcrumbs update on tab change
const updateBreadcrumbs = () => {
const activeTab = $('input[name="tab_profil_rw"]:checked');
$('#breadcrumb-active').text(activeTab.attr('aria-label'));
};
updateBreadcrumbs();
$('input[name="tab_profil_rw"]').on('change', updateBreadcrumbs);
// Form submission
$('#formTambahLokasi').on('submit', function (e) {
e.preventDefault();
const data = $(this).serialize();
$.post('@Url.Action("Create", "Lokasi")', data, function () {
table.ajax.reload();
$('#modal-tambah').prop('checked', false);
$('#formTambahLokasi')[0].reset();
});
});
// Edit button handler
$('#lokasiTable').on('click', '.btn-edit', function () {
const id = $(this).data('id');
$.get('@Url.Action("GetById", "Lokasi")', { id: id }, function (data) {
$('#modal-tambah input[name="id"]').val(data.id);
$('#modal-tambah input[name="usulan"]').val(data.usulan);
$('#modal-tambah input[name="alamat"]').val(data.alamat);
$('#modal-tambah input[name="statusLahan"]').val(data.statusLahan);
$('#modal-tambah input[name="pemilikLahan"]').val(data.pemilikLahan);
$('#modal-tambah input[name="luasLahan"]').val(data.luasLahan);
$('#modal-tambah select[name="statusUsulan"]').val(data.statusUsulan);
// Open modal
$('#modal-tambah').prop('checked', true);
});
});
// Delete Button
$('#lokasiTable').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) => {
if (result.isConfirmed) {
$.post('@Url.Action("Delete", "Lokasi")', { id: id }, function () {
table.ajax.reload();
Swal.fire(
'Terhapus!',
'Data berhasil dihapus.',
'success'
);
}).fail(function () {
Swal.fire(
'Gagal!',
'Terjadi kesalahan saat menghapus data.',
'error'
);
});
}
});
});
// Detail button handler
$('#lokasiTable').on('click', '.btn-detail', function () {
const id = $(this).data('id');
console.log('Detail clicked for ID:', id);
});
});
</script>

View File

@ -1,96 +0,0 @@
<dialog id="modal_add_lokasi" class="modal">
<div class="modal-box w-full max-w-md rounded-2xl shadow-lg relative">
<!-- Close Button -->
<label onclick="modal_add_lokasi.close()"
class="btn btn-sm btn-circle btn-ghost absolute right-3 top-3">
</label>
<!-- Header -->
<h3 class="text-lg font-semibold mb-5 text-gray-800">Tambah Lokasi</h3>
<!-- Form -->
<form id="formTambahLokasi" class="space-y-4">
<!-- Jenis Usulan -->
<div>
<label class="label font-semibold text-sm text-gray-700">Jenis Usulan</label>
<select class="select select-bordered w-full" name="jenisUsulan" required>
<option value="">Pilih jenis usulan</option>
<option value="TP3SR">TP3SR</option>
<option value="Parkir Pengumpulan">Parkir Pengumpulan</option>
</select>
</div>
<!-- Alamat -->
<div>
<label class="label font-semibold text-sm text-gray-700">Alamat</label>
<input
type="text"
class="input input-bordered w-full"
name="alamat"
placeholder="Masukkan alamat"
required
/>
</div>
<!-- Nama Pemilik -->
<div>
<label class="label font-semibold text-sm text-gray-700">Nama Pemilik Lahan</label>
<input
type="text"
class="input input-bordered w-full"
name="pemilikLahan"
placeholder="Masukkan nama pemilik"
required
/>
</div>
<!-- Status & Luas Lahan -->
<div class="grid grid-cols-2 gap-3">
<div>
<label class="label font-semibold text-sm text-gray-700">Status Lahan</label>
<select class="select select-bordered w-full" name="statusLahan" required>
<option value="">Pilih status lahan</option>
<option value="Milik Pemda">Milik Pemda</option>
<option value="Milik Warga">Milik Warga</option>
<option value="Sewa">Sewa</option>
</select>
</div>
<div>
<label class="label font-semibold text-sm text-gray-700">Luas Lahan</label>
<input
type="number"
class="input input-bordered w-full"
name="luasLahan"
placeholder="Masukkan luas lahan"
required
/>
</div>
</div>
<!-- Keterangan -->
<div>
<label class="label font-semibold text-sm text-gray-700">Keterangan</label>
<textarea
class="textarea textarea-bordered w-full"
name="keterangan"
placeholder="Keterangan"
rows="3"
></textarea>
</div>
<!-- Action Button -->
<div class="modal-action mt-6 flex justify-end gap-3">
<button onclick="modal_add_lokasi.close()" type="button"
class="btn btn-outline btn-sm flex items-center gap-2">
✕ Batalkan
</button>
<button type="submit"
class="btn btn-success btn-sm text-white flex items-center gap-2">
✓ Simpan
</button>
</div>
</form>
</div>
</dialog>

View File

@ -0,0 +1,47 @@
@{
ViewData["Title"] = "Lokasi TP3SR & Parkir Pengumpulan Sampah";
}
<!-- Breadcrumb -->
<div class="breadcrumbs text-sm">
<ul>
<li class="text-gray-500"><a>Profil RW</a></li>
<li id="breadcrumb-active">Lokasi TP3SR & Parkir Pengumpulan Sampah</li>
</ul>
</div>
<!-- Header -->
<div class="grid grid-cols-1 gap-4 lg:grid-cols-2">
<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" class="tab checked:text-white [--tab-bg:green]" aria-label="Profil" />
<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="BPS-RW" />
<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="Surat Usulan" />
<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="Pengadaan Wadah" />
<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"></div>
<input type="radio" name="tab_profil_rw" checked 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>
</div>

View File

@ -0,0 +1,181 @@
<div class="flex w-full flex-col items-end p-4">
<button onclick="modal_add_lokasi.showModal()"
class="btn btn-primary w-32 rounded-full text-white">
<span class="icon icon-fill me-2">add</span>
Tambah
</button>
</div>
<div class="overflow-x-auto">
<table class="table-zebra table w-full text-sm" id="lokasiTable">
<thead>
<tr>
<th class="w-[5%]">No</th>
<th class="w-[10%]">Usulan</th>
<th class="w-[20%]">Alamat Lokasi</th>
<th class="w-[10%]">Status Lahan</th>
<th class="w-[20%]">Pemilik Lahan</th>
<th class="w-[10%]">Luas Lahan</th>
<th class="w-[10%]">Status Usulan</th>
<th class="w-[15%] text-center">Action</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<!--Modal Add Lokasi-->
<dialog id="modal_add_lokasi" class="modal">
<div class="modal-box relative w-full max-w-md rounded-2xl shadow-lg">
<!-- Close Button -->
<label onclick="modal_add_lokasi.close()"
class="btn btn-sm btn-circle btn-ghost absolute top-3 right-3">
</label>
<!-- Header -->
<h3 class="mb-5 text-lg font-semibold text-gray-800">Tambah Lokasi</h3>
<!-- Form -->
<form id="formTambahLokasi" class="space-y-4">
<!-- Jenis Usulan -->
<fieldset class="fieldset">
<legend class="fieldset-legend">
Jenis Usulan
</legend>
<select class="select w-full">
<option value="">Pilih jenis usulan</option>
<option value="TP3SR">TP3SR</option>
<option value="Parkir Pengumpulan">Parkir Pengumpulan</option>
</select>
</fieldset>
<!-- Alamat -->
<fieldset class="fieldset">
<legend class="fieldset-legend">
Alamat
</legend>
<textarea class="textarea h-24 w-full" placeholder="Alamat"></textarea>
</fieldset>
<!-- Nama Pemilik -->
<fieldset class="fieldset">
<legend class="fieldset-legend">
Nama Pemilik Lahan
</legend>
<input type="text" class="input w-full" placeholder="Nama Pemilik Lahan" />
</fieldset>
<!-- Status & Luas Lahan -->
<div class="grid grid-cols-2 gap-3">
<fieldset class="fieldset">
<legend class="fieldset-legend">
Status Lahan
</legend>
<select class="select">
<option value="">Pilih status lahan</option>
<option value="Milik Pemda">Milik Pemda</option>
<option value="Milik Warga">Milik Warga</option>
<option value="Sewa">Sewa</option>
</select>
</fieldset>
<fieldset class="fieldset">
<legend class="fieldset-legend">
Luas Lahan
</legend>
<input type="number" class="input" placeholder="Luas Lahan" />
</fieldset>
</div>
<!-- Keterangan -->
<fieldset class="fieldset">
<legend class="fieldset-legend">
Keterangan
</legend>
<textarea class="textarea h-24 w-full" placeholder="Keterangan"></textarea>
</fieldset>
<!-- Action Button -->
<div class="modal-action mt-6 flex justify-end gap-3">
<button onclick="modal_add_lokasi.close()" type="button" class="btn btn-outline btn-sm">
<span class="icon me-1">cancel</span>
Batalkan
</button>
<button type="submit" class="btn btn-primary btn-sm text-white">
<span class="icon me-1">save</span>
Simpan
</button>
</div>
</form>
</div>
</dialog>
<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="/plugins/datatables/dataTables.tailwindcss.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script type="text/javascript">
$(document).ready(function () {
// Datatable setup
const table = new DataTable('#lokasiTable', {
ajax: '@Url.Action("TableLokasi", "ProfilRw")',
scrollX: true,
autoWidth: false,
initComplete: function () {
$('div.dt-scroll-body thead').css('visibility', 'collapse');
},
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
$('#lokasiTable').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'
);
});
});
});
</script>

View File

@ -17,7 +17,7 @@
</a>
</li>
<li>
<a asp-controller="Lokasi" asp-action="Index" class="@(controller == "Lokasi" ? "menu-active" : "")">
<a asp-controller="ProfilRw" asp-action="Index" class="@(controller == "ProfilRw" ? "menu-active" : "")">
<span class="material-symbols-outlined text-[20px]">account_box</span>
Profil RW
</a>