group-settings: Move functions used for group settings.

This commit moves get_realm_user_groups_for_setting and
get_realm_user_groups_for_dropdown_list_widget functions
from user_groups.ts to group_permission_settings.ts.

This change is needed to avoid import cycles in further
commits to add "Permissions" panel for groups.
This commit is contained in:
Sahil Batra
2025-01-23 19:37:33 +05:30
committed by Tim Abbott
parent 4ae45763b4
commit 52fbca65ce
6 changed files with 105 additions and 93 deletions

View File

@@ -1,7 +1,11 @@
import {z} from "zod";
import {page_params} from "./page_params.ts";
import * as settings_config from "./settings_config.ts";
import {realm} from "./state_data.ts";
import type {GroupPermissionSetting} from "./state_data.ts";
import * as user_groups from "./user_groups.ts";
import type {UserGroup} from "./user_groups.ts";
export function get_group_permission_setting_config(
setting_name: string,
@@ -53,3 +57,69 @@ export const realm_group_setting_name_schema = z.enum([
"direct_message_permission_group",
]);
export type RealmGroupSettingName = z.infer<typeof realm_group_setting_name_schema>;
export function get_realm_user_groups_for_setting(
setting_name: string,
setting_type: "realm" | "stream" | "group",
for_new_settings_ui = false,
): UserGroup[] {
const group_setting_config = get_group_permission_setting_config(setting_name, setting_type);
if (group_setting_config === undefined) {
return [];
}
const system_user_groups = settings_config.system_user_groups_list
.filter((group) =>
user_groups.check_system_user_group_allowed_for_setting(
group.name,
group_setting_config,
for_new_settings_ui,
),
)
.map((group) => {
const user_group = user_groups.get_user_group_from_name(group.name);
if (!user_group) {
throw new Error(`Unknown group name: ${group.name}`);
}
return user_group;
});
if (!page_params.development_environment || group_setting_config.require_system_group) {
return system_user_groups;
}
const user_groups_excluding_system_groups = user_groups.get_realm_user_groups();
return [...system_user_groups, ...user_groups_excluding_system_groups];
}
export type UserGroupForDropdownListWidget = {
name: string;
unique_id: number;
};
export function get_realm_user_groups_for_dropdown_list_widget(
setting_name: string,
setting_type: "realm" | "stream" | "group",
): UserGroupForDropdownListWidget[] {
const allowed_setting_groups = get_realm_user_groups_for_setting(setting_name, setting_type);
return allowed_setting_groups.map((group) => {
if (!group.is_system_group) {
return {
name: group.name,
unique_id: group.id,
};
}
const display_name = settings_config.system_user_groups_list.find(
(system_group) => system_group.name === group.name,
)!.dropdown_option_name;
return {
name: user_groups.get_display_name_for_system_group_option(setting_name, display_name),
unique_id: group.id,
};
});
}

View File

@@ -12,6 +12,8 @@ import * as channel from "./channel.ts";
import {csrf_token} from "./csrf.ts";
import * as dialog_widget from "./dialog_widget.ts";
import * as dropdown_widget from "./dropdown_widget.ts";
import * as group_permission_settings from "./group_permission_settings.ts";
import type {UserGroupForDropdownListWidget} from "./group_permission_settings.ts";
import {$t, $t_html, get_language_name} from "./i18n.ts";
import * as keydown_util from "./keydown_util.ts";
import * as loading from "./loading.ts";
@@ -45,7 +47,7 @@ import {group_setting_value_schema} from "./types.ts";
import type {HTMLSelectOneElement} from "./types.ts";
import * as ui_report from "./ui_report.ts";
import * as user_groups from "./user_groups.ts";
import type {UserGroup, UserGroupForDropdownListWidget} from "./user_groups.ts";
import type {UserGroup} from "./user_groups.ts";
import * as util from "./util.ts";
const meta = {
@@ -1089,7 +1091,10 @@ export function set_up_dropdown_widget_for_realm_group_settings(): void {
continue;
}
const get_setting_options = (): UserGroupForDropdownListWidget[] =>
user_groups.get_realm_user_groups_for_dropdown_list_widget(setting_name, "realm");
group_permission_settings.get_realm_user_groups_for_dropdown_list_widget(
setting_name,
"realm",
);
set_up_dropdown_widget(
realm_schema.keyof().parse("realm_" + setting_name),
get_setting_options,

View File

@@ -1,5 +1,6 @@
import assert from "minimalistic-assert";
import * as group_permission_settings from "./group_permission_settings.ts";
import {$t_html} from "./i18n.ts";
import type {InputPillContainer} from "./input_pill.ts";
import * as people from "./people.ts";
@@ -117,7 +118,11 @@ export function typeahead_source(
let groups;
if (setting_name !== undefined) {
assert(setting_type !== undefined);
groups = user_groups.get_realm_user_groups_for_setting(setting_name, setting_type, true);
groups = group_permission_settings.get_realm_user_groups_for_setting(
setting_name,
setting_type,
true,
);
} else {
groups = user_groups.get_realm_user_groups();
}

View File

@@ -3,9 +3,7 @@ import {z} from "zod";
import * as blueslip from "./blueslip.ts";
import {FoldDict} from "./fold_dict.ts";
import * as group_permission_settings from "./group_permission_settings.ts";
import {$t} from "./i18n.ts";
import {page_params} from "./page_params.ts";
import type {UserGroupUpdateEvent} from "./server_event_types.ts";
import * as settings_config from "./settings_config.ts";
import type {GroupPermissionSetting, GroupSettingValue, StateData} from "./state_data.ts";
@@ -23,11 +21,6 @@ export const user_group_schema = raw_user_group_schema.extend({
});
export type UserGroup = z.infer<typeof user_group_schema>;
export type UserGroupForDropdownListWidget = {
name: string;
unique_id: number;
};
let user_group_name_dict: FoldDict<UserGroup>;
let user_group_by_id_dict: Map<number, UserGroup>;
@@ -542,7 +535,10 @@ export function is_user_in_setting_group(
return false;
}
function get_display_name_for_system_group_option(setting_name: string, name: string): string {
export function get_display_name_for_system_group_option(
setting_name: string,
name: string,
): string {
// We use a special label for the "Nobody" system group for clarity.
if (setting_name === "direct_message_permission_group" && name === "Nobody") {
return $t({defaultMessage: "Direct messages disabled"});
@@ -589,70 +585,6 @@ export function check_system_user_group_allowed_for_setting(
return true;
}
export function get_realm_user_groups_for_setting(
setting_name: string,
setting_type: "realm" | "stream" | "group",
for_new_settings_ui = false,
): UserGroup[] {
const group_setting_config = group_permission_settings.get_group_permission_setting_config(
setting_name,
setting_type,
);
if (group_setting_config === undefined) {
return [];
}
const system_user_groups = settings_config.system_user_groups_list
.filter((group) =>
check_system_user_group_allowed_for_setting(
group.name,
group_setting_config,
for_new_settings_ui,
),
)
.map((group) => {
const user_group = get_user_group_from_name(group.name);
if (!user_group) {
throw new Error(`Unknown group name: ${group.name}`);
}
return user_group;
});
if (!page_params.development_environment || group_setting_config.require_system_group) {
return system_user_groups;
}
const user_groups_excluding_system_groups = get_realm_user_groups();
return [...system_user_groups, ...user_groups_excluding_system_groups];
}
export function get_realm_user_groups_for_dropdown_list_widget(
setting_name: string,
setting_type: "realm" | "stream" | "group",
): UserGroupForDropdownListWidget[] {
const allowed_setting_groups = get_realm_user_groups_for_setting(setting_name, setting_type);
return allowed_setting_groups.map((group) => {
if (!group.is_system_group) {
return {
name: group.name,
unique_id: group.id,
};
}
const display_name = settings_config.system_user_groups_list.find(
(system_group) => system_group.name === group.name,
)!.dropdown_option_name;
return {
name: get_display_name_for_system_group_option(setting_name, display_name),
unique_id: group.id,
};
});
}
export function get_display_group_name(group_name: string): string {
const group = settings_config.system_user_groups_list.find(
(system_group) => system_group.name === group_name,

View File

@@ -11,7 +11,6 @@ const {page_params} = require("./lib/zpage_params.cjs");
const noop = function () {};
const bootstrap_typeahead = mock_esm("../src/bootstrap_typeahead");
const group_permission_setting = mock_esm("../src/group_permission_settings");
const input_pill = zrequire("input_pill");
const pill_typeahead = zrequire("pill_typeahead");
@@ -669,20 +668,17 @@ run_test("set_up_group_setting_typeahead", ({mock_template, override, override_r
get_display_value_from_item: noop,
});
group_permission_setting.get_group_permission_setting_config = (setting_name, setting_type) => {
assert.equal(setting_name, "can_manage_group");
assert.equal(setting_type, "group");
// This is not same as the original config for can_manage_group
// setting, but is set in such a way that we need to create minimum
// system groups.
return {
require_system_group: false,
allow_internet_group: false,
allow_nobody_group: true,
allow_everyone_group: false,
allowed_system_groups: ["role:moderators", "role:nobody", "role:fullmembers"],
};
};
override(realm, "server_supported_permission_settings", {
group: {
can_manage_group: {
require_system_group: false,
allow_internet_group: false,
allow_nobody_group: true,
allow_everyone_group: false,
allowed_system_groups: ["role:moderators", "role:nobody", "role:fullmembers"],
},
},
});
const moderators_system_group = {
name: "role:moderators",

View File

@@ -7,6 +7,7 @@ const {zrequire} = require("./lib/namespace.cjs");
const {run_test} = require("./lib/test.cjs");
const blueslip = require("./lib/zblueslip.cjs");
const group_permission_settings = zrequire("group_permission_settings");
const user_groups = zrequire("user_groups");
const {set_realm} = zrequire("state_data");
@@ -574,7 +575,7 @@ run_test("get_realm_user_groups_for_dropdown_list_widget", ({override}) => {
});
assert.deepEqual(
user_groups.get_realm_user_groups_for_dropdown_list_widget(
group_permission_settings.get_realm_user_groups_for_dropdown_list_widget(
"can_remove_subscribers_group",
"stream",
),
@@ -587,7 +588,7 @@ run_test("get_realm_user_groups_for_dropdown_list_widget", ({override}) => {
];
assert.deepEqual(
user_groups.get_realm_user_groups_for_dropdown_list_widget(
group_permission_settings.get_realm_user_groups_for_dropdown_list_widget(
"can_access_all_users_group",
"realm",
),
@@ -596,7 +597,10 @@ run_test("get_realm_user_groups_for_dropdown_list_widget", ({override}) => {
assert.throws(
() =>
user_groups.get_realm_user_groups_for_dropdown_list_widget("invalid_setting", "stream"),
group_permission_settings.get_realm_user_groups_for_dropdown_list_widget(
"invalid_setting",
"stream",
),
{
name: "Error",
message: "Invalid setting: invalid_setting",