stream-settings: Show system groups in subscribers form typeahead.

We now show role-based system groups in the subscribers typeahead
in stream creation and stream edit UI.
This commit is contained in:
Sahil Batra
2025-01-21 12:24:55 +05:30
parent eda9b1a271
commit 233b776ea5
3 changed files with 21 additions and 2 deletions

View File

@@ -127,9 +127,11 @@ export function set_up_handlers_for_add_button_state(
export function create({ export function create({
$pill_container, $pill_container,
get_potential_subscribers, get_potential_subscribers,
get_user_groups,
}: { }: {
$pill_container: JQuery; $pill_container: JQuery;
get_potential_subscribers: () => User[]; get_potential_subscribers: () => User[];
get_user_groups: () => UserGroup[];
}): CombinedPillContainer { }): CombinedPillContainer {
const pill_widget = input_pill.create<CombinedPill>({ const pill_widget = input_pill.create<CombinedPill>({
$container: $pill_container, $container: $pill_container,
@@ -144,7 +146,12 @@ export function create({
return user_pill.filter_taken_users(potential_subscribers, pill_widget); return user_pill.filter_taken_users(potential_subscribers, pill_widget);
} }
set_up_pill_typeahead({pill_widget, $pill_container, get_users}); function get_groups(): UserGroup[] {
const groups = get_user_groups();
return user_group_pill.filter_taken_groups(groups, pill_widget);
}
set_up_pill_typeahead({pill_widget, $pill_container, get_users, get_user_groups: get_groups});
set_up_handlers_for_add_button_state(pill_widget, $pill_container); set_up_handlers_for_add_button_state(pill_widget, $pill_container);
@@ -154,11 +161,13 @@ export function create({
export function create_without_add_button({ export function create_without_add_button({
$pill_container, $pill_container,
get_potential_subscribers, get_potential_subscribers,
get_user_groups,
onPillCreateAction, onPillCreateAction,
onPillRemoveAction, onPillRemoveAction,
}: { }: {
$pill_container: JQuery; $pill_container: JQuery;
get_potential_subscribers: () => User[]; get_potential_subscribers: () => User[];
get_user_groups: () => UserGroup[];
onPillCreateAction: (pill_user_ids: number[]) => void; onPillCreateAction: (pill_user_ids: number[]) => void;
onPillRemoveAction: (pill_user_ids: number[]) => void; onPillRemoveAction: (pill_user_ids: number[]) => void;
}): CombinedPillContainer { }): CombinedPillContainer {
@@ -175,6 +184,11 @@ export function create_without_add_button({
return user_pill.filter_taken_users(potential_subscribers, pill_widget); return user_pill.filter_taken_users(potential_subscribers, pill_widget);
} }
function get_groups(): UserGroup[] {
const user_groups = get_user_groups();
return user_group_pill.filter_taken_groups(user_groups, pill_widget);
}
pill_widget.onPillCreate(() => { pill_widget.onPillCreate(() => {
onPillCreateAction(get_pill_user_ids(pill_widget)); onPillCreateAction(get_pill_user_ids(pill_widget));
}); });
@@ -182,7 +196,7 @@ export function create_without_add_button({
onPillRemoveAction(get_pill_user_ids(pill_widget)); onPillRemoveAction(get_pill_user_ids(pill_widget));
}); });
set_up_pill_typeahead({pill_widget, $pill_container, get_users}); set_up_pill_typeahead({pill_widget, $pill_container, get_users, get_user_groups: get_groups});
return pill_widget; return pill_widget;
} }

View File

@@ -10,6 +10,7 @@ import * as people from "./people.ts";
import {current_user} from "./state_data.ts"; import {current_user} from "./state_data.ts";
import * as stream_create_subscribers_data from "./stream_create_subscribers_data.ts"; import * as stream_create_subscribers_data from "./stream_create_subscribers_data.ts";
import type {CombinedPillContainer} from "./typeahead_helper.ts"; import type {CombinedPillContainer} from "./typeahead_helper.ts";
import * as user_groups from "./user_groups.ts";
import * as user_sort from "./user_sort.ts"; import * as user_sort from "./user_sort.ts";
export let pill_widget: CombinedPillContainer; export let pill_widget: CombinedPillContainer;
@@ -54,9 +55,11 @@ function build_pill_widget({
}): CombinedPillContainer { }): CombinedPillContainer {
const $pill_container = $parent_container.find(".pill-container"); const $pill_container = $parent_container.find(".pill-container");
const get_potential_subscribers = stream_create_subscribers_data.get_potential_subscribers; const get_potential_subscribers = stream_create_subscribers_data.get_potential_subscribers;
const get_user_groups = user_groups.get_all_realm_user_groups;
return add_subscribers_pill.create_without_add_button({ return add_subscribers_pill.create_without_add_button({
$pill_container, $pill_container,
get_potential_subscribers, get_potential_subscribers,
get_user_groups,
onPillCreateAction: add_user_ids, onPillCreateAction: add_user_ids,
// It is better to sync the current set of user ids in the input // It is better to sync the current set of user ids in the input
// instead of removing user_ids from the user_ids_set, otherwise // instead of removing user_ids from the user_ids_set, otherwise

View File

@@ -27,6 +27,7 @@ import * as sub_store from "./sub_store.ts";
import type {StreamSubscription} from "./sub_store.ts"; import type {StreamSubscription} from "./sub_store.ts";
import * as subscriber_api from "./subscriber_api.ts"; import * as subscriber_api from "./subscriber_api.ts";
import type {CombinedPillContainer} from "./typeahead_helper.ts"; import type {CombinedPillContainer} from "./typeahead_helper.ts";
import * as user_groups from "./user_groups.ts";
import * as user_sort from "./user_sort.ts"; import * as user_sort from "./user_sort.ts";
const remove_user_id_api_response_schema = z.object({ const remove_user_id_api_response_schema = z.object({
@@ -119,6 +120,7 @@ export function enable_subscriber_management({
pill_widget = add_subscribers_pill.create({ pill_widget = add_subscribers_pill.create({
$pill_container, $pill_container,
get_potential_subscribers, get_potential_subscribers,
get_user_groups: user_groups.get_all_realm_user_groups,
}); });
$pill_container.find(".input").on("input", () => { $pill_container.find(".input").on("input", () => {