diff --git a/app/Http/Controllers/Admin/QuizController.php b/app/Http/Controllers/Admin/QuizController.php index a36cef0..f8afbde 100644 --- a/app/Http/Controllers/Admin/QuizController.php +++ b/app/Http/Controllers/Admin/QuizController.php @@ -18,8 +18,8 @@ class QuizController extends Controller { } public function store(Request $r) { - $r->validate(['title'=>'required|string|max:120','subject_id'=>'required|exists:subjects,id','description'=>'nullable|string|max:500']); - $quiz = Quiz::create($r->only('title','subject_id','description') + ['active'=>true]); + $r->validate(['title'=>'required|string|max:120','subject_id'=>'required|exists:subjects,id','description'=>'nullable|string|max:500','grade'=>'nullable|integer|min:1|max:13']); + $quiz = Quiz::create($r->only('title','subject_id','description') + ['active'=>true,'grade'=>$r->grade ?: null]); return redirect()->route('admin.quizzes.edit', $quiz)->with('success','Quiz erstellt – jetzt Fragen hinzufügen.'); } @@ -30,8 +30,8 @@ class QuizController extends Controller { } public function update(Request $r, Quiz $quiz) { - $r->validate(['title'=>'required|string|max:120','subject_id'=>'required|exists:subjects,id','description'=>'nullable|string|max:500']); - $quiz->update($r->only('title','subject_id','description') + ['active'=>$r->boolean('active')]); + $r->validate(['title'=>'required|string|max:120','subject_id'=>'required|exists:subjects,id','description'=>'nullable|string|max:500','grade'=>'nullable|integer|min:1|max:13']); + $quiz->update($r->only('title','subject_id','description') + ['active'=>$r->boolean('active'),'grade'=>$r->grade ?: null]); return back()->with('success','Quiz gespeichert.'); } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 989fb0a..bbc8b1a 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -15,6 +15,7 @@ class UserController extends Controller { 'name' => 'required|string|max:60', 'email' => 'required|email|unique:users', 'password' => 'required|min:6', + 'grade' => 'nullable|integer|min:1|max:13', ]); User::create([ 'name' => $r->name, @@ -22,6 +23,7 @@ class UserController extends Controller { 'password' => Hash::make($r->password), 'role' => 'child', 'points' => 0, + 'grade' => $r->grade ?: null, ]); return redirect()->route('admin.users.index')->with('success','Kind-Konto erstellt.'); } @@ -32,8 +34,9 @@ class UserController extends Controller { 'email' => 'required|email|unique:users,email,'.$user->id, 'password' => 'nullable|min:6', 'points' => 'required|integer|min:0', + 'grade' => 'nullable|integer|min:1|max:13', ]); - $user->fill(['name'=>$r->name,'email'=>$r->email,'points'=>$r->points]); + $user->fill(['name'=>$r->name,'email'=>$r->email,'points'=>$r->points,'grade'=>$r->grade ?: null]); if ($r->filled('password')) $user->password = Hash::make($r->password); $user->save(); return redirect()->route('admin.users.index')->with('success','Gespeichert.'); diff --git a/app/Http/Controllers/Child/LearnController.php b/app/Http/Controllers/Child/LearnController.php index db8d96b..d70e12c 100644 --- a/app/Http/Controllers/Child/LearnController.php +++ b/app/Http/Controllers/Child/LearnController.php @@ -22,14 +22,24 @@ class LearnController extends Controller { $answeredToday = QuestionAttempt::where('user_id',$user->id) ->whereDate('created_at', today()) ->pluck('question_id'); + $grade = $user->grade; $question = $subject->activeQuestions() ->whereNotIn('id', $answeredToday) + ->where(function($q) use ($grade) { + $q->whereNull('grade'); + if ($grade) $q->orWhere('grade', $grade); + }) ->with('answerOptions') ->inRandomOrder() ->first(); // Falls alle beantwortet: ganz random if (!$question) { - $question = $subject->activeQuestions()->with('answerOptions')->inRandomOrder()->first(); + $question = $subject->activeQuestions() + ->where(function($q) use ($grade) { + $q->whereNull('grade'); + if ($grade) $q->orWhere('grade', $grade); + }) + ->with('answerOptions')->inRandomOrder()->first(); } if (!$question) { return redirect()->route('learn.subjects')->with('info','Noch keine Fragen für dieses Fach.'); diff --git a/app/Http/Controllers/Child/QuizController.php b/app/Http/Controllers/Child/QuizController.php index bdcdbce..308b41a 100644 --- a/app/Http/Controllers/Child/QuizController.php +++ b/app/Http/Controllers/Child/QuizController.php @@ -8,7 +8,12 @@ class QuizController extends Controller { public function index() { $subjects = Subject::all()->keyBy('id'); + $grade = auth()->user()->grade; $quizzes = Quiz::with('subject')->where('active',true) + ->where(function($q) use ($grade) { + $q->whereNull('grade'); + if ($grade) $q->orWhere('grade', $grade); + }) ->withCount('questions')->get()->groupBy('subject_id'); $bestScores = QuizAttempt::where('user_id',auth()->id()) ->where('status','completed') diff --git a/app/Models/User.php b/app/Models/User.php index 04b1669..0202e88 100755 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -5,7 +5,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use HasFactory, Notifiable; - protected $fillable = ['name','email','password','role','points']; + protected $fillable = ['name','email','password','role','points','grade']; protected $hidden = ['password','remember_token']; protected $casts = ['email_verified_at' => 'datetime', 'password' => 'hashed']; diff --git a/database/migrations/2026_05_06_000000_add_grade_to_users_quizzes_questions.php b/database/migrations/2026_05_06_000000_add_grade_to_users_quizzes_questions.php new file mode 100644 index 0000000..92849b3 --- /dev/null +++ b/database/migrations/2026_05_06_000000_add_grade_to_users_quizzes_questions.php @@ -0,0 +1,16 @@ + $t->unsignedTinyInteger('grade')->nullable()->after('role')); + Schema::table('quizzes', fn(Blueprint $t) => $t->unsignedTinyInteger('grade')->nullable()->after('active')); + Schema::table('questions', fn(Blueprint $t) => $t->unsignedTinyInteger('grade')->nullable()->after('active')); + } + public function down(): void { + Schema::table('users', fn(Blueprint $t) => $t->dropColumn('grade')); + Schema::table('quizzes', fn(Blueprint $t) => $t->dropColumn('grade')); + Schema::table('questions', fn(Blueprint $t) => $t->dropColumn('grade')); + } +}; diff --git a/resources/views/admin/questions/index.blade.php b/resources/views/admin/questions/index.blade.php index 20b23e5..78364d9 100644 --- a/resources/views/admin/questions/index.blade.php +++ b/resources/views/admin/questions/index.blade.php @@ -67,6 +67,7 @@ Frage + Klasse Schwierigkeit Aktiv @@ -78,6 +79,7 @@ {{ $q->question_text }} + {{ $q->grade ? "Kl.".$q->grade : "–" }} {{ $q->difficultyStars() }} {{ $q->active ? '✅' : '⏸️' }} diff --git a/resources/views/admin/quizzes/create.blade.php b/resources/views/admin/quizzes/create.blade.php index 85f33c1..b025096 100644 --- a/resources/views/admin/quizzes/create.blade.php +++ b/resources/views/admin/quizzes/create.blade.php @@ -21,6 +21,15 @@ +
+ + +
diff --git a/resources/views/admin/quizzes/edit.blade.php b/resources/views/admin/quizzes/edit.blade.php index fecb3aa..c672e00 100644 --- a/resources/views/admin/quizzes/edit.blade.php +++ b/resources/views/admin/quizzes/edit.blade.php @@ -25,6 +25,15 @@ +
+ + +
active?'checked':'' }} class="w-4 h-4 text-violet-600"> diff --git a/resources/views/admin/quizzes/index.blade.php b/resources/views/admin/quizzes/index.blade.php index b838cb2..9750784 100644 --- a/resources/views/admin/quizzes/index.blade.php +++ b/resources/views/admin/quizzes/index.blade.php @@ -36,7 +36,9 @@ @forelse($quizzes as $quiz) {{ $quiz->subject->icon }} {{ $quiz->subject->name }} - {{ $quiz->title }} + {{ $quiz->title }} + @if($quiz->grade)Kl.{{ $quiz->grade }}@endif + {{ $quiz->questions_count }}/10 diff --git a/resources/views/admin/users/create.blade.php b/resources/views/admin/users/create.blade.php index de7d631..00b5333 100644 --- a/resources/views/admin/users/create.blade.php +++ b/resources/views/admin/users/create.blade.php @@ -22,6 +22,15 @@ @error('password')

{{ $message }}

@enderror
+
+ + +
diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php index 2e6a9cc..565b19a 100644 --- a/resources/views/admin/users/edit.blade.php +++ b/resources/views/admin/users/edit.blade.php @@ -23,6 +23,15 @@ +
+ + +
diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index e8c728f..e24f219 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -11,6 +11,7 @@ Name E-Mail + Klasse 🪙 Münzen Antworten @@ -21,7 +22,8 @@ {{ $u->name }} {{ $u->email }} - {{ $u->points }} + {{ $u->grade ? "Klasse ".$u->grade : "–" }} + {{ $u->points }} {{ $u->attempts_count }} Bearbeiten