mirror of
https://github.com/zulip/zulip.git
synced 2025-10-23 04:52:12 +00:00
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:
@@ -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,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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();
|
||||
}
|
||||
|
@@ -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,
|
||||
|
@@ -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",
|
||||
|
@@ -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",
|
||||
|
Reference in New Issue
Block a user