diff --git a/frontend_tests/casper_tests/03-narrow.js b/frontend_tests/casper_tests/03-narrow.js
index 7b2d9eeef0..7d8fca660a 100644
--- a/frontend_tests/casper_tests/03-narrow.js
+++ b/frontend_tests/casper_tests/03-narrow.js
@@ -253,28 +253,28 @@ expect_home();
// Narrow by typing in search strings or operators.
// Test stream / recipient autocomplete in the search bar
-search_and_check('Verona', 'Narrow to stream', expect_stream,
+search_and_check('Verona', 'Stream', expect_stream,
'Verona - Zulip Dev - Zulip');
-search_and_check('Cordelia', 'Narrow to private', expect_1on1,
+search_and_check('Cordelia', 'Private', expect_1on1,
'private - Zulip Dev - Zulip');
// Test operators
-search_and_check('stream:Verona', 'Narrow', expect_stream,
+search_and_check('stream:Verona', '', expect_stream,
'Verona - Zulip Dev - Zulip');
-search_and_check('stream:Verona subject:frontend+test', 'Narrow', expect_stream_subject,
+search_and_check('stream:Verona subject:frontend+test', '', expect_stream_subject,
'frontend test - Zulip Dev - Zulip');
-search_and_check('stream:Verona topic:frontend+test', 'Narrow', expect_stream_subject,
+search_and_check('stream:Verona topic:frontend+test', '', expect_stream_subject,
'frontend test - Zulip Dev - Zulip');
-search_and_check('subject:frontend+test', 'Narrow', expect_subject,
+search_and_check('subject:frontend+test', '', expect_subject,
'home - Zulip Dev - Zulip');
-search_silent_user('sender:emailgateway@zulip.com', 'Narrow');
+search_silent_user('sender:emailgateway@zulip.com', '');
-search_non_existing_user('sender:dummyuser@zulip.com', 'Narrow');
+search_non_existing_user('sender:dummyuser@zulip.com', '');
// Narrow by clicking the left sidebar.
casper.then(function () {
diff --git a/frontend_tests/node_tests/filter.js b/frontend_tests/node_tests/filter.js
index 25ae4d0a46..8b2fef4959 100644
--- a/frontend_tests/node_tests/filter.js
+++ b/frontend_tests/node_tests/filter.js
@@ -464,6 +464,10 @@ function make_sub(name, stream_id) {
{operator: 'search', operand: ':stream: -:emoji: are cool'},
];
_test();
+
+ string = '';
+ operators = [];
+ _test();
}());
(function test_unparse() {
@@ -489,6 +493,12 @@ function make_sub(name, stream_id) {
];
string = 'near:150';
assert.deepEqual(Filter.unparse(operators), string);
+
+ operators = [
+ {operator: '', operand: ''},
+ ];
+ string = '';
+ assert.deepEqual(Filter.unparse(operators), string);
}());
(function test_describe() {
@@ -499,85 +509,86 @@ function make_sub(name, stream_id) {
{operator: 'stream', operand: 'devel'},
{operator: 'is', operand: 'starred'},
];
- string = 'Narrow to stream devel, Narrow to starred messages';
+ string = 'stream devel, starred messages';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'stream', operand: 'devel'},
{operator: 'topic', operand: 'JS'},
];
- string = 'Narrow to devel > JS';
+ string = 'stream devel > JS';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'is', operand: 'private'},
{operator: 'search', operand: 'lunch'},
];
- string = 'Narrow to all private messages, Search for lunch';
+ string = 'private messages, search for lunch';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'id', operand: 99},
];
- string = 'Narrow to message ID 99';
+ string = 'message ID 99';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'in', operand: 'home'},
];
- string = 'Narrow to messages in home';
+ string = 'messages in home';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'is', operand: 'mentioned'},
];
- string = 'Narrow to mentioned messages';
+ string = '@-mentions';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'is', operand: 'alerted'},
];
- string = 'Narrow to alerted messages';
+ string = 'alerted messages';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'is', operand: 'something_we_do_not_support'},
];
- string = 'Narrow to (unknown operator)';
+ string = 'unknown operand';
assert.equal(Filter.describe(narrow), string);
+ // this should be unreachable, but just in case
narrow = [
{operator: 'bogus', operand: 'foo'},
];
- string = 'Narrow to (unknown operator)';
+ string = 'unknown operand';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'stream', operand: 'devel'},
{operator: 'topic', operand: 'JS', negated: true},
];
- string = 'Narrow to stream devel, Exclude topic JS';
+ string = 'stream devel, exclude topic JS';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'is', operand: 'private'},
{operator: 'search', operand: 'lunch', negated: true},
];
- string = 'Narrow to all private messages, Exclude lunch';
+ string = 'private messages, exclude lunch';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'stream', operand: 'devel'},
{operator: 'is', operand: 'starred', negated: true},
];
- string = 'Narrow to stream devel, Exclude starred messages';
+ string = 'stream devel, exclude starred messages';
assert.equal(Filter.describe(narrow), string);
narrow = [
{operator: 'stream', operand: 'devel'},
{operator: 'has', operand: 'image', negated: true},
];
- string = 'Narrow to stream devel, Exclude messages with one or more image';
+ string = 'stream devel, exclude messages with one or more image';
assert.equal(Filter.describe(narrow), string);
narrow = [];
diff --git a/frontend_tests/node_tests/search_suggestion.js b/frontend_tests/node_tests/search_suggestion.js
index cda3b215eb..085d075789 100644
--- a/frontend_tests/node_tests/search_suggestion.js
+++ b/frontend_tests/node_tests/search_suggestion.js
@@ -422,7 +422,7 @@ init();
assert.equal(describe('is:mentioned'), '@-mentions');
assert.equal(describe('is:alerted'), 'Alerted messages');
assert.equal(describe('sender:bob@zulip.com'), 'Sent by me');
- assert.equal(describe('stream:devel'), 'Narrow to stream devel');
+ assert.equal(describe('stream:devel'), 'Stream devel');
}());
(function test_sent_by_me_suggestions() {
@@ -557,7 +557,7 @@ init();
return suggestions.lookup_table[q].description;
}
assert.equal(describe('te'), "Search for te");
- assert.equal(describe('stream:office topic:team'), "Narrow to office > team");
+ assert.equal(describe('stream:office topic:team'), "Stream office > team");
suggestions = search.get_suggestions('topic:staplers stream:office');
expected = [
@@ -718,9 +718,9 @@ init();
return suggestions.lookup_table[q].description;
}
assert.equal(describe('pm-with:ted@zulip.com'),
- "Narrow to private messages with Ted Smith <ted@zulip.com>");
+ "Private messages with Ted Smith <ted@zulip.com>");
assert.equal(describe('sender:ted@zulip.com'),
- "Narrow to messages sent by Ted Smith <ted@zulip.com>");
+ "Messages sent by Ted Smith <ted@zulip.com>");
suggestions = search.get_suggestions('Ted '); // note space
diff --git a/static/js/filter.js b/static/js/filter.js
index 3b824f15c6..7db8330cc5 100644
--- a/static/js/filter.js
+++ b/static/js/filter.js
@@ -200,8 +200,6 @@ Filter.canonicalize_term = function (opts) {
};
};
-
-
/* We use a variant of URI encoding which looks reasonably
nice and still handles unambiguously cases such as
spaces in operands.
@@ -419,10 +417,10 @@ Filter.operator_to_prefix = function (operator, negated) {
var verb;
if (operator === 'search') {
- return negated ? 'Exclude' : 'Search for';
+ return negated ? 'exclude' : 'search for';
}
- verb = negated ? 'Exclude ' : 'Narrow to ';
+ verb = negated ? 'exclude ' : '';
switch (operator) {
case 'stream':
@@ -474,7 +472,7 @@ Filter.describe = function (operators) {
if (is(operators[0], 'stream') && is(operators[1], 'topic')) {
var stream = operators[0].operand;
var topic = operators[1].operand;
- var part = 'Narrow to ' + stream + ' > ' + topic;
+ var part = "stream " + stream + ' > ' + topic;
parts = [part];
operators = operators.slice(2);
}
@@ -484,13 +482,13 @@ Filter.describe = function (operators) {
var operand = elem.operand;
var canonicalized_operator = Filter.canonicalize_operator(elem.operator);
if (canonicalized_operator ==='is') {
- var verb = elem.negated ? 'Exclude ' : 'Narrow to ';
+ var verb = elem.negated ? 'exclude ' : '';
if (operand === 'private') {
- return verb + 'all private messages';
+ return verb + 'private messages';
} else if (operand === 'starred') {
return verb + 'starred messages';
} else if (operand === 'mentioned') {
- return verb + 'mentioned messages';
+ return verb + '@-mentions';
} else if (operand === 'alerted') {
return verb + 'alerted messages';
}
@@ -501,7 +499,7 @@ Filter.describe = function (operators) {
return prefix_for_operator + ' ' + operand;
}
}
- return 'Narrow to (unknown operator)';
+ return "unknown operand";
});
return parts.concat(more_parts).join(', ');
};
diff --git a/static/js/search_suggestion.js b/static/js/search_suggestion.js
index e8f2adfb49..76db64ef94 100644
--- a/static/js/search_suggestion.js
+++ b/static/js/search_suggestion.js
@@ -69,7 +69,7 @@ function get_stream_suggestions(last, operators) {
streams = typeahead_helper.sorter(query, streams);
var objs = _.map(streams, function (stream) {
- var prefix = 'Narrow to stream';
+ var prefix = 'stream';
var highlighted_stream = typeahead_helper.highlight_query_in_phrase(query, stream);
var description = prefix + ' ' + highlighted_stream;
var term = {
@@ -359,7 +359,7 @@ function get_special_filter_suggestions(last, operators) {
var suggestions = [
{
search_string: 'in:all',
- description: 'All messages',
+ description: 'all messages',
invalid: [
{operator: 'in'},
{operator: 'stream'},
@@ -369,7 +369,7 @@ function get_special_filter_suggestions(last, operators) {
},
{
search_string: 'is:private',
- description: 'Private messages',
+ description: 'private messages',
invalid: [
{operator: 'is', operand: 'private'},
{operator: 'stream'},
@@ -380,7 +380,7 @@ function get_special_filter_suggestions(last, operators) {
},
{
search_string: 'is:starred',
- description: 'Starred messages',
+ description: 'starred messages',
invalid: [
{operator: 'is', operand: 'starred'},
],
@@ -394,7 +394,7 @@ function get_special_filter_suggestions(last, operators) {
},
{
search_string: 'is:alerted',
- description: 'Alerted messages',
+ description: 'alerted messages',
invalid: [
{operator: 'is', operand: 'alerted'},
],
@@ -424,7 +424,7 @@ function get_sent_by_me_suggestions(last, operators) {
var last_string = Filter.unparse([last]).toLowerCase();
var sender_query = 'sender:' + people.my_current_email();
var from_query = 'from:' + people.my_current_email();
- var description = 'Sent by me';
+ var description = 'sent by me';
var invalid = [
{operator: 'sender'},
{operator: 'from'},
@@ -545,6 +545,11 @@ exports.get_suggestions = function (query) {
suggestions = get_operator_subset_suggestions(operators);
result = result.concat(suggestions);
+ _.each(result, function (sug) {
+ var first = sug.description.charAt(0).toUpperCase();
+ sug.description = first + sug.description.slice(1);
+ });
+
// Typeahead expects us to give it strings, not objects, so we maintain our own hash
// back to our objects, and we also filter duplicates here.
var lookup_table = {};