mirror of
https://github.com/zulip/zulip.git
synced 2025-11-22 07:21:23 +00:00
Implement full history search by creating a narrow for a search term
(imported from commit 3f2df6a6e590458ff774bbd658bbd1d95076a4db)
This commit is contained in:
@@ -57,6 +57,7 @@ var globals =
|
|||||||
+ ' selected_message selected_message_id'
|
+ ' selected_message selected_message_id'
|
||||||
+ ' at_top_of_viewport at_bottom_of_viewport'
|
+ ' at_top_of_viewport at_bottom_of_viewport'
|
||||||
+ ' viewport'
|
+ ' viewport'
|
||||||
|
+ ' load_more_messages'
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,14 @@ exports.narrowing_type = function () {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.allow_collapse = function () {
|
||||||
|
if (narrowdata && narrowdata.allow_collapse !== undefined) {
|
||||||
|
return narrowdata.allow_collapse;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
exports.data = function () {
|
exports.data = function () {
|
||||||
return narrowdata;
|
return narrowdata;
|
||||||
};
|
};
|
||||||
@@ -52,11 +60,12 @@ function do_narrow(new_narrow, bar, new_filter) {
|
|||||||
|
|
||||||
// Empty the filtered table right before we fill it again
|
// Empty the filtered table right before we fill it again
|
||||||
clear_table('zfilt');
|
clear_table('zfilt');
|
||||||
add_to_table(message_array, 'zfilt', filter_function, 'bottom');
|
add_to_table(message_array, 'zfilt', filter_function, 'bottom', exports.allow_collapse());
|
||||||
|
|
||||||
// Show the new set of messages.
|
// Show the new set of messages.
|
||||||
$("#zfilt").addClass("focused_table");
|
$("#zfilt").addClass("focused_table");
|
||||||
|
|
||||||
|
$("#load_more").show();
|
||||||
$("#show_all_messages").removeAttr("disabled");
|
$("#show_all_messages").removeAttr("disabled");
|
||||||
$(".narrowed_to_bar").show();
|
$(".narrowed_to_bar").show();
|
||||||
$("#top_narrowed_whitespace").show();
|
$("#top_narrowed_whitespace").show();
|
||||||
@@ -180,6 +189,17 @@ exports.by_recipient = function () {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.by_search_term = function (term) {
|
||||||
|
var new_narrow = {type: "searchterm", searchterm: term, allow_collapse: false};
|
||||||
|
var bar = {icon: 'search', description: 'Messages containing "' + term + '"'};
|
||||||
|
var term_lowercase = term.toLowerCase();
|
||||||
|
do_narrow(new_narrow, bar, function (other) {
|
||||||
|
return other.subject.toLowerCase().indexOf(term_lowercase) !== -1 ||
|
||||||
|
other.content.toLowerCase().indexOf(term_lowercase) !== -1;
|
||||||
|
});
|
||||||
|
load_more_messages();
|
||||||
|
};
|
||||||
|
|
||||||
exports.show_all_messages = function () {
|
exports.show_all_messages = function () {
|
||||||
if (!narrowdata) {
|
if (!narrowdata) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -13,11 +13,13 @@ var mapped = {};
|
|||||||
|
|
||||||
function render_object(obj) {
|
function render_object(obj) {
|
||||||
if (obj.action === 'search') {
|
if (obj.action === 'search') {
|
||||||
return "Search for " + obj.query;
|
return "Find " + obj.query;
|
||||||
} else if (obj.action === 'stream') {
|
} else if (obj.action === 'stream') {
|
||||||
return "Narrow to stream " + obj.query;
|
return "Narrow to stream " + obj.query;
|
||||||
} else if (obj.action === 'private_message') {
|
} else if (obj.action === 'private_message') {
|
||||||
return "Narrow to person " + obj.query.full_name + " <" + obj.query.email + ">";
|
return "Narrow to person " + obj.query.full_name + " <" + obj.query.email + ">";
|
||||||
|
} else if (obj.action === 'search_narrow') {
|
||||||
|
return "Narrow to messages containing " + obj.query;
|
||||||
}
|
}
|
||||||
return "Error";
|
return "Error";
|
||||||
}
|
}
|
||||||
@@ -30,7 +32,8 @@ exports.update_typeahead = function() {
|
|||||||
return {action: 'private_message', query: elt};
|
return {action: 'private_message', query: elt};
|
||||||
});
|
});
|
||||||
var options = streams.concat(people);
|
var options = streams.concat(people);
|
||||||
// The first slot is reserved for our query.
|
// The first two slots are reserved for our query.
|
||||||
|
options.unshift({action: 'search_narrow', query: ''});
|
||||||
options.unshift({action: 'search', query: ''});
|
options.unshift({action: 'search', query: ''});
|
||||||
|
|
||||||
mapped = {};
|
mapped = {};
|
||||||
@@ -55,6 +58,9 @@ function narrow_or_search_for_term(item) {
|
|||||||
} else if (obj.action === "private_message") {
|
} else if (obj.action === "private_message") {
|
||||||
narrow.by_private_message_partner(obj.query.full_name, obj.query.email);
|
narrow.by_private_message_partner(obj.query.full_name, obj.query.email);
|
||||||
return "";
|
return "";
|
||||||
|
} else if (obj.action === "search_narrow") {
|
||||||
|
narrow.by_search_term(obj.query);
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
@@ -62,17 +68,23 @@ function narrow_or_search_for_term(item) {
|
|||||||
exports.initialize = function () {
|
exports.initialize = function () {
|
||||||
$( "#search_query" ).typeahead({
|
$( "#search_query" ).typeahead({
|
||||||
source: function (query, process) {
|
source: function (query, process) {
|
||||||
// Delete our old search query
|
// Delete our old search queries (one for search-in-page, one for search-history)
|
||||||
var old_label = labels.shift();
|
var old_search_label = labels.shift();
|
||||||
delete mapped[old_label];
|
delete mapped[old_search_label];
|
||||||
// Add our new one
|
var old_search_narrow_label = labels.shift();
|
||||||
var obj = {action: 'search', query: query};
|
delete mapped[old_search_narrow_label];
|
||||||
|
// Add our new ones
|
||||||
|
var obj = {action: 'search_narrow', query: query};
|
||||||
var label = render_object(obj);
|
var label = render_object(obj);
|
||||||
mapped[label] = obj;
|
mapped[label] = obj;
|
||||||
labels.unshift(label);
|
labels.unshift(label);
|
||||||
|
obj = {action: 'search', query: query};
|
||||||
|
label = render_object(obj);
|
||||||
|
mapped[label] = obj;
|
||||||
|
labels.unshift(label);
|
||||||
return labels;
|
return labels;
|
||||||
},
|
},
|
||||||
items: 3,
|
items: 4,
|
||||||
highlighter: function (item) {
|
highlighter: function (item) {
|
||||||
var query = this.query;
|
var query = this.query;
|
||||||
var string_item = render_object(mapped[item]);
|
var string_item = render_object(mapped[item]);
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ function add_display_time(message, prev) {
|
|||||||
message.full_date_str = time.toDateString() + " " + time.toTimeString();
|
message.full_date_str = time.toDateString() + " " + time.toTimeString();
|
||||||
}
|
}
|
||||||
|
|
||||||
function add_to_table(messages, table_name, filter_function, where) {
|
function add_to_table(messages, table_name, filter_function, where, allow_collapse) {
|
||||||
if (messages.length === 0)
|
if (messages.length === 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -301,7 +301,7 @@ function add_to_table(messages, table_name, filter_function, where) {
|
|||||||
|
|
||||||
message.include_recipient = false;
|
message.include_recipient = false;
|
||||||
message.include_bookend = false;
|
message.include_bookend = false;
|
||||||
if (same_recipient(prev, message)) {
|
if (same_recipient(prev, message) && allow_collapse) {
|
||||||
current_group.push(message.id);
|
current_group.push(message.id);
|
||||||
} else {
|
} else {
|
||||||
if (current_group.length > 0)
|
if (current_group.length > 0)
|
||||||
@@ -466,11 +466,11 @@ function add_messages(messages, where, add_to_home) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (narrow.active())
|
if (narrow.active())
|
||||||
add_to_table(messages, 'zfilt', narrow.predicate(), where);
|
add_to_table(messages, 'zfilt', narrow.predicate(), where, narrow.allow_collapse());
|
||||||
|
|
||||||
// Even when narrowed, add messages to the home view so they exist when we un-narrow.
|
// Even when narrowed, add messages to the home view so they exist when we un-narrow.
|
||||||
if (add_to_home)
|
if (add_to_home)
|
||||||
add_to_table(messages, 'zhome', function () { return true; }, where);
|
add_to_table(messages, 'zhome', function () { return true; }, where, true);
|
||||||
|
|
||||||
// If we received the initially selected message, select it on the client side,
|
// If we received the initially selected message, select it on the client side,
|
||||||
// but not if the user has already selected another one during load.
|
// but not if the user has already selected another one during load.
|
||||||
|
|||||||
@@ -238,6 +238,10 @@ def get_old_messages_backend(request, anchor = POST(converter=to_non_negative_in
|
|||||||
if 'subject' in narrow:
|
if 'subject' in narrow:
|
||||||
query = query.filter(subject = narrow['subject'])
|
query = query.filter(subject = narrow['subject'])
|
||||||
|
|
||||||
|
if 'searchterm' in narrow:
|
||||||
|
query = query.filter(Q(content__icontains=narrow['searchterm']) |
|
||||||
|
Q(subject__icontains=narrow['searchterm']))
|
||||||
|
|
||||||
# We add 1 to the number of messages requested to ensure that the
|
# We add 1 to the number of messages requested to ensure that the
|
||||||
# resulting list always contains the anchor message
|
# resulting list always contains the anchor message
|
||||||
if num_before != 0 and num_after == 0:
|
if num_before != 0 and num_after == 0:
|
||||||
|
|||||||
Reference in New Issue
Block a user