From 67b18b31fc44308e4fd20d8c2dd3215c3d800347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Wed, 29 Jul 2026 17:43:58 +0200 Subject: [PATCH 1/9] add table reference to help sidebar --- web/messages/en/settings.json | 2 ++ web/src/pages/EnrollmentPage/style.scss | 11 +++++++++++ .../EnrollmentPage/tabs/MessageTemplatesTab.tsx | 14 ++++++++++++++ 3 files changed, 27 insertions(+) diff --git a/web/messages/en/settings.json b/web/messages/en/settings.json index 88752571b1..300815083f 100644 --- a/web/messages/en/settings.json +++ b/web/messages/en/settings.json @@ -130,6 +130,8 @@ "settings_enrollment_template_help_markdown_bold": "Bold text.", "settings_enrollment_template_help_markdown_lists": "Unordered list.", "settings_enrollment_template_help_markdown_link": "Link.", + "settings_enrollment_template_help_markdown_tables": "You can also create tables using", + "settings_enrollment_template_help_markdown_tables_link": "GFM table syntax", "settings_enrollment_section_duration_title": "Enrollment session duration", "settings_enrollment_section_duration_description": "Configure the expiration time of the unique token sent to a newly added user. This token is used to activate the account, and in this section administrators can control how long the token remains valid.", "settings_enrollment_section_edge_ui_title": "Edge UI Settings", diff --git a/web/src/pages/EnrollmentPage/style.scss b/web/src/pages/EnrollmentPage/style.scss index 1834ce4ad0..e0820c4bda 100644 --- a/web/src/pages/EnrollmentPage/style.scss +++ b/web/src/pages/EnrollmentPage/style.scss @@ -15,6 +15,17 @@ } } + .sidebar-text { + color: var(--fg-faded); + font: var(--t-body-sm-400); + line-height: 20px; + + a { + color: var(--fg-faded); + font: var(--t-body-sm-600); + } + } + .sidebar-token, .sidebar-token-medium { color: var(--fg-faded); diff --git a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx index 638f7712af..e81c4d405b 100644 --- a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx +++ b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx @@ -291,6 +291,20 @@ const MessageTemplatesSuggestion = () => { ))} + + + +

+ {m.settings_enrollment_template_help_markdown_tables()}{' '} + + {m.settings_enrollment_template_help_markdown_tables_link()} + + . +

} /> From fe6115768ce110aac3fa2075e66033f639071a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Thu, 30 Jul 2026 08:15:34 +0200 Subject: [PATCH 2/9] add migration --- ...729000000_[2.1.0]_enrollment_display_welcome_message.down.sql | 1 + ...60729000000_[2.1.0]_enrollment_display_welcome_message.up.sql | 1 + 2 files changed, 2 insertions(+) create mode 100644 migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.down.sql create mode 100644 migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.up.sql diff --git a/migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.down.sql b/migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.down.sql new file mode 100644 index 0000000000..8cff5a793d --- /dev/null +++ b/migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.down.sql @@ -0,0 +1 @@ +ALTER TABLE settings DROP COLUMN enrollment_display_welcome_message; diff --git a/migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.up.sql b/migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.up.sql new file mode 100644 index 0000000000..fe3f38f9eb --- /dev/null +++ b/migrations/20260729000000_[2.1.0]_enrollment_display_welcome_message.up.sql @@ -0,0 +1 @@ +ALTER TABLE settings ADD COLUMN enrollment_display_welcome_message BOOLEAN NOT NULL DEFAULT true; From 6d30872d2fb3c30f1a50cfae80013912490cb45a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Thu, 30 Jul 2026 08:19:45 +0200 Subject: [PATCH 3/9] update settings struct --- ...d332de9e8014d6cb1df0ba17fdf6d3a44ef4.json} | 5 +- .../src/db/models/settings/mod.rs | 108 ++++++++++-------- 2 files changed, 61 insertions(+), 52 deletions(-) rename .sqlx/{query-a31ab8c10b294f9eb5d3004a893634374fac89e79524e300156a7b06cdf8747e.json => query-3e465851dfa15717c0546a2e2fbbd332de9e8014d6cb1df0ba17fdf6d3a44ef4.json} (62%) diff --git a/.sqlx/query-a31ab8c10b294f9eb5d3004a893634374fac89e79524e300156a7b06cdf8747e.json b/.sqlx/query-3e465851dfa15717c0546a2e2fbbd332de9e8014d6cb1df0ba17fdf6d3a44ef4.json similarity index 62% rename from .sqlx/query-a31ab8c10b294f9eb5d3004a893634374fac89e79524e300156a7b06cdf8747e.json rename to .sqlx/query-3e465851dfa15717c0546a2e2fbbd332de9e8014d6cb1df0ba17fdf6d3a44ef4.json index ce38b0f991..6e400d69b3 100644 --- a/.sqlx/query-a31ab8c10b294f9eb5d3004a893634374fac89e79524e300156a7b06cdf8747e.json +++ b/.sqlx/query-3e465851dfa15717c0546a2e2fbbd332de9e8014d6cb1df0ba17fdf6d3a44ef4.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE \"settings\" SET openid_enabled = $1, wireguard_enabled = $2, webhooks_enabled = $3, worker_enabled = $4, challenge_template = $5, instance_name = $6, main_logo_url = $7, nav_logo_url = $8, smtp_server = $9, smtp_port = $10, smtp_encryption = $11, smtp_user = $12, smtp_password = $13, smtp_sender = $14, smtp_authentication = $15, smtp_oauth_issuer_url = $16, smtp_oauth_client_id = $17, smtp_oauth_client_secret = $18, smtp_oauth_refresh_token = $19, enrollment_vpn_step_optional = $20, enrollment_welcome_message = $21, enrollment_welcome_email = $22, enrollment_welcome_email_subject = $23, enrollment_use_welcome_message_as_email = $24, enrollment_send_welcome_email = $25, uuid = $26, ldap_url = $27, ldap_bind_username = $28, ldap_bind_password = $29, ldap_group_search_base = $30, ldap_user_search_base = $31, ldap_user_obj_class = $32, ldap_group_obj_class = $33, ldap_username_attr = $34, ldap_groupname_attr = $35, ldap_group_member_attr = $36, ldap_member_attr = $37, ldap_use_starttls = $38, ldap_tls_verify_cert = $39, openid_create_account = $40, license = $41, gateway_disconnect_notifications_enabled = $42, gateway_disconnect_notifications_inactivity_threshold = $43, gateway_disconnect_notifications_reconnect_notification_enabled = $44, ldap_sync_status = $45, ldap_enabled = $46, ldap_sync_enabled = $47, ldap_is_authoritative = $48, ldap_sync_interval = $49, ldap_user_auxiliary_obj_classes = $50, ldap_uses_ad = $51, ldap_user_rdn_attr = $52, ldap_sync_groups = $53, ldap_remote_enrollment_enabled = $54, ldap_remote_enrollment_send_invite = $55, openid_username_handling = $56, defguard_url = $57, default_admin_group_name = $58, authentication_period_days = $59, mfa_code_timeout_seconds = $60, public_proxy_url = $61, default_admin_id = $62, secret_key = $63, openid_signing_key_der = $64, enable_stats_purge = $65, stats_purge_frequency_hours = $66, stats_purge_threshold_days = $67, enrollment_token_timeout_hours = $68, password_reset_token_timeout_hours = $69, enrollment_session_timeout_minutes = $70, password_reset_session_timeout_minutes = $71, ldap_sync_account_status = $72, ldap_disable_password_management = $73, smtp_oauth_tenant_id = $74, smtp_tls_verify_cert = $75 WHERE id = 1", + "query": "UPDATE \"settings\" SET openid_enabled = $1, wireguard_enabled = $2, webhooks_enabled = $3, worker_enabled = $4, challenge_template = $5, instance_name = $6, main_logo_url = $7, nav_logo_url = $8, smtp_server = $9, smtp_port = $10, smtp_encryption = $11, smtp_user = $12, smtp_password = $13, smtp_sender = $14, smtp_authentication = $15, smtp_oauth_issuer_url = $16, smtp_oauth_client_id = $17, smtp_oauth_client_secret = $18, smtp_oauth_refresh_token = $19, enrollment_vpn_step_optional = $20, enrollment_welcome_message = $21, enrollment_welcome_email = $22, enrollment_welcome_email_subject = $23, enrollment_use_welcome_message_as_email = $24, enrollment_send_welcome_email = $25, enrollment_display_welcome_message = $26, uuid = $27, ldap_url = $28, ldap_bind_username = $29, ldap_bind_password = $30, ldap_group_search_base = $31, ldap_user_search_base = $32, ldap_user_obj_class = $33, ldap_group_obj_class = $34, ldap_username_attr = $35, ldap_groupname_attr = $36, ldap_group_member_attr = $37, ldap_member_attr = $38, ldap_use_starttls = $39, ldap_tls_verify_cert = $40, openid_create_account = $41, license = $42, gateway_disconnect_notifications_enabled = $43, gateway_disconnect_notifications_inactivity_threshold = $44, gateway_disconnect_notifications_reconnect_notification_enabled = $45, ldap_sync_status = $46, ldap_enabled = $47, ldap_sync_enabled = $48, ldap_is_authoritative = $49, ldap_sync_interval = $50, ldap_user_auxiliary_obj_classes = $51, ldap_uses_ad = $52, ldap_user_rdn_attr = $53, ldap_sync_groups = $54, ldap_remote_enrollment_enabled = $55, ldap_remote_enrollment_send_invite = $56, openid_username_handling = $57, defguard_url = $58, default_admin_group_name = $59, authentication_period_days = $60, mfa_code_timeout_seconds = $61, public_proxy_url = $62, default_admin_id = $63, secret_key = $64, openid_signing_key_der = $65, enable_stats_purge = $66, stats_purge_frequency_hours = $67, stats_purge_threshold_days = $68, enrollment_token_timeout_hours = $69, password_reset_token_timeout_hours = $70, enrollment_session_timeout_minutes = $71, password_reset_session_timeout_minutes = $72, ldap_sync_account_status = $73, ldap_disable_password_management = $74, smtp_oauth_tenant_id = $75, smtp_tls_verify_cert = $76 WHERE id = 1", "describe": { "columns": [], "parameters": { @@ -52,6 +52,7 @@ "Text", "Bool", "Bool", + "Bool", "Uuid", "Text", "Text", @@ -127,5 +128,5 @@ }, "nullable": [] }, - "hash": "a31ab8c10b294f9eb5d3004a893634374fac89e79524e300156a7b06cdf8747e" + "hash": "3e465851dfa15717c0546a2e2fbbd332de9e8014d6cb1df0ba17fdf6d3a44ef4" } diff --git a/crates/defguard_common/src/db/models/settings/mod.rs b/crates/defguard_common/src/db/models/settings/mod.rs index 7f62edec82..82313d6099 100644 --- a/crates/defguard_common/src/db/models/settings/mod.rs +++ b/crates/defguard_common/src/db/models/settings/mod.rs @@ -183,6 +183,7 @@ pub struct Settings { pub enrollment_welcome_email_subject: Option, pub enrollment_use_welcome_message_as_email: bool, pub enrollment_send_welcome_email: bool, + pub enrollment_display_welcome_message: bool, // Instance UUID needed for desktop client #[serde(skip)] pub uuid: Uuid, @@ -280,6 +281,10 @@ impl fmt::Debug for Settings { "enrollment_send_welcome_email", &self.enrollment_send_welcome_email, ) + .field( + "enrollment_display_welcome_message", + &self.enrollment_display_welcome_message, + ) .field("uuid", &self.uuid) .field("ldap_url", &self.ldap_url) .field("ldap_bind_username", &self.ldap_bind_username) @@ -487,6 +492,7 @@ impl Settings { enrollment_vpn_step_optional, enrollment_welcome_message, \ enrollment_welcome_email, enrollment_welcome_email_subject, \ enrollment_use_welcome_message_as_email, enrollment_send_welcome_email, \ + enrollment_display_welcome_message, \ uuid, ldap_url, ldap_bind_username, ldap_bind_password, \ ldap_group_search_base, ldap_user_search_base, ldap_user_obj_class, \ ldap_group_obj_class, ldap_username_attr, ldap_groupname_attr, \ @@ -577,56 +583,57 @@ impl Settings { enrollment_welcome_email_subject = $23, \ enrollment_use_welcome_message_as_email = $24, \ enrollment_send_welcome_email = $25, \ - uuid = $26, \ - ldap_url = $27, \ - ldap_bind_username = $28, \ - ldap_bind_password = $29, \ - ldap_group_search_base = $30, \ - ldap_user_search_base = $31, \ - ldap_user_obj_class = $32, \ - ldap_group_obj_class = $33, \ - ldap_username_attr = $34, \ - ldap_groupname_attr = $35, \ - ldap_group_member_attr = $36, \ - ldap_member_attr = $37, \ - ldap_use_starttls = $38, \ - ldap_tls_verify_cert = $39, \ - openid_create_account = $40, \ - license = $41, \ - gateway_disconnect_notifications_enabled = $42, \ - gateway_disconnect_notifications_inactivity_threshold = $43, \ - gateway_disconnect_notifications_reconnect_notification_enabled = $44, \ - ldap_sync_status = $45, \ - ldap_enabled = $46, \ - ldap_sync_enabled = $47, \ - ldap_is_authoritative = $48, \ - ldap_sync_interval = $49, \ - ldap_user_auxiliary_obj_classes = $50, \ - ldap_uses_ad = $51, \ - ldap_user_rdn_attr = $52, \ - ldap_sync_groups = $53, \ - ldap_remote_enrollment_enabled = $54, \ - ldap_remote_enrollment_send_invite = $55, \ - openid_username_handling = $56, \ - defguard_url = $57, \ - default_admin_group_name = $58, \ - authentication_period_days = $59, \ - mfa_code_timeout_seconds = $60, \ - public_proxy_url = $61, \ - default_admin_id = $62, \ - secret_key = $63, \ - openid_signing_key_der = $64, \ - enable_stats_purge = $65, \ - stats_purge_frequency_hours = $66, \ - stats_purge_threshold_days = $67, \ - enrollment_token_timeout_hours = $68, \ - password_reset_token_timeout_hours = $69, \ - enrollment_session_timeout_minutes = $70, \ - password_reset_session_timeout_minutes = $71, \ - ldap_sync_account_status = $72, \ - ldap_disable_password_management = $73, \ - smtp_oauth_tenant_id = $74, \ - smtp_tls_verify_cert = $75 \ + enrollment_display_welcome_message = $26, \ + uuid = $27, \ + ldap_url = $28, \ + ldap_bind_username = $29, \ + ldap_bind_password = $30, \ + ldap_group_search_base = $31, \ + ldap_user_search_base = $32, \ + ldap_user_obj_class = $33, \ + ldap_group_obj_class = $34, \ + ldap_username_attr = $35, \ + ldap_groupname_attr = $36, \ + ldap_group_member_attr = $37, \ + ldap_member_attr = $38, \ + ldap_use_starttls = $39, \ + ldap_tls_verify_cert = $40, \ + openid_create_account = $41, \ + license = $42, \ + gateway_disconnect_notifications_enabled = $43, \ + gateway_disconnect_notifications_inactivity_threshold = $44, \ + gateway_disconnect_notifications_reconnect_notification_enabled = $45, \ + ldap_sync_status = $46, \ + ldap_enabled = $47, \ + ldap_sync_enabled = $48, \ + ldap_is_authoritative = $49, \ + ldap_sync_interval = $50, \ + ldap_user_auxiliary_obj_classes = $51, \ + ldap_uses_ad = $52, \ + ldap_user_rdn_attr = $53, \ + ldap_sync_groups = $54, \ + ldap_remote_enrollment_enabled = $55, \ + ldap_remote_enrollment_send_invite = $56, \ + openid_username_handling = $57, \ + defguard_url = $58, \ + default_admin_group_name = $59, \ + authentication_period_days = $60, \ + mfa_code_timeout_seconds = $61, \ + public_proxy_url = $62, \ + default_admin_id = $63, \ + secret_key = $64, \ + openid_signing_key_der = $65, \ + enable_stats_purge = $66, \ + stats_purge_frequency_hours = $67, \ + stats_purge_threshold_days = $68, \ + enrollment_token_timeout_hours = $69, \ + password_reset_token_timeout_hours = $70, \ + enrollment_session_timeout_minutes = $71, \ + password_reset_session_timeout_minutes = $72, \ + ldap_sync_account_status = $73, \ + ldap_disable_password_management = $74, \ + smtp_oauth_tenant_id = $75, \ + smtp_tls_verify_cert = $76 \ WHERE id = 1", self.openid_enabled, self.wireguard_enabled, @@ -653,6 +660,7 @@ impl Settings { self.enrollment_welcome_email_subject, self.enrollment_use_welcome_message_as_email, self.enrollment_send_welcome_email, + self.enrollment_display_welcome_message, self.uuid, self.ldap_url, self.ldap_bind_username, From 473455db87e76af90aa4b1474abc8ec35fbafc68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Thu, 30 Jul 2026 08:23:30 +0200 Subject: [PATCH 4/9] skip final page content in enrollment handler --- .../src/servers/enrollment.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/crates/defguard_proxy_manager/src/servers/enrollment.rs b/crates/defguard_proxy_manager/src/servers/enrollment.rs index ead524de5f..1c4e1cece5 100644 --- a/crates/defguard_proxy_manager/src/servers/enrollment.rs +++ b/crates/defguard_proxy_manager/src/servers/enrollment.rs @@ -270,13 +270,22 @@ impl EnrollmentServer { admin_device_management: enterprise_settings.admin_device_management, mfa_required: instance_has_internal_mfa, }; + let settings = Settings::get_current_settings(); + let final_page_content = if settings.enrollment_display_welcome_message { + enrollment + .get_welcome_page_content(&mut transaction) + .await? + } else { + debug!( + "Skipping enrollment welcome page content because it is disabled in settings" + ); + String::new() + }; let response = defguard_proto::client_types::EnrollmentStartResponse { admin: admin_info, user: Some(user_info), deadline_timestamp: session_deadline.and_utc().timestamp(), - final_page_content: enrollment - .get_welcome_page_content(&mut transaction) - .await?, + final_page_content, instance: Some(instance_info.into()), settings: Some(enrollment_settings), }; From 6c3d985edc526bed12f13852e57a34b2514efde7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Thu, 30 Jul 2026 08:45:22 +0200 Subject: [PATCH 5/9] add test --- .../src/servers/enrollment.rs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/crates/defguard_proxy_manager/src/servers/enrollment.rs b/crates/defguard_proxy_manager/src/servers/enrollment.rs index 1c4e1cece5..506d5cd1de 100644 --- a/crates/defguard_proxy_manager/src/servers/enrollment.rs +++ b/crates/defguard_proxy_manager/src/servers/enrollment.rs @@ -1241,6 +1241,7 @@ mod test { setup_pool, }; use defguard_core::db::models::enrollment::{ENROLLMENT_TOKEN_TYPE, Token}; + use defguard_proto::{client_types::EnrollmentStartRequest, proxy::DeviceInfo}; use sqlx::postgres::{PgConnectOptions, PgPoolOptions}; use tokio::sync::{broadcast, mpsc::unbounded_channel}; @@ -1292,4 +1293,72 @@ mod test { assert!(result.is_ok()); } + + #[sqlx::test] + async fn test_display_welcome_message_if_disabled_returns_empty( + _: PgPoolOptions, + options: PgConnectOptions, + ) { + let pool = setup_pool(options).await; + + let user = User::new( + "test_user_disabled_display", + None, + "Test", + "User", + "user-disabled-display@test.com", + None, + ) + .save(&pool) + .await + .unwrap(); + + let token = Token::new( + user.id, + None, + Some(user.email.clone()), + 3600, + Some(ENROLLMENT_TOKEN_TYPE.to_owned()), + ); + token.save(&pool).await.unwrap(); + + Settings::initialize_runtime_defaults(&pool).await.unwrap(); + initialize_current_settings(&pool).await.unwrap(); + + let mut settings = Settings::get_current_settings(); + assert!( + settings + .enrollment_welcome_message + .as_deref() + .is_some_and(|msg| !msg.is_empty()), + "welcome message template must be non-empty for this test to be meaningful" + ); + settings.enrollment_display_welcome_message = false; + update_current_settings(&pool, settings).await.unwrap(); + + let (gateway_tx, _gateway_rx) = broadcast::channel(1); + let (bidi_event_tx, _bidi_events_rx) = unbounded_channel(); + let (ldap_tx, _ldap_rx) = unbounded_channel(); + let server = EnrollmentServer::new(pool.clone(), gateway_tx, bidi_event_tx, ldap_tx); + + let request = EnrollmentStartRequest { + token: token.id.clone(), + }; + let device_info = DeviceInfo { + ip_address: "127.0.0.1".to_owned(), + user_agent: None, + version: None, + platform: None, + }; + let response = server + .start_enrollment(request, Some(device_info)) + .await + .expect("start_enrollment should succeed"); + + assert!( + response.final_page_content.is_empty(), + "final_page_content should be empty when display is disabled, got: {}", + response.final_page_content + ); + } } From 8677f771d9c826967377726620328a9bff9e7b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Thu, 30 Jul 2026 18:09:52 +0200 Subject: [PATCH 6/9] wire up frontend form --- .../tabs/MessageTemplatesTab.tsx | 55 ++++++++++--------- web/src/shared/api/types.ts | 1 + 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx index e81c4d405b..13f0fd09f1 100644 --- a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx +++ b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx @@ -77,7 +77,8 @@ const MessageTemplatesTabContent = ({ settings }: { settings: Settings }) => { const defaultValues = useMemo( (): MessageTemplatesFormFields => ({ - enrollment_display_welcome_message: true, + enrollment_display_welcome_message: + settings.enrollment_display_welcome_message ?? true, enrollment_welcome_message: settings.enrollment_welcome_message ?? '', enrollment_send_welcome_email: settings.enrollment_send_welcome_email ?? true, enrollment_welcome_email_subject: settings.enrollment_welcome_email_subject ?? '', @@ -96,9 +97,7 @@ const MessageTemplatesTabContent = ({ settings }: { settings: Settings }) => { onChange: messageTemplatesFormSchema, }, onSubmit: async ({ value }) => { - const { enrollment_display_welcome_message: _displayWelcomeMessage, ...payload } = - value; - await mutateAsync(payload); + await mutateAsync(value); form.reset(value); }, }); @@ -123,27 +122,33 @@ const MessageTemplatesTabContent = ({ settings }: { settings: Settings }) => {
- {(field) => ( - - - - {(field) => ( - - )} - - - - )} + {(field) => { + const displayWelcomeMessage = Boolean(field.state.value); + + return ( + + + + + {(field) => ( + + )} + + + + + ); + }}
diff --git a/web/src/shared/api/types.ts b/web/src/shared/api/types.ts index 9406849c01..c9792ea377 100644 --- a/web/src/shared/api/types.ts +++ b/web/src/shared/api/types.ts @@ -1164,6 +1164,7 @@ export interface SettingsEnrollment { enrollment_welcome_email_subject: string; enrollment_use_welcome_message_as_email: boolean; enrollment_send_welcome_email: boolean; + enrollment_display_welcome_message: boolean; } export interface SettingsModules { From c324d333318e0c57f95ee74bc60cfb60be0c9c9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Fri, 31 Jul 2026 11:25:35 +0200 Subject: [PATCH 7/9] disable email checkbox if welcome message toggle is unchecked --- .../EnrollmentPage/tabs/MessageTemplatesTab.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx index 13f0fd09f1..58aaff47cf 100644 --- a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx +++ b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx @@ -1,5 +1,6 @@ +import { useStore } from '@tanstack/react-form'; import { useMutation, useQuery } from '@tanstack/react-query'; -import { useMemo } from 'react'; +import { useEffect, useMemo } from 'react'; import z from 'zod'; import { m } from '../../../paraglide/messages'; import api from '../../../shared/api/api'; @@ -102,6 +103,17 @@ const MessageTemplatesTabContent = ({ settings }: { settings: Settings }) => { }, }); + const displayWelcomeMessage = useStore( + form.store, + (s) => s.values.enrollment_display_welcome_message, + ); + + useEffect(() => { + if (!displayWelcomeMessage) { + form.setFieldValue('enrollment_use_welcome_message_as_email', false); + } + }, [displayWelcomeMessage, form]); + return ( }>
@@ -183,6 +195,7 @@ const MessageTemplatesTabContent = ({ settings }: { settings: Settings }) => { <> Date: Fri, 31 Jul 2026 11:34:51 +0200 Subject: [PATCH 8/9] remove duplicate --- .../tabs/MessageTemplatesTab.tsx | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx index 58aaff47cf..e3f3167b38 100644 --- a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx +++ b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx @@ -134,33 +134,29 @@ const MessageTemplatesTabContent = ({ settings }: { settings: Settings }) => {
- {(field) => { - const displayWelcomeMessage = Boolean(field.state.value); - - return ( - - - - - {(field) => ( - - )} - - - - - ); - }} + {(field) => ( + + + + + {(field) => ( + + )} + + + + + )}
From 48f429c90e22b7b5a7bc7ba692e4e90db45e22c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20W=C3=B3jcik?= Date: Fri, 31 Jul 2026 11:42:04 +0200 Subject: [PATCH 9/9] move divider --- web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx index e3f3167b38..300e72c071 100644 --- a/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx +++ b/web/src/pages/EnrollmentPage/tabs/MessageTemplatesTab.tsx @@ -153,8 +153,8 @@ const MessageTemplatesTabContent = ({ settings }: { settings: Settings }) => { /> )} - + )}