group-permission-settings: Add function to get list of setting names.

This commit adds a function which returns type checked list of
group permission setting names so that all the type checking
has to be done only once.
This commit is contained in:
Sahil Batra 2024-12-11 13:48:25 +05:30 committed by Tim Abbott
parent ab67b87db3
commit 4cb9fb0d5a
5 changed files with 26 additions and 17 deletions

View File

@ -111,6 +111,7 @@ EXEMPT_FILES = make_set(
"web/src/giphy.ts",
"web/src/giphy_state.ts",
"web/src/global.ts",
"web/src/group_permission_settings.ts",
"web/src/group_setting_pill.ts",
"web/src/hash_util.ts",
"web/src/hashchange.ts",

View File

@ -1,3 +1,5 @@
import {z} from "zod";
import {realm} from "./state_data.ts";
import type {GroupPermissionSetting} from "./state_data.ts";
@ -14,3 +16,20 @@ export function get_group_permission_setting_config(
}
return permission_config_dict;
}
export const group_setting_name_schema = z.enum([
"can_add_members_group",
"can_join_group",
"can_leave_group",
"can_manage_group",
"can_mention_group",
"can_remove_members_group",
]);
export type GroupSettingName = z.infer<typeof group_setting_name_schema>;
export function get_group_permission_settings(): GroupSettingName[] {
return z
.array(group_setting_name_schema)
.parse(Object.keys(realm.server_supported_permission_settings.group));
}

View File

@ -10,6 +10,7 @@ import * as blueslip from "./blueslip.ts";
import * as compose_banner from "./compose_banner.ts";
import type {DropdownWidget} from "./dropdown_widget.ts";
import * as group_permission_settings from "./group_permission_settings.ts";
import type {GroupSettingName} from "./group_permission_settings.ts";
import * as group_setting_pill from "./group_setting_pill.ts";
import {$t} from "./i18n.ts";
import {
@ -1559,17 +1560,6 @@ export function set_group_setting_widget_value(
}
}
export const group_setting_name_schema = z.enum([
"can_add_members_group",
"can_join_group",
"can_leave_group",
"can_manage_group",
"can_mention_group",
"can_remove_members_group",
]);
export type GroupSettingName = z.infer<typeof group_setting_name_schema>;
export function create_group_setting_widget({
$pill_container,
setting_name,

View File

@ -2,6 +2,7 @@ import $ from "jquery";
import assert from "minimalistic-assert";
import * as channel from "./channel.ts";
import * as group_permission_settings from "./group_permission_settings.ts";
import {$t, $t_html} from "./i18n.ts";
import * as keydown_util from "./keydown_util.ts";
import * as loading from "./loading.ts";
@ -262,11 +263,11 @@ export function set_up_handlers(): void {
// This will always be enabled when creating a user group.
settings_components.enable_opening_typeahead_on_clicking_label($container);
const permission_settings = Object.keys(realm.server_supported_permission_settings.group);
const permission_settings = group_permission_settings.get_group_permission_settings();
for (const setting_name of permission_settings) {
const widget = settings_components.create_group_setting_widget({
$pill_container: $(`#id_new_group_${CSS.escape(setting_name)}`),
setting_name: settings_components.group_setting_name_schema.parse(setting_name),
setting_name,
});
group_setting_widget_map.set(setting_name, widget);
}

View File

@ -21,6 +21,7 @@ import type {Toggle} from "./components.ts";
import * as compose_banner from "./compose_banner.ts";
import * as confirm_dialog from "./confirm_dialog.ts";
import * as dialog_widget from "./dialog_widget.ts";
import * as group_permission_settings from "./group_permission_settings.ts";
import * as hash_util from "./hash_util.ts";
import {$t, $t_html} from "./i18n.ts";
import * as ListWidget from "./list_widget.ts";
@ -29,7 +30,6 @@ import * as overlays from "./overlays.ts";
import * as people from "./people.ts";
import * as scroll_util from "./scroll_util.ts";
import * as settings_components from "./settings_components.ts";
import {group_setting_name_schema} from "./settings_components.ts";
import * as settings_config from "./settings_config.ts";
import * as settings_data from "./settings_data.ts";
import * as settings_org from "./settings_org.ts";
@ -193,9 +193,7 @@ function show_membership_settings(group: UserGroup): void {
}
function show_general_settings(group: UserGroup): void {
const permission_settings = z
.array(group_setting_name_schema)
.parse(Object.keys(realm.server_supported_permission_settings.group));
const permission_settings = group_permission_settings.get_group_permission_settings();
for (const setting_name of permission_settings) {
settings_components.create_group_setting_widget({
$pill_container: $(`#id_${CSS.escape(setting_name)}`),