foto lahan
This commit is contained in:
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user