user-groups: Live update membership status text.

This commit adds code to live update the membership status text
when a user is added or removed from a group that is subgroup
of the group opened in the right panel of groups UI.
This commit is contained in:
Sahil Batra
2024-12-02 16:10:50 +05:30
committed by Tim Abbott
parent ded36004bb
commit cbada036a9
3 changed files with 97 additions and 1 deletions

View File

@@ -344,6 +344,38 @@ export function handle_subgroup_edit_event(group_id, direct_subgroup_ids) {
} }
} }
function update_status_text_on_member_update(updated_group) {
const active_group_id = get_active_data().id;
if (active_group_id === undefined) {
return;
}
if (updated_group.id === active_group_id) {
update_membership_status_text(updated_group);
return;
}
// We might need to update the text if the updated groups is
// one of the subgroups of the group opened in right panel.
const current_user_id = people.my_current_user_id();
if (user_groups.is_direct_member_of(current_user_id, active_group_id)) {
// Since user is already a direct member of the group opened
// in right panel, the text shown will remain the same.
return;
}
const is_updated_group_subgroup = user_groups.is_subgroup_of_target_group(
active_group_id,
updated_group.id,
);
if (!is_updated_group_subgroup) {
return;
}
const active_group = user_groups.get_user_group_from_id(active_group_id);
update_membership_status_text(active_group);
}
function update_settings_for_group_overlay(group_id, user_ids) { function update_settings_for_group_overlay(group_id, user_ids) {
const group = user_groups.get_user_group_from_id(group_id); const group = user_groups.get_user_group_from_id(group_id);
@@ -351,7 +383,6 @@ function update_settings_for_group_overlay(group_id, user_ids) {
if (is_editing_group(group_id)) { if (is_editing_group(group_id)) {
if (user_ids.includes(people.my_current_user_id())) { if (user_ids.includes(people.my_current_user_id())) {
update_group_management_ui(); update_group_management_ui();
update_membership_status_text(group);
} else { } else {
user_group_edit_members.update_member_list_widget(group); user_group_edit_members.update_member_list_widget(group);
} }
@@ -360,6 +391,12 @@ function update_settings_for_group_overlay(group_id, user_ids) {
if (user_ids.includes(people.my_current_user_id())) { if (user_ids.includes(people.my_current_user_id())) {
update_your_groups_list_if_needed(group_id); update_your_groups_list_if_needed(group_id);
update_display_checkmark_on_group_edit(group); update_display_checkmark_on_group_edit(group);
// Membership status text can be updated even when user was
// added to a group which is not opened in the right panel as
// membership can be impacted if the updated group is a
// subgroup of the group opened in right panel.
update_status_text_on_member_update(group);
} }
} }

View File

@@ -317,6 +317,21 @@ export function get_recursive_subgroups(target_user_group: UserGroup): Set<numbe
return subgroup_ids; return subgroup_ids;
} }
export function is_subgroup_of_target_group(target_group_id: number, subgroup_id: number): boolean {
const target_user_group = get_user_group_from_id(target_group_id);
const direct_subgroup_ids = new Set(target_user_group.direct_subgroup_ids);
if (direct_subgroup_ids.has(subgroup_id)) {
return true;
}
const recursive_subgroup_ids = get_recursive_subgroups(target_user_group);
if (recursive_subgroup_ids === undefined) {
return false;
}
return recursive_subgroup_ids.has(subgroup_id);
}
export function get_recursive_group_members(target_user_group: UserGroup): Set<number> { export function get_recursive_group_members(target_user_group: UserGroup): Set<number> {
const members = new Set(target_user_group.members); const members = new Set(target_user_group.members);
const subgroup_ids = get_recursive_subgroups(target_user_group); const subgroup_ids = get_recursive_subgroups(target_user_group);

View File

@@ -706,3 +706,47 @@ run_test("get_potential_subgroups", () => {
assert.deepEqual(get_potential_subgroup_ids(students.id), [admins.id, teachers.id, science.id]); assert.deepEqual(get_potential_subgroup_ids(students.id), [admins.id, teachers.id, science.id]);
assert.deepEqual(get_potential_subgroup_ids(science.id), [students.id]); assert.deepEqual(get_potential_subgroup_ids(science.id), [students.id]);
}); });
run_test("is_subgroup_of_target_group", () => {
const admins = {
name: "Administrators",
id: 1,
members: new Set([1]),
is_system_group: false,
direct_subgroup_ids: new Set([]),
};
const moderators = {
name: "Moderators",
id: 2,
members: new Set([2]),
is_system_group: false,
direct_subgroup_ids: new Set([1]),
};
const all = {
name: "Everyone",
id: 3,
members: new Set([3, 4]),
is_system_group: false,
direct_subgroup_ids: new Set([2, 4]),
};
const students = {
name: "Students",
id: 4,
members: new Set([5]),
is_system_group: false,
direct_subgroup_ids: new Set([]),
};
user_groups.initialize({
realm_user_groups: [admins, moderators, all, students],
});
assert.ok(user_groups.is_subgroup_of_target_group(moderators.id, admins.id));
assert.ok(!user_groups.is_subgroup_of_target_group(admins.id, moderators.id));
assert.ok(user_groups.is_subgroup_of_target_group(all.id, admins.id));
assert.ok(user_groups.is_subgroup_of_target_group(all.id, moderators.id));
assert.ok(user_groups.is_subgroup_of_target_group(all.id, students.id));
assert.ok(!user_groups.is_subgroup_of_target_group(students.id, all.id));
});