diff --git a/resources/views/livewire/courses/create-edit-events.blade.php b/resources/views/livewire/courses/create-edit-events.blade.php new file mode 100644 index 0000000..564bb84 --- /dev/null +++ b/resources/views/livewire/courses/create-edit-events.blade.php @@ -0,0 +1,162 @@ +country = request()->route('country'); + if ($this->event) { + $this->from = $this->event->from->format('Y-m-d\TH:i'); + $this->to = $this->event->to->format('Y-m-d\TH:i'); + $this->venue_id = $this->event->venue_id; + $this->link = $this->event->link; + } else { + // Set default start time to next Monday at 09:00 + $nextMonday = now()->next('Monday')->setTime(9, 0); + $this->from = $nextMonday->format('Y-m-d\TH:i'); + $this->to = $nextMonday->copy()->addHours(3)->format('Y-m-d\TH:i'); + } + } + + public function save(): void + { + $validated = $this->validate(); + + if ($this->event) { + // Update existing event + $this->event->update($validated); + session()->flash('status', __('Event erfolgreich aktualisiert!')); + } else { + // Create new event + $this->course->courseEvents()->create([ + ...$validated, + 'created_by' => auth()->id(), + ]); + session()->flash('status', __('Event erfolgreich erstellt!')); + } + + $this->redirect(route('courses.landingpage', ['course' => $this->course, 'country' => $this->country]), navigate: true); + } + + public function delete(): void + { + if ($this->event) { + $this->event->delete(); + session()->flash('status', __('Event erfolgreich gelöscht!')); + $this->redirect(route('courses.landingpage', ['course' => $this->course, 'country' => $this->country]), navigate: true); + } + } + + public function with(): array + { + return [ + 'venues' => Venue::query()->orderBy('name')->get(), + ]; + } +}; ?> + +
+ + {{ $event ? __('Event bearbeiten') : __('Neues Event erstellen') }}: {{ $course->name }} + + +
+ + + + {{ __('Event Details') }} + +
+ + {{ __('Startzeit') }} * + + {{ __('Wann beginnt das Event?') }} + + + + + {{ __('Endzeit') }} * + + {{ __('Wann endet das Event?') }} + + +
+ + + {{ __('Veranstaltungsort') }} * + + + + + @foreach($venues as $venue) + + {{ $venue->name }} + @if($venue->city) + - {{ $venue->city->name }} + @endif + + @endforeach + + {{ __('Wo findet das Event statt?') }} + + + + + {{ __('Link') }} * + + {{ __('Link zu weiteren Informationen oder zur Anmeldung') }} + + +
+ + +
+
+ + {{ __('Abbrechen') }} + + + @if($event) + + {{ __('Event löschen') }} + + @endif +
+ +
+ @if (session('status')) + + {{ session('status') }} + + @endif + + + {{ $event ? __('Event aktualisieren') : __('Event erstellen') }} + +
+
+
+
diff --git a/resources/views/livewire/courses/index.blade.php b/resources/views/livewire/courses/index.blade.php index 0ca6cb6..dc2ad07 100644 --- a/resources/views/livewire/courses/index.blade.php +++ b/resources/views/livewire/courses/index.blade.php @@ -113,7 +113,8 @@ new class extends Component { {{ __('Bearbeiten') }} diff --git a/resources/views/livewire/lecturers/index.blade.php b/resources/views/livewire/lecturers/index.blade.php index 7df4a88..3deded4 100644 --- a/resources/views/livewire/lecturers/index.blade.php +++ b/resources/views/livewire/lecturers/index.blade.php @@ -8,8 +8,6 @@ new class extends Component { use WithPagination; public $country = 'de'; - public $sortBy = 'name'; - public $sortDirection = 'asc'; public $search = ''; public function mount(): void @@ -17,26 +15,23 @@ new class extends Component { $this->country = request()->route('country'); } - public function sort($column) - { - if ($this->sortBy === $column) { - $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; - } else { - $this->sortBy = $column; - $this->sortDirection = 'asc'; - } - } - public function with(): array { return [ - 'lecturers' => Lecturer::with(['createdBy']) + 'lecturers' => Lecturer::with(['createdBy', 'coursesEvents' => fn($query) => $query->where('from', '>=', now())->orderBy('from', 'asc')]) + ->withExists([ + 'coursesEvents as has_future_events' => fn($query) => $query->where('from', '>=', now()) + ]) + ->withCount([ + 'coursesEvents as future_events_count' => fn($query) => $query->where('from', '>=', now()) + ]) ->when($this->search, fn($query) => $query->where('name', 'ilike', '%'.$this->search.'%') ->orWhere('description', 'ilike', '%'.$this->search.'%') ->orWhere('subtitle', 'ilike', '%'.$this->search.'%'), ) - ->orderBy($this->sortBy, $this->sortDirection) + ->orderByDesc('has_future_events') + ->orderBy('name', 'asc') ->paginate(15), ]; } @@ -61,10 +56,9 @@ new class extends Component { - {{ __('Name') }} + {{ __('Name') }} - {{ __('Untertitel') }} + {{ __('Nächster Termin') }} {{ __('Kurse') }} {{ __('Links') }} {{ __('Aktionen') }} @@ -74,21 +68,35 @@ new class extends Component { @foreach ($lecturers as $lecturer) - -
-
{{ $lecturer->name }}
- @if($lecturer->active) - {{ __('Aktiv') }} - @else - {{ __('Inaktiv') }} - @endif +
+ +
+
{{ $lecturer->name }}
+ @if($lecturer->active) + {{ __('Aktiv') }} + @else + {{ __('Inaktiv') }} + @endif +
- @if($lecturer->subtitle) -
- {{ Str::limit($lecturer->subtitle, 50) }} + @php + $nextEvent = $lecturer->coursesEvents->first(); + @endphp + @if($nextEvent) +
+ + + {{ $nextEvent->from->format('d.m.Y H:i') }} + + + @if($lecturer->future_events_count > 1) +
+ +{{ $lecturer->future_events_count - 1 }} {{ __('weitere Termine') }} +
+ @endif
@endif