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>
This commit is contained in:
Anders Kaseorg
2023-02-22 14:03:47 -08:00
parent be0098146c
commit c1675913a2
866 changed files with 978 additions and 993 deletions

View File

@@ -0,0 +1,131 @@
import $ from "jquery";
import * as compose_actions from "./compose_actions";
import {$t} from "./i18n";
import * as message_lists from "./message_lists";
import * as message_store from "./message_store";
import * as narrow_state from "./narrow_state";
import * as people from "./people";
export function get_recipient_label(message) {
// TODO: This code path is bit of a type-checking disaster; we mix
// actual message objects with fake objects containing just a
// couple fields, both those constructed here and potentially
// passed in.
if (message === undefined) {
if (message_lists.current.empty()) {
// For empty narrows where there's a clear reply target,
// i.e. stream+topic or a single PM conversation, we label
// the button as replying to the thread.
if (narrow_state.narrowed_to_topic()) {
message = {
stream: narrow_state.stream(),
topic: narrow_state.topic(),
};
} else if (narrow_state.pm_ids_string()) {
// TODO: This is a total hack. Ideally, we'd rework
// this to not duplicate the actual compose_actions.js
// logic for what happens when you click the button,
// and not call into random modules with hacky fake
// "message" objects.
const user_ids = people.user_ids_string_to_ids_array(narrow_state.pm_ids_string());
const user_ids_dicts = user_ids.map((user_id) => ({id: user_id}));
message = {
display_reply_to: message_store.get_pm_full_names({
type: "private",
display_recipient: user_ids_dicts,
}),
};
}
} else {
message = message_lists.current.selected_message();
}
}
if (message) {
if (message.stream && message.topic) {
return "#" + message.stream + " > " + message.topic;
} else if (message.display_reply_to) {
return message.display_reply_to;
}
}
return "";
}
function update_stream_button(btn_text, title) {
$("#left_bar_compose_stream_button_big").text(btn_text);
$("#left_bar_compose_stream_button_big").prop("title", title);
}
function update_conversation_button(btn_text, title) {
$("#left_bar_compose_private_button_big").text(btn_text);
$("#left_bar_compose_private_button_big").prop("title", title);
}
function update_buttons(text_stream) {
const title_stream = text_stream + " (c)";
const text_conversation = $t({defaultMessage: "New private message"});
const title_conversation = text_conversation + " (x)";
update_stream_button(text_stream, title_stream);
update_conversation_button(text_conversation, title_conversation);
}
export function update_buttons_for_private() {
const text_stream = $t({defaultMessage: "New stream message"});
update_buttons(text_stream);
}
export function update_buttons_for_stream() {
const text_stream = $t({defaultMessage: "New topic"});
update_buttons(text_stream);
}
export function update_buttons_for_recent_topics() {
const text_stream = $t({defaultMessage: "New stream message"});
update_buttons(text_stream);
}
function set_reply_button_label(label) {
$(".compose_reply_button_label").text(label);
}
export function set_standard_text_for_reply_button() {
set_reply_button_label($t({defaultMessage: "Compose message"}));
}
export function update_reply_recipient_label(message) {
const recipient_label = get_recipient_label(message);
if (recipient_label) {
set_reply_button_label(
$t({defaultMessage: "Message {recipient_label}"}, {recipient_label}),
);
} else {
set_standard_text_for_reply_button();
}
}
export function initialize() {
// When the message selection changes, change the label on the Reply button.
$(document).on("message_selected.zulip", () => {
if (narrow_state.is_message_feed_visible()) {
// message_selected events can occur with recent topics
// open due to "All messages" loading in the background,
// so we only update if message feed is visible.
update_reply_recipient_label();
}
});
// Click handlers for buttons in the compose box.
$("body").on("click", ".compose_stream_button", () => {
compose_actions.start("stream", {trigger: "new topic button"});
});
$("body").on("click", ".compose_private_button", () => {
compose_actions.start("private", {trigger: "new private message"});
});
$("body").on("click", ".compose_reply_button", () => {
compose_actions.respond_to_message({trigger: "reply button"});
});
}