query('search', '')); $events = $this->speakers->eventsForAccount($account->id, $search !== '' ? $search : null) ->map(function (QrCode $event) { $event->speaker_count = count($this->speakers->rosterFor($event)); return $event; }); return view('events.speakers-hub', [ 'events' => $events, 'search' => $search, ]); } public function index(QrCode $event): View { $this->authorize('view', $event); abort_unless($event->type === QrCode::TYPE_EVENT, 404); return view('events.speakers', [ 'qrCode' => $event, 'roster' => (array) ($event->content()['speakers'] ?? []), 'programmeAssignments' => $this->speakers->programmeAssignments($event), 'programme' => $this->speakers->linkedProgramme($event), ]); } public function update(Request $request, QrCode $event): RedirectResponse { $this->authorize('update', $event); abort_unless($event->type === QrCode::TYPE_EVENT, 404); $validated = $request->validate([ 'speakers' => ['nullable', 'array'], 'speakers.*.name' => ['nullable', 'string', 'max:120'], 'speakers.*.email' => ['nullable', 'email', 'max:190'], 'speakers.*.role' => ['nullable', 'string', 'max:80'], 'speakers.*.bio' => ['nullable', 'string', 'max:500'], ]); $this->manager->update($event, [ 'speakers' => $validated['speakers'] ?? [], ]); return redirect() ->route('speakers.show', $event) ->with('success', 'Speaker roster saved.'); } }