From a672d8f60665f6e6c0a8502ffe93a639efbdb372 Mon Sep 17 00:00:00 2001 From: JokoPrasetio Date: Fri, 5 Dec 2025 15:35:05 +0700 Subject: [PATCH] done soal --- app/Http/Controllers/SoalController.php | 20 ++++ resources/views/soal/index.blade.php | 145 ++++++++++++++++++++---- resources/views/soal/list.blade.php | 2 +- 3 files changed, 144 insertions(+), 23 deletions(-) diff --git a/app/Http/Controllers/SoalController.php b/app/Http/Controllers/SoalController.php index 80df0bf..354c6d2 100644 --- a/app/Http/Controllers/SoalController.php +++ b/app/Http/Controllers/SoalController.php @@ -75,6 +75,25 @@ class SoalController extends Controller return $detail; }); + $groupInfoByHal = []; + foreach ($detailSoal as $detail) { + $halValue = (int) ($detail->hal ?? $daftarHal->first()); + if (!array_key_exists($halValue, $groupInfoByHal)) { + $groupInfoByHal[$halValue] = [ + 'nama' => $detail->group_nama, + 'keterangan' => $detail->group_keterangan, + ]; + continue; + } + + if (empty($groupInfoByHal[$halValue]['nama']) && !empty($detail->group_nama)) { + $groupInfoByHal[$halValue]['nama'] = $detail->group_nama; + } + + if (empty($groupInfoByHal[$halValue]['keterangan']) && !empty($detail->group_keterangan)) { + $groupInfoByHal[$halValue]['keterangan'] = $detail->group_keterangan; + } + } $soal->setRelation('soalDetail', $detailSoal); $halPertama = $daftarHal->first() ?? $hal; @@ -104,6 +123,7 @@ class SoalController extends Controller 'prefillJawaban' => $prefillJawaban, 'existingJawaban' => $existingJawaban, 'formLocked' => $formLocked, + 'groupInfoByHal' => $groupInfoByHal, ]); } diff --git a/resources/views/soal/index.blade.php b/resources/views/soal/index.blade.php index a9e2928..0ca0ee1 100644 --- a/resources/views/soal/index.blade.php +++ b/resources/views/soal/index.blade.php @@ -193,6 +193,8 @@ $formLocked = $formLocked ?? false; $prefillJawaban = $prefillJawaban ?? []; $existingJawaban = $existingJawaban ?? []; + $groupInfoByHal = $groupInfoByHal ?? []; + $currentGroupInfo = $groupInfoByHal[$hal] ?? ['nama' => null, 'keterangan' => null]; @endphp
@@ -224,6 +226,19 @@
+ @php + $groupNamaAktif = $currentGroupInfo['nama'] ?? null; + $groupKeteranganAktif = $currentGroupInfo['keterangan'] ?? null; + $groupNamaLabel = $groupNamaAktif ?: '-'; + $groupKeteranganLabel = $groupKeteranganAktif ?: '-'; + $shouldHideGroupCard = ($groupNamaLabel === '-' && $groupKeteranganLabel === '-'); + @endphp +
+
+
{{ $groupNamaLabel }}
+

{{ $groupKeteranganLabel }}

+
+
@if ($hal === $halPertama)
@@ -254,7 +269,7 @@ Halaman {{ $hal }} dari {{ $listHal->count() }}
-
+ @csrf @@ -263,20 +278,62 @@ $questionCounter = 0; $groupedQuestionDetails = []; $groupIndexMap = []; + $isLainnyaLabel = function ($value) { + if (!is_string($value)) { + return false; + } + $normalized = trim(strtolower($value)); + if ($normalized === '') { + return false; + } + return $normalized === 'lainnya' + || str_contains($normalized, 'lainnya') + || str_contains($normalized, 'other'); + }; + $isTidakBerlakuTidakTahuLabel = function ($value) { + if (!is_string($value)) { + return false; + } + $normalized = trim(strtolower(preg_replace('/\s+/', ' ', $value))); + if ($normalized === '') { + return false; + } + $hasTidakBerlakuTidakTahu = str_contains($normalized, 'tidak berlaku') && str_contains($normalized, 'tidak tahu'); + return $hasTidakBerlakuTidakTahu || str_contains($normalized, 'sebutkan alasan'); + }; + $isOtherOptionLabel = function ($value) use ($isLainnyaLabel, $isTidakBerlakuTidakTahuLabel) { + if (!is_string($value)) { + return false; + } + return $isLainnyaLabel($value) || $isTidakBerlakuTidakTahuLabel($value); + }; foreach ($soal->soalDetail as $detailItem) { $detailConfigItem = json_decode($detailItem->soal, true) ?? []; $detailHalValue = $detailItem->hal ?? $listHal->first(); $questionNumberValue = $detailConfigItem['no'] ?? null; + if (is_string($questionNumberValue)) { + $questionNumberValue = trim($questionNumberValue); + } $hasNumberValue = $questionNumberValue !== null && $questionNumberValue !== ''; + $groupNumberNormalized = null; + if ($hasNumberValue) { + $compactedNumber = strtolower(preg_replace('/[^a-z0-9]/i', '', (string) $questionNumberValue)); + if (preg_match('/^(\d+)[a-z]+$/', $compactedNumber, $numberMatch)) { + $groupNumberNormalized = $numberMatch[1]; + } elseif (preg_match('/^(\d+)$/', $compactedNumber, $numberMatch)) { + $groupNumberNormalized = $numberMatch[1]; + } + } + $groupNumberDisplay = $hasNumberValue ? ($groupNumberNormalized ?? $questionNumberValue) : null; $groupKey = $hasNumberValue - ? $detailHalValue . '|' . $questionNumberValue + ? $detailHalValue . '|' . ($groupNumberNormalized ?? (string) $questionNumberValue) : 'detail_' . $detailItem->id; if (!array_key_exists($groupKey, $groupIndexMap)) { $groupIndexMap[$groupKey] = count($groupedQuestionDetails); $groupedQuestionDetails[] = [ 'hal' => $detailHalValue, - 'number' => $hasNumberValue ? $questionNumberValue : null, + 'number' => $groupNumberDisplay, 'items' => [], ]; } @@ -348,28 +405,35 @@ $oldOtherAnswer = $currentAnswer; } $showLainnya = $isCustomCurrentAnswer - || (is_string($currentAnswer) && stripos($currentAnswer, 'lainnya') !== false) + || (is_string($currentAnswer) && $isOtherOptionLabel($currentAnswer)) || (!empty($oldOtherAnswer)); $detailHal = $detail->hal ?? $listHal->first(); $optionsCount = is_array($options) ? count($options) : 0; - $hasLainnyaOption = collect($options)->contains(function ($optionItem) { - return is_string($optionItem) && stripos($optionItem, 'lainnya') !== false; + $hasCustomOtherOption = collect($options)->contains(function ($optionItem) use ($isOtherOptionLabel) { + return $isOtherOptionLabel($optionItem); }); - if (!$hasLainnyaOption && $type === 'option_with_other') { + if (!$hasCustomOtherOption && $type === 'option_with_other') { $options[] = 'Lainnya'; $optionsCount = count($options); - $hasLainnyaOption = true; + $hasCustomOtherOption = true; } + $lainnyaOptionLabel = collect($options)->first(function ($optionItem) use ($isLainnyaLabel) { + return $isLainnyaLabel($optionItem); + }); + $tidakBerlakuOptionLabel = collect($options)->first(function ($optionItem) use ($isTidakBerlakuTidakTahuLabel) { + return $isTidakBerlakuTidakTahuLabel($optionItem); + }); + $otherOptionHintLabel = $lainnyaOptionLabel ?: $tidakBerlakuOptionLabel; + $shouldForceOtherSelection = $hasCustomOtherOption && $showLainnya; $isConsentQuestion = !empty($detailConfig['persetujuan_form']); - $shouldForceLainnyaSelection = $hasLainnyaOption && $showLainnya; $dualFormConfig = $detailConfig['dual_form'] ?? null; $useDualForm = $type === 'dual_form' || (!empty($dualFormConfig) && $dualFormConfig !== false); $dualYearOld = null; $dualMonthOld = null; $questionNumber = $detailConfig['no'] ?? ''; $hasGroupNumber = $groupNumber !== null && $groupNumber !== ''; - $badgeNumber = $hasGroupNumber ? $groupNumber : $questionNumber; - $shouldShowNumber = $badgeNumber !== null && $badgeNumber !== '' && (!$hasGroupNumber || $loop->first); + $displayNumber = $questionNumber !== '' ? $questionNumber : ($hasGroupNumber ? $groupNumber : ''); + $shouldShowNumber = $displayNumber !== null && $displayNumber !== ''; $rangeMin = null; $rangeMax = null; $rangeStep = 1; @@ -490,9 +554,9 @@
@if ($shouldShowNumber) - {{ $badgeNumber }} + {{ $displayNumber }} @elseif($hasGroupNumber) - + @endif
{{ $pertanyaan }}
@@ -637,9 +701,9 @@ @php $optionId = 'jawaban-' . $detail->id . '-' . $optionIndex; $optionLabel = is_scalar($option) ? (string) $option : ''; - $isLainnya = stripos($optionLabel, 'lainnya') !== false; - $optionValue = $isLainnya && $oldOtherAnswer ? $oldOtherAnswer : $optionLabel; - $shouldCheck = $currentAnswer === $optionValue || ($isLainnya && $shouldForceLainnyaSelection); + $isOtherOption = $isOtherOptionLabel($optionLabel); + $optionValue = $isOtherOption && $oldOtherAnswer ? $oldOtherAnswer : $optionLabel; + $shouldCheck = $currentAnswer === $optionValue || ($isOtherOption && $shouldForceOtherSelection); @endphp
- @if ($isLainnya) + @if ($isOtherOption) @php $lainnyaWrapperRendered = true; @endphp @@ -675,9 +739,9 @@ @endif @endforeach
- @if ($hasLainnyaOption || $type === 'option_with_other') + @if ($otherOptionHintLabel) - Jika jawaban yang Anda cari tidak ada di daftar, pilih opsi "Lainnya" lalu isi sesuai kebutuhan. + Jika jawaban yang Anda cari tidak ada di daftar, pilih opsi "{{ $otherOptionHintLabel }}" lalu isi sesuai kebutuhan. @endif