foto lahan

This commit is contained in:
2026-07-13 01:04:55 +07:00
parent c5b5721b31
commit 599269410b
4 changed files with 108 additions and 11 deletions
@@ -140,9 +140,21 @@ class PetaniLahanController extends Controller
$komoditas = Komoditas::where('id', $request->komoditas_id)->first();
$lahanCount = Lahan::where('petani_id', $petaniId)
->count();
$lahanUid = strtoupper(Str::random(10));
if ($request->hasFile('foto')) {
$foto = [];
foreach ($request->file('foto') as $file) {
$path = $file->store('lahan', 'public');
$foto[] = [
'path' => $path,
'file' => $file->getClientOriginalName(),
];
}
}
$lahan = Lahan::create([...$validated,
'foto' => $foto && count($foto) > 0 ? json_encode($foto) : null,
'nama' => 'Lahan ' . $komoditas->nama . ' #' . ($lahanCount + 1),
'uid' => 'LHN-' . $petani->uid . '-' . $lahanUid,
'petani_id' => $petaniId,
@@ -11,9 +11,16 @@ return new class extends Migration
*/
public function up(): void
{
Schema::table('petani', function (Blueprint $table) {
$table->foreignId('komoditas_id')->nullable()->constrained('master_komoditas')->onDelete('set null');
});
Schema::table('map_lahan', function (Blueprint $table) {
$table->json('komoditas_lain')->nullable();
$table->json('tanaman_penaung')->nullable();
$table->json('foto')->nullable();
});
}
@@ -3,6 +3,7 @@
@push('style')
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.css" />
<link rel="stylesheet" href="https://unpkg.com/dropzone@5/dist/min/dropzone.min.css" type="text/css" />
<style>
#map {
@@ -41,7 +42,8 @@
<div class="col-12 col-lg-10 col-md-9 pt-6 pt-lg-0">
<form id="petani-lahan-tanaman" method="POST" action="{{ route('petani.lahan-tanaman.store', ['petani' => $petani->id, 'lahanSelected' => null]) }}">
<form id="petani-lahan-tanaman" method="POST" enctype="multipart/form-data"
action="{{ route('petani.lahan-tanaman.store', ['petani' => $petani->id, 'lahanSelected' => null]) }}">
@csrf
<input type="hidden" name="status_kepemilikan" value="sendiri">
<div class="row">
@@ -221,14 +223,33 @@
<div id="map" class="border rounded shadow-sm"></div>
</div>
</div>
<div class="row mt-3">
<div class="col-12 text-end">
<a href="{{ route('petani.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Lahan</button>
<hr class="my-4">
<div class="row">
<div class="col-12 mb-4">
<h6 class="mb-0">Foto</h6>
<div class="row">
<div class="col-md-12 mb-3 form-control-validation">
<div id="dropzone-foto" class="needsclick">
<div class="dz-message needsclick">
Drop foto di sini atau klik untuk memilih
</div>
</div>
<input type="file" id="foto-input" name="foto[]" multiple hidden>
@error('file')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div>
</div>
</div>
</div>
<div class="row mt-3">
<div class="col-12 text-end">
<a href="{{ route('petani.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Lahan</button>
</div>
</div>
</form>
</div>
</div>
@@ -242,6 +263,7 @@
@push('scripts')
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet.draw/1.0.4/leaflet.draw.js"></script>
<script src="https://unpkg.com/dropzone@5/dist/min/dropzone.min.js"></script>
<script>
'use strict';
@@ -483,6 +505,35 @@
$('#luas_lahan').val(area.toFixed(2));
}
// DROPZONE
const previewTemplate = `<div class="dz-preview dz-file-preview">
<div class="dz-details">
<div class="dz-thumbnail">
<img data-dz-thumbnail>
<span class="dz-nopreview">No preview</span>
<div class="dz-success-mark"></div>
<div class="dz-error-mark"></div>
<div class="dz-error-message"><span data-dz-errormessage></span></div>
<div class="progress">
<div class="progress-bar progress-bar-primary" role="progressbar" aria-valuemin="0" aria-valuemax="100" data-dz-uploadprogress></div>
</div>
</div>
<div class="dz-filename" data-dz-name></div>
<div class="dz-size" data-dz-size></div>
</div>
</div>`;
Dropzone.autoDiscover = false;
const dropzoneFoto = $("#dropzone-foto").addClass("dropzone").dropzone({
url: "/",
previewTemplate: previewTemplate,
parallelUploads: 1,
maxFilesize: 5,
addRemoveLinks: true,
acceptedFiles: "image/jpeg,image/jpg,image/png",
});
// FORM
$('#petani-lahan-tanaman').validate({
@@ -524,6 +575,28 @@
},
unhighlight: function (element) {
$(element).removeClass('is-invalid');
},
submitHandler: function (form) {
const formData = new FormData(form);
const dz = $("#dropzone-foto")[0].dropzone;
dz.getAcceptedFiles().forEach(function(file) {
formData.append("foto[]", file);
});
$.ajax({
url: form.action,
type: "POST",
data: formData,
processData: false,
contentType: false,
success: function(res) {
console.log(res);
}
});
return false;
}
});
});
@@ -240,11 +240,13 @@
<div id="map" class="border rounded shadow-sm"></div>
</div>
<div class="row mt-3">
<div class="col-12 text-end">
<a href="{{ route('petani.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Lahan</button>
</div>
</div>
<div class="row mt-3">
<div class="col-12 text-end">
<a href="{{ route('petani.index') }}" class="btn btn-secondary me-2 wave-effect wave-light">Kembali</a>
<button type="submit" class="btn btn-success data-submit wave-effect wave-light"><i class="ti tabler-device-floppy me-2"></i> Simpan Lahan</button>
</div>
</div>
</form>
@@ -252,10 +254,13 @@
</div>
<br/>
<div class="row">
<div class="col-12 col-lg-2 col-md-3">
</div>
<div class="col-12 col-lg-10 col-md-9">
<hr class="my-4">
<h6 class="mb-3">Tanaman</h6>
<div class="table-responsive">
<table class="table table-hover table-sm" id="table-tanaman">
<thead class="border-top">