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:
@@ -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
|
||||
@@ -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' }}">
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user