Update Praktik Budidaya

This commit is contained in:
2026-11-04 13:09:30 +07:00
parent 53913bebe9
commit aa91c3fe3f
6 changed files with 867 additions and 17 deletions
@@ -119,6 +119,7 @@
@error('frekuensi_pemangkasan_pohon_penaung')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div>
</div>
@if ($petani->isKomoditasVanili())
<div class="row">
<div class="col-md-4 mb-4 form-control-validation">
<label class="form-label d-block fw-medium">Penyerbukan Manual<span class="text-danger">*</span></label>
@@ -228,6 +229,7 @@
@enderror
</div>
</div>
@endif
<h5 class="pb-4 border-bottom mb-4">Praktik Pemupukan</h5>
<div class="row">
<div class="col-md-4 mb-4 form-control-validation">
@@ -151,6 +151,7 @@
@error('frekuensi_pemangkasan_pohon_penaung')<div class="error invalid-feedback">{{ $message }}</div>@enderror
</div>
</div>
@if ($petani->isKomoditasVanili())
<div class="row">
<div class="col-md-4 mb-4 form-control-validation">
<label class="form-label d-block fw-medium">Penyerbukan Manual<span class="text-danger">*</span></label>
@@ -260,6 +261,7 @@
@enderror
</div>
</div>
@endif
<h5 class="pb-4 border-bottom mb-4">Praktik Pemupukan</h5>
<div class="row">
<div class="col-md-4 mb-4 form-control-validation">
@@ -1406,7 +1408,7 @@
<option value="">Pilih tingkat hasil panen</option>
@foreach (TingkatPanenReject::options() as $option)
<option value="{{ $option['value'] }}"
{{ old('praktik_sortasi', $surveyPanen?->praktik_sortasi) == $option['value'] ? 'selected' : '' }}>
{{ old('tingkat_reject', $surveyPanen?->hasil_panen_reject) == $option['value'] ? 'selected' : '' }}>
{{ $option['label'] }}
</option>
@endforeach
@@ -1423,7 +1425,7 @@
class="form-control @error('hasil_panen_reject') is-invalid @enderror"
id="hasil-panen-reject"
name="hasil_panen_reject"
value="{{ old('hasil_panen_reject', $surveyPanen?->hasil_panen_reject) }}"
value="{{ old('hasil_panen_reject', $surveyPanen?->jumlah_panen_reject) }}"
step="0.01"
min="0">
<span class="input-group-text">Kg/Musim</span>
@@ -1560,6 +1562,9 @@
Produktivitas Rata-rata 3 Musim Panen Terakhir per Komoditas
</h5>
{{-- DATA LAMA --}}
@php
$labelSatuanProduktivitas = ['ha_tahun' => 'Ha/Tahun', 'pohon_tahun' => 'Pohon/Tahun'];
@endphp
@if ($surveyProduktivitas->count() > 0)
@foreach ($surveyProduktivitas as $row)
<div class="row align-items-end border-bottom pb-3 mb-3">
@@ -1580,11 +1585,13 @@
<div class="col-md-3">
<label class="form-label">Satuan</label>
<input type="text" class="form-control" value="{{ $row->satuan }}" disabled>
<input type="text" class="form-control" value="{{ $labelSatuanProduktivitas[$row->satuan] ?? $row->satuan }}" disabled>
</div>
<div class="col-md-2">
<form method="POST" action="{{ route('petani.survey-produktivitas.destroy', [$petani->id, $row->id]) }}">
<form method="POST"
action="{{ route('petani.survey-produktivitas.destroy', [$petani->id, $row->id]) }}"
class="delete-db-form">
@csrf
@method('DELETE')
<input type="hidden" name="redirect_fragment" value="section-produktivitas">
@@ -1595,12 +1602,14 @@
</div>
</div>
@endforeach
@else
<p class="text-muted mb-4">Belum ada data produktivitas.</p>
@endif
{{-- FORM TAMBAH DATA BARU --}}
<form method="POST"
action="{{ route('petani.survey-produktivitas.store', $petani->id) }}"
class="form-repeater">
class="form-repeater-produktivitas">
@csrf
<input type="hidden" name="redirect_fragment" value="section-produktivitas">
@@ -1625,7 +1634,7 @@
<div class="col-md-4 mb-3">
<label class="form-label">Komoditas</label>
<select name="komoditas_id" class="form-select @error('produktivitas_komoditas.' . $index . '.komoditas_id') is-invalid @enderror">
<select name="komoditas_id" class="form-select produktivitas-input @error('produktivitas_komoditas.' . $index . '.komoditas_id') is-invalid @enderror">
<option value="">Pilih Komoditas</option>
@foreach ($komoditas as $item)
<option value="{{ $item->id }}" @selected((string) data_get($produktivitasRow, 'komoditas_id') === (string) $item->id)>{{ $item->nama }}</option>
@@ -1639,7 +1648,7 @@
<div class="col-md-3 mb-3">
<label class="form-label">Hasil</label>
<div class="input-group">
<input type="number" name="hasil_panen_3_musim" class="form-control @error('produktivitas_komoditas.' . $index . '.hasil_panen_3_musim') is-invalid @enderror" step="0.01" min="0" value="{{ data_get($produktivitasRow, 'hasil_panen_3_musim') }}">
<input type="number" name="hasil_panen_3_musim" class="form-control produktivitas-input @error('produktivitas_komoditas.' . $index . '.hasil_panen_3_musim') is-invalid @enderror" step="0.01" min="0" value="{{ data_get($produktivitasRow, 'hasil_panen_3_musim') }}">
<span class="input-group-text">Kg</span>
</div>
@error('produktivitas_komoditas.' . $index . '.hasil_panen_3_musim')
@@ -1651,12 +1660,12 @@
<label class="form-label d-block">Satuan</label>
<label class="form-check form-check-inline">
<input class="form-check-input @error('produktivitas_komoditas.' . $index . '.satuan') is-invalid @enderror" type="radio" name="satuan" value="ha_tahun" @checked(data_get($produktivitasRow, 'satuan') === 'ha_tahun')>
<input class="form-check-input produktivitas-satuan @error('produktivitas_komoditas.' . $index . '.satuan') is-invalid @enderror" type="radio" name="satuan" value="ha_tahun" @checked(data_get($produktivitasRow, 'satuan') === 'ha_tahun')>
<span class="form-check-label">Ha/Tahun</span>
</label>
<label class="form-check form-check-inline">
<input class="form-check-input @error('produktivitas_komoditas.' . $index . '.satuan') is-invalid @enderror" type="radio" name="satuan" value="pohon_tahun" @checked(data_get($produktivitasRow, 'satuan') === 'pohon_tahun')>
<input class="form-check-input produktivitas-satuan @error('produktivitas_komoditas.' . $index . '.satuan') is-invalid @enderror" type="radio" name="satuan" value="pohon_tahun" @checked(data_get($produktivitasRow, 'satuan') === 'pohon_tahun')>
<span class="form-check-label">Pohon/Tahun</span>
</label>
@error('produktivitas_komoditas.' . $index . '.satuan')
@@ -1665,7 +1674,7 @@
</div>
<div class="col-md-2 mb-3">
<button type="button" class="btn btn-outline-danger" data-repeater-delete>
<button type="button" class="btn btn-outline-danger btn-delete-produktivitas" data-repeater-delete>
<i class="icon-base ti tabler-trash icon-sm"></i>
</button>
</div>
@@ -1677,7 +1686,7 @@
</div>
<div class="mt-4 d-flex justify-content-between">
<button type="button" class="btn btn-outline-success" data-repeater-create>
<button type="button" class="btn btn-outline-success" id="btn-tambah-produktivitas" data-repeater-create>
<i class="icon-base ti tabler-plus me-1_5 icon-sm"></i>
Tambah Komoditas
</button>
@@ -1685,7 +1694,8 @@
<div class="d-flex flex-wrap justify-content-end gap-2">
<a href="{{ route('petani.index') }}#data-petani" class="btn btn-secondary">Kembali</a>
<button type="submit" class="btn btn-success">
Simpan
<i class="icon-base ti tabler-check me-1_5 icon-sm"></i>
Simpan Produktivitas
</button>
</div>
</div>
@@ -2113,15 +2123,113 @@
});
</script>
<script>
// Repeater produktivitas: perilakunya disamakan dengan halaman Pendidikan & Pelatihan.
$(function () {
$('.form-repeater').repeater({
const $form = $('.form-repeater-produktivitas');
const $btnTambah = $('#btn-tambah-produktivitas');
if (!$form.length) {
return;
}
function rowAdaIsi($row) {
const adaInput = $row.find('.produktivitas-input').toArray().some(function (input) {
return String($(input).val() || '').trim() !== '';
});
return adaInput || $row.find('.produktivitas-satuan:checked').length > 0;
}
function rowLengkap($row) {
const inputLengkap = $row.find('.produktivitas-input').toArray().every(function (input) {
return String($(input).val() || '').trim() !== '';
});
return inputLengkap && $row.find('.produktivitas-satuan:checked').length > 0;
}
function updateButtons() {
const $rows = $form.find('[data-repeater-item]');
$rows.each(function () {
$(this).find('.btn-delete-produktivitas').prop('disabled', !rowAdaIsi($(this)));
});
$btnTambah.prop('disabled', !rowLengkap($rows.last()));
}
$form.repeater({
initEmpty: false,
show: function () {
$(this).slideDown();
const $row = $(this);
$row.find('.produktivitas-input').val('');
$row.find('.produktivitas-satuan').prop('checked', false);
$row.find('.is-invalid').removeClass('is-invalid');
$row.find('.invalid-feedback').remove();
$row.slideDown();
setTimeout(updateButtons, 50);
},
hide: function (deleteElement) {
$(this).slideUp(deleteElement);
const $row = $(this);
if (!rowAdaIsi($row)) {
return;
}
// Hanya menghapus baris di form, tidak mengirim ke database
Swal.fire({
title: 'Hapus baris produktivitas ini?',
text: 'Baris ini hanya akan dihapus dari form.',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Ya, hapus',
cancelButtonText: 'Batal',
customClass: {
confirmButton: 'btn btn-danger me-3',
cancelButton: 'btn btn-label-secondary'
},
buttonsStyling: false
}).then(function (result) {
if (result.isConfirmed) {
$row.slideUp(deleteElement);
setTimeout(updateButtons, 300);
}
});
}
});
$form.on('input keyup change', '.produktivitas-input, .produktivitas-satuan', updateButtons);
updateButtons();
// Konfirmasi hapus data yang sudah tersimpan di database
$(document).on('submit', '.delete-db-form', function (e) {
e.preventDefault();
const form = this;
Swal.fire({
title: 'Hapus data ini?',
text: 'Data yang sudah dihapus tidak bisa dikembalikan.',
icon: 'warning',
showCancelButton: true,
confirmButtonText: 'Ya, hapus',
cancelButtonText: 'Batal',
customClass: {
confirmButton: 'btn btn-danger me-3',
cancelButton: 'btn btn-label-secondary'
},
buttonsStyling: false
}).then(function (result) {
if (result.isConfirmed) {
form.submit();
}
});
});
});
</script>
@endpush