Files
zulip/zephyr/static/js/tab_bar.js
Leo Franchi a6486a1fa0 Add a tab bar at the top of the Message list to aid navigation
The intent is that this will also make it easier to tell when you are narrowed.

(imported from commit 5e37721fbad304d30fc725aacf2cc9e6560e9da2)
2013-05-20 23:37:57 -04:00

146 lines
4.7 KiB
JavaScript

var tabbar = (function () {
var exports = {};
function make_tab(title, hash, data, extra_class) {
return {active: "inactive",
cls: extra_class || "",
title: title,
hash: hash,
data: data};
}
function make_tab_data() {
var tabs = [];
if (narrow.active() && narrow.operators().length > 0) {
var ops = narrow.operators();
var hash = hashchange.operators_to_hash(ops);
// Root breadcrumb item: Either Home or All Messages
var operator = ops[0][0];
var operand = ops[0][1];
if ((operator === 'stream' && !narrow.stream_in_home(operand)) ||
(operator === 'in' && operand === 'all')) {
tabs.push(make_tab("All Messages", "#narrow/in/all", undefined, "root"));
} else {
tabs.push(make_tab("Home", "#", "home", "root"));
}
// Second breadcrumb item
var hashed = hashchange.operators_to_hash(ops.slice(0, 1));
if (operator === 'stream') {
tabs.push(make_tab(operand, hashed, operand, 'stream'));
} else if ((operator === 'is' && operand === 'private-message') ||
(operator === 'pm-with')) {
var extra_cls = "";
if (operator === 'pm-with') {
extra_cls = "dark_background";
}
tabs.push(make_tab("Private Messages", '#narrow/is/private-message',
undefined, 'private_message ' + extra_cls));
if (operator === 'pm-with') {
var emails = operand.split(',');
var names = $.map(emails, function (email) {
return people_dict[email].full_name;
});
tabs.push(make_tab(names.join(', '), hashed));
}
} else if (operator === 'is' && operand === 'starred') {
tabs.push(make_tab("Starred", hashed));
} else if (operator === 'sender') {
var sender = people_dict[operand].full_name;
tabs.push(make_tab("Sent by " + sender, hashed));
} else if (operator === 'search') {
// Search is not a clickable link, since we don't have
// a search narrow
tabs.push(make_tab("Search", false));
}
// Third breadcrumb item for stream-subject naarrows
if (ops.length > 1) {
operator = ops[1][0];
operand = ops[1][1];
hashed = hashchange.operators_to_hash(ops.slice(0, 2));
if (operator === 'subject') {
// Colorize text of stream name properly
var stream = ops[0][1];
tabs[tabs.length - 1].cls += ' ' + subs.get_color_class(subs.get_color(stream));
tabs.push(make_tab(operand, hashed));
}
}
} else {
// Just the home view
tabs.push(make_tab("Home", '#', "home", "root"));
}
// Last tab is not a link
tabs[tabs.length - 1].hash = false;
return tabs;
}
function colorize_tab_bar() {
// The active tab color should be the same color as the message list background
var bg_color = $('#main_div').css('background-color');
$('#tab_list .active').css('background-color', bg_color);
$('#tab_bar_underpadding').css('background-color', bg_color);
// The stream tab, if it exists, should be the same color as that stream's chosen color
// Likewise, the border and outline should be the stream color as well
var stream_tab = $('#tab_list .stream');
if (stream_tab.length > 0) {
var stream_name = stream_tab.data('name');
var stream_color = subs.get_color(stream_name);
if (!stream_tab.hasClass('active')) {
stream_tab.css('background-color', stream_color);
}
$('#tab_list li.active').toggleClass('colorize_tab_outline', true);
$('.colorize_tab_outline').css('border-color', stream_color);
}
}
function build_tab_bar() {
var tabs = make_tab_data();
// Insert the narrow spacer between each tab
if (tabs.length > 1) {
var idx = -1;
while (Math.abs(idx) < tabs.length) {
tabs.splice(idx, 0, {cls: "narrow_spacer", icon: true});
idx -= 2;
}
}
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);
colorize_tab_bar();
tab_bar.removeClass('notdisplayed');
}
$(function () {
$(document).on('narrow_activated.zephyr', function (event) {
build_tab_bar();
});
$(document).on('narrow_deactivated.zephyr', function (event) {
build_tab_bar();
});
build_tab_bar();
});
}());