2024-07-15 06:24:05 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
2024-07-18 11:43:20 +00:00
|
|
|
|
2024-07-15 06:24:05 +00:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use App\Models\Form;
|
|
|
|
use App\Models\User;
|
|
|
|
use App\Models\Question;
|
|
|
|
use App\Models\Response;
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
2024-07-16 11:44:26 +00:00
|
|
|
use Illuminate\Support\Facades\Session;
|
2024-07-18 11:43:20 +00:00
|
|
|
|
2024-07-15 06:24:05 +00:00
|
|
|
class FormController extends Controller
|
|
|
|
{
|
|
|
|
public function index()
|
|
|
|
{
|
|
|
|
// Get forms belonging to the authenticated user
|
|
|
|
$forms = Form::where('user_id', Auth::id())->get();
|
|
|
|
return view('forms.index', compact('forms'));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function create()
|
|
|
|
{
|
|
|
|
return view('forms.create');
|
|
|
|
}
|
|
|
|
|
|
|
|
public function edit(Form $form)
|
2024-07-18 11:43:20 +00:00
|
|
|
{
|
|
|
|
// Questions are already fetched with their options cast to array due to the casts property
|
|
|
|
$questions = $form->questions;
|
|
|
|
foreach ($questions as $question) {
|
|
|
|
$question->options = json_decode($question->options, true);
|
|
|
|
}
|
2024-07-15 06:24:05 +00:00
|
|
|
|
2024-07-18 11:43:20 +00:00
|
|
|
// Pass the questions to the view
|
|
|
|
return view('forms.edit', compact('form', 'questions'));
|
|
|
|
}
|
2024-07-15 06:24:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function store(Request $request)
|
|
|
|
{
|
|
|
|
$validatedData = $request->validate([
|
|
|
|
'title' => 'required|string|max:255',
|
|
|
|
'description' => 'nullable|string',
|
|
|
|
'questions' => 'required|array',
|
|
|
|
'questions.*.type' => 'required|string|in:multiple_choice,checkbox,dropdown,short_answer,long_answer',
|
|
|
|
'questions.*.text' => 'required|string', // This should match the key used in the JavaScript
|
|
|
|
'questions.*.options' => 'nullable|array',
|
|
|
|
]);
|
|
|
|
|
|
|
|
$form = new Form();
|
|
|
|
$form->title = $validatedData['title'];
|
|
|
|
$form->description = $validatedData['description'];
|
|
|
|
$form->is_published = $request->input('is_published', false); // Default to false if not provided
|
|
|
|
$form->user_id = Auth::id();
|
|
|
|
$form->save();
|
|
|
|
|
|
|
|
foreach ($validatedData['questions'] as $questionData) {
|
|
|
|
$question = new Question();
|
|
|
|
$question->form_id = $form->id;
|
|
|
|
$question->type = $questionData['type'];
|
|
|
|
$question->question_text = $questionData['text']; // Ensure this matches the key in the validated data
|
|
|
|
$question->options = isset($questionData['options']) ? json_encode($questionData['options']) : null;
|
|
|
|
|
|
|
|
$question->save();
|
|
|
|
}
|
2024-07-16 11:44:26 +00:00
|
|
|
Session::flash('success', 'Form created successfully!');
|
2024-07-15 06:24:05 +00:00
|
|
|
return response()->json(['success' => true, 'form_id' => $form->id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function show(Form $form)
|
|
|
|
{
|
|
|
|
$form->load('questions.responses');
|
|
|
|
return view('forms.show', compact('form'));
|
|
|
|
}
|
|
|
|
|
2024-07-16 11:44:26 +00:00
|
|
|
public function preview($id)
|
2024-07-18 11:43:20 +00:00
|
|
|
{
|
|
|
|
$form = Form::findOrFail($id);
|
|
|
|
return view('forms.previewForm', compact('form'));
|
|
|
|
}
|
2024-07-16 11:44:26 +00:00
|
|
|
|
2024-07-15 06:24:05 +00:00
|
|
|
|
|
|
|
public function update(Request $request, Form $form)
|
|
|
|
{
|
|
|
|
if ($request->has('publish')) {
|
|
|
|
$form->is_published = !$form->is_published;
|
|
|
|
$form->save();
|
|
|
|
|
|
|
|
return redirect()->route('forms.show', $form);
|
|
|
|
}
|
|
|
|
Log::info('Incoming request data: ', $request->all());
|
|
|
|
|
|
|
|
$validatedData = $request->validate([
|
|
|
|
'title' => 'required|string|max:255',
|
|
|
|
'description' => 'nullable|string|max:255',
|
|
|
|
'questions' => 'required|array',
|
|
|
|
'questions.*.id' => 'nullable|exists:questions,id',
|
|
|
|
'questions.*.type' => 'required|string|in:multiple_choice,checkbox,dropdown,short_answer,long_answer',
|
|
|
|
'questions.*.text' => 'required|string|max:255',
|
|
|
|
'questions.*.options' => 'nullable|array',
|
|
|
|
'questions.*.options.*' => 'nullable|string|max:255',
|
|
|
|
]);
|
|
|
|
|
|
|
|
Log::info('Validated data: ', $validatedData);
|
|
|
|
|
|
|
|
$form->update([
|
|
|
|
'title' => $validatedData['title'],
|
|
|
|
'description' => $validatedData['description'],
|
|
|
|
]);
|
|
|
|
|
|
|
|
$existingQuestionIds = [];
|
|
|
|
foreach ($validatedData['questions'] as $questionData) {
|
|
|
|
if (isset($questionData['id'])) {
|
|
|
|
$question = Question::find($questionData['id']);
|
|
|
|
} else {
|
|
|
|
$question = new Question();
|
|
|
|
$question->form_id = $form->id;
|
|
|
|
}
|
|
|
|
|
|
|
|
$question->type = $questionData['type'];
|
|
|
|
$question->question_text = $questionData['text'];
|
|
|
|
$question->options = isset($questionData['options']) ? json_encode($questionData['options']) : json_encode([]);
|
|
|
|
$question->save();
|
|
|
|
|
|
|
|
Log::info('Saved question: ', $question->toArray());
|
|
|
|
|
|
|
|
$existingQuestionIds[] = $question->id;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete questions that were removed
|
|
|
|
$form->questions()->whereNotIn('id', $existingQuestionIds)->delete();
|
|
|
|
|
|
|
|
Log::info('Remaining questions: ', $form->questions()->get()->toArray());
|
|
|
|
|
|
|
|
return redirect()->route('forms.show', $form)->with('success', 'Form updated successfully.');
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function destroy(Form $form)
|
|
|
|
{
|
|
|
|
// This will also delete all related questions and responses due to foreign key constraints
|
|
|
|
$form->delete();
|
|
|
|
|
2024-07-16 11:44:26 +00:00
|
|
|
return redirect()->route('forms.index')->with('delete', 'Form deleted successfully.');
|
2024-07-15 06:24:05 +00:00
|
|
|
}
|
|
|
|
}
|