stream_settings: Add new topics_policy setting.

Added `topics_policy` channel setting to configure sending
messages in the empty topic.

Fixes #33549.
This commit is contained in:
Vector73
2025-06-17 03:22:36 +00:00
committed by Tim Abbott
parent 92672c1339
commit 6094bbe8a5
50 changed files with 819 additions and 121 deletions

View File

@@ -126,6 +126,7 @@ const social = {
name: "social",
subscribed: true,
can_send_message_group: 2,
topics_policy: "inherit",
};
stream_data.add_sub(social);

View File

@@ -12,15 +12,6 @@ mock_jquery((selector) => {
val() {
return "lunch";
},
is(arg) {
switch (arg) {
case ":focus":
return true;
/* istanbul ignore next */
default:
throw new Error(`Unknown arg ${arg}`);
}
},
};
/* istanbul ignore next */
default:

View File

@@ -1296,6 +1296,14 @@ run_test("get_focus_area", ({override}) => {
get_focus_area({message_type: "stream"}),
"#compose_select_recipient_widget_wrapper",
);
stream_data.add_sub({
message_type: "stream",
name: "fun",
stream_id: 4,
topics_policy: "inherit",
});
override(realm, "realm_topics_policy", "disable_empty_topic");
assert.equal(
get_focus_area({message_type: "stream", stream_name: "fun", stream_id: 4}),

View File

@@ -347,7 +347,6 @@ test_ui("validate", ({mock_template, override}) => {
let missing_topic_error_rendered = false;
mock_template("compose_banner/compose_banner.hbs", false, (data) => {
assert.equal(data.classname, compose_banner.CLASSNAMES.topic_missing);
assert.equal(data.banner_text, compose_validate.TOPICS_REQUIRED_ERROR_MESSAGE);
missing_topic_error_rendered = true;
return "<banner-stub>";
});
@@ -412,6 +411,7 @@ test_ui("validate_stream_message", ({override, override_rewire, mock_template})
name: "special",
subscribed: true,
can_send_message_group: everyone.id,
topics_policy: "inherit",
};
stream_data.add_sub(special_sub);

View File

@@ -54,6 +54,7 @@ exports.test_streams = {
is_web_public: false,
message_retention_days: null,
stream_post_policy: 1,
topics_policy: "inherit",
can_administer_channel_group: 2,
can_send_message_group: 2,
can_remove_subscribers_group: 2,
@@ -74,6 +75,7 @@ exports.test_streams = {
is_announcement_only: false,
message_retention_days: null,
stream_post_policy: 1,
topics_policy: "inherit",
can_administer_channel_group: 2,
can_send_message_group: 2,
can_remove_subscribers_group: 2,

View File

@@ -800,7 +800,7 @@ run_test("narrow_to_compose_target streams", ({override, override_rewire}) => {
compose_state.set_message_type("stream");
const rome_id = 99;
stream_data.add_sub({name: "ROME", stream_id: rome_id});
stream_data.add_sub({name: "ROME", stream_id: rome_id, topics_policy: "inherit"});
compose_state.set_stream_id(99);
// Test with existing topic

View File

@@ -205,11 +205,6 @@ test_realm_group_settings(
settings_data.can_subscribe_others_to_all_accessible_streams,
);
test_realm_group_settings(
"realm_can_set_topics_policy_group",
settings_data.user_can_set_topics_policy,
);
test_realm_group_settings(
"realm_can_delete_any_message_group",
settings_data.user_can_delete_any_message,

View File

@@ -829,6 +829,7 @@ test("stream_settings", ({override}) => {
history_public_to_subscribers: false,
});
stream_data.update_message_retention_setting(sub, -1);
stream_data.update_topics_policy_setting(sub, "allow_topics_policy");
stream_data.update_stream_permission_group_setting(
"can_remove_subscribers_group",
sub,
@@ -843,6 +844,7 @@ test("stream_settings", ({override}) => {
assert.equal(sub.invite_only, false);
assert.equal(sub.history_public_to_subscribers, false);
assert.equal(sub.message_retention_days, -1);
assert.equal(sub.topics_policy, "allow_topics_policy");
assert.equal(sub.can_remove_subscribers_group, moderators_group.id);
assert.equal(sub.can_administer_channel_group, moderators_group.id);
assert.equal(sub.folder_id, 3);
@@ -1649,6 +1651,41 @@ test("can_subscribe_others", ({override}) => {
assert.equal(stream_data.can_subscribe_others(sub), false);
});
test("user_can_set_topics_policy", ({override}) => {
const sub = {
name: "Denmark",
subscribed: true,
color: "red",
stream_id: 1,
can_add_subscribers_group: admins_group.id,
can_administer_channel_group: nobody_group.id,
can_remove_subscribers_group: admins_group.id,
};
stream_data.add_sub(sub);
override(realm, "realm_can_set_topics_policy_group", nobody_group.id);
// Admins can always change per-channel topics policy.
initialize_and_override_current_user(admin_user_id, override);
override(current_user, "is_admin", true);
assert.equal(stream_data.user_can_set_topics_policy(sub), true);
initialize_and_override_current_user(moderator_user_id, override);
override(current_user, "is_admin", false);
assert.equal(stream_data.user_can_set_topics_policy(sub), false);
// Not allowed as user not in can_administer_channel_group.
override(realm, "realm_can_set_topics_policy_group", everyone_group.id);
assert.equal(stream_data.user_can_set_topics_policy(sub), false);
sub.can_administer_channel_group = moderators_group.id;
assert.equal(stream_data.user_can_set_topics_policy(sub), true);
// Only realm_can_set_topics_policy_group is checked if sub is not provided.
assert.equal(stream_data.user_can_set_topics_policy(), true);
override(realm, "realm_can_set_topics_policy_group", nobody_group.id);
assert.equal(stream_data.user_can_set_topics_policy(sub), false);
});
test("options for dropdown widget", () => {
const denmark = {
subscribed: true,

View File

@@ -278,6 +278,19 @@ test("update_property", ({override}) => {
assert.equal(args.val, 20);
}
// Test stream topics_policy change event
{
const stub = make_stub();
override(stream_settings_ui, "update_topics_policy_setting", stub.f);
override(compose_recipient, "update_topic_inputbox_on_topics_policy_change", noop);
override(compose_recipient, "update_compose_area_placeholder_text", noop);
stream_events.update_property(stream_id, "topics_policy", "allow_topics_policy");
assert.equal(stub.num_calls, 1);
const args = stub.get_args("sub", "val");
assert.equal(args.sub.stream_id, stream_id);
assert.equal(args.val, "allow_topics_policy");
}
// Test stream can_remove_subscribers_group change event
{
const stub = make_stub();