mirror of https://github.com/zulip/zulip.git
98 lines
3.2 KiB
JavaScript
98 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, other_label, 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;
|
||
|
}());
|