Files
eCert-MBIP/app/Http/Controllers/Admin/QuestionnaireSetController.php
2026-05-19 09:53:36 +08:00

119 lines
3.4 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\QuestionnaireSet;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
class QuestionnaireSetController extends Controller
{
public function index(Request $request): View
{
$query = QuestionnaireSet::withCount('questions')
->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.');
}
}