diff --git a/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php b/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php index 0167462..d832187 100644 --- a/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php +++ b/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php @@ -49,18 +49,27 @@ class KolomBasisDataController extends Controller 'kolom' => ['required', 'string', 'regex:/^[a-z0-9]+(_[a-z0-9]+)*$/', - Rule::unique('ekosistem_basis_data_kolom')->where(function ($query) use ($request) { - return $query->where('tabel_id', $request->tabel_id)->whereNull('deleted_at'); + Rule::unique('ekosistem_basis_data_kolom')->where(function ($query) use ($tabelId) { + return $query->where('tabel_id', $tabelId)->whereNull('deleted_at'); }) ], 'label' => ['required', 'string'], - 'tipe' => ['required', 'string', Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float', 'foreign_key'])], + 'tipe' => ['required', 'string', + Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float', 'foreign_key', 'enum'])], 'validasi' => ['nullable', 'json'], 'relasi_tabel' => ['nullable', 'string'], 'relasi_kolom_id' => ['nullable', 'string'], 'relasi_kolom_label' => ['nullable', 'string'], + 'enum_opsi' => ['nullable', 'json'], ]); + if (!empty($validated['enum_opsi'])) { + $validated['enum_opsi'] = json_decode($validated['enum_opsi'], true); + } + if (!empty($validated['validasi'])) { + $validated['validasi'] = json_decode($validated['validasi'], true); + } + KolomBasisData::create([...$validated, 'tabel_id' => $tabelId, 'created_by' => auth()->id(), @@ -123,11 +132,13 @@ class KolomBasisDataController extends Controller }) ], 'label' => ['required', 'string'], - 'tipe' => ['required', 'string', Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float', 'foreign_key'])], + 'tipe' => ['required', 'string', + Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float', 'foreign_key', 'enum'])], 'validasi' => ['nullable', 'json'], 'relasi_tabel' => ['nullable', 'string'], 'relasi_kolom_id' => ['nullable', 'string'], 'relasi_kolom_label' => ['nullable', 'string'], + 'enum_opsi' => ['nullable', 'json'], ]); $kolom->update([...$validated, diff --git a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php index a3d8131..61b45b7 100644 --- a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php +++ b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php @@ -75,6 +75,23 @@ class ValueBasisDataController extends Controller END ) AS \"{$k->kolom}\" "; + } elseif ($k->tipe == 'enum') { + $selects[] = " + MAX( + CASE + WHEN kolom_id = {$k->id} + THEN ( + SELECT elem->>'label' + FROM ekosistem_basis_data_kolom k, + jsonb_array_elements(k.enum_opsi::jsonb) AS elem + WHERE k.id = kolom_id + AND elem->>'value' = value_enum + LIMIT 1 + ) + ELSE NULL + END + ) AS \"{$k->kolom}\" + "; } else { $selects[] = " MAX( @@ -178,6 +195,7 @@ class ValueBasisDataController extends Controller } } $list_relasi = collect($list_relasi); + // dd($kolom->where('tipe', 'enum')->first()?->enum_opsi); return view('ekosistem.value-basis-data.add', compact('tabel', 'kolom', 'program', 'list_relasi')); } @@ -250,12 +268,63 @@ class ValueBasisDataController extends Controller /** * Display the specified resource. */ - public function show(string $id) + public function show(Request $request, string $tabelId, string $id): View { - // + if (!Gate::any(['super_admin', 'admin'])) { + abort(403); + } + + $tabel = TabelBasisData::find($tabelId); + if (!$tabel) { + abort(404, 'Data tabel tidak ditemukan.'); + } + $kolom = KolomBasisData::where('tabel_id', $tabelId)->get(); + if ($kolom->isEmpty()) { + abort(404, 'Data kolom tidak ditemukan untuk tabel ini.'); + } + + if (app()->has('SystemProgram')) { + $program = app('SystemProgram'); + } else { + if ($request->has('program_id') && $request->query('program_id')) { + $programId = $request->query('program_id'); + $program = Program::find($programId); + if (!$program) { + abort(400, 'Program tidak ditemukan.'); + } + } else { + abort(400, 'Program tidak ditemukan.'); + } + } + + $values = ValueBasisData::query() + ->where('tabel_id', $tabelId) + ->where('value_id', $id) + ->where('program_id', $program->id) + ->get(); + if ($values->isEmpty()) { + abort(404, 'Data tidak ditemukan.'); + } + + foreach ($values as $v) { + $k = $kolom->where('id', $v->kolom_id)->first(); + if ($k->tipe == 'foreign_key') { + $v->value_relasi_label = DB::table($k->relasi_tabel)->where($k->relasi_kolom_id, $v->value_relasi)->value($k->relasi_kolom_label); + } else if ($k->tipe == 'enum') { + $opsi = collect($k->enum_opsi); + $found = $opsi->first(function ($item) use ($v) { + return (string) $item['value'] === (string) $v->value_enum; + }); + $v->value_enum_label = $found['label'] ?? null; + } + } + + $value_id = $id; + + return view('ekosistem.value-basis-data.view', compact('tabel', 'kolom', 'program', 'values', 'value_id')); } - public function edit(Request $request, string $tabelId, string $id) + public function edit(Request $request, string $tabelId, string $id): View { if (!Gate::any(['super_admin', 'admin'])) { abort(403); @@ -317,7 +386,7 @@ class ValueBasisDataController extends Controller /** * Update the specified resource in storage. */ - public function update(Request $request, string $tabelId, string $id) + public function update(Request $request, string $tabelId, string $id): RedirectResponse { if (!Gate::any(['super_admin', 'admin'])) { abort(403); @@ -408,7 +477,7 @@ class ValueBasisDataController extends Controller /** * Remove the specified resource from storage. */ - public function destroy(Request $request, string $tabelId, string $id) + public function destroy(Request $request, string $tabelId, string $id): RedirectResponse { if (!Gate::any(['super_admin', 'admin'])) { abort(403); diff --git a/app/Models/Ekosistem/KolomBasisData.php b/app/Models/Ekosistem/KolomBasisData.php index d472ad3..e5c4b4a 100644 --- a/app/Models/Ekosistem/KolomBasisData.php +++ b/app/Models/Ekosistem/KolomBasisData.php @@ -25,10 +25,12 @@ class KolomBasisData extends Model 'relasi_tabel', 'relasi_kolom_id', 'relasi_kolom_label', + 'enum_opsi', ]; protected $casts = [ 'validasi' => 'array', + 'enum_opsi' => 'array', ]; protected static function booted() diff --git a/app/Models/Ekosistem/ValueBasisData.php b/app/Models/Ekosistem/ValueBasisData.php index 56ff78c..a5685fc 100644 --- a/app/Models/Ekosistem/ValueBasisData.php +++ b/app/Models/Ekosistem/ValueBasisData.php @@ -31,6 +31,7 @@ class ValueBasisData extends Model 'updated_by', 'deleted_by', 'value_relasi', + 'value_enum', ]; public function tabel(): BelongsTo diff --git a/database/migrations/2026_05_05_103739_update_basis_data_table.php b/database/migrations/2026_05_05_103739_update_basis_data_table.php index e01021b..cee687b 100644 --- a/database/migrations/2026_05_05_103739_update_basis_data_table.php +++ b/database/migrations/2026_05_05_103739_update_basis_data_table.php @@ -16,6 +16,8 @@ return new class extends Migration $table->string('relasi_tabel')->nullable(); $table->string('relasi_kolom_id')->nullable(); $table->string('relasi_kolom_label')->nullable(); + + $table->jsonb('enum_opsi')->nullable(); }); DB::statement("alter table public.ekosistem_basis_data_kolom drop constraint ekosistem_basis_data_kolom_tipe_check;"); @@ -29,12 +31,14 @@ return new class extends Migration 'date'::character varying, 'datetime'::character varying, 'text'::character varying, - 'foreign_key'::character varying + 'foreign_key'::character varying, + 'enum'::character varying ])::text[]))) "); Schema::table('ekosistem_basis_data_value', function (Blueprint $table) { $table->integer('value_relasi')->nullable(); + $table->string('value_enum')->nullable(); }); Schema::table('ekosistem_petani_cpm', function (Blueprint $table) { diff --git a/resources/views/ekosistem/kolom-basis-data/add.blade.php b/resources/views/ekosistem/kolom-basis-data/add.blade.php index 235ff25..523edd2 100644 --- a/resources/views/ekosistem/kolom-basis-data/add.blade.php +++ b/resources/views/ekosistem/kolom-basis-data/add.blade.php @@ -35,6 +35,7 @@ + +
@@ -78,8 +84,14 @@ $('#relasi-form-kolom').hide(); $('#relasi-form-kolom-label').hide(); } + if ($(this).val() === 'enum') { + $('#enum-form-opsi').show(); + } else { + $('#enum-form-opsi').hide(); + } }); + $.validator.addMethod("snakecase", function(value, element) { return this.optional(element) || /^[a-z0-9]+(_[a-z0-9]+)*$/.test(value); }, "Gunakan format snake_case (huruf kecil dan underscore)"); diff --git a/resources/views/ekosistem/value-basis-data/add.blade.php b/resources/views/ekosistem/value-basis-data/add.blade.php index fce3dbd..22bce66 100644 --- a/resources/views/ekosistem/value-basis-data/add.blade.php +++ b/resources/views/ekosistem/value-basis-data/add.blade.php @@ -47,6 +47,12 @@ @endforeach @endif + @elseif($k->tipe == 'enum') + @else diff --git a/resources/views/ekosistem/value-basis-data/edit.blade.php b/resources/views/ekosistem/value-basis-data/edit.blade.php index 61310ec..6963d01 100644 --- a/resources/views/ekosistem/value-basis-data/edit.blade.php +++ b/resources/views/ekosistem/value-basis-data/edit.blade.php @@ -64,6 +64,12 @@ @endforeach @endif + @elseif($k->tipe == 'enum') + @else diff --git a/resources/views/ekosistem/value-basis-data/view.blade.php b/resources/views/ekosistem/value-basis-data/view.blade.php new file mode 100644 index 0000000..6716131 --- /dev/null +++ b/resources/views/ekosistem/value-basis-data/view.blade.php @@ -0,0 +1,88 @@ +@extends('layout.main') + +@section('content') +
+
+
+
Lihat Data {{ $tabel->label }}
+
+ +
+
+ @csrf + @method('PUT') + +
Informasi {{ $tabel->label }}
+ @if (!$program) +
+
+ + +
+
+ @endif +
+ @foreach($kolom as $k) + where('kolom_id', $k->id)->first(); + ?> +
+ + @if($k->tipe == 'varchar') + + @elseif($k->tipe == 'text') + + @elseif($k->tipe == 'integer') + + @elseif($k->tipe == 'float') + + @elseif($k->tipe == 'date') + + @elseif($k->tipe == 'datetime') + + @elseif($k->tipe == 'boolean') + + @elseif($k->tipe == 'foreign_key') + + @elseif($k->tipe == 'enum') + + @else + + @endif + @error($k->kolom)
{{ $message }}
@enderror +
+ @endforeach +
+ + +
+ Kembali +
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file