mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
We now initialize most modules in ui_init.js, which
isn't the perfect place to do it, but at least now
we have a mostly consolidated entry point.
All the new foo.initialize() methods introduced in
this module run the same order relative to each
other as before this commit. (I did some console
logging with a hacked version of the program to
get the order right.) They happen a bit later than
before, though.
A couple modules still have the `$(function() {`
idiom for miscellaneous reasons:
archive - is a different bundle
common - used elsewhere
list_render - non-standard code style
scroll_bar - no exports
setup - probably special?
socket - $(function () is nested!
transmit - coupled to socket
translations - i18n is a bigger problem
ui_init - this bootstraps everything
186 lines
6.1 KiB
JavaScript
186 lines
6.1 KiB
JavaScript
var tab_bar = (function () {
|
|
|
|
var exports = {};
|
|
|
|
function make_tab(title, hash, data, extra_class, home) {
|
|
return {active: "inactive",
|
|
cls: extra_class || "",
|
|
title: title,
|
|
hash: hash,
|
|
data: data,
|
|
home: home || false };
|
|
}
|
|
|
|
function make_tab_data() {
|
|
var tabs = [];
|
|
var filter = narrow_state.filter();
|
|
|
|
function filtered_to_non_home_view_stream() {
|
|
if (!filter.has_operator('stream')) {
|
|
return false;
|
|
}
|
|
var stream_name = filter.operands('stream')[0];
|
|
var stream_id = stream_data.get_stream_id(stream_name);
|
|
if (!stream_id) {
|
|
return true;
|
|
}
|
|
|
|
return !stream_data.in_home_view(stream_id);
|
|
}
|
|
|
|
function in_all() {
|
|
return (filter !== undefined &&
|
|
(filtered_to_non_home_view_stream() ||
|
|
filter.has_operand("in", "all")));
|
|
}
|
|
|
|
if (in_all()) {
|
|
tabs.push(make_tab("All Messages", "#narrow/in/all", undefined, "root"));
|
|
} else if (page_params.narrow !== undefined) {
|
|
tabs.push(make_tab("Stream " + page_params.narrow_stream,
|
|
hashchange.operators_to_hash([page_params.narrow[0]]),
|
|
page_params.narrow_stream, 'stream'));
|
|
if (page_params.narrow_topic !== undefined) {
|
|
tabs.push(make_tab("Topic " + page_params.narrow_topic,
|
|
hashchange.operators_to_hash(page_params.narrow),
|
|
null));
|
|
}
|
|
}
|
|
|
|
if (narrow_state.active() && narrow_state.operators().length > 0) {
|
|
var stream;
|
|
var ops = narrow_state.operators();
|
|
// Second breadcrumb item
|
|
var hashed = hashchange.operators_to_hash(ops.slice(0, 1));
|
|
if (filter.has_operator("stream")) {
|
|
stream = filter.operands("stream")[0];
|
|
tabs.push(make_tab(stream, hashed, stream, 'stream'));
|
|
} else if (filter.has_operator("pm-with") ||
|
|
filter.has_operand("is", "private")) {
|
|
|
|
tabs.push(make_tab("Private Messages", '#narrow/is/private',
|
|
undefined, 'private_message '));
|
|
|
|
if (filter.has_operator("pm-with")) {
|
|
var emails = filter.operands("pm-with")[0].split(',');
|
|
var names = _.map(emails, function (email) {
|
|
if (! people.get_by_email(email)) {
|
|
return email;
|
|
}
|
|
return people.get_by_email(email).full_name;
|
|
});
|
|
|
|
tabs.push(make_tab(names.join(', '), hashed));
|
|
}
|
|
|
|
} else if (filter.has_operator("group-pm-with")) {
|
|
|
|
tabs.push(make_tab("Group Private", '#narrow/group-pm-with',
|
|
undefined, 'private_message '));
|
|
|
|
|
|
} else if (filter.has_operand("is", "starred")) {
|
|
tabs.push(make_tab("Starred", hashed));
|
|
} else if (filter.has_operator("near")) {
|
|
tabs.push(make_tab("Near " + filter.operands("near")[0], hashed));
|
|
} else if (filter.has_operator("id")) {
|
|
tabs.push(make_tab("ID " + filter.operands("id")[0], hashed));
|
|
} else if (filter.has_operand("is", "mentioned")) {
|
|
tabs.push(make_tab("Mentions", hashed));
|
|
} else if (filter.has_operator("sender")) {
|
|
var sender = filter.operands("sender")[0];
|
|
if (people.get_by_email(sender)) {
|
|
sender = people.get_by_email(sender).full_name;
|
|
}
|
|
tabs.push(make_tab("Sent by " + sender, hashed));
|
|
} else if (filter.has_operator("search")) {
|
|
// Search is not a clickable link, since we don't have
|
|
// a search narrow
|
|
tabs.push(make_tab("Search results", false));
|
|
}
|
|
|
|
// Third breadcrumb item for stream-subject naarrows
|
|
if (filter.has_operator("stream") &&
|
|
filter.has_operator("topic")) {
|
|
var subject = filter.operands("topic")[0];
|
|
hashed = hashchange.operators_to_hash(ops.slice(0, 2));
|
|
|
|
tabs.push(make_tab(subject, hashed, null));
|
|
}
|
|
}
|
|
|
|
if (tabs.length === 0) {
|
|
tabs.push(make_tab('All messages', "#", "home", "root", true));
|
|
}
|
|
|
|
// Last tab is not a link
|
|
tabs[tabs.length - 1].hash = null;
|
|
|
|
return tabs;
|
|
}
|
|
|
|
exports.colorize_tab_bar = function () {
|
|
var stream_tab = $('#tab_list .stream');
|
|
if (stream_tab.length > 0) {
|
|
var stream_name = stream_tab.data('name');
|
|
if (stream_name === undefined) {
|
|
return;
|
|
}
|
|
stream_name = stream_name.toString();
|
|
|
|
var color_for_stream = stream_data.get_color(stream_name);
|
|
var stream_dark = stream_color.get_color_class(color_for_stream);
|
|
var stream_light = colorspace.getHexColor(
|
|
colorspace.getLighterColor(
|
|
colorspace.getDecimalColor(color_for_stream), 0.2));
|
|
|
|
if (stream_tab.hasClass("stream")) {
|
|
stream_tab.css('background-color', color_for_stream);
|
|
if (stream_tab.hasClass("inactive")) {
|
|
stream_tab.hover (
|
|
function () {
|
|
$(this).css('background-color', stream_light);
|
|
}, function () {
|
|
$(this).css('background-color', color_for_stream);
|
|
}
|
|
);
|
|
}
|
|
stream_tab.removeClass(stream_color.color_classes);
|
|
stream_tab.addClass(stream_dark);
|
|
}
|
|
}
|
|
};
|
|
|
|
function build_tab_bar() {
|
|
var tabs = make_tab_data();
|
|
|
|
var tab_bar = $("#tab_bar");
|
|
tab_bar.empty();
|
|
|
|
tabs[tabs.length - 1].active = "active";
|
|
var rendered = templates.render('tab_bar', {tabs: tabs});
|
|
|
|
tab_bar.append(rendered);
|
|
exports.colorize_tab_bar();
|
|
tab_bar.removeClass('notdisplayed');
|
|
}
|
|
|
|
exports.initialize = function () {
|
|
$(document).on('narrow_activated.zulip', function () {
|
|
build_tab_bar();
|
|
});
|
|
$(document).on('narrow_deactivated.zulip', function () {
|
|
build_tab_bar();
|
|
});
|
|
|
|
build_tab_bar();
|
|
};
|
|
|
|
return exports;
|
|
|
|
}());
|
|
|
|
if (typeof module !== 'undefined') {
|
|
module.exports = tab_bar;
|
|
}
|