mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 15:03:34 +00:00
Instead we infer this from narrow.active(), with the ability to override during the narrowing procedure. (imported from commit fab9c6861f19aedf0ee8af094c1ef4e8a0a73d80)
170 lines
5.3 KiB
JavaScript
170 lines
5.3 KiB
JavaScript
var narrow = (function () {
|
|
|
|
var exports = {};
|
|
|
|
// For tracking where you were before you narrowed.
|
|
var persistent_message_id = 0;
|
|
|
|
// For narrowing based on a particular message
|
|
var target_id = 0;
|
|
|
|
// Narrowing predicate, or 'false' for the home view.
|
|
var narrowed = false;
|
|
|
|
// What sort of narrowing is currently active
|
|
var narrow_type = '';
|
|
|
|
exports.active = function () {
|
|
// Cast to bool
|
|
return !!narrowed;
|
|
};
|
|
|
|
exports.predicate = function () {
|
|
if (narrowed) {
|
|
return narrowed;
|
|
} else {
|
|
return function () { return true; };
|
|
}
|
|
};
|
|
|
|
exports.narrowing_type = function () {
|
|
return narrow_type;
|
|
};
|
|
|
|
function do_narrow(icon, description, filter_function) {
|
|
var was_narrowed = exports.active();
|
|
|
|
narrowed = filter_function;
|
|
|
|
// Your pointer isn't changed when narrowed.
|
|
persistent_message_id = selected_message_id;
|
|
|
|
// Before we clear the table, check if anything was highlighted.
|
|
var highlighted = something_is_highlighted();
|
|
|
|
// Empty the filtered table right before we fill it again
|
|
clear_table('zfilt');
|
|
add_to_table(message_array, 'zfilt', filter_function, 'bottom');
|
|
|
|
// Show the new set of messages.
|
|
$("#zfilt").addClass("focused_table");
|
|
|
|
$("#show_all_messages").removeAttr("disabled");
|
|
$(".narrowed_to_bar").show();
|
|
$("#loading_control").hide();
|
|
$("#top_narrowed_whitespace").show();
|
|
$("#main_div").addClass("narrowed_view");
|
|
$("#searchbox").addClass("narrowed_view");
|
|
$("#currently_narrowed_to").html(icon + " " + description).attr("title", description.replace(/ /g, ""));
|
|
$("#zhome").removeClass("focused_table");
|
|
// Indicate both which message is persistently selected and which
|
|
// is temporarily selected
|
|
select_message_by_id(selected_message_id,
|
|
{then_scroll: false, update_server: false,
|
|
for_narrow: was_narrowed});
|
|
select_message_by_id(target_id,
|
|
{then_scroll: true, update_server: false});
|
|
|
|
// If anything was highlighted before, try to rehighlight it.
|
|
if (highlighted) {
|
|
update_highlight_on_narrow();
|
|
}
|
|
}
|
|
|
|
// This is the message we're about to select, within the narrowed view.
|
|
// But it won't necessarily be selected once the user un-narrows.
|
|
//
|
|
// FIXME: We probably don't need this variable, selected_message_id, *and*
|
|
// persistent_message_id.
|
|
exports.target = function (id) {
|
|
target_id = id;
|
|
};
|
|
|
|
exports.all_huddles = function () {
|
|
narrow_type = "all_huddles";
|
|
do_narrow("<i class='icon-user'></i>", "You and anyone else", function (other) {
|
|
return other.type === "personal" || other.type === "huddle";
|
|
});
|
|
};
|
|
|
|
exports.by_subject = function () {
|
|
var original = message_dict[target_id];
|
|
if (original.type !== 'stream') {
|
|
// Only stream messages have subjects, but the
|
|
// user wants us to narrow in some way.
|
|
exports.by_recipient();
|
|
return;
|
|
}
|
|
|
|
var icon = "<i class='icon-bullhorn'></i>";
|
|
var message = original.display_recipient + " | " + original.subject;
|
|
narrow_type = "subject";
|
|
do_narrow(icon, message, function (other) {
|
|
return (other.type === 'stream' &&
|
|
original.recipient_id === other.recipient_id &&
|
|
original.subject === other.subject);
|
|
});
|
|
};
|
|
|
|
// Called for the 'narrow by stream' hotkey.
|
|
exports.by_recipient = function () {
|
|
var message = message_dict[target_id];
|
|
switch (message.type) {
|
|
case 'personal':
|
|
// Narrow to personals with a specific user
|
|
narrow_type = "huddle";
|
|
do_narrow("<i class='icon-user'></i>", "You and " + message.display_reply_to, function (other) {
|
|
return (other.type === 'personal') &&
|
|
(((other.display_recipient.email === message.display_recipient.email)
|
|
&& (other.sender_email === message.sender_email)) ||
|
|
((other.display_recipient.email === message.sender_email)
|
|
&& (other.sender_email === message.display_recipient.email)));
|
|
});
|
|
break;
|
|
|
|
case 'huddle':
|
|
narrow_type = "huddle";
|
|
do_narrow("<i class='icon-user'></i>", "You and " + message.display_reply_to, function (other) {
|
|
return (other.type === "personal" || other.type === "huddle")
|
|
&& other.reply_to === message.reply_to;
|
|
});
|
|
break;
|
|
|
|
case 'stream':
|
|
narrow_type = "stream";
|
|
do_narrow("<i class='icon-bullhorn'></i>", message.display_recipient, function (other) {
|
|
return (other.type === 'stream' &&
|
|
message.recipient_id === other.recipient_id);
|
|
});
|
|
break;
|
|
}
|
|
};
|
|
|
|
exports.show_all_messages = function () {
|
|
if (!narrowed) {
|
|
return;
|
|
}
|
|
narrowed = false;
|
|
narrow_type = "";
|
|
|
|
$("#zfilt").removeClass('focused_table');
|
|
$("#zhome").addClass('focused_table');
|
|
$(".narrowed_to_bar").hide();
|
|
$("#loading_control").show();
|
|
$("#top_narrowed_whitespace").hide();
|
|
$("#main_div").removeClass('narrowed_view');
|
|
$("#searchbox").removeClass('narrowed_view');
|
|
$("#show_all_messages").attr("disabled", "disabled");
|
|
$("#currently_narrowed_to").html("");
|
|
// Includes scrolling.
|
|
select_message_by_id(persistent_message_id, {then_scroll: true});
|
|
|
|
scroll_to_selected();
|
|
|
|
update_highlight_on_narrow();
|
|
};
|
|
|
|
return exports;
|
|
|
|
}());
|