mirror of
https://github.com/zulip/zulip.git
synced 2025-11-15 03:11:54 +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 {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 {realm} from "./state_data.ts";
|
||||||
import type {GroupPermissionSetting} 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(
|
export function get_group_permission_setting_config(
|
||||||
setting_name: string,
|
setting_name: string,
|
||||||
@@ -53,3 +57,69 @@ export const realm_group_setting_name_schema = z.enum([
|
|||||||
"direct_message_permission_group",
|
"direct_message_permission_group",
|
||||||
]);
|
]);
|
||||||
export type RealmGroupSettingName = z.infer<typeof realm_group_setting_name_schema>;
|
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 {csrf_token} from "./csrf.ts";
|
||||||
import * as dialog_widget from "./dialog_widget.ts";
|
import * as dialog_widget from "./dialog_widget.ts";
|
||||||
import * as dropdown_widget from "./dropdown_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 {$t, $t_html, get_language_name} from "./i18n.ts";
|
||||||
import * as keydown_util from "./keydown_util.ts";
|
import * as keydown_util from "./keydown_util.ts";
|
||||||
import * as loading from "./loading.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 type {HTMLSelectOneElement} from "./types.ts";
|
||||||
import * as ui_report from "./ui_report.ts";
|
import * as ui_report from "./ui_report.ts";
|
||||||
import * as user_groups from "./user_groups.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";
|
import * as util from "./util.ts";
|
||||||
|
|
||||||
const meta = {
|
const meta = {
|
||||||
@@ -1089,7 +1091,10 @@ export function set_up_dropdown_widget_for_realm_group_settings(): void {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const get_setting_options = (): UserGroupForDropdownListWidget[] =>
|
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(
|
set_up_dropdown_widget(
|
||||||
realm_schema.keyof().parse("realm_" + setting_name),
|
realm_schema.keyof().parse("realm_" + setting_name),
|
||||||
get_setting_options,
|
get_setting_options,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import assert from "minimalistic-assert";
|
import assert from "minimalistic-assert";
|
||||||
|
|
||||||
|
import * as group_permission_settings from "./group_permission_settings.ts";
|
||||||
import {$t_html} from "./i18n.ts";
|
import {$t_html} from "./i18n.ts";
|
||||||
import type {InputPillContainer} from "./input_pill.ts";
|
import type {InputPillContainer} from "./input_pill.ts";
|
||||||
import * as people from "./people.ts";
|
import * as people from "./people.ts";
|
||||||
@@ -117,7 +118,11 @@ export function typeahead_source(
|
|||||||
let groups;
|
let groups;
|
||||||
if (setting_name !== undefined) {
|
if (setting_name !== undefined) {
|
||||||
assert(setting_type !== 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 {
|
} else {
|
||||||
groups = user_groups.get_realm_user_groups();
|
groups = user_groups.get_realm_user_groups();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,7 @@ import {z} from "zod";
|
|||||||
|
|
||||||
import * as blueslip from "./blueslip.ts";
|
import * as blueslip from "./blueslip.ts";
|
||||||
import {FoldDict} from "./fold_dict.ts";
|
import {FoldDict} from "./fold_dict.ts";
|
||||||
import * as group_permission_settings from "./group_permission_settings.ts";
|
|
||||||
import {$t} from "./i18n.ts";
|
import {$t} from "./i18n.ts";
|
||||||
import {page_params} from "./page_params.ts";
|
|
||||||
import type {UserGroupUpdateEvent} from "./server_event_types.ts";
|
import type {UserGroupUpdateEvent} from "./server_event_types.ts";
|
||||||
import * as settings_config from "./settings_config.ts";
|
import * as settings_config from "./settings_config.ts";
|
||||||
import type {GroupPermissionSetting, GroupSettingValue, StateData} from "./state_data.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 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_name_dict: FoldDict<UserGroup>;
|
||||||
let user_group_by_id_dict: Map<number, UserGroup>;
|
let user_group_by_id_dict: Map<number, UserGroup>;
|
||||||
|
|
||||||
@@ -542,7 +535,10 @@ export function is_user_in_setting_group(
|
|||||||
return false;
|
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.
|
// We use a special label for the "Nobody" system group for clarity.
|
||||||
if (setting_name === "direct_message_permission_group" && name === "Nobody") {
|
if (setting_name === "direct_message_permission_group" && name === "Nobody") {
|
||||||
return $t({defaultMessage: "Direct messages disabled"});
|
return $t({defaultMessage: "Direct messages disabled"});
|
||||||
@@ -589,70 +585,6 @@ export function check_system_user_group_allowed_for_setting(
|
|||||||
return true;
|
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 {
|
export function get_display_group_name(group_name: string): string {
|
||||||
const group = settings_config.system_user_groups_list.find(
|
const group = settings_config.system_user_groups_list.find(
|
||||||
(system_group) => system_group.name === group_name,
|
(system_group) => system_group.name === group_name,
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ const {page_params} = require("./lib/zpage_params.cjs");
|
|||||||
const noop = function () {};
|
const noop = function () {};
|
||||||
|
|
||||||
const bootstrap_typeahead = mock_esm("../src/bootstrap_typeahead");
|
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 input_pill = zrequire("input_pill");
|
||||||
const pill_typeahead = zrequire("pill_typeahead");
|
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,
|
get_display_value_from_item: noop,
|
||||||
});
|
});
|
||||||
|
|
||||||
group_permission_setting.get_group_permission_setting_config = (setting_name, setting_type) => {
|
override(realm, "server_supported_permission_settings", {
|
||||||
assert.equal(setting_name, "can_manage_group");
|
group: {
|
||||||
assert.equal(setting_type, "group");
|
can_manage_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,
|
require_system_group: false,
|
||||||
allow_internet_group: false,
|
allow_internet_group: false,
|
||||||
allow_nobody_group: true,
|
allow_nobody_group: true,
|
||||||
allow_everyone_group: false,
|
allow_everyone_group: false,
|
||||||
allowed_system_groups: ["role:moderators", "role:nobody", "role:fullmembers"],
|
allowed_system_groups: ["role:moderators", "role:nobody", "role:fullmembers"],
|
||||||
};
|
},
|
||||||
};
|
},
|
||||||
|
});
|
||||||
|
|
||||||
const moderators_system_group = {
|
const moderators_system_group = {
|
||||||
name: "role:moderators",
|
name: "role:moderators",
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ const {zrequire} = require("./lib/namespace.cjs");
|
|||||||
const {run_test} = require("./lib/test.cjs");
|
const {run_test} = require("./lib/test.cjs");
|
||||||
const blueslip = require("./lib/zblueslip.cjs");
|
const blueslip = require("./lib/zblueslip.cjs");
|
||||||
|
|
||||||
|
const group_permission_settings = zrequire("group_permission_settings");
|
||||||
const user_groups = zrequire("user_groups");
|
const user_groups = zrequire("user_groups");
|
||||||
const {set_realm} = zrequire("state_data");
|
const {set_realm} = zrequire("state_data");
|
||||||
|
|
||||||
@@ -574,7 +575,7 @@ run_test("get_realm_user_groups_for_dropdown_list_widget", ({override}) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
assert.deepEqual(
|
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",
|
"can_remove_subscribers_group",
|
||||||
"stream",
|
"stream",
|
||||||
),
|
),
|
||||||
@@ -587,7 +588,7 @@ run_test("get_realm_user_groups_for_dropdown_list_widget", ({override}) => {
|
|||||||
];
|
];
|
||||||
|
|
||||||
assert.deepEqual(
|
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",
|
"can_access_all_users_group",
|
||||||
"realm",
|
"realm",
|
||||||
),
|
),
|
||||||
@@ -596,7 +597,10 @@ run_test("get_realm_user_groups_for_dropdown_list_widget", ({override}) => {
|
|||||||
|
|
||||||
assert.throws(
|
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",
|
name: "Error",
|
||||||
message: "Invalid setting: invalid_setting",
|
message: "Invalid setting: invalid_setting",
|
||||||
|
|||||||
Reference in New Issue
Block a user