diff --git a/tools/test-js-with-node b/tools/test-js-with-node index 139ebd558a..4df60dd60a 100755 --- a/tools/test-js-with-node +++ b/tools/test-js-with-node @@ -218,7 +218,7 @@ EXEMPT_FILES = make_set( "web/src/settings_realm_domains.ts", "web/src/settings_realm_user_settings_defaults.js", "web/src/settings_sections.js", - "web/src/settings_streams.js", + "web/src/settings_streams.ts", "web/src/settings_toggle.js", "web/src/settings_ui.ts", "web/src/settings_user_topics.ts", diff --git a/web/src/settings_streams.js b/web/src/settings_streams.ts similarity index 82% rename from web/src/settings_streams.js rename to web/src/settings_streams.ts index 52f6f9f262..f566afb6fb 100644 --- a/web/src/settings_streams.js +++ b/web/src/settings_streams.ts @@ -1,4 +1,5 @@ import $ from "jquery"; +import type * as tippy from "tippy.js"; import render_add_default_streams from "../templates/settings/add_default_streams.hbs"; import render_admin_default_streams_list from "../templates/settings/admin_default_streams_list.hbs"; @@ -18,14 +19,14 @@ import * as stream_data from "./stream_data"; import * as sub_store from "./sub_store"; import * as ui_report from "./ui_report"; -function add_choice_row($widget) { +function add_choice_row($widget: JQuery): void { if ($widget.closest(".choice-row").next().hasClass("choice-row")) { return; } create_choice_row(); } -function get_chosen_default_streams() { +function get_chosen_default_streams(): Set { // Return the set of stream id's of streams chosen in the default stream modal. return new Set( // Note: We selectively map through the dropdown elements that contain the @@ -37,7 +38,7 @@ function get_chosen_default_streams() { ); } -function create_choice_row() { +function create_choice_row(): void { const $container = $("#default-stream-choices"); const value = settings_profile_fields.get_value_for_new_option($container); const stream_dropdown_widget_name = `select_default_stream_${value}`; @@ -45,7 +46,7 @@ function create_choice_row() { $container.append($(row_html)); // List of non-default streams that are not yet selected. - function get_options() { + function get_options(): {name: string; unique_id: number}[] { const chosen_default_streams = get_chosen_default_streams(); return stream_data @@ -53,10 +54,10 @@ function create_choice_row() { .filter((e) => !chosen_default_streams.has(e.unique_id)); } - function item_click_callback(event, dropdown) { + function item_click_callback(event: JQuery.ClickEvent, dropdown: tippy.Instance): void { const $selected_stream = $(event.currentTarget); - const selected_stream_name = $selected_stream.attr("data-name"); - const selected_stream_id = Number.parseInt($selected_stream.data("unique-id"), 10); + const selected_stream_name = $selected_stream.attr("data-name")!; + const selected_stream_id = Number.parseInt($selected_stream.attr("data-unique-id")!, 10); const $stream_dropdown_widget = $(`#${CSS.escape(stream_dropdown_widget_name)}_widget`); const $stream_name = $stream_dropdown_widget.find(".dropdown_widget_value"); @@ -85,11 +86,11 @@ const meta = { loaded: false, }; -export function reset() { +export function reset(): void { meta.loaded = false; } -export function maybe_disable_widgets() { +export function maybe_disable_widgets(): void { if (current_user.is_admin) { return; } @@ -99,11 +100,11 @@ export function maybe_disable_widgets() { .prop("disabled", true); } -export function build_default_stream_table() { +export function build_default_stream_table(): void { const $table = $("#admin_default_streams_table").expectOne(); const stream_ids = stream_data.get_default_stream_ids(); - const subs = stream_ids.map((stream_id) => sub_store.get(stream_id)); + const subs = stream_ids.map((stream_id) => sub_store.get(stream_id)!); ListWidget.create($table, subs, { name: "default_streams_list", @@ -115,7 +116,7 @@ export function build_default_stream_table() { }); }, filter: { - $element: $table.closest(".settings-section").find(".search"), + $element: $table.closest(".settings-section").find("input.search"), predicate(item, query) { return item.name.toLowerCase().includes(query.toLowerCase()); }, @@ -134,15 +135,19 @@ export function build_default_stream_table() { loading.destroy_indicator($("#admin_page_default_streams_loading_indicator")); } -export function update_default_streams_table() { +export function update_default_streams_table(): void { if (["organization", "settings"].includes(hash_parser.get_current_hash_category())) { $("#admin_default_streams_table").expectOne().find("tr.default_stream_row").remove(); build_default_stream_table(); } } -export function delete_default_stream(stream_id, $default_stream_row, $alert_element) { - channel.del({ +export function delete_default_stream( + stream_id: number, + $default_stream_row: JQuery, + $alert_element: JQuery, +): void { + void channel.del({ url: "/json/default_streams?" + $.param({stream_id}), error(xhr) { ui_report.generic_row_button_error(xhr, $alert_element); @@ -153,7 +158,7 @@ export function delete_default_stream(stream_id, $default_stream_row, $alert_ele }); } -function delete_choice_row(e) { +function delete_choice_row(e: JQuery.ClickEvent): void { const $row = $(e.currentTarget).parent(); $row.remove(); @@ -164,10 +169,10 @@ function delete_choice_row(e) { ); } -function show_add_default_streams_modal() { +function show_add_default_streams_modal(): void { const html_body = render_add_default_streams(); - function add_default_streams(e) { + function add_default_streams(e: JQuery.ClickEvent): void { e.preventDefault(); e.stopPropagation(); @@ -176,9 +181,9 @@ function show_add_default_streams_modal() { let successful_requests = 0; const chosen_streams = get_chosen_default_streams(); - function make_default_stream_request(stream_id) { + function make_default_stream_request(stream_id: number): void { const data = {stream_id}; - channel.post({ + void channel.post({ url: "/json/default_streams", data, success() { @@ -204,7 +209,7 @@ function show_add_default_streams_modal() { } } - function default_stream_post_render() { + function default_stream_post_render(): void { $("#add-default-stream-modal .dialog_submit_button").prop("disabled", true); create_choice_row(); @@ -223,12 +228,12 @@ function show_add_default_streams_modal() { }); } -export function set_up() { +export function set_up(): void { build_page(); maybe_disable_widgets(); } -export function build_page() { +export function build_page(): void { meta.loaded = true; update_default_streams_table(); @@ -240,9 +245,13 @@ export function build_page() { show_add_default_streams_modal(); }); - $("body").on("click", ".default_stream_row .remove-default-stream", function (e) { - const $row = $(this).closest(".default_stream_row"); - const stream_id = Number.parseInt($row.attr("data-stream-id"), 10); - delete_default_stream(stream_id, $row, $(e.target)); - }); + $("body").on( + "click", + ".default_stream_row .remove-default-stream", + function (this: HTMLElement) { + const $row = $(this).closest(".default_stream_row"); + const stream_id = Number.parseInt($row.attr("data-stream-id")!, 10); + delete_default_stream(stream_id, $row, $(this)); + }, + ); }