user_groups: Add helper functions to get options for group-based setting.

This commit adds get_realm_user_groups_for_dropdown_list_widget function
which returns the list of objects containing the display name and id
of system user groups and adds tests for this function.
This commit is contained in:
Sahil Batra
2023-01-09 16:34:10 +05:30
committed by Tim Abbott
parent 73a378d23f
commit 37964b1ccc
3 changed files with 185 additions and 0 deletions

View File

@@ -242,3 +242,123 @@ run_test("is_user_in_group", () => {
blueslip.expect("error", "Could not find subgroup with ID 9999");
assert.equal(user_groups.is_user_in_group(admins.id, 6), false);
});
run_test("get_realm_user_groups_for_dropdown_list_widget", () => {
const owners = {
name: "@role:owners",
description: "foo",
id: 1,
members: new Set([1]),
is_system_group: true,
direct_subgroup_ids: new Set([]),
};
const admins = {
name: "@role:administrators",
description: "foo",
id: 2,
members: new Set([2]),
is_system_group: true,
direct_subgroup_ids: new Set([1]),
};
const moderators = {
name: "@role:moderators",
description: "foo",
id: 3,
members: new Set([3]),
is_system_group: true,
direct_subgroup_ids: new Set([2]),
};
const members = {
name: "@role:members",
description: "foo",
id: 4,
members: new Set([4]),
is_system_group: true,
direct_subgroup_ids: new Set([6]),
};
const everyone = {
name: "@role:everyone",
description: "foo",
id: 5,
members: new Set([]),
is_system_group: true,
direct_subgroup_ids: new Set([4]),
};
const full_members = {
name: "@role:fullmembers",
description: "foo",
id: 6,
members: new Set([5]),
is_system_group: true,
direct_subgroup_ids: new Set([3]),
};
const internet = {
name: "@role:internet",
id: 7,
members: new Set([]),
is_system_group: true,
direct_subgroup_ids: new Set([5]),
};
assert.throws(() => user_groups.get_realm_user_groups_for_dropdown_list_widget(false, false), {
name: "Error",
message: "Unknown group name: @role:internet",
});
let expected_groups_list = [
{name: "translated: Admins, moderators, members and guests", value: "5"},
{name: "translated: Admins, moderators and members", value: "4"},
{name: "translated: Admins, moderators and full members", value: "6"},
{name: "translated: Admins and moderators", value: "3"},
{name: "translated: Admins", value: "2"},
{name: "translated: Owners", value: "1"},
];
user_groups.initialize({
realm_user_groups: [owners, admins, moderators, members, everyone, full_members, internet],
});
assert.deepEqual(
user_groups.get_realm_user_groups_for_dropdown_list_widget(true, false),
expected_groups_list,
);
expected_groups_list = [
{name: "translated: Everyone on the internet", value: "7"},
{name: "translated: Admins, moderators, members and guests", value: "5"},
{name: "translated: Admins, moderators and members", value: "4"},
{name: "translated: Admins, moderators and full members", value: "6"},
{name: "translated: Admins and moderators", value: "3"},
{name: "translated: Admins", value: "2"},
];
assert.deepEqual(
user_groups.get_realm_user_groups_for_dropdown_list_widget(false, true),
expected_groups_list,
);
expected_groups_list = [
{name: "translated: Admins, moderators, members and guests", value: "5"},
{name: "translated: Admins, moderators and members", value: "4"},
{name: "translated: Admins, moderators and full members", value: "6"},
{name: "translated: Admins and moderators", value: "3"},
{name: "translated: Admins", value: "2"},
];
assert.deepEqual(
user_groups.get_realm_user_groups_for_dropdown_list_widget(true, true),
expected_groups_list,
);
expected_groups_list = [
{name: "translated: Everyone on the internet", value: "7"},
{name: "translated: Admins, moderators, members and guests", value: "5"},
{name: "translated: Admins, moderators and members", value: "4"},
{name: "translated: Admins, moderators and full members", value: "6"},
{name: "translated: Admins and moderators", value: "3"},
{name: "translated: Admins", value: "2"},
{name: "translated: Owners", value: "1"},
];
assert.deepEqual(
user_groups.get_realm_user_groups_for_dropdown_list_widget(false, false),
expected_groups_list,
);
});

View File

@@ -801,3 +801,34 @@ export const desktop_icon_count_display_values = {
description: $t({defaultMessage: "None"}),
},
};
export const system_user_groups_list = [
{
name: "@role:internet",
display_name: $t({defaultMessage: "Everyone on the internet"}),
},
{
name: "@role:everyone",
display_name: $t({defaultMessage: "Admins, moderators, members and guests"}),
},
{
name: "@role:members",
display_name: $t({defaultMessage: "Admins, moderators and members"}),
},
{
name: "@role:fullmembers",
display_name: $t({defaultMessage: "Admins, moderators and full members"}),
},
{
name: "@role:moderators",
display_name: $t({defaultMessage: "Admins and moderators"}),
},
{
name: "@role:administrators",
display_name: $t({defaultMessage: "Admins"}),
},
{
name: "@role:owners",
display_name: $t({defaultMessage: "Owners"}),
},
];

View File

@@ -1,5 +1,6 @@
import * as blueslip from "./blueslip";
import {FoldDict} from "./fold_dict";
import * as settings_config from "./settings_config";
import type {User, UserGroupUpdateEvent} from "./types";
type UserGroup = {
@@ -15,6 +16,11 @@ type UserGroup = {
// to a Set in the initialize function.
type UserGroupRaw = Omit<UserGroup, "members"> & {members: number[]};
type UserGroupForDropdownListWidget = {
name: string;
value: string;
};
let user_group_name_dict: FoldDict<UserGroup>;
let user_group_by_id_dict: Map<number, UserGroup>;
@@ -195,3 +201,31 @@ export function is_user_in_group(user_group_id: number, user_id: number): boolea
}
return false;
}
export function get_realm_user_groups_for_dropdown_list_widget(
exclude_internet_group: boolean,
exclude_owners_group: boolean,
): UserGroupForDropdownListWidget[] {
return settings_config.system_user_groups_list
.filter((group) => {
if (exclude_internet_group && group.name === "@role:internet") {
return false;
}
if (exclude_owners_group && group.name === "@role:owners") {
return false;
}
return true;
})
.map((group) => {
const user_group = get_user_group_from_name(group.name);
if (!user_group) {
throw new Error(`Unknown group name: ${group.name}`);
}
return {
name: group.display_name,
value: user_group.id.toString(),
};
});
}