feat: questionnaire management (Fasa 6)
- 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>
This commit is contained in:
@@ -3,63 +3,108 @@
|
||||
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
|
||||
{
|
||||
/**
|
||||
* Display a listing of the resource.
|
||||
*/
|
||||
public function index()
|
||||
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'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
public function create()
|
||||
public function create(): View
|
||||
{
|
||||
//
|
||||
return view('admin.questionnaires.create');
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*/
|
||||
public function store(Request $request)
|
||||
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.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(string $id)
|
||||
public function show(QuestionnaireSet $set): View
|
||||
{
|
||||
//
|
||||
$set->load(['questions', 'creator']);
|
||||
$usedInPrograms = $set->programs()->get();
|
||||
|
||||
return view('admin.questionnaires.show', compact('set', 'usedInPrograms'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*/
|
||||
public function edit(string $id)
|
||||
public function edit(QuestionnaireSet $set): View
|
||||
{
|
||||
//
|
||||
return view('admin.questionnaires.edit', compact('set'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
*/
|
||||
public function update(Request $request, string $id)
|
||||
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.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the specified resource from storage.
|
||||
*/
|
||||
public function destroy(string $id)
|
||||
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.');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user