diff --git a/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php b/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php index 9c76681..0167462 100644 --- a/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php +++ b/app/Http/Controllers/Web/Ekosistem/KolomBasisDataController.php @@ -54,8 +54,11 @@ class KolomBasisDataController extends Controller }) ], 'label' => ['required', 'string'], - 'tipe' => ['required', 'string', Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float'])], + 'tipe' => ['required', 'string', Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float', 'foreign_key'])], 'validasi' => ['nullable', 'json'], + 'relasi_tabel' => ['nullable', 'string'], + 'relasi_kolom_id' => ['nullable', 'string'], + 'relasi_kolom_label' => ['nullable', 'string'], ]); KolomBasisData::create([...$validated, @@ -120,8 +123,11 @@ class KolomBasisDataController extends Controller }) ], 'label' => ['required', 'string'], - 'tipe' => ['required', 'string', Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float'])], + 'tipe' => ['required', 'string', Rule::in(['varchar', 'integer', 'text', 'date', 'boolean', 'datetime', 'float', 'foreign_key'])], 'validasi' => ['nullable', 'json'], + 'relasi_tabel' => ['nullable', 'string'], + 'relasi_kolom_id' => ['nullable', 'string'], + 'relasi_kolom_label' => ['nullable', 'string'], ]); $kolom->update([...$validated, diff --git a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php index 07510f2..0048cc8 100644 --- a/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php +++ b/app/Http/Controllers/Web/Ekosistem/ValueBasisDataController.php @@ -17,9 +17,6 @@ use App\Models\Core\Program; class ValueBasisDataController extends Controller { - /** - * Display a listing of the resource. - */ public function index(Request $request, string $tabelId): View { if (!Gate::any(['super_admin', 'admin'])) { @@ -68,6 +65,16 @@ class ValueBasisDataController extends Controller END ) AS \"{$k->kolom}\" "; + } elseif ($k->tipe == 'foreign_key') { + $selects[] = " + MAX( + CASE + WHEN kolom_id = {$k->id} + THEN (select {$k->relasi_kolom_label} from {$k->relasi_tabel} where {$k->relasi_kolom_id} = value_relasi) + ELSE NULL + END + ) AS \"{$k->kolom}\" + "; } else { $selects[] = " MAX( @@ -128,9 +135,6 @@ class ValueBasisDataController extends Controller return view('ekosistem.value-basis-data.index', compact('programList', 'program', 'tabel', 'kolom', 'values', 'ringkasan')); } - /** - * Show the form for creating a new resource. - */ public function create(Request $request, string $tabelId): View { if (!Gate::any(['super_admin', 'admin'])) { @@ -158,12 +162,25 @@ class ValueBasisDataController extends Controller abort(400, 'Program tidak ditemukan.'); } - return view('ekosistem.value-basis-data.add', compact('tabel', 'kolom', 'program')); + $list_relasi = []; + foreach ($kolom as $k) { + if ($k->tipe == 'foreign_key') { + $relasi['kolom_id'] = $k->id; + try { + $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at'); + $relasi['options'] = $options_kolom->get(); + $relasi['sql'] = $options_kolom->toSql(); + } catch (\Throwable $th) { + $relasi['options'] = []; + } + $list_relasi[] = $relasi; + } + } + $list_relasi = collect($list_relasi); + + return view('ekosistem.value-basis-data.add', compact('tabel', 'kolom', 'program', 'list_relasi')); } - /** - * Store a newly created resource in storage. - */ public function store(Request $request, string $tabelId): RedirectResponse { if (!Gate::any(['super_admin', 'admin'])) { @@ -216,7 +233,12 @@ class ValueBasisDataController extends Controller 'created_by' => auth()->id(), 'updated_by' => auth()->id(), ]; - $values['value_' . $k->tipe] = $validated[$k->kolom] ?? null; + if ($k->tipe == 'foreign_key') { + $values['value_relasi'] = $validated[$k->kolom] ?? null; + } else { + $values['value_' . $k->tipe] = $validated[$k->kolom] ?? null; + } + ValueBasisData::create($values); } }); @@ -232,9 +254,6 @@ class ValueBasisDataController extends Controller // } - /** - * Show the form for editing the specified resource. - */ public function edit(Request $request, string $tabelId, string $id) { if (!Gate::any(['super_admin', 'admin'])) { @@ -275,7 +294,23 @@ class ValueBasisDataController extends Controller $value_id = $id; - return view('ekosistem.value-basis-data.edit', compact('tabel', 'kolom', 'program', 'values', 'value_id')); + $list_relasi = []; + foreach ($kolom as $k) { + if ($k->tipe == 'foreign_key') { + $relasi['kolom_id'] = $k->id; + try { + $options_kolom = DB::table($k->relasi_tabel)->selectRaw($k->relasi_kolom_label . ' as label, ' . $k->relasi_kolom_id . ' as value')->whereNull('deleted_at'); + $relasi['options'] = $options_kolom->get(); + $relasi['sql'] = $options_kolom->toSql(); + } catch (\Throwable $th) { + $relasi['options'] = []; + } + $list_relasi[] = $relasi; + } + } + $list_relasi = collect($list_relasi); + + return view('ekosistem.value-basis-data.edit', compact('tabel', 'kolom', 'program', 'values', 'value_id', 'list_relasi')); } /** @@ -344,11 +379,15 @@ class ValueBasisDataController extends Controller 'created_by' => auth()->id(), 'updated_by' => auth()->id(), ]; - $vals['value_' . $k->tipe] = $validated[$k->kolom] ?? null; + if ($k->tipe == 'foreign_key') { + $vals['value_relasi'] = $validated[$k->kolom] ?? null; + } else { + $vals['value_' . $k->tipe] = $validated[$k->kolom] ?? null; + } ValueBasisData::create($vals); } else { $v->update([ - 'value_' . $k->tipe => $val, + 'value_' . ($k->tipe == 'foreign_key' ? 'relasi' : $k->tipe) => $val, 'updated_by' => auth()->id(), ]); } diff --git a/app/Models/Ekosistem/KolomBasisData.php b/app/Models/Ekosistem/KolomBasisData.php index a76a647..d472ad3 100644 --- a/app/Models/Ekosistem/KolomBasisData.php +++ b/app/Models/Ekosistem/KolomBasisData.php @@ -22,6 +22,9 @@ class KolomBasisData extends Model 'tipe', 'validasi', 'urutan', + 'relasi_tabel', + 'relasi_kolom_id', + 'relasi_kolom_label', ]; protected $casts = [ diff --git a/app/Models/Ekosistem/ValueBasisData.php b/app/Models/Ekosistem/ValueBasisData.php index 33075c1..56ff78c 100644 --- a/app/Models/Ekosistem/ValueBasisData.php +++ b/app/Models/Ekosistem/ValueBasisData.php @@ -30,6 +30,7 @@ class ValueBasisData extends Model 'created_by', 'updated_by', 'deleted_by', + 'value_relasi', ]; 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 new file mode 100644 index 0000000..d5048db --- /dev/null +++ b/database/migrations/2026_05_05_103739_update_basis_data_table.php @@ -0,0 +1,47 @@ +string('relasi_tabel')->nullable(); + $table->string('relasi_kolom_id')->nullable(); + $table->string('relasi_kolom_label')->nullable(); + }); + + DB::statement("alter table public.ekosistem_basis_data_kolom drop constraint ekosistem_basis_data_kolom_tipe_check;"); + DB::statement(" + alter table public.ekosistem_basis_data_kolom add constraint ekosistem_basis_data_kolom_tipe_check check (((tipe)::text = any + ((array[ + 'varchar'::character varying, + 'integer'::character varying, + 'float'::character varying, + 'boolean'::character varying, + 'date'::character varying, + 'datetime'::character varying, + 'text'::character varying, + 'foreign_key'::character varying + ])::text[]))) + "); + + Schema::table('ekosistem_basis_data_value', function (Blueprint $table) { + $table->integer('value_relasi')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + } +}; diff --git a/resources/views/core/program/index.blade.php b/resources/views/core/program/index.blade.php index 89b8a8c..3b6b6a4 100644 --- a/resources/views/core/program/index.blade.php +++ b/resources/views/core/program/index.blade.php @@ -3,7 +3,11 @@ @section('content')
-
+
+
Program Transformasi
+
+ +
diff --git a/resources/views/ekosistem/group-basis-data/index.blade.php b/resources/views/ekosistem/group-basis-data/index.blade.php index 4feab02..88231ae 100644 --- a/resources/views/ekosistem/group-basis-data/index.blade.php +++ b/resources/views/ekosistem/group-basis-data/index.blade.php @@ -3,7 +3,11 @@ @section('content')
-
+
+
Kelompok Basis Data
+
+ +
diff --git a/resources/views/ekosistem/kolom-basis-data/add.blade.php b/resources/views/ekosistem/kolom-basis-data/add.blade.php index fe91c9a..235ff25 100644 --- a/resources/views/ekosistem/kolom-basis-data/add.blade.php +++ b/resources/views/ekosistem/kolom-basis-data/add.blade.php @@ -34,8 +34,21 @@ +
+ + +
@@ -55,6 +68,18 @@ width: '100%', }); + $('#add-kolom-jenis_data').on('change', function() { + if ($(this).val() === 'foreign_key') { + $('#relasi-form-tabel').show(); + $('#relasi-form-kolom').show(); + $('#relasi-form-kolom-label').show(); + } else { + $('#relasi-form-tabel').hide(); + $('#relasi-form-kolom').hide(); + $('#relasi-form-kolom-label').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/kolom-basis-data/edit.blade.php b/resources/views/ekosistem/kolom-basis-data/edit.blade.php index 976a816..bb03cd3 100644 --- a/resources/views/ekosistem/kolom-basis-data/edit.blade.php +++ b/resources/views/ekosistem/kolom-basis-data/edit.blade.php @@ -37,8 +37,21 @@ +
+ + +
@@ -81,6 +94,19 @@ $('#update-kolom-label').val(res.data.label); $('#update-kolom-jenis_data').val(res.data.tipe).trigger('change'); $('#update-kolom-validasi').val(res.data.required ? 'required' : ''); + if (res.data.tipe === 'foreign_key') { + console.log("Data relasi:", res.data); + $('#update-kolom-relasi-tabel').val(res.data.relasi_tabel); + $('#update-kolom-relasi-kolom-id').val(res.data.relasi_kolom_id); + $('#update-kolom-relasi-kolom-label').val(res.data.relasi_kolom_label); + $('#relasi-form-tabel-update').show(); + $('#relasi-form-kolom-update').show(); + $('#relasi-form-kolom-label-update').show(); + } else { + $('#relasi-form-tabel-update').hide(); + $('#relasi-form-kolom-update').hide(); + $('#relasi-form-kolom-label-update').hide(); + } offcanvasUpdate.show(); } }); diff --git a/resources/views/ekosistem/value-basis-data/add.blade.php b/resources/views/ekosistem/value-basis-data/add.blade.php index 0e6ac62..fce3dbd 100644 --- a/resources/views/ekosistem/value-basis-data/add.blade.php +++ b/resources/views/ekosistem/value-basis-data/add.blade.php @@ -32,13 +32,21 @@ @elseif($k->tipe == 'datetime') - @elseif($k->tipe == 'boolean') + @elseif($k->tipe == 'foreign_key') + @else @@ -63,7 +71,7 @@