user_group: List groups that a user is associated via subgroups.

In `Group settings` -> `Your groups` and `User Profile Popover` -> `User
groups`, we only listed groups that a user was a direct member of. Now,
we will also list groups that a user is not a direct member of, but
associated via a subgroup.
Fixes #32486.
This commit is contained in:
Shubham Padia
2024-11-26 07:00:15 +00:00
committed by Tim Abbott
parent c49c7a534f
commit 8a28b31be3
3 changed files with 31 additions and 11 deletions

View File

@@ -679,7 +679,7 @@ export function change_state(section, left_side_tab, right_side_tab) {
if (left_side_tab === undefined) {
left_side_tab = "all-groups";
if (user_groups.is_direct_member_of(current_user.user_id, group_id)) {
if (user_groups.is_user_in_group(group_id, current_user.user_id)) {
left_side_tab = "your-groups";
}
}
@@ -889,10 +889,7 @@ export function setup_page(callback) {
name: "user-groups-overlay",
get_item: ListWidget.default_get_item,
modifier_html(item) {
item.is_member = user_groups.is_direct_member_of(
people.my_current_user_id(),
item.id,
);
item.is_member = user_groups.is_user_in_group(item.id, people.my_current_user_id());
item.can_join = settings_data.can_join_user_group(item.id);
item.can_leave = settings_data.can_leave_user_group(item.id);
return render_browse_user_groups_list_item(item);

View File

@@ -293,9 +293,7 @@ export function is_setting_group_empty(setting_group: GroupSettingValue): boolea
export function get_user_groups_of_user(user_id: number): UserGroup[] {
const user_groups_realm = get_realm_user_groups();
const groups_of_user = user_groups_realm.filter((group) =>
is_direct_member_of(user_id, group.id),
);
const groups_of_user = user_groups_realm.filter((group) => is_user_in_group(group.id, user_id));
return groups_of_user;
}

View File

@@ -12,6 +12,19 @@ const {set_realm} = zrequire("state_data");
const realm = {};
set_realm(realm);
const get_test_subgroup = (id) => ({
name: `Subgroup id: ${id} `,
id,
members: new Set([4]),
is_system_group: false,
direct_subgroup_ids: new Set([]),
can_join_group: 1,
can_leave_group: 1,
can_manage_group: 1,
can_mention_group: 1,
deactivated: false,
});
run_test("user_groups", () => {
const students = {
description: "Students group",
@@ -32,9 +45,15 @@ run_test("user_groups", () => {
};
const params = {};
params.realm_user_groups = [students];
params.realm_user_groups = [
students,
get_test_subgroup(4),
get_test_subgroup(5),
get_test_subgroup(6),
];
const user_id_not_in_any_group = 0;
const user_id_part_of_a_group = 2;
const user_id_associated_via_subgroup = 4;
user_groups.initialize(params);
assert.deepEqual(user_groups.get_user_group_from_id(students.id), students);
@@ -122,12 +141,12 @@ run_test("user_groups", () => {
user_groups.add(all);
user_groups.add(deactivated_group);
const user_groups_array = user_groups.get_realm_user_groups();
assert.equal(user_groups_array.length, 2);
assert.equal(user_groups_array.length, 5);
assert.equal(user_groups_array[1].name, "Everyone");
assert.equal(user_groups_array[0].name, "new admins");
const all_user_groups_array = user_groups.get_realm_user_groups(true);
assert.equal(all_user_groups_array.length, 3);
assert.equal(all_user_groups_array.length, 6);
assert.equal(all_user_groups_array[2].name, "Deactivated test group");
assert.equal(all_user_groups_array[1].name, "Everyone");
assert.equal(all_user_groups_array[0].name, "new admins");
@@ -136,6 +155,12 @@ run_test("user_groups", () => {
assert.equal(groups_of_users.length, 1);
assert.equal(groups_of_users[0].name, "Everyone");
const groups_of_users_via_subgroup = user_groups.get_user_groups_of_user(
user_id_associated_via_subgroup,
);
assert.deepEqual(groups_of_users_via_subgroup.map((group) => group.id).sort(), [2, 4, 5, 6]);
assert.equal(groups_of_users_via_subgroup.length, 4);
const groups_of_users_nomatch = user_groups.get_user_groups_of_user(user_id_not_in_any_group);
assert.equal(groups_of_users_nomatch.length, 0);