From 2d45e03095d0ede0abdb9b34e43582ea97fb77cd Mon Sep 17 00:00:00 2001 From: majid76 Date: Mon, 9 Dec 2024 07:28:50 +0700 Subject: [PATCH] perbaikan basic data di form inspeksi tidak muncul --- app/Http/Controllers/SurveyorController.php | 79 +++---- app/Http/Requests/FormSurveyorRequest.php | 12 +- .../surveyor/components/bangunan.blade.php | 205 ++++++++++++------ .../components/data-pembanding.blade.php | 181 +++++++++++++--- .../views/surveyor/components/fakta.blade.php | 4 +- .../surveyor/components/header.blade.php | 70 +++--- .../surveyor/components/informasi.blade.php | 10 +- .../surveyor/components/inspeksi.blade.php | 10 +- .../surveyor/components/lingkungan.blade.php | 2 +- .../views/surveyor/components/tanah.blade.php | 103 +++++---- 10 files changed, 425 insertions(+), 251 deletions(-) diff --git a/app/Http/Controllers/SurveyorController.php b/app/Http/Controllers/SurveyorController.php index e87d454..b0e5732 100644 --- a/app/Http/Controllers/SurveyorController.php +++ b/app/Http/Controllers/SurveyorController.php @@ -312,8 +312,6 @@ class SurveyorController extends Controller $inspeksi->foto_form = json_encode($formatFotojson); $inspeksi->save(); - - return response()->json(['success' => true, 'message' => 'Data berhasil disimpan', 'data' => $formatFotojson], 200); } catch (Exception $e) { return response()->json(['success' => false, 'message' => 'Failed to upload: ' . $e->getMessage()], 500); @@ -373,9 +371,6 @@ class SurveyorController extends Controller } } - - - /** * Custom validation request for foto */ @@ -495,8 +490,6 @@ class SurveyorController extends Controller } - - public function storeJadwal(Request $request) { try { @@ -537,10 +530,7 @@ class SurveyorController extends Controller public function storeAproved($id) { try { - - $penilaian = Penilaian::findOrFail($id); - $penilaian->update([ 'authorized_status' => 1, ]); @@ -607,8 +597,6 @@ class SurveyorController extends Controller } - - private function formatSinglePembanding($request, $index) { $fields = [ @@ -789,8 +777,6 @@ class SurveyorController extends Controller $branches = Branch::all(); $provinces = Province::all(); - - $inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); $formFoto = null; @@ -798,12 +784,6 @@ class SurveyorController extends Controller $formFoto = json_decode($inpeksi->foto_form, true); } $fotoJaminan = null; - - // return response()->json([ - // 'inspeksi' => $formFoto, - - // ]); - return view('lpj::surveyor.components.foto', compact('permohonan', 'surveyor', 'branches', 'provinces', 'fotoJaminan', 'formFoto')); } @@ -851,7 +831,6 @@ class SurveyorController extends Controller throw new \Exception('Error decoding comparison data: ' . json_last_error_msg()); } - } $fotoForm = json_decode($inspeksi->foto_form, true); @@ -919,7 +898,6 @@ class SurveyorController extends Controller public function createData($type) { - $spekKategoriBagunan = SpekKategoritBangunan::all(); $header = $this->getHeader($type); return view('lpj::surveyor.data.form', compact('header', 'spekKategoriBagunan')); @@ -928,7 +906,6 @@ class SurveyorController extends Controller public function storeData(SurveyorRequest $request, $type) { - $validate = $request->validated(); if ($validate) { @@ -1029,8 +1006,6 @@ class SurveyorController extends Controller ->with('error', 'Invalid type specified.'); } - - $model = $modelClass::findOrFail($id); $model->update($validate); @@ -1299,10 +1274,7 @@ class SurveyorController extends Controller if (!$modelClass) { return response()->json(['success' => false, 'message' => 'Invalid type specified.'], 400); } - - $model = $modelClass::findOrFail($id); - $model->delete(); return response()->json(['success' => true, 'message' => 'deleted successfully']); } catch (ModelNotFoundException $e) { @@ -1382,7 +1354,6 @@ class SurveyorController extends Controller { return [ 'branches' => Branch::all(), - 'bentukTanah' => BentukTanah::all(), 'konturTanah' => KonturTanah::all(), 'posisiKavling' => PosisiKavling::all(), @@ -1413,6 +1384,8 @@ class SurveyorController extends Controller 'jenisJaminan' => JenisJaminan::all(), 'hubCadeb' => HubunganPemilikJaminan::all(), 'hubPenghuni' => HubunganPenghuniJaminan::all(), + 'perkerasanJalan' => PerkerasanJalan::all(), + 'terletakDiArea' => TerletakArea::all(), ]; } @@ -1543,23 +1516,35 @@ class SurveyorController extends Controller $data = $request->all(); $result = []; - // foreach ($data['nama_bangunan'] as $index => $bangunan) { - // $bangunanData = [ - // 'bangunan' => $bangunan, - // 'kategori' => [] - // ]; - // foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) { - // if (isset($data['spek_bangunan'][$kategori])) { - // $bangunanData['kategori'][] = [ - // 'kategori' => $kategori, - // 'spesifikasi' => $data['spek_bangunan'][$kategori] - // ]; - // } - // } - - // $result[] = $bangunanData; - // } + foreach ($request->input('nama_bangunan') as $index => $buildingName) { + if (empty($buildingName)) continue; // Skip if building name is empty + + $buildingData = []; + $buildingData['bagunan'] = $buildingName; + + $specCategories = $request->input('spek_kategori_bangunan'); + $buildingData['spek_kategori_bangunan'] = []; + + if (!empty($specCategories)) { + foreach ($specCategories as $category) { + if (empty($category)) continue; // Skip empty categories + + $specs = $request->input("spek_bangunan.{$index}.{$category}", []); + + // Only add category if it has specifications + if (!empty($specs)) { + $buildingData['spek_kategori_bangunan'][$category] = $specs; + } + } + } + + // Only add building data if it has specifications + if (!empty($buildingData['spek_kategori_bangunan'])) { + $result[] = $buildingData; + } + } + return [ 'bangunan' => [ @@ -1621,8 +1606,8 @@ class SurveyorController extends Controller 'fakta_negatif' => $data['fakta_negatif'] ?? null, 'rute_menuju' => $data['rute_menuju'] ?? null, 'batas_batas' => $this->mapArrayWithInputs( - $data['batas_batas'] ?? null, - $data['batas_batas_input'] ?? null + $data['batas_batas'] ?? [], + $data['batas_batas_input'] ?? [] ), 'kondisi_lingkungan' => $data['kondisi_lingkungan'] ?? null, 'kondisi_lain_bangunan' => $data['kondisi_lain_bangunan'] ?? null, diff --git a/app/Http/Requests/FormSurveyorRequest.php b/app/Http/Requests/FormSurveyorRequest.php index 9bf82e3..11ef307 100644 --- a/app/Http/Requests/FormSurveyorRequest.php +++ b/app/Http/Requests/FormSurveyorRequest.php @@ -104,9 +104,13 @@ class FormSurveyorRequest extends FormRequest 'kondisi_bangunan' => 'nullable', 'sifat_bangunan' => 'required|array', 'sifat_bangunan_input' => 'nullable|array', - 'nama_bagunan' => 'required|nullable', - 'spek_kategori_bangunan.*' => 'required', - 'spek_bangunan.*' => 'required', + + + 'nama_bangunan.*' => 'required|string|max:255', + 'spek_kategori_bangunan.*' => 'nullable|string', + 'spek_bangunan.*.*' => 'array', + 'spek_bangunan.*.*.*' => 'string', + 'sarana_pelengkap' => 'required', 'sarana_pelengkap_input' => 'nullable|array', ]; @@ -549,7 +553,7 @@ class FormSurveyorRequest extends FormRequest 'fakta_positif' => 'nullable|array', 'fakta_negatif' => 'nullable|array', 'rute_menuju' => 'nullable', - 'batas_batas' => 'nullable|array', + 'batas_batas' => 'required|array', 'batas_batas_input' => 'nullable|array', 'kondisi_lingkungan' => 'nullable|array', 'kondisi_lain_bangunan' => 'nullable|array', diff --git a/resources/views/surveyor/components/bangunan.blade.php b/resources/views/surveyor/components/bangunan.blade.php index 0b7a4d5..864daf0 100644 --- a/resources/views/surveyor/components/bangunan.blade.php +++ b/resources/views/surveyor/components/bangunan.blade.php @@ -144,50 +144,102 @@ -
-
- - -
- @if (@isset($basicData['spekKategoriBangunan'])) - @foreach ($basicData['spekKategoriBangunan'] as $item) -
- - -
-
- @foreach ($basicData['spekBangunan'] as $spek) - @if ($spek->spek_kategori_bangunan_id == $item->id) - - @endif - @endforeach + @if (isset($forminspeksi['bangunan']) && is_array($forminspeksi['bangunan'])) + @foreach ($forminspeksi['bangunan']['spesifikasi_bangunan'] as $index => $bangunan) +
+ + +
+ @if (@isset($basicData['spekKategoriBangunan'])) + @foreach ($basicData['spekKategoriBangunan'] as $item) +
+ + +
+
+ @foreach ($basicData['spekBangunan'] as $spek) + @if ($spek->spek_kategori_bangunan_id == $item->id) + + @endif + @endforeach +
+ +
+
+ @endforeach + @endif +
+ +
+ @endforeach + @else + +
+ + +
+ @if (@isset($basicData['spekKategoriBangunan'])) + @foreach ($basicData['spekKategoriBangunan'] as $item) +
+ + +
+
+ @foreach ($basicData['spekBangunan'] as $spek) + @if ($spek->spek_kategori_bangunan_id == $item->id) + + @endif + @endforeach +
+
-
-
- @endforeach - @endif + @endforeach + @endif +
+
- -
+ @endif
- @@ -245,11 +297,8 @@ function updateDeleteButtonsVisibility() { const allDeleteButtons = spekBangunanContainer.querySelectorAll('.delete-button'); allDeleteButtons.forEach(button => { - if (spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1) { - button.style.display = 'inline-block'; - } else { - button.style.display = 'none'; - } + button.style.display = spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1 ? + 'inline-block' : 'none'; }); } @@ -257,64 +306,80 @@ const allSpekBangunan = spekBangunanContainer.querySelectorAll('.spek-bangunan'); allSpekBangunan.forEach((div, index) => { const label = div.querySelector('.building-label'); + const nameInput = div.querySelector('input[name^="nama_bangunan"]'); if (label) { - label.textContent = `Bangunan ${index + 1}`; + const buildingName = `Bangunan ${index + 1}`; + label.textContent = buildingName; + if (nameInput) { + nameInput.value = buildingName; + } + } + }); + } + + function updateInputNames(container, index) { + container.querySelectorAll('input').forEach(input => { + if (input.name) { + if (input.name.includes('[')) { + if (input.name.startsWith('spek_bangunan')) { + // Handle spek_bangunan inputs + const matches = input.name.match(/spek_bangunan\[\d+\]\[(.*?)\]/); + if (matches) { + input.name = `spek_bangunan[${index}][${matches[1]}][]`; + } + } else { + // Handle other array inputs + input.name = input.name.replace(/\[\d*\]/, `[${index}]`); + } + } } }); } document.getElementById('addBagunan').addEventListener('click', function() { const newDiv = spekBangunanContainer.querySelector('.spek-bangunan').cloneNode(true); + const newIndex = spekBangunanContainer.querySelectorAll('.spek-bangunan').length; - // Update input fields - newDiv.querySelectorAll('select, input').forEach((input, index) => { - if (input.type === 'checkbox' || input.type === 'radio') { + // Reset and update inputs + newDiv.querySelectorAll('input').forEach(input => { + if (input.type === 'checkbox') { input.checked = false; } else { input.value = ''; } - - // Update name attribute - if (input.name) { - const baseName = input.name.split('[')[0]; // Get the base name - const count = spekBangunanContainer.querySelectorAll('.spek-bangunan').length + 1; - input.name = `${baseName}[${count}]`; - } }); - // Append the cloned div - spekBangunanContainer.appendChild(newDiv); + // Update input names + updateInputNames(newDiv, newIndex); - // Add event listener to the delete button in the cloned div - newDiv.querySelector('.delete-button').addEventListener('click', function() { - spekBangunanContainer.removeChild(newDiv); + // Add delete button handler + const deleteButton = newDiv.querySelector('.delete-button'); + deleteButton.addEventListener('click', function() { + newDiv.remove(); updateDeleteButtonsVisibility(); updateBuildingLabels(); }); - // Update UI + // Append and update UI + spekBangunanContainer.appendChild(newDiv); updateDeleteButtonsVisibility(); updateBuildingLabels(); }); - - // Initial setup: Ensure "Bangunan 1" is labeled + // Initialize on page load document.addEventListener('DOMContentLoaded', () => { updateDeleteButtonsVisibility(); - updateBuildingLabels(); // Ensure the first label is set - }); + updateBuildingLabels(); - // Add delete functionality to the initial form - spekBangunanContainer.querySelectorAll('.delete-button').forEach(button => { - button.addEventListener('click', function() { - const spekBangunan = this.closest('.spek-bangunan'); - - // Make sure not to delete the last remaining form - if (spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1) { - spekBangunan.remove(); - updateDeleteButtonsVisibility(); - updateBuildingLabels(); // Update the labels after removing - } + // Add delete handlers to existing buttons + spekBangunanContainer.querySelectorAll('.delete-button').forEach(button => { + button.addEventListener('click', function() { + if (spekBangunanContainer.querySelectorAll('.spek-bangunan').length > 1) { + this.closest('.spek-bangunan').remove(); + updateDeleteButtonsVisibility(); + updateBuildingLabels(); + } + }); }); }); diff --git a/resources/views/surveyor/components/data-pembanding.blade.php b/resources/views/surveyor/components/data-pembanding.blade.php index 88e8566..ae5587a 100644 --- a/resources/views/surveyor/components/data-pembanding.blade.php +++ b/resources/views/surveyor/components/data-pembanding.blade.php @@ -74,11 +74,8 @@
- +
@@ -243,15 +240,14 @@ - @@ -283,17 +279,11 @@ - @@ -325,17 +315,11 @@ - @@ -365,17 +349,11 @@ - @@ -569,7 +547,7 @@ // Update IDs and names for the new cell const inputs = newCell.querySelectorAll('input, select, textarea'); - inputs.forEach(input => { + inputs.forEach((input, index) => { if (input.type === 'file') { const newImageId = `uploadedImage${columnCount + 1}`; const preview = newCell.querySelector('img'); @@ -582,11 +560,20 @@ }; } } + + if (input.id) { + input.id = updateDynamicId(input.id, columnCount); + } + // Clear values if (input.type !== 'file') { input.value = ''; } + + loadIdSelectAddres(input.id); }); + + } row.appendChild(newCell); }); @@ -595,6 +582,10 @@ reinitializeEventListeners(); } + function updateDynamicId(currentId, columnCount) { + return `${currentId.split('_')[0]}_${'code_pembanding'}_${columnCount}`; + } + function removeColumn() { if (columnCount > 1) { const table = document.getElementById('dataTable'); @@ -740,6 +731,124 @@ } }); } + + function loadIdSelectAddres(inputs) { + const data = [ + 'province_code_pembanding', + 'city_code_pembanding', + 'district_code_pembanding', + 'village_code_pembanding' + ] + + + + + } + + + document.addEventListener('DOMContentLoaded', function() { + // Memuat data provinsi saat halaman dimuat + loadProvinces(); + + // Event listener untuk perubahan pada dropdown Province + document.getElementById('province_code_pembanding').addEventListener('change', function() { + const provinceId = this.value; + if (provinceId) { + getCity(provinceId); // Kirimkan provinceId ke fungsi getCity + } else { + resetDropdown('city_code_pembanding', 'Select City'); + resetDropdown('district_code_pembanding', 'Select District'); + resetDropdown('village_code_pembanding', 'Select Village'); + } + }); + + // Event listener untuk perubahan pada dropdown City + document.getElementById('city_code_pembanding').addEventListener('change', function() { + const cityId = this.value; + if (cityId) { + getDistrict(cityId); + } else { + resetDropdown('district_code_pembanding', 'Select District'); + resetDropdown('village_code_pembanding', 'Select Village'); + } + }); + + // Event listener untuk perubahan pada dropdown District + document.getElementById('district_code_pembanding').addEventListener('change', function() { + const districtId = this.value; + if (districtId) { + getVillage(districtId); + } else { + resetDropdown('village_code_pembanding', 'Select Village'); + } + }); + }); + + function loadProvinces() { + const provinces = + @json($provinces); // Using Laravel's Blade templating to pass the provinces array to JS + + const provinceDropdown = document.getElementById('province_code_pembanding'); + provinceDropdown.innerHTML = ''; + + provinces.forEach(province => { + provinceDropdown.innerHTML += ``; + }); + } + + async function getCity(provinceId) { + try { + const response = await fetch( + `/locations/cities/province/${provinceId}`); // Assuming this is still your API + const data = await response.json(); + + const cityDropdown = document.getElementById('city_code_pembanding'); + cityDropdown.innerHTML = ''; + + data.forEach(city => { + cityDropdown.innerHTML += ``; + }); + } catch (error) { + console.error('Error fetching cities:', error); + } + } + + async function getDistrict(cityId) { + try { + const response = await fetch(`/locations/districts/city/${cityId}`); + const data = await response.json(); + + const districtDropdown = document.getElementById('district_code_pembanding'); + districtDropdown.innerHTML = ''; + + data.forEach(district => { + districtDropdown.innerHTML += ``; + }); + } catch (error) { + console.error('Error fetching districts:', error); + } + } + + async function getVillage(districtId) { + try { + const response = await fetch(`/locations/villages/district/${districtId}`); + const data = await response.json(); + + const villageDropdown = document.getElementById('village_code_pembanding'); + villageDropdown.innerHTML = ''; + + data.forEach(village => { + villageDropdown.innerHTML += ``; + }); + } catch (error) { + console.error('Error fetching villages:', error); + } + } + + function resetDropdown(elementId, placeholder) { + const dropdown = document.getElementById(elementId); + dropdown.innerHTML = ``; + }