diff --git a/api_docs/changelog.md b/api_docs/changelog.md
index d5cd7fcbf7..e212931c28 100644
--- a/api_docs/changelog.md
+++ b/api_docs/changelog.md
@@ -20,6 +20,14 @@ format used by the Zulip server that they are interacting with.
## Changes in Zulip 9.0
+**Feature level 269**
+
+* [`POST /register`](/api/register-queue), [`PATCH
+ /settings`](/api/update-settings), [`PATCH
+ /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults):
+ Added new user setting `web_channel_default_view`, controlling the
+ behavior of clicking a channel link in the web/desktop apps.
+
**Feature level 268**
* [`PATCH /realm/user_settings_defaults`](/api/update-realm-user-settings-defaults),
diff --git a/version.py b/version.py
index c6afe0f585..07ca1c5f74 100644
--- a/version.py
+++ b/version.py
@@ -33,7 +33,7 @@ DESKTOP_WARNING_VERSION = "5.9.3"
# Changes should be accompanied by documentation explaining what the
# new level means in api_docs/changelog.md, as well as "**Changes**"
# entries in the endpoint's documentation in `zulip.yaml`.
-API_FEATURE_LEVEL = 268
+API_FEATURE_LEVEL = 269
# Bump the minor PROVISION_VERSION to indicate that folks should provision
# only when going from an old version of the code to a newer version. Bump
diff --git a/web/src/admin.js b/web/src/admin.js
index dfd1ec54fa..46f9937704 100644
--- a/web/src/admin.js
+++ b/web/src/admin.js
@@ -188,6 +188,7 @@ export function build_page() {
demote_inactive_streams_values: settings_config.demote_inactive_streams_values,
web_mark_read_on_scroll_policy_values:
settings_config.web_mark_read_on_scroll_policy_values,
+ web_channel_default_view_values: settings_config.web_channel_default_view_values,
user_list_style_values: settings_config.user_list_style_values,
web_stream_unreads_count_display_policy_values:
settings_config.web_stream_unreads_count_display_policy_values,
diff --git a/web/src/realm_user_settings_defaults.ts b/web/src/realm_user_settings_defaults.ts
index 166c18192a..e67562501b 100644
--- a/web/src/realm_user_settings_defaults.ts
+++ b/web/src/realm_user_settings_defaults.ts
@@ -52,6 +52,7 @@ export const realm_default_settings_schema = z.object({
translate_emoticons: z.boolean(),
twenty_four_hour_time: z.boolean(),
user_list_style: z.number(),
+ web_channel_default_view: z.number(),
web_escape_navigates_to_home_view: z.boolean(),
web_font_size_px: z.number(),
web_home_view: z.string(),
diff --git a/web/src/server_events_dispatch.js b/web/src/server_events_dispatch.js
index 2a341c7778..5e91a0085e 100644
--- a/web/src/server_events_dispatch.js
+++ b/web/src/server_events_dispatch.js
@@ -704,6 +704,7 @@ export function dispatch_normal_event(event) {
"demote_inactive_streams",
"dense_mode",
"web_mark_read_on_scroll_policy",
+ "web_channel_default_view",
"emojiset",
"web_escape_navigates_to_home_view",
"fluid_layout_width",
diff --git a/web/src/settings.js b/web/src/settings.js
index 8fdd7427c8..a4456be908 100644
--- a/web/src/settings.js
+++ b/web/src/settings.js
@@ -103,6 +103,7 @@ export function build_page() {
demote_inactive_streams_values: settings_config.demote_inactive_streams_values,
web_mark_read_on_scroll_policy_values:
settings_config.web_mark_read_on_scroll_policy_values,
+ web_channel_default_view_values: settings_config.web_channel_default_view_values,
user_list_style_values: settings_config.user_list_style_values,
web_stream_unreads_count_display_policy_values:
settings_config.web_stream_unreads_count_display_policy_values,
diff --git a/web/src/settings_config.ts b/web/src/settings_config.ts
index 82400c641e..76589bba21 100644
--- a/web/src/settings_config.ts
+++ b/web/src/settings_config.ts
@@ -57,6 +57,17 @@ export const web_mark_read_on_scroll_policy_values = {
},
};
+export const web_channel_default_view_values = {
+ top_topic_in_channel: {
+ code: 1,
+ description: $t({defaultMessage: "Top topic in the channel"}),
+ },
+ channel_feed: {
+ code: 2,
+ description: $t({defaultMessage: "Channel feed"}),
+ },
+};
+
export const user_list_style_values = {
compact: {
code: 1,
diff --git a/web/src/settings_preferences.ts b/web/src/settings_preferences.ts
index 99a4f0f710..ee20f45c17 100644
--- a/web/src/settings_preferences.ts
+++ b/web/src/settings_preferences.ts
@@ -208,6 +208,9 @@ export function set_up(settings_panel: SettingsPanel): void {
$container
.find(".setting_web_mark_read_on_scroll_policy")
.val(settings_object.web_mark_read_on_scroll_policy);
+ $container
+ .find(".setting_web_channel_default_view")
+ .val(settings_object.web_channel_default_view);
$container
.find(`.setting_emojiset_choice[value="${CSS.escape(settings_object.emojiset)}"]`)
.prop("checked", true);
diff --git a/web/src/user_settings.ts b/web/src/user_settings.ts
index 7158240b58..4e5a8b755e 100644
--- a/web/src/user_settings.ts
+++ b/web/src/user_settings.ts
@@ -71,6 +71,7 @@ export const user_settings_schema = stream_notification_settings_schema
translate_emoticons: z.boolean(),
twenty_four_hour_time: z.boolean(),
user_list_style: z.number(),
+ web_channel_default_view: z.number(),
web_escape_navigates_to_home_view: z.boolean(),
web_font_size_px: z.number(),
web_home_view: z.enum(["inbox", "recent_topics", "all_messages"]),
diff --git a/web/templates/settings/display_settings.hbs b/web/templates/settings/display_settings.hbs
index 27b9e07d01..f6492e4cce 100644
--- a/web/templates/settings/display_settings.hbs
+++ b/web/templates/settings/display_settings.hbs
@@ -145,6 +145,13 @@
label=settings_label.web_navigate_to_sent_message
prefix=prefix}}
+
+
+
+
+