Always show Programme in the live room More menu.
Deploy Ladill Meet / deploy (push) Successful in 46s
Deploy Ladill Meet / deploy (push) Successful in 46s
Use programme.svg for conferences and webinars on mobile and desktop; the panel stays available with an empty state when Events has not linked a lineup yet. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 24 24" width="512" height="512"><path d="M19,2h-1V1c0-.552-.448-1-1-1s-1,.448-1,1v1H8V1c0-.552-.448-1-1-1s-1,.448-1,1v1h-1C2.243,2,0,4.243,0,7v12c0,2.757,2.243,5,5,5h4c.552,0,1-.448,1-1s-.448-1-1-1H5c-1.654,0-3-1.346-3-3V10H23c.552,0,1-.448,1-1v-2c0-2.757-2.243-5-5-5Zm3,6H2v-1c0-1.654,1.346-3,3-3h14c1.654,0,3,1.346,3,3v1Zm-3.121,4.879l-5.707,5.707c-.755,.755-1.172,1.76-1.172,2.829v1.586c0,.552,.448,1,1,1h1.586c1.069,0,2.073-.417,2.828-1.172l5.707-5.707c.567-.567,.879-1.32,.879-2.122s-.312-1.555-.878-2.121c-1.134-1.134-3.11-1.134-4.243,0Zm2.828,2.828l-5.708,5.707c-.377,.378-.879,.586-1.414,.586h-.586v-.586c0-.534,.208-1.036,.586-1.414l5.708-5.707c.377-.378,1.036-.378,1.414,0,.189,.188,.293,.439,.293,.707s-.104,.518-.293,.707Zm-16.707-1.707c0-.552,.448-1,1-1h7c.552,0,1,.448,1,1s-.448,1-1,1H6c-.552,0-1-.448-1-1Zm6,4c0,.552-.448,1-1,1H6c-.552,0-1-.448-1-1s.448-1,1-1h4c.552,0,1,.448,1,1Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -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';
|
||||
},
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
</div>
|
||||
@else
|
||||
<p class="px-2 py-4 text-center text-xs text-slate-500">No programme linked to this conference yet.</p>
|
||||
<p class="px-2 py-4 text-center text-xs text-slate-500">No programme linked to this {{ $sessionNoun }} yet.</p>
|
||||
@endif
|
||||
|
||||
@@ -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
|
||||
<div id="meet-config"
|
||||
data-token="{{ $mediaToken }}"
|
||||
@@ -58,6 +61,7 @@
|
||||
data-recording-active="{{ $activeRecording ? '1' : '0' }}"
|
||||
data-is-webinar="{{ ($isWebinar ?? false) ? '1' : '0' }}"
|
||||
data-is-conference="{{ ($isConference ?? false) ? '1' : '0' }}"
|
||||
data-session-noun="{{ $sessionNoun }}"
|
||||
data-is-green-room="{{ ($isGreenRoom ?? false) ? '1' : '0' }}"
|
||||
data-session-mode="{{ $session->session_mode }}"
|
||||
data-go-live-url="{{ ($isConference ?? false) && ($isGreenRoom ?? false) && ($canManageConference ?? $participant->isHost()) ? route('meet.room.townhall.live', $session) : '' }}"
|
||||
@@ -350,14 +354,6 @@
|
||||
<button @click="sendReaction('heart')" type="button" x-show="canPublish" class="hidden rounded-full bg-slate-700 p-3 hover:bg-slate-600 sm:inline-flex" title="React">
|
||||
@include('meet.room.partials.meet-icon', ['icon' => 'react'])
|
||||
</button>
|
||||
@if ($hasProgramme)
|
||||
<button @click="toggleProgramme()" type="button"
|
||||
class="hidden rounded-full p-3 transition-colors sm:inline-flex"
|
||||
:class="programmeOpen ? 'bg-indigo-600 hover:bg-indigo-500' : 'bg-slate-700 hover:bg-slate-600'"
|
||||
title="Programme">
|
||||
<svg class="h-5 w-5" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M6.75 3v2.25M17.25 3v2.25M4.5 8.25h15M4.5 19.5h15a1.5 1.5 0 0 0 1.5-1.5V8.25a1.5 1.5 0 0 0-1.5-1.5h-15a1.5 1.5 0 0 0-1.5 1.5v9.75a1.5 1.5 0 0 0 1.5 1.5Z"/></svg>
|
||||
</button>
|
||||
@endif
|
||||
<button @click="toggleChat()" type="button"
|
||||
class="hidden rounded-full p-3 transition-colors sm:inline-flex"
|
||||
:class="chatOpen ? 'bg-indigo-600 hover:bg-indigo-500' : 'bg-slate-700 hover:bg-slate-600'"
|
||||
@@ -477,20 +473,19 @@
|
||||
</div>
|
||||
</x-meet.room.panel>
|
||||
|
||||
@if ($hasProgramme)
|
||||
<x-meet.room.panel show="programmeOpen" title="Programme">
|
||||
<x-slot:subtitle>
|
||||
<p>Full conference lineup from Events</p>
|
||||
</x-slot:subtitle>
|
||||
<x-meet.room.panel show="programmeOpen" title="Programme">
|
||||
<x-slot:subtitle>
|
||||
<p>Lineup from Events when linked to this {{ $sessionNoun }}</p>
|
||||
</x-slot:subtitle>
|
||||
|
||||
<div class="flex min-h-0 flex-1 flex-col overflow-y-auto">
|
||||
@include('meet.room.partials.programme-panel', [
|
||||
'programmeSnapshot' => $programmeSnapshot,
|
||||
'linkedProgrammeItems' => $linkedProgrammeItems ?? [],
|
||||
])
|
||||
</div>
|
||||
</x-meet.room.panel>
|
||||
@endif
|
||||
<div class="flex min-h-0 flex-1 flex-col overflow-y-auto">
|
||||
@include('meet.room.partials.programme-panel', [
|
||||
'programmeSnapshot' => $programmeSnapshot,
|
||||
'linkedProgrammeItems' => $linkedProgrammeItems ?? [],
|
||||
'sessionNoun' => $sessionNoun,
|
||||
])
|
||||
</div>
|
||||
</x-meet.room.panel>
|
||||
|
||||
<x-meet.room.panel show="participantsOpen" :title="null">
|
||||
<x-slot:subtitle>
|
||||
@@ -689,18 +684,6 @@
|
||||
@click="sendReaction('thumbs'); featuresOpen = false" />
|
||||
<x-meet.room.menu-item icon="react" title="React" subtitle="Send a heart to the room"
|
||||
@click="sendReaction('heart'); featuresOpen = false" />
|
||||
@if ($hasProgramme)
|
||||
<button @click="toggleProgramme(); featuresOpen = false" type="button"
|
||||
class="flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm text-slate-200 transition-colors hover:bg-slate-800">
|
||||
<span class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-slate-800/80">
|
||||
<svg class="h-5 w-5" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M6.75 3v2.25M17.25 3v2.25M4.5 8.25h15M4.5 19.5h15a1.5 1.5 0 0 0 1.5-1.5V8.25a1.5 1.5 0 0 0-1.5-1.5h-15a1.5 1.5 0 0 0-1.5 1.5v9.75a1.5 1.5 0 0 0 1.5 1.5Z"/></svg>
|
||||
</span>
|
||||
<span class="min-w-0">
|
||||
<span class="block font-medium">Programme</span>
|
||||
<span class="block text-xs text-slate-400">View the conference lineup</span>
|
||||
</span>
|
||||
</button>
|
||||
@endif
|
||||
<x-meet.room.menu-item icon="chat" title="Chat" subtitle="Open the {{ $sessionNoun }} chat"
|
||||
@click="toggleChat(); featuresOpen = false" />
|
||||
<div class="my-1 border-t border-slate-800"></div>
|
||||
@@ -711,6 +694,9 @@
|
||||
<div class="my-1 border-t border-slate-800"></div>
|
||||
</div>
|
||||
|
||||
<x-meet.room.menu-item icon="programme" title="Programme" :subtitle="'View the '.$sessionNoun.' lineup from Events'"
|
||||
@click="toggleProgramme(); featuresOpen = false" />
|
||||
|
||||
<button @click="openUploadPicker()" type="button"
|
||||
class="flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm text-slate-200 transition-colors hover:bg-slate-800">
|
||||
<span class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-slate-800/80">
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user