diff --git a/public/images/meet-icons/programme.svg b/public/images/meet-icons/programme.svg
new file mode 100644
index 0000000..12c008d
--- /dev/null
+++ b/public/images/meet-icons/programme.svg
@@ -0,0 +1,2 @@
+
+
diff --git a/resources/js/meet-room.js b/resources/js/meet-room.js
index 620e5c2..aeb084f 100644
--- a/resources/js/meet-room.js
+++ b/resources/js/meet-room.js
@@ -48,6 +48,7 @@ function meetRoom() {
waitingCount: 0,
isWebinar: false,
isConference: false,
+ sessionNounLabel: '',
isGreenRoom: false,
goingLive: false,
presenterRefs: [],
@@ -148,6 +149,7 @@ function meetRoom() {
this.inBreakout = el.dataset.inBreakout === '1';
this.isWebinar = el.dataset.isWebinar === '1';
this.isConference = el.dataset.isConference === '1';
+ this.sessionNounLabel = el.dataset.sessionNoun || '';
this.isGreenRoom = el.dataset.isGreenRoom === '1';
this.audioOnly = el.dataset.audioOnly === '1';
this.isSpace = el.dataset.isSpace === '1';
@@ -2082,6 +2084,10 @@ function meetRoom() {
},
sessionNoun() {
+ if (this.sessionNounLabel) {
+ return this.sessionNounLabel;
+ }
+
return this.isConference ? 'conference' : 'meeting';
},
diff --git a/resources/views/meet/room/partials/meet-icon.blade.php b/resources/views/meet/room/partials/meet-icon.blade.php
index 39bfb8d..eace17f 100644
--- a/resources/views/meet/room/partials/meet-icon.blade.php
+++ b/resources/views/meet/room/partials/meet-icon.blade.php
@@ -17,6 +17,7 @@
'share',
'start-breakout',
'upload-file',
+ 'programme',
];
$iconName = in_array($icon, $allowed, true) ? $icon : null;
$iconPath = $iconName ? public_path('images/meet-icons/'.$iconName.'.svg') : null;
diff --git a/resources/views/meet/room/partials/programme-panel.blade.php b/resources/views/meet/room/partials/programme-panel.blade.php
index 25796bb..84de961 100644
--- a/resources/views/meet/room/partials/programme-panel.blade.php
+++ b/resources/views/meet/room/partials/programme-panel.blade.php
@@ -1,6 +1,7 @@
@php
$programme = $programmeSnapshot ?? null;
$linkedItems = $linkedProgrammeItems ?? [];
+ $sessionNoun = $sessionNoun ?? 'session';
@endphp
@if(is_array($programme) && ! empty($programme['days']))
@@ -62,5 +63,5 @@
@endforeach
@else
-
No programme linked to this conference yet.
+ No programme linked to this {{ $sessionNoun }} yet.
@endif
diff --git a/resources/views/meet/room/show.blade.php b/resources/views/meet/room/show.blade.php
index 3e4c36a..dffc0a2 100644
--- a/resources/views/meet/room/show.blade.php
+++ b/resources/views/meet/room/show.blade.php
@@ -25,9 +25,12 @@
'avatar_url' => $roomHostUser?->avatarUrl(),
];
$isConferenceSession = $isConference ?? false;
- $sessionNoun = $isConferenceSession ? 'conference' : 'meeting';
- $sessionNounTitle = $isConferenceSession ? 'Conference' : 'Meeting';
- $hasProgramme = is_array($programmeSnapshot ?? null) && ! empty(($programmeSnapshot ?? [])['days']);
+ $sessionNoun = match (true) {
+ $isConferenceSession => 'conference',
+ $room->isWebinar() => 'webinar',
+ default => 'meeting',
+ };
+ $sessionNounTitle = ucfirst($sessionNoun);
@endphp
@include('meet.room.partials.meet-icon', ['icon' => 'react'])
- @if ($hasProgramme)
-
- @endif
+
+
diff --git a/tests/Feature/MeetWebTest.php b/tests/Feature/MeetWebTest.php
index 439efe0..4ce9555 100644
--- a/tests/Feature/MeetWebTest.php
+++ b/tests/Feature/MeetWebTest.php
@@ -1163,7 +1163,103 @@ class MeetWebTest extends TestCase
->get('/room/'.$session->uuid)
->assertOk()
->assertSee('Opening keynote', false)
- ->assertSee('Programme', false);
+ ->assertSee('Programme', false)
+ ->assertSee('meet-icons/programme.svg', false)
+ ->assertSee('View the conference lineup from Events', false);
+ }
+
+ public function test_live_room_always_lists_programme_in_more_menu_without_linked_data(): void
+ {
+ config([
+ 'meet.media.livekit.api_key' => 'APIxxxxxxxxxxxxxxxx',
+ 'meet.media.livekit.api_secret' => 'secretsecretsecretsecretsecret12',
+ ]);
+
+ $room = Room::create([
+ 'owner_ref' => $this->user->public_id,
+ 'organization_id' => $this->organization->id,
+ 'host_user_ref' => $this->user->public_id,
+ 'title' => 'Summit',
+ 'type' => 'town_hall',
+ 'status' => 'live',
+ 'scheduled_at' => now()->addHour(),
+ 'timezone' => 'UTC',
+ 'settings' => config('meet.default_settings'),
+ ]);
+
+ $session = Session::create([
+ 'owner_ref' => $this->user->public_id,
+ 'room_id' => $room->id,
+ 'media_room_name' => 'meet-'.$room->uuid,
+ 'status' => 'live',
+ 'session_mode' => 'live',
+ 'started_at' => now(),
+ ]);
+
+ $participant = \App\Models\Participant::create([
+ 'owner_ref' => $this->user->public_id,
+ 'session_id' => $session->id,
+ 'user_ref' => $this->user->public_id,
+ 'display_name' => $this->user->name,
+ 'role' => 'host',
+ 'status' => 'joined',
+ 'joined_at' => now(),
+ ]);
+
+ $this->actingAs($this->user)
+ ->withSession(["meet.participant.{$session->uuid}" => $participant->uuid])
+ ->get('/room/'.$session->uuid)
+ ->assertOk()
+ ->assertSee('Programme', false)
+ ->assertSee('meet-icons/programme.svg', false)
+ ->assertSee('View the conference lineup from Events', false)
+ ->assertSee('No programme linked to this conference yet.', false);
+ }
+
+ public function test_webinar_live_room_lists_programme_in_more_menu(): void
+ {
+ config([
+ 'meet.media.livekit.api_key' => 'APIxxxxxxxxxxxxxxxx',
+ 'meet.media.livekit.api_secret' => 'secretsecretsecretsecretsecret12',
+ ]);
+
+ $room = Room::create([
+ 'owner_ref' => $this->user->public_id,
+ 'organization_id' => $this->organization->id,
+ 'host_user_ref' => $this->user->public_id,
+ 'title' => 'Product launch',
+ 'type' => 'webinar',
+ 'status' => 'live',
+ 'scheduled_at' => now()->addHour(),
+ 'timezone' => 'UTC',
+ 'settings' => config('meet.default_settings'),
+ ]);
+
+ $session = Session::create([
+ 'owner_ref' => $this->user->public_id,
+ 'room_id' => $room->id,
+ 'media_room_name' => 'meet-'.$room->uuid,
+ 'status' => 'live',
+ 'session_mode' => 'live',
+ 'started_at' => now(),
+ ]);
+
+ $participant = \App\Models\Participant::create([
+ 'owner_ref' => $this->user->public_id,
+ 'session_id' => $session->id,
+ 'user_ref' => $this->user->public_id,
+ 'display_name' => $this->user->name,
+ 'role' => 'host',
+ 'status' => 'joined',
+ 'joined_at' => now(),
+ ]);
+
+ $this->actingAs($this->user)
+ ->withSession(["meet.participant.{$session->uuid}" => $participant->uuid])
+ ->get('/room/'.$session->uuid)
+ ->assertOk()
+ ->assertSee('View the webinar lineup from Events', false)
+ ->assertSee('data-session-noun="webinar"', false);
}
public function test_afia_chat_returns_reply_when_ai_configured(): void