fix(master-land): fix update function

This commit is contained in:
arieeefajar 2025-03-10 20:18:46 +07:00
parent 2c933d6a02
commit c849014664
3 changed files with 164 additions and 174 deletions

View File

@ -112,36 +112,23 @@ public function edit($id)
{ {
$land = Land::with('detailLands')->findOrFail($id); $land = Land::with('detailLands')->findOrFail($id);
$provinces = Province::all(); $provinces = Province::all();
return view('master-data.lahan.edit', compact('id', 'provinces', 'land',)); $landDetails = $land->detailLands->map(function ($detail) {
return [
'lat' => $detail->lat,
'lng' => $detail->lng,
];
});
return view('master-data.lahan.edit', compact('id', 'provinces', 'land', 'landDetails'));
} }
public function update(Request $request, $id) public function update(Request $request, $id)
{ {
$customMessage = [ $customMessage = [
'owner.required' => 'Nama pemilik wajib diisi', 'owner.required' => 'Nama pemilik wajib diisi',
'owner.max' => 'Nama pemilik maksimal 25 karakter', 'owner.max' => 'Nama pemilik maksimal 25 karakter',
'owner.string' => 'Nama pemilik harus berupa string', 'owner.string' => 'Nama pemilik harus berupa string',
'nohp.required' => 'Nomor HP wajib diisi',
'nohp.min' => 'Nomor HP minimal 10 karakter',
'nohp.max' => 'Nomor HP maksimal 13 karakter',
'nohp.string' => 'Nomor HP harus berupa string',
'rental_price.required' => 'Harga sewa wajib diisi',
'rental_price.numeric' => 'Harga sewa harus berupa angka',
'rental_start.required' => 'Tanggal mulai sewa wajib diisi',
'rental_start.date' => 'Tanggal mulai sewa harus berupa tanggal',
'rental_start.after_or_equal' => 'Tanggal mulai sewa harus hari ini atau setelahnya',
'rental_until.required' => 'Tanggal sampai sewa wajib diisi',
'rental_until.date' => 'Tanggal sampai sewa harus berupa tanggal',
'rental_until.after_or_equal' => 'Tanggal sampai sewa harus sama atau lebih besar dari tanggal mulai sewa',
'land_name.required' => 'Nama lahan wajib diisi',
'land_name.max' => 'Nama lahan maksimal 25 karakter',
'land_name.string' => 'Nama lahan harus berupa string',
'province_id.required' => 'Provinsi wajib diisi', 'province_id.required' => 'Provinsi wajib diisi',
'province_id.exists' => 'Provinsi tidak ditemukan', 'province_id.exists' => 'Provinsi tidak ditemukan',
@ -160,51 +147,54 @@ public function update(Request $request, $id)
'lng.required' => 'Longitude wajib diisi', 'lng.required' => 'Longitude wajib diisi',
'lng.numeric' => 'Longitude harus berupa angka', 'lng.numeric' => 'Longitude harus berupa angka',
];
$request->merge([ 'polygon.required' => 'Petak lahan wajib digambar',
'rental_price' => str_replace('.', '', $request->rental_price), ];
]);
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [
'owner' => 'required|string|max:25', 'owner' => 'required|string|max:25',
'nohp' => 'required|string|min:10|max:13',
'rental_price' => 'required|numeric',
'rental_start' => 'required|date|after_or_equal:today',
'rental_until' => 'required|date|after_or_equal:rental_start',
'land_name' => 'required|string|max:25',
'province_id' => 'required|exists:provinces,id', 'province_id' => 'required|exists:provinces,id',
'regency_id' => 'required|exists:regencies,id', 'regency_id' => 'required|exists:regencies,id',
'district_id' => 'required|exists:districts,id', 'district_id' => 'required|exists:districts,id',
'address' => 'required|string|max:100', 'address' => 'required|string|max:100',
'lat' => 'required|numeric', 'lat' => 'required|numeric',
'lng' => 'required|numeric', 'lng' => 'required|numeric',
'polygon' => 'required',
], $customMessage); ], $customMessage);
$polygon = json_decode($request->polygon, true);
if ($validator->fails()) { if ($validator->fails()) {
toast($validator->messages()->all()[0], 'error')->position('top')->autoclose(3000); toast($validator->messages()->all()[0], 'error')->position('top')->autoclose(3000);
return redirect()->back()->withInput(); return redirect()->back()->withInput();
} }
$land = Land::find($id); DB::beginTransaction();
$land->land_name = $request->land_name; try {
$land = Land::findOrFail($id);
$land->owner = $request->owner; $land->owner = $request->owner;
$land->no_hp = $request->nohp;
$land->rental_price = $request->rental_price;
$land->rental_start = $request->rental_start;
$land->rental_until = $request->rental_until;
$land->province_code = $request->province_id; $land->province_code = $request->province_id;
$land->regency_code = $request->regency_id; $land->regency_code = $request->regency_id;
$land->district_code = $request->district_id; $land->district_code = $request->district_id;
$land->address = $request->address; $land->address = $request->address;
$land->latitude = $request->lat; $land->latitude = $request->lat;
$land->longitude = $request->lng; $land->longitude = $request->lng;
try {
$land->save(); $land->save();
LandDetails::where('land_id', $land->id)->delete();
foreach ($polygon as $point) {
$landDetails = new LandDetails();
$landDetails->land_id = $land->id;
$landDetails->lat = $point['lat'];
$landDetails->lng = $point['lng'];
$landDetails->save();
}
DB::commit();
toast('Data berhasil diubah', 'success')->position('top-right')->autoclose(3000); toast('Data berhasil diubah', 'success')->position('top-right')->autoclose(3000);
return redirect()->back(); return redirect()->back();
} catch (\Throwable $th) { } catch (\Throwable $th) {
DB::rollBack();
toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000); toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000);
return redirect()->back(); return redirect()->back();
} }

View File

@ -25,9 +25,12 @@ var addressEditField = formEdit.querySelector("#address-edit-field");
var mapEditConatiner = formEdit.querySelector("#map-edit-container"); var mapEditConatiner = formEdit.querySelector("#map-edit-container");
var latEditField = formEdit.querySelector("#lat-edit"); var latEditField = formEdit.querySelector("#lat-edit");
var lngEditField = formEdit.querySelector("#lng-edit"); var lngEditField = formEdit.querySelector("#lng-edit");
var polygonField = formEdit.querySelector("#polygon-edit");
let latDb = formEdit.querySelector("#lat-db").dataset.lat; let latDb = formEdit.querySelector("#lat-db").dataset.lat;
let lngDb = formEdit.querySelector("#lng-db").dataset.lng; let lngDb = formEdit.querySelector("#lng-db").dataset.lng;
let polygonDb = formEdit.querySelector("#polygon-db");
let polygonData = polygonDb.getAttribute("data-polygon");
var loadingEdit = formEdit.querySelector("#loading-edit"); var loadingEdit = formEdit.querySelector("#loading-edit");
var btnEditContainer = formEdit.querySelector("#edit-footer"); var btnEditContainer = formEdit.querySelector("#edit-footer");
@ -289,6 +292,17 @@ function setMapEdit() {
btnEditContainer.style.display = "block"; btnEditContainer.style.display = "block";
mapEdit.setView([latDb, lngDb], 16); mapEdit.setView([latDb, lngDb], 16);
if (polygonData) {
let coordinates = JSON.parse(polygonData);
console.log("Polygon Data:", coordinates);
let latlngs = coordinates.map((point) => [point.lat, point.lng]);
let polygon = L.polygon(latlngs, { color: "blue" }).addTo(mapEdit);
drawnItems.addLayer(polygon);
mapEdit.fitBounds(polygon.getBounds());
polygonField.value = JSON.stringify(coordinates);
}
if (currentMarkerEdit) { if (currentMarkerEdit) {
mapEdit.removeLayer(currentMarkerEdit); mapEdit.removeLayer(currentMarkerEdit);
} }
@ -314,144 +328,123 @@ function setMapEdit() {
.openPopup(); .openPopup();
} }
async function updateData(data) { // async function updateData(data) {
const land = data.land; // const land = data.land;
const userRole = data.role; // const userRole = data.role;
var ownerEditField = formEdit.querySelector("#owner-edit-field"); // var ownerEditField = formEdit.querySelector("#owner-edit-field");
var noHpEditField = formEdit.querySelector("#nohp-edit-field"); // var provinceEditField = formEdit.querySelector("#province-edit-field");
var rentalPriceEditField = formEdit.querySelector( // var provinceEditVal = new Choices(provinceEditField);
"#rentalprice-edit-field"
);
var rentalStartEditField = formEdit.querySelector(
"#rentalstart-edit-field"
);
var rentalUntilEditField = formEdit.querySelector(
"#rentaluntil-edit-field"
);
var landNameEditField = formEdit.querySelector("#landname-edit-field");
var provinceEditField = formEdit.querySelector("#province-edit-field");
var provinceEditVal = new Choices(provinceEditField);
let rentalPrice = new Intl.NumberFormat("id-ID", { // ownerEditField.value = land.owner;
style: "currency", // provinceEditField.value = land.province_code;
currency: "IDR", // try {
minimumFractionDigits: 0, // const province = await getProvinces(land.province_code);
}).format(land.rental_price); // provinceEditVal.setChoices([
// {
// value: province.id,
// label: province.name,
// selected: true,
// disabled: true,
// },
// ]);
ownerEditField.value = land.owner; // $.ajax({
noHpEditField.value = land.no_hp; // type: "GET",
rentalPriceEditField.value = rentalPrice.replace(/Rp\s?/g, "").trim(); // url: "/location/get-regency/" + land.province_code,
rentalStartEditField.value = land.rental_start; // success: function (response) {
rentalUntilEditField.value = land.rental_until; // if (response.success) {
landNameEditField.value = land.land_name; // const dataRegencies = response.data;
provinceEditField.value = land.province_code; // const regencies = response.data.find(
try { // (regency) => regency.id === parseInt(land.regency_code)
const province = await getProvinces(land.province_code); // );
provinceEditVal.setChoices([
{
value: province.id,
label: province.name,
selected: true,
disabled: true,
},
]);
$.ajax({ // regencyEditVal.setChoices([
type: "GET", // {
url: "/location/get-regency/" + land.province_code, // value: regencies.id,
success: function (response) { // label: regencies.name,
if (response.success) { // selected: true,
const dataRegencies = response.data; // disabled: true,
const regencies = response.data.find( // },
(regency) => regency.id === parseInt(land.regency_code) // ]);
);
regencyEditVal.setChoices([ // if (Array.isArray(dataRegencies)) {
{ // regencyEditVal.setChoices(
value: regencies.id, // dataRegencies.map((regency) => ({
label: regencies.name, // value: regency.id,
selected: true, // label: regency.name,
disabled: true, // selected: false,
}, // disabled: false,
]); // }))
// );
// } else {
// mapEditConatiner.style.display = "block";
// mapEditConatiner.innerHTML =
// "<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
// }
// }
// },
// });
if (Array.isArray(dataRegencies)) { // $.ajax({
regencyEditVal.setChoices( // type: "GET",
dataRegencies.map((regency) => ({ // url: "/location/get-district/" + land.regency_code,
value: regency.id, // success: function (response) {
label: regency.name, // if (response.success) {
selected: false, // const dataDistricts = response.data;
disabled: false, // const districts = response.data.find(
})) // (district) =>
); // district.id === parseInt(land.district_code)
} else { // );
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
});
$.ajax({ // districtEditVal.setChoices([
type: "GET", // {
url: "/location/get-district/" + land.regency_code, // value: districts.id,
success: function (response) { // label: districts.name,
if (response.success) { // selected: true,
const dataDistricts = response.data; // disabled: true,
const districts = response.data.find( // },
(district) => // ]);
district.id === parseInt(land.district_code)
);
districtEditVal.setChoices([ // if (Array.isArray(dataDistricts)) {
{ // districtEditVal.setChoices(
value: districts.id, // dataDistricts.map((district) => ({
label: districts.name, // value: district.id,
selected: true, // label: district.name,
disabled: true, // selected: false,
}, // disabled: false,
]); // }))
// );
// } else {
// mapEditConatiner.style.display = "block";
// mapEditConatiner.innerHTML =
// "<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
// }
// }
// },
// });
if (Array.isArray(dataDistricts)) { // addressEditContainer.style.display = "block";
districtEditVal.setChoices( // addressEditField.value = land.address;
dataDistricts.map((district) => ({
value: district.id,
label: district.name,
selected: false,
disabled: false,
}))
);
} else {
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
});
addressEditContainer.style.display = "block"; // mapEdit.setView([land.latitude, land.longitude], 16);
addressEditField.value = land.address; // currentMarkerEdit
// .setLatLng([land.latitude, land.longitude])
// .openPopup();
mapEdit.setView([land.latitude, land.longitude], 16); // latEditField.value = land.latitude;
currentMarkerEdit // lngEditField.value = land.longitude;
.setLatLng([land.latitude, land.longitude]) // polygonField.value = land.polygon;
.openPopup();
latEditField.value = land.latitude; // if (userRole === "admin") {
lngEditField.value = land.longitude; // formEdit.action = "/data-lahan/" + land.id;
// } else {
if (userRole === "admin") { // formEdit.action = "/data-lahan-petugas/" + land.id;
formEdit.action = "/data-lahan/" + land.id; // }
} else { // } catch (error) {
formEdit.action = "/data-lahan-petugas/" + land.id; // console.log(error);
} // }
} catch (error) { // }
console.log(error);
}
}
function handleDrawCreated(e) { function handleDrawCreated(e) {
var layer = e.layer; var layer = e.layer;
@ -461,7 +454,7 @@ function handleDrawCreated(e) {
polygonField.value = JSON.stringify(coordinates); polygonField.value = JSON.stringify(coordinates);
layer.bindPopup("<b>Petak Lahan Berhasil Dibuat!</b>").openPopup(); layer.bindPopup("<b>Petak Lahan Berhasil Dibuat!</b>").openPopup();
btnContainer.style.display = "block"; btnEditContainer.style.display = "block";
} }
function handleDrawEdited(e) { function handleDrawEdited(e) {

View File

@ -44,7 +44,8 @@
<h4 class="card-title mb-0">Edit Data Lahan</h4> <h4 class="card-title mb-0">Edit Data Lahan</h4>
</div> </div>
<div class="card-body"> <div class="card-body">
<form id="edit-form" action="" method="POST" class="needs-validation" novalidate> <form id="edit-form" action="{{ route('master_data.lahan.update', $land->id) }}" method="POST"
class="needs-validation" novalidate>
@csrf @csrf
@method('PUT') @method('PUT')
<div class="modal-body"> <div class="modal-body">
@ -139,15 +140,21 @@
<input type="hidden" name="lng" id="lng-edit" class="form-control" <input type="hidden" name="lng" id="lng-edit" class="form-control"
readonly> readonly>
<input type="hidden" name="polygon" id="polygon-edit" class="form-control"
readonly>
<input type="hidden" id="lat-db" data-lat={{ $land->latitude }}> <input type="hidden" id="lat-db" data-lat={{ $land->latitude }}>
<input type="hidden" id="lng-db" data-lng={{ $land->longitude }}> <input type="hidden" id="lng-db" data-lng={{ $land->longitude }}>
<input type="hidden" id="polygon-db"
data-polygon="{{ json_encode($landDetails) }}">
</div> </div>
</div> </div>
</div> </div>
<div class="modal-footer" id="edit-footer"> <div class="modal-footer" id="edit-footer">
<div class="hstack gap-2 justify-content-end"> <div class="hstack gap-2 justify-content-end">
<button type="button" class="btn btn-light" <a href="{{ route('master_data.lahan.index') }}"
data-bs-dismiss="modal">Tutup</button> class="btn btn-light">Kembali</a>
<button type="submit" class="btn btn-success" id="edit-btn">Update</button> <button type="submit" class="btn btn-success" id="edit-btn">Update</button>
</div> </div>
</div> </div>