group-settings: Use new setting for controlling removing members.

This commit is contained in:
Sahil Batra
2024-11-25 21:16:30 +05:30
committed by Tim Abbott
parent 07f17af267
commit da02135f88
14 changed files with 88 additions and 7 deletions

View File

@@ -925,7 +925,8 @@ export function check_group_property_changed(elem: HTMLElement, group: UserGroup
case "can_join_group":
case "can_leave_group":
case "can_manage_group":
case "can_mention_group": {
case "can_mention_group":
case "can_remove_members_group": {
const pill_widget = get_group_setting_widget(property_name);
assert(pill_widget !== null);
proposed_val = get_group_setting_widget_value(pill_widget);
@@ -1505,6 +1506,7 @@ export const group_setting_widget_map = new Map<string, GroupSettingPillContaine
["can_leave_group", null],
["can_manage_group", null],
["can_mention_group", null],
["can_remove_members_group", null],
["can_remove_subscribers_group", null],
["realm_can_add_custom_emoji_group", null],
["realm_can_create_groups", null],
@@ -1565,6 +1567,7 @@ export const group_setting_name_schema = z.enum([
"can_leave_group",
"can_manage_group",
"can_mention_group",
"can_remove_members_group",
]);
type GroupSettingName = z.infer<typeof group_setting_name_schema>;

View File

@@ -210,6 +210,22 @@ export function can_add_members_to_user_group(group_id: number): boolean {
return can_manage_user_group(group_id);
}
export function can_remove_members_from_user_group(group_id: number): boolean {
const group = user_groups.get_user_group_from_id(group_id);
if (
user_has_permission_for_group_setting(
group.can_remove_members_group,
"can_remove_members_group",
"group",
)
) {
return true;
}
return can_manage_user_group(group_id);
}
export function can_join_user_group(group_id: number): boolean {
const group = user_groups.get_user_group_from_id(group_id);
@@ -227,7 +243,7 @@ export function can_leave_user_group(group_id: number): boolean {
return true;
}
return can_manage_user_group(group_id);
return can_remove_members_from_user_group(group_id);
}
export function user_can_create_user_groups(): boolean {

View File

@@ -144,6 +144,7 @@ export const raw_user_group_schema = z.object({
can_leave_group: group_setting_value_schema,
can_manage_group: group_setting_value_schema,
can_mention_group: group_setting_value_schema,
can_remove_members_group: group_setting_value_schema,
deactivated: z.boolean(),
});

View File

@@ -21,6 +21,7 @@ export type UserGroupUpdateEvent = {
can_leave_group?: number;
can_manage_group?: number;
can_mention_group?: number;
can_remove_members_group?: number;
deactivated?: boolean;
};
};

View File

@@ -34,6 +34,7 @@ export const group_setting_widget_map = new Map<string, GroupSettingPillContaine
["can_leave_group", null],
["can_manage_group", null],
["can_mention_group", null],
["can_remove_members_group", null],
]);
class UserGroupMembershipError {

View File

@@ -654,6 +654,10 @@ export function update_group(event) {
sync_group_permission_setting("can_leave_group", group);
update_group_membership_button(group.id);
}
if (event.data.can_remove_members_group !== undefined) {
sync_group_permission_setting("can_remove_members_group", group);
update_group_management_ui();
}
}
}

View File

@@ -72,7 +72,7 @@ function format_member_list_elem(person: User): string {
user_id: person.user_id,
is_current_user: person.user_id === current_user.user_id,
email: person.delivery_email,
can_remove_subscribers: settings_data.can_manage_user_group(current_group_id),
can_remove_subscribers: settings_data.can_remove_members_from_user_group(current_group_id),
for_user_group_members: true,
img_src: people.small_avatar_url_for_person(person),
});
@@ -82,7 +82,7 @@ function format_subgroup_list_elem(group: UserGroup): string {
return render_user_group_subgroup_entry({
group_id: group.id,
display_value: group.name,
can_edit: settings_data.can_manage_user_group(current_group_id),
can_remove_members: settings_data.can_remove_members_from_user_group(current_group_id),
});
}
@@ -167,7 +167,7 @@ export function rerender_members_list({
}): void {
$parent_container.find(".member-list-box").html(
render_user_group_members_table({
can_edit: settings_data.can_manage_user_group(group.id),
can_remove_members: settings_data.can_remove_members_from_user_group(group.id),
}),
);
member_list_widget = make_list_widget({

View File

@@ -56,6 +56,7 @@ export function add(user_group_raw: UserGroupRaw): UserGroup {
can_leave_group: user_group_raw.can_leave_group,
can_manage_group: user_group_raw.can_manage_group,
can_mention_group: user_group_raw.can_mention_group,
can_remove_members_group: user_group_raw.can_remove_members_group,
deactivated: user_group_raw.deactivated,
};
@@ -129,6 +130,12 @@ export function update(event: UserGroupUpdateEvent): void {
user_group_name_dict.delete(group.name);
user_group_name_dict.set(group.name, group);
}
if (event.data.can_remove_members_group !== undefined) {
group.can_remove_members_group = event.data.can_remove_members_group;
user_group_name_dict.delete(group.name);
user_group_name_dict.set(group.name, group);
}
}
export function get_user_group_from_name(name: string): UserGroup | undefined {

View File

@@ -13,6 +13,11 @@
label=(t 'Who can add members to this group')
prefix=prefix }}
{{> ../settings/group_setting_value_pill_input
setting_name="can_remove_members_group"
label=(t 'Who can remove members from this group')
prefix=prefix }}
{{> ../settings/group_setting_value_pill_input
setting_name="can_join_group"
label=(t 'Who can join this group')

View File

@@ -4,7 +4,7 @@
<thead class="table-sticky-headers">
<th data-sort="name">{{t "Name" }}</th>
<th class="settings-email-column" data-sort="email">{{t "Email" }}</th>
<th class="user-remove-actions" {{#unless can_edit}}style="display:none"{{/unless}}>{{t "Actions" }}</th>
<th class="user-remove-actions" {{#unless can_remove_members}}style="display:none"{{/unless}}>{{t "Actions" }}</th>
</thead>
<tbody class="member_table" data-empty="{{t 'This group has no members.' }}" data-search-results-empty="{{t 'No group members match your current filter.'}}"></tbody>
</table>

View File

@@ -2,7 +2,7 @@
<td class="subgroup-name panel_user_list" colspan="2">
{{> ../user_group_display_only_pill .}}
</td>
{{#if can_edit}}
{{#if can_remove_members}}
<td class="remove">
<div class="subgroup_list_remove">
<form class="remove-subgroup-form">

View File

@@ -453,6 +453,7 @@ const hamletcharacters = user_group_item({
can_leave_group: 2,
can_manage_group: 2,
can_mention_group: 2,
can_remove_members_group: 2,
deactivated: false,
});
@@ -470,6 +471,7 @@ const backend = user_group_item({
can_leave_group: 2,
can_manage_group: 1,
can_mention_group: 1,
can_remove_members_group: 2,
deactivated: false,
});
@@ -487,6 +489,7 @@ const call_center = user_group_item({
can_leave_group: 2,
can_manage_group: 2,
can_mention_group: 2,
can_remove_members_group: 2,
deactivated: false,
});

View File

@@ -44,6 +44,7 @@ const admins = {
can_join_group: 4,
can_manage_group: 4,
can_mention_group: 1,
can_remove_members_group: 4,
};
const moderators = {
description: "Moderators",
@@ -57,6 +58,7 @@ const moderators = {
can_leave_group: 4,
can_manage_group: 4,
can_mention_group: 1,
can_remove_members_group: 4,
};
const members = {
description: "Members",
@@ -70,6 +72,7 @@ const members = {
can_leave_group: 4,
can_manage_group: 4,
can_mention_group: 4,
can_remove_members_group: 4,
};
const nobody = {
description: "Nobody",
@@ -83,6 +86,7 @@ const nobody = {
can_leave_group: 4,
can_manage_group: 4,
can_mention_group: 2,
can_remove_members_group: 4,
};
const students = {
description: "Students group",
@@ -99,6 +103,7 @@ const students = {
direct_subgroups: [],
},
can_mention_group: 3,
can_remove_members_group: 1,
creator_id: 4,
};
@@ -499,6 +504,31 @@ run_test("can_leave_user_group", ({override}) => {
"can_leave_group",
settings_data.can_leave_user_group,
);
// User can leave the group if they have permission to remove
// others from the group.
override(realm, "realm_can_manage_all_groups", nobody.id);
const event = {
group_id: students.id,
data: {
can_manage_group: nobody.id,
can_leave_group: nobody.id,
can_remove_members_group: {
direct_members: [5],
direct_subgroups: [admins.id],
},
},
};
user_groups.update(event);
override(current_user, "user_id", 2);
assert.ok(!settings_data.can_leave_user_group(students.id));
override(current_user, "user_id", 5);
assert.ok(settings_data.can_leave_user_group(students.id));
override(current_user, "user_id", 1);
assert.ok(settings_data.can_leave_user_group(students.id));
});
run_test("can_add_members_user_group", ({override}) => {
@@ -509,6 +539,14 @@ run_test("can_add_members_user_group", ({override}) => {
);
});
run_test("can_remove_members_user_group", ({override}) => {
test_user_group_permission_setting(
override,
"can_remove_members_group",
settings_data.can_remove_members_from_user_group,
);
});
run_test("type_id_to_string", () => {
page_params.bot_types = [
{

View File

@@ -27,6 +27,7 @@ run_test("user_groups", () => {
can_leave_group: 1,
can_manage_group: 1,
can_mention_group: 2,
can_remove_members_group: 1,
deactivated: false,
};
@@ -52,6 +53,7 @@ run_test("user_groups", () => {
can_leave_group: 1,
can_manage_group: 1,
can_mention_group: 2,
can_remove_members_group: 1,
deactivated: false,
};
const all = {