diff --git a/web/src/stream_data.ts b/web/src/stream_data.ts index 96b6621d8d..94e5690199 100644 --- a/web/src/stream_data.ts +++ b/web/src/stream_data.ts @@ -1062,3 +1062,21 @@ export function get_options_for_dropdown_widget(): (dropdown_widget.Option & { })) .sort((a, b) => util.strcmp(a.name.toLowerCase(), b.name.toLowerCase())); } + +export function get_streams_for_move_messages_widget(): (dropdown_widget.Option & { + stream: StreamSubscription; +})[] { + return get_unsorted_subs_with_content_access() + .filter((stream) => !stream.is_archived) + .sort((a, b) => { + if (a.subscribed !== b.subscribed) { + return a.subscribed ? -1 : 1; + } + return util.strcmp(a.name.toLowerCase(), b.name.toLowerCase()); + }) + .map((stream) => ({ + name: stream.name, + unique_id: stream.stream_id, + stream, + })); +} diff --git a/web/src/stream_popover.ts b/web/src/stream_popover.ts index 6251e20a2f..4305737b16 100644 --- a/web/src/stream_popover.ts +++ b/web/src/stream_popover.ts @@ -866,7 +866,7 @@ export async function build_move_topic_to_stream_popover( stream_widget_value = current_stream_id; const streams_list_options = (): dropdown_widget.Option[] => - stream_data.get_options_for_dropdown_widget().filter(({stream}) => { + stream_data.get_streams_for_move_messages_widget().filter(({stream}) => { if (stream.stream_id === current_stream_id) { return true; } diff --git a/web/tests/stream_data.test.cjs b/web/tests/stream_data.test.cjs index f2d203231a..7bf511a162 100644 --- a/web/tests/stream_data.test.cjs +++ b/web/tests/stream_data.test.cjs @@ -139,6 +139,9 @@ test("basics", () => { is_muted: true, invite_only: true, history_public_to_subscribers: true, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }; const social = { subscribed: true, @@ -148,6 +151,9 @@ test("basics", () => { is_muted: false, invite_only: true, history_public_to_subscribers: false, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }; const test = { subscribed: true, @@ -156,6 +162,9 @@ test("basics", () => { stream_id: 3, is_muted: true, invite_only: false, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }; const web_public_stream = { subscribed: false, @@ -166,6 +175,9 @@ test("basics", () => { invite_only: false, history_public_to_subscribers: true, is_web_public: true, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }; stream_data.add_sub(denmark); stream_data.add_sub(social); @@ -249,6 +261,14 @@ test("basics", () => { const stream_starting_with_25 = { name: "25-or-6-to-4", stream_id: 400, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + subscribed: false, + is_muted: false, + invite_only: false, + history_public_to_subscribers: true, + is_web_public: false, }; stream_data.add_sub(stream_starting_with_25); assert.equal(stream_data.slug_to_stream_id("25-or-6-to-4"), 400); @@ -263,6 +283,9 @@ test("basics", () => { const stream_99 = { name: "99", stream_id: 401, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }; stream_data.add_sub(stream_99); assert.equal(stream_data.slug_to_stream_id("99"), 401); @@ -272,6 +295,9 @@ test("basics", () => { const stream_id_99 = { name: "Some Stream", stream_id: 99, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }; stream_data.add_sub(stream_id_99); assert.equal(stream_data.slug_to_stream_id("99"), 99); @@ -293,6 +319,9 @@ test("basics", () => { name: "social", stream_id: 2, subscribed: true, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }, unique_id: 2, }, @@ -305,11 +334,103 @@ test("basics", () => { name: "test", stream_id: 3, subscribed: true, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }, unique_id: 3, }, ]); + assert.deepEqual(stream_data.get_streams_for_move_messages_widget(), [ + { + name: "social", + stream: { + color: "red", + history_public_to_subscribers: false, + invite_only: true, + is_muted: false, + name: "social", + stream_id: 2, + subscribed: true, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 2, + }, + { + name: "test", + stream: { + color: "yellow", + invite_only: false, + is_muted: true, + name: "test", + stream_id: 3, + subscribed: true, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 3, + }, + { + name: "25-or-6-to-4", + stream: { + history_public_to_subscribers: true, + invite_only: false, + is_muted: false, + is_web_public: false, + name: "25-or-6-to-4", + stream_id: 400, + subscribed: false, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 400, + }, + { + name: "web_public_stream", + stream: { + name: "web_public_stream", + stream_id: 4, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + color: "yellow", + history_public_to_subscribers: true, + invite_only: false, + is_muted: false, + is_web_public: true, + subscribed: false, + }, + unique_id: 4, + }, + { + name: "99", + stream: { + name: "99", + stream_id: 401, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 401, + }, + { + name: "Some Stream", + stream: { + name: "Some Stream", + stream_id: 99, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 99, + }, + ]); + test.is_archived = true; assert.deepEqual(stream_data.get_options_for_dropdown_widget(), [ { @@ -322,10 +443,77 @@ test("basics", () => { name: "social", stream_id: 2, subscribed: true, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, }, unique_id: 2, }, ]); + + social.invite_only = true; + social.can_subscribe_group = me_group.id; + social.subscribed = false; + + stream_starting_with_25.invite_only = true; + + assert.deepEqual(stream_data.get_streams_for_move_messages_widget(), [ + { + name: "social", + stream: { + color: "red", + history_public_to_subscribers: false, + invite_only: true, + is_muted: false, + name: "social", + stream_id: 2, + subscribed: false, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: me_group.id, + }, + unique_id: 2, + }, + { + name: "web_public_stream", + stream: { + color: "yellow", + history_public_to_subscribers: true, + invite_only: false, + is_muted: false, + is_web_public: true, + name: "web_public_stream", + stream_id: 4, + subscribed: false, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 4, + }, + { + name: "99", + stream: { + name: "99", + stream_id: 401, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 401, + }, + { + name: "Some Stream", + stream: { + name: "Some Stream", + stream_id: 99, + can_add_subscribers_group: admins_group.id, + can_administer_channel_group: admins_group.id, + can_subscribe_group: admins_group.id, + }, + unique_id: 99, + }, + ]); }); test("get_streams_for_user", ({override}) => {