Update Pendidikan dan Pelatihan
This commit is contained in:
@@ -4,12 +4,13 @@ namespace App\Enums\PendidikanPelatihan;
|
|||||||
|
|
||||||
enum PelatihanGAP: string
|
enum PelatihanGAP: string
|
||||||
{
|
{
|
||||||
case PEMANGKASAN = 'Pemangkasan atau perawatan tanaman';
|
case PEMANGKASAN = 'Pemangkasan/perawatan tanaman';
|
||||||
case PEMUPUKAN = 'Pemupukan atau nutrisi tanah';
|
case PEMUPUKAN = 'Pemupukan/nutrisi';
|
||||||
case PENGENDALIAN = 'Pengendalian hama dan penyakit';
|
case PENGENDALIAN = 'Pengendalian hama & penyakit';
|
||||||
case PRAKTIK = 'Praktik Berkebun yang Baik (GAP)';
|
case PRAKTIK = 'Praktik Berkebun yang Baik (GAP)';
|
||||||
case PENGOLAHAN = 'Pengolahan/pascapanen';
|
case PENGOLAHAN = 'Pengolahan/pascapanen';
|
||||||
case PENYERBUKAN = 'Penyerbukan manual (Vanili)';
|
case PENYERBUKAN = 'Penyerbukan Manual (Vanili)';
|
||||||
|
case LAINNYA = 'Lainnya';
|
||||||
|
|
||||||
public function label(): string
|
public function label(): string
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ use BackedEnum;
|
|||||||
|
|
||||||
class SurveyPetaniController extends Controller
|
class SurveyPetaniController extends Controller
|
||||||
{
|
{
|
||||||
private const GAP_ENUM_CLASS = 'App\\Enums\\PendidikanPelatihan\\PelatihanGap';
|
private const GAP_ENUM_CLASS = 'App\\Enums\\PendidikanPelatihan\\PelatihanGAP';
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
$colors = $this->colors();
|
$colors = $this->colors();
|
||||||
|
|||||||
@@ -6,7 +6,9 @@ use App\Http\Controllers\Controller;
|
|||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Gate;
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
use App\Enums\PendidikanPelatihan\PelatihanGAP;
|
||||||
use App\Models\Pertanian\Petani;
|
use App\Models\Pertanian\Petani;
|
||||||
use App\Models\Pertanian\SurveyPelatihan;
|
use App\Models\Pertanian\SurveyPelatihan;
|
||||||
use App\Models\Pertanian\SurveySertifikasi;
|
use App\Models\Pertanian\SurveySertifikasi;
|
||||||
@@ -44,15 +46,22 @@ class PendidikanPelatihanController extends Controller
|
|||||||
$validatedData = $request->validate([
|
$validatedData = $request->validate([
|
||||||
'riwayat_pelatihan' => ['nullable', 'array'],
|
'riwayat_pelatihan' => ['nullable', 'array'],
|
||||||
|
|
||||||
'riwayat_pelatihan.*.jenis_pelatihan' => ['nullable', 'string', 'max:255'],
|
'riwayat_pelatihan.*.jenis_pelatihan' => ['nullable', 'string', Rule::enum(PelatihanGAP::class)],
|
||||||
|
'riwayat_pelatihan.*.jenis_pelatihan_lainnya' => [
|
||||||
|
'nullable', 'string', 'max:255',
|
||||||
|
'required_if:riwayat_pelatihan.*.jenis_pelatihan,' . PelatihanGAP::LAINNYA->value,
|
||||||
|
],
|
||||||
'riwayat_pelatihan.*.penyelenggara' => ['nullable', 'string', 'max:255'],
|
'riwayat_pelatihan.*.penyelenggara' => ['nullable', 'string', 'max:255'],
|
||||||
'riwayat_pelatihan.*.tahun' => ['nullable', 'integer', 'min:1900', 'max:' . date('Y')],
|
'riwayat_pelatihan.*.tahun' => ['nullable', 'integer', 'min:1900', 'max:' . date('Y')],
|
||||||
], [
|
], [
|
||||||
|
'riwayat_pelatihan.*.jenis_pelatihan.enum' => 'Jenis pelatihan yang dipilih tidak valid.',
|
||||||
|
'riwayat_pelatihan.*.jenis_pelatihan_lainnya.required_if' => 'Jenis pelatihan lainnya wajib diisi jika memilih Lainnya.',
|
||||||
'riwayat_pelatihan.*.tahun.integer' => 'Tahun pelatihan harus berupa angka.',
|
'riwayat_pelatihan.*.tahun.integer' => 'Tahun pelatihan harus berupa angka.',
|
||||||
'riwayat_pelatihan.*.tahun.min' => 'Tahun pelatihan tidak valid.',
|
'riwayat_pelatihan.*.tahun.min' => 'Tahun pelatihan tidak valid.',
|
||||||
'riwayat_pelatihan.*.tahun.max' => 'Tahun pelatihan tidak boleh melebihi tahun saat ini.',
|
'riwayat_pelatihan.*.tahun.max' => 'Tahun pelatihan tidak boleh melebihi tahun saat ini.',
|
||||||
], [
|
], [
|
||||||
'riwayat_pelatihan.*.jenis_pelatihan' => 'jenis pelatihan',
|
'riwayat_pelatihan.*.jenis_pelatihan' => 'jenis pelatihan',
|
||||||
|
'riwayat_pelatihan.*.jenis_pelatihan_lainnya' => 'jenis pelatihan lainnya',
|
||||||
'riwayat_pelatihan.*.penyelenggara' => 'penyelenggara',
|
'riwayat_pelatihan.*.penyelenggara' => 'penyelenggara',
|
||||||
'riwayat_pelatihan.*.tahun' => 'tahun pelatihan',
|
'riwayat_pelatihan.*.tahun' => 'tahun pelatihan',
|
||||||
]);
|
]);
|
||||||
@@ -66,10 +75,15 @@ class PendidikanPelatihanController extends Controller
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Jika memilih "Lainnya", yang disimpan adalah teks isian bebasnya
|
||||||
|
$jenisPelatihan = ($item['jenis_pelatihan'] ?? null) === PelatihanGAP::LAINNYA->value
|
||||||
|
? trim($item['jenis_pelatihan_lainnya'])
|
||||||
|
: ($item['jenis_pelatihan'] ?? null);
|
||||||
|
|
||||||
$petani->surveyPelatihan()->create([
|
$petani->surveyPelatihan()->create([
|
||||||
'uid' => 'SPL-' . strtoupper(Str::random(10)),
|
'uid' => 'SPL-' . strtoupper(Str::random(10)),
|
||||||
'petani_id' => $petani->id,
|
'petani_id' => $petani->id,
|
||||||
'jenis_pelatihan' => $item['jenis_pelatihan'] ?? null,
|
'jenis_pelatihan' => $jenisPelatihan,
|
||||||
'penyelenggara' => $item['penyelenggara'] ?? null,
|
'penyelenggara' => $item['penyelenggara'] ?? null,
|
||||||
'tahun_pelaksanaan' => $item['tahun'] ?? null,
|
'tahun_pelaksanaan' => $item['tahun'] ?? null,
|
||||||
'created_by' => auth()->id(),
|
'created_by' => auth()->id(),
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
@extends('layout.main')
|
@extends('layout.main')
|
||||||
|
|
||||||
|
@use('App\Enums\PendidikanPelatihan\PelatihanGAP')
|
||||||
|
|
||||||
@push('style')
|
@push('style')
|
||||||
<style>
|
<style>
|
||||||
.status-switch-row {
|
.status-switch-row {
|
||||||
@@ -114,11 +116,18 @@
|
|||||||
<div class="row align-items-end">
|
<div class="row align-items-end">
|
||||||
<div class="col-md-5 mb-3">
|
<div class="col-md-5 mb-3">
|
||||||
<label class="form-label">Jenis Pelatihan</label>
|
<label class="form-label">Jenis Pelatihan</label>
|
||||||
|
<select class="form-select pelatihan-input jenis-pelatihan-select" name="jenis_pelatihan">
|
||||||
|
<option value="">Pilih Jenis Pelatihan</option>
|
||||||
|
@foreach (PelatihanGAP::options() as $option)
|
||||||
|
<option value="{{ $option['value'] }}">{{ $option['label'] }}</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
class="form-control pelatihan-input"
|
class="form-control pelatihan-input jenis-pelatihan-lainnya mt-2 d-none"
|
||||||
name="jenis_pelatihan"
|
name="jenis_pelatihan_lainnya"
|
||||||
placeholder="Contoh: Pelatihan GAP">
|
placeholder="Sebutkan jenis pelatihan lainnya..."
|
||||||
|
disabled>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-4 mb-3">
|
<div class="col-md-4 mb-3">
|
||||||
@@ -383,14 +392,15 @@ $(function () {
|
|||||||
return $form.find('[data-repeater-item]');
|
return $form.find('[data-repeater-item]');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Input yang nonaktif (mis. isian "Lainnya" yang tersembunyi) tidak ikut dihitung
|
||||||
function rowAdaIsi($row) {
|
function rowAdaIsi($row) {
|
||||||
return $row.find(config.inputSelector).toArray().some(function (input) {
|
return $row.find(config.inputSelector).not(':disabled').toArray().some(function (input) {
|
||||||
return String($(input).val() || '').trim() !== '';
|
return String($(input).val() || '').trim() !== '';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function rowLengkap($row) {
|
function rowLengkap($row) {
|
||||||
const $inputs = $row.find(config.inputSelector);
|
const $inputs = $row.find(config.inputSelector).not(':disabled');
|
||||||
|
|
||||||
if ($inputs.length === 0) {
|
if ($inputs.length === 0) {
|
||||||
return false;
|
return false;
|
||||||
@@ -453,6 +463,10 @@ $(function () {
|
|||||||
$row.find(config.switchSelector).prop('checked', false);
|
$row.find(config.switchSelector).prop('checked', false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof config.onShow === 'function') {
|
||||||
|
config.onShow($row);
|
||||||
|
}
|
||||||
|
|
||||||
updateAllSwitchText();
|
updateAllSwitchText();
|
||||||
|
|
||||||
$row.slideDown();
|
$row.slideDown();
|
||||||
@@ -510,7 +524,27 @@ $(function () {
|
|||||||
addButtonSelector: '#btn-tambah-pelatihan',
|
addButtonSelector: '#btn-tambah-pelatihan',
|
||||||
inputSelector: '.pelatihan-input',
|
inputSelector: '.pelatihan-input',
|
||||||
deleteButtonSelector: '.btn-delete-pelatihan',
|
deleteButtonSelector: '.btn-delete-pelatihan',
|
||||||
deleteTitle: 'Hapus baris pelatihan ini?'
|
deleteTitle: 'Hapus baris pelatihan ini?',
|
||||||
|
onShow: function ($row) {
|
||||||
|
toggleJenisPelatihanLainnya($row.find('.jenis-pelatihan-select'));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Isian bebas hanya muncul jika jenis pelatihan "Lainnya"
|
||||||
|
function toggleJenisPelatihanLainnya($select) {
|
||||||
|
const $lainnya = $select.closest('[data-repeater-item]').find('.jenis-pelatihan-lainnya');
|
||||||
|
const isLainnya = $select.val() === @json(PelatihanGAP::LAINNYA->value);
|
||||||
|
|
||||||
|
$lainnya.toggleClass('d-none', !isLainnya).prop('disabled', !isLainnya);
|
||||||
|
|
||||||
|
if (!isLainnya) {
|
||||||
|
$lainnya.val('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).on('change', '.form-repeater-pelatihan .jenis-pelatihan-select', function () {
|
||||||
|
toggleJenisPelatihanLainnya($(this));
|
||||||
|
$(this).closest('[data-repeater-item]').find('.jenis-pelatihan-lainnya:not(:disabled)').trigger('focus');
|
||||||
});
|
});
|
||||||
|
|
||||||
initRepeaterWithValidation({
|
initRepeaterWithValidation({
|
||||||
|
|||||||
Reference in New Issue
Block a user