Files
zulip/web/src/user_group_create.js
Anders Kaseorg c1675913a2 web: Move web app to ‘web’ directory.
Ever since we started bundling the app with webpack, there’s been less
and less overlap between our ‘static’ directory (files belonging to
the frontend app) and Django’s interpretation of the ‘static’
directory (files served directly to the web).

Split the app out to its own ‘web’ directory outside of ‘static’, and
remove all the custom collectstatic --ignore rules.  This makes it
much clearer what’s actually being served to the web, and what’s being
bundled by webpack.  It also shrinks the release tarball by 3%.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2023-02-23 16:04:17 -08:00

207 lines
6.4 KiB
JavaScript

import $ from "jquery";
import * as channel from "./channel";
import {$t, $t_html} from "./i18n";
import * as keydown_util from "./keydown_util";
import * as loading from "./loading";
import * as ui_report from "./ui_report";
import * as user_group_create_members from "./user_group_create_members";
import * as user_group_create_members_data from "./user_group_create_members_data";
import * as user_groups from "./user_groups";
import * as user_group_settings_ui from "./user_groups_settings_ui";
let created_group_name;
export function reset_name() {
created_group_name = undefined;
}
export function set_name(group_name) {
created_group_name = group_name;
}
export function get_name() {
return created_group_name;
}
class UserGroupMembershipError {
report_no_members_to_user_group() {
$("#user_group_membership_error").text(
$t({defaultMessage: "You cannot create a user group with no members!"}),
);
$("#user_group_membership_error").show();
}
clear_errors() {
$("#user_group_membership_error").hide();
}
}
const user_group_membership_error = new UserGroupMembershipError();
class UserGroupNameError {
report_already_exists() {
$("#user_group_name_error").text(
$t({defaultMessage: "A user group with this name already exists"}),
);
$("#user_group_name_error").show();
}
clear_errors() {
$("#user_group_name_error").hide();
}
report_empty_user_group() {
$("#user_group_name_error").text($t({defaultMessage: "A user group needs to have a name"}));
$("#user_group_name_error").show();
}
select() {
$("#create_user_group_name").trigger("focus").trigger("select");
}
pre_validate(user_group_name) {
if (user_group_name && user_groups.get_user_group_from_name(user_group_name)) {
this.report_already_exists();
return;
}
this.clear_errors();
}
validate_for_submit(user_group_name) {
if (!user_group_name) {
this.report_empty_user_group();
this.select();
return false;
}
if (user_groups.get_user_group_from_name(user_group_name)) {
this.report_already_exists();
this.select();
return false;
}
return true;
}
}
const user_group_name_error = new UserGroupNameError();
export function create_user_group_clicked() {
// this changes the tab switcher (settings/preview) which isn't necessary
// to a add new stream title.
user_group_settings_ui.show_user_group_settings_pane.create_user_group();
$(".group-row.active").removeClass("active");
show_new_user_group_modal();
$("#create_user_group_name").trigger("focus");
}
function clear_error_display() {
user_group_name_error.clear_errors();
$(".user_group_create_info").hide();
user_group_membership_error.clear_errors();
}
export function show_new_user_group_modal() {
$("#user-group-creation").removeClass("hide");
$(".right .settings").hide();
user_group_create_members.build_widgets();
clear_error_display();
}
function create_user_group() {
const data = {};
const group_name = $("#create_user_group_name").val().trim();
const description = $("#create_user_group_description").val().trim();
set_name(group_name);
// Even though we already check to make sure that while typing the user cannot enter
// newline characters (by pressing the Enter key) it would still be possible to copy
// and paste over a description with newline characters in it. Prevent that.
if (description.includes("\n")) {
ui_report.client_error(
$t_html({defaultMessage: "The group description cannot contain newline characters."}),
$(".user_group_create_info"),
);
return undefined;
}
data.name = group_name;
data.description = description;
const user_ids = user_group_create_members.get_principals();
data.members = JSON.stringify(user_ids);
loading.make_indicator($("#user_group_creating_indicator"), {
text: $t({defaultMessage: "Creating group..."}),
});
return channel.post({
url: "/json/user_groups/create",
data,
success() {
$("#create_user_group_name").val("");
$("#create_user_group_description").val("");
user_group_create_members.clear_member_list();
ui_report.success(
$t_html({defaultMessage: "User group successfully created!"}),
$(".user_group_create_info"),
);
loading.destroy_indicator($("#user_group_creating_indicator"));
// TODO: The rest of the work should be done via the create event we will get for user group.
},
error(xhr) {
ui_report.error(
$t_html({defaultMessage: "Error creating user group."}),
xhr,
$(".user_group_create_info"),
);
reset_name();
loading.destroy_indicator($("#user_group_creating_indicator"));
},
});
}
export function set_up_handlers() {
const $people_to_add_holder = $("#people_to_add_in_group").expectOne();
user_group_create_members.create_handlers($people_to_add_holder);
const $container = $("#user-group-creation").expectOne();
$container.on("click", ".finalize_create_user_group", (e) => {
e.preventDefault();
clear_error_display();
const group_name = $("#create_user_group_name").val().trim();
const name_ok = user_group_name_error.validate_for_submit(group_name);
if (!name_ok) {
return;
}
const principals = user_group_create_members_data.get_principals();
if (principals.length === 0) {
user_group_membership_error.report_no_members_to_user_group();
return;
}
create_user_group();
});
$container.on("input", "#create_user_group_name", () => {
const user_group_name = $("#create_user_group_name").val().trim();
// This is an inexpensive check.
user_group_name_error.pre_validate(user_group_name);
});
// Do not allow the user to enter newline characters while typing out the
// group's description during it's creation.
$container.on("keydown", "#create_user_group_description", (e) => {
if (keydown_util.is_enter_event(e)) {
e.preventDefault();
}
});
}