From aed7094feda3ddb706d56b5bb7a46dea7f93157e Mon Sep 17 00:00:00 2001 From: isaacclad Date: Wed, 1 Jul 2026 22:31:03 +0000 Subject: [PATCH] Remove meeting templates and show Events programme on Meet rooms. Templates duplicated create-form settings without edit/delete flows; drop the feature and table. Conference and webinar pages render synced programme snapshots and link back to Ladill Events. Co-authored-by: Cursor --- .../Controllers/Meet/ConferenceController.php | 18 +---- app/Http/Controllers/Meet/RoomController.php | 15 ---- app/Http/Controllers/Meet/SpaceController.php | 15 ---- .../Controllers/Meet/TemplateController.php | 68 ------------------- .../Controllers/Meet/WebinarController.php | 19 +----- app/Models/Organization.php | 5 -- app/Models/Room.php | 7 +- app/Models/Template.php | 50 -------------- app/Services/Meet/RecurringMeetingService.php | 1 - app/Services/Meet/TemplateService.php | 42 ------------ app/Support/EventsSourceLink.php | 26 +++++++ bootstrap/app.php | 3 - config/meet.php | 2 + .../2026_06_30_170000_drop_meet_templates.php | 38 +++++++++++ .../views/meet/conferences/create.blade.php | 12 ---- .../views/meet/conferences/show.blade.php | 7 ++ .../meet/partials/programme-agenda.blade.php | 65 ++++++++++++++++++ resources/views/meet/rooms/create.blade.php | 12 ---- .../views/meet/templates/create.blade.php | 21 ------ .../views/meet/templates/index.blade.php | 17 ----- .../views/meet/webinars/create.blade.php | 12 ---- resources/views/meet/webinars/show.blade.php | 7 ++ resources/views/partials/sidebar.blade.php | 5 -- routes/web.php | 5 -- tests/Feature/MeetWebTest.php | 16 ----- 25 files changed, 152 insertions(+), 336 deletions(-) delete mode 100644 app/Http/Controllers/Meet/TemplateController.php delete mode 100644 app/Models/Template.php delete mode 100644 app/Services/Meet/TemplateService.php create mode 100644 app/Support/EventsSourceLink.php create mode 100644 database/migrations/2026_06_30_170000_drop_meet_templates.php create mode 100644 resources/views/meet/partials/programme-agenda.blade.php delete mode 100644 resources/views/meet/templates/create.blade.php delete mode 100644 resources/views/meet/templates/index.blade.php diff --git a/app/Http/Controllers/Meet/ConferenceController.php b/app/Http/Controllers/Meet/ConferenceController.php index 3aa0c88..4f1b838 100644 --- a/app/Http/Controllers/Meet/ConferenceController.php +++ b/app/Http/Controllers/Meet/ConferenceController.php @@ -6,14 +6,12 @@ use App\Http\Controllers\Controller; 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; -use App\Services\Meet\TemplateService; use App\Services\Meet\TownHallService; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; @@ -26,7 +24,6 @@ class ConferenceController extends Controller public function __construct( protected RoomService $rooms, protected SessionService $sessions, - protected TemplateService $templates, protected InvitationService $invitations, protected CalendarService $calendar, protected TownHallService $townHalls, @@ -55,11 +52,6 @@ class ConferenceController extends Controller $this->authorizeAbility($request, 'meetings.create'); $organization = $this->organization($request); - $templates = Template::owned($this->ownerRef($request)) - ->where('organization_id', $organization->id) - ->orderBy('name') - ->get(); - $members = Member::owned($this->ownerRef($request)) ->where('organization_id', $organization->id) ->where('user_ref', '!=', $this->ownerRef($request)) @@ -68,7 +60,6 @@ class ConferenceController extends Controller return view('meet.conferences.create', [ 'organization' => $organization, - 'templates' => $templates, 'members' => $members, 'timezones' => timezone_identifiers_list(), 'defaultSettings' => config('meet.default_settings'), @@ -87,7 +78,6 @@ class ConferenceController extends Controller 'duration_minutes' => ['nullable', 'integer', 'min:15', 'max:480'], 'timezone' => ['nullable', 'timezone'], 'passcode' => ['nullable', 'string', 'max:20'], - 'template_id' => ['nullable', 'integer', 'exists:meet_templates,id'], 'invite_emails' => ['nullable', 'string'], 'presenter_refs' => ['nullable', 'array'], 'presenter_refs.*' => ['string', 'max:64'], @@ -129,11 +119,6 @@ class ConferenceController extends Controller 'status' => 'scheduled', ]); - if (! empty($validated['template_id'])) { - $template = Template::findOrFail($validated['template_id']); - $data = $this->templates->applyToRoomData($template, $data); - } - $room = $this->rooms->create($request->user(), $organization, $data); if ($emails = trim((string) ($validated['invite_emails'] ?? ''))) { @@ -184,6 +169,8 @@ class ConferenceController extends Controller $canManageSpeakers = app(\App\Services\Meet\MeetPermissions::class) ->can($this->member($request), 'meetings.manage'); + $eventsEventUrl = \App\Support\EventsSourceLink::eventAdminUrl($room); + return view('meet.conferences.show', compact( 'room', 'speakers', @@ -192,6 +179,7 @@ class ConferenceController extends Controller 'memberUsers', 'presenterRefs', 'canManageSpeakers', + 'eventsEventUrl', )); } diff --git a/app/Http/Controllers/Meet/RoomController.php b/app/Http/Controllers/Meet/RoomController.php index 6884ea3..090d789 100644 --- a/app/Http/Controllers/Meet/RoomController.php +++ b/app/Http/Controllers/Meet/RoomController.php @@ -5,7 +5,6 @@ namespace App\Http\Controllers\Meet; use App\Http\Controllers\Controller; use App\Http\Controllers\Meet\Concerns\ScopesToAccount; use App\Models\Room; -use App\Models\Template; use App\Services\Meet\AttendanceService; use App\Services\Meet\AvailabilityService; use App\Services\Meet\CalendarService; @@ -14,7 +13,6 @@ use App\Services\Meet\InvitationService; use App\Services\Meet\RecurringMeetingService; use App\Services\Meet\RoomService; use App\Services\Meet\SessionService; -use App\Services\Meet\TemplateService; use chillerlan\QRCode\QRCode; use chillerlan\QRCode\QROptions; use Illuminate\Http\RedirectResponse; @@ -29,7 +27,6 @@ class RoomController extends Controller public function __construct( protected RoomService $rooms, protected SessionService $sessions, - protected TemplateService $templates, protected RecurringMeetingService $recurring, protected InvitationService $invitations, protected CalendarService $calendar, @@ -58,14 +55,8 @@ class RoomController extends Controller $this->authorizeAbility($request, 'meetings.create'); $organization = $this->organization($request); - $templates = Template::owned($this->ownerRef($request)) - ->where('organization_id', $organization->id) - ->orderBy('name') - ->get(); - return view('meet.rooms.create', [ 'organization' => $organization, - 'templates' => $templates, 'timezones' => timezone_identifiers_list(), 'recurrenceRules' => config('meet.recurrence_rules'), 'defaultSettings' => config('meet.default_settings'), @@ -85,7 +76,6 @@ class RoomController extends Controller 'duration_minutes' => ['nullable', 'integer', 'min:15', 'max:480'], 'timezone' => ['nullable', 'timezone'], 'passcode' => ['nullable', 'string', 'max:20'], - 'template_id' => ['nullable', 'integer', 'exists:meet_templates,id'], 'recurrence_rule' => ['nullable', 'string', 'in:'.implode(',', array_keys(config('meet.recurrence_rules')))], 'recurrence_interval' => ['nullable', 'integer', 'min:1', 'max:12'], 'recurrence_until' => ['nullable', 'date'], @@ -113,11 +103,6 @@ class RoomController extends Controller 'timezone' => $validated['timezone'] ?? $organization->timezone, ]); - if (! empty($validated['template_id'])) { - $template = Template::findOrFail($validated['template_id']); - $data = $this->templates->applyToRoomData($template, $data); - } - $isInstant = empty($validated['scheduled_at']); if (! empty($validated['recurrence_rule']) && ! $isInstant) { diff --git a/app/Http/Controllers/Meet/SpaceController.php b/app/Http/Controllers/Meet/SpaceController.php index 30e1cee..abc073a 100644 --- a/app/Http/Controllers/Meet/SpaceController.php +++ b/app/Http/Controllers/Meet/SpaceController.php @@ -6,13 +6,11 @@ use App\Http\Controllers\Controller; use App\Http\Controllers\Meet\Concerns\ScopesToAccount; use App\Models\Member; use App\Models\Room; -use App\Models\Template; use App\Services\Meet\CalendarService; use App\Services\Meet\InvitationService; use App\Services\Meet\RoomService; use App\Services\Meet\SessionService; use App\Services\Meet\SpaceService; -use App\Services\Meet\TemplateService; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; @@ -24,7 +22,6 @@ class SpaceController extends Controller public function __construct( protected RoomService $rooms, protected SessionService $sessions, - protected TemplateService $templates, protected InvitationService $invitations, protected CalendarService $calendar, protected SpaceService $spaces, @@ -53,11 +50,6 @@ class SpaceController extends Controller $organization = $this->organization($request); $owner = $this->ownerRef($request); - $templates = Template::owned($owner) - ->where('organization_id', $organization->id) - ->orderBy('name') - ->get(); - $members = Member::owned($owner) ->where('organization_id', $organization->id) ->where('user_ref', '!=', $owner) @@ -66,7 +58,6 @@ class SpaceController extends Controller return view('meet.spaces.create', [ 'organization' => $organization, - 'templates' => $templates, 'members' => $members, 'timezones' => timezone_identifiers_list(), 'defaultSettings' => config('meet.default_settings'), @@ -85,7 +76,6 @@ class SpaceController extends Controller 'duration_minutes' => ['nullable', 'integer', 'min:15', 'max:480'], 'timezone' => ['nullable', 'timezone'], 'passcode' => ['nullable', 'string', 'max:20'], - 'template_id' => ['nullable', 'integer', 'exists:meet_templates,id'], 'invite_emails' => ['nullable', 'string'], 'speaker_refs' => ['nullable', 'array'], 'speaker_refs.*' => ['string', 'max:64'], @@ -120,11 +110,6 @@ class SpaceController extends Controller unset($data['speaker_refs'], $data['invite_only'], $data['mute_listeners']); - if (! empty($validated['template_id'])) { - $template = Template::findOrFail($validated['template_id']); - $data = $this->templates->applyToRoomData($template, $data); - } - $room = $this->rooms->create($request->user(), $organization, $data); if ($emails = trim((string) ($validated['invite_emails'] ?? ''))) { diff --git a/app/Http/Controllers/Meet/TemplateController.php b/app/Http/Controllers/Meet/TemplateController.php deleted file mode 100644 index b7c547d..0000000 --- a/app/Http/Controllers/Meet/TemplateController.php +++ /dev/null @@ -1,68 +0,0 @@ -authorizeAbility($request, 'meetings.manage'); - $organization = $this->organization($request); - - $templates = Template::owned($this->ownerRef($request)) - ->where('organization_id', $organization->id) - ->orderBy('name') - ->get(); - - return view('meet.templates.index', compact('templates', 'organization')); - } - - public function create(Request $request): View - { - $this->authorizeAbility($request, 'meetings.manage'); - - return view('meet.templates.create', [ - 'defaultSettings' => config('meet.default_settings'), - ]); - } - - public function store(Request $request): RedirectResponse - { - $this->authorizeAbility($request, 'meetings.manage'); - $organization = $this->organization($request); - - $validated = $request->validate([ - 'name' => ['required', 'string', 'max:255'], - 'description' => ['nullable', 'string'], - 'duration_minutes' => ['nullable', 'integer', 'min:15', 'max:480'], - 'is_default' => ['sometimes', 'boolean'], - 'waiting_room' => ['sometimes', 'boolean'], - 'auto_record' => ['sometimes', 'boolean'], - 'live_captions' => ['sometimes', 'boolean'], - ]); - - $this->templates->create($request->user(), $organization, array_merge($validated, [ - 'settings' => [ - 'waiting_room' => $request->boolean('waiting_room', true), - 'auto_record' => $request->boolean('auto_record'), - 'live_captions' => $request->boolean('live_captions'), - ], - ])); - - return redirect()->route('meet.templates.index')->with('success', 'Template saved.'); - } -} diff --git a/app/Http/Controllers/Meet/WebinarController.php b/app/Http/Controllers/Meet/WebinarController.php index fe111bc..89a8d55 100644 --- a/app/Http/Controllers/Meet/WebinarController.php +++ b/app/Http/Controllers/Meet/WebinarController.php @@ -5,12 +5,10 @@ namespace App\Http\Controllers\Meet; use App\Http\Controllers\Controller; use App\Http\Controllers\Meet\Concerns\ScopesToAccount; use App\Models\Room; -use App\Models\Template; use App\Services\Meet\CalendarService; use App\Services\Meet\InvitationService; use App\Services\Meet\RoomService; use App\Services\Meet\SessionService; -use App\Services\Meet\TemplateService; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; @@ -22,7 +20,6 @@ class WebinarController extends Controller public function __construct( protected RoomService $rooms, protected SessionService $sessions, - protected TemplateService $templates, protected InvitationService $invitations, protected CalendarService $calendar, ) {} @@ -49,14 +46,8 @@ class WebinarController extends Controller $this->authorizeAbility($request, 'meetings.create'); $organization = $this->organization($request); - $templates = Template::owned($this->ownerRef($request)) - ->where('organization_id', $organization->id) - ->orderBy('name') - ->get(); - return view('meet.webinars.create', [ 'organization' => $organization, - 'templates' => $templates, 'timezones' => timezone_identifiers_list(), 'defaultSettings' => config('meet.default_settings'), ]); @@ -74,7 +65,6 @@ class WebinarController extends Controller 'duration_minutes' => ['nullable', 'integer', 'min:15', 'max:480'], 'timezone' => ['nullable', 'timezone'], 'passcode' => ['nullable', 'string', 'max:20'], - 'template_id' => ['nullable', 'integer', 'exists:meet_templates,id'], 'invite_emails' => ['nullable', 'string'], 'waiting_room' => ['sometimes', 'boolean'], 'join_before_host' => ['sometimes', 'boolean'], @@ -105,11 +95,6 @@ class WebinarController extends Controller 'status' => 'scheduled', ]); - if (! empty($validated['template_id'])) { - $template = Template::findOrFail($validated['template_id']); - $data = $this->templates->applyToRoomData($template, $data); - } - $room = $this->rooms->create($request->user(), $organization, $data); if ($emails = trim((string) ($validated['invite_emails'] ?? ''))) { @@ -135,7 +120,9 @@ class WebinarController extends Controller $room->load(['sessions.participants', 'invitations', 'sessions.recordings', 'sessions.aiSummaries', 'sessionFiles', 'webinarRegistrations']); - return view('meet.webinars.show', compact('room')); + $eventsEventUrl = \App\Support\EventsSourceLink::eventAdminUrl($room); + + return view('meet.webinars.show', compact('room', 'eventsEventUrl')); } public function start(Request $request, Room $room): RedirectResponse diff --git a/app/Models/Organization.php b/app/Models/Organization.php index 512b777..f014711 100644 --- a/app/Models/Organization.php +++ b/app/Models/Organization.php @@ -37,11 +37,6 @@ class Organization extends Model return $this->hasMany(Member::class, 'organization_id'); } - public function templates(): HasMany - { - return $this->hasMany(Template::class, 'organization_id'); - } - public function securitySetting(string $key, mixed $default = null): mixed { return data_get($this->security_policy, $key, data_get(config('meet.security_defaults'), $key, $default)); diff --git a/app/Models/Room.php b/app/Models/Room.php index 08c87a1..ea1eab0 100644 --- a/app/Models/Room.php +++ b/app/Models/Room.php @@ -19,7 +19,7 @@ class Room extends Model 'uuid', 'owner_ref', 'organization_id', 'branch_id', 'host_user_ref', 'title', 'description', 'type', 'status', 'slug', 'scheduled_at', 'duration_minutes', 'timezone', 'passcode', 'settings', 'source', 'calendar_event_id', - 'template_id', 'recurring_series_id', 'recurrence_rule', 'recurrence_interval', 'recurrence_until', + 'recurring_series_id', 'recurrence_rule', 'recurrence_interval', 'recurrence_until', ]; protected function casts(): array @@ -144,11 +144,6 @@ class Room extends Model return $this->type === 'town_hall'; } - public function template(): BelongsTo - { - return $this->belongsTo(Template::class, 'template_id'); - } - public function isRecurring(): bool { return filled($this->recurrence_rule); diff --git a/app/Models/Template.php b/app/Models/Template.php deleted file mode 100644 index c38bdb9..0000000 --- a/app/Models/Template.php +++ /dev/null @@ -1,50 +0,0 @@ - 'array', 'is_default' => 'boolean']; - } - - protected static function booted(): void - { - static::creating(function (Template $template) { - if (empty($template->uuid)) { - $template->uuid = (string) Str::uuid(); - } - }); - } - - public function getRouteKeyName(): string - { - return 'uuid'; - } - - public function organization(): BelongsTo - { - return $this->belongsTo(Organization::class, 'organization_id'); - } - - public function mergedSettings(): array - { - return array_merge(config('meet.default_settings'), $this->settings ?? []); - } -} diff --git a/app/Services/Meet/RecurringMeetingService.php b/app/Services/Meet/RecurringMeetingService.php index 7ccfb4e..bb3de83 100644 --- a/app/Services/Meet/RecurringMeetingService.php +++ b/app/Services/Meet/RecurringMeetingService.php @@ -72,7 +72,6 @@ class RecurringMeetingService 'timezone' => $parent->timezone, 'passcode' => $parent->passcode, 'settings' => $parent->settings, - 'template_id' => $parent->template_id, 'recurring_series_id' => $parent->recurring_series_id, 'recurrence_rule' => $parent->recurrence_rule, 'recurrence_interval' => $parent->recurrence_interval, diff --git a/app/Services/Meet/TemplateService.php b/app/Services/Meet/TemplateService.php deleted file mode 100644 index a3ad96d..0000000 --- a/app/Services/Meet/TemplateService.php +++ /dev/null @@ -1,42 +0,0 @@ - $data - */ - public function create(User $user, Organization $organization, array $data): Template - { - if ($data['is_default'] ?? false) { - Template::owned($user->ownerRef()) - ->where('organization_id', $organization->id) - ->update(['is_default' => false]); - } - - return Template::create([ - 'owner_ref' => $user->ownerRef(), - 'organization_id' => $organization->id, - 'name' => $data['name'], - 'description' => $data['description'] ?? null, - 'duration_minutes' => $data['duration_minutes'] ?? 60, - 'settings' => array_merge(config('meet.default_settings'), $data['settings'] ?? []), - 'is_default' => (bool) ($data['is_default'] ?? false), - ]); - } - - public function applyToRoomData(Template $template, array $data): array - { - return array_merge($data, [ - 'duration_minutes' => $data['duration_minutes'] ?? $template->duration_minutes, - 'settings' => array_merge($template->mergedSettings(), $data['settings'] ?? []), - 'template_id' => $template->id, - ]); - } -} diff --git a/app/Support/EventsSourceLink.php b/app/Support/EventsSourceLink.php new file mode 100644 index 0000000..83aed9a --- /dev/null +++ b/app/Support/EventsSourceLink.php @@ -0,0 +1,26 @@ +source ?? []); + + if (($source['app'] ?? '') !== 'events') { + return null; + } + + $eventId = (int) ($source['event_id'] ?? 0); + if ($eventId <= 0) { + return null; + } + + $base = rtrim((string) config('meet.events_app_url', 'https://events.ladill.com'), '/'); + + return $base.'/events/'.$eventId.'/attendees'; + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index e3d552c..595ce98 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -27,9 +27,6 @@ return Application::configure(basePath: dirname(__DIR__)) \Illuminate\Support\Facades\Route::bind('summary', function (string $value) { return \App\Models\AiSummary::where('uuid', $value)->firstOrFail(); }); - \Illuminate\Support\Facades\Route::bind('template', function (string $value) { - return \App\Models\Template::where('uuid', $value)->firstOrFail(); - }); \Illuminate\Support\Facades\Route::bind('invitation', function (string $value) { return \App\Models\Invitation::where('uuid', $value)->firstOrFail(); }); diff --git a/config/meet.php b/config/meet.php index 5fbe2e0..c95a4f0 100644 --- a/config/meet.php +++ b/config/meet.php @@ -160,6 +160,8 @@ return [ 'recording.ready', ], + 'events_app_url' => env('LADILL_EVENTS_APP_URL', 'https://events.ladill.com'), + 'calendar' => [ 'google' => [ 'client_id' => env('GOOGLE_CALENDAR_CLIENT_ID'), diff --git a/database/migrations/2026_06_30_170000_drop_meet_templates.php b/database/migrations/2026_06_30_170000_drop_meet_templates.php new file mode 100644 index 0000000..a5f7012 --- /dev/null +++ b/database/migrations/2026_06_30_170000_drop_meet_templates.php @@ -0,0 +1,38 @@ +dropConstrainedForeignId('template_id'); + }); + + Schema::dropIfExists('meet_templates'); + } + + public function down(): void + { + Schema::create('meet_templates', function (Blueprint $table) { + $table->id(); + $table->uuid('uuid')->unique(); + $table->string('owner_ref')->index(); + $table->foreignId('organization_id')->constrained('meet_organizations')->cascadeOnDelete(); + $table->string('name'); + $table->text('description')->nullable(); + $table->unsignedSmallInteger('duration_minutes')->default(60); + $table->json('settings')->nullable(); + $table->boolean('is_default')->default(false); + $table->timestamps(); + $table->softDeletes(); + }); + + Schema::table('meet_rooms', function (Blueprint $table) { + $table->foreignId('template_id')->nullable()->after('source')->constrained('meet_templates')->nullOnDelete(); + }); + } +}; diff --git a/resources/views/meet/conferences/create.blade.php b/resources/views/meet/conferences/create.blade.php index f6a6ae9..49b829f 100644 --- a/resources/views/meet/conferences/create.blade.php +++ b/resources/views/meet/conferences/create.blade.php @@ -6,18 +6,6 @@
@csrf - @if ($templates->isNotEmpty()) -
- - -
- @endif -
diff --git a/resources/views/meet/conferences/show.blade.php b/resources/views/meet/conferences/show.blade.php index f990545..3700467 100644 --- a/resources/views/meet/conferences/show.blade.php +++ b/resources/views/meet/conferences/show.blade.php @@ -4,6 +4,11 @@

Conference

{{ $room->title }}

{{ config('meet.room_statuses')[$room->status] ?? $room->status }}

+ @if(! empty($eventsEventUrl)) + + View in Ladill Events → + + @endif
@if ($errors->any()) @@ -130,6 +135,8 @@ @endif + @include('meet.partials.programme-agenda', ['room' => $room]) + @if ($room->sessions->isNotEmpty())

Sessions

diff --git a/resources/views/meet/partials/programme-agenda.blade.php b/resources/views/meet/partials/programme-agenda.blade.php new file mode 100644 index 0000000..b0b8533 --- /dev/null +++ b/resources/views/meet/partials/programme-agenda.blade.php @@ -0,0 +1,65 @@ +@php + $programme = $room->setting('programme_snapshot'); + $linkedItems = (array) $room->setting('linked_programme_items', []); +@endphp + +@if(is_array($programme) && ! empty($programme['days'])) +
+

Agenda

+ @if(! empty($programme['title'])) +

{{ $programme['title'] }}

+ @endif + + @if($linkedItems !== []) +

Linked to this session

+
    + @foreach($linkedItems as $item) +
  • + @if(! empty($item['time'])) + {{ $item['time'] }} + @endif + {{ $item['title'] ?? 'Item' }} + @if(! empty($item['host'])) + · {{ $item['host'] }} + @endif +
  • + @endforeach +
+ @endif + +
+ @foreach((array) ($programme['days'] ?? []) as $day) +
+ @if(! empty($day['label']) || ! empty($day['date'])) +

+ {{ trim(($day['label'] ?? '').' '.($day['date'] ?? '')) }} +

+ @endif +
    + @foreach((array) ($day['items'] ?? []) as $item) +
  • +
    + @if(! empty($item['time'])) + {{ $item['time'] }} + @endif +
    +

    {{ $item['title'] ?? '' }}

    + @if(! empty($item['description'])) +

    {{ $item['description'] }}

    + @endif + @if(! empty($item['location']) || ! empty($item['host'])) +

    + @if(! empty($item['location'])){{ $item['location'] }}@endif + @if(! empty($item['host'])) · {{ $item['host'] }}@endif +

    + @endif +
    +
    +
  • + @endforeach +
+
+ @endforeach +
+
+@endif diff --git a/resources/views/meet/rooms/create.blade.php b/resources/views/meet/rooms/create.blade.php index 89ff7cb..e8669fb 100644 --- a/resources/views/meet/rooms/create.blade.php +++ b/resources/views/meet/rooms/create.blade.php @@ -5,18 +5,6 @@ @csrf - @if ($templates->isNotEmpty()) -
- - -
- @endif -
diff --git a/resources/views/meet/templates/create.blade.php b/resources/views/meet/templates/create.blade.php deleted file mode 100644 index e48197e..0000000 --- a/resources/views/meet/templates/create.blade.php +++ /dev/null @@ -1,21 +0,0 @@ - -
-

New meeting template

- - @csrf -
- - -
-
- - -
- - - - - - -
-
diff --git a/resources/views/meet/templates/index.blade.php b/resources/views/meet/templates/index.blade.php deleted file mode 100644 index fa890e0..0000000 --- a/resources/views/meet/templates/index.blade.php +++ /dev/null @@ -1,17 +0,0 @@ - -
-

Meeting templates

- New template -
- -
- @forelse ($templates as $template) -
-

{{ $template->name }}

-

{{ $template->duration_minutes }} min @if($template->is_default) · Default @endif

-
- @empty -

No templates yet.

- @endforelse -
-
diff --git a/resources/views/meet/webinars/create.blade.php b/resources/views/meet/webinars/create.blade.php index 88a6be1..5eb3aff 100644 --- a/resources/views/meet/webinars/create.blade.php +++ b/resources/views/meet/webinars/create.blade.php @@ -6,18 +6,6 @@
@csrf - @if ($templates->isNotEmpty()) -
- - -
- @endif -
diff --git a/resources/views/meet/webinars/show.blade.php b/resources/views/meet/webinars/show.blade.php index 3d2c7b1..d776c3b 100644 --- a/resources/views/meet/webinars/show.blade.php +++ b/resources/views/meet/webinars/show.blade.php @@ -5,6 +5,11 @@

Webinar

{{ $room->title }}

{{ config('meet.room_statuses')[$room->status] ?? $room->status }}

+ @if(! empty($eventsEventUrl)) + + View in Ladill Events → + + @endif
@if ($room->canRestart()) @@ -84,6 +89,8 @@ @endif
+ @include('meet.partials.programme-agenda', ['room' => $room]) + @php $recordings = $room->sessions->flatMap->recordings->sortByDesc('created_at'); $summaries = $room->sessions->flatMap->aiSummaries->where('status', 'ready')->sortByDesc('created_at'); diff --git a/resources/views/partials/sidebar.blade.php b/resources/views/partials/sidebar.blade.php index f5615cc..e5ab46e 100644 --- a/resources/views/partials/sidebar.blade.php +++ b/resources/views/partials/sidebar.blade.php @@ -31,11 +31,6 @@ 'icon' => ''], ]; - if ($permissions->isAdmin($member)) { - $nav[] = ['name' => 'Templates', 'route' => route('meet.templates.index'), 'active' => request()->routeIs('meet.templates.*'), - 'icon' => '']; - } - $adminNav = []; if ($permissions->isAdmin($member)) { $adminNav[] = ['name' => 'Usage', 'route' => route('meet.admin.usage'), 'active' => request()->routeIs('meet.admin.*'), diff --git a/routes/web.php b/routes/web.php index ffb2726..178d630 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,7 +22,6 @@ use App\Http\Controllers\Meet\RoomController; use App\Http\Controllers\Meet\SpaceController; use App\Http\Controllers\Meet\SettingsController; use App\Http\Controllers\Meet\SummaryController; -use App\Http\Controllers\Meet\TemplateController; use App\Http\Controllers\Meet\WebinarRegistrationController; use App\Http\Controllers\Meet\WebinarController; use App\Http\Controllers\Meet\WebhookSettingsController; @@ -198,10 +197,6 @@ Route::middleware(['auth', 'platform.session'])->group(function () { Route::get('/summaries/{summary}', [SummaryController::class, 'show'])->name('meet.summaries.show'); - Route::get('/templates', [TemplateController::class, 'index'])->name('meet.templates.index'); - Route::get('/templates/create', [TemplateController::class, 'create'])->name('meet.templates.create'); - Route::post('/templates', [TemplateController::class, 'store'])->name('meet.templates.store'); - Route::get('/settings/security', [SettingsController::class, 'security'])->name('meet.settings.security'); Route::put('/settings/security', [SettingsController::class, 'updateSecurity'])->name('meet.settings.security.update'); Route::get('/settings', [SettingsController::class, 'edit'])->name('meet.settings'); diff --git a/tests/Feature/MeetWebTest.php b/tests/Feature/MeetWebTest.php index 9b86cec..f8af294 100644 --- a/tests/Feature/MeetWebTest.php +++ b/tests/Feature/MeetWebTest.php @@ -423,22 +423,6 @@ class MeetWebTest extends TestCase ->assertSee('Recordings'); } - public function test_admin_can_create_template(): void - { - $this->actingAs($this->user) - ->post('/templates', [ - 'name' => 'Weekly standup', - 'duration_minutes' => 30, - 'waiting_room' => '1', - ]) - ->assertRedirect(route('meet.templates.index')); - - $this->assertDatabaseHas('meet_templates', [ - 'name' => 'Weekly standup', - 'organization_id' => $this->organization->id, - ]); - } - public function test_admin_can_update_security_policy(): void { $this->actingAs($this->user)