- QuestionnaireSetController: full CRUD + publish/archive - QuestionController: store, update, destroy, reorder - ProgramQuestionnaireController: attach, confirm, detach - Public/QuestionnaireController: show form, submit responses, double-submit guard - Views: admin questionnaire CRUD, program questionnaire assign, public form + thankyou/already Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
90 lines
3.4 KiB
PHP
90 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Admin;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\QuestionnaireQuestion;
|
|
use App\Models\QuestionnaireSet;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class QuestionController extends Controller
|
|
{
|
|
public function store(Request $request, QuestionnaireSet $set): RedirectResponse
|
|
{
|
|
$data = $request->validate([
|
|
'question_text' => 'required|string|max:1000',
|
|
'question_type' => 'required|in:rating,single_choice,multiple_choice,short_text,long_text',
|
|
'is_required' => 'boolean',
|
|
'options' => 'nullable|array',
|
|
'options.*' => 'required|string|max:255',
|
|
]);
|
|
|
|
$needsOptions = in_array($data['question_type'], ['single_choice', 'multiple_choice']);
|
|
if ($needsOptions && empty($data['options'])) {
|
|
return back()->withErrors(['options' => 'Pilihan jawapan diperlukan untuk jenis soalan ini.'])->withInput();
|
|
}
|
|
|
|
$maxOrder = $set->questions()->max('sort_order') ?? 0;
|
|
|
|
$set->questions()->create([
|
|
'question_text' => $data['question_text'],
|
|
'question_type' => $data['question_type'],
|
|
'is_required' => $data['is_required'] ?? true,
|
|
'options_json' => $needsOptions ? array_values(array_filter($data['options'] ?? [])) : null,
|
|
'sort_order' => $maxOrder + 1,
|
|
]);
|
|
|
|
return redirect()->route('admin.questionnaires.show', $set)
|
|
->with('success', 'Soalan berjaya ditambah.');
|
|
}
|
|
|
|
public function update(Request $request, QuestionnaireQuestion $question): RedirectResponse
|
|
{
|
|
$data = $request->validate([
|
|
'question_text' => 'required|string|max:1000',
|
|
'question_type' => 'required|in:rating,single_choice,multiple_choice,short_text,long_text',
|
|
'is_required' => 'boolean',
|
|
'options' => 'nullable|array',
|
|
'options.*' => 'required|string|max:255',
|
|
]);
|
|
|
|
$needsOptions = in_array($data['question_type'], ['single_choice', 'multiple_choice']);
|
|
|
|
$question->update([
|
|
'question_text' => $data['question_text'],
|
|
'question_type' => $data['question_type'],
|
|
'is_required' => $data['is_required'] ?? true,
|
|
'options_json' => $needsOptions ? array_values(array_filter($data['options'] ?? [])) : null,
|
|
]);
|
|
|
|
return redirect()->route('admin.questionnaires.show', $question->questionnaire_set_id)
|
|
->with('success', 'Soalan berjaya dikemaskini.');
|
|
}
|
|
|
|
public function destroy(QuestionnaireQuestion $question): RedirectResponse
|
|
{
|
|
$setId = $question->questionnaire_set_id;
|
|
$question->delete();
|
|
|
|
return redirect()->route('admin.questionnaires.show', $setId)
|
|
->with('success', 'Soalan berjaya dipadam.');
|
|
}
|
|
|
|
public function reorder(Request $request): JsonResponse
|
|
{
|
|
$data = $request->validate([
|
|
'order' => 'required|array',
|
|
'order.*' => 'integer|exists:questionnaire_questions,id',
|
|
]);
|
|
|
|
foreach ($data['order'] as $sortOrder => $questionId) {
|
|
QuestionnaireQuestion::where('id', $questionId)
|
|
->update(['sort_order' => $sortOrder + 1]);
|
|
}
|
|
|
|
return response()->json(['ok' => true]);
|
|
}
|
|
}
|