with('creator') ->latest(); if ($request->filled('q')) { $query->where('title', 'like', '%' . $request->q . '%'); } if ($request->filled('status')) { $query->where('status', $request->status); } $sets = $query->paginate(20)->withQueryString(); return view('admin.questionnaires.index', compact('sets')); } public function create(): View { return view('admin.questionnaires.create'); } public function store(Request $request): RedirectResponse { $data = $request->validate([ 'title' => 'required|string|max:255', 'description' => 'nullable|string|max:1000', ]); $data['created_by'] = auth()->id(); $data['status'] = 'draft'; $set = QuestionnaireSet::create($data); return redirect()->route('admin.questionnaires.show', $set) ->with('success', 'Set soalselidik berjaya dicipta.'); } public function show(QuestionnaireSet $set): View { $set->load('creator'); $topLevel = $set->questions() ->whereNull('parent_id') ->with(['children' => fn($q) => $q->orderBy('sort_order')]) ->orderBy('sort_order') ->get(); $totalCount = $set->questions()->count(); $usedInPrograms = $set->programs()->get(); return view('admin.questionnaires.show', compact('set', 'topLevel', 'totalCount', 'usedInPrograms')); } public function edit(QuestionnaireSet $set): View { return view('admin.questionnaires.edit', compact('set')); } public function update(Request $request, QuestionnaireSet $set): RedirectResponse { $data = $request->validate([ 'title' => 'required|string|max:255', 'description' => 'nullable|string|max:1000', ]); $set->update($data); return redirect()->route('admin.questionnaires.show', $set) ->with('success', 'Set soalselidik berjaya dikemaskini.'); } public function destroy(QuestionnaireSet $set): RedirectResponse { $confirmed = $set->programQuestionnaires()->where('is_confirmed', true)->exists(); if ($confirmed) { return back()->with('error', 'Soalselidik ini tidak boleh dipadam kerana sudah disahkan untuk program.'); } $set->delete(); return redirect()->route('admin.questionnaires.index') ->with('success', 'Set soalselidik berjaya dipadam.'); } public function publish(QuestionnaireSet $set): RedirectResponse { if ($set->questions()->count() === 0) { return back()->with('error', 'Tambah sekurang-kurangnya satu soalan sebelum menerbitkan.'); } $set->update(['status' => 'published']); return back()->with('success', 'Set soalselidik diterbitkan.'); } public function archive(QuestionnaireSet $set): RedirectResponse { $set->update(['status' => 'archived']); return back()->with('success', 'Set soalselidik diarkibkan.'); } }