mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 22:13:26 +00:00
This commits improves how we handle <a> tags within the navbar description. The code previously overlaid click regions on top of each other, which was messy and probably somehow buggy. It is cleaner if we just check if the click was on an <a> tag or not.
174 lines
6.0 KiB
JavaScript
174 lines
6.0 KiB
JavaScript
const render_tab_bar = require('../templates/tab_bar.hbs');
|
|
|
|
function get_sub_count(current_stream) {
|
|
const sub_count = current_stream.subscriber_count;
|
|
return sub_count;
|
|
}
|
|
|
|
function get_formatted_sub_count(current_stream) {
|
|
let sub_count = get_sub_count(current_stream);
|
|
if (sub_count >= 1000) {
|
|
// parseInt() is used to floor the value of division to an integer
|
|
sub_count = parseInt(sub_count / 1000, 10) + "k";
|
|
}
|
|
return sub_count;
|
|
}
|
|
|
|
function make_tab_data(filter) {
|
|
const tab_data = {};
|
|
if (filter === undefined) {
|
|
return {
|
|
title: 'All messages',
|
|
icon: 'home',
|
|
};
|
|
}
|
|
tab_data.title = filter.get_title();
|
|
tab_data.icon = filter.get_icon();
|
|
if (tab_data.icon === 'hashtag' || tab_data.icon === 'lock') {
|
|
const stream = filter.operands("stream")[0];
|
|
const current_stream = stream_data.get_sub_by_name(stream);
|
|
if (current_stream) {
|
|
tab_data.rendered_narrow_description = current_stream.rendered_description;
|
|
tab_data.sub_count = get_sub_count(current_stream);
|
|
tab_data.formatted_sub_count = get_formatted_sub_count(current_stream);
|
|
tab_data.stream_settings_link = "#streams/" + current_stream.stream_id + "/" + current_stream.name;
|
|
} else {
|
|
tab_data.title = 'Unknown Stream';
|
|
tab_data.sub_count = '0';
|
|
tab_data.formatted_sub_count = '0';
|
|
tab_data.rendered_narrow_description = "This stream does not exist or is private.";
|
|
}
|
|
}
|
|
return tab_data;
|
|
}
|
|
|
|
exports.colorize_tab_bar = function () {
|
|
const filter = narrow_state.filter();
|
|
if (filter === undefined || !filter.has_operator('stream')) {return;}
|
|
const color_for_stream = stream_data.get_color(filter.operands("stream")[0]);
|
|
const stream_light = colorspace.getHexColor(colorspace.getDecimalColor(color_for_stream));
|
|
$("#tab_list .fa-hashtag").css('color', stream_light);
|
|
$("#tab_list .fa-lock").css('color', stream_light);
|
|
};
|
|
|
|
function display_tab_bar(tab_bar_data) {
|
|
const tab_bar = $("#tab_bar");
|
|
tab_bar.empty();
|
|
const rendered = render_tab_bar(tab_bar_data);
|
|
tab_bar.append(rendered);
|
|
if (tab_bar_data.stream_settings_link) {
|
|
exports.colorize_tab_bar();
|
|
}
|
|
tab_bar.removeClass('notdisplayed');
|
|
}
|
|
|
|
function build_tab_bar(filter) {
|
|
// This makes sure we don't waste time appending tab_bar on a template where it's never used
|
|
if (filter && !filter.is_common_narrow()) {
|
|
exports.open_search_bar_and_close_narrow_description();
|
|
} else {
|
|
const tab_bar_data = make_tab_data(filter);
|
|
display_tab_bar(tab_bar_data);
|
|
|
|
$(".search_closed").on("click", function (e) {
|
|
exports.open_search_bar_and_close_narrow_description();
|
|
search.initiate_search();
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
});
|
|
|
|
$("#tab_list span:nth-last-child(2)").on("click", function (e) {
|
|
if (document.getSelection().type === "Range") {
|
|
// Allow copy/paste to work normally without interference.
|
|
return;
|
|
}
|
|
|
|
// Let links behave normally, ie, do nothing if <a>
|
|
if ($(e.target).closest("a").length === 0) {
|
|
exports.open_search_bar_and_close_narrow_description();
|
|
search.initiate_search();
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
});
|
|
|
|
const color = $(".search_closed").css("color");
|
|
const night_mode_color = $(".nightmode .closed_icon").css("color");
|
|
|
|
// make sure that hover plays nicely with whether search is being
|
|
// opened or not.
|
|
$(".narrow_description > a").hover(function () {
|
|
if (night_mode_color) {
|
|
$(".search_closed").css("color", night_mode_color);
|
|
} else {
|
|
$(".search_closed").css("color", color);
|
|
}
|
|
}, function () {
|
|
$(".search_closed").css("color", "");
|
|
});
|
|
|
|
exports.close_search_bar_and_open_narrow_description();
|
|
}
|
|
}
|
|
|
|
exports.exit_search = function () {
|
|
const filter = narrow_state.filter();
|
|
if (!filter || filter.is_common_narrow()) {
|
|
// for common narrows, we change the UI (and don't redirect)
|
|
exports.close_search_bar_and_open_narrow_description();
|
|
|
|
// reset searchbox text
|
|
const search_string = narrow_state.search_string();
|
|
// This does not need to be conditional like the corresponding
|
|
// function call in narrow.activate because search filters are
|
|
// not common narrows
|
|
if (search_string !== "") {
|
|
$("#search_query").val(search_string + " ");
|
|
}
|
|
} else {
|
|
// for "searching narrows", we redirect
|
|
window.location.replace(filter.generate_redirect_url());
|
|
}
|
|
};
|
|
|
|
exports.update_stream_name = function (new_name) {
|
|
const stream_name = $(".stream a");
|
|
if (stream_name !== undefined) {
|
|
stream_name.text(new_name);
|
|
}
|
|
};
|
|
|
|
exports.update_stream_description = function () {
|
|
// TODO: Implement this properly. Really, this and update_stream
|
|
// name should just do a full rerender of the tab_tab component;
|
|
// they're rare events and that rendering is cheap.
|
|
|
|
// TODO: Do similar rerenders for stream privacy or subscriber
|
|
// count changes.
|
|
return;
|
|
};
|
|
|
|
exports.initialize = function () {
|
|
const filter = narrow_state.filter();
|
|
build_tab_bar(filter);
|
|
|
|
// register navbar click handlers
|
|
$('#search_exit').on("click", function (e) {
|
|
tab_bar.exit_search();
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
});
|
|
};
|
|
|
|
exports.open_search_bar_and_close_narrow_description = function () {
|
|
$(".navbar-search").addClass("expanded");
|
|
$("#tab_list").addClass("hidden");
|
|
};
|
|
|
|
exports.close_search_bar_and_open_narrow_description = function () {
|
|
$(".navbar-search").removeClass("expanded");
|
|
$("#tab_list").removeClass("hidden");
|
|
};
|
|
|
|
window.tab_bar = exports;
|