diff --git a/app/Http/Controllers/api/v1/UserController.php b/app/Http/Controllers/api/v1/UserController.php index e5fe639d1..27c970d9e 100644 --- a/app/Http/Controllers/api/v1/UserController.php +++ b/app/Http/Controllers/api/v1/UserController.php @@ -207,6 +207,15 @@ public function update(UserRequest $request, User $user) if ($request->has('bbb_skip_check_audio')) { $user->bbb_skip_check_audio = $request->bbb_skip_check_audio; } + if ($request->has('record_agreement')) { + $user->record_agreement = $request->record_agreement; + } + if ($request->has('record_video_agreement')) { + $user->record_video_agreement = $request->record_video_agreement; + } + if ($request->has('record_attendance_agreement')) { + $user->record_attendance_agreement = $request->record_attendance_agreement; + } $user->save(); diff --git a/app/Http/Requests/UserRequest.php b/app/Http/Requests/UserRequest.php index 03f8b818d..8d6e3f4ff 100644 --- a/app/Http/Requests/UserRequest.php +++ b/app/Http/Requests/UserRequest.php @@ -20,6 +20,9 @@ public function rules() $rules = [ 'user_locale' => ['sometimes', 'required', 'string', Rule::in(array_keys(config('app.enabled_locales')))], 'bbb_skip_check_audio' => ['sometimes', 'required', 'boolean'], + 'record_agreement' => ['sometimes', 'required', 'boolean'], + 'record_video_agreement' => ['sometimes', 'required', 'boolean'], + 'record_attendance_agreement' => ['sometimes', 'required', 'boolean'], 'timezone' => ['sometimes', 'required', 'string', Rule::in(timezone_identifiers_list())], 'roles' => ['sometimes', 'required', 'array'], 'roles.*' => ['sometimes', 'distinct', 'integer', 'exists:App\Models\Role,id', Rule::notIn($prohibitedRoles)], diff --git a/app/Http/Resources/User.php b/app/Http/Resources/User.php index 6e8f52900..a9f8e32bb 100644 --- a/app/Http/Resources/User.php +++ b/app/Http/Resources/User.php @@ -82,7 +82,9 @@ public function toArray($request) return new RoleCollection($this->roles); }), 'bbb_skip_check_audio' => $this->bbb_skip_check_audio, - 'initial_password_set' => $this->initial_password_set, + 'record_agreement' => $this->record_agreement, + 'record_video_agreement' => $this->record_video_agreement, + 'record_attendance_agreement' => $this->record_attendance_agreement, 'timezone' => $this->timezone, 'superuser' => $this->superuser, ]; diff --git a/app/Models/User.php b/app/Models/User.php index 7fe6ecb1f..d6fea0ee8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -39,7 +39,9 @@ protected static function booted() * @var array */ protected $fillable = [ - 'firstname', 'lastname', 'email', 'password', 'external_id', 'guid', 'domain', 'locale', 'bbb_skip_check_audio', 'authenticator', + 'firstname', 'lastname', 'email', 'password', 'external_id', 'guid', 'domain', 'locale', 'bbb_skip_check_audio', + 'record_agreement', 'record_video_agreement', 'record_attendance_agreement', + 'authenticator', 'initial_password_set', 'timezone', ]; @@ -60,6 +62,9 @@ protected static function booted() protected $casts = [ 'email_verified_at' => 'datetime', 'bbb_skip_check_audio' => 'boolean', + 'record_agreement' => 'boolean', + 'record_video_agreement' => 'boolean', + 'record_attendance_agreement' => 'boolean', 'initial_password_set' => 'boolean', ]; diff --git a/database/migrations/2025_03_30_213313_add_default-record-agreement.php b/database/migrations/2025_03_30_213313_add_default-record-agreement.php new file mode 100644 index 000000000..e36ea34a0 --- /dev/null +++ b/database/migrations/2025_03_30_213313_add_default-record-agreement.php @@ -0,0 +1,32 @@ +boolean('record_agreement')->default(false)->after('bbb_skip_check_audio'); + $table->boolean('record_video_agreement')->default(false)->after('bbb_skip_check_audio'); + $table->boolean('record_attendance_agreement')->default(false)->after('bbb_skip_check_audio'); + }); + } + + /** + * Reverse the migrations. + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('record_agreement'); + $table->dropColumn('record_video_agreement'); + $table->dropColumn('record_attendance_agreement'); + }); + } +}; diff --git a/lang/de/admin.php b/lang/de/admin.php index f0b71a266..ae416ea39 100644 --- a/lang/de/admin.php +++ b/lang/de/admin.php @@ -448,6 +448,9 @@ 'roles_and_permissions' => 'Rollen and Berechtigungen', 'show_password' => 'Password anzeigen', 'skip_check_audio' => 'Echo-Test deaktivieren', + 'record_agreement' => 'Zustimmung zur Aufzeichnung', + 'record_video_agreement' => 'Zustimmung zur Videoaufzeichnung', + 'record_attendance_agreement' => 'Zustimmung zur Anwesenheitsaufzeichnung', 'tile_description' => 'Die Benutzer können sich an dem System anmelden und je nach Rolle unterschiedliche Funktionen nutzen.', 'timezone' => 'Zeitzone', 'user_locale' => 'Sprache', diff --git a/lang/de/validation.php b/lang/de/validation.php index 47f5bd4de..8f2b9a539 100644 --- a/lang/de/validation.php +++ b/lang/de/validation.php @@ -39,6 +39,9 @@ 'bbb_logo_dark_file' => 'Logodatei der dunklen Version', 'bbb_logo_file' => 'Logodatei', 'bbb_skip_check_audio' => 'Echo-Test deaktivieren', + 'record_agreement' => 'Zustimmung zur Aufzeichnung', + 'record_video_agreement' => 'Zustimmung zur Videoaufzeichnung', + 'record_attendance_agreement' => 'Zustimmung zur Anwesenheitsaufzeichnung', 'bbb_style' => 'CSS Style Datei', 'city' => 'Stadt', 'color' => 'Farbe', diff --git a/lang/en/admin.php b/lang/en/admin.php index 141f6db1b..259320f4a 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -448,6 +448,9 @@ 'roles_and_permissions' => 'Roles and permissions', 'show_password' => 'Show password', 'skip_check_audio' => 'Disable echo audio test', + 'record_agreement' => 'Record Agreement', + 'record_video_agreement' => 'Record Video Agreement', + 'record_attendance_agreement' => 'Record Attendance Agreement', 'tile_description' => 'Users can login to the system and use different features depending on their role.', 'timezone' => 'Timezone', 'user_locale' => 'Language', diff --git a/lang/en/validation.php b/lang/en/validation.php index bb8695ebf..fc96e6ee7 100644 --- a/lang/en/validation.php +++ b/lang/en/validation.php @@ -39,6 +39,9 @@ 'bbb_logo_dark_file' => 'Dark version logo file', 'bbb_logo_file' => 'Logo file', 'bbb_skip_check_audio' => 'Disable echo audio test', + 'record_agreement' => 'Record Agreement', + 'record_video_agreement' => 'Record Video Agreement', + 'record_attendance_agreement' => 'Record Attendance Agreement', 'bbb_style' => 'CSS style file', 'city' => 'City', 'color' => 'Color', diff --git a/resources/js/components/RoomJoinButton.vue b/resources/js/components/RoomJoinButton.vue index 0f7932281..a18117597 100644 --- a/resources/js/components/RoomJoinButton.vue +++ b/resources/js/components/RoomJoinButton.vue @@ -81,6 +81,14 @@ +
+ + {{ $t("app.profile") }} + +
+
+ + {{ $t("app.profile") }} + +
@@ -190,13 +206,13 @@ const emit = defineEmits([ ]); const authStore = useAuthStore(); - +console.log("authStore", authStore.currentUser); const modalVisible = ref(false); const isLoadingAction = ref(false); -const recordAttendanceAgreement = ref(false); +const recordAttendanceAgreement = ref(authStore.currentUser?.record_attendance_agreement ?? false); const showRunningMessage = ref(false); -const recordAgreement = ref(false); -const recordVideoAgreement = ref(false); +const recordAgreement = ref(authStore.currentUser?.record_agreement ?? false); +const recordVideoAgreement = ref(authStore.currentUser?.record_video_agreement ?? false); const name = ref(""); // Name of guest const api = useApi(); diff --git a/resources/js/components/UserTabOtherSettings.vue b/resources/js/components/UserTabOtherSettings.vue index 8cf5b6b0a..7cad141c1 100644 --- a/resources/js/components/UserTabOtherSettings.vue +++ b/resources/js/components/UserTabOtherSettings.vue @@ -25,6 +25,76 @@ +
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ +
+ +
+ + +
+
+