dropdown_widget: Fix Option typing.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg
2025-03-16 19:43:28 -07:00
committed by Tim Abbott
parent 32e8575713
commit c81ef4d409
11 changed files with 28 additions and 54 deletions

View File

@@ -27,11 +27,6 @@ import * as user_groups from "./user_groups.ts";
import * as util from "./util.ts";
type MessageType = "stream" | "private";
type DirectMessagesOption = {
is_direct_message: boolean;
unique_id: string | number;
name: string;
};
let compose_select_recipient_dropdown_widget: DropdownWidget;
@@ -272,8 +267,7 @@ function item_click_callback(event: JQuery.ClickEvent, dropdown: tippy.Instance)
}
function get_options_for_recipient_widget(): Option[] {
const options: (Option | DirectMessagesOption)[] =
stream_data.get_options_for_dropdown_widget();
const options: Option[] = stream_data.get_options_for_dropdown_widget();
const direct_messages_option = {
is_direct_message: true,

View File

@@ -31,8 +31,13 @@ export enum DataTypes {
export type Option = {
unique_id: number | string;
name: string;
description?: string;
is_direct_message?: boolean;
is_setting_disabled?: boolean;
stream?: StreamSubscription;
bold_current_selection?: boolean;
has_delete_icon?: boolean;
has_edit_icon?: boolean;
};
export type DropdownWidgetOptions = {

View File

@@ -1,6 +1,7 @@
import {z} from "zod";
import * as blueslip from "./blueslip.ts";
import type * as dropdown_widget from "./dropdown_widget.ts";
import {$t} from "./i18n.ts";
import * as settings_config from "./settings_config.ts";
import {realm} from "./state_data.ts";
@@ -110,15 +111,10 @@ export function get_realm_user_groups_for_setting(
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[] {
): dropdown_widget.Option[] {
const allowed_setting_groups = get_realm_user_groups_for_setting(setting_name, setting_type);
return allowed_setting_groups.map((group) => {

View File

@@ -13,7 +13,6 @@ 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 information_density from "./information_density.ts";
import * as keydown_util from "./keydown_util.ts";
@@ -1113,7 +1112,7 @@ export function set_up_dropdown_widget_for_realm_group_settings(): void {
// we use pills UI.
continue;
}
const get_setting_options = (): UserGroupForDropdownListWidget[] =>
const get_setting_options = (): dropdown_widget.Option[] =>
group_permission_settings.get_realm_user_groups_for_dropdown_list_widget(
setting_name,
"realm",

View File

@@ -217,7 +217,7 @@ function count_users_by_role(user_ids: number[]): Record<number, number> {
return role_counts;
}
function get_roles_with_counts(user_ids: number[]): {unique_id: number; name: string}[] {
function get_roles_with_counts(user_ids: number[]): dropdown_widget.Option[] {
const role_counts = count_users_by_role(user_ids);
return [
{
@@ -240,12 +240,12 @@ function get_roles_with_counts(user_ids: number[]): {unique_id: number; name: st
];
}
function get_roles_count_for_active_users(): {unique_id: number; name: string}[] {
function get_roles_count_for_active_users(): dropdown_widget.Option[] {
const active_user_ids = people.get_realm_active_human_user_ids();
return get_roles_with_counts(active_user_ids);
}
function get_roles_count_for_deactivated_users(): {unique_id: number; name: string}[] {
function get_roles_count_for_deactivated_users(): dropdown_widget.Option[] {
const deactivated_user_ids = people.get_non_active_human_ids();
return get_roles_with_counts(deactivated_user_ids);
}
@@ -253,7 +253,7 @@ function get_roles_count_for_deactivated_users(): {unique_id: number; name: stri
function create_role_filter_dropdown(
$events_container: JQuery,
section: UserSettingsSection,
get_role_options: () => {unique_id: number; name: string}[],
get_role_options: () => dropdown_widget.Option[],
): dropdown_widget.DropdownWidget {
return new dropdown_widget.DropdownWidget({
widget_name: section.dropdown_widget_name,

View File

@@ -4,6 +4,7 @@ import * as blueslip from "./blueslip.ts";
import type {Bot} from "./bot_data.ts";
import * as bot_data from "./bot_data.ts";
import * as color_data from "./color_data.ts";
import type * as dropdown_widget from "./dropdown_widget.ts";
import {FoldDict} from "./fold_dict.ts";
import {page_params} from "./page_params.ts";
import * as peer_data from "./peer_data.ts";
@@ -1011,11 +1012,9 @@ export function remove_default_stream(stream_id: number): void {
default_stream_ids.delete(stream_id);
}
export function get_options_for_dropdown_widget(): {
name: string;
unique_id: number;
export function get_options_for_dropdown_widget(): (dropdown_widget.Option & {
stream: StreamSubscription;
}[] {
})[] {
return subscribed_subs()
.filter((stream) => !stream.is_archived)
.map((stream) => ({

View File

@@ -781,11 +781,7 @@ export async function build_move_topic_to_stream_popover(
}
stream_widget_value = current_stream_id;
const streams_list_options = (): {
name: string;
unique_id: number;
stream: sub_store.StreamSubscription;
}[] =>
const streams_list_options = (): dropdown_widget.Option[] =>
stream_data.get_options_for_dropdown_widget().filter(({stream}) => {
if (stream.stream_id === current_stream_id) {
return true;

View File

@@ -680,11 +680,9 @@ export function switch_stream_sort(tab_name: string): void {
redraw_left_panel();
}
function filters_dropdown_options(current_value: string | number | undefined): {
unique_id: string;
name: string;
bold_current_selection: boolean;
}[] {
function filters_dropdown_options(
current_value: string | number | undefined,
): dropdown_widget.Option[] {
return [
{
unique_id: stream_settings_data.FILTERS.ARCHIVED_CHANNELS,

View File

@@ -1662,11 +1662,9 @@ export function filter_click_handler(
widget.render();
}
function filters_dropdown_options(current_value: string | number | undefined): {
unique_id: string;
name: string;
bold_current_selection: boolean;
}[] {
function filters_dropdown_options(
current_value: string | number | undefined,
): dropdown_widget.Option[] {
return [
{
unique_id: FILTERS.ACTIVE_GROUPS,

View File

@@ -261,20 +261,12 @@ function reset_subscribe_widget(): void {
}
}
export function get_user_unsub_streams_for_dropdown(): {
name: string;
unique_id: number;
stream: StreamSubscription;
}[] {
export function get_user_unsub_streams_for_dropdown(): dropdown_widget.Option[] {
const target_user_id = Number.parseInt($("#user-profile-modal").attr("data-user-id")!, 10);
return get_user_unsub_streams(target_user_id);
}
export function get_user_unsub_streams(user_id: number): {
name: string;
unique_id: number;
stream: StreamSubscription;
}[] {
export function get_user_unsub_streams(user_id: number): dropdown_widget.Option[] {
return stream_data
.get_streams_for_user(user_id)
.can_subscribe.map((stream) => ({

View File

@@ -39,12 +39,9 @@ export const COMMON_DROPDOWN_WIDGET_PARAMS = {
disable_for_spectators: true,
} satisfies Partial<dropdown_widget.DropdownWidgetOptions>;
export function filters_dropdown_options(current_value: string | number | undefined): {
unique_id: string;
name: string;
description: string;
bold_current_selection: boolean;
}[] {
export function filters_dropdown_options(
current_value: string | number | undefined,
): dropdown_widget.Option[] {
return [
{
unique_id: FILTERS.FOLLOWED_TOPICS,