Merge pull request #21 from arieeefajar/fix/master-land

Fix/master land
This commit is contained in:
Arie Fajar Bachtiar 2025-03-11 19:47:24 +07:00 committed by GitHub
commit cb24dae40e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 1404 additions and 1138 deletions

View File

@ -4,17 +4,35 @@
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Land; use App\Models\Land;
use App\Models\LandDetails;
use App\Models\Province; use App\Models\Province;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
class LandController extends Controller class LandController extends Controller
{ {
public function index() public function index()
{ {
$lands = Land::orderBy('created_at', 'desc')->get(); // $lands = Land::orderBy('created_at', 'desc')->get();
// if ($lands->isEmpty()) {
// return view('master-data.lahan.index', compact('lands'));
// }
// $province = Province::where('id', $lands->first()->province_code)->first();
// $regency = $province->regency()->where('id', $lands->first()->regency_code)->first();
// $district = $regency->district()->where('id', $lands->first()->district_code)->first();
// return view('master-data.lahan.index', compact('lands', 'province', 'regency', 'district'));
$lands = Land::with('province', 'regency')->orderBy('created_at', 'desc')->get();
return view('master-data.lahan.index', compact('lands'));
}
public function create()
{
$provinces = Province::all(); $provinces = Province::all();
return view('master-data.lahan.index', compact('lands', 'provinces')); return view('master-data.lahan.create', compact('provinces'));
} }
public function store(Request $request) public function store(Request $request)
@ -24,26 +42,6 @@ public function store(Request $request)
'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',
@ -62,84 +60,84 @@ public function store(Request $request)
'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();
} }
DB::beginTransaction();
try {
$land = new Land(); $land = new Land();
$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->land_name = $request->land_name;
$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();
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 disimpan', 'success')->position('top-right')->autoclose(3000); toast('Data berhasil disimpan', 'success')->position('top-right')->autoclose(3000);
return redirect()->back();
if (Auth::user()->role == 'admin') {
return redirect()->route('master_data.lahan.index');
}
return redirect()->route('lahan.index');
} catch (\Throwable $th) { } catch (\Throwable $th) {
dd($th->getMessage()); DB::rollBack();
toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000); toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000);
return redirect()->back(); return redirect()->back();
} }
} }
public function edit($id)
{
$land = Land::with('detailLands')->findOrFail($id);
$provinces = Province::all();
$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',
@ -158,51 +156,64 @@ 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 (isset($polygon[0])) {
// $polygon = $polygon[0]; // Ambil array pertama jika ada
// }
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();
if (Auth::user()->role == 'admin') {
return redirect()->route('master_data.lahan.index');
}
return redirect()->route('lahan.index');
} catch (\Throwable $th) { } catch (\Throwable $th) {
DB::rollBack();
dd($th->getMessage());
toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000); toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000);
return redirect()->back(); return redirect()->back();
} }

View File

@ -11,4 +11,24 @@ class Land extends Model
protected $table = 'land'; protected $table = 'land';
protected $guarded = []; protected $guarded = [];
public function detailLands()
{
return $this->hasMany(LandDetails::class, 'land_id', 'id');
}
public function province()
{
return $this->belongsTo(Province::class, 'province_code', 'id');
}
public function regency()
{
return $this->belongsTo(Regency::class, 'regency_code', 'id');
}
public function district()
{
return $this->belongsTo(District::class, 'district_code', 'id');
}
} }

View File

@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class LandDetails extends Model
{
use HasFactory;
protected $table = 'land_details';
protected $guarded = [];
}

View File

@ -11,4 +11,14 @@ class Province extends Model
protected $table = 'provinces'; protected $table = 'provinces';
protected $guarded = []; protected $guarded = [];
public function regencies()
{
return $this->hasMany(Regency::class);
}
public function regency()
{
return $this->hasOne(Regency::class);
}
} }

View File

@ -11,4 +11,14 @@ class Regency extends Model
protected $table = 'regencies'; protected $table = 'regencies';
protected $guarded = []; protected $guarded = [];
public function districts()
{
return $this->hasMany(District::class);
}
public function district()
{
return $this->hasOne(District::class);
}
} }

View File

@ -13,12 +13,7 @@ public function up(): void
{ {
Schema::create('land', function (Blueprint $table) { Schema::create('land', function (Blueprint $table) {
$table->id(); $table->id();
$table->string('land_name');
$table->string('owner'); $table->string('owner');
$table->string('no_hp');
$table->string('rental_price');
$table->date('rental_start');
$table->date('rental_until');
$table->string('province_code'); $table->string('province_code');
$table->string('regency_code'); $table->string('regency_code');
$table->string('district_code'); $table->string('district_code');

View File

@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('land_details', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('land_id');
$table->string('lat');
$table->string('lng');
$table->timestamps();
});
Schema::table('land_details', function (Blueprint $table) {
$table->foreign('land_id')->references('id')->on('land')->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('land_details');
}
};

90
leafletDrawer.html Normal file
View File

@ -0,0 +1,90 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Leaflet Draw Polygon</title>
<!-- Leaflet CSS -->
<link
rel="stylesheet"
href="https://unpkg.com/leaflet/dist/leaflet.css"
/>
<!-- Leaflet Draw CSS -->
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css"
/>
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script>
<style>
#map {
height: 500px;
} /* Atur tinggi peta */
</style>
</head>
<body>
<div id="map"></div>
<script>
// 1⃣ Inisialisasi peta
var map = L.map("map").setView([-6.2, 106.816666], 12); // Jakarta
// 2⃣ Tambahkan tile layer (OpenStreetMap)
L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution: "© OpenStreetMap contributors",
}).addTo(map);
// 3⃣ Inisialisasi fitur gambar (Leaflet Draw)
var drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);
var drawControl = new L.Control.Draw({
draw: {
polygon: true, // Izinkan user menggambar polygon
polyline: false,
rectangle: false,
circle: false,
marker: false,
circlemarker: false,
},
edit: {
featureGroup: drawnItems, // Edit hanya objek yang sudah digambar
remove: true, // Izinkan menghapus objek
},
});
map.addControl(drawControl);
// 4⃣ Event saat user menggambar polygon
map.on("draw:created", function (event) {
var layer = event.layer;
drawnItems.addLayer(layer);
var coordinates = layer.getLatLngs();
console.log("Koordinat Polygon:", coordinates);
alert(
"Polygon berhasil dibuat! Cek console untuk koordinatnya."
);
});
// 5⃣ Event saat user mengedit polygon
map.on("draw:edited", function (event) {
var layers = event.layers;
layers.eachLayer(function (layer) {
var coordinates = layer.getLatLngs();
console.log("Koordinat setelah diedit:", coordinates);
alert(
"Polygon berhasil diedit! Cek console untuk koordinatnya."
);
});
});
// 6⃣ Event saat user menghapus polygon
map.on("draw:deleted", function (event) {
alert("Polygon telah dihapus!");
});
</script>
</body>
</html>

View File

@ -0,0 +1,296 @@
var map, drawnItems, drawControl, googleStreets, iconMarker;
var currentMarker = null;
function initMap() {
map = L.map("map", {
attributionControl: false,
}).setView([-8.157416852745705, 113.72281580436439], 16);
googleStreets = L.tileLayer(
"http://{s}.google.com/vt?lyrs=m&x={x}&y={y}&z={z}",
{
maxZoom: 20,
subdomains: ["mt0", "mt1", "mt2", "mt3"],
}
).addTo(map);
iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
popupAnchor: [0, -50],
});
currentMarker = L.marker([-8.157416852745705, 113.72281580436439], {
icon: iconMarker,
draggable: true,
})
.addTo(map)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
);
drawnItems = new L.FeatureGroup();
map.addLayer(drawnItems);
drawControl = new L.Control.Draw({
draw: {
polygon: true, // Izinkan user menggambar polygon
polyline: false,
rectangle: false,
circle: false,
marker: false,
circlemarker: false,
},
edit: {
featureGroup: drawnItems, // Edit hanya objek yang sudah digambar
remove: true, // Izinkan menghapus objek
},
});
map.addControl(drawControl);
map.on("draw:created", handleDrawCreated);
map.on("draw:edited", handleDrawEdited);
$("#showModal").on("shown.bs.modal", function () {
map.invalidateSize();
});
}
var form = document.getElementById("add-form");
var provinceField = form.querySelector("#province-field");
var provinceVal = new Choices(provinceField);
var regencyContainer = form.querySelector("#regency-container");
var regencyField = form.querySelector("#regency-field");
var regencyVal = new Choices(regencyField, {
shouldSort: false,
});
var districtContainer = form.querySelector("#district-container");
var districtField = form.querySelector("#district-field");
var districtVal = new Choices(districtField, {
shouldSort: false,
});
var addressContainer = form.querySelector("#address-container");
var addressField = form.querySelector("#address-field");
var mapContainer = form.querySelector("#map-container");
var latField = form.querySelector("#lat");
var lngField = form.querySelector("#lng");
var polygonField = form.querySelector("#polygon");
var loading = form.querySelector("#loading");
var btnContainer = form.querySelector("#add-footer");
document.addEventListener("DOMContentLoaded", function () {
initMap();
if (provinceField.value !== "") {
getRegencies(provinceField.value);
}
});
function getRegencies(provinceId) {
regencyContainer.style.display = "none";
districtContainer.style.display = "none";
addressContainer.style.display = "none";
loading.style.display = "block";
mapContainer.style.display = "none";
const url = "/location/get-regency/" + provinceId;
$.ajax({
url: url,
type: "GET",
success: function (response) {
if (response.success) {
loading.style.display = "none";
const data = response.data;
regencyVal.clearStore();
regencyVal.clearChoices();
regencyVal.value = "";
regencyVal.setChoices([
{
value: "",
label: "Pilih Kabupaten",
selected: true,
disabled: true,
},
]);
if (Array.isArray(data)) {
regencyVal.setChoices(
data.map((regency) => ({
value: regency.id,
label: regency.name,
selected: false,
disabled: false,
}))
);
regencyContainer.style.display = "block";
} else {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
error: function (xhr, status, error) {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
},
});
}
function getDistricts(regencyId) {
districtContainer.style.display = "none";
addressContainer.style.display = "none";
loading.style.display = "block";
mapContainer.style.display = "none";
const url = "/location/get-district/" + regencyId;
$.ajax({
url: url,
type: "GET",
success: function (response) {
if (response.success) {
loading.style.display = "none";
const data = response.data;
districtVal.clearStore();
districtVal.clearChoices();
districtVal.value = "";
districtVal.setChoices([
{
value: "",
label: "Pilih Kecamatan",
selected: true,
disabled: true,
},
]);
if (Array.isArray(data)) {
districtVal.setChoices(
data.map((district) => ({
value: district.id,
label: district.name,
selected: false,
disabled: false,
}))
);
districtContainer.style.display = "block";
} else {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
error: function (xhr, status, error) {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
},
});
}
function showmap(districtId) {
loading.style.display = "block";
if (!navigator.geolocation) {
alert("Geolocation tidak didukung oleh browser ini.");
return;
}
navigator.geolocation.getCurrentPosition(
function (position) {
loading.style.display = "none";
mapContainer.style.display = "block";
map.invalidateSize();
addressContainer.style.display = "block";
var lat = position.coords.latitude;
var lng = position.coords.longitude;
map.setView([lat, lng], 16);
if (currentMarker) {
map.removeLayer(currentMarker);
}
if (currentMarker || currentMarkerEdit) {
map.removeLayer(currentMarker);
}
var iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
popupAnchor: [0, -50],
});
currentMarker = L.marker([lat, lng], {
icon: iconMarker,
draggable: true,
}).addTo(map);
currentMarker.on("dragend", onPointerDragend);
currentMarker
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
)
.openPopup();
latField.value = lat;
lngField.value = lng;
},
function (error) {
alert("Error: " + error.message);
}
);
}
function onPointerDragend() {
if (!currentMarker) return;
var coordinates = currentMarker.getLatLng();
currentMarker
.setLatLng(coordinates)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
)
.openPopup();
latField.value = coordinates.lat;
lngField.value = coordinates.lng;
}
function handleDrawCreated(e) {
var layer = e.layer;
drawnItems.addLayer(layer);
var coordinates = layer.getLatLngs()[0];
console.log("Koordinat Polygon:", coordinates);
polygonField.value = JSON.stringify(coordinates);
layer.bindPopup("<b>Petak Lahan Berhasil Dibuat!</b>").openPopup();
btnContainer.style.display = "block";
}
function handleDrawEdited(e) {
var layers = e.layers;
layers.eachLayer(function (layer) {
var coordinates = layer.getLatLngs();
console.log("Koordinat setelah diedit:", coordinates);
polygonField.value = JSON.stringify(coordinates);
layer.bindPopup("<b>Petak Lahan Berhasil Diedit!</b>").openPopup();
});
}

View File

@ -1,537 +1,3 @@
var map, mapEdit;
var currentMarker = null;
var currentMarkerEdit = null;
var form = document.getElementById("add-form");
var formEdit = document.getElementById("edit-form");
var provinceField = form.querySelector("#province-field");
var provinceVal = new Choices(provinceField);
var regencyContainer = form.querySelector("#regency-container");
var regencyField = form.querySelector("#regency-field");
var regencyVal = new Choices(regencyField, {
shouldSort: false,
});
var regencyEditContainer = formEdit.querySelector("#regency-edit-container");
var regencyEditField = formEdit.querySelector("#regency-edit-field");
var regencyEditVal = new Choices(regencyEditField, {
shouldSort: false,
});
var districtContainer = form.querySelector("#district-container");
var districtField = form.querySelector("#district-field");
var districtVal = new Choices(districtField, {
shouldSort: false,
});
var districtEditContainer = formEdit.querySelector("#district-edit-container");
var districtEditField = formEdit.querySelector("#district-edit-field");
var districtEditVal = new Choices(districtEditField, {
shouldSort: false,
});
var addressContainer = form.querySelector("#address-container");
var addressField = form.querySelector("#address-field");
var addressEditContainer = formEdit.querySelector("#address-edit-container");
var addressEditField = formEdit.querySelector("#address-edit-field");
var mapContainer = form.querySelector("#map-container");
var latField = form.querySelector("#lat");
var lngField = form.querySelector("#lng");
var mapEditConatiner = formEdit.querySelector("#map-edit-container");
var latEditField = formEdit.querySelector("#lat-edit");
var lngEditField = formEdit.querySelector("#lng-edit");
var loading = form.querySelector("#loading");
var loadingEdit = formEdit.querySelector("#loading-edit");
var btnContainer = form.querySelector("#add-footer");
var btnEditContainer = formEdit.querySelector("#edit-footer");
document.addEventListener("DOMContentLoaded", function () {
map = L.map("map", {
attributionControl: false,
}).setView([-8.157416852745705, 113.72281580436439], 16);
mapEdit = L.map("map-edit", {
attributionControl: false,
}).setView([-8.157416852745705, 113.72281580436439], 16);
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19,
}).addTo(map);
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
maxZoom: 19,
}).addTo(mapEdit);
var iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
popupAnchor: [0, -50],
});
currentMarker = L.marker([-8.157416852745705, 113.72281580436439], {
icon: iconMarker,
draggable: true,
})
.addTo(map)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
);
currentMarkerEdit = L.marker([-8.157416852745705, 113.72281580436439], {
icon: iconMarker,
draggable: true,
})
.addTo(mapEdit)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
);
$("#showModal").on("shown.bs.modal", function () {
map.invalidateSize();
});
$("#editModal").on("shown.bs.modal", function () {
mapEdit.invalidateSize();
});
map.on("click", onMapClick);
mapEdit.on("click", onMapClick);
});
function getProvinces(provinceId) {
return new Promise(function (resolve, reject) {
$.ajax({
url: "/location/get-province",
type: "GET",
success: function (response) {
if (response.success) {
const province = response.data.find(
(province) => province.id == provinceId
);
resolve(province);
} else {
reject(new Error("Terjadi kesalahan saat mengambil data"));
}
},
error: function (xhr, status, error) {
reject(new Error("Terjadi kesalahan saat mengambil data"));
},
});
});
}
function getRegencies(provinceId) {
regencyContainer.style.display = "none";
regencyEditContainer.style.display = "none";
districtContainer.style.display = "none";
districtEditContainer.style.display = "none";
addressContainer.style.display = "none";
addressEditContainer.style.display = "none";
loading.style.display = "block";
loadingEdit.style.display = "block";
mapContainer.style.display = "none";
mapEditConatiner.style.display = "none";
const url = "/location/get-regency/" + provinceId;
$.ajax({
url: url,
type: "GET",
success: function (response) {
if (response.success) {
loading.style.display = "none";
loadingEdit.style.display = "none";
const data = response.data;
regencyVal.clearStore();
regencyVal.clearChoices();
regencyEditVal.clearStore();
regencyEditVal.clearChoices();
regencyVal.value = "";
regencyVal.setChoices([
{
value: "",
label: "Pilih Kabupaten",
selected: true,
disabled: true,
},
]);
regencyEditVal.value = "";
regencyEditVal.setChoices([
{
value: "",
label: "Pilih Kabupaten",
selected: true,
disabled: true,
},
]);
if (Array.isArray(data)) {
regencyVal.setChoices(
data.map((regency) => ({
value: regency.id,
label: regency.name,
selected: false,
disabled: false,
}))
);
regencyEditVal.setChoices(
data.map((regency) => ({
value: regency.id,
label: regency.name,
selected: false,
disabled: false,
}))
);
regencyContainer.style.display = "block";
regencyEditContainer.style.display = "block";
} else {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
error: function (xhr, status, error) {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
},
});
}
function getDistricts(regencyId) {
districtContainer.style.display = "none";
districtEditContainer.style.display = "none";
addressContainer.style.display = "none";
addressEditContainer.style.display = "none";
loading.style.display = "block";
loadingEdit.style.display = "block";
mapContainer.style.display = "none";
mapEditConatiner.style.display = "none";
const url = "/location/get-district/" + regencyId;
$.ajax({
url: url,
type: "GET",
success: function (response) {
if (response.success) {
loading.style.display = "none";
loadingEdit.style.display = "none";
const data = response.data;
districtVal.clearStore();
districtVal.clearChoices();
districtEditVal.clearStore();
districtEditVal.clearChoices();
districtVal.value = "";
districtVal.setChoices([
{
value: "",
label: "Pilih Kecamatan",
selected: true,
disabled: true,
},
]);
districtEditVal.value = "";
districtEditVal.setChoices([
{
value: "",
label: "Pilih Kecamatan",
selected: true,
disabled: true,
},
]);
if (Array.isArray(data)) {
districtVal.setChoices(
data.map((district) => ({
value: district.id,
label: district.name,
selected: false,
disabled: false,
}))
);
districtEditVal.setChoices(
data.map((district) => ({
value: district.id,
label: district.name,
selected: false,
disabled: false,
}))
);
districtContainer.style.display = "block";
districtEditContainer.style.display = "block";
} else {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
error: function (xhr, status, error) {
mapContainer.style.display = "block";
mapContainer.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
},
});
}
function showmap(districtId) {
loading.style.display = "block";
loadingEdit.style.display = "block";
if (!navigator.geolocation) {
alert("Geolocation tidak didukung oleh browser ini.");
return;
}
navigator.geolocation.getCurrentPosition(
function (position) {
loading.style.display = "none";
loadingEdit.style.display = "none";
mapContainer.style.display = "block";
map.invalidateSize();
addressContainer.style.display = "block";
mapEditConatiner.style.display = "block";
mapEdit.invalidateSize();
addressEditContainer.style.display = "block";
btnContainer.style.display = "block";
btnEditContainer.style.display = "block";
var lat = position.coords.latitude;
var lng = position.coords.longitude;
console.log(lat, lng);
map.setView([lat, lng], 16);
mapEdit.setView([lat, lng], 16);
if (currentMarker) {
map.removeLayer(currentMarker);
}
if (currentMarker || currentMarkerEdit) {
map.removeLayer(currentMarker);
mapEdit.removeLayer(currentMarkerEdit);
}
var iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
popupAnchor: [0, -50],
});
currentMarker = L.marker([lat, lng], {
icon: iconMarker,
draggable: true,
}).addTo(map);
currentMarkerEdit = L.marker([lat, lng], {
icon: iconMarker,
draggable: true,
}).addTo(mapEdit);
currentMarker.on("dragend", onPointerDragend);
currentMarkerEdit.on("dragend", onPointerDragend);
currentMarker
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
)
.openPopup();
currentMarkerEdit
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
)
.openPopup();
latField.value = lat;
lngField.value = lng;
latEditField.value = lat;
lngEditField.value = lng;
},
function (error) {
alert("Error: " + error.message);
}
);
}
async function updateData(data) {
const land = data.land;
const userRole = data.role;
var ownerEditField = formEdit.querySelector("#owner-edit-field");
var noHpEditField = formEdit.querySelector("#nohp-edit-field");
var rentalPriceEditField = formEdit.querySelector(
"#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", {
style: "currency",
currency: "IDR",
minimumFractionDigits: 0,
}).format(land.rental_price);
ownerEditField.value = land.owner;
noHpEditField.value = land.no_hp;
rentalPriceEditField.value = rentalPrice.replace(/Rp\s?/g, "").trim();
rentalStartEditField.value = land.rental_start;
rentalUntilEditField.value = land.rental_until;
landNameEditField.value = land.land_name;
provinceEditField.value = land.province_code;
try {
const province = await getProvinces(land.province_code);
provinceEditVal.setChoices([
{
value: province.id,
label: province.name,
selected: true,
disabled: true,
},
]);
$.ajax({
type: "GET",
url: "/location/get-regency/" + land.province_code,
success: function (response) {
if (response.success) {
const dataRegencies = response.data;
const regencies = response.data.find(
(regency) => regency.id === parseInt(land.regency_code)
);
regencyEditVal.setChoices([
{
value: regencies.id,
label: regencies.name,
selected: true,
disabled: true,
},
]);
if (Array.isArray(dataRegencies)) {
regencyEditVal.setChoices(
dataRegencies.map((regency) => ({
value: regency.id,
label: regency.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>";
}
}
},
});
$.ajax({
type: "GET",
url: "/location/get-district/" + land.regency_code,
success: function (response) {
if (response.success) {
const dataDistricts = response.data;
const districts = response.data.find(
(district) =>
district.id === parseInt(land.district_code)
);
districtEditVal.setChoices([
{
value: districts.id,
label: districts.name,
selected: true,
disabled: true,
},
]);
if (Array.isArray(dataDistricts)) {
districtEditVal.setChoices(
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";
addressEditField.value = land.address;
mapEdit.setView([land.latitude, land.longitude], 16);
currentMarkerEdit
.setLatLng([land.latitude, land.longitude])
.openPopup();
latEditField.value = land.latitude;
lngEditField.value = land.longitude;
if (userRole === "admin") {
formEdit.action = "/data-lahan/" + land.id;
} else {
formEdit.action = "/data-lahan-petugas/" + land.id;
}
} catch (error) {
console.log(error);
}
}
function deleteData(data) { function deleteData(data) {
const landId = data.landId; const landId = data.landId;
const userRole = data.role; const userRole = data.role;
@ -545,72 +11,6 @@ function deleteData(data) {
} }
} }
function onMapClick(e) {
var lat = e.latlng.lat;
var lng = e.latlng.lng;
if (!currentMarker || !currentMarkerEdit) {
currentMarker = L.marker(e.latlng).addTo(map);
currentMarkerEdit = L.marker(e.latlng).addTo(mapEdit);
} else {
currentMarker.setLatLng(e.latlng);
currentMarkerEdit.setLatLng(e.latlng);
}
currentMarker.on("dragend", onPointerDragend);
currentMarkerEdit.on("dragend", onPointerDragend);
currentMarker
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
)
.openPopup();
currentMarkerEdit
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
)
.openPopup();
latField.value = lat;
lngField.value = lng;
}
function onPointerDragend() {
if (!currentMarker) return;
var coordinates = currentMarker.getLatLng();
currentMarker
.setLatLng(coordinates)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan priksa lokasi petamu sudah benar.</div>`
)
.openPopup();
latField.value = coordinates.lat;
lngField.value = coordinates.lng;
}
function validatePhoneNumber(input) {
input.value = input.value.replace(/\D/g, "");
if (input.value.length < 10 || input.value.length > 13) {
input.setCustomValidity("Nomor telepon tidak valid");
} else {
input.setCustomValidity("");
}
}
function validatePrice(input) {
let value = input.value.replace(/\D/g, "");
let formatted = new Intl.NumberFormat("id-ID", {
style: "currency",
currency: "IDR",
minimumFractionDigits: 0,
}).format(value);
input.value = formatted.replace("Rp", "").trim();
}
var checkAll = document.getElementById("checkAll"); var checkAll = document.getElementById("checkAll");
checkAll && checkAll &&
(checkAll.onclick = function () { (checkAll.onclick = function () {
@ -722,67 +122,55 @@ function updateList() {
})), })),
userList.update(); userList.update();
} }
filterContact("All"), filterContact("All"), ischeckboxcheck(), document.getElementById("showModal");
ischeckboxcheck(), document.querySelector("#customerList").addEventListener("click", function () {
document
.getElementById("showModal")
.addEventListener("hidden.bs.modal", function () {
clearFields();
}),
document
.querySelector("#customerList")
.addEventListener("click", function () {
ischeckboxcheck(); ischeckboxcheck();
}); });
var table = document.getElementById("customerTable"), var table = document.getElementById("customerTable"),
tr = table.getElementsByTagName("tr"), tr = table.getElementsByTagName("tr"),
trlist = table.querySelectorAll(".list tr"), trlist = table.querySelectorAll(".list tr"),
count = Number(isValue.replace(/[^0-9]/g, "")) + 1; count = Number(isValue.replace(/[^0-9]/g, "")) + 1;
addBtn.addEventListener("click", function (e) { // addBtn.addEventListener("click", function (e) {
"" !== customerNameField.value && // "" !== customerNameField.value &&
"" !== emailField.value && // "" !== emailField.value &&
"" !== dateField.value && // "" !== dateField.value &&
"" !== phoneField.value && // "" !== phoneField.value &&
(customerList.add({ // (customerList.add({
id: // id:
'<a href="javascript:void(0);" class="fw-medium link-primary">#VZ' + // '<a href="javascript:void(0);" class="fw-medium link-primary">#VZ' +
count + // count +
"</a>", // "</a>",
customer_name: customerNameField.value, // customer_name: customerNameField.value,
email: emailField.value, // email: emailField.value,
date: dateField.value, // date: dateField.value,
phone: phoneField.value, // phone: phoneField.value,
status: isStatus(statusField.value), // status: isStatus(statusField.value),
}), // }),
document.getElementById("close-modal").click(), // document.getElementById("close-modal").click(),
clearFields(), // clearFields(),
filterContact("All"), // filterContact("All"),
count++); // count++);
}), // }),
editBtn.addEventListener("click", function (e) { // editBtn.addEventListener("click", function (e) {
(document.getElementById("exampleModalLabel").innerHTML = // (document.getElementById("exampleModalLabel").innerHTML = "Edit Customer"),
"Edit Customer"), // customerList.get({ id: idField.value }).forEach(function (e) {
customerList.get({ id: idField.value }).forEach(function (e) { // (isid = new DOMParser().parseFromString(e._values.id, "text/html")),
(isid = new DOMParser().parseFromString( // isid.body.firstElementChild.innerHTML == itemId &&
e._values.id, // e.values({
"text/html" // id:
)), // '<a href="javascript:void(0);" class="fw-medium link-primary">' +
isid.body.firstElementChild.innerHTML == itemId && // idField.value +
e.values({ // "</a>",
id: // customer_name: customerNameField.value,
'<a href="javascript:void(0);" class="fw-medium link-primary">' + // email: emailField.value,
idField.value + // date: dateField.value,
"</a>", // phone: phoneField.value,
customer_name: customerNameField.value, // status: isStatus(statusField.value),
email: emailField.value, // });
date: dateField.value, // }),
phone: phoneField.value, // document.getElementById("close-modal").click(),
status: isStatus(statusField.value), // clearFields();
}); // });
}),
document.getElementById("close-modal").click(),
clearFields();
});
function isStatus(e) { function isStatus(e) {
switch (e) { switch (e) {
case "Active": case "Active":

View File

@ -0,0 +1,372 @@
var mapEdit, drawnItems, drawControl, googleStreets, iconMarker;
var currentMarkerEdit = null;
var formEdit = document.getElementById("edit-form");
var provinceEditField = formEdit.querySelector("#province-edit-field");
var provinceEditVal = new Choices(provinceEditField);
var regencyEditContainer = formEdit.querySelector("#regency-edit-container");
let regencyCode = formEdit.querySelector("#regency-code").dataset.regency;
var regencyEditField = formEdit.querySelector("#regency-edit-field");
var regencyEditVal = new Choices(regencyEditField, {
shouldSort: false,
});
var districtEditContainer = formEdit.querySelector("#district-edit-container");
let districtCode = formEdit.querySelector("#district-code").dataset.district;
var districtEditField = formEdit.querySelector("#district-edit-field");
var districtEditVal = new Choices(districtEditField, {
shouldSort: false,
});
var addressEditContainer = formEdit.querySelector("#address-edit-container");
var addressEditField = formEdit.querySelector("#address-edit-field");
var mapEditConatiner = formEdit.querySelector("#map-edit-container");
var latEditField = formEdit.querySelector("#lat-edit");
var lngEditField = formEdit.querySelector("#lng-edit");
var polygonField = formEdit.querySelector("#polygon-edit");
let latDb = formEdit.querySelector("#lat-db").dataset.lat;
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 btnEditContainer = formEdit.querySelector("#edit-footer");
function initMapEdit() {
mapEdit = L.map("map-edit", {
attributionControl: false,
}).setView([-8.157416852745705, 113.72281580436439], 16);
googleStreets = L.tileLayer(
"http://{s}.google.com/vt?lyrs=m&x={x}&y={y}&z={z}",
{
maxZoom: 20,
subdomains: ["mt0", "mt1", "mt2", "mt3"],
}
).addTo(mapEdit);
iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
popupAnchor: [0, -50],
});
currentMarkerEdit = L.marker([-8.157416852745705, 113.72281580436439], {
icon: iconMarker,
draggable: true,
})
.addTo(mapEdit)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
);
drawnItems = new L.FeatureGroup();
mapEdit.addLayer(drawnItems);
drawControl = new L.Control.Draw({
draw: {
polygon: true, // Izinkan user menggambar polygon
polyline: false,
rectangle: false,
circle: false,
marker: false,
circlemarker: false,
},
edit: {
featureGroup: drawnItems, // Edit hanya objek yang sudah digambar
remove: true, // Izinkan menghapus objek
},
});
mapEdit.addControl(drawControl);
mapEdit.on("draw:created", handleDrawCreated);
mapEdit.on("draw:edited", handleDrawEdited);
mapEdit.on("draw:deleted", handleDrawDeleted);
mapEdit.invalidateSize();
}
document.addEventListener("DOMContentLoaded", function () {
initMapEdit();
getRegencies(provinceEditField.value);
getDistricts(regencyCode);
setMapEdit();
});
function getProvinces(provinceId) {
return new Promise(function (resolve, reject) {
$.ajax({
url: "/location/get-province",
type: "GET",
success: function (response) {
if (response.success) {
const province = response.data.find(
(province) => province.id == provinceId
);
resolve(province);
} else {
reject(new Error("Terjadi kesalahan saat mengambil data"));
}
},
error: function (xhr, status, error) {
reject(new Error("Terjadi kesalahan saat mengambil data"));
},
});
});
}
function getRegencies(provinceId) {
regencyEditContainer.style.display = "none";
districtEditContainer.style.display = "none";
addressEditContainer.style.display = "none";
loadingEdit.style.display = "block";
mapEditConatiner.style.display = "none";
const url = "/location/get-regency/" + provinceId;
$.ajax({
url: url,
type: "GET",
success: function (response) {
if (response.success) {
loadingEdit.style.display = "none";
const data = response.data;
regencyEditVal.clearStore();
regencyEditVal.clearChoices();
regencyEditVal.value = "";
regencyEditVal.setChoices([
{
value: "",
label: "Pilih Kabupaten",
selected: false,
disabled: true,
},
]);
if (Array.isArray(data)) {
regencyEditVal.setChoices(
data.map((regency) => ({
value: regency.id,
label: regency.name,
selected: regency.id == regencyCode,
disabled: false,
}))
);
regencyEditContainer.style.display = "block";
} else {
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
error: function (xhr, status, error) {
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
},
});
}
function getDistricts(regencyId) {
districtEditContainer.style.display = "none";
addressEditContainer.style.display = "none";
loadingEdit.style.display = "block";
mapEditConatiner.style.display = "none";
handleDrawDeleted();
const url = "/location/get-district/" + regencyId;
$.ajax({
url: url,
type: "GET",
success: function (response) {
if (response.success) {
loadingEdit.style.display = "none";
const data = response.data;
districtEditVal.clearStore();
districtEditVal.clearChoices();
districtEditVal.value = "";
districtEditVal.setChoices([
{
value: "",
label: "Pilih Kecamatan",
selected: false,
disabled: true,
},
]);
if (Array.isArray(data)) {
districtEditVal.setChoices(
data.map((district) => ({
value: district.id,
label: district.name,
selected: district.id == districtCode,
disabled: false,
}))
);
districtEditContainer.style.display = "block";
} else {
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
}
}
},
error: function (xhr, status, error) {
mapEditConatiner.style.display = "block";
mapEditConatiner.innerHTML =
"<p class='text-center text-muted'>Terjadi kesalaahan saat mengambil data, silahkan coba beberapa saat lagi</p>";
},
});
}
function showmap(districtId) {
loadingEdit.style.display = "block";
if (!navigator.geolocation) {
alert("Geolocation tidak didukung oleh browser ini.");
return;
}
navigator.geolocation.getCurrentPosition(
function (position) {
loadingEdit.style.display = "none";
mapEditConatiner.style.display = "block";
mapEdit.invalidateSize();
addressEditContainer.style.display = "block";
btnEditContainer.style.display = "block";
var lat = position.coords.latitude;
var lng = position.coords.longitude;
console.log(lat, lng);
mapEdit.setView([lat, lng], 16);
if (currentMarkerEdit) {
mapEdit.removeLayer(currentMarkerEdit);
}
var iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
popupAnchor: [0, -50],
});
currentMarkerEdit = L.marker([lat, lng], {
icon: iconMarker,
draggable: true,
}).addTo(mapEdit);
currentMarkerEdit.on("dragend", onPointerDragend);
currentMarkerEdit
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
)
.openPopup();
latEditField.value = lat;
lngEditField.value = lng;
},
function (error) {
alert("Error: " + error.message);
}
);
}
function setMapEdit() {
loadingEdit.style.display = "block";
mapEditConatiner.style.display = "block";
mapEdit.invalidateSize();
addressEditContainer.style.display = "block";
btnEditContainer.style.display = "block";
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) {
mapEdit.removeLayer(currentMarkerEdit);
}
var iconMarker = L.icon({
iconUrl: "/assets/images/marker.png",
iconSize: [50, 50],
iconAnchor: [25, 50],
popupAnchor: [0, -50],
});
currentMarkerEdit = L.marker([latDb, lngDb], {
icon: iconMarker,
draggable: true,
}).addTo(mapEdit);
currentMarkerEdit.on("dragend", onPointerDragend);
currentMarkerEdit
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
)
.openPopup();
}
function handleDrawCreated(e) {
var layer = e.layer;
drawnItems.addLayer(layer);
var coordinates = layer.getLatLngs()[0];
console.log("Koordinat Polygon:", coordinates);
polygonField.value = JSON.stringify(coordinates);
layer.bindPopup("<b>Petak Lahan Berhasil Dibuat!</b>").openPopup();
btnEditContainer.style.display = "block";
}
function handleDrawEdited(e) {
var layers = e.layers;
layers.eachLayer(function (layer) {
var coordinates = layer.getLatLngs();
console.log("Koordinat setelah diedit:", coordinates);
polygonField.value = JSON.stringify(coordinates);
layer.bindPopup("<b>Petak Lahan Berhasil Diedit!</b>").openPopup();
});
}
function handleDrawDeleted(e) {
drawnItems.clearLayers();
polygonField.value = "";
}
function onPointerDragend() {
if (!currentMarkerEdit) return;
var coordinates = currentMarkerEdit.getLatLng();
currentMarkerEdit
.setLatLng(coordinates)
.bindPopup(
`<div class="text-center"><b>Anda berada di sini</b><br />Silahkan tentukan petak lahan.<br />Pastikan lokasi anda sudah benar.</div>`
)
.openPopup();
latEditField.value = coordinates.lat;
lngEditField.value = coordinates.lng;
}

View File

@ -1 +1,12 @@
(document.querySelectorAll("[toast-list]")||document.querySelectorAll("[data-choices]")||document.querySelectorAll("[data-provider]"))&&(document.writeln("<script type='text/javascript' src='https://cdn.jsdelivr.net/npm/toastify-js'><\/script>"),document.writeln("<script type='text/javascript' src='assets/libs/choices.js/public/assets/scripts/choices.min.js'><\/script>"),document.writeln("<script type='text/javascript' src='assets/libs/flatpickr/flatpickr.min.js'><\/script>")); (document.querySelectorAll("[toast-list]") ||
document.querySelectorAll("[data-choices]") ||
document.querySelectorAll("[data-provider]")) &&
(document.writeln(
"<script type='text/javascript' src='https://cdn.jsdelivr.net/npm/toastify-js'></script>"
),
document.writeln(
"<script type='text/javascript' src='/assets/libs/choices.js/public/assets/scripts/choices.min.js'></script>"
),
document.writeln(
"<script type='text/javascript' src='/assets/libs/flatpickr/flatpickr.min.js'></script>"
));

View File

@ -9,18 +9,18 @@
<meta content="Premium Multipurpose Admin & Dashboard Template" name="description" /> <meta content="Premium Multipurpose Admin & Dashboard Template" name="description" />
<meta content="Themesbrand" name="author" /> <meta content="Themesbrand" name="author" />
<!-- App favicon --> <!-- App favicon -->
<link rel="shortcut icon" href="assets/images/favicon.ico"> <link rel="shortcut icon" href="{{ asset('assets/images/favicon.ico') }}">
<!-- Layout config Js --> <!-- Layout config Js -->
<script src="assets/js/layout.js"></script> <script src="{{ asset('assets/js/layout.js') }}"></script>
<!-- Bootstrap Css --> <!-- Bootstrap Css -->
<link href="assets/css/bootstrap.min.css" rel="stylesheet" type="text/css" /> <link href="{{ asset('assets/css/bootstrap.min.css') }}" rel="stylesheet" type="text/css" />
<!-- Icons Css --> <!-- Icons Css -->
<link href="assets/css/icons.min.css" rel="stylesheet" type="text/css" /> <link href="{{ asset('assets/css/icons.min.css') }}" rel="stylesheet" type="text/css" />
<!-- App Css--> <!-- App Css-->
<link href="assets/css/app.min.css" rel="stylesheet" type="text/css" /> <link href="{{ asset('assets/css/app.min.css') }}" rel="stylesheet" type="text/css" />
<!-- custom Css--> <!-- custom Css-->
<link href="assets/css/custom.min.css" rel="stylesheet" type="text/css" /> <link href="{{ asset('assets/css/custom.min.css') }}" rel="stylesheet" type="text/css" />
@stack('other-css') @stack('other-css')
</head> </head>
@ -594,18 +594,19 @@ class="form-check-input">
@include('sweetalert::alert') @include('sweetalert::alert')
<!-- JAVASCRIPT --> <!-- JAVASCRIPT -->
<script src="assets/libs/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="{{ asset('assets/libs/bootstrap/js/bootstrap.bundle.min.js') }}"></script>
<script src="assets/libs/simplebar/simplebar.min.js"></script> <script src="{{ asset('assets/libs/simplebar/simplebar.min.js') }}"></script>
<script src="assets/libs/node-waves/waves.min.js"></script> <script src="{{ asset('assets/libs/node-waves/waves.min.js') }}"></script>
<script src="assets/libs/feather-icons/feather.min.js"></script> <script src="{{ asset('assets/libs/feather-icons/feather.min.js') }}"></script>
<script src="assets/js/pages/plugins/lord-icon-2.1.0.js"></script> <script src="{{ asset('assets/js/pages/plugins/lord-icon-2.1.0.js') }}"></script>
<script src="assets/js/plugins.js"></script> <script src="{{ asset('assets/js/plugins.js') }}"></script>
@stack('other-js') @stack('other-js')
<!-- App js --> <!-- App js -->
<script src="assets/js/customApp.js"></script> <script src="{{ asset('assets/js/app.js') }}"></script>
<script src="assets/libs/jquery/jquery.min.js"></script> <script src="{{ asset('assets/libs/jquery/jquery.min.js') }}"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
</body> </body>
</html> </html>

View File

@ -0,0 +1,171 @@
@extends('layouts.app')
@push('title', 'Tambah Data Lahan')
@section('content')
@push('other-css')
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" />
<!-- Leaflet Draw CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" />
<style>
#map {
height: 400px;
width: 100%;
z-index: 0;
}
</style>
@endpush
<div class="page-content">
<div class="container-fluid">
<!-- start page title -->
<div class="row">
<div class="col-12">
<div class="page-title-box d-sm-flex align-items-center justify-content-between">
<h4 class="mb-sm-0">Tambah Data Lahan</h4>
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="javascript: void(0);">Master Data</a></li>
<li class="breadcrumb-item active">Tambah Data Lahan</li>
</ol>
</div>
</div>
</div>
</div>
<!-- end page title -->
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Tambah Data Lahan</h4>
</div>
<div class="card-body">
<form id="add-form" class="needs-validation" method="POST" novalidate
action="{{ Auth::user()->role == 'admin' ? route('master_data.lahan.store') : route('lahan.store') }}">
@csrf
<div class="modal-body">
<div class="mb-3" id="modal-id" style="display: none;">
<label for="id-field" class="form-label">ID</label>
<input type="text" id="id-field" class="form-control" placeholder="ID"
readonly />
</div>
<div class="mb-3">
<label for="owner-field" class="form-label">Pemilik Lahan</label>
<input type="text" id="owner-field" class="form-control" name="owner"
value="{{ old('owner') }}" placeholder="Masukan Nama Pemilik Lahan" required />
<div class="invalid-feedback">
Masukan Nama Pemilik Lahan
</div>
</div>
{{-- <div class="mb-3">
<label for="landname-field" class="form-label">Nama Lahan</label>
<input type="text" id="landname-field" class="form-control" name="land_name"
value="{{ old('land_name') }}" placeholder="Masukan Nama Lahan" required />
<div class="invalid-feedback">
Masukan Nama Lahan
</div>
</div> --}}
<div class="mb-3">
<label for="province-field" class="form-label">Provinsi</label>
<select name="province_id" id="province-field" class="form-control" required
onchange="getRegencies(this.value)">
<option value="" selected disabled>Pilih Provinsi</option>
@foreach ($provinces as $province)
<option value="{{ $province->id }}"
{{ old('province_id') == $province->id ? 'selected' : '' }}>
{{ $province->name }}</option>
@endforeach
</select>
<div class="invalid-feedback">
Harap Pilih Provinsi
</div>
</div>
<div class="mb-3" id="regency-container" style="display: none">
<label for="regency-field" class="form-label">Kabupaten atau Kota</label>
<select name="regency_id" id="regency-field" class="form-control" required
onchange="getDistricts(this.value)">
<option value="" selected disabled>Pilih Kabupaten atau Kota</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kabupaten atau Kota
</div>
</div>
<div class="mb-3" id="district-container" style="display: none">
<label for="district-field" class="form-label">Kecamatan</label>
<select name="district_id" id="district-field" class="form-control" required
onchange="showmap(this.value)">
<option value="" selected disabled>Pilih Kecamatan</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kecamatan
</div>
</div>
<div id="loading" class="text-center" style="display: none">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<div class="mb-3" id="address-container" style="display: none">
<label for="address-field" class="form-label">Alamat</label>
<textarea name="address" id="address-field" rows="3" class="form-control"
placeholder="Masukan Alamat, cnth: Jl. Jend. Sudirman No. 12" required></textarea>
<div class="invalid-feedback">
Masukan Alamat
</div>
</div>
<div id="map-container" style="display: none">
<label for="map" class="form-label">Lokasi</label>
<div id="map"></div>
<div class="mt-3">
<input type="hidden" name="lat" id="lat" class="form-control"
readonly>
<input type="hidden" name="lng" id="lng" class="form-control"
readonly>
</div>
<div class="mt-3">
<input type="hidden" name="polygon" id="polygon" class="form-control"
readonly>
</div>
</div>
</div>
<div class="modal-footer" id="add-footer" style="display: none">
<div class="hstack gap-2 justify-content-end">
<button type="button" class="btn btn-light"
data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-success" id="add-btn">Simpan</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@push('other-js')
<script src="{{ asset('assets/js/pages/customJs/master-data/lahan/create.js') }}"></script>
<script src="{{ asset('assets/js/pages/form-validation.init.js') }}"></script>
<!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script>
@endpush
@endsection

View File

@ -0,0 +1,181 @@
@extends('layouts.app')
@push('title', 'Edit Data Lahan')
@section('content')
@push('other-css')
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" />
<!-- Leaflet Draw CSS -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" />
<style>
#map-edit {
height: 400px;
width: 100%;
z-index: 0;
}
</style>
@endpush
<div class="page-content">
<div class="container-fluid">
<!-- start page title -->
<div class="row">
<div class="col-12">
<div class="page-title-box d-sm-flex align-items-center justify-content-between">
<h4 class="mb-sm-0">Edit Data Lahan</h4>
<div class="page-title-right">
<ol class="breadcrumb m-0">
<li class="breadcrumb-item"><a href="javascript: void(0);">Master Data</a></li>
<li class="breadcrumb-item active">Edit Data Lahan</li>
</ol>
</div>
</div>
</div>
</div>
<!-- end page title -->
<div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Edit Data Lahan</h4>
</div>
<div class="card-body">
<form id="edit-form"
action="{{ Auth::user()->role == 'admin' ? route('master_data.lahan.update', $land->id) : route('lahan.update', $land->id) }}"
method="POST" class="needs-validation" novalidate>
@csrf
@method('PUT')
<div class="modal-body">
<div class="mb-3" id="modal-id" style="display: none;">
<label for="id-field" class="form-label">ID</label>
<input type="text" id="id-field" class="form-control" placeholder="ID"
readonly />
</div>
<div class="mb-3">
<label for="owner-edit-field" class="form-label">Pemilik Lahan</label>
<input type="text" id="owner-edit-field" class="form-control" name="owner"
value="{{ old('owner', $land->owner) }}"
placeholder="Masukan Nama Pemilik Lahan" required />
<div class="invalid-feedback">
Masukan Nama Pemilik Lahan
</div>
</div>
{{-- <div class="mb-3">
<label for="landname-edit-field" class="form-label">Nama Lahan</label>
<input type="text" id="landname-edit-field" class="form-control" name="land_name"
value="{{ old('land_name') }}" placeholder="Masukan Nama Lahan" required />
<div class="invalid-feedback">
Masukan Nama Lahan
</div>
</div> --}}
<div class="mb-3">
<label for="province-edit-field" class="form-label">Provinsi</label>
<select name="province_id" id="province-edit-field" class="form-control" required
onchange="getRegencies(this.value)">
<option value="" selected disabled>Pilih Provinsi</option>
@foreach ($provinces as $province)
<option value="{{ $province->id }}"
{{ old('province_id', $land->province_code) == $province->id ? 'selected' : '' }}>
{{ $province->name }}</option>
@endforeach
</select>
<div class="invalid-feedback">
Harap Pilih Provinsi
</div>
</div>
<div class="mb-3" id="regency-edit-container">
<label for="regency-edit-field" class="form-label">Kabupaten atau Kota</label>
<input type="hidden" id="regency-code" data-regency="{{ $land->regency_code }}">
<select name="regency_id" id="regency-edit-field" class="form-control" required
onchange="getDistricts(this.value)">
<option value="" selected disabled>Pilih Kabupaten atau Kota</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kabupaten atau Kota
</div>
</div>
<div class="mb-3" id="district-edit-container">
<label for="district-edit-field" class="form-label">Kecamatan</label>
<input type="hidden" id="district-code" data-district="{{ $land->district_code }}">
<select name="district_id" id="district-edit-field" class="form-control" required
onchange="showmap(this.value)">
<option value="" selected disabled>Pilih Kecamatan</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kecamatan
</div>
</div>
<div id="loading-edit" class="text-center" style="display: none">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<div class="mb-3" id="address-edit-container">
<label for="address-edit-field" class="form-label">Alamat</label>
<textarea name="address" id="address-edit-field" rows="3" class="form-control"
placeholder="Masukan Alamat, cnth: Jl. Jend. Sudirman No. 12" required>{{ old('address', $land->address) }}</textarea>
<div class="invalid-feedback">
Masukan Alamat
</div>
</div>
<div id="map-edit-container">
<label for="map-edit" class="form-label">Lokasi</label>
<div id="map-edit"></div>
<div class="mt-3">
<input type="hidden" name="lat" id="lat-edit" class="form-control"
value="{{ $land->latitude }}" readonly>
<input type="hidden" name="lng" id="lng-edit" class="form-control"
value="{{ $land->longitude }}" 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="lng-db" data-lng={{ $land->longitude }}>
<input type="hidden" id="polygon-db"
data-polygon="{{ json_encode($landDetails) }}">
</div>
</div>
</div>
<div class="modal-footer" id="edit-footer">
<div class="hstack gap-2 justify-content-end">
<a href="{{ route('master_data.lahan.index') }}"
class="btn btn-light">Kembali</a>
<button type="submit" class="btn btn-success" id="edit-btn">Update</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
@push('other-js')
<script src="{{ asset('assets/js/pages/customJs/master-data/lahan/update.js') }}"></script>
<script src="{{ asset('assets/js/pages/form-validation.init.js') }}"></script>
<!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo=" crossorigin=""></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script>
@endpush
@endsection

View File

@ -1,24 +1,6 @@
@extends('layouts.app') @extends('layouts.app')
@push('title', 'Data Lahan') @push('title', 'Data Lahan')
@section('content') @section('content')
@push('other-css')
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" crossorigin="" />
<style>
#map {
height: 200px;
width: 100%;
z-index: 0;
}
#map-edit {
height: 200px;
width: 100%;
z-index: 0;
}
</style>
@endpush
<div class="page-content"> <div class="page-content">
<div class="container-fluid"> <div class="container-fluid">
@ -52,9 +34,10 @@
<div class="row g-4 mb-3"> <div class="row g-4 mb-3">
<div class="col-sm-auto"> <div class="col-sm-auto">
<div> <div>
<button type="button" class="btn btn-success add-btn" data-bs-toggle="modal" <a href="{{ Auth::user()->role == 'admin' ? route('master_data.lahan.create') : route('lahan.create') }}"
id="create-btn" data-bs-target="#showModal"><i class="btn btn-success add-btn" id="create-btn"><i
class="ri-add-line align-bottom me-1"></i> Tambah</button> class="ri-add-line align-bottom me-1"></i>
Tambah</a>
</div> </div>
</div> </div>
<div class="col-sm"> <div class="col-sm">
@ -72,10 +55,8 @@ class="ri-add-line align-bottom me-1"></i> Tambah</button>
<thead class="table-light"> <thead class="table-light">
<tr class="text-center"> <tr class="text-center">
<th class="sort" data-sort="no">No</th> <th class="sort" data-sort="no">No</th>
<th class="sort" data-sort="land_name">Nama Lahan</th>
<th class="sort" data-sort="owner">Pemilik</th> <th class="sort" data-sort="owner">Pemilik</th>
<th class="sort" data-sort="rental_price">Harga Sewa</th> <th class="sort" data-sort="address">Alamat</th>
<th class="sort" data-sort="length_of_ease">Lama Sewa</th>
<th class="sort" data-sort="action">Action</th> <th class="sort" data-sort="action">Action</th>
</tr> </tr>
</thead> </thead>
@ -85,20 +66,19 @@ class="ri-add-line align-bottom me-1"></i> Tambah</button>
<td class="no">{{ $loop->iteration }}</td> <td class="no">{{ $loop->iteration }}</td>
<td class="id" style="display:none;"><a href="javascript:void(0);" <td class="id" style="display:none;"><a href="javascript:void(0);"
class="fw-medium link-primary">#VZ2101</a></td> class="fw-medium link-primary">#VZ2101</a></td>
<td class="land_name">{{ $land->land_name }}</td>
<td class="owner">{{ $land->owner }}</td> <td class="owner">{{ $land->owner }}</td>
<td class="rental_price">Rp.{{ number_format($land->rental_price) }}
</td> </td>
<td class="status"> <td class="status">
<span>{{ \Carbon\Carbon::parse($land->length_of_ease)->diffInDays(\Carbon\Carbon::parse($land->rental_until)) }} <span class="text-capitalize">{{ $land->address }}, Kecamatan
Hari</span> {{ ucwords(strtolower($land->district->name)) }},
{{ ucwords(strtolower($land->regency->name)) }}, Provinsi
{{ ucwords(strtolower($land->province->name)) }}</span>
</td> </td>
<td> <td>
<div class="d-flex gap-2 justify-content-center"> <div class="d-flex gap-2 justify-content-center">
<div class="edit"> <div class="edit">
<button class="btn btn-sm btn-warning edit-item-btn" <a href="{{ Auth::user()->role == 'admin' ? route('master_data.lahan.edit', $land->id) : route('lahan.edit', $land->id) }}"
data-bs-toggle="modal" data-bs-target="#editModal" class="btn btn-sm btn-warning edit-item-btn">Edit</a>
onclick="updateData({{ json_encode(['land' => $land, 'role' => Auth::user()->role]) }})">Edit</button>
</div> </div>
<div class="remove"> <div class="remove">
<button class="btn btn-sm btn-danger remove-item-btn" <button class="btn btn-sm btn-danger remove-item-btn"
@ -143,327 +123,6 @@ class="fw-medium link-primary">#VZ2101</a></td>
</div> </div>
<!-- end row --> <!-- end row -->
{{-- add modal --}}
<div class="modal fade" id="showModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-light p-3">
<h5 class="modal-title" id="exampleModalLabel">Tambah Data Lahan</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"
id="close-modal"></button>
</div>
<form id="add-form" class="needs-validation" method="POST" novalidate
action="{{ Auth::user()->role == 'admin' ? route('master_data.lahan.store') : route('lahan.store') }}">
@csrf
<div class="modal-body">
<div class="mb-3" id="modal-id" style="display: none;">
<label for="id-field" class="form-label">ID</label>
<input type="text" id="id-field" class="form-control" placeholder="ID"
readonly />
</div>
<div class="mb-3">
<label for="owner-field" class="form-label">Pemilik Lahan</label>
<input type="text" id="owner-field" class="form-control" name="owner"
value="{{ old('owner') }}" placeholder="Masukan Nama Pemilik Lahan" required />
<div class="invalid-feedback">
Masukan Nama Pemilik Lahan
</div>
</div>
<div class="mb-3">
<label for="nohp-field" class="form-label">Nomor HP</label>
<input type="text" id="nohp-field" class="form-control" name="nohp"
value="{{ old('nohp') }}" placeholder="Masukan Nomor HP" required
oninput="validatePhoneNumber(this)" />
<div class="invalid-feedback">
Masukan Nomor HP
</div>
</div>
<div class="mb-3">
<label for="rentalprice-field" class="form-label">Harga Sewa</label>
<input type="text" id="rentalprice-field" class="form-control"
name="rental_price" value="{{ old('rental_price') }}"
placeholder="Masukan Harga Sewa" required oninput="validatePrice(this)" />
<div class="invalid-feedback">
Masukan Harga Sewa
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="rentalstart-field" class="form-label">Mulai Dari</label>
<input type="date" id="rentalstart-field" class="form-control"
name="rental_start" value="{{ old('rental_start') }}"
min="{{ date('Y-m-d') }}" placeholder="Masukan Tanggal Mulai" required />
<div class="invalid-feedback">
Masukan Tanggal Mulai
</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="rentaluntil-field" class="form-label">Sampai</label>
<input type="date" id="rentaluntil-field" class="form-control"
name="rental_until" value="{{ old('rental_start') }}"
min="{{ date('Y-m-d') }}" placeholder="Masukan Tanggal Sampai"
required />
<div class="invalid-feedback">
Masukan Tanggal Sampai
</div>
</div>
</div>
</div>
<div class="mb-3">
<label for="landname-field" class="form-label">Nama Lahan</label>
<input type="text" id="landname-field" class="form-control" name="land_name"
value="{{ old('land_name') }}" placeholder="Masukan Nama Lahan" required />
<div class="invalid-feedback">
Masukan Nama Lahan
</div>
</div>
<div class="mb-3">
<label for="province-field" class="form-label">Provinsi</label>
<select name="province_id" id="province-field" class="form-control" required
onchange="getRegencies(this.value)">
<option value="" selected disabled>Pilih Provinsi</option>
@foreach ($provinces as $province)
<option value="{{ $province->id }}"
{{ old('province_id') == $province->id ? 'selected' : '' }}>
{{ $province->name }}</option>
@endforeach
</select>
<div class="invalid-feedback">
Harap Pilih Provinsi
</div>
</div>
<div class="mb-3" id="regency-container" style="display: none">
<label for="regency-field" class="form-label">Kabupaten atau Kota</label>
<select name="regency_id" id="regency-field" class="form-control" required
onchange="getDistricts(this.value)">
<option value="" selected disabled>Pilih Kabupaten atau Kota</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kabupaten atau Kota
</div>
</div>
<div class="mb-3" id="district-container" style="display: none">
<label for="district-field" class="form-label">Kecamatan</label>
<select name="district_id" id="district-field" class="form-control" required
onchange="showmap(this.value)">
<option value="" selected disabled>Pilih Kecamatan</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kecamatan
</div>
</div>
<div id="loading" class="text-center" style="display: none">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<div class="mb-3" id="address-container" style="display: none">
<label for="address-field" class="form-label">Alamat</label>
<textarea name="address" id="address-field" rows="3" class="form-control"
placeholder="Masukan Alamat, cnth: Jl. Jend. Sudirman No. 12" required></textarea>
<div class="invalid-feedback">
Masukan Alamat
</div>
</div>
<div id="map-container" style="display: none">
<label for="map" class="form-label">Lokasi</label>
<div id="map"></div>
<div class="mt-3">
<input type="hidden" name="lat" id="lat" class="form-control"
readonly>
<input type="hidden" name="lng" id="lng" class="form-control"
readonly>
</div>
</div>
</div>
<div class="modal-footer" id="add-footer" style="display: none">
<div class="hstack gap-2 justify-content-end">
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-success" id="add-btn">Simpan</button>
</div>
</div>
</form>
</div>
</div>
</div>
{{-- edit modal --}}
<div class="modal fade" id="editModal" tabindex="-1" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header bg-light p-3">
<h5 class="modal-title" id="exampleModalLabel">Edit Data Lahan</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"
id="close-modal"></button>
</div>
<form id="edit-form" action="" method="POST" class="needs-validation" novalidate>
@csrf
@method('PUT')
<div class="modal-body">
<div class="mb-3" id="modal-id" style="display: none;">
<label for="id-field" class="form-label">ID</label>
<input type="text" id="id-field" class="form-control" placeholder="ID"
readonly />
</div>
<div class="mb-3">
<label for="owner-edit-field" class="form-label">Pemilik Lahan</label>
<input type="text" id="owner-edit-field" class="form-control" name="owner"
value="{{ old('owner') }}" placeholder="Masukan Nama Pemilik Lahan" required />
<div class="invalid-feedback">
Masukan Nama Pemilik Lahan
</div>
</div>
<div class="mb-3">
<label for="nohp-edit-field" class="form-label">Nomor HP</label>
<input type="text" id="nohp-edit-field" class="form-control" name="nohp"
value="{{ old('nohp') }}" placeholder="Masukan Nomor HP" required
oninput="validatePhoneNumber(this)" />
<div class="invalid-feedback">
Masukan Nomor HP
</div>
</div>
<div class="mb-3">
<label for="rentalprice-edit-field" class="form-label">Harga Sewa</label>
<input type="text" id="rentalprice-edit-field" class="form-control"
name="rental_price" value="{{ old('rental_price') }}"
placeholder="Masukan Harga Sewa" required oninput="validatePrice(this)" />
<div class="invalid-feedback">
Masukan Harga Sewa
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="rentalstart-edit-field" class="form-label">Mulai Dari</label>
<input type="date" id="rentalstart-edit-field" class="form-control"
name="rental_start" value="{{ old('rental_start') }}"
min="{{ date('Y-m-d') }}" placeholder="Masukan Tanggal Mulai" required />
<div class="invalid-feedback">
Masukan Tanggal Mulai
</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="rentaluntil-edit-field" class="form-label">Sampai</label>
<input type="date" id="rentaluntil-edit-field" class="form-control"
name="rental_until" value="{{ old('rental_start') }}"
min="{{ date('Y-m-d') }}" placeholder="Masukan Tanggal Sampai"
required />
<div class="invalid-feedback">
Masukan Tanggal Sampai
</div>
</div>
</div>
</div>
<div class="mb-3">
<label for="landname-edit-field" class="form-label">Nama Lahan</label>
<input type="text" id="landname-edit-field" class="form-control" name="land_name"
value="{{ old('land_name') }}" placeholder="Masukan Nama Lahan" required />
<div class="invalid-feedback">
Masukan Nama Lahan
</div>
</div>
<div class="mb-3">
<label for="province-edit-field" class="form-label">Provinsi</label>
<select name="province_id" id="province-edit-field" class="form-control" required
onchange="getRegencies(this.value)">
<option value="" selected disabled>Pilih Provinsi</option>
@foreach ($provinces as $province)
<option value="{{ $province->id }}"
{{ old('province_id') == $province->id ? 'selected' : '' }}>
{{ $province->name }}</option>
@endforeach
</select>
<div class="invalid-feedback">
Harap Pilih Provinsi
</div>
</div>
<div class="mb-3" id="regency-edit-container">
<label for="regency-edit-field" class="form-label">Kabupaten atau Kota</label>
<select name="regency_id" id="regency-edit-field" class="form-control" required
onchange="getDistricts(this.value)">
<option value="" selected disabled>Pilih Kabupaten atau Kota</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kabupaten atau Kota
</div>
</div>
<div class="mb-3" id="district-edit-container">
<label for="district-edit-field" class="form-label">Kecamatan</label>
<select name="district_id" id="district-edit-field" class="form-control" required
onchange="showmap(this.value)">
<option value="" selected disabled>Pilih Kecamatan</option>
</select>
<div class="invalid-feedback">
Harap Pilih Kecamatan
</div>
</div>
<div id="loading-edit" class="text-center" style="display: none">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<div class="mb-3" id="address-edit-container" style="display: none">
<label for="address-edit-field" class="form-label">Alamat</label>
<textarea name="address" id="address-edit-field" rows="3" class="form-control"
placeholder="Masukan Alamat, cnth: Jl. Jend. Sudirman No. 12" required></textarea>
<div class="invalid-feedback">
Masukan Alamat
</div>
</div>
<div id="map-edit-container">
<label for="map-edit" class="form-label">Lokasi</label>
<div id="map-edit"></div>
<div class="mt-3">
<input type="hidden" name="lat" id="lat-edit" class="form-control"
readonly>
<input type="hidden" name="lng" id="lng-edit" class="form-control"
readonly>
</div>
</div>
</div>
<div class="modal-footer" id="edit-footer">
<div class="hstack gap-2 justify-content-end">
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-success" id="edit-btn">Update</button>
</div>
</div>
</form>
</div>
</div>
</div>
<!-- Modal --> <!-- Modal -->
<div class="modal fade zoomIn" id="deleteRecordModal" tabindex="-1" aria-hidden="true"> <div class="modal fade zoomIn" id="deleteRecordModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered"> <div class="modal-dialog modal-dialog-centered">
@ -475,8 +134,7 @@ class="fw-medium link-primary">#VZ2101</a></td>
<div class="modal-body"> <div class="modal-body">
<div class="mt-2 text-center"> <div class="mt-2 text-center">
<lord-icon src="https://cdn.lordicon.com/gsqxdxog.json" trigger="loop" <lord-icon src="https://cdn.lordicon.com/gsqxdxog.json" trigger="loop"
colors="primary:#25a0e2,secondary:#00bd9d" colors="primary:#25a0e2,secondary:#00bd9d" style="width:100px;height:100px"></lord-icon>
style="width:100px;height:100px"></lord-icon>
<div class="mt-4 pt-2 fs-15 mx-4 mx-sm-5"> <div class="mt-4 pt-2 fs-15 mx-4 mx-sm-5">
<h4>Anda yakin ?</h4> <h4>Anda yakin ?</h4>
<p class="text-muted mx-4 mb-0">Anda yakin akan menghapus data ini ?</p> <p class="text-muted mx-4 mb-0">Anda yakin akan menghapus data ini ?</p>
@ -506,10 +164,10 @@ class="fw-medium link-primary">#VZ2101</a></td>
<!-- prismjs plugin --> <!-- prismjs plugin -->
<script src="{{ asset('/assets/libs/prismjs/prism.js') }}"></script> <script src="{{ asset('/assets/libs/prismjs/prism.js') }}"></script>
<script src="{{ asset('/assets/libs/list.js/list.min.js') }}"></script> <script src="{{ asset('/assets/libs/list.js/list.min.js') }}"></script>
<script src="{{ asset('assets/libs/list.pagination.js/list.pagination.min.js') }}"></script> <script src="{{ asset('/assets/libs/list.pagination.js/list.pagination.min.js') }}"></script>
<!-- listjs init --> <!-- listjs init -->
<script src="{{ asset('assets/js/pages/customJs/master-data/lahan/index.js') }}"></script> <script src="{{ asset('/assets/js/pages/customJs/master-data/lahan/index.js') }}"></script>
<!-- Make sure you put this AFTER Leaflet's CSS --> <!-- Make sure you put this AFTER Leaflet's CSS -->
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js" <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"

View File

@ -6,19 +6,19 @@
<div class="navbar-brand-box horizontal-logo"> <div class="navbar-brand-box horizontal-logo">
<a href="index.html" class="logo logo-dark"> <a href="index.html" class="logo logo-dark">
<span class="logo-sm"> <span class="logo-sm">
<img src="assets/images/logo-sm.png" alt="" height="22"> <img src="{{ asset('assets/images/logo-sm.png') }}" alt="" height="22">
</span> </span>
<span class="logo-lg"> <span class="logo-lg">
<img src="assets/images/logo-dark.png" alt="" height="17"> <img src="{{ asset('assets/images/logo-dark.png') }}" alt="" height="17">
</span> </span>
</a> </a>
<a href="index.html" class="logo logo-light"> <a href="index.html" class="logo logo-light">
<span class="logo-sm"> <span class="logo-sm">
<img src="assets/images/logo-sm.png" alt="" height="22"> <img src="{{ asset('assets/images/logo-sm.png') }}" alt="" height="22">
</span> </span>
<span class="logo-lg"> <span class="logo-lg">
<img src="assets/images/logo-light.png" alt="" height="17"> <img src="{{ asset('assets/images/logo-light.png') }}" alt="" height="17">
</span> </span>
</a> </a>
</div> </div>
@ -86,7 +86,7 @@
<!-- item --> <!-- item -->
<a href="javascript:void(0);" class="dropdown-item notify-item py-2"> <a href="javascript:void(0);" class="dropdown-item notify-item py-2">
<div class="d-flex"> <div class="d-flex">
<img src="assets/images/users/avatar-2.jpg" <img src="{{ asset('assets/images/users/avatar-2.jpg') }}"
class="me-3 rounded-circle avatar-xs" alt="user-pic"> class="me-3 rounded-circle avatar-xs" alt="user-pic">
<div class="flex-1"> <div class="flex-1">
<h6 class="m-0">Angela Bernier</h6> <h6 class="m-0">Angela Bernier</h6>
@ -97,7 +97,7 @@ class="me-3 rounded-circle avatar-xs" alt="user-pic">
<!-- item --> <!-- item -->
<a href="javascript:void(0);" class="dropdown-item notify-item py-2"> <a href="javascript:void(0);" class="dropdown-item notify-item py-2">
<div class="d-flex"> <div class="d-flex">
<img src="assets/images/users/avatar-3.jpg" <img src="{{ asset('assets/images/users/avatar-3.jpg') }}"
class="me-3 rounded-circle avatar-xs" alt="user-pic"> class="me-3 rounded-circle avatar-xs" alt="user-pic">
<div class="flex-1"> <div class="flex-1">
<h6 class="m-0">David Grasso</h6> <h6 class="m-0">David Grasso</h6>
@ -108,7 +108,7 @@ class="me-3 rounded-circle avatar-xs" alt="user-pic">
<!-- item --> <!-- item -->
<a href="javascript:void(0);" class="dropdown-item notify-item py-2"> <a href="javascript:void(0);" class="dropdown-item notify-item py-2">
<div class="d-flex"> <div class="d-flex">
<img src="assets/images/users/avatar-5.jpg" <img src="{{ asset('assets/images/users/avatar-5.jpg') }}"
class="me-3 rounded-circle avatar-xs" alt="user-pic"> class="me-3 rounded-circle avatar-xs" alt="user-pic">
<div class="flex-1"> <div class="flex-1">
<h6 class="m-0">Mike Bunch</h6> <h6 class="m-0">Mike Bunch</h6>

View File

@ -4,19 +4,19 @@
<!-- Dark Logo--> <!-- Dark Logo-->
<a href="index.html" class="logo logo-dark"> <a href="index.html" class="logo logo-dark">
<span class="logo-sm"> <span class="logo-sm">
<img src="assets/images/logo-sm.png" alt="" height="22"> <img src="{{ asset('assets/images/logo-sm.png') }}" alt="" height="22">
</span> </span>
<span class="logo-lg"> <span class="logo-lg">
<img src="assets/images/logo-dark.png" alt="" height="17"> <img src="{{ asset('assets/images/logo-dark.png') }}" alt="" height="17">
</span> </span>
</a> </a>
<!-- Light Logo--> <!-- Light Logo-->
<a href="index.html" class="logo logo-light"> <a href="index.html" class="logo logo-light">
<span class="logo-sm"> <span class="logo-sm">
<img src="assets/images/logo-sm.png" alt="" height="22"> <img src="{{ asset('assets/images/logo-sm.png') }}" alt="" height="22">
</span> </span>
<span class="logo-lg"> <span class="logo-lg">
<img src="assets/images/logo-light.png" alt="" height="17"> <img src="{{ asset('assets/images/logo-light.png') }}" alt="" height="17">
</span> </span>
</a> </a>
<button type="button" class="btn btn-sm p-0 fs-20 header-item float-end btn-vertical-sm-hover" <button type="button" class="btn btn-sm p-0 fs-20 header-item float-end btn-vertical-sm-hover"

View File

@ -87,8 +87,10 @@
Route::prefix('data-lahan')->controller(LandController::class)->name('lahan.')->group(function () { Route::prefix('data-lahan')->controller(LandController::class)->name('lahan.')->group(function () {
Route::get('/', 'index')->name('index'); Route::get('/', 'index')->name('index');
Route::get('/tambah', 'create')->name('create');
Route::post('/', 'store')->name('store'); Route::post('/', 'store')->name('store');
Route::put('/{id}', 'update')->name('update'); Route::get('/edit/{id}', 'edit')->name('edit');
Route::put('/edit/{id}', 'update')->name('update');
Route::delete('/{id}', 'destroy')->name('destroy'); Route::delete('/{id}', 'destroy')->name('destroy');
}); });
@ -126,8 +128,10 @@
Route::prefix('data-lahan-petugas')->controller(LandController::class)->name('lahan.')->group(function () { Route::prefix('data-lahan-petugas')->controller(LandController::class)->name('lahan.')->group(function () {
Route::get('/', 'index')->name('index'); Route::get('/', 'index')->name('index');
Route::post('/', 'store')->name('store'); Route::get('/tambah', 'create')->name('create');
Route::put('/{id}', 'update')->name('update'); Route::post('/tambah', 'store')->name('store');
Route::get('/edit/{id}', 'edit')->name('edit');
Route::put('/edit/{id}', 'update')->name('update');
Route::delete('/{id}', 'destroy')->name('destroy'); Route::delete('/{id}', 'destroy')->name('destroy');
}); });
}); });