zulip/static/js/floating_recipient_bar.js

101 lines
3.2 KiB
JavaScript

var floating_recipient_bar = (function () {
var exports = {};
var is_floating_recipient_bar_showing = false;
function show_floating_recipient_bar() {
if (!is_floating_recipient_bar_showing) {
$("#floating_recipient_bar").css('visibility', 'visible');
is_floating_recipient_bar_showing = true;
}
}
var old_label;
function replace_floating_recipient_bar(desired_label) {
var new_label;
var other_label;
var header;
if (desired_label !== old_label) {
if (desired_label.children(".message_header_stream").length !== 0) {
new_label = $("#current_label_stream");
other_label = $("#current_label_private_message");
header = desired_label.children(".message_header_stream");
} else {
new_label = $("#current_label_private_message");
other_label = $("#current_label_stream");
header = desired_label.children(".message_header_private_message");
}
new_label.find(".message_header").replaceWith(header.clone());
other_label.css('display', 'none');
new_label.css('display', 'block');
new_label.attr("zid", rows.id(rows.first_message_in_group(desired_label)));
new_label.toggleClass('faded', desired_label.hasClass('faded'));
old_label = desired_label;
}
show_floating_recipient_bar();
}
exports.hide = function () {
if (is_floating_recipient_bar_showing) {
$("#floating_recipient_bar").css('visibility', 'hidden');
is_floating_recipient_bar_showing = false;
}
};
exports.update = function () {
var floating_recipient_bar = $("#floating_recipient_bar");
var floating_recipient_bar_top = floating_recipient_bar.offset().top;
var floating_recipient_bar_bottom =
floating_recipient_bar_top + floating_recipient_bar.outerHeight();
// Find the last message where the top of the recipient
// row is at least partially occluded by our box.
// Start with the pointer's current location.
var selected_row = current_msg_list.selected_row();
if (selected_row === undefined || selected_row.length === 0) {
return;
}
var candidate = rows.get_message_recipient_row(selected_row);
if (candidate === undefined) {
return;
}
while (true) {
if (candidate.length === 0) {
// We're at the top of the page and no labels are above us.
exports.hide();
return;
}
if (candidate.is(".recipient_row")) {
if (candidate.offset().top < floating_recipient_bar_bottom) {
break;
}
}
candidate = candidate.prev();
}
var current_label = candidate;
// We now know what the floating stream/subject bar should say.
// Do we show it?
// Hide if the bottom of our floating stream/subject label is not
// lower than the bottom of current_label (since that means we're
// covering up a label that already exists).
var header_height = $(current_label).find('.message_header').outerHeight();
if (floating_recipient_bar_bottom <=
(current_label.offset().top + header_height)) {
exports.hide();
return;
}
replace_floating_recipient_bar(current_label);
};
return exports;
}());