Replace native dialogs with app modals for Events link and unlink.
Deploy Ladill Meet / deploy (push) Successful in 49s

Link opens an in-page modal on conference and webinar show pages; unlink uses the shared confirm-dialog component.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-04 22:39:02 +00:00
co-authored by Cursor
parent d0e68f15c7
commit 14e7ae9557
8 changed files with 222 additions and 72 deletions
+7 -45
View File
@@ -13,50 +13,12 @@
</div>
@endif
@if ($events === [])
<div class="mt-6 rounded-2xl border border-slate-200 bg-white p-6 text-sm text-slate-600">
<p>No virtual or hybrid events found in your Ladill Events account.</p>
<a href="{{ EventsSourceLink::createEventUrl($room) }}" target="_blank" rel="noopener" class="mt-4 inline-flex btn-primary btn-primary-sm">Create event in Events</a>
</div>
@else
<form method="POST" action="{{ route('meet.events.link.store', $room) }}" class="mt-6 space-y-5">
@csrf
<div class="rounded-2xl border border-slate-200 bg-white p-6">
<label class="block text-sm font-medium text-slate-700">Event</label>
<select name="event_id" required class="mt-2 w-full rounded-lg border-slate-300 text-sm">
<option value="">Select an event…</option>
@foreach ($events as $event)
<option value="{{ $event['id'] }}" @selected(old('event_id') == $event['id'])>
{{ $event['title'] }} ({{ ucfirst($event['format']) }})
</option>
@endforeach
</select>
</div>
<div class="rounded-2xl border border-slate-200 bg-white p-6">
<label class="block text-sm font-medium text-slate-700">Virtual session slot (optional)</label>
<p class="mt-1 text-xs text-slate-500">Pick an empty session matching this {{ $room->isConference() ? 'conference' : 'webinar' }}, or leave blank to attach to the first available {{ $expectedType === 'town_hall' ? 'conference' : 'webinar' }} slot.</p>
<select name="virtual_session_id" class="mt-2 w-full rounded-lg border-slate-300 text-sm">
<option value="">Auto-assign slot</option>
@foreach ($events as $event)
@foreach ($event['virtual_sessions'] ?? [] as $session)
@php
$typeMatch = ($session['meet_room_type'] ?? '') === $expectedType;
$available = empty($session['meet_room_uuid']);
@endphp
@if ($typeMatch)
<option value="{{ $session['id'] }}" data-event="{{ $event['id'] }}" @selected(old('virtual_session_id') === $session['id'])>
[{{ $event['title'] }}] {{ $session['title'] ?: 'Untitled session' }}{{ $available ? '' : ' (linked)' }}
</option>
@endif
@endforeach
@endforeach
</select>
</div>
<button type="submit" class="btn-primary btn-primary-lg w-full">Link event</button>
</form>
@endif
<div class="mt-6 rounded-2xl border border-slate-200 bg-white p-6">
@include('meet.partials.events-link-form', [
'room' => $room,
'events' => $events,
'expectedType' => $expectedType,
])
</div>
</div>
</x-app-layout>
@@ -7,6 +7,11 @@
$eventsConfigured = EventsSourceLink::isApiConfigured();
$createEventUrl = EventsSourceLink::createEventUrl($room);
$kind = $room->isConference() ? 'conference' : 'webinar';
$expectedType = $room->isConference() ? 'town_hall' : 'webinar';
$linkableEvents = $linkableEvents ?? [];
$canManageEvents = $canManageEvents ?? false;
$unlinkModalName = 'events-unlink-'.$room->uuid;
$linkModalName = 'events-link-'.$room->uuid;
@endphp
<div class="mt-6 rounded-2xl border {{ $isLinked ? 'border-indigo-200 bg-indigo-50/40' : 'border-amber-200 bg-amber-50/50' }} p-6">
@@ -24,12 +29,19 @@
</p>
@endif
</div>
@if ($isLinked)
<form method="POST" action="{{ route('meet.events.link.destroy', $room) }}" onsubmit="return confirm('Remove the Events link? Registration settings stay in Events but this room will no longer show as linked.');">
@csrf
@method('DELETE')
<button type="submit" class="text-xs font-medium text-slate-500 hover:text-slate-700">Unlink</button>
</form>
@if ($isLinked && $canManageEvents)
<x-confirm-dialog
:name="$unlinkModalName"
title="Remove Events link?"
message="Registration settings stay in Events but this room will no longer show as linked."
:action="route('meet.events.link.destroy', $room)"
method="DELETE"
confirm-label="Unlink"
>
<x-slot:trigger>
<button type="button" class="text-xs font-medium text-slate-500 hover:text-slate-700">Unlink</button>
</x-slot:trigger>
</x-confirm-dialog>
@endif
</div>
@@ -84,8 +96,14 @@
<p class="mt-3 text-xs text-slate-500">Programme speakers and panelists are configured on the event programme in Events and sync to this session when linked.</p>
@else
<div class="mt-4 flex flex-wrap gap-3">
@if ($eventsConfigured)
<a href="{{ route('meet.events.link', $room) }}" class="btn-primary btn-primary-sm">Link to Ladill Events</a>
@if ($eventsConfigured && $canManageEvents)
<button type="button"
@click="$dispatch('open-modal', {{ Js::from($linkModalName) }})"
class="btn-primary btn-primary-sm">
Link to Ladill Events
</button>
@elseif ($eventsConfigured)
<span class="btn-primary btn-primary-sm cursor-not-allowed opacity-50" title="You need manage permission to link events">Link to Ladill Events</span>
@else
<span class="btn-primary btn-primary-sm cursor-not-allowed opacity-50" title="Configure MEET_API_KEY_EVENTS to enable linking">Link to Ladill Events</span>
@endif
@@ -93,3 +111,34 @@
</div>
@endif
</div>
@if (! $isLinked && $eventsConfigured && $canManageEvents)
@php
$openLinkModal = session('open_events_link_modal')
|| $errors->hasAny(['events', 'event_id', 'virtual_session_id']);
@endphp
<x-modal :name="$linkModalName" maxWidth="lg" :show="$openLinkModal">
<div class="px-5 pb-6 pt-2 sm:px-6 sm:pb-6 sm:pt-4">
<h2 class="text-lg font-semibold text-slate-900">Link to Ladill Events</h2>
<p class="mt-1 text-sm text-slate-500">
Choose a virtual or hybrid event. Registration, bulk invitations, speakers, and QR codes will be managed in Events.
</p>
@if ($errors->has('events'))
<div class="mt-4 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700">
{{ $errors->first('events') }}
</div>
@endif
<div class="mt-5">
@include('meet.partials.events-link-form', [
'room' => $room,
'events' => $linkableEvents,
'expectedType' => $expectedType,
'submitLabel' => 'Link event',
'submitClass' => 'btn-primary btn-primary-sm',
])
</div>
</div>
</x-modal>
@endif
@@ -0,0 +1,53 @@
@props([
'room',
'events' => [],
'expectedType' => 'town_hall',
'submitLabel' => 'Link event',
'submitClass' => 'btn-primary btn-primary-lg w-full',
])
@if ($events === [])
<div class="text-sm text-slate-600">
<p>No virtual or hybrid events found in your Ladill Events account.</p>
<a href="{{ \App\Support\EventsSourceLink::createEventUrl($room) }}" target="_blank" rel="noopener" class="mt-4 inline-flex btn-primary btn-primary-sm">Create event in Events</a>
</div>
@else
<form method="POST" action="{{ route('meet.events.link.store', $room) }}" class="space-y-5">
@csrf
<div>
<label class="block text-sm font-medium text-slate-700">Event</label>
<select name="event_id" required class="mt-2 w-full rounded-lg border-slate-300 text-sm">
<option value="">Select an event…</option>
@foreach ($events as $event)
<option value="{{ $event['id'] }}" @selected(old('event_id') == $event['id'])>
{{ $event['title'] }} ({{ ucfirst($event['format']) }})
</option>
@endforeach
</select>
</div>
<div>
<label class="block text-sm font-medium text-slate-700">Virtual session slot (optional)</label>
<p class="mt-1 text-xs text-slate-500">Pick an empty session matching this {{ $room->isConference() ? 'conference' : 'webinar' }}, or leave blank to attach to the first available {{ $expectedType === 'town_hall' ? 'conference' : 'webinar' }} slot.</p>
<select name="virtual_session_id" class="mt-2 w-full rounded-lg border-slate-300 text-sm">
<option value="">Auto-assign slot</option>
@foreach ($events as $event)
@foreach ($event['virtual_sessions'] ?? [] as $session)
@php
$typeMatch = ($session['meet_room_type'] ?? '') === $expectedType;
$available = empty($session['meet_room_uuid']);
@endphp
@if ($typeMatch)
<option value="{{ $session['id'] }}" data-event="{{ $event['id'] }}" @selected(old('virtual_session_id') === $session['id'])>
[{{ $event['title'] }}] {{ $session['title'] ?: 'Untitled session' }}{{ $available ? '' : ' (linked)' }}
</option>
@endif
@endforeach
@endforeach
</select>
</div>
<button type="submit" @class([$submitClass])>{{ $submitLabel }}</button>
</form>
@endif