js: Automatically convert var to let and const in more files.

This commit was automatically generated by `tools/lint --only=eslint
--fix`, after an `.eslintrc.json` change.

A half dozen files were removed from the changes by tabbott pending
further work to ensure we avoid breaking valuable PRs with merge
conflicts.

Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
This commit is contained in:
Anders Kaseorg
2019-11-01 16:06:25 -07:00
parent 329d0126bd
commit f9f104a4f8
18 changed files with 904 additions and 904 deletions

View File

@@ -128,9 +128,9 @@ run_test('buddy_status', () => {
run_test('title_data', () => { run_test('title_data', () => {
// Groups // Groups
var is_group = true; let is_group = true;
var user_ids_string = "9999,1000"; const user_ids_string = "9999,1000";
var expected_group_data = { let expected_group_data = {
is_group: is_group, is_group: is_group,
recipients: "Human Selma, Old User", recipients: "Human Selma, Old User",
is_bot: false, is_bot: false,
@@ -140,7 +140,7 @@ run_test('title_data', () => {
is_group = ''; is_group = '';
// Bots with owners. // Bots with owners.
var bot_owner_exists = true; let bot_owner_exists = true;
expected_group_data = { expected_group_data = {
is_group: '', is_group: '',
name: 'Blue Herring Bot', name: 'Blue Herring Bot',
@@ -168,7 +168,7 @@ run_test('title_data', () => {
status_text: 'out to lunch', status_text: 'out to lunch',
}); });
var expected_data = { let expected_data = {
is_group: is_group, is_group: is_group,
status_text: 'out to lunch', status_text: 'out to lunch',
last_seen: 'translated: Active now', last_seen: 'translated: Active now',

View File

@@ -9,19 +9,19 @@ set_global('message_store', {});
set_global('page_params', {}); set_global('page_params', {});
set_global('feature_flags', {}); set_global('feature_flags', {});
var me = { const me = {
email: 'me@example.com', email: 'me@example.com',
user_id: 30, user_id: 30,
full_name: 'Me Myself', full_name: 'Me Myself',
}; };
var joe = { const joe = {
email: 'joe@example.com', email: 'joe@example.com',
user_id: 31, user_id: 31,
full_name: 'joe', full_name: 'joe',
}; };
var steve = { const steve = {
email: 'STEVE@foo.com', email: 'STEVE@foo.com',
user_id: 32, user_id: 32,
full_name: 'steve', full_name: 'steve',
@@ -36,7 +36,7 @@ function assert_same_operators(result, terms) {
terms = _.map(terms, function (term) { terms = _.map(terms, function (term) {
// If negated flag is undefined, we explicitly // If negated flag is undefined, we explicitly
// set it to false. // set it to false.
var negated = term.negated; let negated = term.negated;
if (!negated) { if (!negated) {
negated = false; negated = false;
} }
@@ -50,12 +50,12 @@ function assert_same_operators(result, terms) {
} }
run_test('basics', () => { run_test('basics', () => {
var operators = [ let operators = [
{operator: 'stream', operand: 'foo'}, {operator: 'stream', operand: 'foo'},
{operator: 'stream', operand: 'exclude_stream', negated: true}, {operator: 'stream', operand: 'exclude_stream', negated: true},
{operator: 'topic', operand: 'bar'}, {operator: 'topic', operand: 'bar'},
]; ];
var filter = new Filter(operators); let filter = new Filter(operators);
assert_same_operators(filter.operators(), operators); assert_same_operators(filter.operators(), operators);
assert.deepEqual(filter.operands('stream'), ['foo']); assert.deepEqual(filter.operands('stream'), ['foo']);
@@ -162,10 +162,10 @@ run_test('basics', () => {
assert(filter.can_apply_locally()); assert(filter.can_apply_locally());
}); });
run_test('show_first_unread', () => { run_test('show_first_unread', () => {
var operators = [ let operators = [
{operator: 'is', operand: 'any'}, {operator: 'is', operand: 'any'},
]; ];
var filter = new Filter(operators); let filter = new Filter(operators);
assert(filter.allow_use_first_unread_when_narrowing()); assert(filter.allow_use_first_unread_when_narrowing());
operators = [ operators = [
@@ -188,42 +188,42 @@ run_test('show_first_unread', () => {
}); });
run_test('topic_stuff', () => { run_test('topic_stuff', () => {
var operators = [ const operators = [
{operator: 'stream', operand: 'foo'}, {operator: 'stream', operand: 'foo'},
{operator: 'topic', operand: 'old topic'}, {operator: 'topic', operand: 'old topic'},
]; ];
var filter = new Filter(operators); const filter = new Filter(operators);
assert(filter.has_topic('foo', 'old topic')); assert(filter.has_topic('foo', 'old topic'));
assert(!filter.has_topic('wrong', 'old topic')); assert(!filter.has_topic('wrong', 'old topic'));
assert(!filter.has_topic('foo', 'wrong')); assert(!filter.has_topic('foo', 'wrong'));
var new_filter = filter.filter_with_new_topic('new topic'); const new_filter = filter.filter_with_new_topic('new topic');
assert.deepEqual(new_filter.operands('stream'), ['foo']); assert.deepEqual(new_filter.operands('stream'), ['foo']);
assert.deepEqual(new_filter.operands('topic'), ['new topic']); assert.deepEqual(new_filter.operands('topic'), ['new topic']);
}); });
run_test('new_style_operators', () => { run_test('new_style_operators', () => {
var term = { const term = {
operator: 'stream', operator: 'stream',
operand: 'foo', operand: 'foo',
}; };
var operators = [term]; const operators = [term];
var filter = new Filter(operators); const filter = new Filter(operators);
assert.deepEqual(filter.operands('stream'), ['foo']); assert.deepEqual(filter.operands('stream'), ['foo']);
assert(filter.is_exactly('stream')); assert(filter.is_exactly('stream'));
}); });
run_test('public_operators', () => { run_test('public_operators', () => {
var operators = [ let operators = [
{operator: 'stream', operand: 'foo'}, {operator: 'stream', operand: 'foo'},
{operator: 'in', operand: 'all'}, {operator: 'in', operand: 'all'},
{operator: 'topic', operand: 'bar'}, {operator: 'topic', operand: 'bar'},
]; ];
var filter = new Filter(operators); let filter = new Filter(operators);
assert_same_operators(filter.public_operators(), operators); assert_same_operators(filter.public_operators(), operators);
assert(!filter.is_exactly('stream')); assert(!filter.is_exactly('stream'));
@@ -241,7 +241,7 @@ run_test('canonicalizations', () => {
assert.equal(Filter.canonicalize_operator('Subject'), 'topic'); assert.equal(Filter.canonicalize_operator('Subject'), 'topic');
assert.equal(Filter.canonicalize_operator('FROM'), 'sender'); assert.equal(Filter.canonicalize_operator('FROM'), 'sender');
var term; let term;
term = Filter.canonicalize_term({operator: 'Stream', operand: 'Denmark'}); term = Filter.canonicalize_term({operator: 'Stream', operand: 'Denmark'});
assert.equal(term.operator, 'stream'); assert.equal(term.operator, 'stream');
assert.equal(term.operand, 'Denmark'); assert.equal(term.operand, 'Denmark');
@@ -292,7 +292,7 @@ function get_predicate(operators) {
} }
function make_sub(name, stream_id) { function make_sub(name, stream_id) {
var sub = { const sub = {
name: name, name: name,
stream_id: stream_id, stream_id: stream_id,
}; };
@@ -308,9 +308,9 @@ run_test('predicate_basics', () => {
// To keep these tests simple, we only pass objects with a few relevant attributes // To keep these tests simple, we only pass objects with a few relevant attributes
// rather than full-fledged message objects. // rather than full-fledged message objects.
var stream_id = 42; const stream_id = 42;
make_sub('Foo', stream_id); make_sub('Foo', stream_id);
var predicate = get_predicate([['stream', 'Foo'], ['topic', 'Bar']]); let predicate = get_predicate([['stream', 'Foo'], ['topic', 'Bar']]);
assert(predicate({type: 'stream', stream_id: stream_id, topic: 'bar'})); assert(predicate({type: 'stream', stream_id: stream_id, topic: 'bar'}));
assert(!predicate({type: 'stream', stream_id: stream_id, topic: 'whatever'})); assert(!predicate({type: 'stream', stream_id: stream_id, topic: 'whatever'}));
@@ -356,7 +356,7 @@ run_test('predicate_basics', () => {
predicate = get_predicate([['in', 'all']]); predicate = get_predicate([['in', 'all']]);
assert(predicate({})); assert(predicate({}));
var unknown_stream_id = 999; const unknown_stream_id = 999;
predicate = get_predicate([['in', 'home']]); predicate = get_predicate([['in', 'home']]);
assert(!predicate({stream_id: unknown_stream_id, stream: 'unknown'})); assert(!predicate({stream_id: unknown_stream_id, stream: 'unknown'}));
assert(predicate({type: 'private'})); assert(predicate({type: 'private'}));
@@ -435,10 +435,10 @@ run_test('predicate_basics', () => {
}); });
run_test('negated_predicates', () => { run_test('negated_predicates', () => {
var predicate; let predicate;
var narrow; let narrow;
var social_stream_id = 555; const social_stream_id = 555;
make_sub('social', social_stream_id); make_sub('social', social_stream_id);
narrow = [ narrow = [
@@ -459,7 +459,7 @@ run_test('negated_predicates', () => {
run_test('mit_exceptions', () => { run_test('mit_exceptions', () => {
global.page_params.realm_is_zephyr_mirror_realm = true; global.page_params.realm_is_zephyr_mirror_realm = true;
var predicate = get_predicate([['stream', 'Foo'], ['topic', 'personal']]); let predicate = get_predicate([['stream', 'Foo'], ['topic', 'personal']]);
assert(predicate({type: 'stream', stream: 'foo', topic: 'personal'})); assert(predicate({type: 'stream', stream: 'foo', topic: 'personal'}));
assert(predicate({type: 'stream', stream: 'foo.d', topic: 'personal'})); assert(predicate({type: 'stream', stream: 'foo.d', topic: 'personal'}));
assert(predicate({type: 'stream', stream: 'foo.d', topic: ''})); assert(predicate({type: 'stream', stream: 'foo.d', topic: ''}));
@@ -471,7 +471,7 @@ run_test('mit_exceptions', () => {
assert(predicate({type: 'stream', stream: 'foo', topic: 'bar.d'})); assert(predicate({type: 'stream', stream: 'foo', topic: 'bar.d'}));
// Try to get the MIT regex to explode for an empty stream. // Try to get the MIT regex to explode for an empty stream.
var terms = [ let terms = [
{operator: 'stream', operand: ''}, {operator: 'stream', operand: ''},
{operator: 'topic', operand: 'bar'}, {operator: 'topic', operand: 'bar'},
]; ];
@@ -488,7 +488,7 @@ run_test('mit_exceptions', () => {
}); });
run_test('predicate_edge_cases', () => { run_test('predicate_edge_cases', () => {
var predicate; let predicate;
// The code supports undefined as an operator to Filter, which results // The code supports undefined as an operator to Filter, which results
// in a predicate that accepts any message. // in a predicate that accepts any message.
predicate = new Filter().predicate(); predicate = new Filter().predicate();
@@ -507,11 +507,11 @@ run_test('predicate_edge_cases', () => {
assert(predicate({})); assert(predicate({}));
// Exercise caching feature. // Exercise caching feature.
var terms = [ const terms = [
{operator: 'stream', operand: 'Foo'}, {operator: 'stream', operand: 'Foo'},
{operator: 'topic', operand: 'bar'}, {operator: 'topic', operand: 'bar'},
]; ];
var filter = new Filter(terms); const filter = new Filter(terms);
filter.predicate(); filter.predicate();
predicate = filter.predicate(); // get cached version predicate = filter.predicate(); // get cached version
assert(predicate({type: 'stream', stream: 'foo', topic: 'bar'})); assert(predicate({type: 'stream', stream: 'foo', topic: 'bar'}));
@@ -519,11 +519,11 @@ run_test('predicate_edge_cases', () => {
}); });
run_test('parse', () => { run_test('parse', () => {
var string; let string;
var operators; let operators;
function _test() { function _test() {
var result = Filter.parse(string); const result = Filter.parse(string);
assert_same_operators(result, operators); assert_same_operators(result, operators);
} }
@@ -646,8 +646,8 @@ run_test('parse', () => {
}); });
run_test('unparse', () => { run_test('unparse', () => {
var string; let string;
var operators; let operators;
operators = [ operators = [
{operator: 'stream', operand: 'Foo'}, {operator: 'stream', operand: 'Foo'},
@@ -697,8 +697,8 @@ run_test('unparse', () => {
}); });
run_test('describe', () => { run_test('describe', () => {
var narrow; let narrow;
var string; let string;
narrow = [ narrow = [
{operator: 'streams', operand: 'public'}, {operator: 'streams', operand: 'public'},
@@ -825,10 +825,10 @@ run_test('describe', () => {
}); });
run_test('is_functions', () => { run_test('is_functions', () => {
var terms = [ let terms = [
{operator: 'stream', operand: 'My Stream'}, {operator: 'stream', operand: 'My Stream'},
]; ];
var filter = new Filter(terms); let filter = new Filter(terms);
assert.equal(filter.is_exactly('stream'), true); assert.equal(filter.is_exactly('stream'), true);
assert.equal(filter.is_exactly('stream', 'topic'), false); assert.equal(filter.is_exactly('stream', 'topic'), false);
assert.equal(filter.is_exactly('pm-with'), false); assert.equal(filter.is_exactly('pm-with'), false);
@@ -995,12 +995,12 @@ run_test('first_valid_id_from', () => {
}); });
run_test('update_email', () => { run_test('update_email', () => {
var terms = [ const terms = [
{operator: 'pm-with', operand: 'steve@foo.com'}, {operator: 'pm-with', operand: 'steve@foo.com'},
{operator: 'sender', operand: 'steve@foo.com'}, {operator: 'sender', operand: 'steve@foo.com'},
{operator: 'stream', operand: 'steve@foo.com'}, // try to be tricky {operator: 'stream', operand: 'steve@foo.com'}, // try to be tricky
]; ];
var filter = new Filter(terms); const filter = new Filter(terms);
filter.update_email(steve.user_id, 'showell@foo.com'); filter.update_email(steve.user_id, 'showell@foo.com');
assert.deepEqual(filter.operands('pm-with'), ['showell@foo.com']); assert.deepEqual(filter.operands('pm-with'), ['showell@foo.com']);
assert.deepEqual(filter.operands('sender'), ['showell@foo.com']); assert.deepEqual(filter.operands('sender'), ['showell@foo.com']);
@@ -1013,6 +1013,6 @@ run_test('error_cases', () => {
// should not be reached unless we break other code. // should not be reached unless we break other code.
people.pm_with_user_ids = function () {}; people.pm_with_user_ids = function () {};
var predicate = get_predicate([['pm-with', 'Joe@example.com']]); const predicate = get_predicate([['pm-with', 'Joe@example.com']]);
assert(!predicate({type: 'private'})); assert(!predicate({type: 'private'}));
}); });

View File

@@ -48,16 +48,16 @@ set_global('Image', function () {
}); });
emoji.initialize(); emoji.initialize();
var doc = ""; const doc = "";
set_global('document', doc); set_global('document', doc);
set_global('$', global.make_zjquery()); set_global('$', global.make_zjquery());
set_global('feature_flags', {local_echo: true}); set_global('feature_flags', {local_echo: true});
var people = global.people; const people = global.people;
var cordelia = { const cordelia = {
full_name: 'Cordelia Lear', full_name: 'Cordelia Lear',
user_id: 101, user_id: 101,
email: 'cordelia@zulip.com', email: 'cordelia@zulip.com',
@@ -96,21 +96,21 @@ people.add({
people.initialize_current_user(cordelia.user_id); people.initialize_current_user(cordelia.user_id);
var hamletcharacters = { const hamletcharacters = {
name: "hamletcharacters", name: "hamletcharacters",
id: 1, id: 1,
description: "Characters of Hamlet", description: "Characters of Hamlet",
members: [cordelia.user_id], members: [cordelia.user_id],
}; };
var backend = { const backend = {
name: "Backend", name: "Backend",
id: 2, id: 2,
description: "Backend team", description: "Backend team",
members: [], members: [],
}; };
var edgecase_group = { const edgecase_group = {
name: "Bobby <h1>Tables</h1>", name: "Bobby <h1>Tables</h1>",
id: 3, id: 3,
description: "HTML Syntax to check for Markdown edge cases.", description: "HTML Syntax to check for Markdown edge cases.",
@@ -121,15 +121,15 @@ global.user_groups.add(hamletcharacters);
global.user_groups.add(backend); global.user_groups.add(backend);
global.user_groups.add(edgecase_group); global.user_groups.add(edgecase_group);
var stream_data = global.stream_data; const stream_data = global.stream_data;
var denmark = { const denmark = {
subscribed: false, subscribed: false,
color: 'blue', color: 'blue',
name: 'Denmark', name: 'Denmark',
stream_id: 1, stream_id: 1,
is_muted: true, is_muted: true,
}; };
var social = { const social = {
subscribed: true, subscribed: true,
color: 'red', color: 'red',
name: 'social', name: 'social',
@@ -137,14 +137,14 @@ var social = {
is_muted: false, is_muted: false,
invite_only: true, invite_only: true,
}; };
var edgecase_stream = { const edgecase_stream = {
subscribed: true, subscribed: true,
color: 'green', color: 'green',
name: 'Bobby <h1>Tables</h1>', name: 'Bobby <h1>Tables</h1>',
stream_id: 3, stream_id: 3,
is_muted: false, is_muted: false,
}; };
var edgecase_stream_2 = { const edgecase_stream_2 = {
subscribed: true, subscribed: true,
color: 'yellow', color: 'yellow',
name: 'Bobby <h1', name: 'Bobby <h1',
@@ -161,18 +161,18 @@ stream_data.add_sub('Bobby <h1', edgecase_stream_2);
// Check the default behavior of fenced code blocks // Check the default behavior of fenced code blocks
// works properly before markdown is initialized. // works properly before markdown is initialized.
run_test('fenced_block_defaults', () => { run_test('fenced_block_defaults', () => {
var input = '\n```\nfenced code\n```\n\nand then after\n'; const input = '\n```\nfenced code\n```\n\nand then after\n';
var expected = '\n\n<div class="codehilite"><pre><span></span>fenced code\n</pre></div>\n\n\n\nand then after\n\n'; const expected = '\n\n<div class="codehilite"><pre><span></span>fenced code\n</pre></div>\n\n\n\nand then after\n\n';
var output = fenced_code.process_fenced_code(input); const output = fenced_code.process_fenced_code(input);
assert.equal(output, expected); assert.equal(output, expected);
}); });
markdown.initialize(); markdown.initialize();
var bugdown_data = global.read_fixture_data('markdown_test_cases.json'); const bugdown_data = global.read_fixture_data('markdown_test_cases.json');
run_test('bugdown_detection', () => { run_test('bugdown_detection', () => {
var no_markup = [ const no_markup = [
"This is a plaintext message", "This is a plaintext message",
"This is a plaintext: message", "This is a plaintext: message",
"This is a :plaintext message", "This is a :plaintext message",
@@ -195,7 +195,7 @@ run_test('bugdown_detection', () => {
"And an avatar !avatar(leo@zulip.com) is here", "And an avatar !avatar(leo@zulip.com) is here",
]; ];
var markup = [ const markup = [
"Contains a https://zulip.com/image.png file", "Contains a https://zulip.com/image.png file",
"Contains a https://zulip.com/image.jpg file", "Contains a https://zulip.com/image.jpg file",
"https://zulip.com/image.jpg", "https://zulip.com/image.jpg",
@@ -220,7 +220,7 @@ run_test('bugdown_detection', () => {
}); });
run_test('marked_shared', () => { run_test('marked_shared', () => {
var tests = bugdown_data.regular_tests; const tests = bugdown_data.regular_tests;
tests.forEach(function (test) { tests.forEach(function (test) {
@@ -229,11 +229,11 @@ run_test('marked_shared', () => {
return; return;
} }
var message = {raw_content: test.input}; const message = {raw_content: test.input};
page_params.translate_emoticons = test.translate_emoticons || false; page_params.translate_emoticons = test.translate_emoticons || false;
markdown.apply_markdown(message); markdown.apply_markdown(message);
var output = message.content; const output = message.content;
var error_message = `Failure in test: ${test.name}`; const error_message = `Failure in test: ${test.name}`;
if (test.marked_expected_output) { if (test.marked_expected_output) {
global.bugdown_assert.notEqual(test.expected_output, output, error_message); global.bugdown_assert.notEqual(test.expected_output, output, error_message);
global.bugdown_assert.equal(test.marked_expected_output, output, error_message); global.bugdown_assert.equal(test.marked_expected_output, output, error_message);
@@ -246,7 +246,7 @@ run_test('marked_shared', () => {
}); });
run_test('message_flags', () => { run_test('message_flags', () => {
var message = {raw_content: '@**Leo**'}; let message = {raw_content: '@**Leo**'};
markdown.apply_markdown(message); markdown.apply_markdown(message);
assert(!message.mentioned); assert(!message.mentioned);
assert(!message.mentioned_me_directly); assert(!message.mentioned_me_directly);
@@ -263,7 +263,7 @@ run_test('message_flags', () => {
}); });
run_test('marked', () => { run_test('marked', () => {
var test_cases = [ const test_cases = [
{input: 'hello', expected: '<p>hello</p>'}, {input: 'hello', expected: '<p>hello</p>'},
{input: 'hello there', expected: '<p>hello there</p>'}, {input: 'hello there', expected: '<p>hello there</p>'},
{input: 'hello **bold** for you', expected: '<p>hello <strong>bold</strong> for you</p>'}, {input: 'hello **bold** for you', expected: '<p>hello <strong>bold</strong> for you</p>'},
@@ -396,18 +396,18 @@ run_test('marked', () => {
// Disable emoji conversion by default. // Disable emoji conversion by default.
page_params.translate_emoticons = test_case.translate_emoticons || false; page_params.translate_emoticons = test_case.translate_emoticons || false;
var input = test_case.input; const input = test_case.input;
var expected = test_case.expected; const expected = test_case.expected;
var message = {raw_content: input}; const message = {raw_content: input};
markdown.apply_markdown(message); markdown.apply_markdown(message);
var output = message.content; const output = message.content;
assert.equal(expected, output); assert.equal(expected, output);
}); });
}); });
run_test('topic_links', () => { run_test('topic_links', () => {
var message = {type: 'stream', topic: "No links here"}; let message = {type: 'stream', topic: "No links here"};
markdown.add_topic_links(message); markdown.add_topic_links(message);
assert.equal(util.get_topic_links(message).length, []); assert.equal(util.get_topic_links(message).length, []);
@@ -456,8 +456,8 @@ run_test('topic_links', () => {
}); });
run_test('message_flags', () => { run_test('message_flags', () => {
var input = "/me is testing this"; let input = "/me is testing this";
var message = {topic: "No links here", raw_content: input}; let message = {topic: "No links here", raw_content: input};
markdown.apply_markdown(message); markdown.apply_markdown(message);
assert.equal(message.is_me_message, true); assert.equal(message.is_me_message, true);
@@ -528,7 +528,7 @@ run_test('message_flags', () => {
}); });
run_test('backend_only_realm_filters', () => { run_test('backend_only_realm_filters', () => {
var backend_only_realm_filters = [ const backend_only_realm_filters = [
'Here is the PR-#123.', 'Here is the PR-#123.',
'Function abc() was introduced in (PR)#123.', 'Function abc() was introduced in (PR)#123.',
]; ];
@@ -541,8 +541,8 @@ run_test('python_to_js_filter', () => {
// The only way to reach python_to_js_filter is indirectly, hence the call // The only way to reach python_to_js_filter is indirectly, hence the call
// to set_realm_filters. // to set_realm_filters.
markdown.set_realm_filters([['/a(?im)a/g'], ['/a(?L)a/g']]); markdown.set_realm_filters([['/a(?im)a/g'], ['/a(?L)a/g']]);
var actual_value = marked.InlineLexer.rules.zulip.realm_filters; let actual_value = marked.InlineLexer.rules.zulip.realm_filters;
var expected_value = [/\/aa\/g(?![\w])/gim, /\/aa\/g(?![\w])/g]; let expected_value = [/\/aa\/g(?![\w])/gim, /\/aa\/g(?![\w])/g];
assert.deepEqual(actual_value, expected_value); assert.deepEqual(actual_value, expected_value);
// Test case with multiple replacements. // Test case with multiple replacements.
markdown.set_realm_filters([['#cf(?P<contest>[0-9]+)(?P<problem>[A-Z][0-9A-Z]*)', 'http://google.com']]); markdown.set_realm_filters([['#cf(?P<contest>[0-9]+)(?P<problem>[A-Z][0-9A-Z]*)', 'http://google.com']]);
@@ -562,7 +562,7 @@ run_test('python_to_js_filter', () => {
run_test('katex_throws_unexpected_exceptions', () => { run_test('katex_throws_unexpected_exceptions', () => {
katex.renderToString = function () { throw new Error('some-exception'); }; katex.renderToString = function () { throw new Error('some-exception'); };
blueslip.set_test_data('error', 'Error: some-exception'); blueslip.set_test_data('error', 'Error: some-exception');
var message = { raw_content: '$$a$$' }; const message = { raw_content: '$$a$$' };
markdown.apply_markdown(message); markdown.apply_markdown(message);
assert.equal(blueslip.get_test_logs('error').length, 1); assert.equal(blueslip.get_test_logs('error').length, 1);
blueslip.clear_test_data(); blueslip.clear_test_data();

View File

@@ -5,13 +5,13 @@ set_global('$', global.make_zjquery());
set_global('i18n', global.stub_i18n); set_global('i18n', global.stub_i18n);
set_global('confirm_dialog', {}); set_global('confirm_dialog', {});
var noop = function () {}; const noop = function () {};
var pills = { const pills = {
pill: {}, pill: {},
}; };
var create_item_handler; let create_item_handler;
set_global('channel', {}); set_global('channel', {});
set_global('blueslip', global.make_zblueslip()); set_global('blueslip', global.make_zblueslip());
@@ -83,31 +83,31 @@ run_test('can_edit', () => {
}); });
var user_group_selector = "#user-groups #1"; const user_group_selector = "#user-groups #1";
var cancel_selector = "#user-groups #1 .save-status.btn-danger"; const cancel_selector = "#user-groups #1 .save-status.btn-danger";
var saved_selector = "#user-groups #1 .save-status.sea-green"; const saved_selector = "#user-groups #1 .save-status.sea-green";
var name_selector = "#user-groups #1 .name"; const name_selector = "#user-groups #1 .name";
var description_selector = "#user-groups #1 .description"; const description_selector = "#user-groups #1 .description";
var instructions_selector = "#user-groups #1 .save-instructions"; const instructions_selector = "#user-groups #1 .save-instructions";
run_test('populate_user_groups', () => { run_test('populate_user_groups', () => {
var realm_user_group = { const realm_user_group = {
id: 1, id: 1,
name: 'Mobile', name: 'Mobile',
description: 'All mobile people', description: 'All mobile people',
members: Dict.from_array([2, 4]), members: Dict.from_array([2, 4]),
}; };
var iago = { const iago = {
email: 'iago@zulip.com', email: 'iago@zulip.com',
user_id: 2, user_id: 2,
full_name: 'Iago', full_name: 'Iago',
}; };
var alice = { const alice = {
email: 'alice@example.com', email: 'alice@example.com',
user_id: 31, user_id: 31,
full_name: 'Alice', full_name: 'Alice',
}; };
var bob = { const bob = {
email: 'bob@example.com', email: 'bob@example.com',
user_id: 32, user_id: 32,
full_name: 'Bob', full_name: 'Bob',
@@ -121,8 +121,8 @@ run_test('populate_user_groups', () => {
return [realm_user_group]; return [realm_user_group];
}; };
var templates_render_called = false; let templates_render_called = false;
var fake_rendered_temp = $.create('fake_admin_user_group_list_template_rendered'); const fake_rendered_temp = $.create('fake_admin_user_group_list_template_rendered');
global.stub_templates(function (template, args) { global.stub_templates(function (template, args) {
assert.equal(template, 'admin_user_group_list'); assert.equal(template, 'admin_user_group_list');
assert.equal(args.user_group.id, 1); assert.equal(args.user_group.id, 1);
@@ -132,13 +132,13 @@ run_test('populate_user_groups', () => {
return fake_rendered_temp; return fake_rendered_temp;
}); });
var user_groups_list_append_called = false; let user_groups_list_append_called = false;
$('#user-groups').append = function (rendered_temp) { $('#user-groups').append = function (rendered_temp) {
assert.equal(rendered_temp, fake_rendered_temp); assert.equal(rendered_temp, fake_rendered_temp);
user_groups_list_append_called = true; user_groups_list_append_called = true;
}; };
var get_person_from_user_id_called = false; let get_person_from_user_id_called = false;
people.get_person_from_user_id = function (user_id) { people.get_person_from_user_id = function (user_id) {
if (user_id === iago.user_id) { if (user_id === iago.user_id) {
return iago; return iago;
@@ -155,11 +155,11 @@ run_test('populate_user_groups', () => {
return true; return true;
}; };
var all_pills = {}; const all_pills = {};
var pill_container_stub = $('.pill-container[data-group-pills="1"]'); const pill_container_stub = $('.pill-container[data-group-pills="1"]');
pills.appendValidatedData = function (item) { pills.appendValidatedData = function (item) {
var id = item.user_id; const id = item.user_id;
assert.equal(all_pills[id], undefined); assert.equal(all_pills[id], undefined);
all_pills[id] = item; all_pills[id] = item;
}; };
@@ -167,17 +167,17 @@ run_test('populate_user_groups', () => {
return _.values(all_pills); return _.values(all_pills);
}; };
var text_cleared; let text_cleared;
pills.clear_text = function () { pills.clear_text = function () {
text_cleared = true; text_cleared = true;
}; };
var input_field_stub = $.create('fake-input-field'); const input_field_stub = $.create('fake-input-field');
pill_container_stub.children = function () { pill_container_stub.children = function () {
return input_field_stub; return input_field_stub;
}; };
var input_typeahead_called = false; let input_typeahead_called = false;
input_field_stub.typeahead = function (config) { input_field_stub.typeahead = function (config) {
assert.equal(config.items, 5); assert.equal(config.items, 5);
assert(config.fixed); assert(config.fixed);
@@ -190,27 +190,27 @@ run_test('populate_user_groups', () => {
assert.equal(typeof config.updater, 'function'); assert.equal(typeof config.updater, 'function');
(function test_highlighter() { (function test_highlighter() {
var fake_person = $.create('fake-person'); const fake_person = $.create('fake-person');
typeahead_helper.render_person = function () { typeahead_helper.render_person = function () {
return fake_person; return fake_person;
}; };
assert.equal(config.highlighter(), fake_person); assert.equal(config.highlighter(), fake_person);
}()); }());
var fake_context = { const fake_context = {
query: 'ali', query: 'ali',
}; };
(function test_source() { (function test_source() {
var result = config.source.call(fake_context, iago); const result = config.source.call(fake_context, iago);
var emails = _.pluck(result, 'email').sort(); const emails = _.pluck(result, 'email').sort();
assert.deepEqual(emails, [alice.email, bob.email]); assert.deepEqual(emails, [alice.email, bob.email]);
}()); }());
(function test_matcher() { (function test_matcher() {
/* Here the query doesn't begin with an '@' because typeahead is triggered /* Here the query doesn't begin with an '@' because typeahead is triggered
by the '@' sign and thus removed in the query. */ by the '@' sign and thus removed in the query. */
var result = config.matcher.call(fake_context, iago); let result = config.matcher.call(fake_context, iago);
assert(!result); assert(!result);
result = config.matcher.call(fake_context, alice); result = config.matcher.call(fake_context, alice);
@@ -218,7 +218,7 @@ run_test('populate_user_groups', () => {
}()); }());
(function test_sorter() { (function test_sorter() {
var sort_recipientbox_typeahead_called = false; let sort_recipientbox_typeahead_called = false;
typeahead_helper.sort_recipientbox_typeahead = function () { typeahead_helper.sort_recipientbox_typeahead = function () {
sort_recipientbox_typeahead_called = true; sort_recipientbox_typeahead_called = true;
}; };
@@ -232,9 +232,9 @@ run_test('populate_user_groups', () => {
return realm_user_group; return realm_user_group;
}; };
var saved_fade_out_called = false; let saved_fade_out_called = false;
var cancel_fade_to_called = false; let cancel_fade_to_called = false;
var instructions_fade_to_called = false; let instructions_fade_to_called = false;
$(saved_selector).fadeOut = function () { $(saved_selector).fadeOut = function () {
saved_fade_out_called = true; saved_fade_out_called = true;
}; };
@@ -274,7 +274,7 @@ run_test('populate_user_groups', () => {
input_typeahead_called = true; input_typeahead_called = true;
}; };
var get_by_email_called = false; let get_by_email_called = false;
people.get_by_email = function (user_email) { people.get_by_email = function (user_email) {
get_by_email_called = true; get_by_email_called = true;
if (user_email === iago.email) { if (user_email === iago.email) {
@@ -293,14 +293,14 @@ run_test('populate_user_groups', () => {
function test_create_item(handler) { function test_create_item(handler) {
(function test_rejection_path() { (function test_rejection_path() {
var item = handler(iago.email, pills.items()); const item = handler(iago.email, pills.items());
assert(get_by_email_called); assert(get_by_email_called);
assert.equal(item, undefined); assert.equal(item, undefined);
}()); }());
(function test_success_path() { (function test_success_path() {
get_by_email_called = false; get_by_email_called = false;
var res = handler(bob.email, pills.items()); const res = handler(bob.email, pills.items());
assert(get_by_email_called); assert(get_by_email_called);
assert.equal(typeof res, 'object'); assert.equal(typeof res, 'object');
assert.equal(res.user_id, bob.user_id); assert.equal(res.user_id, bob.user_id);
@@ -333,7 +333,7 @@ run_test('populate_user_groups', () => {
}); });
run_test('with_external_user', () => { run_test('with_external_user', () => {
var realm_user_group = { const realm_user_group = {
id: 1, id: 1,
name: 'Mobile', name: 'Mobile',
description: 'All mobile people', description: 'All mobile people',
@@ -361,7 +361,7 @@ run_test('with_external_user', () => {
return noop; return noop;
}; };
var can_edit_called = 0; let can_edit_called = 0;
settings_user_groups.can_edit = function () { settings_user_groups.can_edit = function () {
can_edit_called += 1; can_edit_called += 1;
return false; return false;
@@ -370,11 +370,11 @@ run_test('with_external_user', () => {
// Reset zjquery to test stuff with user who cannot edit // Reset zjquery to test stuff with user who cannot edit
set_global('$', global.make_zjquery()); set_global('$', global.make_zjquery());
var user_group_find_called = 0; let user_group_find_called = 0;
var user_group_stub = $('div.user-group[id="1"]'); const user_group_stub = $('div.user-group[id="1"]');
var name_field_stub = $.create('fake-name-field'); const name_field_stub = $.create('fake-name-field');
var description_field_stub = $.create('fake-description-field'); const description_field_stub = $.create('fake-description-field');
var input_stub = $.create('fake-input'); const input_stub = $.create('fake-input');
user_group_stub.find = function (elem) { user_group_stub.find = function (elem) {
if (elem === '.name') { if (elem === '.name') {
user_group_find_called += 1; user_group_find_called += 1;
@@ -386,9 +386,9 @@ run_test('with_external_user', () => {
} }
}; };
var pill_container_stub = $('.pill-container[data-group-pills="1"]'); const pill_container_stub = $('.pill-container[data-group-pills="1"]');
var pill_stub = $.create('fake-pill'); const pill_stub = $.create('fake-pill');
var pill_container_find_called = 0; let pill_container_find_called = 0;
pill_container_stub.find = function (elem) { pill_container_stub.find = function (elem) {
if (elem === '.input') { if (elem === '.input') {
pill_container_find_called += 1; pill_container_find_called += 1;
@@ -406,7 +406,7 @@ run_test('with_external_user', () => {
}; };
// Test the 'off' handlers on the pill-container // Test the 'off' handlers on the pill-container
var turned_off = {}; const turned_off = {};
pill_container_stub.off = function (event_name, sel) { pill_container_stub.off = function (event_name, sel) {
if (sel === undefined) { if (sel === undefined) {
sel = 'whole'; sel = 'whole';
@@ -414,9 +414,9 @@ run_test('with_external_user', () => {
turned_off[event_name + '/' + sel] = true; turned_off[event_name + '/' + sel] = true;
}; };
var pill_hover_called = false; let pill_hover_called = false;
var callback; let callback;
var empty_fn; let empty_fn;
pill_stub.hover = function (one, two) { pill_stub.hover = function (one, two) {
callback = one; callback = one;
empty_fn = two; empty_fn = two;
@@ -425,9 +425,9 @@ run_test('with_external_user', () => {
assert.equal(typeof two, 'function'); assert.equal(typeof two, 'function');
}; };
var exit_button = $.create('fake-pill-exit'); const exit_button = $.create('fake-pill-exit');
pill_stub.set_find_results('.exit', exit_button); pill_stub.set_find_results('.exit', exit_button);
var exit_button_called = false; let exit_button_called = false;
exit_button.css = function (property, value) { exit_button.css = function (property, value) {
exit_button_called = true; exit_button_called = true;
assert.equal(property, 'opacity'); assert.equal(property, 'opacity');
@@ -447,32 +447,32 @@ run_test('with_external_user', () => {
settings_user_groups.set_up(); settings_user_groups.set_up();
var set_parents_result_called = 0; let set_parents_result_called = 0;
var set_attributes_called = 0; let set_attributes_called = 0;
// Test different handlers with an external user // Test different handlers with an external user
var delete_handler = $('#user-groups').get_on_handler('click', '.delete'); const delete_handler = $('#user-groups').get_on_handler('click', '.delete');
var fake_delete = $.create('fk-#user-groups.delete_btn'); const fake_delete = $.create('fk-#user-groups.delete_btn');
fake_delete.set_parents_result('.user-group', $('.user-group')); fake_delete.set_parents_result('.user-group', $('.user-group'));
set_parents_result_called += 1; set_parents_result_called += 1;
$('.user-group').attr('id', '1'); $('.user-group').attr('id', '1');
set_attributes_called += 1; set_attributes_called += 1;
var name_update_handler = $(user_group_selector).get_on_handler("input", ".name"); const name_update_handler = $(user_group_selector).get_on_handler("input", ".name");
var des_update_handler = $(user_group_selector).get_on_handler("input", ".description"); const des_update_handler = $(user_group_selector).get_on_handler("input", ".description");
var member_change_handler = $(user_group_selector).get_on_handler("blur", ".input"); const member_change_handler = $(user_group_selector).get_on_handler("blur", ".input");
var name_change_handler = $(user_group_selector).get_on_handler("blur", ".name"); const name_change_handler = $(user_group_selector).get_on_handler("blur", ".name");
var des_change_handler = $(user_group_selector).get_on_handler("blur", ".description"); const des_change_handler = $(user_group_selector).get_on_handler("blur", ".description");
var event = { const event = {
stopPropagation: noop, stopPropagation: noop,
}; };
var pill_click_called = false; let pill_click_called = false;
var pill_click_handler = pill_container_stub.get_on_handler('click'); const pill_click_handler = pill_container_stub.get_on_handler('click');
pill_click_called = true; pill_click_called = true;
assert(callback); assert(callback);
@@ -501,7 +501,7 @@ run_test('with_external_user', () => {
run_test('reload', () => { run_test('reload', () => {
$('#user-groups').html('Some text'); $('#user-groups').html('Some text');
var populate_user_groups_called = false; let populate_user_groups_called = false;
settings_user_groups.populate_user_groups = function () { settings_user_groups.populate_user_groups = function () {
populate_user_groups_called = true; populate_user_groups_called = true;
}; };
@@ -512,7 +512,7 @@ run_test('reload', () => {
run_test('reset', () => { run_test('reset', () => {
settings_user_groups.reset(); settings_user_groups.reset();
var result = settings_user_groups.reload(); const result = settings_user_groups.reload();
assert.equal(result, undefined); assert.equal(result, undefined);
}); });
@@ -523,13 +523,13 @@ run_test('on_events', () => {
}; };
(function test_admin_user_group_form_submit_triggered() { (function test_admin_user_group_form_submit_triggered() {
var handler = $('.organization form.admin-user-group-form').get_on_handler("submit"); const handler = $('.organization form.admin-user-group-form').get_on_handler("submit");
var event = { const event = {
stopPropagation: noop, stopPropagation: noop,
preventDefault: noop, preventDefault: noop,
}; };
var fake_this = $.create('fake-form.admin-user-group-form'); const fake_this = $.create('fake-form.admin-user-group-form');
var fake_object_array = [{ const fake_object_array = [{
name: 'fake-name', name: 'fake-name',
value: '', value: '',
}, { }, {
@@ -540,7 +540,7 @@ run_test('on_events', () => {
return fake_object_array; return fake_object_array;
}; };
channel.post = function (opts) { channel.post = function (opts) {
var data = { const data = {
members: '[null]', members: '[null]',
}; };
data[fake_object_array[1].name] = fake_object_array[1].value; data[fake_object_array[1].name] = fake_object_array[1].value;
@@ -564,14 +564,14 @@ run_test('on_events', () => {
(function test_post_error() { (function test_post_error() {
$('#admin-user-group-status').show(); $('#admin-user-group-status').show();
ui_report.error = function (error_msg, error_obj, ele) { ui_report.error = function (error_msg, error_obj, ele) {
var xhr = { const xhr = {
responseText: '{"msg":"fake-msg"}', responseText: '{"msg":"fake-msg"}',
}; };
assert.equal(error_msg, 'translated: Failed'); assert.equal(error_msg, 'translated: Failed');
assert.deepEqual(error_obj, xhr); assert.deepEqual(error_obj, xhr);
assert.equal(ele, $('#admin-user-group-status')); assert.equal(ele, $('#admin-user-group-status'));
}; };
var xhr = { const xhr = {
responseText: '{"msg":"fake-msg", "attrib":"val"}', responseText: '{"msg":"fake-msg", "attrib":"val"}',
}; };
opts.error(xhr); opts.error(xhr);
@@ -584,16 +584,16 @@ run_test('on_events', () => {
}()); }());
(function test_user_groups_delete_click_triggered() { (function test_user_groups_delete_click_triggered() {
var handler = $('#user-groups').get_on_handler("click", ".delete"); const handler = $('#user-groups').get_on_handler("click", ".delete");
var fake_this = $.create('fake-#user-groups.delete_btn'); const fake_this = $.create('fake-#user-groups.delete_btn');
fake_this.set_parents_result('.user-group', $('.user-group')); fake_this.set_parents_result('.user-group', $('.user-group'));
$('.user-group').attr('id', '1'); $('.user-group').attr('id', '1');
channel.del = function (opts) { channel.del = function (opts) {
var data = { const data = {
id: 1, id: 1,
}; };
var settings_user_groups_reload_called = false; let settings_user_groups_reload_called = false;
assert.equal(opts.url, "/json/user_groups/1"); assert.equal(opts.url, "/json/user_groups/1");
assert.deepEqual(opts.data, data); assert.deepEqual(opts.data, data);
@@ -616,9 +616,9 @@ run_test('on_events', () => {
}()); }());
(function test_user_groups_keypress_enter_triggered() { (function test_user_groups_keypress_enter_triggered() {
var handler = $('#user-groups').get_on_handler("keypress", ".user-group h4 > span"); const handler = $('#user-groups').get_on_handler("keypress", ".user-group h4 > span");
var default_action_for_enter_stopped = false; let default_action_for_enter_stopped = false;
var event = { const event = {
which: 13, which: 13,
preventDefault: function () { preventDefault: function () {
default_action_for_enter_stopped = true; default_action_for_enter_stopped = true;
@@ -629,22 +629,22 @@ run_test('on_events', () => {
}()); }());
(function test_do_not_blur() { (function test_do_not_blur() {
var blur_event_classes = [".name", ".description", ".input"]; const blur_event_classes = [".name", ".description", ".input"];
var api_endpoint_called = false; let api_endpoint_called = false;
channel.post = function () { channel.post = function () {
api_endpoint_called = true; api_endpoint_called = true;
}; };
channel.patch = noop; channel.patch = noop;
var fake_this = $.create('fake-#user-groups_do_not_blur'); const fake_this = $.create('fake-#user-groups_do_not_blur');
var event = { const event = {
relatedTarget: fake_this, relatedTarget: fake_this,
}; };
// Any of the blur_exceptions trigger blur event. // Any of the blur_exceptions trigger blur event.
_.each(blur_event_classes, function (class_name) { _.each(blur_event_classes, function (class_name) {
var handler = $(user_group_selector).get_on_handler("blur", class_name); const handler = $(user_group_selector).get_on_handler("blur", class_name);
var blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"], const blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"],
class_name); class_name);
_.each(blur_exceptions, function (blur_exception) { _.each(blur_exceptions, function (blur_exception) {
api_endpoint_called = false; api_endpoint_called = false;
fake_this.closest = function (class_name) { fake_this.closest = function (class_name) {
@@ -668,7 +668,7 @@ run_test('on_events', () => {
assert(!api_endpoint_called); assert(!api_endpoint_called);
// Cancel button triggers blur event. // Cancel button triggers blur event.
var settings_user_groups_reload_called = false; let settings_user_groups_reload_called = false;
settings_user_groups.reload = function () { settings_user_groups.reload = function () {
settings_user_groups_reload_called = true; settings_user_groups_reload_called = true;
}; };
@@ -687,14 +687,14 @@ run_test('on_events', () => {
}()); }());
(function test_update_cancel_button() { (function test_update_cancel_button() {
var handler_name = $(user_group_selector).get_on_handler("input", ".name"); const handler_name = $(user_group_selector).get_on_handler("input", ".name");
var handler_desc = $(user_group_selector).get_on_handler("input", ".description"); const handler_desc = $(user_group_selector).get_on_handler("input", ".description");
var sib_des = $(description_selector); const sib_des = $(description_selector);
var sib_name = $(name_selector); const sib_name = $(name_selector);
sib_name.text(i18n.t('mobile')); sib_name.text(i18n.t('mobile'));
sib_des.text(i18n.t('All mobile members')); sib_des.text(i18n.t('All mobile members'));
var group_data = { const group_data = {
name: 'translated: mobile', name: 'translated: mobile',
description: 'translated: All mobile members', description: 'translated: All mobile members',
members: Dict.from_array([2, 31])}; members: Dict.from_array([2, 31])};
@@ -702,8 +702,8 @@ run_test('on_events', () => {
return group_data; return group_data;
}; };
var cancel_fade_out_called = false; let cancel_fade_out_called = false;
var instructions_fade_out_called = false; let instructions_fade_out_called = false;
$(cancel_selector).show(); $(cancel_selector).show();
$(cancel_selector).fadeOut = function () { $(cancel_selector).fadeOut = function () {
cancel_fade_out_called = true; cancel_fade_out_called = true;
@@ -713,7 +713,7 @@ run_test('on_events', () => {
}; };
// Cancel button removed if user group if user group has no changes. // Cancel button removed if user group if user group has no changes.
var fake_this = $.create('fake-#update_cancel_button'); const fake_this = $.create('fake-#update_cancel_button');
handler_name.call(fake_this); handler_name.call(fake_this);
assert(cancel_fade_out_called); assert(cancel_fade_out_called);
assert(instructions_fade_out_called); assert(instructions_fade_out_called);
@@ -735,21 +735,21 @@ run_test('on_events', () => {
}()); }());
(function test_user_groups_save_group_changes_triggered() { (function test_user_groups_save_group_changes_triggered() {
var handler_name = $(user_group_selector).get_on_handler("blur", ".name"); const handler_name = $(user_group_selector).get_on_handler("blur", ".name");
var handler_desc = $(user_group_selector).get_on_handler("blur", ".description"); const handler_desc = $(user_group_selector).get_on_handler("blur", ".description");
var sib_des = $(description_selector); const sib_des = $(description_selector);
var sib_name = $(name_selector); const sib_name = $(name_selector);
sib_name.text(i18n.t('mobile')); sib_name.text(i18n.t('mobile'));
sib_des.text(i18n.t('All mobile members')); sib_des.text(i18n.t('All mobile members'));
var group_data = {members: Dict.from_array([2, 31])}; const group_data = {members: Dict.from_array([2, 31])};
user_groups.get_user_group_from_id = function () { user_groups.get_user_group_from_id = function () {
return group_data; return group_data;
}; };
var api_endpoint_called = false; let api_endpoint_called = false;
var cancel_fade_out_called = false; let cancel_fade_out_called = false;
var saved_fade_to_called = false; let saved_fade_to_called = false;
var instructions_fade_out_called = false; let instructions_fade_out_called = false;
$(instructions_selector).fadeOut = function () { $(instructions_selector).fadeOut = function () {
instructions_fade_out_called = true; instructions_fade_out_called = true;
}; };
@@ -785,17 +785,17 @@ run_test('on_events', () => {
assert(saved_fade_to_called); assert(saved_fade_to_called);
}()); }());
(function test_post_error() { (function test_post_error() {
var user_group_error = $(user_group_selector + ' .user-group-status'); const user_group_error = $(user_group_selector + ' .user-group-status');
user_group_error.show(); user_group_error.show();
ui_report.error = function (error_msg, error_obj, ele) { ui_report.error = function (error_msg, error_obj, ele) {
var xhr = { const xhr = {
responseText: '{"msg":"fake-msg"}', responseText: '{"msg":"fake-msg"}',
}; };
assert.equal(error_msg, 'translated: Failed'); assert.equal(error_msg, 'translated: Failed');
assert.deepEqual(error_obj, xhr); assert.deepEqual(error_obj, xhr);
assert.equal(ele, user_group_error); assert.equal(ele, user_group_error);
}; };
var xhr = { const xhr = {
responseText: '{"msg":"fake-msg", "attrib":"val"}', responseText: '{"msg":"fake-msg", "attrib":"val"}',
}; };
opts.error(xhr); opts.error(xhr);
@@ -804,12 +804,12 @@ run_test('on_events', () => {
}()); }());
}; };
var fake_this = $.create('fake-#user-groups_blur_name'); const fake_this = $.create('fake-#user-groups_blur_name');
fake_this.closest = function () { fake_this.closest = function () {
return []; return [];
}; };
fake_this.set_parents_result(user_group_selector, $(user_group_selector)); fake_this.set_parents_result(user_group_selector, $(user_group_selector));
var event = { const event = {
relatedTarget: fake_this, relatedTarget: fake_this,
}; };
@@ -831,8 +831,8 @@ run_test('on_events', () => {
}()); }());
(function test_user_groups_save_member_changes_triggered() { (function test_user_groups_save_member_changes_triggered() {
var handler = $(user_group_selector).get_on_handler("blur", ".input"); const handler = $(user_group_selector).get_on_handler("blur", ".input");
var realm_user_group = { const realm_user_group = {
id: 1, id: 1,
name: 'Mobile', name: 'Mobile',
description: 'All mobile people', description: 'All mobile people',
@@ -844,9 +844,9 @@ run_test('on_events', () => {
return realm_user_group; return realm_user_group;
}; };
var cancel_fade_out_called = false; let cancel_fade_out_called = false;
var saved_fade_to_called = false; let saved_fade_to_called = false;
var instructions_fade_out_called = false; let instructions_fade_out_called = false;
$(instructions_selector).fadeOut = function () { $(instructions_selector).fadeOut = function () {
instructions_fade_out_called = true; instructions_fade_out_called = true;
}; };
@@ -861,7 +861,7 @@ run_test('on_events', () => {
return $(saved_selector); return $(saved_selector);
}; };
var api_endpoint_called = false; let api_endpoint_called = false;
channel.post = function (opts) { channel.post = function (opts) {
assert.equal(opts.url, "/json/user_groups/1/members"); assert.equal(opts.url, "/json/user_groups/1/members");
assert.equal(opts.data.add, '[31]'); assert.equal(opts.data.add, '[31]');
@@ -876,12 +876,12 @@ run_test('on_events', () => {
}()); }());
}; };
var fake_this = $.create('fake-#user-groups_blur_input'); const fake_this = $.create('fake-#user-groups_blur_input');
fake_this.set_parents_result(user_group_selector, $(user_group_selector)); fake_this.set_parents_result(user_group_selector, $(user_group_selector));
fake_this.closest = function () { fake_this.closest = function () {
return []; return [];
}; };
var event = { const event = {
relatedTarget: fake_this, relatedTarget: fake_this,
}; };

View File

@@ -1590,7 +1590,7 @@ run_test('user_presence_rows', () => {
}); });
run_test('buddy_list_tooltip_content', () => { run_test('buddy_list_tooltip_content', () => {
var args = { const args = {
status_text: 'out to lunch', status_text: 'out to lunch',
last_seen: 'Active now', last_seen: 'Active now',
is_away: false, is_away: false,
@@ -1598,8 +1598,8 @@ run_test('buddy_list_tooltip_content', () => {
online_now: true, online_now: true,
}; };
var html = render('buddy_list_tooltip_content', args); const html = render('buddy_list_tooltip_content', args);
var tooltip_content = $(html).find(".tooltip_inner_content"); const tooltip_content = $(html).find(".tooltip_inner_content");
assert.equal(tooltip_content.text().trim(), 'Iagoout to lunchActive now'); assert.equal(tooltip_content.text().trim(), 'Iagoout to lunchActive now');
}); });

View File

@@ -9,7 +9,7 @@
exports.max_size_before_shrinking = 600; exports.max_size_before_shrinking = 600;
var fade_config = { const fade_config = {
get_user_id: function (item) { get_user_id: function (item) {
return item.user_id; return item.user_id;
}, },
@@ -22,7 +22,7 @@ var fade_config = {
}; };
exports.get_user_circle_class = function (user_id) { exports.get_user_circle_class = function (user_id) {
var status = exports.buddy_status(user_id); const status = exports.buddy_status(user_id);
switch (status) { switch (status) {
case 'active': case 'active':
@@ -38,7 +38,7 @@ exports.get_user_circle_class = function (user_id) {
}; };
exports.status_description = function (user_id) { exports.status_description = function (user_id) {
var status = exports.buddy_status(user_id); const status = exports.buddy_status(user_id);
switch (status) { switch (status) {
case 'active': case 'active':
@@ -59,7 +59,7 @@ exports.level = function (user_id) {
return 0; return 0;
} }
var status = exports.buddy_status(user_id); const status = exports.buddy_status(user_id);
switch (status) { switch (status) {
case 'active': case 'active':
@@ -87,19 +87,19 @@ exports.buddy_status = function (user_id) {
}; };
exports.compare_function = function (a, b) { exports.compare_function = function (a, b) {
var level_a = exports.level(a); const level_a = exports.level(a);
var level_b = exports.level(b); const level_b = exports.level(b);
var diff = level_a - level_b; const diff = level_a - level_b;
if (diff !== 0) { if (diff !== 0) {
return diff; return diff;
} }
// Sort equivalent PM names alphabetically // Sort equivalent PM names alphabetically
var person_a = people.get_person_from_user_id(a); const person_a = people.get_person_from_user_id(a);
var person_b = people.get_person_from_user_id(b); const person_b = people.get_person_from_user_id(b);
var full_name_a = person_a ? person_a.full_name : ''; const full_name_a = person_a ? person_a.full_name : '';
var full_name_b = person_b ? person_b.full_name : ''; const full_name_b = person_b ? person_b.full_name : '';
return util.strcmp(full_name_a, full_name_b); return util.strcmp(full_name_a, full_name_b);
}; };
@@ -117,16 +117,16 @@ function filter_user_ids(filter_text, user_ids) {
user_ids = _.reject(user_ids, people.is_my_user_id); user_ids = _.reject(user_ids, people.is_my_user_id);
var search_terms = filter_text.toLowerCase().split(/[|,]+/); let search_terms = filter_text.toLowerCase().split(/[|,]+/);
search_terms = _.map(search_terms, function (s) { search_terms = _.map(search_terms, function (s) {
return s.trim(); return s.trim();
}); });
var persons = _.map(user_ids, function (user_id) { const persons = _.map(user_ids, function (user_id) {
return people.get_person_from_user_id(user_id); return people.get_person_from_user_id(user_id);
}); });
var user_id_dict = people.filter_people_by_search_terms(persons, search_terms); const user_id_dict = people.filter_people_by_search_terms(persons, search_terms);
return user_id_dict.keys(); return user_id_dict.keys();
} }
@@ -156,7 +156,7 @@ exports.my_user_status = function (user_id) {
}; };
exports.user_last_seen_time_status = function (user_id) { exports.user_last_seen_time_status = function (user_id) {
var status = presence.get_status(user_id); const status = presence.get_status(user_id);
if (status === "active") { if (status === "active") {
return i18n.t("Active now"); return i18n.t("Active now");
} }
@@ -172,7 +172,7 @@ exports.user_last_seen_time_status = function (user_id) {
// may have queries on presence that go back only N weeks). // may have queries on presence that go back only N weeks).
// //
// We give the somewhat vague status of "Unknown" for these users. // We give the somewhat vague status of "Unknown" for these users.
var last_active_date = presence.last_active_date(user_id); const last_active_date = presence.last_active_date(user_id);
if (last_active_date === undefined) { if (last_active_date === undefined) {
return i18n.t("More than 2 weeks ago"); return i18n.t("More than 2 weeks ago");
} }
@@ -180,10 +180,10 @@ exports.user_last_seen_time_status = function (user_id) {
}; };
exports.info_for = function (user_id) { exports.info_for = function (user_id) {
var user_circle_class = exports.get_user_circle_class(user_id); const user_circle_class = exports.get_user_circle_class(user_id);
var person = people.get_person_from_user_id(user_id); const person = people.get_person_from_user_id(user_id);
var my_user_status = exports.my_user_status(user_id); const my_user_status = exports.my_user_status(user_id);
var user_circle_status = exports.status_description(user_id); const user_circle_status = exports.status_description(user_id);
return { return {
href: hash_util.pm_with_uri(person.email), href: hash_util.pm_with_uri(person.email),
@@ -208,9 +208,9 @@ exports.get_title_data = function (user_ids_string, is_group) {
} }
// Since it's not a group, user_ids_string is a single user ID. // Since it's not a group, user_ids_string is a single user ID.
var user_id = user_ids_string; const user_id = user_ids_string;
var person = people.get_person_from_user_id(user_id); const person = people.get_person_from_user_id(user_id);
var bot_owner_exists = false; let bot_owner_exists = false;
if (person.is_bot) { if (person.is_bot) {
if (person.bot_owner_id !== null) { if (person.bot_owner_id !== null) {
@@ -231,9 +231,9 @@ exports.get_title_data = function (user_ids_string, is_group) {
// For buddy list and individual PMS. Since is_group=False, it's // For buddy list and individual PMS. Since is_group=False, it's
// a single, human, user. // a single, human, user.
var active_status = presence.get_status(user_id); const active_status = presence.get_status(user_id);
var last_seen = exports.user_last_seen_time_status(user_id); const last_seen = exports.user_last_seen_time_status(user_id);
var online_now = active_status === 'active'; const online_now = active_status === 'active';
return { return {
is_group: '', is_group: '',
@@ -247,7 +247,7 @@ exports.get_title_data = function (user_ids_string, is_group) {
}; };
exports.get_item = function (user_id) { exports.get_item = function (user_id) {
var info = exports.info_for(user_id); const info = exports.info_for(user_id);
compose_fade.update_user_info([info], fade_config); compose_fade.update_user_info([info], fade_config);
return info; return info;
}; };
@@ -278,7 +278,7 @@ function maybe_shrink_list(user_ids, filter_text) {
} }
exports.get_filtered_and_sorted_user_ids = function (filter_text) { exports.get_filtered_and_sorted_user_ids = function (filter_text) {
var user_ids; let user_ids;
if (filter_text) { if (filter_text) {
// If there's a filter, select from all users, not just those // If there's a filter, select from all users, not just those
@@ -292,7 +292,7 @@ exports.get_filtered_and_sorted_user_ids = function (filter_text) {
} }
user_ids = _.filter(user_ids, function (user_id) { user_ids = _.filter(user_ids, function (user_id) {
var person = people.get_person_from_user_id(user_id); const person = people.get_person_from_user_id(user_id);
if (person) { if (person) {
// if the user is bot, do not show in presence data. // if the user is bot, do not show in presence data.
@@ -310,7 +310,7 @@ exports.get_filtered_and_sorted_user_ids = function (filter_text) {
}; };
exports.get_items_for_users = function (user_ids) { exports.get_items_for_users = function (user_ids) {
var user_info = _.map(user_ids, exports.info_for).filter(function (person) { const user_info = _.map(user_ids, exports.info_for).filter(function (person) {
// filtered bots and yourself are set to "undefined" in the `info_for` // filtered bots and yourself are set to "undefined" in the `info_for`
// function. // function.
return typeof person !== "undefined"; return typeof person !== "undefined";
@@ -322,9 +322,9 @@ exports.get_items_for_users = function (user_ids) {
}; };
exports.huddle_fraction_present = function (huddle) { exports.huddle_fraction_present = function (huddle) {
var user_ids = huddle.split(','); const user_ids = huddle.split(',');
var num_present = 0; let num_present = 0;
_.each(user_ids, function (user_id) { _.each(user_ids, function (user_id) {
if (presence.is_active(user_id)) { if (presence.is_active(user_id)) {
num_present += 1; num_present += 1;

View File

@@ -1,15 +1,15 @@
// You won't find every click handler here, but it's a good place to start! // You won't find every click handler here, but it's a good place to start!
var render_buddy_list_tooltip = require('../templates/buddy_list_tooltip.hbs'); const render_buddy_list_tooltip = require('../templates/buddy_list_tooltip.hbs');
var render_buddy_list_tooltip_content = require('../templates/buddy_list_tooltip_content.hbs'); const render_buddy_list_tooltip_content = require('../templates/buddy_list_tooltip_content.hbs');
exports.initialize = function () { exports.initialize = function () {
// MOUSE MOVING VS DRAGGING FOR SELECTION DATA TRACKING // MOUSE MOVING VS DRAGGING FOR SELECTION DATA TRACKING
var drag = (function () { const drag = (function () {
var start; let start;
var time; let time;
return { return {
start: function (e) { start: function (e) {
@@ -18,9 +18,9 @@ exports.initialize = function () {
}, },
end: function (e) { end: function (e) {
var end = { x: e.offsetX, y: e.offsetY }; const end = { x: e.offsetX, y: e.offsetY };
var dist; let dist;
if (start) { if (start) {
// get the linear difference between two coordinates on the screen. // get the linear difference between two coordinates on the screen.
dist = Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2)); dist = Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2));
@@ -60,8 +60,8 @@ exports.initialize = function () {
} }
function initialize_long_tap() { function initialize_long_tap() {
var MS_DELAY = 750; const MS_DELAY = 750;
var meta = { const meta = {
touchdown: false, touchdown: false,
current_target: undefined, current_target: undefined,
}; };
@@ -69,7 +69,7 @@ exports.initialize = function () {
$("#main_div").on("touchstart", ".messagebox", function () { $("#main_div").on("touchstart", ".messagebox", function () {
meta.touchdown = true; meta.touchdown = true;
meta.invalid = false; meta.invalid = false;
var id = rows.id($(this).closest(".message_row")); const id = rows.id($(this).closest(".message_row"));
meta.current_target = id; meta.current_target = id;
if (!id) { if (!id) {
return; return;
@@ -111,7 +111,7 @@ exports.initialize = function () {
initialize_long_tap(); initialize_long_tap();
} }
var select_message_function = function (e) { const select_message_function = function (e) {
if (is_clickable_message_element($(e.target))) { if (is_clickable_message_element($(e.target))) {
// If this click came from a hyperlink, don't trigger the // If this click came from a hyperlink, don't trigger the
// reply action. The simple way of doing this is simply // reply action. The simple way of doing this is simply
@@ -139,8 +139,8 @@ exports.initialize = function () {
// older browsers, we may be able to use the window.selection // older browsers, we may be able to use the window.selection
// API instead. // API instead.
if (drag.val < 5 && drag.time < 150 || drag.val < 2) { if (drag.val < 5 && drag.time < 150 || drag.val < 2) {
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
var id = rows.id(row); const id = rows.id(row);
if (message_edit.is_editing(id)) { if (message_edit.is_editing(id)) {
// Clicks on a message being edited shouldn't trigger a reply. // Clicks on a message being edited shouldn't trigger a reply.
@@ -162,7 +162,7 @@ exports.initialize = function () {
} else { } else {
$("#main_div").on("longtap", ".messagebox", function (e) { $("#main_div").on("longtap", ".messagebox", function (e) {
// find the correct selection API for the browser. // find the correct selection API for the browser.
var sel = window.getSelection ? window.getSelection() : document.selection; const sel = window.getSelection ? window.getSelection() : document.selection;
// if one matches, remove the current selections. // if one matches, remove the current selections.
// after a longtap that is valid, there should be no text selected. // after a longtap that is valid, there should be no text selected.
if (sel) { if (sel) {
@@ -181,15 +181,15 @@ exports.initialize = function () {
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
var message_id = rows.id($(this).closest(".message_row")); const message_id = rows.id($(this).closest(".message_row"));
var message = message_store.get(message_id); const message = message_store.get(message_id);
message_flags.toggle_starred_and_update_server(message); message_flags.toggle_starred_and_update_server(message);
}); });
$("#main_div").on("click", ".message_reaction", function (e) { $("#main_div").on("click", ".message_reaction", function (e) {
e.stopPropagation(); e.stopPropagation();
var local_id = $(this).attr('data-reaction-id'); const local_id = $(this).attr('data-reaction-id');
var message_id = rows.get_message_id(this); const message_id = rows.get_message_id(this);
reactions.process_reaction_click(message_id, local_id); reactions.process_reaction_click(message_id, local_id);
$(".tooltip").remove(); $(".tooltip").remove();
}); });
@@ -208,10 +208,10 @@ exports.initialize = function () {
$('body').on('click', '.message_edit_notice', function (e) { $('body').on('click', '.message_edit_notice', function (e) {
popovers.hide_all(); popovers.hide_all();
var message_id = rows.id($(e.currentTarget).closest(".message_row")); const message_id = rows.id($(e.currentTarget).closest(".message_row"));
var row = current_msg_list.get_row(message_id); const row = current_msg_list.get_row(message_id);
var message = current_msg_list.get(rows.id(row)); const message = current_msg_list.get(rows.id(row));
var message_history_cancel_btn = $('#message-history-cancel'); const message_history_cancel_btn = $('#message-history-cancel');
if (page_params.realm_allow_edit_history) { if (page_params.realm_allow_edit_history) {
message_edit.show_history(message); message_edit.show_history(message);
@@ -225,10 +225,10 @@ exports.initialize = function () {
$('#main_div').on('mouseenter', '.message_reaction', function (e) { $('#main_div').on('mouseenter', '.message_reaction', function (e) {
e.stopPropagation(); e.stopPropagation();
var elem = $(e.currentTarget); const elem = $(e.currentTarget);
var local_id = elem.attr('data-reaction-id'); const local_id = elem.attr('data-reaction-id');
var message_id = rows.get_message_id(e.currentTarget); const message_id = rows.get_message_id(e.currentTarget);
var title = reactions.get_reaction_title_data(message_id, local_id); const title = reactions.get_reaction_title_data(message_id, local_id);
elem.tooltip({ elem.tooltip({
title: title, title: title,
@@ -258,7 +258,7 @@ exports.initialize = function () {
e.preventDefault(); e.preventDefault();
// Note that we may have an href here, but we trust the stream id more, // Note that we may have an href here, but we trust the stream id more,
// so we re-encode the hash. // so we re-encode the hash.
var stream_id = $(this).attr('data-stream-id'); const stream_id = $(this).attr('data-stream-id');
if (stream_id) { if (stream_id) {
hashchange.go_to_location(hash_util.by_stream_uri(stream_id)); hashchange.go_to_location(hash_util.by_stream_uri(stream_id));
return; return;
@@ -270,7 +270,7 @@ exports.initialize = function () {
$(".user-status-value").on("click", function (e) { $(".user-status-value").on("click", function (e) {
e.stopPropagation(); e.stopPropagation();
var user_status_value = $(e.currentTarget).attr("data-user-status-value"); const user_status_value = $(e.currentTarget).attr("data-user-status-value");
$("input.user_status").val(user_status_value); $("input.user_status").val(user_status_value);
user_status_ui.toggle_clear_message_button(); user_status_ui.toggle_clear_message_button();
user_status_ui.update_button(); user_status_ui.update_button();
@@ -279,7 +279,7 @@ exports.initialize = function () {
// NOTIFICATION CLICK // NOTIFICATION CLICK
$('body').on('click', '.notification', function () { $('body').on('click', '.notification', function () {
var payload = $(this).data("narrow"); const payload = $(this).data("narrow");
ui_util.change_tab_to('#home'); ui_util.change_tab_to('#home');
narrow.activate(payload.raw_operators, payload.opts_notif); narrow.activate(payload.raw_operators, payload.opts_notif);
}); });
@@ -287,51 +287,51 @@ exports.initialize = function () {
// MESSAGE EDITING // MESSAGE EDITING
$('body').on('click', '.edit_content_button', function (e) { $('body').on('click', '.edit_content_button', function (e) {
var row = current_msg_list.get_row(rows.id($(this).closest(".message_row"))); const row = current_msg_list.get_row(rows.id($(this).closest(".message_row")));
current_msg_list.select_id(rows.id(row)); current_msg_list.select_id(rows.id(row));
message_edit.start(row); message_edit.start(row);
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
}); });
$('body').on('click', '.always_visible_topic_edit,.on_hover_topic_edit', function (e) { $('body').on('click', '.always_visible_topic_edit,.on_hover_topic_edit', function (e) {
var recipient_row = $(this).closest(".recipient_row"); const recipient_row = $(this).closest(".recipient_row");
message_edit.start_topic_edit(recipient_row); message_edit.start_topic_edit(recipient_row);
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
}); });
$("body").on("click", ".topic_edit_save", function (e) { $("body").on("click", ".topic_edit_save", function (e) {
var recipient_row = $(this).closest(".recipient_row"); const recipient_row = $(this).closest(".recipient_row");
message_edit.show_topic_edit_spinner(recipient_row); message_edit.show_topic_edit_spinner(recipient_row);
message_edit.save(recipient_row, true); message_edit.save(recipient_row, true);
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
}); });
$("body").on("click", ".topic_edit_cancel", function (e) { $("body").on("click", ".topic_edit_cancel", function (e) {
var recipient_row = $(this).closest(".recipient_row"); const recipient_row = $(this).closest(".recipient_row");
current_msg_list.hide_edit_topic(recipient_row); current_msg_list.hide_edit_topic(recipient_row);
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
}); });
$("body").on("click", ".message_edit_save", function (e) { $("body").on("click", ".message_edit_save", function (e) {
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
message_edit.save(row, false); message_edit.save(row, false);
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
}); });
$("body").on("click", ".message_edit_cancel", function (e) { $("body").on("click", ".message_edit_cancel", function (e) {
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
message_edit.end(row); message_edit.end(row);
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
}); });
$("body").on("click", ".message_edit_close", function (e) { $("body").on("click", ".message_edit_close", function (e) {
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
message_edit.end(row); message_edit.end(row);
e.stopPropagation(); e.stopPropagation();
popovers.hide_all(); popovers.hide_all();
}); });
$("body").on("click", ".copy_message", function (e) { $("body").on("click", ".copy_message", function (e) {
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
message_edit.end(row); message_edit.end(row);
row.find(".alert-msg").text(i18n.t("Copied!")); row.find(".alert-msg").text(i18n.t("Copied!"));
row.find(".alert-msg").css("display", "block"); row.find(".alert-msg").css("display", "block");
@@ -345,26 +345,26 @@ exports.initialize = function () {
} }
}); });
$('#message_edit_form .send-status-close').click(function () { $('#message_edit_form .send-status-close').click(function () {
var row_id = rows.id($(this).closest(".message_row")); const row_id = rows.id($(this).closest(".message_row"));
var send_status = $('#message-edit-send-status-' + row_id); const send_status = $('#message-edit-send-status-' + row_id);
$(send_status).stop(true).fadeOut(200); $(send_status).stop(true).fadeOut(200);
}); });
$("body").on("click", "#message_edit_form [id^='attach_files_']", function (e) { $("body").on("click", "#message_edit_form [id^='attach_files_']", function (e) {
e.preventDefault(); e.preventDefault();
var row_id = rows.id($(this).closest(".message_row")); const row_id = rows.id($(this).closest(".message_row"));
$("#message_edit_file_input_" + row_id).trigger("click"); $("#message_edit_file_input_" + row_id).trigger("click");
}); });
$("body").on("click", "#message_edit_form [id^='markdown_preview_']", function (e) { $("body").on("click", "#message_edit_form [id^='markdown_preview_']", function (e) {
e.preventDefault(); e.preventDefault();
var row_id = rows.id($(this).closest(".message_row")); const row_id = rows.id($(this).closest(".message_row"));
function $_(selector) { function $_(selector) {
return $(selector + "_" + row_id); return $(selector + "_" + row_id);
} }
var content = $_("#message_edit_content").val(); const content = $_("#message_edit_content").val();
$_("#message_edit_content").hide(); $_("#message_edit_content").hide();
$_("#markdown_preview").hide(); $_("#markdown_preview").hide();
$_("#undo_markdown_preview").show(); $_("#undo_markdown_preview").show();
@@ -376,7 +376,7 @@ exports.initialize = function () {
$("body").on("click", "#message_edit_form [id^='undo_markdown_preview_']", function (e) { $("body").on("click", "#message_edit_form [id^='undo_markdown_preview_']", function (e) {
e.preventDefault(); e.preventDefault();
var row_id = rows.id($(this).closest(".message_row")); const row_id = rows.id($(this).closest(".message_row"));
function $_(selector) { function $_(selector) {
return $(selector + "_" + row_id); return $(selector + "_" + row_id);
} }
@@ -392,19 +392,19 @@ exports.initialize = function () {
$('body').on('click', '.on_hover_topic_mute', function (e) { $('body').on('click', '.on_hover_topic_mute', function (e) {
e.stopPropagation(); e.stopPropagation();
var stream_id = $(e.currentTarget).attr('data-stream-id'); const stream_id = $(e.currentTarget).attr('data-stream-id');
var topic = $(e.currentTarget).attr('data-topic-name'); const topic = $(e.currentTarget).attr('data-topic-name');
muting_ui.mute(stream_id, topic); muting_ui.mute(stream_id, topic);
}); });
// RECIPIENT BARS // RECIPIENT BARS
function get_row_id_for_narrowing(narrow_link_elem) { function get_row_id_for_narrowing(narrow_link_elem) {
var group = rows.get_closest_group(narrow_link_elem); const group = rows.get_closest_group(narrow_link_elem);
var msg_id = rows.id_for_recipient_row(group); const msg_id = rows.id_for_recipient_row(group);
var nearest = current_msg_list.get(msg_id); const nearest = current_msg_list.get(msg_id);
var selected = current_msg_list.selected_message(); const selected = current_msg_list.selected_message();
if (util.same_recipient(nearest, selected)) { if (util.same_recipient(nearest, selected)) {
return selected.id; return selected.id;
} }
@@ -416,7 +416,7 @@ exports.initialize = function () {
return; return;
} }
e.preventDefault(); e.preventDefault();
var row_id = get_row_id_for_narrowing(this); const row_id = get_row_id_for_narrowing(this);
narrow.by_recipient(row_id, {trigger: 'message header'}); narrow.by_recipient(row_id, {trigger: 'message header'});
}); });
@@ -425,7 +425,7 @@ exports.initialize = function () {
return; return;
} }
e.preventDefault(); e.preventDefault();
var row_id = get_row_id_for_narrowing(this); const row_id = get_row_id_for_narrowing(this);
narrow.by_topic(row_id, {trigger: 'message header'}); narrow.by_topic(row_id, {trigger: 'message header'});
}); });
@@ -435,7 +435,7 @@ exports.initialize = function () {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
var sidebarHidden = !$(".app-main .column-right").hasClass("expanded"); const sidebarHidden = !$(".app-main .column-right").hasClass("expanded");
popovers.hide_all(); popovers.hide_all();
if (sidebarHidden) { if (sidebarHidden) {
popovers.show_userlist_sidebar(); popovers.show_userlist_sidebar();
@@ -446,7 +446,7 @@ exports.initialize = function () {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
var sidebarHidden = !$(".app-main .column-left").hasClass("expanded"); const sidebarHidden = !$(".app-main .column-left").hasClass("expanded");
popovers.hide_all(); popovers.hide_all();
if (sidebarHidden) { if (sidebarHidden) {
stream_popover.show_streamlist_sidebar(); stream_popover.show_streamlist_sidebar();
@@ -454,7 +454,7 @@ exports.initialize = function () {
}); });
$('#user_presences').expectOne().on('click', '.selectable_sidebar_block', function (e) { $('#user_presences').expectOne().on('click', '.selectable_sidebar_block', function (e) {
var li = $(e.target).parents('li'); const li = $(e.target).parents('li');
activity.narrow_for_user({li: li}); activity.narrow_for_user({li: li});
@@ -465,8 +465,8 @@ exports.initialize = function () {
}); });
$('#group-pms').expectOne().on('click', '.selectable_sidebar_block', function (e) { $('#group-pms').expectOne().on('click', '.selectable_sidebar_block', function (e) {
var user_ids_string = $(e.target).parents('li').attr('data-user-ids'); const user_ids_string = $(e.target).parents('li').attr('data-user-ids');
var emails = people.user_ids_string_to_emails_string(user_ids_string); const emails = people.user_ids_string_to_emails_string(user_ids_string);
narrow.by('pm-with', emails, {trigger: 'sidebar'}); narrow.by('pm-with', emails, {trigger: 'sidebar'});
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
@@ -498,15 +498,15 @@ exports.initialize = function () {
// BUDDY LIST TOOLTIPS // BUDDY LIST TOOLTIPS
$('#user_presences').on('mouseenter', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) { $('#user_presences').on('mouseenter', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) {
e.stopPropagation(); e.stopPropagation();
var elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link"); const elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link");
var user_id = elem.attr('data-user-id'); const user_id = elem.attr('data-user-id');
var title_data = buddy_data.get_title_data(user_id, false); const title_data = buddy_data.get_title_data(user_id, false);
do_render_buddy_list_tooltip(elem, title_data); do_render_buddy_list_tooltip(elem, title_data);
}); });
$('#user_presences').on('mouseleave click', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) { $('#user_presences').on('mouseleave click', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) {
e.stopPropagation(); e.stopPropagation();
var elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link"); const elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link");
$(elem).tooltip('destroy'); $(elem).tooltip('destroy');
}); });
@@ -514,12 +514,12 @@ exports.initialize = function () {
$("body").on('mouseenter', '#pm_user_status, #group_pms_right_sidebar', function (e) { $("body").on('mouseenter', '#pm_user_status, #group_pms_right_sidebar', function (e) {
$(".tooltip").remove(); $(".tooltip").remove();
e.stopPropagation(); e.stopPropagation();
var elem = $(e.currentTarget); const elem = $(e.currentTarget);
var user_ids_string = elem.attr('data-user-ids-string'); const user_ids_string = elem.attr('data-user-ids-string');
// This converts from 'true' in the DOM to true. // This converts from 'true' in the DOM to true.
var is_group = JSON.parse(elem.attr('data-is-group')); const is_group = JSON.parse(elem.attr('data-is-group'));
var title_data = buddy_data.get_title_data(user_ids_string, is_group); const title_data = buddy_data.get_title_data(user_ids_string, is_group);
do_render_buddy_list_tooltip(elem, title_data); do_render_buddy_list_tooltip(elem, title_data);
}); });
@@ -553,7 +553,7 @@ exports.initialize = function () {
// MISC // MISC
(function () { (function () {
var sel = ["#group-pm-list", "#stream_filters", "#global_filters", "#user_presences"].join(", "); const sel = ["#group-pm-list", "#stream_filters", "#global_filters", "#user_presences"].join(", ");
$(sel).on("click", "a", function () { $(sel).on("click", "a", function () {
this.blur(); this.blur();
@@ -575,7 +575,7 @@ exports.initialize = function () {
// this will hide the alerts that you click "x" on. // this will hide the alerts that you click "x" on.
$("body").on("click", ".alert-box > div .exit", function () { $("body").on("click", ".alert-box > div .exit", function () {
var $alert = $(this).closest(".alert-box > div"); const $alert = $(this).closest(".alert-box > div");
$alert.addClass("fade-out"); $alert.addClass("fade-out");
setTimeout(function () { setTimeout(function () {
$alert.removeClass("fade-out show"); $alert.removeClass("fade-out show");
@@ -634,7 +634,7 @@ exports.initialize = function () {
}); });
$("body").on("click", "[data-overlay-trigger]", function () { $("body").on("click", "[data-overlay-trigger]", function () {
var target = $(this).attr("data-overlay-trigger"); const target = $(this).attr("data-overlay-trigger");
info_overlay.show(target); info_overlay.show(target);
}); });
@@ -704,7 +704,7 @@ exports.initialize = function () {
$('body').on('click', '.webathena_login', function (e) { $('body').on('click', '.webathena_login', function (e) {
$("#zephyr-mirror-error").removeClass("show"); $("#zephyr-mirror-error").removeClass("show");
var principal = ["zephyr", "zephyr"]; const principal = ["zephyr", "zephyr"];
WinChan.open({ WinChan.open({
url: "https://webathena.mit.edu/#!request_ticket_v1", url: "https://webathena.mit.edu/#!request_ticket_v1",
relay_url: "https://webathena.mit.edu/relay.html", relay_url: "https://webathena.mit.edu/relay.html",
@@ -745,7 +745,7 @@ exports.initialize = function () {
}); });
(function () { (function () {
var map = { const map = {
".stream-description-editable": { ".stream-description-editable": {
on_start: stream_edit.set_raw_description, on_start: stream_edit.set_raw_description,
on_save: stream_edit.change_stream_description, on_save: stream_edit.change_stream_description,
@@ -777,7 +777,7 @@ exports.initialize = function () {
// if there are any child nodes, inclusive of <br> which means you // if there are any child nodes, inclusive of <br> which means you
// have lines in your description or title, you're doing something // have lines in your description or title, you're doing something
// wrong. // wrong.
for (var x = 0; x < this.childNodes.length; x += 1) { for (let x = 0; x < this.childNodes.length; x += 1) {
if (this.childNodes[x].nodeType !== 3) { if (this.childNodes[x].nodeType !== 3) {
this.innerText = this.innerText.replace(/\n/, ""); this.innerText = this.innerText.replace(/\n/, "");
break; break;
@@ -786,8 +786,8 @@ exports.initialize = function () {
}); });
$("body").on("click", "[data-make-editable]", function () { $("body").on("click", "[data-make-editable]", function () {
var selector = $(this).attr("data-make-editable"); const selector = $(this).attr("data-make-editable");
var edit_area = $(this).parent().find(selector); const edit_area = $(this).parent().find(selector);
if (edit_area.attr("contenteditable") === "true") { if (edit_area.attr("contenteditable") === "true") {
$("[data-finish-editing='" + selector + "']").hide(); $("[data-finish-editing='" + selector + "']").hide();
edit_area.attr("contenteditable", false); edit_area.attr("contenteditable", false);
@@ -810,7 +810,7 @@ exports.initialize = function () {
}); });
$("body").on("click", "[data-finish-editing]", function (e) { $("body").on("click", "[data-finish-editing]", function (e) {
var selector = $(this).attr("data-finish-editing"); const selector = $(this).attr("data-finish-editing");
if (map[selector].on_save) { if (map[selector].on_save) {
map[selector].on_save(e); map[selector].on_save(e);
$(this).hide(); $(this).hide();
@@ -829,11 +829,11 @@ exports.initialize = function () {
hotspots.close_hotspot_icon(this); hotspots.close_hotspot_icon(this);
// show popover // show popover
var hotspot_name = $(e.target).closest('.hotspot-icon') const hotspot_name = $(e.target).closest('.hotspot-icon')
.attr('id') .attr('id')
.replace('hotspot_', '') .replace('hotspot_', '')
.replace('_icon', ''); .replace('_icon', '');
var overlay_name = 'hotspot_' + hotspot_name + '_overlay'; const overlay_name = 'hotspot_' + hotspot_name + '_overlay';
overlays.open_overlay({ overlays.open_overlay({
name: overlay_name, name: overlay_name,
@@ -856,9 +856,9 @@ exports.initialize = function () {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
var overlay_name = $(this).closest('.hotspot.overlay').attr('id'); const overlay_name = $(this).closest('.hotspot.overlay').attr('id');
var hotspot_name = overlay_name const hotspot_name = overlay_name
.replace('hotspot_', '') .replace('hotspot_', '')
.replace('_overlay', ''); .replace('_overlay', '');

View File

@@ -1,9 +1,9 @@
const TurndownService = require("turndown/lib/turndown.cjs.js"); const TurndownService = require("turndown/lib/turndown.cjs.js");
function find_boundary_tr(initial_tr, iterate_row) { function find_boundary_tr(initial_tr, iterate_row) {
var j; let j;
var skip_same_td_check = false; let skip_same_td_check = false;
var tr = initial_tr; let tr = initial_tr;
// If the selection boundary is somewhere that does not have a // If the selection boundary is somewhere that does not have a
// parent tr, we should let the browser handle the copy-paste // parent tr, we should let the browser handle the copy-paste
@@ -34,7 +34,7 @@ function find_boundary_tr(initial_tr, iterate_row) {
} }
function construct_recipient_header(message_row) { function construct_recipient_header(message_row) {
var message_header_content = rows.get_message_recipient_header(message_row) const message_header_content = rows.get_message_recipient_header(message_row)
.text() .text()
.replace(/\s+/g, " ") .replace(/\s+/g, " ")
.replace(/^\s/, "").replace(/\s$/, ""); .replace(/^\s/, "").replace(/\s$/, "");
@@ -57,14 +57,14 @@ how modern browsers deal with copy/paste. Just test
your changes carefully. your changes carefully.
*/ */
function construct_copy_div(div, start_id, end_id) { function construct_copy_div(div, start_id, end_id) {
var start_row = current_msg_list.get_row(start_id); const start_row = current_msg_list.get_row(start_id);
var start_recipient_row = rows.get_message_recipient_row(start_row); const start_recipient_row = rows.get_message_recipient_row(start_row);
var start_recipient_row_id = rows.id_for_recipient_row(start_recipient_row); const start_recipient_row_id = rows.id_for_recipient_row(start_recipient_row);
var should_include_start_recipient_header = false; let should_include_start_recipient_header = false;
var last_recipient_row_id = start_recipient_row_id; let last_recipient_row_id = start_recipient_row_id;
for (var row = start_row; rows.id(row) <= end_id; row = rows.next_visible(row)) { for (let row = start_row; rows.id(row) <= end_id; row = rows.next_visible(row)) {
var recipient_row_id = rows.id_for_recipient_row(rows.get_message_recipient_row(row)); const recipient_row_id = rows.id_for_recipient_row(rows.get_message_recipient_row(row));
// if we found a message from another recipient, // if we found a message from another recipient,
// it means that we have messages from several recipients, // it means that we have messages from several recipients,
// so we have to add new recipient's bar to final copied message // so we have to add new recipient's bar to final copied message
@@ -74,8 +74,8 @@ function construct_copy_div(div, start_id, end_id) {
last_recipient_row_id = recipient_row_id; last_recipient_row_id = recipient_row_id;
should_include_start_recipient_header = true; should_include_start_recipient_header = true;
} }
var message = current_msg_list.get(rows.id(row)); const message = current_msg_list.get(rows.id(row));
var message_firstp = $(message.content).slice(0, 1); const message_firstp = $(message.content).slice(0, 1);
message_firstp.prepend(message.sender_full_name + ": "); message_firstp.prepend(message.sender_full_name + ": ");
div.append(message_firstp); div.append(message_firstp);
div.append($(message.content).slice(1)); div.append($(message.content).slice(1));
@@ -132,13 +132,13 @@ exports.copy_handler = function () {
// * Otherwise, we want to copy the bodies of all messages that // * Otherwise, we want to copy the bodies of all messages that
// were partially covered by the selection. // were partially covered by the selection.
var selection = window.getSelection(); const selection = window.getSelection();
var analysis = exports.analyze_selection(selection); const analysis = exports.analyze_selection(selection);
var ranges = analysis.ranges; const ranges = analysis.ranges;
var start_id = analysis.start_id; const start_id = analysis.start_id;
var end_id = analysis.end_id; const end_id = analysis.end_id;
var skip_same_td_check = analysis.skip_same_td_check; const skip_same_td_check = analysis.skip_same_td_check;
var div = $('<div>'); const div = $('<div>');
if (start_id === undefined || end_id === undefined) { if (start_id === undefined || end_id === undefined) {
// In this case either the starting message or the ending // In this case either the starting message or the ending
@@ -186,20 +186,20 @@ exports.analyze_selection = function (selection) {
// analyze the combined range of the selections, and copy their // analyze the combined range of the selections, and copy their
// full content. // full content.
var i; let i;
var range; let range;
var ranges = []; const ranges = [];
var startc; let startc;
var endc; let endc;
var initial_end_tr; let initial_end_tr;
var start_id; let start_id;
var end_id; let end_id;
var start_data; let start_data;
var end_data; let end_data;
// skip_same_td_check is true whenever we know for a fact that the // skip_same_td_check is true whenever we know for a fact that the
// selection covers multiple messages (and thus we should no // selection covers multiple messages (and thus we should no
// longer consider letting the browser handle the copy event). // longer consider letting the browser handle the copy event).
var skip_same_td_check = false; let skip_same_td_check = false;
for (i = 0; i < selection.rangeCount; i += 1) { for (i = 0; i < selection.rangeCount; i += 1) {
range = selection.getRangeAt(i); range = selection.getRangeAt(i);
@@ -297,7 +297,7 @@ exports.paste_handler_converter = function (paste_html) {
}; };
exports.paste_handler = function (event) { exports.paste_handler = function (event) {
var clipboardData = event.originalEvent.clipboardData; const clipboardData = event.originalEvent.clipboardData;
if (!clipboardData) { if (!clipboardData) {
// On IE11, ClipboardData isn't defined. One can instead // On IE11, ClipboardData isn't defined. One can instead
// access it with `window.clipboardData`, but even that // access it with `window.clipboardData`, but even that
@@ -308,10 +308,10 @@ exports.paste_handler = function (event) {
} }
if (clipboardData.getData) { if (clipboardData.getData) {
var paste_html = clipboardData.getData('text/html'); const paste_html = clipboardData.getData('text/html');
if (paste_html && page_params.development_environment) { if (paste_html && page_params.development_environment) {
var text = exports.paste_handler_converter(paste_html); const text = exports.paste_handler_converter(paste_html);
var mdImageRegex = /^!\[.*\]\(.*\)$/; const mdImageRegex = /^!\[.*\]\(.*\)$/;
if (text.match(mdImageRegex)) { if (text.match(mdImageRegex)) {
// This block catches cases where we are pasting an // This block catches cases where we are pasting an
// image into Zulip, which should be handled by the // image into Zulip, which should be handled by the

View File

@@ -10,7 +10,7 @@ exports.get_hash_section = function (hash) {
return ''; return '';
} }
var parts = hash.replace(/\/$/, "").split(/\//); const parts = hash.replace(/\/$/, "").split(/\//);
return parts[1] || ''; return parts[1] || '';
}; };
@@ -26,7 +26,7 @@ exports.encodeHashComponent = function (str) {
exports.encode_operand = function (operator, operand) { exports.encode_operand = function (operator, operand) {
if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') { if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
var slug = people.emails_to_slug(operand); const slug = people.emails_to_slug(operand);
if (slug) { if (slug) {
return slug; return slug;
} }
@@ -42,7 +42,7 @@ exports.encode_operand = function (operator, operand) {
exports.encode_stream_id = function (stream_id) { exports.encode_stream_id = function (stream_id) {
// stream_data appends the stream name, but it does not do the // stream_data appends the stream name, but it does not do the
// URI encoding piece // URI encoding piece
var slug = stream_data.id_to_slug(stream_id); const slug = stream_data.id_to_slug(stream_id);
return exports.encodeHashComponent(slug); return exports.encodeHashComponent(slug);
}; };
@@ -61,7 +61,7 @@ exports.decodeHashComponent = function (str) {
exports.decode_operand = function (operator, operand) { exports.decode_operand = function (operator, operand) {
if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') { if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
var emails = people.slug_to_emails(operand); const emails = people.slug_to_emails(operand);
if (emails) { if (emails) {
return emails; return emails;
} }
@@ -89,16 +89,16 @@ exports.by_stream_topic_uri = function (stream_id, topic) {
// corresponding hash: the # component // corresponding hash: the # component
// of the narrow URL // of the narrow URL
exports.operators_to_hash = function (operators) { exports.operators_to_hash = function (operators) {
var hash = '#'; let hash = '#';
if (operators !== undefined) { if (operators !== undefined) {
hash = '#narrow'; hash = '#narrow';
_.each(operators, function (elem) { _.each(operators, function (elem) {
// Support legacy tuples. // Support legacy tuples.
var operator = elem.operator; const operator = elem.operator;
var operand = elem.operand; const operand = elem.operand;
var sign = elem.negated ? '-' : ''; const sign = elem.negated ? '-' : '';
hash += '/' + sign + exports.encodeHashComponent(operator) hash += '/' + sign + exports.encodeHashComponent(operator)
+ '/' + exports.encode_operand(operator, operand); + '/' + exports.encode_operand(operator, operand);
}); });
@@ -128,11 +128,11 @@ exports.huddle_with_uri = function (user_ids_string) {
}; };
exports.by_conversation_and_time_uri = function (message) { exports.by_conversation_and_time_uri = function (message) {
var absolute_url = window.location.protocol + "//" + const absolute_url = window.location.protocol + "//" +
window.location.host + "/" + window.location.host + "/" +
window.location.pathname.split('/')[1]; window.location.pathname.split('/')[1];
var suffix = "/near/" + exports.encodeHashComponent(message.id); const suffix = "/near/" + exports.encodeHashComponent(message.id);
if (message.type === "stream") { if (message.type === "stream") {
return absolute_url + return absolute_url +
@@ -144,30 +144,30 @@ exports.by_conversation_and_time_uri = function (message) {
}; };
exports.stream_edit_uri = function (sub) { exports.stream_edit_uri = function (sub) {
var hash = "#streams" + "/" + sub.stream_id + "/" + exports.encodeHashComponent(sub.name); const hash = "#streams" + "/" + sub.stream_id + "/" + exports.encodeHashComponent(sub.name);
return hash; return hash;
}; };
exports.parse_narrow = function (hash) { exports.parse_narrow = function (hash) {
var i; let i;
var operators = []; const operators = [];
for (i = 1; i < hash.length; i += 2) { for (i = 1; i < hash.length; i += 2) {
// We don't construct URLs with an odd number of components, // We don't construct URLs with an odd number of components,
// but the user might write one. // but the user might write one.
var operator = exports.decodeHashComponent(hash[i]); let operator = exports.decodeHashComponent(hash[i]);
// Do not parse further if empty operator encountered. // Do not parse further if empty operator encountered.
if (operator === '') { if (operator === '') {
break; break;
} }
var raw_operand = hash[i + 1]; const raw_operand = hash[i + 1];
if (!raw_operand) { if (!raw_operand) {
return; return;
} }
var operand = exports.decode_operand(operator, raw_operand); const operand = exports.decode_operand(operator, raw_operand);
var negated = false; let negated = false;
if (operator[0] === '-') { if (operator[0] === '-') {
negated = true; negated = true;
operator = operator.slice(1); operator = operator.slice(1);

View File

@@ -1,7 +1,7 @@
var render_bookend = require('../templates/bookend.hbs'); const render_bookend = require('../templates/bookend.hbs');
var render_message_group = require('../templates/message_group.hbs'); const render_message_group = require('../templates/message_group.hbs');
var render_recipient_row = require('../templates/recipient_row.hbs'); const render_recipient_row = require('../templates/recipient_row.hbs');
var render_single_message = require('../templates/single_message.hbs'); const render_single_message = require('../templates/single_message.hbs');
function MessageListView(list, table_name, collapse_messages) { function MessageListView(list, table_name, collapse_messages) {
this.list = list; this.list = list;
@@ -20,10 +20,10 @@ function MessageListView(list, table_name, collapse_messages) {
} }
function get_user_id_for_mention_button(elem) { function get_user_id_for_mention_button(elem) {
var user_id = $(elem).attr('data-user-id'); const user_id = $(elem).attr('data-user-id');
// Handle legacy markdown that was rendered before we cut // Handle legacy markdown that was rendered before we cut
// over to using data-user-id. // over to using data-user-id.
var email = $(elem).attr('data-user-email'); const email = $(elem).attr('data-user-email');
if (user_id === "*" || email === "*") { if (user_id === "*" || email === "*") {
return "*"; return "*";
@@ -35,7 +35,7 @@ function get_user_id_for_mention_button(elem) {
if (email) { if (email) {
// Will return undefined if there's no match // Will return undefined if there's no match
var user = people.get_by_email(email); const user = people.get_by_email(email);
if (user) { if (user) {
return user.user_id; return user.user_id;
} }
@@ -45,7 +45,7 @@ function get_user_id_for_mention_button(elem) {
} }
function get_user_group_id_for_mention_button(elem) { function get_user_group_id_for_mention_button(elem) {
var user_group_id = $(elem).attr('data-user-group-id'); const user_group_id = $(elem).attr('data-user-group-id');
if (user_group_id) { if (user_group_id) {
return user_group_id; return user_group_id;
@@ -58,8 +58,8 @@ function same_day(earlier_msg, later_msg) {
if (earlier_msg === undefined || later_msg === undefined) { if (earlier_msg === undefined || later_msg === undefined) {
return false; return false;
} }
var earlier_time = new XDate(earlier_msg.msg.timestamp * 1000); const earlier_time = new XDate(earlier_msg.msg.timestamp * 1000);
var later_time = new XDate(later_msg.msg.timestamp * 1000); const later_time = new XDate(later_msg.msg.timestamp * 1000);
return earlier_time.toDateString() === later_time.toDateString(); return earlier_time.toDateString() === later_time.toDateString();
} }
@@ -79,19 +79,19 @@ function same_recipient(a, b) {
} }
function render_group_display_date(group, message_container) { function render_group_display_date(group, message_container) {
var time = new XDate(message_container.msg.timestamp * 1000); const time = new XDate(message_container.msg.timestamp * 1000);
var today = new XDate(); const today = new XDate();
var date_element = timerender.render_date(time, undefined, today)[0]; const date_element = timerender.render_date(time, undefined, today)[0];
group.date = date_element.outerHTML; group.date = date_element.outerHTML;
} }
function update_group_date_divider(group, message_container, prev) { function update_group_date_divider(group, message_container, prev) {
var time = new XDate(message_container.msg.timestamp * 1000); const time = new XDate(message_container.msg.timestamp * 1000);
var today = new XDate(); const today = new XDate();
if (prev !== undefined) { if (prev !== undefined) {
var prev_time = new XDate(prev.msg.timestamp * 1000); const prev_time = new XDate(prev.msg.timestamp * 1000);
if (time.toDateString() !== prev_time.toDateString()) { if (time.toDateString() !== prev_time.toDateString()) {
// NB: group_date_divider_html is HTML, inserted into the document without escaping. // NB: group_date_divider_html is HTML, inserted into the document without escaping.
group.group_date_divider_html = timerender.render_date(time, prev_time, group.group_date_divider_html = timerender.render_date(time, prev_time,
@@ -118,17 +118,17 @@ function clear_message_date_divider(msg) {
} }
function update_message_date_divider(opts) { function update_message_date_divider(opts) {
var prev_msg_container = opts.prev_msg_container; const prev_msg_container = opts.prev_msg_container;
var curr_msg_container = opts.curr_msg_container; const curr_msg_container = opts.curr_msg_container;
if (!prev_msg_container || same_day(curr_msg_container, prev_msg_container)) { if (!prev_msg_container || same_day(curr_msg_container, prev_msg_container)) {
clear_message_date_divider(curr_msg_container); clear_message_date_divider(curr_msg_container);
return; return;
} }
var prev_time = new XDate(prev_msg_container.msg.timestamp * 1000); const prev_time = new XDate(prev_msg_container.msg.timestamp * 1000);
var curr_time = new XDate(curr_msg_container.msg.timestamp * 1000); const curr_time = new XDate(curr_msg_container.msg.timestamp * 1000);
var today = new XDate(); const today = new XDate();
curr_msg_container.want_date_divider = true; curr_msg_container.want_date_divider = true;
curr_msg_container.date_divider_html = curr_msg_container.date_divider_html =
@@ -136,7 +136,7 @@ function update_message_date_divider(opts) {
} }
function set_timestr(message_container) { function set_timestr(message_container) {
var time = new XDate(message_container.msg.timestamp * 1000); const time = new XDate(message_container.msg.timestamp * 1000);
message_container.timestr = timerender.stringify_time(time); message_container.timestr = timerender.stringify_time(time);
} }
@@ -166,7 +166,7 @@ function populate_group_from_message_container(group, message_container) {
group.match_topic = util.get_match_topic(message_container.msg); group.match_topic = util.get_match_topic(message_container.msg);
group.stream_url = message_container.stream_url; group.stream_url = message_container.stream_url;
group.topic_url = message_container.topic_url; group.topic_url = message_container.topic_url;
var sub = stream_data.get_sub(message_container.msg.stream); const sub = stream_data.get_sub(message_container.msg.stream);
if (sub === undefined) { if (sub === undefined) {
// Hack to handle unusual cases like the tutorial where // Hack to handle unusual cases like the tutorial where
// the streams used don't actually exist in the subs // the streams used don't actually exist in the subs
@@ -196,8 +196,8 @@ MessageListView.prototype = {
_get_msg_timestring: function (message_container) { _get_msg_timestring: function (message_container) {
if (message_container.msg.last_edit_timestamp !== undefined) { if (message_container.msg.last_edit_timestamp !== undefined) {
var last_edit_time = new XDate(message_container.msg.last_edit_timestamp * 1000); const last_edit_time = new XDate(message_container.msg.last_edit_timestamp * 1000);
var today = new XDate(); const today = new XDate();
return timerender.render_date(last_edit_time, undefined, today)[0].textContent + return timerender.render_date(last_edit_time, undefined, today)[0].textContent +
" at " + timerender.stringify_time(last_edit_time); " at " + timerender.stringify_time(last_edit_time);
} }
@@ -211,9 +211,9 @@ MessageListView.prototype = {
// * `edited_in_left_col` -- when label appears in left column. // * `edited_in_left_col` -- when label appears in left column.
// * `edited_alongside_sender` -- when label appears alongside sender info. // * `edited_alongside_sender` -- when label appears alongside sender info.
// * `edited_status_msg` -- when label appears for a "/me" message. // * `edited_status_msg` -- when label appears for a "/me" message.
var last_edit_timestr = this._get_msg_timestring(message_container); const last_edit_timestr = this._get_msg_timestring(message_container);
var include_sender = message_container.include_sender; const include_sender = message_container.include_sender;
var status_message = Boolean(message_container.status_message); const status_message = Boolean(message_container.status_message);
if (last_edit_timestr !== undefined) { if (last_edit_timestr !== undefined) {
message_container.last_edit_timestr = last_edit_timestr; message_container.last_edit_timestr = last_edit_timestr;
message_container.edited_in_left_col = !include_sender; message_container.edited_in_left_col = !include_sender;
@@ -227,9 +227,9 @@ MessageListView.prototype = {
return; return;
} }
var last_subscribed = !last_msg_container.msg.historical; const last_subscribed = !last_msg_container.msg.historical;
var first_subscribed = !first_msg_container.msg.historical; const first_subscribed = !first_msg_container.msg.historical;
var stream = first_msg_container.msg.stream; const stream = first_msg_container.msg.stream;
if (!last_subscribed && first_subscribed) { if (!last_subscribed && first_subscribed) {
group.bookend_top = true; group.bookend_top = true;
@@ -254,10 +254,10 @@ MessageListView.prototype = {
}; };
} }
var self = this; const self = this;
var current_group = start_group(); let current_group = start_group();
var new_message_groups = []; const new_message_groups = [];
var prev; let prev;
function add_message_container_to_group(message_container) { function add_message_container_to_group(message_container) {
if (same_sender(prev, message_container)) { if (same_sender(prev, message_container)) {
@@ -278,7 +278,7 @@ MessageListView.prototype = {
} }
_.each(message_containers, function (message_container) { _.each(message_containers, function (message_container) {
var message_reactions = reactions.get_message_reactions(message_container.msg); const message_reactions = reactions.get_message_reactions(message_container.msg);
message_container.msg.message_reactions = message_reactions; message_container.msg.message_reactions = message_reactions;
message_container.include_recipient = false; message_container.include_recipient = false;
message_container.include_footer = false; message_container.include_footer = false;
@@ -364,8 +364,8 @@ MessageListView.prototype = {
if (first_group === undefined || second_group === undefined) { if (first_group === undefined || second_group === undefined) {
return false; return false;
} }
var last_msg_container = _.last(first_group.message_containers); const last_msg_container = _.last(first_group.message_containers);
var first_msg_container = _.first(second_group.message_containers); const first_msg_container = _.first(second_group.message_containers);
// Join two groups into one. // Join two groups into one.
if (this.collapse_messages && same_recipient(last_msg_container, first_msg_container) && if (this.collapse_messages && same_recipient(last_msg_container, first_msg_container) &&
@@ -403,17 +403,17 @@ MessageListView.prototype = {
// append_messages are messages which should be added to the last group in the DOM // append_messages are messages which should be added to the last group in the DOM
// rerender_messages are messages which should be updated in place in the DOM // rerender_messages are messages which should be updated in place in the DOM
var message_actions = { const message_actions = {
append_groups: [], append_groups: [],
prepend_groups: [], prepend_groups: [],
rerender_groups: [], rerender_groups: [],
append_messages: [], append_messages: [],
rerender_messages_next_same_sender: [], rerender_messages_next_same_sender: [],
}; };
var first_group; let first_group;
var second_group; let second_group;
var curr_msg_container; let curr_msg_container;
var prev_msg_container; let prev_msg_container;
if (where === 'top') { if (where === 'top') {
first_group = _.last(new_message_groups); first_group = _.last(new_message_groups);
@@ -431,7 +431,7 @@ MessageListView.prototype = {
curr_msg_container = _.first(second_group.message_containers); curr_msg_container = _.first(second_group.message_containers);
} }
var was_joined = this.join_message_groups(first_group, second_group); const was_joined = this.join_message_groups(first_group, second_group);
if (was_joined) { if (was_joined) {
update_message_date_divider({ update_message_date_divider({
prev_msg_container: prev_msg_container, prev_msg_container: prev_msg_container,
@@ -501,9 +501,9 @@ MessageListView.prototype = {
blueslip.error('programming error--pass in jQuery objects'); blueslip.error('programming error--pass in jQuery objects');
} }
var self = this; const self = this;
_.each($message_rows, function (dom_row) { _.each($message_rows, function (dom_row) {
var row = $(dom_row); const row = $(dom_row);
self._put_row(row); self._put_row(row);
self._post_process_single_row(row); self._post_process_single_row(row);
}); });
@@ -521,7 +521,7 @@ MessageListView.prototype = {
blueslip.error('programming error--expected single element'); blueslip.error('programming error--expected single element');
} }
var content = row.find('.message_content'); const content = row.find('.message_content');
// Set the rtl class if the text has an rtl direction // Set the rtl class if the text has an rtl direction
if (rtl.get_direction(content.text()) === 'rtl') { if (rtl.get_direction(content.text()) === 'rtl') {
@@ -529,7 +529,7 @@ MessageListView.prototype = {
} }
content.find('.user-mention').each(function () { content.find('.user-mention').each(function () {
var user_id = get_user_id_for_mention_button(this); const user_id = get_user_id_for_mention_button(this);
// We give special highlights to the mention buttons // We give special highlights to the mention buttons
// that refer to the current user. // that refer to the current user.
if (user_id === "*" || people.is_my_user_id(user_id)) { if (user_id === "*" || people.is_my_user_id(user_id)) {
@@ -541,7 +541,7 @@ MessageListView.prototype = {
// mention text to show the user's current name, // mention text to show the user's current name,
// assuming that you're not searching for text // assuming that you're not searching for text
// inside the highlight. // inside the highlight.
var person = people.get_person_from_user_id(user_id); const person = people.get_person_from_user_id(user_id);
if (person !== undefined) { if (person !== undefined) {
// Note that person might be undefined in some // Note that person might be undefined in some
// unpleasant corner cases involving data import. // unpleasant corner cases involving data import.
@@ -551,8 +551,8 @@ MessageListView.prototype = {
}); });
content.find('.user-group-mention').each(function () { content.find('.user-group-mention').each(function () {
var user_group_id = get_user_group_id_for_mention_button(this); const user_group_id = get_user_group_id_for_mention_button(this);
var user_group = user_groups.get_user_group_from_id(user_group_id, true); const user_group = user_groups.get_user_group_from_id(user_group_id, true);
if (user_group === undefined) { if (user_group === undefined) {
// This is a user group the current user doesn't have // This is a user group the current user doesn't have
// data on. This can happen when user groups are // data on. This can happen when user groups are
@@ -561,7 +561,7 @@ MessageListView.prototype = {
return; return;
} }
var my_user_id = people.my_current_user_id(); const my_user_id = people.my_current_user_id();
// Mark user group you're a member of. // Mark user group you're a member of.
if (user_groups.is_member_of(user_group_id, my_user_id)) { if (user_groups.is_member_of(user_group_id, my_user_id)) {
$(this).addClass('user-mention-me'); $(this).addClass('user-mention-me');
@@ -575,7 +575,7 @@ MessageListView.prototype = {
}); });
content.find('a.stream').each(function () { content.find('a.stream').each(function () {
var stream_id = $(this).attr('data-stream-id'); const stream_id = $(this).attr('data-stream-id');
if (stream_id && !$(this).find(".highlight").length) { if (stream_id && !$(this).find(".highlight").length) {
// Display the current name for stream if it is not // Display the current name for stream if it is not
// being displayed in search highlight. // being displayed in search highlight.
@@ -584,12 +584,12 @@ MessageListView.prototype = {
}); });
content.find('a.stream-topic').each(function () { content.find('a.stream-topic').each(function () {
var stream_id = $(this).attr('data-stream-id'); const stream_id = $(this).attr('data-stream-id');
if (stream_id && !$(this).find(".highlight").length) { if (stream_id && !$(this).find(".highlight").length) {
// Display the current name for stream if it is not // Display the current name for stream if it is not
// being displayed in search highlight. // being displayed in search highlight.
var text = $(this).text(); const text = $(this).text();
var topic = text.split('>', 2)[1]; const topic = text.split('>', 2)[1];
$(this).text("#" + stream_data.maybe_get_stream_name(stream_id) + ' > ' + topic); $(this).text("#" + stream_data.maybe_get_stream_name(stream_id) + ' > ' + topic);
} }
}); });
@@ -598,12 +598,12 @@ MessageListView.prototype = {
// page_params.emojiset is 'text'. // page_params.emojiset is 'text'.
if (page_params.emojiset === 'text') { if (page_params.emojiset === 'text') {
content.find(".emoji").replaceWith(function () { content.find(".emoji").replaceWith(function () {
var text = $(this).attr("title"); const text = $(this).attr("title");
return ":" + text + ":"; return ":" + text + ":";
}); });
} }
var id = rows.id(row); const id = rows.id(row);
message_edit.maybe_show_edit(row, id); message_edit.maybe_show_edit(row, id);
submessage.process_submessages({ submessage.process_submessages({
@@ -613,18 +613,18 @@ MessageListView.prototype = {
}, },
_get_message_template: function (message_container) { _get_message_template: function (message_container) {
var msg_reactions = reactions.get_message_reactions(message_container.msg); const msg_reactions = reactions.get_message_reactions(message_container.msg);
message_container.msg.message_reactions = msg_reactions; message_container.msg.message_reactions = msg_reactions;
var msg_to_render = _.extend(message_container, { const msg_to_render = _.extend(message_container, {
table_name: this.table_name, table_name: this.table_name,
}); });
return render_single_message(msg_to_render); return render_single_message(msg_to_render);
}, },
_render_group: function (opts) { _render_group: function (opts) {
var message_groups = opts.message_groups; const message_groups = opts.message_groups;
var use_match_properties = opts.use_match_properties; const use_match_properties = opts.use_match_properties;
var table_name = opts.table_name; const table_name = opts.table_name;
return $(render_message_group({ return $(render_message_group({
message_groups: message_groups, message_groups: message_groups,
@@ -639,22 +639,22 @@ MessageListView.prototype = {
// Store this in a separate variable so it doesn't get // Store this in a separate variable so it doesn't get
// confusingly masked in upcoming loops. // confusingly masked in upcoming loops.
var self = this; const self = this;
if (messages.length === 0 || self.table_name === undefined) { if (messages.length === 0 || self.table_name === undefined) {
return; return;
} }
var list = self.list; // for convenience const list = self.list; // for convenience
var table_name = self.table_name; const table_name = self.table_name;
var table = rows.get_table(table_name); const table = rows.get_table(table_name);
var orig_scrolltop_offset; let orig_scrolltop_offset;
// If we start with the message feed scrolled up (i.e. // If we start with the message feed scrolled up (i.e.
// the bottom message is not visible), then we will respect // the bottom message is not visible), then we will respect
// the user's current position after rendering, rather // the user's current position after rendering, rather
// than auto-scrolling. // than auto-scrolling.
var started_scrolled_up = message_viewport.is_scrolled_up(); const started_scrolled_up = message_viewport.is_scrolled_up();
// The messages we are being asked to render are shared with between // The messages we are being asked to render are shared with between
// all messages lists. To prevent having both list views overwriting // all messages lists. To prevent having both list views overwriting
@@ -690,13 +690,13 @@ MessageListView.prototype = {
return; return;
} }
var new_message_groups = self.build_message_groups(message_containers, self.table_name); const new_message_groups = self.build_message_groups(message_containers, self.table_name);
var message_actions = self.merge_message_groups(new_message_groups, where); const message_actions = self.merge_message_groups(new_message_groups, where);
var new_dom_elements = []; let new_dom_elements = [];
var rendered_groups; let rendered_groups;
var dom_messages; let dom_messages;
var last_message_row; let last_message_row;
var last_group_row; let last_group_row;
_.each(message_containers, function (message_container) { _.each(message_containers, function (message_container) {
self.message_containers[message_container.msg.id] = message_container; self.message_containers[message_container.msg.id] = message_container;
@@ -729,7 +729,7 @@ MessageListView.prototype = {
save_scroll_position(); save_scroll_position();
_.each(message_actions.rerender_groups, function (message_group) { _.each(message_actions.rerender_groups, function (message_group) {
var old_message_group = $('#' + message_group.message_group_id); const old_message_group = $('#' + message_group.message_group_id);
// Remove the top date_row, we'll re-add it after rendering // Remove the top date_row, we'll re-add it after rendering
old_message_group.prev('.date_row').remove(); old_message_group.prev('.date_row').remove();
@@ -756,9 +756,9 @@ MessageListView.prototype = {
// entirely, since it appears the next_is_same_sender CSS // entirely, since it appears the next_is_same_sender CSS
// class doesn't do anything. // class doesn't do anything.
if (message_actions.rerender_messages_next_same_sender.length > 0) { if (message_actions.rerender_messages_next_same_sender.length > 0) {
var targets = message_actions.rerender_messages_next_same_sender; const targets = message_actions.rerender_messages_next_same_sender;
_.each(targets, function (message_container) { _.each(targets, function (message_container) {
var row = self.get_row(message_container.msg.id); const row = self.get_row(message_container.msg.id);
$(row).find("div.messagebox").toggleClass("next_is_same_sender", $(row).find("div.messagebox").toggleClass("next_is_same_sender",
message_container.next_is_same_sender); message_container.next_is_same_sender);
}); });
@@ -815,17 +815,17 @@ MessageListView.prototype = {
restore_scroll_position(); restore_scroll_position();
var last_message_group = _.last(self._message_groups); const last_message_group = _.last(self._message_groups);
if (last_message_group !== undefined) { if (last_message_group !== undefined) {
list.last_message_historical = list.last_message_historical =
_.last(last_message_group.message_containers).msg.historical; _.last(last_message_group.message_containers).msg.historical;
} }
var stream_name = narrow_state.stream(); const stream_name = narrow_state.stream();
if (stream_name !== undefined) { if (stream_name !== undefined) {
// If user narrows to a stream, doesn't update // If user narrows to a stream, doesn't update
// trailing bookend if user is subscribed. // trailing bookend if user is subscribed.
var sub = stream_data.get_sub(stream_name); const sub = stream_data.get_sub(stream_name);
if (sub === undefined || !sub.subscribed) { if (sub === undefined || !sub.subscribed) {
list.update_trailing_bookend(); list.update_trailing_bookend();
} }
@@ -834,12 +834,12 @@ MessageListView.prototype = {
if (list === current_msg_list) { if (list === current_msg_list) {
// Update the fade. // Update the fade.
var get_element = function (message_group) { const get_element = function (message_group) {
// We don't have a MessageGroup class, but we can at least hide the messy details // We don't have a MessageGroup class, but we can at least hide the messy details
// of rows.js from compose_fade. We provide a callback function to be lazy-- // of rows.js from compose_fade. We provide a callback function to be lazy--
// compose_fade may not actually need the elements depending on its internal // compose_fade may not actually need the elements depending on its internal
// state. // state.
var message_row = self.get_row(message_group.message_containers[0].msg.id); const message_row = self.get_row(message_group.message_containers[0].msg.id);
return rows.get_message_recipient_row(message_row); return rows.get_message_recipient_row(message_row);
}; };
@@ -850,8 +850,8 @@ MessageListView.prototype = {
// First, in single-recipient narrows, potentially // First, in single-recipient narrows, potentially
// auto-scroll to the latest message if it was sent by us. // auto-scroll to the latest message if it was sent by us.
if (narrow_state.narrowed_by_reply()) { if (narrow_state.narrowed_by_reply()) {
var selected_id = list.selected_id(); const selected_id = list.selected_id();
var i; let i;
// Iterate backwards to find the last message // Iterate backwards to find the last message
// sent_by_me, stopping at the pointer position. // sent_by_me, stopping at the pointer position.
@@ -859,7 +859,7 @@ MessageListView.prototype = {
// should be limited in how far offscreen it's willing // should be limited in how far offscreen it's willing
// to go. // to go.
for (i = messages.length - 1; i >= 0; i -= 1) { for (i = messages.length - 1; i >= 0; i -= 1) {
var id = messages[i].id; const id = messages[i].id;
if (id <= selected_id) { if (id <= selected_id) {
break; break;
} }
@@ -878,8 +878,8 @@ MessageListView.prototype = {
need_user_to_scroll: true, need_user_to_scroll: true,
}; };
} }
var new_messages_height = self._new_messages_height(new_dom_elements); const new_messages_height = self._new_messages_height(new_dom_elements);
var need_user_to_scroll = self._maybe_autoscroll(new_messages_height); const need_user_to_scroll = self._maybe_autoscroll(new_messages_height);
if (need_user_to_scroll) { if (need_user_to_scroll) {
return { return {
@@ -890,8 +890,8 @@ MessageListView.prototype = {
}, },
_new_messages_height: function (rendered_elems) { _new_messages_height: function (rendered_elems) {
var new_messages_height = 0; let new_messages_height = 0;
var id_of_last_message_sent_by_us = -1; let id_of_last_message_sent_by_us = -1;
// C++ iterators would have made this less painful // C++ iterators would have made this less painful
_.each(rendered_elems.reverse(), function (elem) { _.each(rendered_elems.reverse(), function (elem) {
@@ -903,7 +903,7 @@ MessageListView.prototype = {
if (id_of_last_message_sent_by_us > -1) { if (id_of_last_message_sent_by_us > -1) {
return; return;
} }
var row_id = rows.id(elem); const row_id = rows.id(elem);
// check for `row_id` NaN in case we're looking at a date row or bookend row // check for `row_id` NaN in case we're looking at a date row or bookend row
if (row_id > -1 && if (row_id > -1 &&
people.is_current_user(this.get_message(row_id).sender_email)) { people.is_current_user(this.get_message(row_id).sender_email)) {
@@ -920,8 +920,8 @@ MessageListView.prototype = {
// it's the max amount that we can scroll down (or "skooch // it's the max amount that we can scroll down (or "skooch
// up" the messages) before knocking the selected message // up" the messages) before knocking the selected message
// out of the feed. // out of the feed.
var selected_row_top = selected_row.offset().top; const selected_row_top = selected_row.offset().top;
var scroll_limit = selected_row_top - viewport_info.visible_top; let scroll_limit = selected_row_top - viewport_info.visible_top;
if (scroll_limit < 0) { if (scroll_limit < 0) {
// This shouldn't happen, but if we're off by a pixel or // This shouldn't happen, but if we're off by a pixel or
@@ -940,8 +940,8 @@ MessageListView.prototype = {
// //
// returns `true` if we need the user to scroll // returns `true` if we need the user to scroll
var selected_row = this.selected_row(); const selected_row = this.selected_row();
var last_visible = rows.last_visible(); const last_visible = rows.last_visible();
// Make sure we have a selected row and last visible row. (defensive) // Make sure we have a selected row and last visible row. (defensive)
if (!(selected_row && selected_row.length > 0 && last_visible)) { if (!(selected_row && selected_row.length > 0 && last_visible)) {
@@ -971,8 +971,8 @@ MessageListView.prototype = {
return false; return false;
} }
var info = message_viewport.message_viewport_info(); const info = message_viewport.message_viewport_info();
var scroll_limit = this._scroll_limit(selected_row, info); const scroll_limit = this._scroll_limit(selected_row, info);
// This next decision is fairly debatable. For a big message that // This next decision is fairly debatable. For a big message that
// would push the pointer off the screen, we do a partial autoscroll, // would push the pointer off the screen, we do a partial autoscroll,
@@ -982,8 +982,8 @@ MessageListView.prototype = {
// c) scroll amount isn't really tied to size of new messages (bad) // c) scroll amount isn't really tied to size of new messages (bad)
// d) all the bad things about scrolling for users who want messages // d) all the bad things about scrolling for users who want messages
// to stay on the screen // to stay on the screen
var scroll_amount; let scroll_amount;
var need_user_to_scroll; let need_user_to_scroll;
if (new_messages_height <= scroll_limit) { if (new_messages_height <= scroll_limit) {
// This is the happy path where we can just scroll // This is the happy path where we can just scroll
@@ -997,7 +997,7 @@ MessageListView.prototype = {
// (Even if we are somewhat constrained here, the message may // (Even if we are somewhat constrained here, the message may
// still end up being visible, so we do some arithmetic.) // still end up being visible, so we do some arithmetic.)
scroll_amount = scroll_limit; scroll_amount = scroll_limit;
var offset = message_viewport.offset_from_bottom(last_visible); const offset = message_viewport.offset_from_bottom(last_visible);
// For determining whether we need to show the user a "you // For determining whether we need to show the user a "you
// need to scroll down" notification, the obvious check // need to scroll down" notification, the obvious check
@@ -1011,11 +1011,11 @@ MessageListView.prototype = {
// this notification, we need to adjust by the amount that // this notification, we need to adjust by the amount that
// the current compose is bigger than the empty, open // the current compose is bigger than the empty, open
// compose box. // compose box.
var compose_textarea_default_height = 42; const compose_textarea_default_height = 42;
var compose_textarea_current_height = $("#compose-textarea").height(); const compose_textarea_current_height = $("#compose-textarea").height();
var expected_change = const expected_change =
compose_textarea_current_height - compose_textarea_default_height; compose_textarea_current_height - compose_textarea_default_height;
var expected_offset = offset - expected_change; const expected_offset = offset - expected_change;
need_user_to_scroll = expected_offset > scroll_amount; need_user_to_scroll = expected_offset > scroll_amount;
} }
@@ -1039,7 +1039,7 @@ MessageListView.prototype = {
}, },
update_render_window: function (selected_idx, check_for_changed) { update_render_window: function (selected_idx, check_for_changed) {
var new_start = Math.max(selected_idx - this._RENDER_WINDOW_SIZE / 2, 0); const new_start = Math.max(selected_idx - this._RENDER_WINDOW_SIZE / 2, 0);
if (check_for_changed && new_start === this._render_win_start) { if (check_for_changed && new_start === this._render_win_start) {
return false; return false;
} }
@@ -1056,7 +1056,7 @@ MessageListView.prototype = {
return false; return false;
} }
var selected_idx = this.list.selected_idx(); const selected_idx = this.list.selected_idx();
// We rerender under the following conditions: // We rerender under the following conditions:
// * The selected message is within this._RENDER_THRESHOLD messages // * The selected message is within this._RENDER_THRESHOLD messages
@@ -1085,9 +1085,9 @@ MessageListView.prototype = {
rerender_preserving_scrolltop: function (discard_rendering_state) { rerender_preserving_scrolltop: function (discard_rendering_state) {
// old_offset is the number of pixels between the top of the // old_offset is the number of pixels between the top of the
// viewable window and the selected message // viewable window and the selected message
var old_offset; let old_offset;
var selected_row = this.selected_row(); const selected_row = this.selected_row();
var selected_in_view = selected_row.length > 0; const selected_in_view = selected_row.length > 0;
if (selected_in_view) { if (selected_in_view) {
old_offset = selected_row.offset().top; old_offset = selected_row.offset().top;
} }
@@ -1102,7 +1102,7 @@ MessageListView.prototype = {
}, },
set_message_offset: function (offset) { set_message_offset: function (offset) {
var msg = this.selected_row(); const msg = this.selected_row();
message_viewport.scrollTop(message_viewport.scrollTop() + msg.offset().top - offset); message_viewport.scrollTop(message_viewport.scrollTop() + msg.offset().top - offset);
}, },
@@ -1148,23 +1148,23 @@ MessageListView.prototype = {
return; return;
} }
var first_row = this.get_row(message_containers[0].msg.id); const first_row = this.get_row(message_containers[0].msg.id);
// We may not have the row if the stream or topic was muted // We may not have the row if the stream or topic was muted
if (first_row.length === 0) { if (first_row.length === 0) {
return; return;
} }
var recipient_row = rows.get_message_recipient_row(first_row); const recipient_row = rows.get_message_recipient_row(first_row);
var header = recipient_row.find('.message_header'); const header = recipient_row.find('.message_header');
var message_group_id = recipient_row.attr("id"); const message_group_id = recipient_row.attr("id");
// Since there might be multiple dates within the message // Since there might be multiple dates within the message
// group, it's important to lookup the original/full message // group, it's important to lookup the original/full message
// group rather than doing an artificial rerendering of the // group rather than doing an artificial rerendering of the
// message header from the set of message containers passed in // message header from the set of message containers passed in
// here. // here.
var group = this._find_message_group(message_group_id); const group = this._find_message_group(message_group_id);
if (group === undefined) { if (group === undefined) {
blueslip.error("Could not find message group for rerendering headers"); blueslip.error("Could not find message group for rerendering headers");
return; return;
@@ -1176,14 +1176,14 @@ MessageListView.prototype = {
// rerendering rather than looking up the original version. // rerendering rather than looking up the original version.
populate_group_from_message_container(group, group.message_containers[0]); populate_group_from_message_container(group, group.message_containers[0]);
var rendered_recipient_row = $(render_recipient_row(group)); const rendered_recipient_row = $(render_recipient_row(group));
header.replaceWith(rendered_recipient_row); header.replaceWith(rendered_recipient_row);
}, },
_rerender_message: function (message_container, message_content_edited) { _rerender_message: function (message_container, message_content_edited) {
var row = this.get_row(message_container.msg.id); const row = this.get_row(message_container.msg.id);
var was_selected = this.list.selected_message() === message_container.msg; const was_selected = this.list.selected_message() === message_container.msg;
// Re-render just this one message // Re-render just this one message
this._maybe_format_me_message(message_container); this._maybe_format_me_message(message_container);
@@ -1192,7 +1192,7 @@ MessageListView.prototype = {
// Make sure the right thing happens if the message was edited to mention us. // Make sure the right thing happens if the message was edited to mention us.
message_container.contains_mention = message_container.msg.mentioned; message_container.contains_mention = message_container.msg.mentioned;
var rendered_msg = $(this._get_message_template(message_container)); const rendered_msg = $(this._get_message_template(message_container));
if (message_content_edited) { if (message_content_edited) {
rendered_msg.addClass("fade-in-message"); rendered_msg.addClass("fade-in-message");
} }
@@ -1205,10 +1205,10 @@ MessageListView.prototype = {
}, },
rerender_messages: function (messages, message_content_edited) { rerender_messages: function (messages, message_content_edited) {
var self = this; const self = this;
// Convert messages to list messages // Convert messages to list messages
var message_containers = _.map(messages, function (message) { let message_containers = _.map(messages, function (message) {
return self.message_containers[message.id]; return self.message_containers[message.id];
}); });
// We may not have the message_container if the stream or topic was muted // We may not have the message_container if the stream or topic was muted
@@ -1216,8 +1216,8 @@ MessageListView.prototype = {
return message_container === undefined; return message_container === undefined;
}); });
var message_groups = []; const message_groups = [];
var current_group = []; let current_group = [];
_.each(message_containers, function (message_container) { _.each(message_containers, function (message_container) {
if (current_group.length === 0 || if (current_group.length === 0 ||
same_recipient(current_group[current_group.length - 1], message_container)) { same_recipient(current_group[current_group.length - 1], message_container)) {
@@ -1237,11 +1237,11 @@ MessageListView.prototype = {
}, },
append: function (messages, messages_are_new) { append: function (messages, messages_are_new) {
var cur_window_size = this._render_win_end - this._render_win_start; const cur_window_size = this._render_win_end - this._render_win_start;
var render_info; let render_info;
if (cur_window_size < this._RENDER_WINDOW_SIZE) { if (cur_window_size < this._RENDER_WINDOW_SIZE) {
var slice_to_render = messages.slice(0, this._RENDER_WINDOW_SIZE - cur_window_size); const slice_to_render = messages.slice(0, this._RENDER_WINDOW_SIZE - cur_window_size);
render_info = this.render(slice_to_render, 'bottom', messages_are_new); render_info = this.render(slice_to_render, 'bottom', messages_are_new);
this._render_win_end += slice_to_render.length; this._render_win_end += slice_to_render.length;
} }
@@ -1251,7 +1251,7 @@ MessageListView.prototype = {
// newly received message should trigger a rerender so that // newly received message should trigger a rerender so that
// the new message, which will appear in the viewable area, // the new message, which will appear in the viewable area,
// is rendered. // is rendered.
var needed_rerender = this.maybe_rerender(); const needed_rerender = this.maybe_rerender();
if (needed_rerender) { if (needed_rerender) {
render_info = {need_user_to_scroll: true}; render_info = {need_user_to_scroll: true};
@@ -1264,10 +1264,10 @@ MessageListView.prototype = {
this._render_win_start += messages.length; this._render_win_start += messages.length;
this._render_win_end += messages.length; this._render_win_end += messages.length;
var cur_window_size = this._render_win_end - this._render_win_start; const cur_window_size = this._render_win_end - this._render_win_start;
if (cur_window_size < this._RENDER_WINDOW_SIZE) { if (cur_window_size < this._RENDER_WINDOW_SIZE) {
var msgs_to_render_count = this._RENDER_WINDOW_SIZE - cur_window_size; const msgs_to_render_count = this._RENDER_WINDOW_SIZE - cur_window_size;
var slice_to_render = messages.slice(messages.length - msgs_to_render_count); const slice_to_render = messages.slice(messages.length - msgs_to_render_count);
this.render(slice_to_render, 'top', false); this.render(slice_to_render, 'top', false);
this._render_win_start -= slice_to_render.length; this._render_win_start -= slice_to_render.length;
} }
@@ -1287,7 +1287,7 @@ MessageListView.prototype = {
}, },
get_row: function (id) { get_row: function (id) {
var row = this._rows[id]; const row = this._rows[id];
if (row === undefined) { if (row === undefined) {
// For legacy reasons we need to return an empty // For legacy reasons we need to return an empty
@@ -1299,12 +1299,12 @@ MessageListView.prototype = {
}, },
clear_trailing_bookend: function () { clear_trailing_bookend: function () {
var trailing_bookend = rows.get_table(this.table_name).find('.trailing_bookend'); const trailing_bookend = rows.get_table(this.table_name).find('.trailing_bookend');
trailing_bookend.remove(); trailing_bookend.remove();
}, },
render_trailing_bookend: function (trailing_bookend_content, subscribed, show_button) { render_trailing_bookend: function (trailing_bookend_content, subscribed, show_button) {
var rendered_trailing_bookend = $(render_bookend({ const rendered_trailing_bookend = $(render_bookend({
bookend_content: trailing_bookend_content, bookend_content: trailing_bookend_content,
trailing: show_button, trailing: show_button,
subscribed: subscribed, subscribed: subscribed,
@@ -1322,7 +1322,7 @@ MessageListView.prototype = {
change_message_id: function (old_id, new_id) { change_message_id: function (old_id, new_id) {
if (this._rows[old_id] !== undefined) { if (this._rows[old_id] !== undefined) {
var row = this._rows[old_id]; const row = this._rows[old_id];
delete this._rows[old_id]; delete this._rows[old_id];
row.attr('zid', new_id); row.attr('zid', new_id);
@@ -1332,7 +1332,7 @@ MessageListView.prototype = {
} }
if (this.message_containers[old_id] !== undefined) { if (this.message_containers[old_id] !== undefined) {
var message_container = this.message_containers[old_id]; const message_container = this.message_containers[old_id];
delete this.message_containers[old_id]; delete this.message_containers[old_id];
this.message_containers[new_id] = message_container; this.message_containers[new_id] = message_container;
} }
@@ -1344,8 +1344,8 @@ MessageListView.prototype = {
// Slice the '<p>/me ' off the front, and '</p>' off the first line // Slice the '<p>/me ' off the front, and '</p>' off the first line
// 'p' tag is sliced off to get sender in the same line as the // 'p' tag is sliced off to get sender in the same line as the
// first line of the message // first line of the message
var msg_content = message_container.msg.content; const msg_content = message_container.msg.content;
var p_index = msg_content.indexOf('</p>'); const p_index = msg_content.indexOf('</p>');
message_container.status_message = msg_content.slice('<p>/me '.length, p_index) + message_container.status_message = msg_content.slice('<p>/me '.length, p_index) +
msg_content.slice(p_index + '</p>'.length); msg_content.slice(p_index + '</p>'.length);
message_container.include_sender = true; message_container.include_sender = true;

View File

@@ -1,4 +1,4 @@
var unnarrow_times; let unnarrow_times;
function report_narrow_time(initial_core_time, initial_free_time, network_time) { function report_narrow_time(initial_core_time, initial_free_time, network_time) {
channel.post({ channel.post({
@@ -28,8 +28,8 @@ function report_unnarrow_time() {
return; return;
} }
var initial_core_time = unnarrow_times.initial_core_time - unnarrow_times.start_time; const initial_core_time = unnarrow_times.initial_core_time - unnarrow_times.start_time;
var initial_free_time = unnarrow_times.initial_free_time - unnarrow_times.start_time; const initial_free_time = unnarrow_times.initial_free_time - unnarrow_times.start_time;
channel.post({ channel.post({
url: '/json/report/unnarrow_times', url: '/json/report/unnarrow_times',
@@ -58,8 +58,8 @@ exports.save_pre_narrow_offset_for_reload = function () {
exports.narrow_title = "home"; exports.narrow_title = "home";
exports.activate = function (raw_operators, opts) { exports.activate = function (raw_operators, opts) {
var start_time = new Date(); const start_time = new Date();
var was_narrowed_already = narrow_state.active(); const was_narrowed_already = narrow_state.active();
// most users aren't going to send a bunch of a out-of-narrow messages // most users aren't going to send a bunch of a out-of-narrow messages
// and expect to visit a list of narrows, so let's get these out of the way. // and expect to visit a list of narrows, so let's get these out of the way.
notifications.clear_compose_notifications(); notifications.clear_compose_notifications();
@@ -71,8 +71,8 @@ exports.activate = function (raw_operators, opts) {
if (raw_operators.length === 0) { if (raw_operators.length === 0) {
return exports.deactivate(); return exports.deactivate();
} }
var filter = new Filter(raw_operators); const filter = new Filter(raw_operators);
var operators = filter.operators(); const operators = filter.operators();
// Take the most detailed part of the narrow to use as the title. // Take the most detailed part of the narrow to use as the title.
// If the operator is something other than "stream", "topic", or // If the operator is something other than "stream", "topic", or
@@ -84,14 +84,14 @@ exports.activate = function (raw_operators, opts) {
exports.narrow_title = filter.operands("stream")[0]; exports.narrow_title = filter.operands("stream")[0];
} }
} else if (filter.has_operator("is")) { } else if (filter.has_operator("is")) {
var title = filter.operands("is")[0]; let title = filter.operands("is")[0];
title = title.charAt(0).toUpperCase() + title.slice(1) + " messages"; title = title.charAt(0).toUpperCase() + title.slice(1) + " messages";
exports.narrow_title = title; exports.narrow_title = title;
} else if (filter.has_operator("pm-with") || filter.has_operator("group-pm-with")) { } else if (filter.has_operator("pm-with") || filter.has_operator("group-pm-with")) {
var emails = filter.public_operators()[0].operand; const emails = filter.public_operators()[0].operand;
var user_ids = people.emails_strings_to_user_ids_string(emails); const user_ids = people.emails_strings_to_user_ids_string(emails);
if (user_ids !== undefined) { if (user_ids !== undefined) {
var names = people.get_recipients(user_ids); const names = people.get_recipients(user_ids);
if (filter.has_operator("pm-with")) { if (filter.has_operator("pm-with")) {
exports.narrow_title = names; exports.narrow_title = names;
} else { } else {
@@ -120,7 +120,7 @@ exports.activate = function (raw_operators, opts) {
trigger: 'unknown', trigger: 'unknown',
}); });
var id_info = { const id_info = {
target_id: undefined, target_id: undefined,
local_select_id: undefined, local_select_id: undefined,
final_select_id: undefined, final_select_id: undefined,
@@ -140,7 +140,7 @@ exports.activate = function (raw_operators, opts) {
// having a near: narrow auto-reloaded. // having a near: narrow auto-reloaded.
id_info.target_id = opts.then_select_id; id_info.target_id = opts.then_select_id;
if (opts.then_select_offset === undefined) { if (opts.then_select_offset === undefined) {
var row = current_msg_list.get_row(opts.then_select_id); const row = current_msg_list.get_row(opts.then_select_id);
if (row.length > 0) { if (row.length > 0) {
opts.then_select_offset = row.offset().top; opts.then_select_offset = row.offset().top;
} }
@@ -157,12 +157,12 @@ exports.activate = function (raw_operators, opts) {
// reflect the upcoming narrow. // reflect the upcoming narrow.
narrow_state.set_current_filter(filter); narrow_state.set_current_filter(filter);
var muting_enabled = narrow_state.muting_enabled(); const muting_enabled = narrow_state.muting_enabled();
// Save how far from the pointer the top of the message list was. // Save how far from the pointer the top of the message list was.
exports.save_pre_narrow_offset_for_reload(); exports.save_pre_narrow_offset_for_reload();
var msg_data = new MessageListData({ let msg_data = new MessageListData({
filter: narrow_state.filter(), filter: narrow_state.filter(),
muting_enabled: muting_enabled, muting_enabled: muting_enabled,
}); });
@@ -189,7 +189,7 @@ exports.activate = function (raw_operators, opts) {
}); });
} }
var msg_list = new message_list.MessageList({ const msg_list = new message_list.MessageList({
data: msg_data, data: msg_data,
table_name: 'zfilt', table_name: 'zfilt',
collapse_messages: !narrow_state.filter().is_search(), collapse_messages: !narrow_state.filter().is_search(),
@@ -208,16 +208,16 @@ exports.activate = function (raw_operators, opts) {
message_list.set_narrowed(msg_list); message_list.set_narrowed(msg_list);
current_msg_list = message_list.narrowed; current_msg_list = message_list.narrowed;
var then_select_offset; let then_select_offset;
if (id_info.target_id === id_info.final_select_id) { if (id_info.target_id === id_info.final_select_id) {
then_select_offset = opts.then_select_offset; then_select_offset = opts.then_select_offset;
} }
var select_immediately = id_info.local_select_id !== undefined; const select_immediately = id_info.local_select_id !== undefined;
(function fetch_messages() { (function fetch_messages() {
var anchor; let anchor;
var use_first_unread; let use_first_unread;
if (id_info.final_select_id !== undefined) { if (id_info.final_select_id !== undefined) {
anchor = id_info.final_select_id; anchor = id_info.final_select_id;
@@ -266,7 +266,7 @@ exports.activate = function (raw_operators, opts) {
if (page_params.search_pills_enabled && opts.trigger !== 'search') { if (page_params.search_pills_enabled && opts.trigger !== 'search') {
search_pill_widget.widget.clear(true); search_pill_widget.widget.clear(true);
_.each(operators, function (operator) { _.each(operators, function (operator) {
var search_string = Filter.unparse([operator]); const search_string = Filter.unparse([operator]);
search_pill.append_search_string(search_string, search_pill_widget.widget); search_pill.append_search_string(search_string, search_pill_widget.widget);
}); });
} }
@@ -295,7 +295,7 @@ exports.activate = function (raw_operators, opts) {
compose_actions.on_narrow(opts); compose_actions.on_narrow(opts);
var current_filter = narrow_state.filter(); const current_filter = narrow_state.filter();
top_left_corner.handle_narrow_activated(current_filter); top_left_corner.handle_narrow_activated(current_filter);
stream_list.handle_narrow_activated(current_filter); stream_list.handle_narrow_activated(current_filter);
@@ -325,7 +325,7 @@ function load_local_messages(msg_data) {
// cases when our local cache (message_list.all) has at least // cases when our local cache (message_list.all) has at least
// one message the user will expect to see in the new narrow. // one message the user will expect to see in the new narrow.
var in_msgs = message_list.all.all_messages(); const in_msgs = message_list.all.all_messages();
msg_data.add_messages(in_msgs); msg_data.add_messages(in_msgs);
return !msg_data.empty(); return !msg_data.empty();
@@ -337,9 +337,9 @@ exports.maybe_add_local_messages = function (opts) {
// //
// - update id_info with more complete values // - update id_info with more complete values
// - add messages into our message list from our local cache // - add messages into our message list from our local cache
var id_info = opts.id_info; const id_info = opts.id_info;
var msg_data = opts.msg_data; const msg_data = opts.msg_data;
var unread_info = narrow_state.get_first_unread_info(); const unread_info = narrow_state.get_first_unread_info();
if (unread_info.flavor === 'cannot_compute') { if (unread_info.flavor === 'cannot_compute') {
if (id_info.target_id) { if (id_info.target_id) {
@@ -405,7 +405,7 @@ exports.maybe_add_local_messages = function (opts) {
// is caught up, so the last message in our now-populated // is caught up, so the last message in our now-populated
// msg_data object must be the last message matching the // msg_data object must be the last message matching the
// narrow the server could give us, so we can render locally. // narrow the server could give us, so we can render locally.
var last_msg = msg_data.last(); const last_msg = msg_data.last();
id_info.final_select_id = last_msg.id; id_info.final_select_id = last_msg.id;
id_info.local_select_id = id_info.final_select_id; id_info.local_select_id = id_info.final_select_id;
return; return;
@@ -445,19 +445,19 @@ exports.update_selection = function (opts) {
return; return;
} }
var id_info = opts.id_info; const id_info = opts.id_info;
var select_offset = opts.select_offset; const select_offset = opts.select_offset;
var msg_id = id_info.final_select_id; let msg_id = id_info.final_select_id;
if (msg_id === undefined) { if (msg_id === undefined) {
msg_id = message_list.narrowed.first_unread_message_id(); msg_id = message_list.narrowed.first_unread_message_id();
} }
var preserve_pre_narrowing_screen_position = const preserve_pre_narrowing_screen_position =
message_list.narrowed.get(msg_id) !== undefined && message_list.narrowed.get(msg_id) !== undefined &&
select_offset !== undefined; select_offset !== undefined;
var then_scroll = !preserve_pre_narrowing_screen_position; const then_scroll = !preserve_pre_narrowing_screen_position;
message_list.narrowed.select_id(msg_id, { message_list.narrowed.select_id(msg_id, {
then_scroll: then_scroll, then_scroll: then_scroll,
@@ -478,7 +478,7 @@ exports.stream_topic = function () {
// This function returns the stream/topic that we most // This function returns the stream/topic that we most
// specifically care about, according (mostly) to the // specifically care about, according (mostly) to the
// currently selected message. // currently selected message.
var msg = current_msg_list.selected_message(); const msg = current_msg_list.selected_message();
if (msg) { if (msg) {
return { return {
@@ -497,7 +497,7 @@ exports.stream_topic = function () {
exports.activate_stream_for_cycle_hotkey = function (stream_name) { exports.activate_stream_for_cycle_hotkey = function (stream_name) {
// This is the common code for A/D hotkeys. // This is the common code for A/D hotkeys.
var filter_expr = [ const filter_expr = [
{operator: 'stream', operand: stream_name}, {operator: 'stream', operand: stream_name},
]; ];
exports.activate(filter_expr, {}); exports.activate(filter_expr, {});
@@ -505,13 +505,13 @@ exports.activate_stream_for_cycle_hotkey = function (stream_name) {
exports.stream_cycle_backward = function () { exports.stream_cycle_backward = function () {
var curr_stream = narrow_state.stream(); const curr_stream = narrow_state.stream();
if (!curr_stream) { if (!curr_stream) {
return; return;
} }
var stream_name = topic_generator.get_prev_stream(curr_stream); const stream_name = topic_generator.get_prev_stream(curr_stream);
if (!stream_name) { if (!stream_name) {
return; return;
@@ -521,13 +521,13 @@ exports.stream_cycle_backward = function () {
}; };
exports.stream_cycle_forward = function () { exports.stream_cycle_forward = function () {
var curr_stream = narrow_state.stream(); const curr_stream = narrow_state.stream();
if (!curr_stream) { if (!curr_stream) {
return; return;
} }
var stream_name = topic_generator.get_next_stream(curr_stream); const stream_name = topic_generator.get_next_stream(curr_stream);
if (!stream_name) { if (!stream_name) {
return; return;
@@ -537,13 +537,13 @@ exports.stream_cycle_forward = function () {
}; };
exports.narrow_to_next_topic = function () { exports.narrow_to_next_topic = function () {
var curr_info = exports.stream_topic(); const curr_info = exports.stream_topic();
if (!curr_info) { if (!curr_info) {
return; return;
} }
var next_narrow = topic_generator.get_next_topic( const next_narrow = topic_generator.get_next_topic(
curr_info.stream, curr_info.stream,
curr_info.topic curr_info.topic
); );
@@ -552,7 +552,7 @@ exports.narrow_to_next_topic = function () {
return; return;
} }
var filter_expr = [ const filter_expr = [
{operator: 'stream', operand: next_narrow.stream}, {operator: 'stream', operand: next_narrow.stream},
{operator: 'topic', operand: next_narrow.topic}, {operator: 'topic', operand: next_narrow.topic},
]; ];
@@ -562,9 +562,9 @@ exports.narrow_to_next_topic = function () {
exports.narrow_to_next_pm_string = function () { exports.narrow_to_next_pm_string = function () {
var curr_pm = narrow_state.pm_string(); const curr_pm = narrow_state.pm_string();
var next_pm = topic_generator.get_next_unread_pm_string(curr_pm); const next_pm = topic_generator.get_next_unread_pm_string(curr_pm);
if (!next_pm) { if (!next_pm) {
return; return;
@@ -572,14 +572,14 @@ exports.narrow_to_next_pm_string = function () {
// Hopefully someday we can narrow by user_ids_string instead of // Hopefully someday we can narrow by user_ids_string instead of
// mapping back to emails. // mapping back to emails.
var pm_with = people.user_ids_string_to_emails_string(next_pm); const pm_with = people.user_ids_string_to_emails_string(next_pm);
var filter_expr = [ const filter_expr = [
{operator: 'pm-with', operand: pm_with}, {operator: 'pm-with', operand: pm_with},
]; ];
// force_close parameter is true to not auto open compose_box // force_close parameter is true to not auto open compose_box
var opts = { const opts = {
force_close: true, force_close: true,
}; };
@@ -595,7 +595,7 @@ exports.by = function (operator, operand, opts) {
exports.by_topic = function (target_id, opts) { exports.by_topic = function (target_id, opts) {
// don't use current_msg_list as it won't work for muted messages or for out-of-narrow links // don't use current_msg_list as it won't work for muted messages or for out-of-narrow links
var original = message_store.get(target_id); const original = message_store.get(target_id);
if (original.type !== 'stream') { if (original.type !== 'stream') {
// Only stream messages have topics, but the // Only stream messages have topics, but the
// user wants us to narrow in some way. // user wants us to narrow in some way.
@@ -608,7 +608,7 @@ exports.by_topic = function (target_id, opts) {
// message is about to be marked read in the new view. // message is about to be marked read in the new view.
unread_ops.notify_server_message_read(original); unread_ops.notify_server_message_read(original);
var search_terms = [ const search_terms = [
{operator: 'stream', operand: original.stream}, {operator: 'stream', operand: original.stream},
{operator: 'topic', operand: util.get_message_topic(original)}, {operator: 'topic', operand: util.get_message_topic(original)},
]; ];
@@ -620,7 +620,7 @@ exports.by_topic = function (target_id, opts) {
exports.by_recipient = function (target_id, opts) { exports.by_recipient = function (target_id, opts) {
opts = _.defaults({}, opts, {then_select_id: target_id}); opts = _.defaults({}, opts, {then_select_id: target_id});
// don't use current_msg_list as it won't work for muted messages or for out-of-narrow links // don't use current_msg_list as it won't work for muted messages or for out-of-narrow links
var message = message_store.get(target_id); const message = message_store.get(target_id);
// We don't check msg_list.can_mark_messages_read here only because // We don't check msg_list.can_mark_messages_read here only because
// the target msg_list isn't initialized yet; in any case, the // the target msg_list isn't initialized yet; in any case, the
@@ -644,21 +644,21 @@ exports.to_compose_target = function () {
return; return;
} }
var opts = { const opts = {
trigger: 'narrow_to_compose_target', trigger: 'narrow_to_compose_target',
}; };
if (compose_state.get_message_type() === 'stream') { if (compose_state.get_message_type() === 'stream') {
var stream_name = compose_state.stream_name(); const stream_name = compose_state.stream_name();
var stream_id = stream_data.get_stream_id(stream_name); const stream_id = stream_data.get_stream_id(stream_name);
if (!stream_id) { if (!stream_id) {
return; return;
} }
// If we are composing to a new topic, we narrow to the stream but // If we are composing to a new topic, we narrow to the stream but
// grey-out the message view instead of narrowing to an empty view. // grey-out the message view instead of narrowing to an empty view.
var topics = topic_data.get_recent_names(stream_id); const topics = topic_data.get_recent_names(stream_id);
var operators = [{operator: 'stream', operand: stream_name}]; const operators = [{operator: 'stream', operand: stream_name}];
var topic = compose_state.topic(); const topic = compose_state.topic();
if (topics.indexOf(topic) !== -1) { if (topics.indexOf(topic) !== -1) {
operators.push({operator: 'topic', operand: topic}); operators.push({operator: 'topic', operand: topic});
} }
@@ -667,9 +667,9 @@ exports.to_compose_target = function () {
} }
if (compose_state.get_message_type() === 'private') { if (compose_state.get_message_type() === 'private') {
var recipient_string = compose_state.recipient(); const recipient_string = compose_state.recipient();
var emails = util.extract_pm_recipients(recipient_string); const emails = util.extract_pm_recipients(recipient_string);
var invalid = _.reject(emails, people.is_valid_email_for_compose); const invalid = _.reject(emails, people.is_valid_email_for_compose);
// If there are no recipients or any recipient is // If there are no recipients or any recipient is
// invalid, narrow to all PMs. // invalid, narrow to all PMs.
if (emails.length === 0 || invalid.length > 0) { if (emails.length === 0 || invalid.length > 0) {
@@ -735,11 +735,11 @@ exports.deactivate = function () {
hashchange.save_narrow(); hashchange.save_narrow();
if (current_msg_list.selected_id() !== -1) { if (current_msg_list.selected_id() !== -1) {
var preserve_pre_narrowing_screen_position = const preserve_pre_narrowing_screen_position =
current_msg_list.selected_row().length > 0 && current_msg_list.selected_row().length > 0 &&
current_msg_list.pre_narrow_offset !== undefined; current_msg_list.pre_narrow_offset !== undefined;
var message_id_to_select; let message_id_to_select;
var select_opts = { const select_opts = {
then_scroll: true, then_scroll: true,
use_closest: true, use_closest: true,
empty_ok: true, empty_ok: true,
@@ -790,27 +790,27 @@ exports.restore_home_state = function () {
}; };
function set_invalid_narrow_message(invalid_narrow_message) { function set_invalid_narrow_message(invalid_narrow_message) {
var search_string_display = $("#empty_search_stop_words_string"); const search_string_display = $("#empty_search_stop_words_string");
search_string_display.text(invalid_narrow_message); search_string_display.text(invalid_narrow_message);
} }
function show_search_query() { function show_search_query() {
// when search bar contains multiple filters, only show search queries // when search bar contains multiple filters, only show search queries
var current_filter = narrow_state.filter(); const current_filter = narrow_state.filter();
var search_query = current_filter.operands("search")[0]; const search_query = current_filter.operands("search")[0];
var query_words = search_query.split(" "); const query_words = search_query.split(" ");
var search_string_display = $("#empty_search_stop_words_string"); const search_string_display = $("#empty_search_stop_words_string");
var query_contains_stop_words = false; let query_contains_stop_words = false;
// Also removes previous search_string if any // Also removes previous search_string if any
search_string_display.text(i18n.t("You searched for:")); search_string_display.text(i18n.t("You searched for:"));
// Add in stream:foo and topic:bar if present // Add in stream:foo and topic:bar if present
if (current_filter.has_operator("stream") || current_filter.has_operator("topic")) { if (current_filter.has_operator("stream") || current_filter.has_operator("topic")) {
var stream_topic_string = ""; let stream_topic_string = "";
var stream = current_filter.operands('stream')[0]; const stream = current_filter.operands('stream')[0];
var topic = current_filter.operands('topic')[0]; const topic = current_filter.operands('topic')[0];
if (stream) { if (stream) {
stream_topic_string = "stream: " + stream; stream_topic_string = "stream: " + stream;
} }
@@ -843,24 +843,24 @@ function show_search_query() {
} }
function pick_empty_narrow_banner() { function pick_empty_narrow_banner() {
var default_banner = $('#empty_narrow_message'); const default_banner = $('#empty_narrow_message');
var current_filter = narrow_state.filter(); const current_filter = narrow_state.filter();
if (current_filter === undefined) { if (current_filter === undefined) {
return default_banner; return default_banner;
} }
var first_term = current_filter.operators()[0]; const first_term = current_filter.operators()[0];
var first_operator = first_term.operator; const first_operator = first_term.operator;
var first_operand = first_term.operand; const first_operand = first_term.operand;
var num_operators = current_filter.operators().length; const num_operators = current_filter.operators().length;
if (num_operators !== 1) { if (num_operators !== 1) {
// For invalid-multi-operator narrows, we display an invalid narrow message // For invalid-multi-operator narrows, we display an invalid narrow message
var streams = current_filter.operands("stream"); const streams = current_filter.operands("stream");
var invalid_narrow_message = ""; let invalid_narrow_message = "";
// No message can have multiple streams // No message can have multiple streams
if (streams.length > 1) { if (streams.length > 1) {
invalid_narrow_message = i18n.t("You are searching for messages that belong to more than one stream, which is not possible."); invalid_narrow_message = i18n.t("You are searching for messages that belong to more than one stream, which is not possible.");
@@ -901,7 +901,7 @@ function pick_empty_narrow_banner() {
} else if (first_operator === "stream" && !stream_data.is_subscribed(first_operand)) { } else if (first_operator === "stream" && !stream_data.is_subscribed(first_operand)) {
// You are narrowed to a stream which does not exist or is a private stream // You are narrowed to a stream which does not exist or is a private stream
// in which you were never subscribed. // in which you were never subscribed.
var stream_sub = stream_data.get_sub(narrow_state.stream()); const stream_sub = stream_data.get_sub(narrow_state.stream());
if (!stream_sub || !stream_sub.should_display_subscription_button) { if (!stream_sub || !stream_sub.should_display_subscription_button) {
return $("#nonsubbed_private_nonexistent_stream_narrow_message"); return $("#nonsubbed_private_nonexistent_stream_narrow_message");
} }

View File

@@ -1,22 +1,22 @@
var confirmDatePlugin = require("flatpickr/dist/plugins/confirmDate/confirmDate.js"); const confirmDatePlugin = require("flatpickr/dist/plugins/confirmDate/confirmDate.js");
var render_actions_popover_content = require('../templates/actions_popover_content.hbs'); const render_actions_popover_content = require('../templates/actions_popover_content.hbs');
var render_mobile_message_buttons_popover = require('../templates/mobile_message_buttons_popover.hbs'); const render_mobile_message_buttons_popover = require('../templates/mobile_message_buttons_popover.hbs');
var render_mobile_message_buttons_popover_content = require('../templates/mobile_message_buttons_popover_content.hbs'); const render_mobile_message_buttons_popover_content = require('../templates/mobile_message_buttons_popover_content.hbs');
var render_no_arrow_popover = require('../templates/no_arrow_popover.hbs'); const render_no_arrow_popover = require('../templates/no_arrow_popover.hbs');
var render_remind_me_popover_content = require('../templates/remind_me_popover_content.hbs'); const render_remind_me_popover_content = require('../templates/remind_me_popover_content.hbs');
var render_user_group_info_popover = require('../templates/user_group_info_popover.hbs'); const render_user_group_info_popover = require('../templates/user_group_info_popover.hbs');
var render_user_group_info_popover_content = require('../templates/user_group_info_popover_content.hbs'); const render_user_group_info_popover_content = require('../templates/user_group_info_popover_content.hbs');
var render_user_info_popover_content = require('../templates/user_info_popover_content.hbs'); const render_user_info_popover_content = require('../templates/user_info_popover_content.hbs');
var render_user_info_popover_title = require('../templates/user_info_popover_title.hbs'); const render_user_info_popover_title = require('../templates/user_info_popover_title.hbs');
var render_user_profile_modal = require("../templates/user_profile_modal.hbs"); const render_user_profile_modal = require("../templates/user_profile_modal.hbs");
var current_actions_popover_elem; let current_actions_popover_elem;
var current_flatpickr_instance; let current_flatpickr_instance;
var current_message_info_popover_elem; let current_message_info_popover_elem;
var current_mobile_message_buttons_popover_elem; let current_mobile_message_buttons_popover_elem;
var userlist_placement = "right"; let userlist_placement = "right";
var list_of_popovers = []; let list_of_popovers = [];
// this utilizes the proxy pattern to intercept all calls to $.fn.popover // this utilizes the proxy pattern to intercept all calls to $.fn.popover
// and push the $.fn.data($o, "popover") results to an array. // and push the $.fn.data($o, "popover") results to an array.
@@ -36,7 +36,7 @@ var list_of_popovers = [];
}; };
// add back all shallow properties of $.fn.popover to the new proxied version. // add back all shallow properties of $.fn.popover to the new proxied version.
for (var x in popover) { for (const x in popover) {
if (popover.hasOwnProperty(x)) { if (popover.hasOwnProperty(x)) {
$.fn.popover[x] = popover[x]; $.fn.popover[x] = popover[x];
} }
@@ -44,12 +44,12 @@ var list_of_popovers = [];
}($.fn.popover)); }($.fn.popover));
function copy_email_handler(e) { function copy_email_handler(e) {
var email_el = $(e.trigger.parentElement); const email_el = $(e.trigger.parentElement);
var copy_icon = email_el.find('i'); const copy_icon = email_el.find('i');
// only change the parent element's text back to email // only change the parent element's text back to email
// and not overwrite the tooltip. // and not overwrite the tooltip.
var email_textnode = email_el[0].childNodes[2]; const email_textnode = email_el[0].childNodes[2];
email_el.addClass('email_copied'); email_el.addClass('email_copied');
email_textnode.nodeValue = i18n.t('Email copied'); email_textnode.nodeValue = i18n.t('Email copied');
@@ -64,19 +64,19 @@ function copy_email_handler(e) {
function init_email_clipboard() { function init_email_clipboard() {
$('.user_popover_email').each(function () { $('.user_popover_email').each(function () {
if (this.clientWidth < this.scrollWidth) { if (this.clientWidth < this.scrollWidth) {
var email_el = $(this); const email_el = $(this);
var copy_email_icon = email_el.find('i'); const copy_email_icon = email_el.find('i');
copy_email_icon.removeClass('hide_copy_icon'); copy_email_icon.removeClass('hide_copy_icon');
var copy_email_clipboard = new ClipboardJS(copy_email_icon[0]); const copy_email_clipboard = new ClipboardJS(copy_email_icon[0]);
copy_email_clipboard.on('success', copy_email_handler); copy_email_clipboard.on('success', copy_email_handler);
} }
}); });
} }
function load_medium_avatar(user, elt) { function load_medium_avatar(user, elt) {
var user_avatar_url = "avatar/" + user.user_id + "/medium"; const user_avatar_url = "avatar/" + user.user_id + "/medium";
var sender_avatar_medium = new Image(); const sender_avatar_medium = new Image();
sender_avatar_medium.src = user_avatar_url; sender_avatar_medium.src = user_avatar_url;
$(sender_avatar_medium).on("load", function () { $(sender_avatar_medium).on("load", function () {
elt.css("background-image", "url(" + $(this).attr("src") + ")"); elt.css("background-image", "url(" + $(this).attr("src") + ")");
@@ -84,7 +84,7 @@ function load_medium_avatar(user, elt) {
} }
function calculate_info_popover_placement(size, elt) { function calculate_info_popover_placement(size, elt) {
var ypos = elt.offset().top; const ypos = elt.offset().top;
if (!(ypos + size / 2 < message_viewport.height() && if (!(ypos + size / 2 < message_viewport.height() &&
ypos > size / 2)) { ypos > size / 2)) {
@@ -97,9 +97,9 @@ function calculate_info_popover_placement(size, elt) {
} }
function get_custom_profile_field_data(user, field, field_types, dateFormat) { function get_custom_profile_field_data(user, field, field_types, dateFormat) {
var field_value = people.get_custom_profile_data(user.user_id, field.id); const field_value = people.get_custom_profile_data(user.user_id, field.id);
var field_type = field.type; const field_type = field.type;
var profile_field = {}; const profile_field = {};
if (!field_value) { if (!field_value) {
return profile_field; return profile_field;
@@ -123,7 +123,7 @@ function get_custom_profile_field_data(user, field, field_types, dateFormat) {
profile_field.value = field_value.value; profile_field.value = field_value.value;
break; break;
case field_types.CHOICE.id: { case field_types.CHOICE.id: {
var field_choice_dict = JSON.parse(field.field_data); const field_choice_dict = JSON.parse(field.field_data);
profile_field.value = field_choice_dict[field_value.value].text; profile_field.value = field_choice_dict[field_value.value].text;
break; break;
} }
@@ -152,10 +152,10 @@ function get_visible_email(user) {
function render_user_info_popover(user, popover_element, is_sender_popover, private_msg_class, function render_user_info_popover(user, popover_element, is_sender_popover, private_msg_class,
template_class, popover_placement) { template_class, popover_placement) {
var is_me = people.is_my_user_id(user.user_id); const is_me = people.is_my_user_id(user.user_id);
var can_set_away = false; let can_set_away = false;
var can_revoke_away = false; let can_revoke_away = false;
if (is_me) { if (is_me) {
if (user_status.is_away(user.user_id)) { if (user_status.is_away(user.user_id)) {
@@ -165,7 +165,7 @@ function render_user_info_popover(user, popover_element, is_sender_popover, priv
} }
} }
var args = { const args = {
can_revoke_away: can_revoke_away, can_revoke_away: can_revoke_away,
can_set_away: can_set_away, can_set_away: can_set_away,
is_active: people.is_active_user_for_popover(user.user_id), is_active: people.is_active_user_for_popover(user.user_id),
@@ -188,12 +188,12 @@ function render_user_info_popover(user, popover_element, is_sender_popover, priv
}; };
if (user.is_bot) { if (user.is_bot) {
var is_cross_realm_bot = user.is_cross_realm_bot; const is_cross_realm_bot = user.is_cross_realm_bot;
var bot_owner_id = user.bot_owner_id; const bot_owner_id = user.bot_owner_id;
if (is_cross_realm_bot) { if (is_cross_realm_bot) {
args.is_cross_realm_bot = is_cross_realm_bot; args.is_cross_realm_bot = is_cross_realm_bot;
} else if (bot_owner_id) { } else if (bot_owner_id) {
var bot_owner = people.get_person_from_user_id(bot_owner_id); const bot_owner = people.get_person_from_user_id(bot_owner_id);
args.bot_owner = bot_owner; args.bot_owner = bot_owner;
} }
} }
@@ -228,7 +228,7 @@ exports._test_calculate_info_popover_placement = calculate_info_popover_placemen
// user is the user whose profile to show // user is the user whose profile to show
// message is the message containing it, which should be selected // message is the message containing it, which should be selected
function show_user_info_popover(element, user, message) { function show_user_info_popover(element, user, message) {
var last_popover_elem = current_message_info_popover_elem; const last_popover_elem = current_message_info_popover_elem;
exports.hide_all(); exports.hide_all();
if (last_popover_elem !== undefined if (last_popover_elem !== undefined
&& last_popover_elem.get()[0] === element) { && last_popover_elem.get()[0] === element) {
@@ -237,7 +237,7 @@ function show_user_info_popover(element, user, message) {
return; return;
} }
current_msg_list.select_id(message.id); current_msg_list.select_id(message.id);
var elt = $(element); const elt = $(element);
if (elt.data('popover') === undefined) { if (elt.data('popover') === undefined) {
if (user === undefined) { if (user === undefined) {
// This is never supposed to happen, not even for deactivated // This is never supposed to happen, not even for deactivated
@@ -246,7 +246,7 @@ function show_user_info_popover(element, user, message) {
return; return;
} }
var is_sender_popover = message.sender_id === user.user_id; const is_sender_popover = message.sender_id === user.user_id;
render_user_info_popover(user, elt, is_sender_popover, "respond_personal_button", render_user_info_popover(user, elt, is_sender_popover, "respond_personal_button",
"message-info-popover", "right"); "message-info-popover", "right");
@@ -255,7 +255,7 @@ function show_user_info_popover(element, user, message) {
} }
function show_mobile_message_buttons_popover(element) { function show_mobile_message_buttons_popover(element) {
var last_popover_elem = current_mobile_message_buttons_popover_elem; const last_popover_elem = current_mobile_message_buttons_popover_elem;
exports.hide_all(); exports.hide_all();
if (last_popover_elem !== undefined if (last_popover_elem !== undefined
&& last_popover_elem.get()[0] === element) { && last_popover_elem.get()[0] === element) {
@@ -264,7 +264,7 @@ function show_mobile_message_buttons_popover(element) {
return; return;
} }
var $element = $(element); const $element = $(element);
$element.popover({ $element.popover({
placement: "left", placement: "left",
template: render_mobile_message_buttons_popover(), template: render_mobile_message_buttons_popover(),
@@ -293,13 +293,13 @@ exports.hide_user_profile = function () {
exports.show_user_profile = function (user) { exports.show_user_profile = function (user) {
exports.hide_all(); exports.hide_all();
var dateFormat = moment.localeData().longDateFormat('LL'); const dateFormat = moment.localeData().longDateFormat('LL');
var field_types = page_params.custom_profile_field_types; const field_types = page_params.custom_profile_field_types;
var profile_data = page_params.custom_profile_fields const profile_data = page_params.custom_profile_fields
.map(function (f) {return get_custom_profile_field_data(user, f, field_types, dateFormat);}) .map(function (f) {return get_custom_profile_field_data(user, f, field_types, dateFormat);})
.filter(function (f) {return f.name !== undefined;}); .filter(function (f) {return f.name !== undefined;});
var args = { const args = {
full_name: user.full_name, full_name: user.full_name,
email: get_visible_email(user), email: get_visible_email(user),
profile_data: profile_data, profile_data: profile_data,
@@ -325,7 +325,7 @@ function get_user_info_popover_items() {
return; return;
} }
var popover_data = current_message_info_popover_elem.data('popover'); const popover_data = current_message_info_popover_elem.data('popover');
if (!popover_data) { if (!popover_data) {
blueslip.error('Cannot find popover data for actions menu.'); blueslip.error('Cannot find popover data for actions menu.');
return; return;
@@ -366,10 +366,10 @@ exports._test_sort_group_members = sort_group_members;
// user is the user whose profile to show // user is the user whose profile to show
// message is the message containing it, which should be selected // message is the message containing it, which should be selected
function show_user_group_info_popover(element, group, message) { function show_user_group_info_popover(element, group, message) {
var last_popover_elem = current_message_info_popover_elem; const last_popover_elem = current_message_info_popover_elem;
// hardcoded pixel height of the popover // hardcoded pixel height of the popover
// note that the actual size varies (in group size), but this is about as big as it gets // note that the actual size varies (in group size), but this is about as big as it gets
var popover_size = 390; const popover_size = 390;
exports.hide_all(); exports.hide_all();
if (last_popover_elem !== undefined if (last_popover_elem !== undefined
&& last_popover_elem.get()[0] === element) { && last_popover_elem.get()[0] === element) {
@@ -378,9 +378,9 @@ function show_user_group_info_popover(element, group, message) {
return; return;
} }
current_msg_list.select_id(message.id); current_msg_list.select_id(message.id);
var elt = $(element); const elt = $(element);
if (elt.data('popover') === undefined) { if (elt.data('popover') === undefined) {
var args = { const args = {
group_name: group.name, group_name: group.name,
group_description: group.description, group_description: group.description,
members: sort_group_members(fetch_group_members(group.members.keys())), members: sort_group_members(fetch_group_members(group.members.keys())),
@@ -398,7 +398,7 @@ function show_user_group_info_popover(element, group, message) {
} }
exports.toggle_actions_popover = function (element, id) { exports.toggle_actions_popover = function (element, id) {
var last_popover_elem = current_actions_popover_elem; const last_popover_elem = current_actions_popover_elem;
exports.hide_all(); exports.hide_all();
if (last_popover_elem !== undefined if (last_popover_elem !== undefined
&& last_popover_elem.get()[0] === element) { && last_popover_elem.get()[0] === element) {
@@ -409,12 +409,12 @@ exports.toggle_actions_popover = function (element, id) {
$(element).closest('.message_row').toggleClass('has_popover has_actions_popover'); $(element).closest('.message_row').toggleClass('has_popover has_actions_popover');
current_msg_list.select_id(id); current_msg_list.select_id(id);
var elt = $(element); const elt = $(element);
if (elt.data('popover') === undefined) { if (elt.data('popover') === undefined) {
var message = current_msg_list.get(id); const message = current_msg_list.get(id);
var editability = message_edit.get_editability(message); const editability = message_edit.get_editability(message);
var use_edit_icon; let use_edit_icon;
var editability_menu_item; let editability_menu_item;
if (editability === message_edit.editability_types.FULL) { if (editability === message_edit.editability_types.FULL) {
use_edit_icon = true; use_edit_icon = true;
editability_menu_item = i18n.t("Edit"); editability_menu_item = i18n.t("Edit");
@@ -425,43 +425,43 @@ exports.toggle_actions_popover = function (element, id) {
use_edit_icon = false; use_edit_icon = false;
editability_menu_item = i18n.t("View source"); editability_menu_item = i18n.t("View source");
} }
var topic = util.get_message_topic(message); const topic = util.get_message_topic(message);
var can_mute_topic = const can_mute_topic =
message.stream && message.stream &&
topic && topic &&
!muting.is_topic_muted(message.stream_id, topic); !muting.is_topic_muted(message.stream_id, topic);
var can_unmute_topic = const can_unmute_topic =
message.stream && message.stream &&
topic && topic &&
muting.is_topic_muted(message.stream_id, topic); muting.is_topic_muted(message.stream_id, topic);
var should_display_edit_history_option = _.any(message.edit_history, function (entry) { const should_display_edit_history_option = _.any(message.edit_history, function (entry) {
var prev_topic = util.get_edit_event_prev_topic(entry); const prev_topic = util.get_edit_event_prev_topic(entry);
return entry.prev_content !== undefined || prev_topic !== undefined; return entry.prev_content !== undefined || prev_topic !== undefined;
}) && page_params.realm_allow_edit_history; }) && page_params.realm_allow_edit_history;
// Disabling this for /me messages is a temporary workaround // Disabling this for /me messages is a temporary workaround
// for the fact that we don't have a styling for how that // for the fact that we don't have a styling for how that
// should look. See also condense.js. // should look. See also condense.js.
var should_display_collapse = !message.locally_echoed && const should_display_collapse = !message.locally_echoed &&
!message.is_me_message && !message.is_me_message &&
!message.collapsed; !message.collapsed;
var should_display_uncollapse = !message.locally_echoed && const should_display_uncollapse = !message.locally_echoed &&
!message.is_me_message && !message.is_me_message &&
message.collapsed; message.collapsed;
var should_display_edit_and_view_source = const should_display_edit_and_view_source =
message.content !== '<p>(deleted)</p>' || message.content !== '<p>(deleted)</p>' ||
editability === message_edit.editability_types.FULL || editability === message_edit.editability_types.FULL ||
editability === message_edit.editability_types.TOPIC_ONLY; editability === message_edit.editability_types.TOPIC_ONLY;
var should_display_quote_and_reply = message.content !== '<p>(deleted)</p>'; const should_display_quote_and_reply = message.content !== '<p>(deleted)</p>';
var conversation_time_uri = hash_util.by_conversation_and_time_uri(message) const conversation_time_uri = hash_util.by_conversation_and_time_uri(message)
.replace(/\(/g, '%28') .replace(/\(/g, '%28')
.replace(/\)/g, '%29'); .replace(/\)/g, '%29');
var should_display_delete_option = message_edit.get_deletability(message); const should_display_delete_option = message_edit.get_deletability(message);
var args = { const args = {
message_id: message.id, message_id: message.id,
historical: message.historical, historical: message.historical,
stream_id: message.stream_id, stream_id: message.stream_id,
@@ -482,7 +482,7 @@ exports.toggle_actions_popover = function (element, id) {
should_display_quote_and_reply: should_display_quote_and_reply, should_display_quote_and_reply: should_display_quote_and_reply,
}; };
var ypos = elt.offset().top; const ypos = elt.offset().top;
elt.popover({ elt.popover({
// Popover height with 7 items in it is ~190 px // Popover height with 7 items in it is ~190 px
placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom', placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom',
@@ -500,13 +500,13 @@ exports.render_actions_remind_popover = function (element, id) {
exports.hide_all(); exports.hide_all();
$(element).closest('.message_row').toggleClass('has_popover has_actions_popover'); $(element).closest('.message_row').toggleClass('has_popover has_actions_popover');
current_msg_list.select_id(id); current_msg_list.select_id(id);
var elt = $(element); const elt = $(element);
if (elt.data('popover') === undefined) { if (elt.data('popover') === undefined) {
var message = current_msg_list.get(id); const message = current_msg_list.get(id);
var args = { const args = {
message: message, message: message,
}; };
var ypos = elt.offset().top; const ypos = elt.offset().top;
elt.popover({ elt.popover({
// Popover height with 7 items in it is ~190 px // Popover height with 7 items in it is ~190 px
placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom', placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom',
@@ -533,7 +533,7 @@ function get_action_menu_menu_items() {
return; return;
} }
var popover_data = current_actions_popover_elem.data('popover'); const popover_data = current_actions_popover_elem.data('popover');
if (!popover_data) { if (!popover_data) {
blueslip.error('Cannot find popover data for actions menu.'); blueslip.error('Cannot find popover data for actions menu.');
return; return;
@@ -555,7 +555,7 @@ function popover_items_handle_keyboard(key, items) {
return; return;
} }
var index = items.index(items.filter(':focus')); let index = items.index(items.filter(':focus'));
if (key === "enter" && index >= 0 && index < items.length) { if (key === "enter" && index >= 0 && index < items.length) {
return items[index].click(); return items[index].click();
@@ -573,7 +573,7 @@ function popover_items_handle_keyboard(key, items) {
function focus_first_action_popover_item() { function focus_first_action_popover_item() {
// For now I recommend only calling this when the user opens the menu with a hotkey. // For now I recommend only calling this when the user opens the menu with a hotkey.
// Our popup menus act kind of funny when you mix keyboard and mouse. // Our popup menus act kind of funny when you mix keyboard and mouse.
var items = get_action_menu_menu_items(); const items = get_action_menu_menu_items();
focus_first_popover_item(items); focus_first_popover_item(items);
} }
@@ -585,7 +585,7 @@ exports.open_message_menu = function (message) {
return true; return true;
} }
var id = message.id; const id = message.id;
exports.toggle_actions_popover($(".selected_message .actions_hover")[0], id); exports.toggle_actions_popover($(".selected_message .actions_hover")[0], id);
if (current_actions_popover_elem) { if (current_actions_popover_elem) {
focus_first_action_popover_item(); focus_first_action_popover_item();
@@ -594,7 +594,7 @@ exports.open_message_menu = function (message) {
}; };
exports.actions_menu_handle_keyboard = function (key) { exports.actions_menu_handle_keyboard = function (key) {
var items = get_action_menu_menu_items(); const items = get_action_menu_menu_items();
popover_items_handle_keyboard(key, items); popover_items_handle_keyboard(key, items);
}; };
@@ -643,8 +643,8 @@ exports.show_pm_list_sidebar = function () {
resize.resize_page_components(); resize.resize_page_components();
}; };
var current_user_sidebar_user_id; let current_user_sidebar_user_id;
var current_user_sidebar_popover; let current_user_sidebar_popover;
function user_sidebar_popped() { function user_sidebar_popped() {
return current_user_sidebar_popover !== undefined; return current_user_sidebar_popover !== undefined;
@@ -667,21 +667,21 @@ exports.hide_user_sidebar_popover = function () {
function focus_user_info_popover_item() { function focus_user_info_popover_item() {
// For now I recommend only calling this when the user opens the menu with a hotkey. // For now I recommend only calling this when the user opens the menu with a hotkey.
// Our popup menus act kind of funny when you mix keyboard and mouse. // Our popup menus act kind of funny when you mix keyboard and mouse.
var items = get_user_info_popover_items(); const items = get_user_info_popover_items();
focus_first_popover_item(items); focus_first_popover_item(items);
} }
exports.user_info_popover_handle_keyboard = function (key) { exports.user_info_popover_handle_keyboard = function (key) {
var items = get_user_info_popover_items(); const items = get_user_info_popover_items();
popover_items_handle_keyboard(key, items); popover_items_handle_keyboard(key, items);
}; };
exports.show_sender_info = function () { exports.show_sender_info = function () {
var $message = $(".selected_message"); const $message = $(".selected_message");
var $sender = $message.find('.sender_info_hover'); const $sender = $message.find('.sender_info_hover');
var message = current_msg_list.get(rows.id($message)); const message = current_msg_list.get(rows.id($message));
var user = people.get_person_from_user_id(message.sender_id); const user = people.get_person_from_user_id(message.sender_id);
show_user_info_popover($sender[0], user, message); show_user_info_popover($sender[0], user, message);
if (current_message_info_popover_elem) { if (current_message_info_popover_elem) {
focus_user_info_popover_item(); focus_user_info_popover_item();
@@ -693,7 +693,7 @@ exports.show_sender_info = function () {
// side effect of closing popovers, which we don't want. So we // side effect of closing popovers, which we don't want. So we
// suppress the first hide from scrolling after a resize using this // suppress the first hide from scrolling after a resize using this
// variable. // variable.
var suppress_scroll_hide = false; let suppress_scroll_hide = false;
exports.set_suppress_scroll_hide = function () { exports.set_suppress_scroll_hide = function () {
suppress_scroll_hide = true; suppress_scroll_hide = true;
@@ -701,32 +701,32 @@ exports.set_suppress_scroll_hide = function () {
exports.register_click_handlers = function () { exports.register_click_handlers = function () {
$("#main_div").on("click", ".actions_hover", function (e) { $("#main_div").on("click", ".actions_hover", function (e) {
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
e.stopPropagation(); e.stopPropagation();
exports.toggle_actions_popover(this, rows.id(row)); exports.toggle_actions_popover(this, rows.id(row));
}); });
$("#main_div").on("click", ".sender_name, .sender_name-in-status, .inline_profile_picture", function (e) { $("#main_div").on("click", ".sender_name, .sender_name-in-status, .inline_profile_picture", function (e) {
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
e.stopPropagation(); e.stopPropagation();
var message = current_msg_list.get(rows.id(row)); const message = current_msg_list.get(rows.id(row));
var user = people.get_person_from_user_id(message.sender_id); const user = people.get_person_from_user_id(message.sender_id);
show_user_info_popover(this, user, message); show_user_info_popover(this, user, message);
}); });
$("#main_div").on("click", ".user-mention", function (e) { $("#main_div").on("click", ".user-mention", function (e) {
var id = $(this).attr('data-user-id'); const id = $(this).attr('data-user-id');
// We fallback to email to handle legacy markdown that was rendered // We fallback to email to handle legacy markdown that was rendered
// before we cut over to using data-user-id // before we cut over to using data-user-id
var email = $(this).attr('data-user-email'); const email = $(this).attr('data-user-email');
if (id === '*' || email === '*') { if (id === '*' || email === '*') {
return; return;
} }
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
e.stopPropagation(); e.stopPropagation();
var message = current_msg_list.get(rows.id(row)); const message = current_msg_list.get(rows.id(row));
var user; let user;
if (id) { if (id) {
user = people.get_person_from_user_id(id); user = people.get_person_from_user_id(id);
} else { } else {
@@ -736,11 +736,11 @@ exports.register_click_handlers = function () {
}); });
$("#main_div").on("click", ".user-group-mention", function (e) { $("#main_div").on("click", ".user-group-mention", function (e) {
var id = $(this).attr('data-user-group-id'); const id = $(this).attr('data-user-group-id');
var row = $(this).closest(".message_row"); const row = $(this).closest(".message_row");
e.stopPropagation(); e.stopPropagation();
var message = current_msg_list.get(rows.id(row)); const message = current_msg_list.get(rows.id(row));
var group = user_groups.get_user_group_from_id(id, true); const group = user_groups.get_user_group_from_id(id, true);
if (group === undefined) { if (group === undefined) {
// This user group has likely been deleted. // This user group has likely been deleted.
blueslip.info('Unable to find user group in message' + message.sender_id); blueslip.info('Unable to find user group in message' + message.sender_id);
@@ -751,8 +751,8 @@ exports.register_click_handlers = function () {
$('body').on('click', '.info_popover_actions .narrow_to_private_messages', function (e) { $('body').on('click', '.info_popover_actions .narrow_to_private_messages', function (e) {
var user_id = $(e.target).parents('ul').attr('data-user-id'); const user_id = $(e.target).parents('ul').attr('data-user-id');
var email = people.get_person_from_user_id(user_id).email; const email = people.get_person_from_user_id(user_id).email;
exports.hide_message_info_popover(); exports.hide_message_info_popover();
narrow.by('pm-with', email, {trigger: 'user sidebar popover'}); narrow.by('pm-with', email, {trigger: 'user sidebar popover'});
e.stopPropagation(); e.stopPropagation();
@@ -760,8 +760,8 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.info_popover_actions .narrow_to_messages_sent', function (e) { $('body').on('click', '.info_popover_actions .narrow_to_messages_sent', function (e) {
var user_id = $(e.target).parents('ul').attr('data-user-id'); const user_id = $(e.target).parents('ul').attr('data-user-id');
var email = people.get_person_from_user_id(user_id).email; const email = people.get_person_from_user_id(user_id).email;
exports.hide_message_info_popover(); exports.hide_message_info_popover();
narrow.by('sender', email, {trigger: 'user sidebar popover'}); narrow.by('sender', email, {trigger: 'user sidebar popover'});
e.stopPropagation(); e.stopPropagation();
@@ -772,9 +772,9 @@ exports.register_click_handlers = function () {
if (!compose_state.composing()) { if (!compose_state.composing()) {
compose_actions.start('stream', {trigger: 'sidebar user actions'}); compose_actions.start('stream', {trigger: 'sidebar user actions'});
} }
var user_id = $(e.target).parents('ul').attr('data-user-id'); const user_id = $(e.target).parents('ul').attr('data-user-id');
var name = people.get_person_from_user_id(user_id).full_name; const name = people.get_person_from_user_id(user_id).full_name;
var mention = people.get_mention_syntax(name, user_id); const mention = people.get_mention_syntax(name, user_id);
compose_ui.insert_syntax_and_focus(mention); compose_ui.insert_syntax_and_focus(mention);
exports.hide_user_sidebar_popover(); exports.hide_user_sidebar_popover();
exports.hide_userlist_sidebar(); exports.hide_userlist_sidebar();
@@ -786,9 +786,9 @@ exports.register_click_handlers = function () {
if (!compose_state.composing()) { if (!compose_state.composing()) {
compose_actions.respond_to_message({trigger: 'user sidebar popover'}); compose_actions.respond_to_message({trigger: 'user sidebar popover'});
} }
var user_id = $(e.target).parents('ul').attr('data-user-id'); const user_id = $(e.target).parents('ul').attr('data-user-id');
var name = people.get_person_from_user_id(user_id).full_name; const name = people.get_person_from_user_id(user_id).full_name;
var mention = people.get_mention_syntax(name, user_id); const mention = people.get_mention_syntax(name, user_id);
compose_ui.insert_syntax_and_focus(mention); compose_ui.insert_syntax_and_focus(mention);
exports.hide_message_info_popover(); exports.hide_message_info_popover();
e.stopPropagation(); e.stopPropagation();
@@ -796,8 +796,8 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.info_popover_actions .view_user_profile', function (e) { $('body').on('click', '.info_popover_actions .view_user_profile', function (e) {
var user_id = $(e.target).parents('ul').attr('data-user-id'); const user_id = $(e.target).parents('ul').attr('data-user-id');
var user = people.get_person_from_user_id(user_id); const user = people.get_person_from_user_id(user_id);
exports.show_user_profile(user); exports.show_user_profile(user);
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
@@ -805,7 +805,7 @@ exports.register_click_handlers = function () {
$('body').on('click', '.info_popover_actions .clear_status', function (e) { $('body').on('click', '.info_popover_actions .clear_status', function (e) {
e.preventDefault(); e.preventDefault();
var me = $(e.target).parents('ul').attr('data-user-id'); const me = $(e.target).parents('ul').attr('data-user-id');
user_status.server_update({ user_status.server_update({
user_id: me, user_id: me,
status_text: '', status_text: '',
@@ -816,8 +816,8 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.bot-owner-name', function (e) { $('body').on('click', '.bot-owner-name', function (e) {
var user_id = $(e.target).attr('data-bot-owner-id'); const user_id = $(e.target).attr('data-bot-owner-id');
var user = people.get_person_from_user_id(user_id); const user = people.get_person_from_user_id(user_id);
exports.show_user_profile(user); exports.show_user_profile(user);
}); });
@@ -859,8 +859,8 @@ exports.register_click_handlers = function () {
// use email of currently selected user, rather than some elem comparison, // use email of currently selected user, rather than some elem comparison,
// as the presence list may be redrawn with new elements. // as the presence list may be redrawn with new elements.
var target = $(this).closest('li'); const target = $(this).closest('li');
var user_id = target.find('a').attr('data-user-id'); const user_id = target.find('a').attr('data-user-id');
if (String(current_user_sidebar_user_id) === user_id) { if (String(current_user_sidebar_user_id) === user_id) {
// If the popover is already shown, clicking again should toggle it. // If the popover is already shown, clicking again should toggle it.
@@ -877,8 +877,8 @@ exports.register_click_handlers = function () {
stream_popover.show_streamlist_sidebar(); stream_popover.show_streamlist_sidebar();
} }
var user = people.get_person_from_user_id(user_id); const user = people.get_person_from_user_id(user_id);
var popover_placement = userlist_placement === "left" ? "right" : "left"; const popover_placement = userlist_placement === "left" ? "right" : "left";
render_user_info_popover(user, target, false, "compose_private_message", render_user_info_popover(user, target, false, "compose_private_message",
"user_popover", popover_placement); "user_popover", popover_placement);
@@ -888,7 +888,7 @@ exports.register_click_handlers = function () {
}); });
$('body').on("mouseenter", ".user_popover_email", function () { $('body').on("mouseenter", ".user_popover_email", function () {
var tooltip_holder = $(this).find('div'); const tooltip_holder = $(this).find('div');
if (this.offsetWidth < this.scrollWidth) { if (this.offsetWidth < this.scrollWidth) {
tooltip_holder.addClass('display-tooltip'); tooltip_holder.addClass('display-tooltip');
@@ -910,7 +910,7 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.reminder_button', function (e) { $('body').on('click', '.reminder_button', function (e) {
var message_id = $(e.currentTarget).data('message-id'); const message_id = $(e.currentTarget).data('message-id');
exports.render_actions_remind_popover($(".selected_message .actions_hover")[0], message_id); exports.render_actions_remind_popover($(".selected_message .actions_hover")[0], message_id);
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
@@ -923,7 +923,7 @@ exports.register_click_handlers = function () {
}); });
function reminder_click_handler(datestr, e) { function reminder_click_handler(datestr, e) {
var id = $(".remind.custom").data('message-id'); const id = $(".remind.custom").data('message-id');
reminder.do_set_reminder_for_message(id, datestr); reminder.do_set_reminder_for_message(id, datestr);
exports.hide_all(); exports.hide_all();
e.stopPropagation(); e.stopPropagation();
@@ -931,27 +931,27 @@ exports.register_click_handlers = function () {
} }
$('body').on('click', '.remind.in_20m', function (e) { $('body').on('click', '.remind.in_20m', function (e) {
var datestr = moment().add(20, 'm').format(); const datestr = moment().add(20, 'm').format();
reminder_click_handler(datestr, e); reminder_click_handler(datestr, e);
}); });
$('body').on('click', '.remind.in_1h', function (e) { $('body').on('click', '.remind.in_1h', function (e) {
var datestr = moment().add(1, 'h').format(); const datestr = moment().add(1, 'h').format();
reminder_click_handler(datestr, e); reminder_click_handler(datestr, e);
}); });
$('body').on('click', '.remind.in_3h', function (e) { $('body').on('click', '.remind.in_3h', function (e) {
var datestr = moment().add(3, 'h').format(); const datestr = moment().add(3, 'h').format();
reminder_click_handler(datestr, e); reminder_click_handler(datestr, e);
}); });
$('body').on('click', '.remind.tomo', function (e) { $('body').on('click', '.remind.tomo', function (e) {
var datestr = moment().add(1, 'd').hour(9).minute(0).seconds(0).format(); const datestr = moment().add(1, 'd').hour(9).minute(0).seconds(0).format();
reminder_click_handler(datestr, e); reminder_click_handler(datestr, e);
}); });
$('body').on('click', '.remind.nxtw', function (e) { $('body').on('click', '.remind.nxtw', function (e) {
var datestr = moment().add(1, 'w').day('monday').hour(9).minute(0).seconds(0).format(); const datestr = moment().add(1, 'w').day('monday').hour(9).minute(0).seconds(0).format();
reminder_click_handler(datestr, e); reminder_click_handler(datestr, e);
}); });
@@ -961,13 +961,13 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.flatpickr-confirm', function (e) { $('body').on('click', '.flatpickr-confirm', function (e) {
var datestr = $(".remind.custom")[0].value; const datestr = $(".remind.custom")[0].value;
reminder_click_handler(datestr, e); reminder_click_handler(datestr, e);
}); });
$('body').on('click', '.respond_personal_button, .compose_private_message', function (e) { $('body').on('click', '.respond_personal_button, .compose_private_message', function (e) {
var user_id = $(e.target).parents('ul').attr('data-user-id'); const user_id = $(e.target).parents('ul').attr('data-user-id');
var email = people.get_person_from_user_id(user_id).email; const email = people.get_person_from_user_id(user_id).email;
compose_actions.start('private', { compose_actions.start('private', {
trigger: 'popover send private', trigger: 'popover send private',
private_message_recipient: email}); private_message_recipient: email});
@@ -976,9 +976,9 @@ exports.register_click_handlers = function () {
e.preventDefault(); e.preventDefault();
}); });
$('body').on('click', '.popover_toggle_collapse', function (e) { $('body').on('click', '.popover_toggle_collapse', function (e) {
var message_id = $(e.currentTarget).data('message-id'); const message_id = $(e.currentTarget).data('message-id');
var row = current_msg_list.get_row(message_id); const row = current_msg_list.get_row(message_id);
var message = current_msg_list.get(rows.id(row)); const message = current_msg_list.get(rows.id(row));
exports.hide_actions_popover(); exports.hide_actions_popover();
@@ -994,18 +994,18 @@ exports.register_click_handlers = function () {
e.preventDefault(); e.preventDefault();
}); });
$('body').on('click', '.popover_edit_message', function (e) { $('body').on('click', '.popover_edit_message', function (e) {
var message_id = $(e.currentTarget).data('message-id'); const message_id = $(e.currentTarget).data('message-id');
var row = current_msg_list.get_row(message_id); const row = current_msg_list.get_row(message_id);
exports.hide_actions_popover(); exports.hide_actions_popover();
message_edit.start(row); message_edit.start(row);
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
}); });
$('body').on('click', '.view_edit_history', function (e) { $('body').on('click', '.view_edit_history', function (e) {
var message_id = $(e.currentTarget).data('message-id'); const message_id = $(e.currentTarget).data('message-id');
var row = current_msg_list.get_row(message_id); const row = current_msg_list.get_row(message_id);
var message = current_msg_list.get(rows.id(row)); const message = current_msg_list.get(rows.id(row));
var message_history_cancel_btn = $('#message-history-cancel'); const message_history_cancel_btn = $('#message-history-cancel');
exports.hide_actions_popover(); exports.hide_actions_popover();
message_edit.show_history(message); message_edit.show_history(message);
@@ -1015,8 +1015,8 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.popover_mute_topic', function (e) { $('body').on('click', '.popover_mute_topic', function (e) {
var stream_id = $(e.currentTarget).attr('data-msg-stream-id'); const stream_id = $(e.currentTarget).attr('data-msg-stream-id');
var topic = $(e.currentTarget).attr('data-msg-topic'); const topic = $(e.currentTarget).attr('data-msg-topic');
exports.hide_actions_popover(); exports.hide_actions_popover();
muting_ui.mute(stream_id, topic); muting_ui.mute(stream_id, topic);
@@ -1025,8 +1025,8 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.popover_unmute_topic', function (e) { $('body').on('click', '.popover_unmute_topic', function (e) {
var stream_id = $(e.currentTarget).attr('data-msg-stream-id'); const stream_id = $(e.currentTarget).attr('data-msg-stream-id');
var topic = $(e.currentTarget).attr('data-msg-topic'); const topic = $(e.currentTarget).attr('data-msg-topic');
exports.hide_actions_popover(); exports.hide_actions_popover();
muting_ui.unmute(stream_id, topic); muting_ui.unmute(stream_id, topic);
@@ -1035,7 +1035,7 @@ exports.register_click_handlers = function () {
}); });
$('body').on('click', '.delete_message', function (e) { $('body').on('click', '.delete_message', function (e) {
var message_id = $(e.currentTarget).data('message-id'); const message_id = $(e.currentTarget).data('message-id');
exports.hide_actions_popover(); exports.hide_actions_popover();
message_edit.delete_message(message_id); message_edit.delete_message(message_id);
e.stopPropagation(); e.stopPropagation();
@@ -1046,8 +1046,8 @@ exports.register_click_handlers = function () {
$('body').on('click', '.copy_link', function (e) { $('body').on('click', '.copy_link', function (e) {
exports.hide_actions_popover(); exports.hide_actions_popover();
var id = $(this).attr("data-message-id"); const id = $(this).attr("data-message-id");
var row = $("[zid='" + id + "']"); const row = $("[zid='" + id + "']");
row.find(".alert-msg") row.find(".alert-msg")
.text(i18n.t("Copied!")) .text(i18n.t("Copied!"))
.css("display", "block") .css("display", "block")
@@ -1064,7 +1064,7 @@ exports.register_click_handlers = function () {
}); });
(function () { (function () {
var last_scroll = 0; let last_scroll = 0;
$('.app').on('scroll', function () { $('.app').on('scroll', function () {
if (suppress_scroll_hide) { if (suppress_scroll_hide) {
@@ -1072,7 +1072,7 @@ exports.register_click_handlers = function () {
return; return;
} }
var date = new Date().getTime(); const date = new Date().getTime();
// only run `popovers.hide_all()` if the last scroll was more // only run `popovers.hide_all()` if the last scroll was more
// than 250ms ago. // than 250ms ago.
@@ -1135,22 +1135,22 @@ exports.set_userlist_placement = function (placement) {
exports.compute_placement = function (elt, popover_height, popover_width, exports.compute_placement = function (elt, popover_height, popover_width,
prefer_vertical_positioning) { prefer_vertical_positioning) {
var client_rect = elt.get(0).getBoundingClientRect(); const client_rect = elt.get(0).getBoundingClientRect();
var distance_from_top = client_rect.top; const distance_from_top = client_rect.top;
var distance_from_bottom = message_viewport.height() - client_rect.bottom; const distance_from_bottom = message_viewport.height() - client_rect.bottom;
var distance_from_left = client_rect.left; const distance_from_left = client_rect.left;
var distance_from_right = message_viewport.width() - client_rect.right; const distance_from_right = message_viewport.width() - client_rect.right;
var elt_will_fit_horizontally = const elt_will_fit_horizontally =
distance_from_left + elt.width() / 2 > popover_width / 2 && distance_from_left + elt.width() / 2 > popover_width / 2 &&
distance_from_right + elt.width() / 2 > popover_width / 2; distance_from_right + elt.width() / 2 > popover_width / 2;
var elt_will_fit_vertically = const elt_will_fit_vertically =
distance_from_bottom + elt.height() / 2 > popover_height / 2 && distance_from_bottom + elt.height() / 2 > popover_height / 2 &&
distance_from_top + elt.height() / 2 > popover_height / 2; distance_from_top + elt.height() / 2 > popover_height / 2;
// default to placing the popover in the center of the screen // default to placing the popover in the center of the screen
var placement = 'viewport_center'; let placement = 'viewport_center';
// prioritize left/right over top/bottom // prioritize left/right over top/bottom
if (distance_from_top > popover_height && elt_will_fit_horizontally) { if (distance_from_top > popover_height && elt_will_fit_horizontally) {

View File

@@ -216,7 +216,7 @@ function set_invite_to_stream_policy_dropdown() {
} }
function set_user_group_edit_policy_dropdown() { function set_user_group_edit_policy_dropdown() {
var value = get_property_value("realm_user_group_edit_policy"); const value = get_property_value("realm_user_group_edit_policy");
$("#id_realm_user_group_edit_policy").val(value); $("#id_realm_user_group_edit_policy").val(value);
} }
@@ -839,7 +839,7 @@ exports.build_page = function () {
data = {}; data = {};
data.authentication_methods = JSON.stringify(get_auth_method_table_data()); data.authentication_methods = JSON.stringify(get_auth_method_table_data());
} else if (subsection === 'user_defaults') { } else if (subsection === 'user_defaults') {
var realm_default_twenty_four_hour_time = $('#id_realm_default_twenty_four_hour_time').val(); const realm_default_twenty_four_hour_time = $('#id_realm_default_twenty_four_hour_time').val();
data.default_twenty_four_hour_time = realm_default_twenty_four_hour_time; data.default_twenty_four_hour_time = realm_default_twenty_four_hour_time;
} }
return data; return data;

View File

@@ -1,7 +1,7 @@
var render_admin_user_group_list = require('../templates/admin_user_group_list.hbs'); const render_admin_user_group_list = require('../templates/admin_user_group_list.hbs');
var render_confirm_delete_user = require('../templates/confirm_delete_user.hbs'); const render_confirm_delete_user = require('../templates/confirm_delete_user.hbs');
var meta = { const meta = {
loaded: false, loaded: false,
}; };
@@ -14,7 +14,7 @@ exports.reload = function () {
return; return;
} }
var user_groups_section = $('#user-groups').expectOne(); const user_groups_section = $('#user-groups').expectOne();
user_groups_section.html(''); user_groups_section.html('');
exports.populate_user_groups(); exports.populate_user_groups();
}; };
@@ -39,8 +39,8 @@ exports.can_edit = function (group_id) {
exports.populate_user_groups = function () { exports.populate_user_groups = function () {
var user_groups_section = $('#user-groups').expectOne(); const user_groups_section = $('#user-groups').expectOne();
var user_groups_array = user_groups.get_realm_user_groups(); const user_groups_array = user_groups.get_realm_user_groups();
_.each(user_groups_array, function (data) { _.each(user_groups_array, function (data) {
user_groups_section.append(render_admin_user_group_list({ user_groups_section.append(render_admin_user_group_list({
user_group: { user_group: {
@@ -49,16 +49,16 @@ exports.populate_user_groups = function () {
description: data.description, description: data.description,
}, },
})); }));
var pill_container = $('.pill-container[data-group-pills="' + data.id + '"]'); const pill_container = $('.pill-container[data-group-pills="' + data.id + '"]');
var pills = user_pill.create_pills(pill_container); const pills = user_pill.create_pills(pill_container);
function get_pill_user_ids() { function get_pill_user_ids() {
return user_pill.get_user_ids(pills); return user_pill.get_user_ids(pills);
} }
var userg = $('div.user-group[id="' + data.id + '"]'); const userg = $('div.user-group[id="' + data.id + '"]');
data.members.keys().forEach(function (user_id) { data.members.keys().forEach(function (user_id) {
var user = people.get_person_from_user_id(user_id); const user = people.get_person_from_user_id(user_id);
user_pill.append_user(user, pills); user_pill.append_user(user, pills);
}); });
@@ -85,13 +85,13 @@ exports.populate_user_groups = function () {
update_membership(data.id); update_membership(data.id);
function is_user_group_changed() { function is_user_group_changed() {
var draft_group = get_pill_user_ids(); const draft_group = get_pill_user_ids();
var group_data = user_groups.get_user_group_from_id(data.id); const group_data = user_groups.get_user_group_from_id(data.id);
var original_group = group_data.members.keys(); const original_group = group_data.members.keys();
var same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group)); const same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group));
var description = $('#user-groups #' + data.id + ' .description').text().trim(); const description = $('#user-groups #' + data.id + ' .description').text().trim();
var name = $('#user-groups #' + data.id + ' .name').text().trim(); const name = $('#user-groups #' + data.id + ' .name').text().trim();
var user_group_status = $('#user-groups #' + data.id + ' .user-group-status'); const user_group_status = $('#user-groups #' + data.id + ' .user-group-status');
if (user_group_status.is(':visible')) { if (user_group_status.is(':visible')) {
return false; return false;
@@ -108,9 +108,9 @@ exports.populate_user_groups = function () {
if (!exports.can_edit(data.id)) { if (!exports.can_edit(data.id)) {
return; return;
} }
var cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger'); const cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger');
var saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green'); const saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green');
var save_instructions = $('#user-groups #' + data.id + ' .save-instructions'); const save_instructions = $('#user-groups #' + data.id + ' .save-instructions');
if (is_user_group_changed() && if (is_user_group_changed() &&
!cancel_button.is(':visible')) { !cancel_button.is(':visible')) {
@@ -125,9 +125,9 @@ exports.populate_user_groups = function () {
} }
function show_saved_button() { function show_saved_button() {
var cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger'); const cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger');
var saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green'); const saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green');
var save_instructions = $('#user-groups #' + data.id + ' .save-instructions'); const save_instructions = $('#user-groups #' + data.id + ' .save-instructions');
if (!saved_button.is(':visible')) { if (!saved_button.is(':visible')) {
cancel_button.fadeOut(0); cancel_button.fadeOut(0);
save_instructions.fadeOut(0); save_instructions.fadeOut(0);
@@ -136,15 +136,15 @@ exports.populate_user_groups = function () {
} }
function save_members() { function save_members() {
var draft_group = get_pill_user_ids(); const draft_group = get_pill_user_ids();
var group_data = user_groups.get_user_group_from_id(data.id); const group_data = user_groups.get_user_group_from_id(data.id);
var original_group = group_data.members.keys(); const original_group = group_data.members.keys();
var same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group)); const same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group));
if (!draft_group.length || same_groups) { if (!draft_group.length || same_groups) {
return; return;
} }
var added = _.difference(draft_group, original_group); const added = _.difference(draft_group, original_group);
var removed = _.difference(original_group, draft_group); const removed = _.difference(original_group, draft_group);
channel.post({ channel.post({
url: "/json/user_groups/" + data.id + '/members', url: "/json/user_groups/" + data.id + '/members',
data: { data: {
@@ -158,10 +158,10 @@ exports.populate_user_groups = function () {
} }
function save_name_desc() { function save_name_desc() {
var user_group_status = $('#user-groups #' + data.id + ' .user-group-status'); const user_group_status = $('#user-groups #' + data.id + ' .user-group-status');
var group_data = user_groups.get_user_group_from_id(data.id); const group_data = user_groups.get_user_group_from_id(data.id);
var description = $('#user-groups #' + data.id + ' .description').text().trim(); const description = $('#user-groups #' + data.id + ' .description').text().trim();
var name = $('#user-groups #' + data.id + ' .name').text().trim(); const name = $('#user-groups #' + data.id + ' .name').text().trim();
if (group_data.description === description && group_data.name === name) { if (group_data.description === description && group_data.name === name) {
return; return;
@@ -178,7 +178,7 @@ exports.populate_user_groups = function () {
setTimeout(show_saved_button, 200); setTimeout(show_saved_button, 200);
}, },
error: function (xhr) { error: function (xhr) {
var errors = JSON.parse(xhr.responseText).msg; const errors = JSON.parse(xhr.responseText).msg;
xhr.responseText = JSON.stringify({msg: errors}); xhr.responseText = JSON.stringify({msg: errors});
ui_report.error(i18n.t("Failed"), xhr, user_group_status); ui_report.error(i18n.t("Failed"), xhr, user_group_status);
update_cancel_button(); update_cancel_button();
@@ -194,8 +194,8 @@ exports.populate_user_groups = function () {
return true; return true;
} }
var blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"], const blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"],
except_class); except_class);
if ($(event.relatedTarget).closest('#user-groups #' + data.id).length) { if ($(event.relatedTarget).closest('#user-groups #' + data.id).length) {
return _.some(blur_exceptions, function (class_name) { return _.some(blur_exceptions, function (class_name) {
return $(event.relatedTarget).closest(class_name).length; return $(event.relatedTarget).closest(class_name).length;
@@ -239,7 +239,7 @@ exports.populate_user_groups = function () {
update_cancel_button(); update_cancel_button();
}); });
var input = pill_container.children('.input'); const input = pill_container.children('.input');
if (exports.can_edit(data.id)) { if (exports.can_edit(data.id)) {
user_pill.set_up_typeahead_on_pills(input, pills, update_cancel_button); user_pill.set_up_typeahead_on_pills(input, pills, update_cancel_button);
} }
@@ -268,9 +268,9 @@ exports.set_up = function () {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
var user_group_status = $('#admin-user-group-status'); const user_group_status = $('#admin-user-group-status');
var group = { const group = {
members: JSON.stringify([people.my_current_user_id()]), members: JSON.stringify([people.my_current_user_id()]),
}; };
_.each($(this).serializeArray(), function (obj) { _.each($(this).serializeArray(), function (obj) {
@@ -290,7 +290,7 @@ exports.set_up = function () {
}, },
error: function (xhr) { error: function (xhr) {
user_group_status.hide(); user_group_status.hide();
var errors = JSON.parse(xhr.responseText).msg; const errors = JSON.parse(xhr.responseText).msg;
xhr.responseText = JSON.stringify({msg: errors}); xhr.responseText = JSON.stringify({msg: errors});
ui_report.error(i18n.t("Failed"), xhr, user_group_status); ui_report.error(i18n.t("Failed"), xhr, user_group_status);
}, },
@@ -298,12 +298,12 @@ exports.set_up = function () {
}); });
$('#user-groups').on('click', '.delete', function () { $('#user-groups').on('click', '.delete', function () {
var group_id = $(this).parents('.user-group').attr('id'); const group_id = $(this).parents('.user-group').attr('id');
if (!exports.can_edit(group_id)) { if (!exports.can_edit(group_id)) {
return; return;
} }
var user_group = user_groups.get_user_group_from_id(group_id); const user_group = user_groups.get_user_group_from_id(group_id);
var btn = $(this); const btn = $(this);
function delete_user_group() { function delete_user_group() {
channel.del({ channel.del({
@@ -322,9 +322,9 @@ exports.set_up = function () {
} }
// This is mostly important for styling concerns. // This is mostly important for styling concerns.
var modal_parent = $('#settings_content'); const modal_parent = $('#settings_content');
var html_body = render_confirm_delete_user({ const html_body = render_confirm_delete_user({
group_name: user_group.name, group_name: user_group.name,
}); });

View File

@@ -1,8 +1,8 @@
var render_announce_stream_docs = require('../templates/announce_stream_docs.hbs'); const render_announce_stream_docs = require('../templates/announce_stream_docs.hbs');
var render_new_stream_users = require('../templates/new_stream_users.hbs'); const render_new_stream_users = require('../templates/new_stream_users.hbs');
var render_subscription_invites_warning_modal = require('../templates/subscription_invites_warning_modal.hbs'); const render_subscription_invites_warning_modal = require('../templates/subscription_invites_warning_modal.hbs');
var created_stream; let created_stream;
exports.reset_created_stream = function () { exports.reset_created_stream = function () {
created_stream = undefined; created_stream = undefined;
@@ -16,8 +16,8 @@ exports.get_name = function () {
return created_stream; return created_stream;
}; };
var stream_subscription_error = (function () { const stream_subscription_error = (function () {
var self = {}; const self = {};
self.report_no_subs_to_stream = function () { self.report_no_subs_to_stream = function () {
$("#stream_subscription_error").text(i18n.t("You cannot create a stream with no subscribers!")); $("#stream_subscription_error").text(i18n.t("You cannot create a stream with no subscribers!"));
@@ -37,8 +37,8 @@ var stream_subscription_error = (function () {
}()); }());
var stream_name_error = (function () { const stream_name_error = (function () {
var self = {}; const self = {};
self.report_already_exists = function () { self.report_already_exists = function () {
$("#stream_name_error").text(i18n.t("A stream with this name already exists")); $("#stream_name_error").text(i18n.t("A stream with this name already exists"));
@@ -118,7 +118,7 @@ function ajaxSubscribeForCreation(stream_name, description, principals, invite_o
// The rest of the work is done via the subscribe event we will get // The rest of the work is done via the subscribe event we will get
}, },
error: function (xhr) { error: function (xhr) {
var msg = JSON.parse(xhr.responseText).msg; const msg = JSON.parse(xhr.responseText).msg;
if (msg.indexOf('access') >= 0) { if (msg.indexOf('access') >= 0) {
// If we can't access the stream, we can safely assume it's // If we can't access the stream, we can safely assume it's
// a duplicate stream that we are not invited to. // a duplicate stream that we are not invited to.
@@ -143,11 +143,11 @@ function update_announce_stream_state() {
// If the stream is invite only, disable the "Announce stream" option. // If the stream is invite only, disable the "Announce stream" option.
// Otherwise enable it. // Otherwise enable it.
var announce_stream_checkbox = $('#announce-new-stream input'); const announce_stream_checkbox = $('#announce-new-stream input');
var announce_stream_label = $('#announce-new-stream'); const announce_stream_label = $('#announce-new-stream');
var disable_it = false; let disable_it = false;
var privacy_type = $('input:radio[name=privacy]:checked').val(); const privacy_type = $('input:radio[name=privacy]:checked').val();
var is_invite_only = privacy_type === "invite-only" || privacy_type === "invite-only-public-history"; const is_invite_only = privacy_type === "invite-only" || privacy_type === "invite-only-public-history";
announce_stream_label.removeClass("control-label-disabled"); announce_stream_label.removeClass("control-label-disabled");
if (is_invite_only) { if (is_invite_only) {
@@ -170,14 +170,14 @@ function get_principals() {
} }
function create_stream() { function create_stream() {
var stream_name = $.trim($("#create_stream_name").val()); const stream_name = $.trim($("#create_stream_name").val());
var description = $.trim($("#create_stream_description").val()); const description = $.trim($("#create_stream_description").val());
var privacy_setting = $('#stream_creation_form input[name=privacy]:checked').val(); const privacy_setting = $('#stream_creation_form input[name=privacy]:checked').val();
var is_announcement_only = $('#stream_creation_form input[name=is-announcement-only]').prop('checked'); const is_announcement_only = $('#stream_creation_form input[name=is-announcement-only]').prop('checked');
var principals = get_principals(); const principals = get_principals();
var invite_only; let invite_only;
var history_public_to_subscribers; let history_public_to_subscribers;
if (privacy_setting === 'invite-only') { if (privacy_setting === 'invite-only') {
invite_only = true; invite_only = true;
@@ -192,7 +192,7 @@ function create_stream() {
created_stream = stream_name; created_stream = stream_name;
var announce = !!page_params.notifications_stream && const announce = !!page_params.notifications_stream &&
$('#announce-new-stream input').prop('checked'); $('#announce-new-stream input').prop('checked');
// Even though we already check to make sure that while typing the user cannot enter // Even though we already check to make sure that while typing the user cannot enter
@@ -254,16 +254,16 @@ exports.show_new_stream_modal = function () {
$("#stream-creation").removeClass("hide"); $("#stream-creation").removeClass("hide");
$(".right .settings").hide(); $(".right .settings").hide();
var all_users = people.get_rest_of_realm(); const all_users = people.get_rest_of_realm();
// Add current user on top of list // Add current user on top of list
all_users.unshift(people.get_person_from_user_id(page_params.user_id)); all_users.unshift(people.get_person_from_user_id(page_params.user_id));
var html = render_new_stream_users({ const html = render_new_stream_users({
users: all_users, users: all_users,
streams: stream_data.get_streams_for_settings_page(), streams: stream_data.get_streams_for_settings_page(),
is_admin: page_params.is_admin, is_admin: page_params.is_admin,
}); });
var container = $('#people_to_add'); const container = $('#people_to_add');
container.html(html); container.html(html);
exports.create_handlers_for_users(container); exports.create_handlers_for_users(container);
@@ -281,14 +281,14 @@ exports.show_new_stream_modal = function () {
clear_error_display(); clear_error_display();
$("#stream-checkboxes label.checkbox").on('change', function (e) { $("#stream-checkboxes label.checkbox").on('change', function (e) {
var elem = $(this); const elem = $(this);
var stream_id = elem.attr('data-stream-id'); const stream_id = elem.attr('data-stream-id');
var checked = elem.find('input').prop('checked'); const checked = elem.find('input').prop('checked');
var subscriber_ids = stream_data.get_sub_by_id(stream_id).subscribers; const subscriber_ids = stream_data.get_sub_by_id(stream_id).subscribers;
$('#user-checkboxes label.checkbox').each(function () { $('#user-checkboxes label.checkbox').each(function () {
var user_elem = $(this); const user_elem = $(this);
var user_id = user_elem.attr('data-user-id'); const user_id = user_elem.attr('data-user-id');
if (subscriber_ids.has(user_id)) { if (subscriber_ids.has(user_id)) {
user_elem.find('input').prop('checked', checked); user_elem.find('input').prop('checked', checked);
@@ -337,23 +337,23 @@ exports.create_handlers_for_users = function (container) {
// Search People or Streams // Search People or Streams
container.on('input', '.add-user-list-filter', function (e) { container.on('input', '.add-user-list-filter', function (e) {
var user_list = $(".add-user-list-filter"); const user_list = $(".add-user-list-filter");
if (user_list === 0) { if (user_list === 0) {
return; return;
} }
var search_term = user_list.expectOne().val().trim(); const search_term = user_list.expectOne().val().trim();
var search_terms = search_term.toLowerCase().split(","); const search_terms = search_term.toLowerCase().split(",");
(function filter_user_checkboxes() { (function filter_user_checkboxes() {
var user_labels = $("#user-checkboxes label.add-user-label"); const user_labels = $("#user-checkboxes label.add-user-label");
if (search_term === '') { if (search_term === '') {
user_labels.css({display: 'block'}); user_labels.css({display: 'block'});
return; return;
} }
var users = people.get_rest_of_realm(); const users = people.get_rest_of_realm();
var filtered_users = people.filter_people_by_search_terms(users, search_terms); const filtered_users = people.filter_people_by_search_terms(users, search_terms);
// Be careful about modifying the follow code. A naive implementation // Be careful about modifying the follow code. A naive implementation
// will work very poorly with a large user population (~1000 users). // will work very poorly with a large user population (~1000 users).
@@ -363,10 +363,10 @@ exports.create_handlers_for_users = function (container) {
// This would break the previous implementation, whereas the new // This would break the previous implementation, whereas the new
// implementation is merely sluggish. // implementation is merely sluggish.
user_labels.each(function () { user_labels.each(function () {
var elem = $(this); const elem = $(this);
var user_id = elem.attr('data-user-id'); const user_id = elem.attr('data-user-id');
var user_checked = filtered_users.has(user_id); const user_checked = filtered_users.has(user_id);
var display = user_checked ? "block" : "none"; const display = user_checked ? "block" : "none";
elem.css({display: display}); elem.css({display: display});
}); });
}()); }());
@@ -377,7 +377,7 @@ exports.create_handlers_for_users = function (container) {
exports.set_up_handlers = function () { exports.set_up_handlers = function () {
var container = $('#stream-creation').expectOne(); const container = $('#stream-creation').expectOne();
container.on('change', '#make-invite-only input', update_announce_stream_state); container.on('change', '#make-invite-only input', update_announce_stream_state);
@@ -385,14 +385,14 @@ exports.set_up_handlers = function () {
e.preventDefault(); e.preventDefault();
clear_error_display(); clear_error_display();
var stream_name = $.trim($("#create_stream_name").val()); const stream_name = $.trim($("#create_stream_name").val());
var name_ok = stream_name_error.validate_for_submit(stream_name); const name_ok = stream_name_error.validate_for_submit(stream_name);
if (!name_ok) { if (!name_ok) {
return; return;
} }
var principals = get_principals(); const principals = get_principals();
if (principals.length === 0) { if (principals.length === 0) {
stream_subscription_error.report_no_subs_to_stream(); stream_subscription_error.report_no_subs_to_stream();
return; return;
@@ -403,7 +403,7 @@ exports.set_up_handlers = function () {
} }
if (principals.length >= 50) { if (principals.length >= 50) {
var invites_warning_modal = render_subscription_invites_warning_modal({ const invites_warning_modal = render_subscription_invites_warning_modal({
stream_name: stream_name, stream_name: stream_name,
count: principals.length, count: principals.length,
}); });
@@ -423,14 +423,14 @@ exports.set_up_handlers = function () {
}); });
container.on("input", "#create_stream_name", function () { container.on("input", "#create_stream_name", function () {
var stream_name = $.trim($("#create_stream_name").val()); const stream_name = $.trim($("#create_stream_name").val());
// This is an inexpensive check. // This is an inexpensive check.
stream_name_error.pre_validate(stream_name); stream_name_error.pre_validate(stream_name);
}); });
container.on("mouseover", "#announce-stream-docs", function (e) { container.on("mouseover", "#announce-stream-docs", function (e) {
var announce_stream_docs = $("#announce-stream-docs"); const announce_stream_docs = $("#announce-stream-docs");
announce_stream_docs.popover({ announce_stream_docs.popover({
placement: "right", placement: "right",
content: render_announce_stream_docs({ content: render_announce_stream_docs({

View File

@@ -1,7 +1,7 @@
var render_subscription = require('../templates/subscription.hbs'); const render_subscription = require('../templates/subscription.hbs');
var render_subscription_settings = require('../templates/subscription_settings.hbs'); const render_subscription_settings = require('../templates/subscription_settings.hbs');
var render_subscription_table_body = require('../templates/subscription_table_body.hbs'); const render_subscription_table_body = require('../templates/subscription_table_body.hbs');
var render_subscriptions = require('../templates/subscriptions.hbs'); const render_subscriptions = require('../templates/subscriptions.hbs');
exports.show_subs_pane = { exports.show_subs_pane = {
nothing_selected: function () { nothing_selected: function () {
@@ -15,7 +15,7 @@ exports.show_subs_pane = {
}; };
exports.check_button_for_sub = function (sub) { exports.check_button_for_sub = function (sub) {
var id = parseInt(sub.stream_id, 10); const id = parseInt(sub.stream_id, 10);
return $(".stream-row[data-stream-id='" + id + "'] .check"); return $(".stream-row[data-stream-id='" + id + "'] .check");
}; };
@@ -26,14 +26,14 @@ exports.row_for_stream_id = function (stream_id) {
exports.settings_button_for_sub = function (sub) { exports.settings_button_for_sub = function (sub) {
// We don't do expectOne() here, because this button is only // We don't do expectOne() here, because this button is only
// visible if the user has that stream selected in the streams UI. // visible if the user has that stream selected in the streams UI.
var id = parseInt(sub.stream_id, 10); const id = parseInt(sub.stream_id, 10);
return $(".subscription_settings[data-stream-id='" + id + "'] .subscribe-button"); return $(".subscription_settings[data-stream-id='" + id + "'] .subscribe-button");
}; };
function get_row_data(row) { function get_row_data(row) {
var row_id = row.attr('data-stream-id'); const row_id = row.attr('data-stream-id');
if (row_id) { if (row_id) {
var row_object = stream_data.get_sub_by_id(row_id); const row_object = stream_data.get_sub_by_id(row_id);
return { return {
id: row_id, id: row_id,
object: row_object, object: row_object,
@@ -42,9 +42,9 @@ function get_row_data(row) {
} }
exports.get_active_data = function () { exports.get_active_data = function () {
var active_row = $('div.stream-row.active'); const active_row = $('div.stream-row.active');
var valid_active_id = active_row.attr('data-stream-id'); const valid_active_id = active_row.attr('data-stream-id');
var active_tab = $('.subscriptions-container').find('div.ind-tab.selected'); const active_tab = $('.subscriptions-container').find('div.ind-tab.selected');
return { return {
row: active_row, row: active_row,
id: valid_active_id, id: valid_active_id,
@@ -61,8 +61,8 @@ function get_hash_safe() {
} }
function selectText(element) { function selectText(element) {
var range; let range;
var sel; let sel;
if (window.getSelection) { if (window.getSelection) {
sel = window.getSelection(); sel = window.getSelection();
range = document.createRange(); range = document.createRange();
@@ -84,7 +84,7 @@ function should_list_all_streams() {
// this finds the stream that is actively open in the settings and focused in // this finds the stream that is actively open in the settings and focused in
// the left side. // the left side.
exports.active_stream = function () { exports.active_stream = function () {
var hash_components = window.location.hash.substr(1).split(/\//); const hash_components = window.location.hash.substr(1).split(/\//);
// if the string casted to a number is valid, and another component // if the string casted to a number is valid, and another component
// after exists then it's a stream name/id pair. // after exists then it's a stream name/id pair.
@@ -106,7 +106,7 @@ exports.toggle_pin_to_top_stream = function (sub) {
}; };
exports.maybe_update_realm_default_stream_name = function (stream_id, new_name) { exports.maybe_update_realm_default_stream_name = function (stream_id, new_name) {
var idx = _.findIndex(page_params.realm_default_streams, function (stream) { const idx = _.findIndex(page_params.realm_default_streams, function (stream) {
return stream.stream_id === stream_id; return stream.stream_id === stream_id;
}); });
if (idx === -1) { if (idx === -1) {
@@ -125,11 +125,11 @@ exports.is_subscribed_stream_tab_active = function () {
}; };
exports.update_stream_name = function (sub, new_name) { exports.update_stream_name = function (sub, new_name) {
var old_name = sub.name; const old_name = sub.name;
// Rename the stream internally. // Rename the stream internally.
stream_data.rename_sub(sub, new_name); stream_data.rename_sub(sub, new_name);
var stream_id = sub.stream_id; const stream_id = sub.stream_id;
// Update the left sidebar. // Update the left sidebar.
stream_list.rename_stream(sub, new_name); stream_list.rename_stream(sub, new_name);
@@ -141,7 +141,7 @@ exports.update_stream_name = function (sub, new_name) {
stream_edit.update_stream_name(sub, new_name); stream_edit.update_stream_name(sub, new_name);
// Update the subscriptions page // Update the subscriptions page
var sub_row = exports.row_for_stream_id(stream_id); const sub_row = exports.row_for_stream_id(stream_id);
sub_row.find(".stream-name").text(new_name); sub_row.find(".stream-name").text(new_name);
// Update the message feed. // Update the message feed.
@@ -161,7 +161,7 @@ exports.update_stream_description = function (sub, description, rendered_descrip
sub.rendered_description = rendered_description.replace('<p>', '').replace('</p>', ''); sub.rendered_description = rendered_description.replace('<p>', '').replace('</p>', '');
// Update stream row // Update stream row
var sub_row = exports.row_for_stream_id(sub.stream_id); const sub_row = exports.row_for_stream_id(sub.stream_id);
sub_row.find(".description").html(sub.rendered_description); sub_row.find(".description").html(sub.rendered_description);
// Update stream settings // Update stream settings
@@ -190,7 +190,7 @@ exports.update_stream_announcement_only = function (sub, new_value) {
}; };
exports.set_color = function (stream_id, color) { exports.set_color = function (stream_id, color) {
var sub = stream_data.get_sub_by_id(stream_id); const sub = stream_data.get_sub_by_id(stream_id);
stream_edit.set_stream_property(sub, 'color', color); stream_edit.set_stream_property(sub, 'color', color);
}; };
@@ -218,8 +218,8 @@ exports.add_sub_to_table = function (sub) {
return; return;
} }
var html = render_subscription(sub); const html = render_subscription(sub);
var settings_html = render_subscription_settings(sub); const settings_html = render_subscription_settings(sub);
if (stream_create.get_name() === sub.name) { if (stream_create.get_name() === sub.name) {
ui.get_content_element($(".streams-list")).prepend(html); ui.get_content_element($(".streams-list")).prepend(html);
ui.reset_scrollbar($(".streams-list")); ui.reset_scrollbar($(".streams-list"));
@@ -243,7 +243,7 @@ exports.add_sub_to_table = function (sub) {
exports.is_sub_already_present = function (sub) { exports.is_sub_already_present = function (sub) {
// This checks if a stream is already listed the "Manage streams" // This checks if a stream is already listed the "Manage streams"
// UI, by checking for its subscribe/unsubscribe checkmark button. // UI, by checking for its subscribe/unsubscribe checkmark button.
var button = exports.check_button_for_sub(sub); const button = exports.check_button_for_sub(sub);
if (button.length !== 0) { if (button.length !== 0) {
return true; return true;
} }
@@ -253,9 +253,9 @@ exports.is_sub_already_present = function (sub) {
exports.remove_stream = function (stream_id) { exports.remove_stream = function (stream_id) {
// It is possible that row is empty when we deactivate a // It is possible that row is empty when we deactivate a
// stream, but we let jQuery silently handle that. // stream, but we let jQuery silently handle that.
var row = exports.row_for_stream_id(stream_id); const row = exports.row_for_stream_id(stream_id);
row.remove(); row.remove();
var sub = stream_data.get_sub_by_id(stream_id); const sub = stream_data.get_sub_by_id(stream_id);
if (stream_edit.is_sub_settings_active(sub)) { if (stream_edit.is_sub_settings_active(sub)) {
exports.show_subs_pane.nothing_selected(); exports.show_subs_pane.nothing_selected();
} }
@@ -283,10 +283,10 @@ exports.update_settings_for_subscribed = function (sub) {
}; };
exports.show_active_stream_in_left_panel = function () { exports.show_active_stream_in_left_panel = function () {
var selected_row = get_hash_safe().split(/\//)[1]; const selected_row = get_hash_safe().split(/\//)[1];
if (parseFloat(selected_row)) { if (parseFloat(selected_row)) {
var sub_row = exports.row_for_stream_id(selected_row); const sub_row = exports.row_for_stream_id(selected_row);
sub_row.addClass("active"); sub_row.addClass("active");
} }
}; };
@@ -328,10 +328,10 @@ function triage_stream(query, sub) {
} }
} }
var search_terms = search_util.get_search_terms(query.input); const search_terms = search_util.get_search_terms(query.input);
function match(attr) { function match(attr) {
var val = sub[attr]; const val = sub[attr];
return search_util.vanilla_match({ return search_util.vanilla_match({
val: val, val: val,
@@ -354,15 +354,15 @@ function get_stream_id_buckets(stream_ids, query) {
// When we simplify the settings UI, we can get // When we simplify the settings UI, we can get
// rid of the "others" bucket. // rid of the "others" bucket.
var buckets = { const buckets = {
name: [], name: [],
desc: [], desc: [],
other: [], other: [],
}; };
_.each(stream_ids, function (stream_id) { _.each(stream_ids, function (stream_id) {
var sub = stream_data.get_sub_by_id(stream_id); const sub = stream_data.get_sub_by_id(stream_id);
var match_status = triage_stream(query, sub); const match_status = triage_stream(query, sub);
if (match_status === 'name_match') { if (match_status === 'name_match') {
buckets.name.push(stream_id); buckets.name.push(stream_id);
@@ -380,11 +380,11 @@ function get_stream_id_buckets(stream_ids, query) {
} }
exports.populate_stream_settings_left_panel = function () { exports.populate_stream_settings_left_panel = function () {
var sub_rows = stream_data.get_updated_unsorted_subs(); const sub_rows = stream_data.get_updated_unsorted_subs();
var template_data = { const template_data = {
subscriptions: sub_rows, subscriptions: sub_rows,
}; };
var html = render_subscriptions(template_data); const html = render_subscriptions(template_data);
ui.get_content_element($('#subscriptions_table .streams-list')).html(html); ui.get_content_element($('#subscriptions_table .streams-list')).html(html);
}; };
@@ -393,26 +393,26 @@ exports.populate_stream_settings_left_panel = function () {
exports.filter_table = function (query) { exports.filter_table = function (query) {
exports.show_active_stream_in_left_panel(); exports.show_active_stream_in_left_panel();
var widgets = {}; const widgets = {};
var streams_list_scrolltop = ui.get_scroll_element($(".streams-list")).scrollTop(); const streams_list_scrolltop = ui.get_scroll_element($(".streams-list")).scrollTop();
var stream_ids = []; const stream_ids = [];
_.each($("#subscriptions_table .stream-row"), function (row) { _.each($("#subscriptions_table .stream-row"), function (row) {
var stream_id = $(row).attr('data-stream-id'); const stream_id = $(row).attr('data-stream-id');
stream_ids.push(stream_id); stream_ids.push(stream_id);
}); });
var buckets = get_stream_id_buckets(stream_ids, query); const buckets = get_stream_id_buckets(stream_ids, query);
// If we just re-built the DOM from scratch we wouldn't need // If we just re-built the DOM from scratch we wouldn't need
// all this hidden/notdisplayed logic. // all this hidden/notdisplayed logic.
var hidden_ids = {}; const hidden_ids = {};
_.each(buckets.other, function (stream_id) { _.each(buckets.other, function (stream_id) {
hidden_ids[stream_id] = true; hidden_ids[stream_id] = true;
}); });
_.each($("#subscriptions_table .stream-row"), function (row) { _.each($("#subscriptions_table .stream-row"), function (row) {
var stream_id = $(row).attr('data-stream-id'); const stream_id = $(row).attr('data-stream-id');
// Below code goes away if we don't do sort-DOM-in-place. // Below code goes away if we don't do sort-DOM-in-place.
if (hidden_ids[stream_id]) { if (hidden_ids[stream_id]) {
@@ -428,7 +428,7 @@ exports.filter_table = function (query) {
ui.reset_scrollbar($("#subscription_overlay .streams-list")); ui.reset_scrollbar($("#subscription_overlay .streams-list"));
var all_stream_ids = [].concat( const all_stream_ids = [].concat(
buckets.name, buckets.name,
buckets.desc, buckets.desc,
buckets.other buckets.other
@@ -444,12 +444,12 @@ exports.filter_table = function (query) {
ui.get_scroll_element($(".streams-list")).scrollTop(streams_list_scrolltop); ui.get_scroll_element($(".streams-list")).scrollTop(streams_list_scrolltop);
}; };
var subscribed_only = true; let subscribed_only = true;
exports.get_search_params = function () { exports.get_search_params = function () {
var search_box = $("#add_new_subscription input[type='text']"); const search_box = $("#add_new_subscription input[type='text']");
var input = search_box.expectOne().val().trim(); const input = search_box.expectOne().val().trim();
var params = { const params = {
input: input, input: input,
subscribed_only: subscribed_only, subscribed_only: subscribed_only,
}; };
@@ -465,11 +465,11 @@ exports.maybe_reset_right_panel = function () {
}; };
exports.actually_filter_streams = function () { exports.actually_filter_streams = function () {
var search_params = exports.get_search_params(); const search_params = exports.get_search_params();
exports.filter_table(search_params); exports.filter_table(search_params);
}; };
var filter_streams = _.throttle(exports.actually_filter_streams, 50); const filter_streams = _.throttle(exports.actually_filter_streams, 50);
// Make it explicit that our toggler is not created right away. // Make it explicit that our toggler is not created right away.
exports.toggler = undefined; exports.toggler = undefined;
@@ -518,7 +518,7 @@ exports.setup_page = function (callback) {
}); });
if (should_list_all_streams()) { if (should_list_all_streams()) {
var toggler_elem = exports.toggler.get(); const toggler_elem = exports.toggler.get();
$("#subscriptions_table .search-container").prepend(toggler_elem); $("#subscriptions_table .search-container").prepend(toggler_elem);
} }
if (page_params.is_guest) { if (page_params.is_guest) {
@@ -533,7 +533,7 @@ exports.setup_page = function (callback) {
$('#subscriptions_table').empty(); $('#subscriptions_table').empty();
var template_data = { const template_data = {
can_create_streams: page_params.can_create_streams, can_create_streams: page_params.can_create_streams,
hide_all_streams: !should_list_all_streams(), hide_all_streams: !should_list_all_streams(),
max_name_length: page_params.stream_name_max_length, max_name_length: page_params.stream_name_max_length,
@@ -541,7 +541,7 @@ exports.setup_page = function (callback) {
is_admin: page_params.is_admin, is_admin: page_params.is_admin,
}; };
var rendered = render_subscription_table_body(template_data); const rendered = render_subscription_table_body(template_data);
$('#subscriptions_table').append(rendered); $('#subscriptions_table').append(rendered);
exports.populate_stream_settings_left_panel(); exports.populate_stream_settings_left_panel();
@@ -567,7 +567,7 @@ exports.setup_page = function (callback) {
}; };
exports.switch_to_stream_row = function (stream_id) { exports.switch_to_stream_row = function (stream_id) {
var stream_row = exports.row_for_stream_id(stream_id); const stream_row = exports.row_for_stream_id(stream_id);
exports.get_active_data().row.removeClass("active"); exports.get_active_data().row.removeClass("active");
stream_row.addClass("active"); stream_row.addClass("active");
@@ -605,7 +605,7 @@ exports.change_state = function (section) {
// if the section is a valid number. // if the section is a valid number.
if (/\d+/.test(section)) { if (/\d+/.test(section)) {
var stream_id = section; const stream_id = section;
// Guest users can not access unsubscribed streams // Guest users can not access unsubscribed streams
// So redirect guest users to 'subscribed' tab // So redirect guest users to 'subscribed' tab
// for any unsubscribed stream settings hash // for any unsubscribed stream settings hash
@@ -640,8 +640,8 @@ exports.close = function () {
}; };
exports.switch_rows = function (event) { exports.switch_rows = function (event) {
var active_data = exports.get_active_data(); const active_data = exports.get_active_data();
var switch_row; let switch_row;
if (window.location.hash === '#streams/new') { if (window.location.hash === '#streams/new') {
// Prevent switching stream rows when creating a new stream // Prevent switching stream rows when creating a new stream
return false; return false;
@@ -663,9 +663,9 @@ exports.switch_rows = function (event) {
} }
} }
var row_data = get_row_data(switch_row); const row_data = get_row_data(switch_row);
if (row_data) { if (row_data) {
var stream_id = row_data.id; const stream_id = row_data.id;
exports.switch_to_stream_row(stream_id); exports.switch_to_stream_row(stream_id);
} else if (event === 'up_arrow' && !row_data) { } else if (event === 'up_arrow' && !row_data) {
$('#search_stream_name').focus(); $('#search_stream_name').focus();
@@ -674,8 +674,8 @@ exports.switch_rows = function (event) {
}; };
exports.keyboard_sub = function () { exports.keyboard_sub = function () {
var active_data = exports.get_active_data(); const active_data = exports.get_active_data();
var row_data = get_row_data(active_data.row); const row_data = get_row_data(active_data.row);
if (row_data) { if (row_data) {
exports.sub_or_unsub(row_data.object); exports.sub_or_unsub(row_data.object);
if (row_data.object.subscribed && active_data.tab.text() === 'Subscribed') { if (row_data.object.subscribed && active_data.tab.text() === 'Subscribed') {
@@ -686,7 +686,7 @@ exports.keyboard_sub = function () {
}; };
exports.toggle_view = function (event) { exports.toggle_view = function (event) {
var active_data = exports.get_active_data(); const active_data = exports.get_active_data();
if (event === 'right_arrow' && active_data.tab.text() === 'Subscribed') { if (event === 'right_arrow' && active_data.tab.text() === 'Subscribed') {
exports.toggler.goto('all-streams'); exports.toggler.goto('all-streams');
@@ -696,17 +696,17 @@ exports.toggle_view = function (event) {
}; };
exports.view_stream = function () { exports.view_stream = function () {
var active_data = exports.get_active_data(); const active_data = exports.get_active_data();
var row_data = get_row_data(active_data.row); const row_data = get_row_data(active_data.row);
if (row_data) { if (row_data) {
var stream_narrow_hash = '#narrow/stream/' + hash_util.encode_stream_name(row_data.object.name); const stream_narrow_hash = '#narrow/stream/' + hash_util.encode_stream_name(row_data.object.name);
hashchange.go_to_location(stream_narrow_hash); hashchange.go_to_location(stream_narrow_hash);
} }
}; };
function ajaxSubscribe(stream, color) { function ajaxSubscribe(stream, color) {
// Subscribe yourself to a single stream. // Subscribe yourself to a single stream.
var true_stream_name; let true_stream_name;
return channel.post({ return channel.post({
url: "/json/users/me/subscriptions", url: "/json/users/me/subscriptions",
@@ -716,7 +716,7 @@ function ajaxSubscribe(stream, color) {
$("#create_stream_name").val(""); $("#create_stream_name").val("");
} }
var res = JSON.parse(xhr.responseText); const res = JSON.parse(xhr.responseText);
if (!$.isEmptyObject(res.already_subscribed)) { if (!$.isEmptyObject(res.already_subscribed)) {
// Display the canonical stream capitalization. // Display the canonical stream capitalization.
true_stream_name = res.already_subscribed[people.my_current_email()][0]; true_stream_name = res.already_subscribed[people.my_current_email()][0];
@@ -752,7 +752,7 @@ exports.do_open_create_stream = function () {
// Only call this directly for hash changes. // Only call this directly for hash changes.
// Prefer open_create_stream(). // Prefer open_create_stream().
var stream = $.trim($("#search_stream_name").val()); const stream = $.trim($("#search_stream_name").val());
if (!should_list_all_streams()) { if (!should_list_all_streams()) {
// Realms that don't allow listing streams should simply be subscribed to. // Realms that don't allow listing streams should simply be subscribed to.
@@ -809,11 +809,11 @@ exports.initialize = function () {
e.preventDefault(); e.preventDefault();
$('#subscription-status').hide(); $('#subscription-status').hide();
var stream_name = narrow_state.stream(); const stream_name = narrow_state.stream();
if (stream_name === undefined) { if (stream_name === undefined) {
return; return;
} }
var sub = stream_data.get_sub(stream_name); const sub = stream_data.get_sub(stream_name);
exports.sub_or_unsub(sub); exports.sub_or_unsub(sub);
$('.empty_feed_notice').hide(); $('.empty_feed_notice').hide();
@@ -831,7 +831,7 @@ exports.initialize = function () {
}); });
(function defocus_sub_settings() { (function defocus_sub_settings() {
var sel = ".search-container, .streams-list, .subscriptions-header"; const sel = ".search-container, .streams-list, .subscriptions-header";
$("#subscriptions_table").on("click", sel, function (e) { $("#subscriptions_table").on("click", sel, function (e) {
if ($(e.target).is(sel)) { if ($(e.target).is(sel)) {

View File

@@ -27,7 +27,7 @@ interface ExportLoaderOptions {
} }
function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] { function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] {
const exposeLoaders = []; const exposeLoaders = [];
for (var loaderEntry of optionsArr) { for (const loaderEntry of optionsArr) {
const path = loaderEntry.path; const path = loaderEntry.path;
let name = ""; let name = "";
const useArr = [cacheLoader]; const useArr = [cacheLoader];
@@ -38,7 +38,7 @@ function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] {
} else { } else {
// If name is an array // If name is an array
if (Array.isArray(loaderEntry.name)) { if (Array.isArray(loaderEntry.name)) {
for (var exposeName of loaderEntry.name) { for (const exposeName of loaderEntry.name) {
useArr.push({loader: 'expose-loader', options: exposeName}); useArr.push({loader: 'expose-loader', options: exposeName});
} }
// If name is a string // If name is a string

View File

@@ -216,7 +216,7 @@ export default (env?: string): webpack.Configuration[] => {
// Expose Global variables for third party libraries to webpack modules // Expose Global variables for third party libraries to webpack modules
// Use the unminified versions of jquery and underscore so that // Use the unminified versions of jquery and underscore so that
// Good error messages show up in production and development in the source maps // Good error messages show up in production and development in the source maps
var exposeOptions = [ const exposeOptions = [
{ path: "blueimp-md5/js/md5.js" }, { path: "blueimp-md5/js/md5.js" },
{ path: "clipboard/dist/clipboard.js", name: "ClipboardJS" }, { path: "clipboard/dist/clipboard.js", name: "ClipboardJS" },
{ path: "xdate/src/xdate.js", name: "XDate" }, { path: "xdate/src/xdate.js", name: "XDate" },