mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 21:43:21 +00:00
group-settings: Use new setting for controlling removing members.
This commit is contained in:
@@ -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>;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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(),
|
||||
});
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
|
||||
|
||||
@@ -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 = [
|
||||
{
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
Reference in New Issue
Block a user