mirror of
https://github.com/zulip/zulip.git
synced 2026-06-30 21:11:04 +08:00
For spectators, the chunk of page_params that originates from do_events_register isn’t assigned until ui_init.js. That means the TypeScript type of page_params is mostly a lie during module load time: reading a parameter too early silently results in undefined rather than the declared type, with unpredictable results later on. We want to make such an early read into an immediate runtime error, for both users and spectators consistently, and pave the way for runtime validation of the page_params type. As a first step, split out the subset of fields that pertain to the current user. Signed-off-by: Anders Kaseorg <[email protected]>
125 lines
4.3 KiB
JavaScript
125 lines
4.3 KiB
JavaScript
import $ from "jquery";
|
|
|
|
import render_new_stream_user from "../templates/stream_settings/new_stream_user.hbs";
|
|
import render_new_stream_users from "../templates/stream_settings/new_stream_users.hbs";
|
|
|
|
import * as add_subscribers_pill from "./add_subscribers_pill";
|
|
import * as ListWidget from "./list_widget";
|
|
import * as people from "./people";
|
|
import {current_user} from "./state_data";
|
|
import * as stream_create_subscribers_data from "./stream_create_subscribers_data";
|
|
import * as user_sort from "./user_sort";
|
|
|
|
let pill_widget;
|
|
let all_users_list_widget;
|
|
|
|
export function get_principals() {
|
|
return stream_create_subscribers_data.get_principals();
|
|
}
|
|
|
|
function redraw_subscriber_list() {
|
|
all_users_list_widget.replace_list_data(stream_create_subscribers_data.sorted_user_ids());
|
|
}
|
|
|
|
function add_user_ids(user_ids) {
|
|
stream_create_subscribers_data.add_user_ids(user_ids);
|
|
redraw_subscriber_list();
|
|
}
|
|
|
|
function add_all_users() {
|
|
const user_ids = stream_create_subscribers_data.get_all_user_ids();
|
|
add_user_ids(user_ids);
|
|
}
|
|
|
|
function remove_user_ids(user_ids) {
|
|
stream_create_subscribers_data.remove_user_ids(user_ids);
|
|
redraw_subscriber_list();
|
|
}
|
|
|
|
function build_pill_widget({$parent_container}) {
|
|
const $pill_container = $parent_container.find(".pill-container");
|
|
const get_potential_subscribers = stream_create_subscribers_data.get_potential_subscribers;
|
|
|
|
pill_widget = add_subscribers_pill.create({$pill_container, get_potential_subscribers});
|
|
}
|
|
|
|
export function create_handlers($container) {
|
|
$container.on("click", ".add_all_users_to_stream", (e) => {
|
|
e.preventDefault();
|
|
add_all_users();
|
|
$(".add-user-list-filter").trigger("focus");
|
|
});
|
|
|
|
$container.on("click", ".remove_potential_subscriber", (e) => {
|
|
e.preventDefault();
|
|
const $elem = $(e.target);
|
|
const user_id = Number.parseInt($elem.attr("data-user-id"), 10);
|
|
remove_user_ids([user_id]);
|
|
});
|
|
|
|
const button_selector = ".add_subscribers_container button.add-subscriber-button";
|
|
function add_users({pill_user_ids}) {
|
|
add_user_ids(pill_user_ids);
|
|
// eslint-disable-next-line unicorn/no-array-callback-reference
|
|
const $pill_widget_button = $container.find(button_selector);
|
|
$pill_widget_button.prop("disabled", true);
|
|
pill_widget.clear();
|
|
}
|
|
|
|
add_subscribers_pill.set_up_handlers({
|
|
get_pill_widget: () => pill_widget,
|
|
$parent_container: $container,
|
|
pill_selector: ".add_subscribers_container .input",
|
|
button_selector,
|
|
action: add_users,
|
|
});
|
|
}
|
|
|
|
export function build_widgets() {
|
|
const $add_people_container = $("#people_to_add");
|
|
$add_people_container.html(render_new_stream_users({}));
|
|
|
|
const $simplebar_container = $add_people_container.find(".subscriber_list_container");
|
|
|
|
build_pill_widget({$parent_container: $add_people_container});
|
|
|
|
stream_create_subscribers_data.initialize_with_current_user();
|
|
const current_user_id = current_user.user_id;
|
|
|
|
all_users_list_widget = ListWidget.create($("#create_stream_subscribers"), [current_user_id], {
|
|
name: "new_stream_add_users",
|
|
get_item: people.get_by_user_id,
|
|
$parent_container: $add_people_container,
|
|
modifier_html(user) {
|
|
const item = {
|
|
email: user.delivery_email,
|
|
user_id: user.user_id,
|
|
full_name: user.full_name,
|
|
is_current_user: user.user_id === current_user_id,
|
|
disabled: stream_create_subscribers_data.must_be_subscribed(user.user_id),
|
|
};
|
|
return render_new_stream_user(item);
|
|
},
|
|
sort_fields: {
|
|
email: user_sort.sort_email,
|
|
id: user_sort.sort_user_id,
|
|
...ListWidget.generic_sort_functions("alphabetic", ["full_name"]),
|
|
},
|
|
filter: {
|
|
$element: $("#people_to_add .add-user-list-filter"),
|
|
predicate(user, search_term) {
|
|
return people.build_person_matcher(search_term)(user);
|
|
},
|
|
},
|
|
$simplebar_container,
|
|
html_selector(user) {
|
|
return $(`#${CSS.escape("user_checkbox_" + user.user_id)}`);
|
|
},
|
|
});
|
|
}
|
|
|
|
export function add_user_id_to_new_stream(user_id) {
|
|
// This is only used by puppeteer tests.
|
|
add_user_ids([user_id]);
|
|
}
|