diff --git a/web/src/compose_recipient.ts b/web/src/compose_recipient.ts index 7e9471ddac..c3c8e3357c 100644 --- a/web/src/compose_recipient.ts +++ b/web/src/compose_recipient.ts @@ -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, diff --git a/web/src/dropdown_widget.ts b/web/src/dropdown_widget.ts index 3b6fbbad82..89507b0645 100644 --- a/web/src/dropdown_widget.ts +++ b/web/src/dropdown_widget.ts @@ -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 = { diff --git a/web/src/group_permission_settings.ts b/web/src/group_permission_settings.ts index 6f5076a6d2..aeb91f9801 100644 --- a/web/src/group_permission_settings.ts +++ b/web/src/group_permission_settings.ts @@ -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) => { diff --git a/web/src/settings_org.ts b/web/src/settings_org.ts index 6431fecdac..c94dee0c23 100644 --- a/web/src/settings_org.ts +++ b/web/src/settings_org.ts @@ -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", diff --git a/web/src/settings_users.ts b/web/src/settings_users.ts index 1c89b4c464..a237f90eb9 100644 --- a/web/src/settings_users.ts +++ b/web/src/settings_users.ts @@ -217,7 +217,7 @@ function count_users_by_role(user_ids: number[]): Record { 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, diff --git a/web/src/stream_data.ts b/web/src/stream_data.ts index 6ed3059702..8e34c7eb55 100644 --- a/web/src/stream_data.ts +++ b/web/src/stream_data.ts @@ -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) => ({ diff --git a/web/src/stream_popover.ts b/web/src/stream_popover.ts index cc3e46628d..4fb82e3ea3 100644 --- a/web/src/stream_popover.ts +++ b/web/src/stream_popover.ts @@ -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; diff --git a/web/src/stream_settings_ui.ts b/web/src/stream_settings_ui.ts index 409eb70351..969f4fcba9 100644 --- a/web/src/stream_settings_ui.ts +++ b/web/src/stream_settings_ui.ts @@ -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, diff --git a/web/src/user_group_edit.ts b/web/src/user_group_edit.ts index 362e1a80dc..fee872f099 100644 --- a/web/src/user_group_edit.ts +++ b/web/src/user_group_edit.ts @@ -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, diff --git a/web/src/user_profile.ts b/web/src/user_profile.ts index ec1fcd93ef..094b47209f 100644 --- a/web/src/user_profile.ts +++ b/web/src/user_profile.ts @@ -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) => ({ diff --git a/web/src/views_util.ts b/web/src/views_util.ts index a1b9019114..3f8aa526c9 100644 --- a/web/src/views_util.ts +++ b/web/src/views_util.ts @@ -39,12 +39,9 @@ export const COMMON_DROPDOWN_WIDGET_PARAMS = { disable_for_spectators: true, } satisfies Partial; -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,