Allow adding conference speakers after creation on details page.
Deploy Ladill Meet / deploy (push) Successful in 35s

Hosts can assign team speakers and invite panelists by email from the
conference show page, with presenter refs synced to live sessions.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-01 20:29:16 +00:00
co-authored by Cursor
parent 799c302e2a
commit 158b7b650a
5 changed files with 210 additions and 19 deletions
@@ -7,7 +7,9 @@ use App\Http\Controllers\Meet\Concerns\ScopesToAccount;
use App\Models\Member;
use App\Models\Room;
use App\Models\Template;
use App\Models\User;
use App\Services\Meet\CalendarService;
use App\Services\Meet\ConferenceService;
use App\Services\Meet\InvitationService;
use App\Services\Meet\RoomService;
use App\Services\Meet\SessionService;
@@ -28,6 +30,7 @@ class ConferenceController extends Controller
protected InvitationService $invitations,
protected CalendarService $calendar,
protected TownHallService $townHalls,
protected ConferenceService $conferences,
) {}
public function index(Request $request): View
@@ -152,13 +155,83 @@ class ConferenceController extends Controller
$room->load(['sessions.participants', 'invitations', 'sessions.recordings', 'sessions.aiSummaries', 'sessionFiles']);
$presenterRefs = (array) $room->setting('presenter_refs', []);
$presenterRefs = $this->conferences->presenterRefs($room);
$speakers = Member::owned($this->ownerRef($request))
->where('organization_id', $room->organization_id)
->whereIn('user_ref', $presenterRefs)
->get();
return view('meet.conferences.show', compact('room', 'speakers'));
$speakerUsers = User::query()
->whereIn('public_id', $presenterRefs)
->get()
->keyBy('public_id');
$members = Member::owned($this->ownerRef($request))
->where('organization_id', $room->organization_id)
->where('user_ref', '!=', $this->ownerRef($request))
->orderBy('user_ref')
->get();
$memberUsers = User::query()
->whereIn('public_id', $members->pluck('user_ref'))
->get()
->keyBy('public_id');
$canManageSpeakers = app(\App\Services\Meet\MeetPermissions::class)
->can($this->member($request), 'meetings.manage');
return view('meet.conferences.show', compact(
'room',
'speakers',
'speakerUsers',
'members',
'memberUsers',
'presenterRefs',
'canManageSpeakers',
));
}
public function updateSpeakers(Request $request, Room $room): RedirectResponse
{
$this->authorizeAbility($request, 'meetings.manage');
$this->authorizeOwner($request, $room);
abort_unless($room->isConference(), 404);
$validated = $request->validate([
'presenter_refs' => ['nullable', 'array'],
'presenter_refs.*' => ['string', 'max:64'],
'invite_emails' => ['nullable', 'string', 'max:2000'],
]);
$allowedRefs = Member::owned($this->ownerRef($request))
->where('organization_id', $room->organization_id)
->pluck('user_ref')
->all();
$presenterRefs = collect($validated['presenter_refs'] ?? [])
->filter()
->unique()
->intersect($allowedRefs)
->values()
->all();
$this->conferences->syncPresenterRefs($room, $presenterRefs);
$inviteCount = 0;
if ($emails = trim((string) ($validated['invite_emails'] ?? ''))) {
$invites = collect(preg_split('/[\s,;]+/', $emails))
->filter()
->map(fn ($email) => ['email' => $email, 'role' => 'panelist'])
->all();
$inviteCount = count($invites);
$this->invitations->inviteToRoom($room, $invites, $request->user());
}
$message = $inviteCount > 0
? 'Speakers updated and '.$inviteCount.' invitation(s) sent.'
: 'Speakers updated.';
return redirect()->route('meet.conferences.show', $room)->with('success', $message);
}
public function start(Request $request, Room $room): RedirectResponse