Add Erinnerung (reference) section with articles for Deutsch, Mathe, Englisch

- Migration, model, admin+child controllers, all views
- 17 seeded articles: Nomen, Verben, Adjektive, Zeitformen, Satzarten,
  Wortarten, Ganze Zahlen, Grundrechenarten, Einmaleins, Geometrie,
  Brüche, Zahlen/Farben/Wochentage/Sätze/Tiere auf Englisch
- CSS for .ref-content (h2/h3/p/ul/table + .beispiel/.tipp/.merke blocks)
- Child nav + admin sidebar links
This commit is contained in:
root
2026-05-05 15:36:29 +00:00
parent 9986f69e9e
commit 90824894dd
13 changed files with 291 additions and 0 deletions
@@ -0,0 +1,47 @@
@extends('layouts.admin')
@section('title','Neuer Artikel')
@section('content')
<div class="max-w-3xl">
<a href="{{ route('admin.reference.index') }}" class="text-sm text-slate-500 hover:text-slate-700 mb-4 inline-block"> Zurück</a>
<div class="bg-white rounded-xl shadow-sm border border-slate-200 p-6">
<h2 class="font-semibold text-slate-800 mb-5">Neuer Erinnerungs-Artikel</h2>
<form method="POST" action="{{ route('admin.reference.store') }}" class="space-y-4">
@csrf
<div class="grid grid-cols-4 gap-3">
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Icon</label>
<input name="icon" value="{{ old('icon', $icon ?? '📖') }}" required maxlength="8"
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-center text-xl focus:ring-2 focus:ring-violet-500 outline-none">
</div>
<div class="col-span-3">
<label class="block text-sm font-medium text-slate-700 mb-1">Titel</label>
<input name="title" value="{{ old('title', $title ?? '') }}" required
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-violet-500 outline-none">
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Kategorie</label>
<select name="category" required class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-violet-500 outline-none">
@foreach($categories as $k => $v)
<option value="{{ $k }}" {{ old('category', $cat ?? '') == $k ? 'selected' : '' }}>{{ $v }}</option>
@endforeach
</select>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Reihenfolge</label>
<input name="sort_order" type="number" value="{{ old('sort_order', $order ?? 0) }}"
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-violet-500 outline-none">
</div>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Inhalt (HTML)</label>
<p class="text-xs text-slate-400 mb-2">Verfügbare Klassen: <code class="bg-slate-100 px-1 rounded">beispiel</code>, <code class="bg-slate-100 px-1 rounded">tipp</code>, <code class="bg-slate-100 px-1 rounded">merke</code> als div-Klasse. Normales HTML: h2, h3, p, ul, li, strong, table.</p>
<textarea name="content" required rows="16"
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm font-mono focus:ring-2 focus:ring-violet-500 outline-none">{{ old('content', $content ?? '') }}</textarea>
</div>
<button type="submit" class="w-full bg-violet-600 hover:bg-violet-700 text-white py-2 rounded-lg font-medium text-sm">Erstellen</button>
</form>
</div>
</div>
@endsection
@@ -0,0 +1,48 @@
@extends('layouts.admin')
@section('title','Artikel bearbeiten')
@section('content')
<div class="max-w-3xl">
<a href="{{ route('admin.reference.index') }}" class="text-sm text-slate-500 hover:text-slate-700 mb-4 inline-block"> Zurück</a>
<div class="bg-white rounded-xl shadow-sm border border-slate-200 p-6">
<h2 class="font-semibold text-slate-800 mb-5">Artikel bearbeiten</h2>
<form method="POST" action="{{ route('admin.reference.update',$reference) }}" class="space-y-4">
@csrf @method('PUT')
@php $icon=$reference->icon; $title=$reference->title; $cat=$reference->category; $order=$reference->sort_order; $content=$reference->content @endphp
<div class="grid grid-cols-4 gap-3">
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Icon</label>
<input name="icon" value="{{ old('icon', $icon ?? '📖') }}" required maxlength="8"
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-center text-xl focus:ring-2 focus:ring-violet-500 outline-none">
</div>
<div class="col-span-3">
<label class="block text-sm font-medium text-slate-700 mb-1">Titel</label>
<input name="title" value="{{ old('title', $title ?? '') }}" required
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-violet-500 outline-none">
</div>
</div>
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Kategorie</label>
<select name="category" required class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-violet-500 outline-none">
@foreach($categories as $k => $v)
<option value="{{ $k }}" {{ old('category', $cat ?? '') == $k ? 'selected' : '' }}>{{ $v }}</option>
@endforeach
</select>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Reihenfolge</label>
<input name="sort_order" type="number" value="{{ old('sort_order', $order ?? 0) }}"
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm focus:ring-2 focus:ring-violet-500 outline-none">
</div>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1">Inhalt (HTML)</label>
<p class="text-xs text-slate-400 mb-2">Verfügbare Klassen: <code class="bg-slate-100 px-1 rounded">beispiel</code>, <code class="bg-slate-100 px-1 rounded">tipp</code>, <code class="bg-slate-100 px-1 rounded">merke</code> als div-Klasse. Normales HTML: h2, h3, p, ul, li, strong, table.</p>
<textarea name="content" required rows="16"
class="w-full border border-slate-300 rounded-lg px-3 py-2 text-sm font-mono focus:ring-2 focus:ring-violet-500 outline-none">{{ old('content', $content ?? '') }}</textarea>
</div>
<button type="submit" class="w-full bg-violet-600 hover:bg-violet-700 text-white py-2 rounded-lg font-medium text-sm">Speichern</button>
</form>
</div>
</div>
@endsection
@@ -0,0 +1,33 @@
@extends('layouts.admin')
@section('title','Erinnerung')
@section('content')
<div class="flex justify-between items-center mb-6">
<h2 class="text-lg font-semibold text-slate-700">Erinnerungs-Artikel</h2>
<a href="{{ route('admin.reference.create') }}" class="bg-violet-600 hover:bg-violet-700 text-white px-4 py-2 rounded-lg text-sm font-medium">+ Neuer Artikel</a>
</div>
@foreach($categories as $key => $label)
@php $group = $articles->get($key, collect()) @endphp
<div class="mb-6">
<h3 class="font-semibold text-slate-600 text-sm mb-2">{{ $label }}</h3>
<div class="bg-white rounded-xl shadow-sm border border-slate-200 overflow-hidden">
@forelse($group as $a)
<div class="flex items-center justify-between px-4 py-3 {{ !$loop->last ? 'border-b border-slate-100' : '' }} hover:bg-slate-50">
<div class="flex items-center gap-3">
<span class="text-xl">{{ $a->icon }}</span>
<span class="font-medium text-slate-700">{{ $a->title }}</span>
</div>
<div class="flex gap-3 text-sm">
<a href="{{ route('admin.reference.edit',$a) }}" class="text-violet-600 hover:underline">Bearbeiten</a>
<form method="POST" action="{{ route('admin.reference.destroy',$a) }}" class="inline" onsubmit="return confirm('Löschen?')">
@csrf @method('DELETE')
<button class="text-red-500 hover:underline">Löschen</button>
</form>
</div>
</div>
@empty
<div class="px-4 py-4 text-slate-400 text-sm">Noch keine Artikel.</div>
@endforelse
</div>
</div>
@endforeach
@endsection
@@ -0,0 +1,23 @@
@extends('layouts.child')
@section('content')
<h1 class="text-2xl font-bold text-indigo-700 mb-2">💡 Erinnerung</h1>
<p class="text-slate-500 mb-6">Hier kannst du nachschauen, was du gerade nicht mehr weißt.</p>
@foreach($categories as $key => $label)
@php $group = $articles->get($key, collect()) @endphp
@if($group->count())
<div class="mb-6">
<h2 class="font-bold text-slate-600 text-sm uppercase tracking-wide mb-3">{{ $label }}</h2>
<div class="grid gap-3">
@foreach($group as $a)
<a href="{{ route('reference.show', $a->slug) }}"
class="bg-white rounded-2xl border border-slate-200 shadow-sm px-5 py-4 flex items-center gap-4 hover:border-indigo-300 hover:shadow-md transition-all">
<span class="text-3xl">{{ $a->icon }}</span>
<span class="font-semibold text-slate-700 text-base">{{ $a->title }}</span>
<span class="ml-auto text-slate-300 text-lg"></span>
</a>
@endforeach
</div>
</div>
@endif
@endforeach
@endsection
@@ -0,0 +1,28 @@
@extends('layouts.child')
@section('content')
<div class="mb-5">
<a href="{{ route('reference.index') }}" class="text-sm text-slate-400 hover:text-slate-600"> Erinnerung</a>
</div>
<div class="bg-white rounded-2xl shadow-sm border border-slate-200 p-6 mb-6">
<div class="flex items-center gap-3 mb-5 pb-4 border-b border-slate-100">
<span class="text-4xl">{{ $reference->icon }}</span>
<h1 class="text-2xl font-black text-slate-800">{{ $reference->title }}</h1>
</div>
<div class="ref-content">
{!! $reference->content !!}
</div>
</div>
@if($others->count())
<h2 class="font-bold text-slate-600 text-sm mb-3">Weitere Artikel</h2>
<div class="grid gap-2">
@foreach($others as $a)
<a href="{{ route('reference.show',$a->slug) }}"
class="bg-white rounded-xl border border-slate-200 px-4 py-3 flex items-center gap-3 hover:border-indigo-300 transition-all text-sm">
<span class="text-xl">{{ $a->icon }}</span>
<span class="font-medium text-slate-700">{{ $a->title }}</span>
<span class="ml-auto text-slate-300"></span>
</a>
@endforeach
</div>
@endif
@endsection
+1
View File
@@ -24,6 +24,7 @@
<span></span> Fragen
</a>
<a href="{{ route('admin.rewards.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-lg {{ request()->routeIs('admin.rewards.*') ? 'bg-violet-600 text-white' : 'text-slate-300 hover:bg-slate-800' }}">
<a href="{{ route('admin.reference.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-lg {{ request()->routeIs('admin.reference.*') ? 'bg-violet-600 text-white' : 'text-slate-300 hover:bg-slate-800' }}">💡 Erinnerung</a>
<span>🎁</span> Belohnungen
</a>
<a href="{{ route('admin.redemptions.index') }}" class="flex items-center gap-3 px-3 py-2 rounded-lg {{ request()->routeIs('admin.redemptions.*') ? 'bg-violet-600 text-white' : 'text-slate-300 hover:bg-slate-800' }}">
+1
View File
@@ -14,6 +14,7 @@
<div class="flex items-center gap-4">
<a href="{{ route('learn.subjects') }}" class="text-sm font-medium text-slate-600 hover:text-indigo-600">Lernen</a>
<a href="{{ route('rewards.index') }}" class="text-sm font-medium text-slate-600 hover:text-indigo-600">🪙 Belohnungen</a>
<a href="{{ route('reference.index') }}" class="text-sm font-medium text-slate-600 hover:text-indigo-600">💡 Erinnerung</a>
<div class="flex items-center gap-1 bg-amber-100 text-amber-700 font-bold rounded-full px-3 py-1 text-sm">
🪙 {{ auth()->user()->points }}
</div>