diff --git a/CHANGELOG.md b/CHANGELOG.md index 37d2154902..2286afd0ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Accessibility: Landmark role to all search fields ([#3264]) - Accessibility: Skip links ([#3264]) - Accessibility: Announce page change to screen readers ([#3264]) +- Guests can now choose to remember their name for future video conferences ([#2450], [#3275]) +- Room access is now preserved across page reloads after entering via an access code or personalized link ([#3275]) +- Login button inside room access overlay to allow users to log in instead of accessing the room as a guest ([#2450], [#3275]) ### Changed @@ -24,6 +27,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Accessibility: Move keyboard focus to page start on page change ([#3264]) - Accessibility: Reduced flipping words animation on loading page for browsers with reduced-motion set ([#3277]) - Room share dialog now copies the room link and invitation message to the clipboard in both plain text and HTML format ([#3296]) +- Guest name input was moved from join dialog to room access overlay ([#2450], [#3275]) +- Room share link now includes the access code, so users no longer need to enter it manually when opening the link ([#3275]) +- Improved fallback behavior for invalid room and user tab links ([#3275]) ## [v4.16.0] - 2026-06-12 @@ -767,6 +773,7 @@ You can find the changelog for older versions there [here](https://github.com/TH [#2383]: https://github.com/THM-Health/PILOS/issues/2383 [#2433]: https://github.com/THM-Health/PILOS/pull/2433 [#2449]: https://github.com/THM-Health/PILOS/pull/2449 +[#2450]: https://github.com/THM-Health/PILOS/issues/2450 [#2476]: https://github.com/THM-Health/PILOS/issues/2476 [#2477]: https://github.com/THM-Health/PILOS/pull/2477 [#2478]: https://github.com/THM-Health/PILOS/issues/2478 @@ -855,6 +862,7 @@ You can find the changelog for older versions there [here](https://github.com/TH [#3198]: https://github.com/THM-Health/PILOS/pull/3198 [#3215]: https://github.com/THM-Health/PILOS/pull/3215 [#3264]: https://github.com/THM-Health/PILOS/pull/3264 +[#3275]: https://github.com/THM-Health/PILOS/pull/3275 [#3277]: https://github.com/THM-Health/PILOS/pull/3277 [#3296]: https://github.com/THM-Health/PILOS/pull/3296 [unreleased]: https://github.com/THM-Health/PILOS/compare/v4.16.0...develop diff --git a/app/Http/Requests/JoinMeetingRequest.php b/app/Http/Requests/JoinMeetingRequest.php index c76a40795b..44f053cc3a 100644 --- a/app/Http/Requests/JoinMeetingRequest.php +++ b/app/Http/Requests/JoinMeetingRequest.php @@ -4,7 +4,6 @@ namespace App\Http\Requests; -use App\Rules\ValidName; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Context; @@ -15,7 +14,7 @@ public function rules(): array $personalizedLink = Context::getHidden("room.{$this->room->id}.personalized_link"); $rules = [ - 'name' => auth()->check() || $personalizedLink ? [] : ['bail', 'required', 'min:2', 'max:50', new ValidName], + 'name' => auth()->check() || $personalizedLink ? [] : ValidateParticipantNameRequest::participantNameValidationRules(), 'dark_mode' => ['sometimes', 'boolean'], ]; diff --git a/app/Http/Requests/StartMeetingRequest.php b/app/Http/Requests/StartMeetingRequest.php index f0c91a05b1..8fa084fcab 100644 --- a/app/Http/Requests/StartMeetingRequest.php +++ b/app/Http/Requests/StartMeetingRequest.php @@ -4,7 +4,6 @@ namespace App\Http\Requests; -use App\Rules\ValidName; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Facades\Context; @@ -15,7 +14,7 @@ public function rules(): array $personalizedLink = Context::getHidden("room.{$this->room->id}.personalized_link"); $rules = [ - 'name' => auth()->check() || $personalizedLink ? [] : ['bail', 'required', 'min:2', 'max:50', new ValidName], + 'name' => auth()->check() || $personalizedLink ? [] : ValidateParticipantNameRequest::participantNameValidationRules(), 'dark_mode' => ['sometimes', 'boolean'], ]; diff --git a/app/Http/Requests/ValidateParticipantNameRequest.php b/app/Http/Requests/ValidateParticipantNameRequest.php new file mode 100644 index 0000000000..b12f672330 --- /dev/null +++ b/app/Http/Requests/ValidateParticipantNameRequest.php @@ -0,0 +1,23 @@ + self::participantNameValidationRules(), + ]; + } + + public static function participantNameValidationRules(): array + { + return ['bail', 'required', 'min:2', 'max:50', new ValidName]; + } +} diff --git a/lang/en/app.php b/lang/en/app.php index 07e5cd083b..ffd365c85f 100644 --- a/lang/en/app.php +++ b/lang/en/app.php @@ -126,6 +126,7 @@ 'next_page' => 'Next page', 'no' => 'No', 'not_found' => '404 | The requested address was not found', + 'or' => 'or', 'overwrite' => 'Overwrite', 'previous_page' => 'Previous page', 'profile' => 'Profile', diff --git a/lang/en/auth.php b/lang/en/auth.php index 9ba62f17a8..1bb5416344 100644 --- a/lang/en/auth.php +++ b/lang/en/auth.php @@ -42,6 +42,7 @@ 'logout_success' => 'Successfully logged out', 'new_password' => 'New password', 'new_password_confirmation' => 'New password confirmation', + 'offer_login' => 'Login with your user account', 'oidc' => [ 'logout_incomplete' => 'You are still logged in at the OpenID Connect provider.', 'redirect' => 'Log in', diff --git a/lang/en/rooms.php b/lang/en/rooms.php index b529230002..86203594ec 100644 --- a/lang/en/rooms.php +++ b/lang/en/rooms.php @@ -11,6 +11,7 @@ 'meetingForciblyEnded' => 'Failed to join meeting: The meeting is no longer running.', ], 'become_member' => 'Become member', + 'change_participant_name' => 'Change name', 'change_type' => [ 'changing_settings' => 'The following changes will be made to the room settings', 'current_setting' => 'Current setting', @@ -24,6 +25,7 @@ 'detached' => 'Connection to ongoing video conference lost, recovery failed.', 'reconnecting' => 'Connection to ongoing video conference lost, trying to reconnect.', ], + 'continue_as_guest' => 'Continue as guest', 'create' => [ 'ok' => 'Create', 'title' => 'Create room', @@ -273,6 +275,7 @@ ], ], 'name' => 'Room name', + 'name_in_video_conference' => 'Name in video conference: ', 'no_rooms_available' => 'No rooms available', 'no_rooms_found' => 'No rooms found', 'not_running' => 'This room is not started yet.', @@ -367,6 +370,8 @@ 'title' => 'Recordings', 'view_recording' => 'View recording', ], + 'remember_participant_name' => 'Remember name for next time', + 'request_participant_name_change' => 'Please change your name to join the room.', 'require_access_code' => 'An access code is required to join this room', 'role' => 'Role', 'roles' => [ diff --git a/resources/js/components/RoomAccessOverlay.vue b/resources/js/components/RoomAccessOverlay.vue new file mode 100644 index 0000000000..d7e129a5ef --- /dev/null +++ b/resources/js/components/RoomAccessOverlay.vue @@ -0,0 +1,237 @@ + + + diff --git a/resources/js/components/RoomBBBMessage.vue b/resources/js/components/RoomBBBMessage.vue index 5de7a9b48f..d0c71b08b0 100644 --- a/resources/js/components/RoomBBBMessage.vue +++ b/resources/js/components/RoomBBBMessage.vue @@ -70,14 +70,14 @@ watch(errorMessages, (errors) => { {{ reason }} -
+
-
+
- +
-
- - {{ $t("rooms.connection_error.detached") }} - - - - {{ $t("rooms.connection_error.reconnecting") }} - -
diff --git a/resources/js/components/RoomShareButton.vue b/resources/js/components/RoomShareButton.vue index 11f8621cf3..d5e9ce548e 100644 --- a/resources/js/components/RoomShareButton.vue +++ b/resources/js/components/RoomShareButton.vue @@ -216,6 +216,9 @@ const roomUrl = computed(() => { router.resolve({ name: "rooms.view", params: { id: props.room.id }, + hash: props.room.access_code + ? "#accessCode=" + props.room.access_code + : "", }).href ); }); diff --git a/resources/js/components/RoomTabDescription.vue b/resources/js/components/RoomTabDescription.vue index a5634496a1..0d935ad510 100644 --- a/resources/js/components/RoomTabDescription.vue +++ b/resources/js/components/RoomTabDescription.vue @@ -1,5 +1,5 @@