From f9f104a4f8468f47cce9408af59398707bc61c83 Mon Sep 17 00:00:00 2001 From: Anders Kaseorg Date: Fri, 1 Nov 2019 16:06:25 -0700 Subject: [PATCH] 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 --- frontend_tests/node_tests/buddy_data.js | 10 +- frontend_tests/node_tests/filter.js | 82 ++--- frontend_tests/node_tests/markdown.js | 68 ++-- .../node_tests/settings_user_groups.js | 234 ++++++------- frontend_tests/node_tests/templates.js | 6 +- static/js/buddy_data.js | 64 ++-- static/js/click_handlers.js | 154 ++++----- static/js/copy_and_paste.js | 70 ++-- static/js/hash_util.js | 34 +- static/js/message_list_view.js | 276 +++++++-------- static/js/narrow.js | 158 ++++----- static/js/popovers.js | 316 +++++++++--------- static/js/settings_org.js | 4 +- static/js/settings_user_groups.js | 90 ++--- static/js/stream_create.js | 96 +++--- static/js/subs.js | 140 ++++---- tools/webpack-helpers.ts | 4 +- tools/webpack.config.ts | 2 +- 18 files changed, 904 insertions(+), 904 deletions(-) diff --git a/frontend_tests/node_tests/buddy_data.js b/frontend_tests/node_tests/buddy_data.js index 9b0cbef727..61793ad666 100644 --- a/frontend_tests/node_tests/buddy_data.js +++ b/frontend_tests/node_tests/buddy_data.js @@ -128,9 +128,9 @@ run_test('buddy_status', () => { run_test('title_data', () => { // Groups - var is_group = true; - var user_ids_string = "9999,1000"; - var expected_group_data = { + let is_group = true; + const user_ids_string = "9999,1000"; + let expected_group_data = { is_group: is_group, recipients: "Human Selma, Old User", is_bot: false, @@ -140,7 +140,7 @@ run_test('title_data', () => { is_group = ''; // Bots with owners. - var bot_owner_exists = true; + let bot_owner_exists = true; expected_group_data = { is_group: '', name: 'Blue Herring Bot', @@ -168,7 +168,7 @@ run_test('title_data', () => { status_text: 'out to lunch', }); - var expected_data = { + let expected_data = { is_group: is_group, status_text: 'out to lunch', last_seen: 'translated: Active now', diff --git a/frontend_tests/node_tests/filter.js b/frontend_tests/node_tests/filter.js index bb379c88db..8314d3c8b7 100644 --- a/frontend_tests/node_tests/filter.js +++ b/frontend_tests/node_tests/filter.js @@ -9,19 +9,19 @@ set_global('message_store', {}); set_global('page_params', {}); set_global('feature_flags', {}); -var me = { +const me = { email: 'me@example.com', user_id: 30, full_name: 'Me Myself', }; -var joe = { +const joe = { email: 'joe@example.com', user_id: 31, full_name: 'joe', }; -var steve = { +const steve = { email: 'STEVE@foo.com', user_id: 32, full_name: 'steve', @@ -36,7 +36,7 @@ function assert_same_operators(result, terms) { terms = _.map(terms, function (term) { // If negated flag is undefined, we explicitly // set it to false. - var negated = term.negated; + let negated = term.negated; if (!negated) { negated = false; } @@ -50,12 +50,12 @@ function assert_same_operators(result, terms) { } run_test('basics', () => { - var operators = [ + let operators = [ {operator: 'stream', operand: 'foo'}, {operator: 'stream', operand: 'exclude_stream', negated: true}, {operator: 'topic', operand: 'bar'}, ]; - var filter = new Filter(operators); + let filter = new Filter(operators); assert_same_operators(filter.operators(), operators); assert.deepEqual(filter.operands('stream'), ['foo']); @@ -162,10 +162,10 @@ run_test('basics', () => { assert(filter.can_apply_locally()); }); run_test('show_first_unread', () => { - var operators = [ + let operators = [ {operator: 'is', operand: 'any'}, ]; - var filter = new Filter(operators); + let filter = new Filter(operators); assert(filter.allow_use_first_unread_when_narrowing()); operators = [ @@ -188,42 +188,42 @@ run_test('show_first_unread', () => { }); run_test('topic_stuff', () => { - var operators = [ + const operators = [ {operator: 'stream', operand: 'foo'}, {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('wrong', 'old topic')); 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('topic'), ['new topic']); }); run_test('new_style_operators', () => { - var term = { + const term = { operator: 'stream', operand: 'foo', }; - var operators = [term]; - var filter = new Filter(operators); + const operators = [term]; + const filter = new Filter(operators); assert.deepEqual(filter.operands('stream'), ['foo']); assert(filter.is_exactly('stream')); }); run_test('public_operators', () => { - var operators = [ + let operators = [ {operator: 'stream', operand: 'foo'}, {operator: 'in', operand: 'all'}, {operator: 'topic', operand: 'bar'}, ]; - var filter = new Filter(operators); + let filter = new Filter(operators); assert_same_operators(filter.public_operators(), operators); assert(!filter.is_exactly('stream')); @@ -241,7 +241,7 @@ run_test('canonicalizations', () => { assert.equal(Filter.canonicalize_operator('Subject'), 'topic'); assert.equal(Filter.canonicalize_operator('FROM'), 'sender'); - var term; + let term; term = Filter.canonicalize_term({operator: 'Stream', operand: 'Denmark'}); assert.equal(term.operator, 'stream'); assert.equal(term.operand, 'Denmark'); @@ -292,7 +292,7 @@ function get_predicate(operators) { } function make_sub(name, stream_id) { - var sub = { + const sub = { name: name, 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 // rather than full-fledged message objects. - var stream_id = 42; + const stream_id = 42; 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: 'whatever'})); @@ -356,7 +356,7 @@ run_test('predicate_basics', () => { predicate = get_predicate([['in', 'all']]); assert(predicate({})); - var unknown_stream_id = 999; + const unknown_stream_id = 999; predicate = get_predicate([['in', 'home']]); assert(!predicate({stream_id: unknown_stream_id, stream: 'unknown'})); assert(predicate({type: 'private'})); @@ -435,10 +435,10 @@ run_test('predicate_basics', () => { }); run_test('negated_predicates', () => { - var predicate; - var narrow; + let predicate; + let narrow; - var social_stream_id = 555; + const social_stream_id = 555; make_sub('social', social_stream_id); narrow = [ @@ -459,7 +459,7 @@ run_test('negated_predicates', () => { run_test('mit_exceptions', () => { 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.d', topic: 'personal'})); 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'})); // Try to get the MIT regex to explode for an empty stream. - var terms = [ + let terms = [ {operator: 'stream', operand: ''}, {operator: 'topic', operand: 'bar'}, ]; @@ -488,7 +488,7 @@ run_test('mit_exceptions', () => { }); run_test('predicate_edge_cases', () => { - var predicate; + let predicate; // The code supports undefined as an operator to Filter, which results // in a predicate that accepts any message. predicate = new Filter().predicate(); @@ -507,11 +507,11 @@ run_test('predicate_edge_cases', () => { assert(predicate({})); // Exercise caching feature. - var terms = [ + const terms = [ {operator: 'stream', operand: 'Foo'}, {operator: 'topic', operand: 'bar'}, ]; - var filter = new Filter(terms); + const filter = new Filter(terms); filter.predicate(); predicate = filter.predicate(); // get cached version assert(predicate({type: 'stream', stream: 'foo', topic: 'bar'})); @@ -519,11 +519,11 @@ run_test('predicate_edge_cases', () => { }); run_test('parse', () => { - var string; - var operators; + let string; + let operators; function _test() { - var result = Filter.parse(string); + const result = Filter.parse(string); assert_same_operators(result, operators); } @@ -646,8 +646,8 @@ run_test('parse', () => { }); run_test('unparse', () => { - var string; - var operators; + let string; + let operators; operators = [ {operator: 'stream', operand: 'Foo'}, @@ -697,8 +697,8 @@ run_test('unparse', () => { }); run_test('describe', () => { - var narrow; - var string; + let narrow; + let string; narrow = [ {operator: 'streams', operand: 'public'}, @@ -825,10 +825,10 @@ run_test('describe', () => { }); run_test('is_functions', () => { - var terms = [ + let terms = [ {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', 'topic'), false); assert.equal(filter.is_exactly('pm-with'), false); @@ -995,12 +995,12 @@ run_test('first_valid_id_from', () => { }); run_test('update_email', () => { - var terms = [ + const terms = [ {operator: 'pm-with', operand: 'steve@foo.com'}, {operator: 'sender', operand: 'steve@foo.com'}, {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'); assert.deepEqual(filter.operands('pm-with'), ['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. 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'})); }); diff --git a/frontend_tests/node_tests/markdown.js b/frontend_tests/node_tests/markdown.js index 0d467db398..b26e08573b 100644 --- a/frontend_tests/node_tests/markdown.js +++ b/frontend_tests/node_tests/markdown.js @@ -48,16 +48,16 @@ set_global('Image', function () { }); emoji.initialize(); -var doc = ""; +const doc = ""; set_global('document', doc); set_global('$', global.make_zjquery()); set_global('feature_flags', {local_echo: true}); -var people = global.people; +const people = global.people; -var cordelia = { +const cordelia = { full_name: 'Cordelia Lear', user_id: 101, email: 'cordelia@zulip.com', @@ -96,21 +96,21 @@ people.add({ people.initialize_current_user(cordelia.user_id); -var hamletcharacters = { +const hamletcharacters = { name: "hamletcharacters", id: 1, description: "Characters of Hamlet", members: [cordelia.user_id], }; -var backend = { +const backend = { name: "Backend", id: 2, description: "Backend team", members: [], }; -var edgecase_group = { +const edgecase_group = { name: "Bobby

Tables

", id: 3, 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(edgecase_group); -var stream_data = global.stream_data; -var denmark = { +const stream_data = global.stream_data; +const denmark = { subscribed: false, color: 'blue', name: 'Denmark', stream_id: 1, is_muted: true, }; -var social = { +const social = { subscribed: true, color: 'red', name: 'social', @@ -137,14 +137,14 @@ var social = { is_muted: false, invite_only: true, }; -var edgecase_stream = { +const edgecase_stream = { subscribed: true, color: 'green', name: 'Bobby

Tables

', stream_id: 3, is_muted: false, }; -var edgecase_stream_2 = { +const edgecase_stream_2 = { subscribed: true, color: 'yellow', name: 'Bobby { - var input = '\n```\nfenced code\n```\n\nand then after\n'; - var expected = '\n\n
fenced code\n
\n\n\n\nand then after\n\n'; - var output = fenced_code.process_fenced_code(input); + const input = '\n```\nfenced code\n```\n\nand then after\n'; + const expected = '\n\n
fenced code\n
\n\n\n\nand then after\n\n'; + const output = fenced_code.process_fenced_code(input); assert.equal(output, expected); }); 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', () => { - var no_markup = [ + const no_markup = [ "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", ]; - var markup = [ + const markup = [ "Contains a https://zulip.com/image.png file", "Contains a https://zulip.com/image.jpg file", "https://zulip.com/image.jpg", @@ -220,7 +220,7 @@ run_test('bugdown_detection', () => { }); run_test('marked_shared', () => { - var tests = bugdown_data.regular_tests; + const tests = bugdown_data.regular_tests; tests.forEach(function (test) { @@ -229,11 +229,11 @@ run_test('marked_shared', () => { return; } - var message = {raw_content: test.input}; + const message = {raw_content: test.input}; page_params.translate_emoticons = test.translate_emoticons || false; markdown.apply_markdown(message); - var output = message.content; - var error_message = `Failure in test: ${test.name}`; + const output = message.content; + const error_message = `Failure in test: ${test.name}`; if (test.marked_expected_output) { global.bugdown_assert.notEqual(test.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', () => { - var message = {raw_content: '@**Leo**'}; + let message = {raw_content: '@**Leo**'}; markdown.apply_markdown(message); assert(!message.mentioned); assert(!message.mentioned_me_directly); @@ -263,7 +263,7 @@ run_test('message_flags', () => { }); run_test('marked', () => { - var test_cases = [ + const test_cases = [ {input: 'hello', expected: '

hello

'}, {input: 'hello there', expected: '

hello there

'}, {input: 'hello **bold** for you', expected: '

hello bold for you

'}, @@ -396,18 +396,18 @@ run_test('marked', () => { // Disable emoji conversion by default. page_params.translate_emoticons = test_case.translate_emoticons || false; - var input = test_case.input; - var expected = test_case.expected; + const input = test_case.input; + const expected = test_case.expected; - var message = {raw_content: input}; + const message = {raw_content: input}; markdown.apply_markdown(message); - var output = message.content; + const output = message.content; assert.equal(expected, output); }); }); 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); assert.equal(util.get_topic_links(message).length, []); @@ -456,8 +456,8 @@ run_test('topic_links', () => { }); run_test('message_flags', () => { - var input = "/me is testing this"; - var message = {topic: "No links here", raw_content: input}; + let input = "/me is testing this"; + let message = {topic: "No links here", raw_content: input}; markdown.apply_markdown(message); assert.equal(message.is_me_message, true); @@ -528,7 +528,7 @@ run_test('message_flags', () => { }); run_test('backend_only_realm_filters', () => { - var backend_only_realm_filters = [ + const backend_only_realm_filters = [ 'Here is the 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 // to set_realm_filters. markdown.set_realm_filters([['/a(?im)a/g'], ['/a(?L)a/g']]); - var actual_value = marked.InlineLexer.rules.zulip.realm_filters; - var expected_value = [/\/aa\/g(?![\w])/gim, /\/aa\/g(?![\w])/g]; + let actual_value = marked.InlineLexer.rules.zulip.realm_filters; + let expected_value = [/\/aa\/g(?![\w])/gim, /\/aa\/g(?![\w])/g]; assert.deepEqual(actual_value, expected_value); // Test case with multiple replacements. markdown.set_realm_filters([['#cf(?P[0-9]+)(?P[A-Z][0-9A-Z]*)', 'http://google.com']]); @@ -562,7 +562,7 @@ run_test('python_to_js_filter', () => { run_test('katex_throws_unexpected_exceptions', () => { katex.renderToString = function () { throw new 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); assert.equal(blueslip.get_test_logs('error').length, 1); blueslip.clear_test_data(); diff --git a/frontend_tests/node_tests/settings_user_groups.js b/frontend_tests/node_tests/settings_user_groups.js index 1d5687ea10..036138e79e 100644 --- a/frontend_tests/node_tests/settings_user_groups.js +++ b/frontend_tests/node_tests/settings_user_groups.js @@ -5,13 +5,13 @@ set_global('$', global.make_zjquery()); set_global('i18n', global.stub_i18n); set_global('confirm_dialog', {}); -var noop = function () {}; +const noop = function () {}; -var pills = { +const pills = { pill: {}, }; -var create_item_handler; +let create_item_handler; set_global('channel', {}); set_global('blueslip', global.make_zblueslip()); @@ -83,31 +83,31 @@ run_test('can_edit', () => { }); -var user_group_selector = "#user-groups #1"; -var cancel_selector = "#user-groups #1 .save-status.btn-danger"; -var saved_selector = "#user-groups #1 .save-status.sea-green"; -var name_selector = "#user-groups #1 .name"; -var description_selector = "#user-groups #1 .description"; -var instructions_selector = "#user-groups #1 .save-instructions"; +const user_group_selector = "#user-groups #1"; +const cancel_selector = "#user-groups #1 .save-status.btn-danger"; +const saved_selector = "#user-groups #1 .save-status.sea-green"; +const name_selector = "#user-groups #1 .name"; +const description_selector = "#user-groups #1 .description"; +const instructions_selector = "#user-groups #1 .save-instructions"; run_test('populate_user_groups', () => { - var realm_user_group = { + const realm_user_group = { id: 1, name: 'Mobile', description: 'All mobile people', members: Dict.from_array([2, 4]), }; - var iago = { + const iago = { email: 'iago@zulip.com', user_id: 2, full_name: 'Iago', }; - var alice = { + const alice = { email: 'alice@example.com', user_id: 31, full_name: 'Alice', }; - var bob = { + const bob = { email: 'bob@example.com', user_id: 32, full_name: 'Bob', @@ -121,8 +121,8 @@ run_test('populate_user_groups', () => { return [realm_user_group]; }; - var templates_render_called = false; - var fake_rendered_temp = $.create('fake_admin_user_group_list_template_rendered'); + let templates_render_called = false; + const fake_rendered_temp = $.create('fake_admin_user_group_list_template_rendered'); global.stub_templates(function (template, args) { assert.equal(template, 'admin_user_group_list'); assert.equal(args.user_group.id, 1); @@ -132,13 +132,13 @@ run_test('populate_user_groups', () => { return fake_rendered_temp; }); - var user_groups_list_append_called = false; + let user_groups_list_append_called = false; $('#user-groups').append = function (rendered_temp) { assert.equal(rendered_temp, fake_rendered_temp); 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) { if (user_id === iago.user_id) { return iago; @@ -155,11 +155,11 @@ run_test('populate_user_groups', () => { 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) { - var id = item.user_id; + const id = item.user_id; assert.equal(all_pills[id], undefined); all_pills[id] = item; }; @@ -167,17 +167,17 @@ run_test('populate_user_groups', () => { return _.values(all_pills); }; - var text_cleared; + let text_cleared; pills.clear_text = function () { text_cleared = true; }; - var input_field_stub = $.create('fake-input-field'); + const input_field_stub = $.create('fake-input-field'); pill_container_stub.children = function () { return input_field_stub; }; - var input_typeahead_called = false; + let input_typeahead_called = false; input_field_stub.typeahead = function (config) { assert.equal(config.items, 5); assert(config.fixed); @@ -190,27 +190,27 @@ run_test('populate_user_groups', () => { assert.equal(typeof config.updater, 'function'); (function test_highlighter() { - var fake_person = $.create('fake-person'); + const fake_person = $.create('fake-person'); typeahead_helper.render_person = function () { return fake_person; }; assert.equal(config.highlighter(), fake_person); }()); - var fake_context = { + const fake_context = { query: 'ali', }; (function test_source() { - var result = config.source.call(fake_context, iago); - var emails = _.pluck(result, 'email').sort(); + const result = config.source.call(fake_context, iago); + const emails = _.pluck(result, 'email').sort(); assert.deepEqual(emails, [alice.email, bob.email]); }()); (function test_matcher() { /* Here the query doesn't begin with an '@' because typeahead is triggered 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); result = config.matcher.call(fake_context, alice); @@ -218,7 +218,7 @@ run_test('populate_user_groups', () => { }()); (function test_sorter() { - var sort_recipientbox_typeahead_called = false; + let sort_recipientbox_typeahead_called = false; typeahead_helper.sort_recipientbox_typeahead = function () { sort_recipientbox_typeahead_called = true; }; @@ -232,9 +232,9 @@ run_test('populate_user_groups', () => { return realm_user_group; }; - var saved_fade_out_called = false; - var cancel_fade_to_called = false; - var instructions_fade_to_called = false; + let saved_fade_out_called = false; + let cancel_fade_to_called = false; + let instructions_fade_to_called = false; $(saved_selector).fadeOut = function () { saved_fade_out_called = true; }; @@ -274,7 +274,7 @@ run_test('populate_user_groups', () => { input_typeahead_called = true; }; - var get_by_email_called = false; + let get_by_email_called = false; people.get_by_email = function (user_email) { get_by_email_called = true; if (user_email === iago.email) { @@ -293,14 +293,14 @@ run_test('populate_user_groups', () => { function test_create_item(handler) { (function test_rejection_path() { - var item = handler(iago.email, pills.items()); + const item = handler(iago.email, pills.items()); assert(get_by_email_called); assert.equal(item, undefined); }()); (function test_success_path() { 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.equal(typeof res, 'object'); assert.equal(res.user_id, bob.user_id); @@ -333,7 +333,7 @@ run_test('populate_user_groups', () => { }); run_test('with_external_user', () => { - var realm_user_group = { + const realm_user_group = { id: 1, name: 'Mobile', description: 'All mobile people', @@ -361,7 +361,7 @@ run_test('with_external_user', () => { return noop; }; - var can_edit_called = 0; + let can_edit_called = 0; settings_user_groups.can_edit = function () { can_edit_called += 1; return false; @@ -370,11 +370,11 @@ run_test('with_external_user', () => { // Reset zjquery to test stuff with user who cannot edit set_global('$', global.make_zjquery()); - var user_group_find_called = 0; - var user_group_stub = $('div.user-group[id="1"]'); - var name_field_stub = $.create('fake-name-field'); - var description_field_stub = $.create('fake-description-field'); - var input_stub = $.create('fake-input'); + let user_group_find_called = 0; + const user_group_stub = $('div.user-group[id="1"]'); + const name_field_stub = $.create('fake-name-field'); + const description_field_stub = $.create('fake-description-field'); + const input_stub = $.create('fake-input'); user_group_stub.find = function (elem) { if (elem === '.name') { user_group_find_called += 1; @@ -386,9 +386,9 @@ run_test('with_external_user', () => { } }; - var pill_container_stub = $('.pill-container[data-group-pills="1"]'); - var pill_stub = $.create('fake-pill'); - var pill_container_find_called = 0; + const pill_container_stub = $('.pill-container[data-group-pills="1"]'); + const pill_stub = $.create('fake-pill'); + let pill_container_find_called = 0; pill_container_stub.find = function (elem) { if (elem === '.input') { pill_container_find_called += 1; @@ -406,7 +406,7 @@ run_test('with_external_user', () => { }; // Test the 'off' handlers on the pill-container - var turned_off = {}; + const turned_off = {}; pill_container_stub.off = function (event_name, sel) { if (sel === undefined) { sel = 'whole'; @@ -414,9 +414,9 @@ run_test('with_external_user', () => { turned_off[event_name + '/' + sel] = true; }; - var pill_hover_called = false; - var callback; - var empty_fn; + let pill_hover_called = false; + let callback; + let empty_fn; pill_stub.hover = function (one, two) { callback = one; empty_fn = two; @@ -425,9 +425,9 @@ run_test('with_external_user', () => { 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); - var exit_button_called = false; + let exit_button_called = false; exit_button.css = function (property, value) { exit_button_called = true; assert.equal(property, 'opacity'); @@ -447,32 +447,32 @@ run_test('with_external_user', () => { settings_user_groups.set_up(); - var set_parents_result_called = 0; - var set_attributes_called = 0; + let set_parents_result_called = 0; + let set_attributes_called = 0; // Test different handlers with an external user - var delete_handler = $('#user-groups').get_on_handler('click', '.delete'); - var fake_delete = $.create('fk-#user-groups.delete_btn'); + const delete_handler = $('#user-groups').get_on_handler('click', '.delete'); + const fake_delete = $.create('fk-#user-groups.delete_btn'); fake_delete.set_parents_result('.user-group', $('.user-group')); set_parents_result_called += 1; $('.user-group').attr('id', '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, }; - var pill_click_called = false; - var pill_click_handler = pill_container_stub.get_on_handler('click'); + let pill_click_called = false; + const pill_click_handler = pill_container_stub.get_on_handler('click'); pill_click_called = true; assert(callback); @@ -501,7 +501,7 @@ run_test('with_external_user', () => { run_test('reload', () => { $('#user-groups').html('Some text'); - var populate_user_groups_called = false; + let populate_user_groups_called = false; settings_user_groups.populate_user_groups = function () { populate_user_groups_called = true; }; @@ -512,7 +512,7 @@ run_test('reload', () => { run_test('reset', () => { settings_user_groups.reset(); - var result = settings_user_groups.reload(); + const result = settings_user_groups.reload(); assert.equal(result, undefined); }); @@ -523,13 +523,13 @@ run_test('on_events', () => { }; (function test_admin_user_group_form_submit_triggered() { - var handler = $('.organization form.admin-user-group-form').get_on_handler("submit"); - var event = { + const handler = $('.organization form.admin-user-group-form').get_on_handler("submit"); + const event = { stopPropagation: noop, preventDefault: noop, }; - var fake_this = $.create('fake-form.admin-user-group-form'); - var fake_object_array = [{ + const fake_this = $.create('fake-form.admin-user-group-form'); + const fake_object_array = [{ name: 'fake-name', value: '', }, { @@ -540,7 +540,7 @@ run_test('on_events', () => { return fake_object_array; }; channel.post = function (opts) { - var data = { + const data = { members: '[null]', }; data[fake_object_array[1].name] = fake_object_array[1].value; @@ -564,14 +564,14 @@ run_test('on_events', () => { (function test_post_error() { $('#admin-user-group-status').show(); ui_report.error = function (error_msg, error_obj, ele) { - var xhr = { + const xhr = { responseText: '{"msg":"fake-msg"}', }; assert.equal(error_msg, 'translated: Failed'); assert.deepEqual(error_obj, xhr); assert.equal(ele, $('#admin-user-group-status')); }; - var xhr = { + const xhr = { responseText: '{"msg":"fake-msg", "attrib":"val"}', }; opts.error(xhr); @@ -584,16 +584,16 @@ run_test('on_events', () => { }()); (function test_user_groups_delete_click_triggered() { - var handler = $('#user-groups').get_on_handler("click", ".delete"); - var fake_this = $.create('fake-#user-groups.delete_btn'); + const handler = $('#user-groups').get_on_handler("click", ".delete"); + const fake_this = $.create('fake-#user-groups.delete_btn'); fake_this.set_parents_result('.user-group', $('.user-group')); $('.user-group').attr('id', '1'); channel.del = function (opts) { - var data = { + const data = { 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.deepEqual(opts.data, data); @@ -616,9 +616,9 @@ run_test('on_events', () => { }()); (function test_user_groups_keypress_enter_triggered() { - var handler = $('#user-groups').get_on_handler("keypress", ".user-group h4 > span"); - var default_action_for_enter_stopped = false; - var event = { + const handler = $('#user-groups').get_on_handler("keypress", ".user-group h4 > span"); + let default_action_for_enter_stopped = false; + const event = { which: 13, preventDefault: function () { default_action_for_enter_stopped = true; @@ -629,22 +629,22 @@ run_test('on_events', () => { }()); (function test_do_not_blur() { - var blur_event_classes = [".name", ".description", ".input"]; - var api_endpoint_called = false; + const blur_event_classes = [".name", ".description", ".input"]; + let api_endpoint_called = false; channel.post = function () { api_endpoint_called = true; }; channel.patch = noop; - var fake_this = $.create('fake-#user-groups_do_not_blur'); - var event = { + const fake_this = $.create('fake-#user-groups_do_not_blur'); + const event = { relatedTarget: fake_this, }; // Any of the blur_exceptions trigger blur event. _.each(blur_event_classes, function (class_name) { - var handler = $(user_group_selector).get_on_handler("blur", class_name); - var blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"], - class_name); + const handler = $(user_group_selector).get_on_handler("blur", class_name); + const blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"], + class_name); _.each(blur_exceptions, function (blur_exception) { api_endpoint_called = false; fake_this.closest = function (class_name) { @@ -668,7 +668,7 @@ run_test('on_events', () => { assert(!api_endpoint_called); // 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_called = true; }; @@ -687,14 +687,14 @@ run_test('on_events', () => { }()); (function test_update_cancel_button() { - var handler_name = $(user_group_selector).get_on_handler("input", ".name"); - var handler_desc = $(user_group_selector).get_on_handler("input", ".description"); - var sib_des = $(description_selector); - var sib_name = $(name_selector); + const handler_name = $(user_group_selector).get_on_handler("input", ".name"); + const handler_desc = $(user_group_selector).get_on_handler("input", ".description"); + const sib_des = $(description_selector); + const sib_name = $(name_selector); sib_name.text(i18n.t('mobile')); sib_des.text(i18n.t('All mobile members')); - var group_data = { + const group_data = { name: 'translated: mobile', description: 'translated: All mobile members', members: Dict.from_array([2, 31])}; @@ -702,8 +702,8 @@ run_test('on_events', () => { return group_data; }; - var cancel_fade_out_called = false; - var instructions_fade_out_called = false; + let cancel_fade_out_called = false; + let instructions_fade_out_called = false; $(cancel_selector).show(); $(cancel_selector).fadeOut = function () { 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. - var fake_this = $.create('fake-#update_cancel_button'); + const fake_this = $.create('fake-#update_cancel_button'); handler_name.call(fake_this); assert(cancel_fade_out_called); assert(instructions_fade_out_called); @@ -735,21 +735,21 @@ run_test('on_events', () => { }()); (function test_user_groups_save_group_changes_triggered() { - var handler_name = $(user_group_selector).get_on_handler("blur", ".name"); - var handler_desc = $(user_group_selector).get_on_handler("blur", ".description"); - var sib_des = $(description_selector); - var sib_name = $(name_selector); + const handler_name = $(user_group_selector).get_on_handler("blur", ".name"); + const handler_desc = $(user_group_selector).get_on_handler("blur", ".description"); + const sib_des = $(description_selector); + const sib_name = $(name_selector); sib_name.text(i18n.t('mobile')); 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 () { return group_data; }; - var api_endpoint_called = false; - var cancel_fade_out_called = false; - var saved_fade_to_called = false; - var instructions_fade_out_called = false; + let api_endpoint_called = false; + let cancel_fade_out_called = false; + let saved_fade_to_called = false; + let instructions_fade_out_called = false; $(instructions_selector).fadeOut = function () { instructions_fade_out_called = true; }; @@ -785,17 +785,17 @@ run_test('on_events', () => { assert(saved_fade_to_called); }()); (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(); ui_report.error = function (error_msg, error_obj, ele) { - var xhr = { + const xhr = { responseText: '{"msg":"fake-msg"}', }; assert.equal(error_msg, 'translated: Failed'); assert.deepEqual(error_obj, xhr); assert.equal(ele, user_group_error); }; - var xhr = { + const xhr = { responseText: '{"msg":"fake-msg", "attrib":"val"}', }; 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 () { return []; }; fake_this.set_parents_result(user_group_selector, $(user_group_selector)); - var event = { + const event = { relatedTarget: fake_this, }; @@ -831,8 +831,8 @@ run_test('on_events', () => { }()); (function test_user_groups_save_member_changes_triggered() { - var handler = $(user_group_selector).get_on_handler("blur", ".input"); - var realm_user_group = { + const handler = $(user_group_selector).get_on_handler("blur", ".input"); + const realm_user_group = { id: 1, name: 'Mobile', description: 'All mobile people', @@ -844,9 +844,9 @@ run_test('on_events', () => { return realm_user_group; }; - var cancel_fade_out_called = false; - var saved_fade_to_called = false; - var instructions_fade_out_called = false; + let cancel_fade_out_called = false; + let saved_fade_to_called = false; + let instructions_fade_out_called = false; $(instructions_selector).fadeOut = function () { instructions_fade_out_called = true; }; @@ -861,7 +861,7 @@ run_test('on_events', () => { return $(saved_selector); }; - var api_endpoint_called = false; + let api_endpoint_called = false; channel.post = function (opts) { assert.equal(opts.url, "/json/user_groups/1/members"); 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.closest = function () { return []; }; - var event = { + const event = { relatedTarget: fake_this, }; diff --git a/frontend_tests/node_tests/templates.js b/frontend_tests/node_tests/templates.js index f31c726cab..ed66880f76 100644 --- a/frontend_tests/node_tests/templates.js +++ b/frontend_tests/node_tests/templates.js @@ -1590,7 +1590,7 @@ run_test('user_presence_rows', () => { }); run_test('buddy_list_tooltip_content', () => { - var args = { + const args = { status_text: 'out to lunch', last_seen: 'Active now', is_away: false, @@ -1598,8 +1598,8 @@ run_test('buddy_list_tooltip_content', () => { online_now: true, }; - var html = render('buddy_list_tooltip_content', args); - var tooltip_content = $(html).find(".tooltip_inner_content"); + const html = render('buddy_list_tooltip_content', args); + const tooltip_content = $(html).find(".tooltip_inner_content"); assert.equal(tooltip_content.text().trim(), 'Iagoout to lunchActive now'); }); diff --git a/static/js/buddy_data.js b/static/js/buddy_data.js index 5b6f11f81c..4df9e633c1 100644 --- a/static/js/buddy_data.js +++ b/static/js/buddy_data.js @@ -9,7 +9,7 @@ exports.max_size_before_shrinking = 600; -var fade_config = { +const fade_config = { get_user_id: function (item) { return item.user_id; }, @@ -22,7 +22,7 @@ var fade_config = { }; exports.get_user_circle_class = function (user_id) { - var status = exports.buddy_status(user_id); + const status = exports.buddy_status(user_id); switch (status) { case 'active': @@ -38,7 +38,7 @@ exports.get_user_circle_class = 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) { case 'active': @@ -59,7 +59,7 @@ exports.level = function (user_id) { return 0; } - var status = exports.buddy_status(user_id); + const status = exports.buddy_status(user_id); switch (status) { case 'active': @@ -87,19 +87,19 @@ exports.buddy_status = function (user_id) { }; exports.compare_function = function (a, b) { - var level_a = exports.level(a); - var level_b = exports.level(b); - var diff = level_a - level_b; + const level_a = exports.level(a); + const level_b = exports.level(b); + const diff = level_a - level_b; if (diff !== 0) { return diff; } // Sort equivalent PM names alphabetically - var person_a = people.get_person_from_user_id(a); - var person_b = people.get_person_from_user_id(b); + const person_a = people.get_person_from_user_id(a); + const person_b = people.get_person_from_user_id(b); - var full_name_a = person_a ? person_a.full_name : ''; - var full_name_b = person_b ? person_b.full_name : ''; + const full_name_a = person_a ? person_a.full_name : ''; + const full_name_b = person_b ? person_b.full_name : ''; 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); - var search_terms = filter_text.toLowerCase().split(/[|,]+/); + let search_terms = filter_text.toLowerCase().split(/[|,]+/); search_terms = _.map(search_terms, function (s) { 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); }); - 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(); } @@ -156,7 +156,7 @@ exports.my_user_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") { 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). // // 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) { 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) { - var user_circle_class = exports.get_user_circle_class(user_id); - var person = people.get_person_from_user_id(user_id); - var my_user_status = exports.my_user_status(user_id); - var user_circle_status = exports.status_description(user_id); + const user_circle_class = exports.get_user_circle_class(user_id); + const person = people.get_person_from_user_id(user_id); + const my_user_status = exports.my_user_status(user_id); + const user_circle_status = exports.status_description(user_id); return { 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. - var user_id = user_ids_string; - var person = people.get_person_from_user_id(user_id); - var bot_owner_exists = false; + const user_id = user_ids_string; + const person = people.get_person_from_user_id(user_id); + let bot_owner_exists = false; if (person.is_bot) { 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 // a single, human, user. - var active_status = presence.get_status(user_id); - var last_seen = exports.user_last_seen_time_status(user_id); - var online_now = active_status === 'active'; + const active_status = presence.get_status(user_id); + const last_seen = exports.user_last_seen_time_status(user_id); + const online_now = active_status === 'active'; return { is_group: '', @@ -247,7 +247,7 @@ exports.get_title_data = function (user_ids_string, is_group) { }; 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); return info; }; @@ -278,7 +278,7 @@ function maybe_shrink_list(user_ids, filter_text) { } exports.get_filtered_and_sorted_user_ids = function (filter_text) { - var user_ids; + let user_ids; if (filter_text) { // 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) { - var person = people.get_person_from_user_id(user_id); + const person = people.get_person_from_user_id(user_id); if (person) { // 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) { - 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` // function. return typeof person !== "undefined"; @@ -322,9 +322,9 @@ exports.get_items_for_users = function (user_ids) { }; 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) { if (presence.is_active(user_id)) { num_present += 1; diff --git a/static/js/click_handlers.js b/static/js/click_handlers.js index d7317531f0..afd4d5fcea 100644 --- a/static/js/click_handlers.js +++ b/static/js/click_handlers.js @@ -1,15 +1,15 @@ // 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'); -var render_buddy_list_tooltip_content = require('../templates/buddy_list_tooltip_content.hbs'); +const render_buddy_list_tooltip = require('../templates/buddy_list_tooltip.hbs'); +const render_buddy_list_tooltip_content = require('../templates/buddy_list_tooltip_content.hbs'); exports.initialize = function () { // MOUSE MOVING VS DRAGGING FOR SELECTION DATA TRACKING - var drag = (function () { - var start; - var time; + const drag = (function () { + let start; + let time; return { start: function (e) { @@ -18,9 +18,9 @@ exports.initialize = function () { }, 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) { // 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)); @@ -60,8 +60,8 @@ exports.initialize = function () { } function initialize_long_tap() { - var MS_DELAY = 750; - var meta = { + const MS_DELAY = 750; + const meta = { touchdown: false, current_target: undefined, }; @@ -69,7 +69,7 @@ exports.initialize = function () { $("#main_div").on("touchstart", ".messagebox", function () { meta.touchdown = true; meta.invalid = false; - var id = rows.id($(this).closest(".message_row")); + const id = rows.id($(this).closest(".message_row")); meta.current_target = id; if (!id) { return; @@ -111,7 +111,7 @@ exports.initialize = function () { initialize_long_tap(); } - var select_message_function = function (e) { + const select_message_function = function (e) { if (is_clickable_message_element($(e.target))) { // If this click came from a hyperlink, don't trigger the // 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 // API instead. if (drag.val < 5 && drag.time < 150 || drag.val < 2) { - var row = $(this).closest(".message_row"); - var id = rows.id(row); + const row = $(this).closest(".message_row"); + const id = rows.id(row); if (message_edit.is_editing(id)) { // Clicks on a message being edited shouldn't trigger a reply. @@ -162,7 +162,7 @@ exports.initialize = function () { } else { $("#main_div").on("longtap", ".messagebox", function (e) { // 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. // after a longtap that is valid, there should be no text selected. if (sel) { @@ -181,15 +181,15 @@ exports.initialize = function () { e.stopPropagation(); popovers.hide_all(); - var message_id = rows.id($(this).closest(".message_row")); - var message = message_store.get(message_id); + const message_id = rows.id($(this).closest(".message_row")); + const message = message_store.get(message_id); message_flags.toggle_starred_and_update_server(message); }); $("#main_div").on("click", ".message_reaction", function (e) { e.stopPropagation(); - var local_id = $(this).attr('data-reaction-id'); - var message_id = rows.get_message_id(this); + const local_id = $(this).attr('data-reaction-id'); + const message_id = rows.get_message_id(this); reactions.process_reaction_click(message_id, local_id); $(".tooltip").remove(); }); @@ -208,10 +208,10 @@ exports.initialize = function () { $('body').on('click', '.message_edit_notice', function (e) { popovers.hide_all(); - var message_id = rows.id($(e.currentTarget).closest(".message_row")); - var row = current_msg_list.get_row(message_id); - var message = current_msg_list.get(rows.id(row)); - var message_history_cancel_btn = $('#message-history-cancel'); + const message_id = rows.id($(e.currentTarget).closest(".message_row")); + const row = current_msg_list.get_row(message_id); + const message = current_msg_list.get(rows.id(row)); + const message_history_cancel_btn = $('#message-history-cancel'); if (page_params.realm_allow_edit_history) { message_edit.show_history(message); @@ -225,10 +225,10 @@ exports.initialize = function () { $('#main_div').on('mouseenter', '.message_reaction', function (e) { e.stopPropagation(); - var elem = $(e.currentTarget); - var local_id = elem.attr('data-reaction-id'); - var message_id = rows.get_message_id(e.currentTarget); - var title = reactions.get_reaction_title_data(message_id, local_id); + const elem = $(e.currentTarget); + const local_id = elem.attr('data-reaction-id'); + const message_id = rows.get_message_id(e.currentTarget); + const title = reactions.get_reaction_title_data(message_id, local_id); elem.tooltip({ title: title, @@ -258,7 +258,7 @@ exports.initialize = function () { e.preventDefault(); // Note that we may have an href here, but we trust the stream id more, // 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) { hashchange.go_to_location(hash_util.by_stream_uri(stream_id)); return; @@ -270,7 +270,7 @@ exports.initialize = function () { $(".user-status-value").on("click", function (e) { 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); user_status_ui.toggle_clear_message_button(); user_status_ui.update_button(); @@ -279,7 +279,7 @@ exports.initialize = function () { // NOTIFICATION CLICK $('body').on('click', '.notification', function () { - var payload = $(this).data("narrow"); + const payload = $(this).data("narrow"); ui_util.change_tab_to('#home'); narrow.activate(payload.raw_operators, payload.opts_notif); }); @@ -287,51 +287,51 @@ exports.initialize = function () { // MESSAGE EDITING $('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)); message_edit.start(row); e.stopPropagation(); popovers.hide_all(); }); $('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); e.stopPropagation(); popovers.hide_all(); }); $("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.save(recipient_row, true); e.stopPropagation(); popovers.hide_all(); }); $("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); e.stopPropagation(); popovers.hide_all(); }); $("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); e.stopPropagation(); popovers.hide_all(); }); $("body").on("click", ".message_edit_cancel", function (e) { - var row = $(this).closest(".message_row"); + const row = $(this).closest(".message_row"); message_edit.end(row); e.stopPropagation(); popovers.hide_all(); }); $("body").on("click", ".message_edit_close", function (e) { - var row = $(this).closest(".message_row"); + const row = $(this).closest(".message_row"); message_edit.end(row); e.stopPropagation(); popovers.hide_all(); }); $("body").on("click", ".copy_message", function (e) { - var row = $(this).closest(".message_row"); + const row = $(this).closest(".message_row"); message_edit.end(row); row.find(".alert-msg").text(i18n.t("Copied!")); row.find(".alert-msg").css("display", "block"); @@ -345,26 +345,26 @@ exports.initialize = function () { } }); $('#message_edit_form .send-status-close').click(function () { - var row_id = rows.id($(this).closest(".message_row")); - var send_status = $('#message-edit-send-status-' + row_id); + const row_id = rows.id($(this).closest(".message_row")); + const send_status = $('#message-edit-send-status-' + row_id); $(send_status).stop(true).fadeOut(200); }); $("body").on("click", "#message_edit_form [id^='attach_files_']", function (e) { 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"); }); $("body").on("click", "#message_edit_form [id^='markdown_preview_']", function (e) { e.preventDefault(); - var row_id = rows.id($(this).closest(".message_row")); + const row_id = rows.id($(this).closest(".message_row")); function $_(selector) { return $(selector + "_" + row_id); } - var content = $_("#message_edit_content").val(); + const content = $_("#message_edit_content").val(); $_("#message_edit_content").hide(); $_("#markdown_preview").hide(); $_("#undo_markdown_preview").show(); @@ -376,7 +376,7 @@ exports.initialize = function () { $("body").on("click", "#message_edit_form [id^='undo_markdown_preview_']", function (e) { e.preventDefault(); - var row_id = rows.id($(this).closest(".message_row")); + const row_id = rows.id($(this).closest(".message_row")); function $_(selector) { return $(selector + "_" + row_id); } @@ -392,19 +392,19 @@ exports.initialize = function () { $('body').on('click', '.on_hover_topic_mute', function (e) { e.stopPropagation(); - var stream_id = $(e.currentTarget).attr('data-stream-id'); - var topic = $(e.currentTarget).attr('data-topic-name'); + const stream_id = $(e.currentTarget).attr('data-stream-id'); + const topic = $(e.currentTarget).attr('data-topic-name'); muting_ui.mute(stream_id, topic); }); // RECIPIENT BARS function get_row_id_for_narrowing(narrow_link_elem) { - var group = rows.get_closest_group(narrow_link_elem); - var msg_id = rows.id_for_recipient_row(group); + const group = rows.get_closest_group(narrow_link_elem); + const msg_id = rows.id_for_recipient_row(group); - var nearest = current_msg_list.get(msg_id); - var selected = current_msg_list.selected_message(); + const nearest = current_msg_list.get(msg_id); + const selected = current_msg_list.selected_message(); if (util.same_recipient(nearest, selected)) { return selected.id; } @@ -416,7 +416,7 @@ exports.initialize = function () { return; } 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'}); }); @@ -425,7 +425,7 @@ exports.initialize = function () { return; } 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'}); }); @@ -435,7 +435,7 @@ exports.initialize = function () { e.preventDefault(); e.stopPropagation(); - var sidebarHidden = !$(".app-main .column-right").hasClass("expanded"); + const sidebarHidden = !$(".app-main .column-right").hasClass("expanded"); popovers.hide_all(); if (sidebarHidden) { popovers.show_userlist_sidebar(); @@ -446,7 +446,7 @@ exports.initialize = function () { e.preventDefault(); e.stopPropagation(); - var sidebarHidden = !$(".app-main .column-left").hasClass("expanded"); + const sidebarHidden = !$(".app-main .column-left").hasClass("expanded"); popovers.hide_all(); if (sidebarHidden) { stream_popover.show_streamlist_sidebar(); @@ -454,7 +454,7 @@ exports.initialize = function () { }); $('#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}); @@ -465,8 +465,8 @@ exports.initialize = function () { }); $('#group-pms').expectOne().on('click', '.selectable_sidebar_block', function (e) { - var user_ids_string = $(e.target).parents('li').attr('data-user-ids'); - var emails = people.user_ids_string_to_emails_string(user_ids_string); + const user_ids_string = $(e.target).parents('li').attr('data-user-ids'); + const emails = people.user_ids_string_to_emails_string(user_ids_string); narrow.by('pm-with', emails, {trigger: 'sidebar'}); e.preventDefault(); e.stopPropagation(); @@ -498,15 +498,15 @@ exports.initialize = function () { // BUDDY LIST TOOLTIPS $('#user_presences').on('mouseenter', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) { e.stopPropagation(); - var elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link"); - var user_id = elem.attr('data-user-id'); - var title_data = buddy_data.get_title_data(user_id, false); + const elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link"); + const user_id = elem.attr('data-user-id'); + const title_data = buddy_data.get_title_data(user_id, false); 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) { 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'); }); @@ -514,12 +514,12 @@ exports.initialize = function () { $("body").on('mouseenter', '#pm_user_status, #group_pms_right_sidebar', function (e) { $(".tooltip").remove(); e.stopPropagation(); - var elem = $(e.currentTarget); - var user_ids_string = elem.attr('data-user-ids-string'); + const elem = $(e.currentTarget); + const user_ids_string = elem.attr('data-user-ids-string'); // 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); }); @@ -553,7 +553,7 @@ exports.initialize = function () { // MISC (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 () { this.blur(); @@ -575,7 +575,7 @@ exports.initialize = function () { // this will hide the alerts that you click "x" on. $("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"); setTimeout(function () { $alert.removeClass("fade-out show"); @@ -634,7 +634,7 @@ exports.initialize = 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); }); @@ -704,7 +704,7 @@ exports.initialize = function () { $('body').on('click', '.webathena_login', function (e) { $("#zephyr-mirror-error").removeClass("show"); - var principal = ["zephyr", "zephyr"]; + const principal = ["zephyr", "zephyr"]; WinChan.open({ url: "https://webathena.mit.edu/#!request_ticket_v1", relay_url: "https://webathena.mit.edu/relay.html", @@ -745,7 +745,7 @@ exports.initialize = function () { }); (function () { - var map = { + const map = { ".stream-description-editable": { on_start: stream_edit.set_raw_description, on_save: stream_edit.change_stream_description, @@ -777,7 +777,7 @@ exports.initialize = function () { // if there are any child nodes, inclusive of
which means you // have lines in your description or title, you're doing something // 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) { this.innerText = this.innerText.replace(/\n/, ""); break; @@ -786,8 +786,8 @@ exports.initialize = function () { }); $("body").on("click", "[data-make-editable]", function () { - var selector = $(this).attr("data-make-editable"); - var edit_area = $(this).parent().find(selector); + const selector = $(this).attr("data-make-editable"); + const edit_area = $(this).parent().find(selector); if (edit_area.attr("contenteditable") === "true") { $("[data-finish-editing='" + selector + "']").hide(); edit_area.attr("contenteditable", false); @@ -810,7 +810,7 @@ exports.initialize = function () { }); $("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) { map[selector].on_save(e); $(this).hide(); @@ -829,11 +829,11 @@ exports.initialize = function () { hotspots.close_hotspot_icon(this); // show popover - var hotspot_name = $(e.target).closest('.hotspot-icon') + const hotspot_name = $(e.target).closest('.hotspot-icon') .attr('id') .replace('hotspot_', '') .replace('_icon', ''); - var overlay_name = 'hotspot_' + hotspot_name + '_overlay'; + const overlay_name = 'hotspot_' + hotspot_name + '_overlay'; overlays.open_overlay({ name: overlay_name, @@ -856,9 +856,9 @@ exports.initialize = function () { e.preventDefault(); 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('_overlay', ''); diff --git a/static/js/copy_and_paste.js b/static/js/copy_and_paste.js index 854f0dad00..ed1ea90431 100644 --- a/static/js/copy_and_paste.js +++ b/static/js/copy_and_paste.js @@ -1,9 +1,9 @@ const TurndownService = require("turndown/lib/turndown.cjs.js"); function find_boundary_tr(initial_tr, iterate_row) { - var j; - var skip_same_td_check = false; - var tr = initial_tr; + let j; + let skip_same_td_check = false; + let tr = initial_tr; // If the selection boundary is somewhere that does not have a // 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) { - var message_header_content = rows.get_message_recipient_header(message_row) + const message_header_content = rows.get_message_recipient_header(message_row) .text() .replace(/\s+/g, " ") .replace(/^\s/, "").replace(/\s$/, ""); @@ -57,14 +57,14 @@ how modern browsers deal with copy/paste. Just test your changes carefully. */ function construct_copy_div(div, start_id, end_id) { - var start_row = current_msg_list.get_row(start_id); - var start_recipient_row = rows.get_message_recipient_row(start_row); - var start_recipient_row_id = rows.id_for_recipient_row(start_recipient_row); - var should_include_start_recipient_header = false; + const start_row = current_msg_list.get_row(start_id); + const start_recipient_row = rows.get_message_recipient_row(start_row); + const start_recipient_row_id = rows.id_for_recipient_row(start_recipient_row); + let should_include_start_recipient_header = false; - var last_recipient_row_id = start_recipient_row_id; - for (var 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)); + let last_recipient_row_id = start_recipient_row_id; + for (let row = start_row; rows.id(row) <= end_id; row = rows.next_visible(row)) { + const recipient_row_id = rows.id_for_recipient_row(rows.get_message_recipient_row(row)); // if we found a message from another recipient, // it means that we have messages from several recipients, // 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; should_include_start_recipient_header = true; } - var message = current_msg_list.get(rows.id(row)); - var message_firstp = $(message.content).slice(0, 1); + const message = current_msg_list.get(rows.id(row)); + const message_firstp = $(message.content).slice(0, 1); message_firstp.prepend(message.sender_full_name + ": "); div.append(message_firstp); 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 // were partially covered by the selection. - var selection = window.getSelection(); - var analysis = exports.analyze_selection(selection); - var ranges = analysis.ranges; - var start_id = analysis.start_id; - var end_id = analysis.end_id; - var skip_same_td_check = analysis.skip_same_td_check; - var div = $('
'); + const selection = window.getSelection(); + const analysis = exports.analyze_selection(selection); + const ranges = analysis.ranges; + const start_id = analysis.start_id; + const end_id = analysis.end_id; + const skip_same_td_check = analysis.skip_same_td_check; + const div = $('
'); if (start_id === undefined || end_id === undefined) { // 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 // full content. - var i; - var range; - var ranges = []; - var startc; - var endc; - var initial_end_tr; - var start_id; - var end_id; - var start_data; - var end_data; + let i; + let range; + const ranges = []; + let startc; + let endc; + let initial_end_tr; + let start_id; + let end_id; + let start_data; + let end_data; // skip_same_td_check is true whenever we know for a fact that the // selection covers multiple messages (and thus we should no // 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) { range = selection.getRangeAt(i); @@ -297,7 +297,7 @@ exports.paste_handler_converter = function (paste_html) { }; exports.paste_handler = function (event) { - var clipboardData = event.originalEvent.clipboardData; + const clipboardData = event.originalEvent.clipboardData; if (!clipboardData) { // On IE11, ClipboardData isn't defined. One can instead // access it with `window.clipboardData`, but even that @@ -308,10 +308,10 @@ exports.paste_handler = function (event) { } if (clipboardData.getData) { - var paste_html = clipboardData.getData('text/html'); + const paste_html = clipboardData.getData('text/html'); if (paste_html && page_params.development_environment) { - var text = exports.paste_handler_converter(paste_html); - var mdImageRegex = /^!\[.*\]\(.*\)$/; + const text = exports.paste_handler_converter(paste_html); + const mdImageRegex = /^!\[.*\]\(.*\)$/; if (text.match(mdImageRegex)) { // This block catches cases where we are pasting an // image into Zulip, which should be handled by the diff --git a/static/js/hash_util.js b/static/js/hash_util.js index f9394d0469..b75ec05e22 100644 --- a/static/js/hash_util.js +++ b/static/js/hash_util.js @@ -10,7 +10,7 @@ exports.get_hash_section = function (hash) { return ''; } - var parts = hash.replace(/\/$/, "").split(/\//); + const parts = hash.replace(/\/$/, "").split(/\//); return parts[1] || ''; }; @@ -26,7 +26,7 @@ exports.encodeHashComponent = function (str) { exports.encode_operand = function (operator, operand) { 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) { return slug; } @@ -42,7 +42,7 @@ exports.encode_operand = function (operator, operand) { exports.encode_stream_id = function (stream_id) { // stream_data appends the stream name, but it does not do the // 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); }; @@ -61,7 +61,7 @@ exports.decodeHashComponent = function (str) { exports.decode_operand = function (operator, operand) { 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) { return emails; } @@ -89,16 +89,16 @@ exports.by_stream_topic_uri = function (stream_id, topic) { // corresponding hash: the # component // of the narrow URL exports.operators_to_hash = function (operators) { - var hash = '#'; + let hash = '#'; if (operators !== undefined) { hash = '#narrow'; _.each(operators, function (elem) { // Support legacy tuples. - var operator = elem.operator; - var operand = elem.operand; + const operator = elem.operator; + const operand = elem.operand; - var sign = elem.negated ? '-' : ''; + const sign = elem.negated ? '-' : ''; hash += '/' + sign + exports.encodeHashComponent(operator) + '/' + 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) { - var absolute_url = window.location.protocol + "//" + + const absolute_url = window.location.protocol + "//" + window.location.host + "/" + window.location.pathname.split('/')[1]; - var suffix = "/near/" + exports.encodeHashComponent(message.id); + const suffix = "/near/" + exports.encodeHashComponent(message.id); if (message.type === "stream") { return absolute_url + @@ -144,30 +144,30 @@ exports.by_conversation_and_time_uri = function (message) { }; 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; }; exports.parse_narrow = function (hash) { - var i; - var operators = []; + let i; + const operators = []; for (i = 1; i < hash.length; i += 2) { // We don't construct URLs with an odd number of components, // 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. if (operator === '') { break; } - var raw_operand = hash[i + 1]; + const raw_operand = hash[i + 1]; if (!raw_operand) { return; } - var operand = exports.decode_operand(operator, raw_operand); - var negated = false; + const operand = exports.decode_operand(operator, raw_operand); + let negated = false; if (operator[0] === '-') { negated = true; operator = operator.slice(1); diff --git a/static/js/message_list_view.js b/static/js/message_list_view.js index b222eca92e..cbd4e16e94 100644 --- a/static/js/message_list_view.js +++ b/static/js/message_list_view.js @@ -1,7 +1,7 @@ -var render_bookend = require('../templates/bookend.hbs'); -var render_message_group = require('../templates/message_group.hbs'); -var render_recipient_row = require('../templates/recipient_row.hbs'); -var render_single_message = require('../templates/single_message.hbs'); +const render_bookend = require('../templates/bookend.hbs'); +const render_message_group = require('../templates/message_group.hbs'); +const render_recipient_row = require('../templates/recipient_row.hbs'); +const render_single_message = require('../templates/single_message.hbs'); function MessageListView(list, table_name, collapse_messages) { this.list = list; @@ -20,10 +20,10 @@ function MessageListView(list, table_name, collapse_messages) { } 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 // over to using data-user-id. - var email = $(elem).attr('data-user-email'); + const email = $(elem).attr('data-user-email'); if (user_id === "*" || email === "*") { return "*"; @@ -35,7 +35,7 @@ function get_user_id_for_mention_button(elem) { if (email) { // Will return undefined if there's no match - var user = people.get_by_email(email); + const user = people.get_by_email(email); if (user) { 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) { - var user_group_id = $(elem).attr('data-user-group-id'); + const user_group_id = $(elem).attr('data-user-group-id'); if (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) { return false; } - var earlier_time = new XDate(earlier_msg.msg.timestamp * 1000); - var later_time = new XDate(later_msg.msg.timestamp * 1000); + const earlier_time = new XDate(earlier_msg.msg.timestamp * 1000); + const later_time = new XDate(later_msg.msg.timestamp * 1000); return earlier_time.toDateString() === later_time.toDateString(); } @@ -79,19 +79,19 @@ function same_recipient(a, b) { } function render_group_display_date(group, message_container) { - var time = new XDate(message_container.msg.timestamp * 1000); - var today = new XDate(); - var date_element = timerender.render_date(time, undefined, today)[0]; + const time = new XDate(message_container.msg.timestamp * 1000); + const today = new XDate(); + const date_element = timerender.render_date(time, undefined, today)[0]; group.date = date_element.outerHTML; } function update_group_date_divider(group, message_container, prev) { - var time = new XDate(message_container.msg.timestamp * 1000); - var today = new XDate(); + const time = new XDate(message_container.msg.timestamp * 1000); + const today = new XDate(); 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()) { // NB: group_date_divider_html is HTML, inserted into the document without escaping. 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) { - var prev_msg_container = opts.prev_msg_container; - var curr_msg_container = opts.curr_msg_container; + const prev_msg_container = opts.prev_msg_container; + const curr_msg_container = opts.curr_msg_container; if (!prev_msg_container || same_day(curr_msg_container, prev_msg_container)) { clear_message_date_divider(curr_msg_container); return; } - var prev_time = new XDate(prev_msg_container.msg.timestamp * 1000); - var curr_time = new XDate(curr_msg_container.msg.timestamp * 1000); - var today = new XDate(); + const prev_time = new XDate(prev_msg_container.msg.timestamp * 1000); + const curr_time = new XDate(curr_msg_container.msg.timestamp * 1000); + const today = new XDate(); curr_msg_container.want_date_divider = true; curr_msg_container.date_divider_html = @@ -136,7 +136,7 @@ function update_message_date_divider(opts) { } 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); } @@ -166,7 +166,7 @@ function populate_group_from_message_container(group, message_container) { group.match_topic = util.get_match_topic(message_container.msg); group.stream_url = message_container.stream_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) { // Hack to handle unusual cases like the tutorial where // the streams used don't actually exist in the subs @@ -196,8 +196,8 @@ MessageListView.prototype = { _get_msg_timestring: function (message_container) { if (message_container.msg.last_edit_timestamp !== undefined) { - var last_edit_time = new XDate(message_container.msg.last_edit_timestamp * 1000); - var today = new XDate(); + const last_edit_time = new XDate(message_container.msg.last_edit_timestamp * 1000); + const today = new XDate(); return timerender.render_date(last_edit_time, undefined, today)[0].textContent + " at " + timerender.stringify_time(last_edit_time); } @@ -211,9 +211,9 @@ MessageListView.prototype = { // * `edited_in_left_col` -- when label appears in left column. // * `edited_alongside_sender` -- when label appears alongside sender info. // * `edited_status_msg` -- when label appears for a "/me" message. - var last_edit_timestr = this._get_msg_timestring(message_container); - var include_sender = message_container.include_sender; - var status_message = Boolean(message_container.status_message); + const last_edit_timestr = this._get_msg_timestring(message_container); + const include_sender = message_container.include_sender; + const status_message = Boolean(message_container.status_message); if (last_edit_timestr !== undefined) { message_container.last_edit_timestr = last_edit_timestr; message_container.edited_in_left_col = !include_sender; @@ -227,9 +227,9 @@ MessageListView.prototype = { return; } - var last_subscribed = !last_msg_container.msg.historical; - var first_subscribed = !first_msg_container.msg.historical; - var stream = first_msg_container.msg.stream; + const last_subscribed = !last_msg_container.msg.historical; + const first_subscribed = !first_msg_container.msg.historical; + const stream = first_msg_container.msg.stream; if (!last_subscribed && first_subscribed) { group.bookend_top = true; @@ -254,10 +254,10 @@ MessageListView.prototype = { }; } - var self = this; - var current_group = start_group(); - var new_message_groups = []; - var prev; + const self = this; + let current_group = start_group(); + const new_message_groups = []; + let prev; function add_message_container_to_group(message_container) { if (same_sender(prev, message_container)) { @@ -278,7 +278,7 @@ MessageListView.prototype = { } _.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.include_recipient = false; message_container.include_footer = false; @@ -364,8 +364,8 @@ MessageListView.prototype = { if (first_group === undefined || second_group === undefined) { return false; } - var last_msg_container = _.last(first_group.message_containers); - var first_msg_container = _.first(second_group.message_containers); + const last_msg_container = _.last(first_group.message_containers); + const first_msg_container = _.first(second_group.message_containers); // Join two groups into one. 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 // rerender_messages are messages which should be updated in place in the DOM - var message_actions = { + const message_actions = { append_groups: [], prepend_groups: [], rerender_groups: [], append_messages: [], rerender_messages_next_same_sender: [], }; - var first_group; - var second_group; - var curr_msg_container; - var prev_msg_container; + let first_group; + let second_group; + let curr_msg_container; + let prev_msg_container; if (where === 'top') { first_group = _.last(new_message_groups); @@ -431,7 +431,7 @@ MessageListView.prototype = { 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) { update_message_date_divider({ prev_msg_container: prev_msg_container, @@ -501,9 +501,9 @@ MessageListView.prototype = { blueslip.error('programming error--pass in jQuery objects'); } - var self = this; + const self = this; _.each($message_rows, function (dom_row) { - var row = $(dom_row); + const row = $(dom_row); self._put_row(row); self._post_process_single_row(row); }); @@ -521,7 +521,7 @@ MessageListView.prototype = { 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 if (rtl.get_direction(content.text()) === 'rtl') { @@ -529,7 +529,7 @@ MessageListView.prototype = { } 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 // that refer to the current user. 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, // assuming that you're not searching for text // 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) { // Note that person might be undefined in some // unpleasant corner cases involving data import. @@ -551,8 +551,8 @@ MessageListView.prototype = { }); content.find('.user-group-mention').each(function () { - var 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_id = get_user_group_id_for_mention_button(this); + const user_group = user_groups.get_user_group_from_id(user_group_id, true); if (user_group === undefined) { // This is a user group the current user doesn't have // data on. This can happen when user groups are @@ -561,7 +561,7 @@ MessageListView.prototype = { 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. if (user_groups.is_member_of(user_group_id, my_user_id)) { $(this).addClass('user-mention-me'); @@ -575,7 +575,7 @@ MessageListView.prototype = { }); 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) { // Display the current name for stream if it is not // being displayed in search highlight. @@ -584,12 +584,12 @@ MessageListView.prototype = { }); 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) { // Display the current name for stream if it is not // being displayed in search highlight. - var text = $(this).text(); - var topic = text.split('>', 2)[1]; + const text = $(this).text(); + const topic = text.split('>', 2)[1]; $(this).text("#" + stream_data.maybe_get_stream_name(stream_id) + ' > ' + topic); } }); @@ -598,12 +598,12 @@ MessageListView.prototype = { // page_params.emojiset is 'text'. if (page_params.emojiset === 'text') { content.find(".emoji").replaceWith(function () { - var text = $(this).attr("title"); + const text = $(this).attr("title"); return ":" + text + ":"; }); } - var id = rows.id(row); + const id = rows.id(row); message_edit.maybe_show_edit(row, id); submessage.process_submessages({ @@ -613,18 +613,18 @@ MessageListView.prototype = { }, _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; - var msg_to_render = _.extend(message_container, { + const msg_to_render = _.extend(message_container, { table_name: this.table_name, }); return render_single_message(msg_to_render); }, _render_group: function (opts) { - var message_groups = opts.message_groups; - var use_match_properties = opts.use_match_properties; - var table_name = opts.table_name; + const message_groups = opts.message_groups; + const use_match_properties = opts.use_match_properties; + const table_name = opts.table_name; return $(render_message_group({ message_groups: message_groups, @@ -639,22 +639,22 @@ MessageListView.prototype = { // Store this in a separate variable so it doesn't get // confusingly masked in upcoming loops. - var self = this; + const self = this; if (messages.length === 0 || self.table_name === undefined) { return; } - var list = self.list; // for convenience - var table_name = self.table_name; - var table = rows.get_table(table_name); - var orig_scrolltop_offset; + const list = self.list; // for convenience + const table_name = self.table_name; + const table = rows.get_table(table_name); + let orig_scrolltop_offset; // If we start with the message feed scrolled up (i.e. // the bottom message is not visible), then we will respect // the user's current position after rendering, rather // 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 // all messages lists. To prevent having both list views overwriting @@ -690,13 +690,13 @@ MessageListView.prototype = { return; } - var new_message_groups = self.build_message_groups(message_containers, self.table_name); - var message_actions = self.merge_message_groups(new_message_groups, where); - var new_dom_elements = []; - var rendered_groups; - var dom_messages; - var last_message_row; - var last_group_row; + const new_message_groups = self.build_message_groups(message_containers, self.table_name); + const message_actions = self.merge_message_groups(new_message_groups, where); + let new_dom_elements = []; + let rendered_groups; + let dom_messages; + let last_message_row; + let last_group_row; _.each(message_containers, function (message_container) { self.message_containers[message_container.msg.id] = message_container; @@ -729,7 +729,7 @@ MessageListView.prototype = { save_scroll_position(); _.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 old_message_group.prev('.date_row').remove(); @@ -756,9 +756,9 @@ MessageListView.prototype = { // entirely, since it appears the next_is_same_sender CSS // class doesn't do anything. 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) { - 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", message_container.next_is_same_sender); }); @@ -815,17 +815,17 @@ MessageListView.prototype = { restore_scroll_position(); - var last_message_group = _.last(self._message_groups); + const last_message_group = _.last(self._message_groups); if (last_message_group !== undefined) { list.last_message_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 user narrows to a stream, doesn't update // 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) { list.update_trailing_bookend(); } @@ -834,12 +834,12 @@ MessageListView.prototype = { if (list === current_msg_list) { // 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 // 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 // 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); }; @@ -850,8 +850,8 @@ MessageListView.prototype = { // First, in single-recipient narrows, potentially // auto-scroll to the latest message if it was sent by us. if (narrow_state.narrowed_by_reply()) { - var selected_id = list.selected_id(); - var i; + const selected_id = list.selected_id(); + let i; // Iterate backwards to find the last message // sent_by_me, stopping at the pointer position. @@ -859,7 +859,7 @@ MessageListView.prototype = { // should be limited in how far offscreen it's willing // to go. for (i = messages.length - 1; i >= 0; i -= 1) { - var id = messages[i].id; + const id = messages[i].id; if (id <= selected_id) { break; } @@ -878,8 +878,8 @@ MessageListView.prototype = { need_user_to_scroll: true, }; } - var new_messages_height = self._new_messages_height(new_dom_elements); - var need_user_to_scroll = self._maybe_autoscroll(new_messages_height); + const new_messages_height = self._new_messages_height(new_dom_elements); + const need_user_to_scroll = self._maybe_autoscroll(new_messages_height); if (need_user_to_scroll) { return { @@ -890,8 +890,8 @@ MessageListView.prototype = { }, _new_messages_height: function (rendered_elems) { - var new_messages_height = 0; - var id_of_last_message_sent_by_us = -1; + let new_messages_height = 0; + let id_of_last_message_sent_by_us = -1; // C++ iterators would have made this less painful _.each(rendered_elems.reverse(), function (elem) { @@ -903,7 +903,7 @@ MessageListView.prototype = { if (id_of_last_message_sent_by_us > -1) { 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 if (row_id > -1 && 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 // up" the messages) before knocking the selected message // out of the feed. - var selected_row_top = selected_row.offset().top; - var scroll_limit = selected_row_top - viewport_info.visible_top; + const selected_row_top = selected_row.offset().top; + let scroll_limit = selected_row_top - viewport_info.visible_top; if (scroll_limit < 0) { // 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 - var selected_row = this.selected_row(); - var last_visible = rows.last_visible(); + const selected_row = this.selected_row(); + const last_visible = rows.last_visible(); // Make sure we have a selected row and last visible row. (defensive) if (!(selected_row && selected_row.length > 0 && last_visible)) { @@ -971,8 +971,8 @@ MessageListView.prototype = { return false; } - var info = message_viewport.message_viewport_info(); - var scroll_limit = this._scroll_limit(selected_row, info); + const info = message_viewport.message_viewport_info(); + const scroll_limit = this._scroll_limit(selected_row, info); // This next decision is fairly debatable. For a big message that // 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) // d) all the bad things about scrolling for users who want messages // to stay on the screen - var scroll_amount; - var need_user_to_scroll; + let scroll_amount; + let need_user_to_scroll; if (new_messages_height <= scroll_limit) { // 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 // still end up being visible, so we do some arithmetic.) 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 // need to scroll down" notification, the obvious check @@ -1011,11 +1011,11 @@ MessageListView.prototype = { // this notification, we need to adjust by the amount that // the current compose is bigger than the empty, open // compose box. - var compose_textarea_default_height = 42; - var compose_textarea_current_height = $("#compose-textarea").height(); - var expected_change = + const compose_textarea_default_height = 42; + const compose_textarea_current_height = $("#compose-textarea").height(); + const expected_change = 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; } @@ -1039,7 +1039,7 @@ MessageListView.prototype = { }, 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) { return false; } @@ -1056,7 +1056,7 @@ MessageListView.prototype = { return false; } - var selected_idx = this.list.selected_idx(); + const selected_idx = this.list.selected_idx(); // We rerender under the following conditions: // * The selected message is within this._RENDER_THRESHOLD messages @@ -1085,9 +1085,9 @@ MessageListView.prototype = { rerender_preserving_scrolltop: function (discard_rendering_state) { // old_offset is the number of pixels between the top of the // viewable window and the selected message - var old_offset; - var selected_row = this.selected_row(); - var selected_in_view = selected_row.length > 0; + let old_offset; + const selected_row = this.selected_row(); + const selected_in_view = selected_row.length > 0; if (selected_in_view) { old_offset = selected_row.offset().top; } @@ -1102,7 +1102,7 @@ MessageListView.prototype = { }, 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); }, @@ -1148,23 +1148,23 @@ MessageListView.prototype = { 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 if (first_row.length === 0) { return; } - var recipient_row = rows.get_message_recipient_row(first_row); - var header = recipient_row.find('.message_header'); - var message_group_id = recipient_row.attr("id"); + const recipient_row = rows.get_message_recipient_row(first_row); + const header = recipient_row.find('.message_header'); + const message_group_id = recipient_row.attr("id"); // Since there might be multiple dates within the message // group, it's important to lookup the original/full message // group rather than doing an artificial rerendering of the // message header from the set of message containers passed in // here. - var group = this._find_message_group(message_group_id); + const group = this._find_message_group(message_group_id); if (group === undefined) { blueslip.error("Could not find message group for rerendering headers"); return; @@ -1176,14 +1176,14 @@ MessageListView.prototype = { // rerendering rather than looking up the original version. 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); }, _rerender_message: function (message_container, message_content_edited) { - var row = this.get_row(message_container.msg.id); - var was_selected = this.list.selected_message() === message_container.msg; + const row = this.get_row(message_container.msg.id); + const was_selected = this.list.selected_message() === message_container.msg; // Re-render just this one message 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. 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) { rendered_msg.addClass("fade-in-message"); } @@ -1205,10 +1205,10 @@ MessageListView.prototype = { }, rerender_messages: function (messages, message_content_edited) { - var self = this; + const self = this; // 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]; }); // We may not have the message_container if the stream or topic was muted @@ -1216,8 +1216,8 @@ MessageListView.prototype = { return message_container === undefined; }); - var message_groups = []; - var current_group = []; + const message_groups = []; + let current_group = []; _.each(message_containers, function (message_container) { if (current_group.length === 0 || same_recipient(current_group[current_group.length - 1], message_container)) { @@ -1237,11 +1237,11 @@ MessageListView.prototype = { }, append: function (messages, messages_are_new) { - var cur_window_size = this._render_win_end - this._render_win_start; - var render_info; + const cur_window_size = this._render_win_end - this._render_win_start; + let render_info; 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); this._render_win_end += slice_to_render.length; } @@ -1251,7 +1251,7 @@ MessageListView.prototype = { // newly received message should trigger a rerender so that // the new message, which will appear in the viewable area, // is rendered. - var needed_rerender = this.maybe_rerender(); + const needed_rerender = this.maybe_rerender(); if (needed_rerender) { render_info = {need_user_to_scroll: true}; @@ -1264,10 +1264,10 @@ MessageListView.prototype = { this._render_win_start += 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) { - var msgs_to_render_count = this._RENDER_WINDOW_SIZE - cur_window_size; - var slice_to_render = messages.slice(messages.length - msgs_to_render_count); + const msgs_to_render_count = this._RENDER_WINDOW_SIZE - cur_window_size; + const slice_to_render = messages.slice(messages.length - msgs_to_render_count); this.render(slice_to_render, 'top', false); this._render_win_start -= slice_to_render.length; } @@ -1287,7 +1287,7 @@ MessageListView.prototype = { }, get_row: function (id) { - var row = this._rows[id]; + const row = this._rows[id]; if (row === undefined) { // For legacy reasons we need to return an empty @@ -1299,12 +1299,12 @@ MessageListView.prototype = { }, 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(); }, 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, trailing: show_button, subscribed: subscribed, @@ -1322,7 +1322,7 @@ MessageListView.prototype = { change_message_id: function (old_id, new_id) { if (this._rows[old_id] !== undefined) { - var row = this._rows[old_id]; + const row = this._rows[old_id]; delete this._rows[old_id]; row.attr('zid', new_id); @@ -1332,7 +1332,7 @@ MessageListView.prototype = { } 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]; this.message_containers[new_id] = message_container; } @@ -1344,8 +1344,8 @@ MessageListView.prototype = { // Slice the '

/me ' off the front, and '

' off the first line // 'p' tag is sliced off to get sender in the same line as the // first line of the message - var msg_content = message_container.msg.content; - var p_index = msg_content.indexOf('

'); + const msg_content = message_container.msg.content; + const p_index = msg_content.indexOf('

'); message_container.status_message = msg_content.slice('

/me '.length, p_index) + msg_content.slice(p_index + '

'.length); message_container.include_sender = true; diff --git a/static/js/narrow.js b/static/js/narrow.js index 7a2a0578a1..fba8073948 100644 --- a/static/js/narrow.js +++ b/static/js/narrow.js @@ -1,4 +1,4 @@ -var unnarrow_times; +let unnarrow_times; function report_narrow_time(initial_core_time, initial_free_time, network_time) { channel.post({ @@ -28,8 +28,8 @@ function report_unnarrow_time() { return; } - var 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_core_time = unnarrow_times.initial_core_time - unnarrow_times.start_time; + const initial_free_time = unnarrow_times.initial_free_time - unnarrow_times.start_time; channel.post({ url: '/json/report/unnarrow_times', @@ -58,8 +58,8 @@ exports.save_pre_narrow_offset_for_reload = function () { exports.narrow_title = "home"; exports.activate = function (raw_operators, opts) { - var start_time = new Date(); - var was_narrowed_already = narrow_state.active(); + const start_time = new Date(); + const was_narrowed_already = narrow_state.active(); // 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. notifications.clear_compose_notifications(); @@ -71,8 +71,8 @@ exports.activate = function (raw_operators, opts) { if (raw_operators.length === 0) { return exports.deactivate(); } - var filter = new Filter(raw_operators); - var operators = filter.operators(); + const filter = new Filter(raw_operators); + const operators = filter.operators(); // Take the most detailed part of the narrow to use as the title. // 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]; } } 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"; exports.narrow_title = title; } else if (filter.has_operator("pm-with") || filter.has_operator("group-pm-with")) { - var emails = filter.public_operators()[0].operand; - var user_ids = people.emails_strings_to_user_ids_string(emails); + const emails = filter.public_operators()[0].operand; + const user_ids = people.emails_strings_to_user_ids_string(emails); if (user_ids !== undefined) { - var names = people.get_recipients(user_ids); + const names = people.get_recipients(user_ids); if (filter.has_operator("pm-with")) { exports.narrow_title = names; } else { @@ -120,7 +120,7 @@ exports.activate = function (raw_operators, opts) { trigger: 'unknown', }); - var id_info = { + const id_info = { target_id: undefined, local_select_id: undefined, final_select_id: undefined, @@ -140,7 +140,7 @@ exports.activate = function (raw_operators, opts) { // having a near: narrow auto-reloaded. id_info.target_id = opts.then_select_id; 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) { opts.then_select_offset = row.offset().top; } @@ -157,12 +157,12 @@ exports.activate = function (raw_operators, opts) { // reflect the upcoming narrow. 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. exports.save_pre_narrow_offset_for_reload(); - var msg_data = new MessageListData({ + let msg_data = new MessageListData({ filter: narrow_state.filter(), 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, table_name: 'zfilt', collapse_messages: !narrow_state.filter().is_search(), @@ -208,16 +208,16 @@ exports.activate = function (raw_operators, opts) { message_list.set_narrowed(msg_list); current_msg_list = message_list.narrowed; - var then_select_offset; + let then_select_offset; if (id_info.target_id === id_info.final_select_id) { 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() { - var anchor; - var use_first_unread; + let anchor; + let use_first_unread; if (id_info.final_select_id !== undefined) { 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') { search_pill_widget.widget.clear(true); _.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); }); } @@ -295,7 +295,7 @@ exports.activate = function (raw_operators, 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); 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 // 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); return !msg_data.empty(); @@ -337,9 +337,9 @@ exports.maybe_add_local_messages = function (opts) { // // - update id_info with more complete values // - add messages into our message list from our local cache - var id_info = opts.id_info; - var msg_data = opts.msg_data; - var unread_info = narrow_state.get_first_unread_info(); + const id_info = opts.id_info; + const msg_data = opts.msg_data; + const unread_info = narrow_state.get_first_unread_info(); if (unread_info.flavor === 'cannot_compute') { 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 // msg_data object must be the last message matching the // 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.local_select_id = id_info.final_select_id; return; @@ -445,19 +445,19 @@ exports.update_selection = function (opts) { return; } - var id_info = opts.id_info; - var select_offset = opts.select_offset; + const id_info = opts.id_info; + 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) { 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 && 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, { then_scroll: then_scroll, @@ -478,7 +478,7 @@ exports.stream_topic = function () { // This function returns the stream/topic that we most // specifically care about, according (mostly) to the // currently selected message. - var msg = current_msg_list.selected_message(); + const msg = current_msg_list.selected_message(); if (msg) { return { @@ -497,7 +497,7 @@ exports.stream_topic = function () { exports.activate_stream_for_cycle_hotkey = function (stream_name) { // This is the common code for A/D hotkeys. - var filter_expr = [ + const filter_expr = [ {operator: 'stream', operand: stream_name}, ]; exports.activate(filter_expr, {}); @@ -505,13 +505,13 @@ exports.activate_stream_for_cycle_hotkey = function (stream_name) { exports.stream_cycle_backward = function () { - var curr_stream = narrow_state.stream(); + const curr_stream = narrow_state.stream(); if (!curr_stream) { return; } - var stream_name = topic_generator.get_prev_stream(curr_stream); + const stream_name = topic_generator.get_prev_stream(curr_stream); if (!stream_name) { return; @@ -521,13 +521,13 @@ exports.stream_cycle_backward = function () { }; exports.stream_cycle_forward = function () { - var curr_stream = narrow_state.stream(); + const curr_stream = narrow_state.stream(); if (!curr_stream) { return; } - var stream_name = topic_generator.get_next_stream(curr_stream); + const stream_name = topic_generator.get_next_stream(curr_stream); if (!stream_name) { return; @@ -537,13 +537,13 @@ exports.stream_cycle_forward = function () { }; exports.narrow_to_next_topic = function () { - var curr_info = exports.stream_topic(); + const curr_info = exports.stream_topic(); if (!curr_info) { return; } - var next_narrow = topic_generator.get_next_topic( + const next_narrow = topic_generator.get_next_topic( curr_info.stream, curr_info.topic ); @@ -552,7 +552,7 @@ exports.narrow_to_next_topic = function () { return; } - var filter_expr = [ + const filter_expr = [ {operator: 'stream', operand: next_narrow.stream}, {operator: 'topic', operand: next_narrow.topic}, ]; @@ -562,9 +562,9 @@ exports.narrow_to_next_topic = 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) { return; @@ -572,14 +572,14 @@ exports.narrow_to_next_pm_string = function () { // Hopefully someday we can narrow by user_ids_string instead of // 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}, ]; // force_close parameter is true to not auto open compose_box - var opts = { + const opts = { force_close: true, }; @@ -595,7 +595,7 @@ exports.by = function (operator, operand, 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 - var original = message_store.get(target_id); + const original = message_store.get(target_id); if (original.type !== 'stream') { // Only stream messages have topics, but the // 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. unread_ops.notify_server_message_read(original); - var search_terms = [ + const search_terms = [ {operator: 'stream', operand: original.stream}, {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) { 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 - 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 // the target msg_list isn't initialized yet; in any case, the @@ -644,21 +644,21 @@ exports.to_compose_target = function () { return; } - var opts = { + const opts = { trigger: 'narrow_to_compose_target', }; if (compose_state.get_message_type() === 'stream') { - var stream_name = compose_state.stream_name(); - var stream_id = stream_data.get_stream_id(stream_name); + const stream_name = compose_state.stream_name(); + const stream_id = stream_data.get_stream_id(stream_name); if (!stream_id) { return; } // 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. - var topics = topic_data.get_recent_names(stream_id); - var operators = [{operator: 'stream', operand: stream_name}]; - var topic = compose_state.topic(); + const topics = topic_data.get_recent_names(stream_id); + const operators = [{operator: 'stream', operand: stream_name}]; + const topic = compose_state.topic(); if (topics.indexOf(topic) !== -1) { operators.push({operator: 'topic', operand: topic}); } @@ -667,9 +667,9 @@ exports.to_compose_target = function () { } if (compose_state.get_message_type() === 'private') { - var recipient_string = compose_state.recipient(); - var emails = util.extract_pm_recipients(recipient_string); - var invalid = _.reject(emails, people.is_valid_email_for_compose); + const recipient_string = compose_state.recipient(); + const emails = util.extract_pm_recipients(recipient_string); + const invalid = _.reject(emails, people.is_valid_email_for_compose); // If there are no recipients or any recipient is // invalid, narrow to all PMs. if (emails.length === 0 || invalid.length > 0) { @@ -735,11 +735,11 @@ exports.deactivate = function () { hashchange.save_narrow(); 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.pre_narrow_offset !== undefined; - var message_id_to_select; - var select_opts = { + let message_id_to_select; + const select_opts = { then_scroll: true, use_closest: true, empty_ok: true, @@ -790,27 +790,27 @@ exports.restore_home_state = function () { }; 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); } function show_search_query() { // when search bar contains multiple filters, only show search queries - var current_filter = narrow_state.filter(); - var search_query = current_filter.operands("search")[0]; - var query_words = search_query.split(" "); + const current_filter = narrow_state.filter(); + const search_query = current_filter.operands("search")[0]; + const query_words = search_query.split(" "); - var search_string_display = $("#empty_search_stop_words_string"); - var query_contains_stop_words = false; + const search_string_display = $("#empty_search_stop_words_string"); + let query_contains_stop_words = false; // Also removes previous search_string if any search_string_display.text(i18n.t("You searched for:")); // Add in stream:foo and topic:bar if present if (current_filter.has_operator("stream") || current_filter.has_operator("topic")) { - var stream_topic_string = ""; - var stream = current_filter.operands('stream')[0]; - var topic = current_filter.operands('topic')[0]; + let stream_topic_string = ""; + const stream = current_filter.operands('stream')[0]; + const topic = current_filter.operands('topic')[0]; if (stream) { stream_topic_string = "stream: " + stream; } @@ -843,24 +843,24 @@ function show_search_query() { } 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) { return default_banner; } - var first_term = current_filter.operators()[0]; - var first_operator = first_term.operator; - var first_operand = first_term.operand; - var num_operators = current_filter.operators().length; + const first_term = current_filter.operators()[0]; + const first_operator = first_term.operator; + const first_operand = first_term.operand; + const num_operators = current_filter.operators().length; if (num_operators !== 1) { // 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 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."); @@ -901,7 +901,7 @@ function pick_empty_narrow_banner() { } 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 // 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) { return $("#nonsubbed_private_nonexistent_stream_narrow_message"); } diff --git a/static/js/popovers.js b/static/js/popovers.js index f266f5ce4e..eb08f04d88 100644 --- a/static/js/popovers.js +++ b/static/js/popovers.js @@ -1,22 +1,22 @@ -var confirmDatePlugin = require("flatpickr/dist/plugins/confirmDate/confirmDate.js"); -var render_actions_popover_content = require('../templates/actions_popover_content.hbs'); -var 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'); -var render_no_arrow_popover = require('../templates/no_arrow_popover.hbs'); -var 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'); -var 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'); -var render_user_info_popover_title = require('../templates/user_info_popover_title.hbs'); -var render_user_profile_modal = require("../templates/user_profile_modal.hbs"); +const confirmDatePlugin = require("flatpickr/dist/plugins/confirmDate/confirmDate.js"); +const render_actions_popover_content = require('../templates/actions_popover_content.hbs'); +const render_mobile_message_buttons_popover = require('../templates/mobile_message_buttons_popover.hbs'); +const render_mobile_message_buttons_popover_content = require('../templates/mobile_message_buttons_popover_content.hbs'); +const render_no_arrow_popover = require('../templates/no_arrow_popover.hbs'); +const render_remind_me_popover_content = require('../templates/remind_me_popover_content.hbs'); +const render_user_group_info_popover = require('../templates/user_group_info_popover.hbs'); +const render_user_group_info_popover_content = require('../templates/user_group_info_popover_content.hbs'); +const render_user_info_popover_content = require('../templates/user_info_popover_content.hbs'); +const render_user_info_popover_title = require('../templates/user_info_popover_title.hbs'); +const render_user_profile_modal = require("../templates/user_profile_modal.hbs"); -var current_actions_popover_elem; -var current_flatpickr_instance; -var current_message_info_popover_elem; -var current_mobile_message_buttons_popover_elem; -var userlist_placement = "right"; +let current_actions_popover_elem; +let current_flatpickr_instance; +let current_message_info_popover_elem; +let current_mobile_message_buttons_popover_elem; +let userlist_placement = "right"; -var list_of_popovers = []; +let list_of_popovers = []; // this utilizes the proxy pattern to intercept all calls to $.fn.popover // 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. - for (var x in popover) { + for (const x in popover) { if (popover.hasOwnProperty(x)) { $.fn.popover[x] = popover[x]; } @@ -44,12 +44,12 @@ var list_of_popovers = []; }($.fn.popover)); function copy_email_handler(e) { - var email_el = $(e.trigger.parentElement); - var copy_icon = email_el.find('i'); + const email_el = $(e.trigger.parentElement); + const copy_icon = email_el.find('i'); // only change the parent element's text back to email // 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_textnode.nodeValue = i18n.t('Email copied'); @@ -64,19 +64,19 @@ function copy_email_handler(e) { function init_email_clipboard() { $('.user_popover_email').each(function () { if (this.clientWidth < this.scrollWidth) { - var email_el = $(this); - var copy_email_icon = email_el.find('i'); + const email_el = $(this); + const copy_email_icon = email_el.find('i'); 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); } }); } function load_medium_avatar(user, elt) { - var user_avatar_url = "avatar/" + user.user_id + "/medium"; - var sender_avatar_medium = new Image(); + const user_avatar_url = "avatar/" + user.user_id + "/medium"; + const sender_avatar_medium = new Image(); sender_avatar_medium.src = user_avatar_url; $(sender_avatar_medium).on("load", function () { 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) { - var ypos = elt.offset().top; + const ypos = elt.offset().top; if (!(ypos + size / 2 < message_viewport.height() && 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) { - var field_value = people.get_custom_profile_data(user.user_id, field.id); - var field_type = field.type; - var profile_field = {}; + const field_value = people.get_custom_profile_data(user.user_id, field.id); + const field_type = field.type; + const profile_field = {}; if (!field_value) { return profile_field; @@ -123,7 +123,7 @@ function get_custom_profile_field_data(user, field, field_types, dateFormat) { profile_field.value = field_value.value; break; 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; break; } @@ -152,10 +152,10 @@ function get_visible_email(user) { function render_user_info_popover(user, popover_element, is_sender_popover, private_msg_class, 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; - var can_revoke_away = false; + let can_set_away = false; + let can_revoke_away = false; if (is_me) { 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_set_away: can_set_away, 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) { - var is_cross_realm_bot = user.is_cross_realm_bot; - var bot_owner_id = user.bot_owner_id; + const is_cross_realm_bot = user.is_cross_realm_bot; + const bot_owner_id = user.bot_owner_id; if (is_cross_realm_bot) { args.is_cross_realm_bot = is_cross_realm_bot; } 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; } } @@ -228,7 +228,7 @@ exports._test_calculate_info_popover_placement = calculate_info_popover_placemen // user is the user whose profile to show // message is the message containing it, which should be selected 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(); if (last_popover_elem !== undefined && last_popover_elem.get()[0] === element) { @@ -237,7 +237,7 @@ function show_user_info_popover(element, user, message) { return; } current_msg_list.select_id(message.id); - var elt = $(element); + const elt = $(element); if (elt.data('popover') === undefined) { if (user === undefined) { // This is never supposed to happen, not even for deactivated @@ -246,7 +246,7 @@ function show_user_info_popover(element, user, message) { 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", "message-info-popover", "right"); @@ -255,7 +255,7 @@ function show_user_info_popover(element, user, message) { } 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(); if (last_popover_elem !== undefined && last_popover_elem.get()[0] === element) { @@ -264,7 +264,7 @@ function show_mobile_message_buttons_popover(element) { return; } - var $element = $(element); + const $element = $(element); $element.popover({ placement: "left", template: render_mobile_message_buttons_popover(), @@ -293,13 +293,13 @@ exports.hide_user_profile = function () { exports.show_user_profile = function (user) { exports.hide_all(); - var dateFormat = moment.localeData().longDateFormat('LL'); - var field_types = page_params.custom_profile_field_types; - var profile_data = page_params.custom_profile_fields + const dateFormat = moment.localeData().longDateFormat('LL'); + const field_types = page_params.custom_profile_field_types; + const profile_data = page_params.custom_profile_fields .map(function (f) {return get_custom_profile_field_data(user, f, field_types, dateFormat);}) .filter(function (f) {return f.name !== undefined;}); - var args = { + const args = { full_name: user.full_name, email: get_visible_email(user), profile_data: profile_data, @@ -325,7 +325,7 @@ function get_user_info_popover_items() { return; } - var popover_data = current_message_info_popover_elem.data('popover'); + const popover_data = current_message_info_popover_elem.data('popover'); if (!popover_data) { blueslip.error('Cannot find popover data for actions menu.'); return; @@ -366,10 +366,10 @@ exports._test_sort_group_members = sort_group_members; // user is the user whose profile to show // message is the message containing it, which should be selected 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 // 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(); if (last_popover_elem !== undefined && last_popover_elem.get()[0] === element) { @@ -378,9 +378,9 @@ function show_user_group_info_popover(element, group, message) { return; } current_msg_list.select_id(message.id); - var elt = $(element); + const elt = $(element); if (elt.data('popover') === undefined) { - var args = { + const args = { group_name: group.name, group_description: group.description, 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) { - var last_popover_elem = current_actions_popover_elem; + const last_popover_elem = current_actions_popover_elem; exports.hide_all(); if (last_popover_elem !== undefined && 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'); current_msg_list.select_id(id); - var elt = $(element); + const elt = $(element); if (elt.data('popover') === undefined) { - var message = current_msg_list.get(id); - var editability = message_edit.get_editability(message); - var use_edit_icon; - var editability_menu_item; + const message = current_msg_list.get(id); + const editability = message_edit.get_editability(message); + let use_edit_icon; + let editability_menu_item; if (editability === message_edit.editability_types.FULL) { use_edit_icon = true; editability_menu_item = i18n.t("Edit"); @@ -425,43 +425,43 @@ exports.toggle_actions_popover = function (element, id) { use_edit_icon = false; editability_menu_item = i18n.t("View source"); } - var topic = util.get_message_topic(message); - var can_mute_topic = + const topic = util.get_message_topic(message); + const can_mute_topic = message.stream && topic && !muting.is_topic_muted(message.stream_id, topic); - var can_unmute_topic = + const can_unmute_topic = message.stream && topic && muting.is_topic_muted(message.stream_id, topic); - var should_display_edit_history_option = _.any(message.edit_history, function (entry) { - var prev_topic = util.get_edit_event_prev_topic(entry); + const should_display_edit_history_option = _.any(message.edit_history, function (entry) { + const prev_topic = util.get_edit_event_prev_topic(entry); return entry.prev_content !== undefined || prev_topic !== undefined; }) && page_params.realm_allow_edit_history; // Disabling this for /me messages is a temporary workaround // for the fact that we don't have a styling for how that // 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.collapsed; - var should_display_uncollapse = !message.locally_echoed && + const should_display_uncollapse = !message.locally_echoed && !message.is_me_message && message.collapsed; - var should_display_edit_and_view_source = + const should_display_edit_and_view_source = message.content !== '

(deleted)

' || editability === message_edit.editability_types.FULL || editability === message_edit.editability_types.TOPIC_ONLY; - var should_display_quote_and_reply = message.content !== '

(deleted)

'; + const should_display_quote_and_reply = message.content !== '

(deleted)

'; - 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, '%29'); - var should_display_delete_option = message_edit.get_deletability(message); - var args = { + const should_display_delete_option = message_edit.get_deletability(message); + const args = { message_id: message.id, historical: message.historical, 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, }; - var ypos = elt.offset().top; + const ypos = elt.offset().top; elt.popover({ // Popover height with 7 items in it is ~190 px placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom', @@ -500,13 +500,13 @@ exports.render_actions_remind_popover = function (element, id) { exports.hide_all(); $(element).closest('.message_row').toggleClass('has_popover has_actions_popover'); current_msg_list.select_id(id); - var elt = $(element); + const elt = $(element); if (elt.data('popover') === undefined) { - var message = current_msg_list.get(id); - var args = { + const message = current_msg_list.get(id); + const args = { message: message, }; - var ypos = elt.offset().top; + const ypos = elt.offset().top; elt.popover({ // Popover height with 7 items in it is ~190 px placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom', @@ -533,7 +533,7 @@ function get_action_menu_menu_items() { return; } - var popover_data = current_actions_popover_elem.data('popover'); + const popover_data = current_actions_popover_elem.data('popover'); if (!popover_data) { blueslip.error('Cannot find popover data for actions menu.'); return; @@ -555,7 +555,7 @@ function popover_items_handle_keyboard(key, items) { return; } - var index = items.index(items.filter(':focus')); + let index = items.index(items.filter(':focus')); if (key === "enter" && index >= 0 && index < items.length) { return items[index].click(); @@ -573,7 +573,7 @@ function popover_items_handle_keyboard(key, items) { function focus_first_action_popover_item() { // 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. - var items = get_action_menu_menu_items(); + const items = get_action_menu_menu_items(); focus_first_popover_item(items); } @@ -585,7 +585,7 @@ exports.open_message_menu = function (message) { return true; } - var id = message.id; + const id = message.id; exports.toggle_actions_popover($(".selected_message .actions_hover")[0], id); if (current_actions_popover_elem) { focus_first_action_popover_item(); @@ -594,7 +594,7 @@ exports.open_message_menu = function (message) { }; 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); }; @@ -643,8 +643,8 @@ exports.show_pm_list_sidebar = function () { resize.resize_page_components(); }; -var current_user_sidebar_user_id; -var current_user_sidebar_popover; +let current_user_sidebar_user_id; +let current_user_sidebar_popover; function user_sidebar_popped() { return current_user_sidebar_popover !== undefined; @@ -667,21 +667,21 @@ exports.hide_user_sidebar_popover = function () { function focus_user_info_popover_item() { // 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. - var items = get_user_info_popover_items(); + const items = get_user_info_popover_items(); focus_first_popover_item(items); } 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); }; exports.show_sender_info = function () { - var $message = $(".selected_message"); - var $sender = $message.find('.sender_info_hover'); + const $message = $(".selected_message"); + const $sender = $message.find('.sender_info_hover'); - var message = current_msg_list.get(rows.id($message)); - var user = people.get_person_from_user_id(message.sender_id); + const message = current_msg_list.get(rows.id($message)); + const user = people.get_person_from_user_id(message.sender_id); show_user_info_popover($sender[0], user, message); if (current_message_info_popover_elem) { 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 // suppress the first hide from scrolling after a resize using this // variable. -var suppress_scroll_hide = false; +let suppress_scroll_hide = false; exports.set_suppress_scroll_hide = function () { suppress_scroll_hide = true; @@ -701,32 +701,32 @@ exports.set_suppress_scroll_hide = function () { exports.register_click_handlers = function () { $("#main_div").on("click", ".actions_hover", function (e) { - var row = $(this).closest(".message_row"); + const row = $(this).closest(".message_row"); e.stopPropagation(); exports.toggle_actions_popover(this, rows.id(row)); }); $("#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(); - var message = current_msg_list.get(rows.id(row)); - var user = people.get_person_from_user_id(message.sender_id); + const message = current_msg_list.get(rows.id(row)); + const user = people.get_person_from_user_id(message.sender_id); show_user_info_popover(this, user, message); }); $("#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 // 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 === '*') { return; } - var row = $(this).closest(".message_row"); + const row = $(this).closest(".message_row"); e.stopPropagation(); - var message = current_msg_list.get(rows.id(row)); - var user; + const message = current_msg_list.get(rows.id(row)); + let user; if (id) { user = people.get_person_from_user_id(id); } else { @@ -736,11 +736,11 @@ exports.register_click_handlers = function () { }); $("#main_div").on("click", ".user-group-mention", function (e) { - var id = $(this).attr('data-user-group-id'); - var row = $(this).closest(".message_row"); + const id = $(this).attr('data-user-group-id'); + const row = $(this).closest(".message_row"); e.stopPropagation(); - var message = current_msg_list.get(rows.id(row)); - var group = user_groups.get_user_group_from_id(id, true); + const message = current_msg_list.get(rows.id(row)); + const group = user_groups.get_user_group_from_id(id, true); if (group === undefined) { // This user group has likely been deleted. 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) { - var user_id = $(e.target).parents('ul').attr('data-user-id'); - var email = people.get_person_from_user_id(user_id).email; + const user_id = $(e.target).parents('ul').attr('data-user-id'); + const email = people.get_person_from_user_id(user_id).email; exports.hide_message_info_popover(); narrow.by('pm-with', email, {trigger: 'user sidebar popover'}); e.stopPropagation(); @@ -760,8 +760,8 @@ exports.register_click_handlers = function () { }); $('body').on('click', '.info_popover_actions .narrow_to_messages_sent', function (e) { - var user_id = $(e.target).parents('ul').attr('data-user-id'); - var email = people.get_person_from_user_id(user_id).email; + const user_id = $(e.target).parents('ul').attr('data-user-id'); + const email = people.get_person_from_user_id(user_id).email; exports.hide_message_info_popover(); narrow.by('sender', email, {trigger: 'user sidebar popover'}); e.stopPropagation(); @@ -772,9 +772,9 @@ exports.register_click_handlers = function () { if (!compose_state.composing()) { compose_actions.start('stream', {trigger: 'sidebar user actions'}); } - var user_id = $(e.target).parents('ul').attr('data-user-id'); - var name = people.get_person_from_user_id(user_id).full_name; - var mention = people.get_mention_syntax(name, user_id); + const user_id = $(e.target).parents('ul').attr('data-user-id'); + const name = people.get_person_from_user_id(user_id).full_name; + const mention = people.get_mention_syntax(name, user_id); compose_ui.insert_syntax_and_focus(mention); exports.hide_user_sidebar_popover(); exports.hide_userlist_sidebar(); @@ -786,9 +786,9 @@ exports.register_click_handlers = function () { if (!compose_state.composing()) { compose_actions.respond_to_message({trigger: 'user sidebar popover'}); } - var user_id = $(e.target).parents('ul').attr('data-user-id'); - var name = people.get_person_from_user_id(user_id).full_name; - var mention = people.get_mention_syntax(name, user_id); + const user_id = $(e.target).parents('ul').attr('data-user-id'); + const name = people.get_person_from_user_id(user_id).full_name; + const mention = people.get_mention_syntax(name, user_id); compose_ui.insert_syntax_and_focus(mention); exports.hide_message_info_popover(); e.stopPropagation(); @@ -796,8 +796,8 @@ exports.register_click_handlers = function () { }); $('body').on('click', '.info_popover_actions .view_user_profile', function (e) { - var user_id = $(e.target).parents('ul').attr('data-user-id'); - var user = people.get_person_from_user_id(user_id); + const user_id = $(e.target).parents('ul').attr('data-user-id'); + const user = people.get_person_from_user_id(user_id); exports.show_user_profile(user); e.stopPropagation(); e.preventDefault(); @@ -805,7 +805,7 @@ exports.register_click_handlers = function () { $('body').on('click', '.info_popover_actions .clear_status', function (e) { 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_id: me, status_text: '', @@ -816,8 +816,8 @@ exports.register_click_handlers = function () { }); $('body').on('click', '.bot-owner-name', function (e) { - var user_id = $(e.target).attr('data-bot-owner-id'); - var user = people.get_person_from_user_id(user_id); + const user_id = $(e.target).attr('data-bot-owner-id'); + const user = people.get_person_from_user_id(user_id); 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, // as the presence list may be redrawn with new elements. - var target = $(this).closest('li'); - var user_id = target.find('a').attr('data-user-id'); + const target = $(this).closest('li'); + const user_id = target.find('a').attr('data-user-id'); if (String(current_user_sidebar_user_id) === user_id) { // 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(); } - var user = people.get_person_from_user_id(user_id); - var popover_placement = userlist_placement === "left" ? "right" : "left"; + const user = people.get_person_from_user_id(user_id); + const popover_placement = userlist_placement === "left" ? "right" : "left"; render_user_info_popover(user, target, false, "compose_private_message", "user_popover", popover_placement); @@ -888,7 +888,7 @@ exports.register_click_handlers = 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) { tooltip_holder.addClass('display-tooltip'); @@ -910,7 +910,7 @@ exports.register_click_handlers = function () { }); $('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); e.stopPropagation(); e.preventDefault(); @@ -923,7 +923,7 @@ exports.register_click_handlers = function () { }); 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); exports.hide_all(); e.stopPropagation(); @@ -931,27 +931,27 @@ exports.register_click_handlers = function () { } $('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); }); $('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); }); $('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); }); $('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); }); $('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); }); @@ -961,13 +961,13 @@ exports.register_click_handlers = function () { }); $('body').on('click', '.flatpickr-confirm', function (e) { - var datestr = $(".remind.custom")[0].value; + const datestr = $(".remind.custom")[0].value; reminder_click_handler(datestr, e); }); $('body').on('click', '.respond_personal_button, .compose_private_message', function (e) { - var user_id = $(e.target).parents('ul').attr('data-user-id'); - var email = people.get_person_from_user_id(user_id).email; + const user_id = $(e.target).parents('ul').attr('data-user-id'); + const email = people.get_person_from_user_id(user_id).email; compose_actions.start('private', { trigger: 'popover send private', private_message_recipient: email}); @@ -976,9 +976,9 @@ exports.register_click_handlers = function () { e.preventDefault(); }); $('body').on('click', '.popover_toggle_collapse', function (e) { - var message_id = $(e.currentTarget).data('message-id'); - var row = current_msg_list.get_row(message_id); - var message = current_msg_list.get(rows.id(row)); + const message_id = $(e.currentTarget).data('message-id'); + const row = current_msg_list.get_row(message_id); + const message = current_msg_list.get(rows.id(row)); exports.hide_actions_popover(); @@ -994,18 +994,18 @@ exports.register_click_handlers = function () { e.preventDefault(); }); $('body').on('click', '.popover_edit_message', function (e) { - var message_id = $(e.currentTarget).data('message-id'); - var row = current_msg_list.get_row(message_id); + const message_id = $(e.currentTarget).data('message-id'); + const row = current_msg_list.get_row(message_id); exports.hide_actions_popover(); message_edit.start(row); e.stopPropagation(); e.preventDefault(); }); $('body').on('click', '.view_edit_history', function (e) { - var message_id = $(e.currentTarget).data('message-id'); - var row = current_msg_list.get_row(message_id); - var message = current_msg_list.get(rows.id(row)); - var message_history_cancel_btn = $('#message-history-cancel'); + const message_id = $(e.currentTarget).data('message-id'); + const row = current_msg_list.get_row(message_id); + const message = current_msg_list.get(rows.id(row)); + const message_history_cancel_btn = $('#message-history-cancel'); exports.hide_actions_popover(); message_edit.show_history(message); @@ -1015,8 +1015,8 @@ exports.register_click_handlers = function () { }); $('body').on('click', '.popover_mute_topic', function (e) { - var stream_id = $(e.currentTarget).attr('data-msg-stream-id'); - var topic = $(e.currentTarget).attr('data-msg-topic'); + const stream_id = $(e.currentTarget).attr('data-msg-stream-id'); + const topic = $(e.currentTarget).attr('data-msg-topic'); exports.hide_actions_popover(); muting_ui.mute(stream_id, topic); @@ -1025,8 +1025,8 @@ exports.register_click_handlers = function () { }); $('body').on('click', '.popover_unmute_topic', function (e) { - var stream_id = $(e.currentTarget).attr('data-msg-stream-id'); - var topic = $(e.currentTarget).attr('data-msg-topic'); + const stream_id = $(e.currentTarget).attr('data-msg-stream-id'); + const topic = $(e.currentTarget).attr('data-msg-topic'); exports.hide_actions_popover(); muting_ui.unmute(stream_id, topic); @@ -1035,7 +1035,7 @@ exports.register_click_handlers = function () { }); $('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(); message_edit.delete_message(message_id); e.stopPropagation(); @@ -1046,8 +1046,8 @@ exports.register_click_handlers = function () { $('body').on('click', '.copy_link', function (e) { exports.hide_actions_popover(); - var id = $(this).attr("data-message-id"); - var row = $("[zid='" + id + "']"); + const id = $(this).attr("data-message-id"); + const row = $("[zid='" + id + "']"); row.find(".alert-msg") .text(i18n.t("Copied!")) .css("display", "block") @@ -1064,7 +1064,7 @@ exports.register_click_handlers = function () { }); (function () { - var last_scroll = 0; + let last_scroll = 0; $('.app').on('scroll', function () { if (suppress_scroll_hide) { @@ -1072,7 +1072,7 @@ exports.register_click_handlers = function () { return; } - var date = new Date().getTime(); + const date = new Date().getTime(); // only run `popovers.hide_all()` if the last scroll was more // than 250ms ago. @@ -1135,22 +1135,22 @@ exports.set_userlist_placement = function (placement) { exports.compute_placement = function (elt, popover_height, popover_width, prefer_vertical_positioning) { - var client_rect = elt.get(0).getBoundingClientRect(); - var distance_from_top = client_rect.top; - var distance_from_bottom = message_viewport.height() - client_rect.bottom; - var distance_from_left = client_rect.left; - var distance_from_right = message_viewport.width() - client_rect.right; + const client_rect = elt.get(0).getBoundingClientRect(); + const distance_from_top = client_rect.top; + const distance_from_bottom = message_viewport.height() - client_rect.bottom; + const distance_from_left = client_rect.left; + 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_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_top + elt.height() / 2 > popover_height / 2; // 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 if (distance_from_top > popover_height && elt_will_fit_horizontally) { diff --git a/static/js/settings_org.js b/static/js/settings_org.js index 750539f0f6..fb96611b6b 100644 --- a/static/js/settings_org.js +++ b/static/js/settings_org.js @@ -216,7 +216,7 @@ function set_invite_to_stream_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); } @@ -839,7 +839,7 @@ exports.build_page = function () { data = {}; data.authentication_methods = JSON.stringify(get_auth_method_table_data()); } 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; } return data; diff --git a/static/js/settings_user_groups.js b/static/js/settings_user_groups.js index f377bbc98c..d0f0bf5f69 100644 --- a/static/js/settings_user_groups.js +++ b/static/js/settings_user_groups.js @@ -1,7 +1,7 @@ -var 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_admin_user_group_list = require('../templates/admin_user_group_list.hbs'); +const render_confirm_delete_user = require('../templates/confirm_delete_user.hbs'); -var meta = { +const meta = { loaded: false, }; @@ -14,7 +14,7 @@ exports.reload = function () { return; } - var user_groups_section = $('#user-groups').expectOne(); + const user_groups_section = $('#user-groups').expectOne(); user_groups_section.html(''); exports.populate_user_groups(); }; @@ -39,8 +39,8 @@ exports.can_edit = function (group_id) { exports.populate_user_groups = function () { - var user_groups_section = $('#user-groups').expectOne(); - var user_groups_array = user_groups.get_realm_user_groups(); + const user_groups_section = $('#user-groups').expectOne(); + const user_groups_array = user_groups.get_realm_user_groups(); _.each(user_groups_array, function (data) { user_groups_section.append(render_admin_user_group_list({ user_group: { @@ -49,16 +49,16 @@ exports.populate_user_groups = function () { description: data.description, }, })); - var pill_container = $('.pill-container[data-group-pills="' + data.id + '"]'); - var pills = user_pill.create_pills(pill_container); + const pill_container = $('.pill-container[data-group-pills="' + data.id + '"]'); + const pills = user_pill.create_pills(pill_container); function get_pill_user_ids() { 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) { - 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); }); @@ -85,13 +85,13 @@ exports.populate_user_groups = function () { update_membership(data.id); function is_user_group_changed() { - var draft_group = get_pill_user_ids(); - var group_data = user_groups.get_user_group_from_id(data.id); - var original_group = group_data.members.keys(); - var same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group)); - var description = $('#user-groups #' + data.id + ' .description').text().trim(); - var name = $('#user-groups #' + data.id + ' .name').text().trim(); - var user_group_status = $('#user-groups #' + data.id + ' .user-group-status'); + const draft_group = get_pill_user_ids(); + const group_data = user_groups.get_user_group_from_id(data.id); + const original_group = group_data.members.keys(); + const same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group)); + const description = $('#user-groups #' + data.id + ' .description').text().trim(); + const name = $('#user-groups #' + data.id + ' .name').text().trim(); + const user_group_status = $('#user-groups #' + data.id + ' .user-group-status'); if (user_group_status.is(':visible')) { return false; @@ -108,9 +108,9 @@ exports.populate_user_groups = function () { if (!exports.can_edit(data.id)) { return; } - var cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger'); - var saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green'); - var save_instructions = $('#user-groups #' + data.id + ' .save-instructions'); + const cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger'); + const saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green'); + const save_instructions = $('#user-groups #' + data.id + ' .save-instructions'); if (is_user_group_changed() && !cancel_button.is(':visible')) { @@ -125,9 +125,9 @@ exports.populate_user_groups = function () { } function show_saved_button() { - var cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger'); - var saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green'); - var save_instructions = $('#user-groups #' + data.id + ' .save-instructions'); + const cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger'); + const saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green'); + const save_instructions = $('#user-groups #' + data.id + ' .save-instructions'); if (!saved_button.is(':visible')) { cancel_button.fadeOut(0); save_instructions.fadeOut(0); @@ -136,15 +136,15 @@ exports.populate_user_groups = function () { } function save_members() { - var draft_group = get_pill_user_ids(); - var group_data = user_groups.get_user_group_from_id(data.id); - var original_group = group_data.members.keys(); - var same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group)); + const draft_group = get_pill_user_ids(); + const group_data = user_groups.get_user_group_from_id(data.id); + const original_group = group_data.members.keys(); + const same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group)); if (!draft_group.length || same_groups) { return; } - var added = _.difference(draft_group, original_group); - var removed = _.difference(original_group, draft_group); + const added = _.difference(draft_group, original_group); + const removed = _.difference(original_group, draft_group); channel.post({ url: "/json/user_groups/" + data.id + '/members', data: { @@ -158,10 +158,10 @@ exports.populate_user_groups = function () { } function save_name_desc() { - var user_group_status = $('#user-groups #' + data.id + ' .user-group-status'); - var group_data = user_groups.get_user_group_from_id(data.id); - var description = $('#user-groups #' + data.id + ' .description').text().trim(); - var name = $('#user-groups #' + data.id + ' .name').text().trim(); + const user_group_status = $('#user-groups #' + data.id + ' .user-group-status'); + const group_data = user_groups.get_user_group_from_id(data.id); + const description = $('#user-groups #' + data.id + ' .description').text().trim(); + const name = $('#user-groups #' + data.id + ' .name').text().trim(); if (group_data.description === description && group_data.name === name) { return; @@ -178,7 +178,7 @@ exports.populate_user_groups = function () { setTimeout(show_saved_button, 200); }, error: function (xhr) { - var errors = JSON.parse(xhr.responseText).msg; + const errors = JSON.parse(xhr.responseText).msg; xhr.responseText = JSON.stringify({msg: errors}); ui_report.error(i18n.t("Failed"), xhr, user_group_status); update_cancel_button(); @@ -194,8 +194,8 @@ exports.populate_user_groups = function () { return true; } - var blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"], - except_class); + const blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"], + except_class); if ($(event.relatedTarget).closest('#user-groups #' + data.id).length) { return _.some(blur_exceptions, function (class_name) { return $(event.relatedTarget).closest(class_name).length; @@ -239,7 +239,7 @@ exports.populate_user_groups = function () { update_cancel_button(); }); - var input = pill_container.children('.input'); + const input = pill_container.children('.input'); if (exports.can_edit(data.id)) { user_pill.set_up_typeahead_on_pills(input, pills, update_cancel_button); } @@ -268,9 +268,9 @@ exports.set_up = function () { e.preventDefault(); 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()]), }; _.each($(this).serializeArray(), function (obj) { @@ -290,7 +290,7 @@ exports.set_up = function () { }, error: function (xhr) { user_group_status.hide(); - var errors = JSON.parse(xhr.responseText).msg; + const errors = JSON.parse(xhr.responseText).msg; xhr.responseText = JSON.stringify({msg: errors}); ui_report.error(i18n.t("Failed"), xhr, user_group_status); }, @@ -298,12 +298,12 @@ exports.set_up = 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)) { return; } - var user_group = user_groups.get_user_group_from_id(group_id); - var btn = $(this); + const user_group = user_groups.get_user_group_from_id(group_id); + const btn = $(this); function delete_user_group() { channel.del({ @@ -322,9 +322,9 @@ exports.set_up = function () { } // 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, }); diff --git a/static/js/stream_create.js b/static/js/stream_create.js index 1450e3d65b..ab6afe7882 100644 --- a/static/js/stream_create.js +++ b/static/js/stream_create.js @@ -1,8 +1,8 @@ -var render_announce_stream_docs = require('../templates/announce_stream_docs.hbs'); -var 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_announce_stream_docs = require('../templates/announce_stream_docs.hbs'); +const render_new_stream_users = require('../templates/new_stream_users.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 () { created_stream = undefined; @@ -16,8 +16,8 @@ exports.get_name = function () { return created_stream; }; -var stream_subscription_error = (function () { - var self = {}; +const stream_subscription_error = (function () { + const self = {}; self.report_no_subs_to_stream = function () { $("#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 () { - var self = {}; +const stream_name_error = (function () { + const self = {}; self.report_already_exists = function () { $("#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 }, error: function (xhr) { - var msg = JSON.parse(xhr.responseText).msg; + const msg = JSON.parse(xhr.responseText).msg; if (msg.indexOf('access') >= 0) { // If we can't access the stream, we can safely assume it's // 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. // Otherwise enable it. - var announce_stream_checkbox = $('#announce-new-stream input'); - var announce_stream_label = $('#announce-new-stream'); - var disable_it = false; - var privacy_type = $('input:radio[name=privacy]:checked').val(); - var is_invite_only = privacy_type === "invite-only" || privacy_type === "invite-only-public-history"; + const announce_stream_checkbox = $('#announce-new-stream input'); + const announce_stream_label = $('#announce-new-stream'); + let disable_it = false; + const privacy_type = $('input:radio[name=privacy]:checked').val(); + const is_invite_only = privacy_type === "invite-only" || privacy_type === "invite-only-public-history"; announce_stream_label.removeClass("control-label-disabled"); if (is_invite_only) { @@ -170,14 +170,14 @@ function get_principals() { } function create_stream() { - var stream_name = $.trim($("#create_stream_name").val()); - var description = $.trim($("#create_stream_description").val()); - var privacy_setting = $('#stream_creation_form input[name=privacy]:checked').val(); - var is_announcement_only = $('#stream_creation_form input[name=is-announcement-only]').prop('checked'); - var principals = get_principals(); + const stream_name = $.trim($("#create_stream_name").val()); + const description = $.trim($("#create_stream_description").val()); + const privacy_setting = $('#stream_creation_form input[name=privacy]:checked').val(); + const is_announcement_only = $('#stream_creation_form input[name=is-announcement-only]').prop('checked'); + const principals = get_principals(); - var invite_only; - var history_public_to_subscribers; + let invite_only; + let history_public_to_subscribers; if (privacy_setting === 'invite-only') { invite_only = true; @@ -192,7 +192,7 @@ function create_stream() { created_stream = stream_name; - var announce = !!page_params.notifications_stream && + const announce = !!page_params.notifications_stream && $('#announce-new-stream input').prop('checked'); // 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"); $(".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 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, streams: stream_data.get_streams_for_settings_page(), is_admin: page_params.is_admin, }); - var container = $('#people_to_add'); + const container = $('#people_to_add'); container.html(html); exports.create_handlers_for_users(container); @@ -281,14 +281,14 @@ exports.show_new_stream_modal = function () { clear_error_display(); $("#stream-checkboxes label.checkbox").on('change', function (e) { - var elem = $(this); - var stream_id = elem.attr('data-stream-id'); - var checked = elem.find('input').prop('checked'); - var subscriber_ids = stream_data.get_sub_by_id(stream_id).subscribers; + const elem = $(this); + const stream_id = elem.attr('data-stream-id'); + const checked = elem.find('input').prop('checked'); + const subscriber_ids = stream_data.get_sub_by_id(stream_id).subscribers; $('#user-checkboxes label.checkbox').each(function () { - var user_elem = $(this); - var user_id = user_elem.attr('data-user-id'); + const user_elem = $(this); + const user_id = user_elem.attr('data-user-id'); if (subscriber_ids.has(user_id)) { user_elem.find('input').prop('checked', checked); @@ -337,23 +337,23 @@ exports.create_handlers_for_users = function (container) { // Search People or Streams 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) { return; } - var search_term = user_list.expectOne().val().trim(); - var search_terms = search_term.toLowerCase().split(","); + const search_term = user_list.expectOne().val().trim(); + const search_terms = search_term.toLowerCase().split(","); (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 === '') { user_labels.css({display: 'block'}); return; } - var users = people.get_rest_of_realm(); - var filtered_users = people.filter_people_by_search_terms(users, search_terms); + const users = people.get_rest_of_realm(); + const filtered_users = people.filter_people_by_search_terms(users, search_terms); // Be careful about modifying the follow code. A naive implementation // 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 // implementation is merely sluggish. user_labels.each(function () { - var elem = $(this); - var user_id = elem.attr('data-user-id'); - var user_checked = filtered_users.has(user_id); - var display = user_checked ? "block" : "none"; + const elem = $(this); + const user_id = elem.attr('data-user-id'); + const user_checked = filtered_users.has(user_id); + const display = user_checked ? "block" : "none"; elem.css({display: display}); }); }()); @@ -377,7 +377,7 @@ exports.create_handlers_for_users = function (container) { 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); @@ -385,14 +385,14 @@ exports.set_up_handlers = function () { e.preventDefault(); clear_error_display(); - var stream_name = $.trim($("#create_stream_name").val()); - var name_ok = stream_name_error.validate_for_submit(stream_name); + const stream_name = $.trim($("#create_stream_name").val()); + const name_ok = stream_name_error.validate_for_submit(stream_name); if (!name_ok) { return; } - var principals = get_principals(); + const principals = get_principals(); if (principals.length === 0) { stream_subscription_error.report_no_subs_to_stream(); return; @@ -403,7 +403,7 @@ exports.set_up_handlers = function () { } 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, count: principals.length, }); @@ -423,14 +423,14 @@ exports.set_up_handlers = 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. stream_name_error.pre_validate(stream_name); }); 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({ placement: "right", content: render_announce_stream_docs({ diff --git a/static/js/subs.js b/static/js/subs.js index 1945b5412c..1a03e8372f 100644 --- a/static/js/subs.js +++ b/static/js/subs.js @@ -1,7 +1,7 @@ -var render_subscription = require('../templates/subscription.hbs'); -var render_subscription_settings = require('../templates/subscription_settings.hbs'); -var render_subscription_table_body = require('../templates/subscription_table_body.hbs'); -var render_subscriptions = require('../templates/subscriptions.hbs'); +const render_subscription = require('../templates/subscription.hbs'); +const render_subscription_settings = require('../templates/subscription_settings.hbs'); +const render_subscription_table_body = require('../templates/subscription_table_body.hbs'); +const render_subscriptions = require('../templates/subscriptions.hbs'); exports.show_subs_pane = { nothing_selected: function () { @@ -15,7 +15,7 @@ exports.show_subs_pane = { }; 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"); }; @@ -26,14 +26,14 @@ exports.row_for_stream_id = function (stream_id) { exports.settings_button_for_sub = function (sub) { // We don't do expectOne() here, because this button is only // 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"); }; function get_row_data(row) { - var row_id = row.attr('data-stream-id'); + const row_id = row.attr('data-stream-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 { id: row_id, object: row_object, @@ -42,9 +42,9 @@ function get_row_data(row) { } exports.get_active_data = function () { - var active_row = $('div.stream-row.active'); - var valid_active_id = active_row.attr('data-stream-id'); - var active_tab = $('.subscriptions-container').find('div.ind-tab.selected'); + const active_row = $('div.stream-row.active'); + const valid_active_id = active_row.attr('data-stream-id'); + const active_tab = $('.subscriptions-container').find('div.ind-tab.selected'); return { row: active_row, id: valid_active_id, @@ -61,8 +61,8 @@ function get_hash_safe() { } function selectText(element) { - var range; - var sel; + let range; + let sel; if (window.getSelection) { sel = window.getSelection(); 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 // the left side. 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 // 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) { - 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; }); if (idx === -1) { @@ -125,11 +125,11 @@ exports.is_subscribed_stream_tab_active = function () { }; exports.update_stream_name = function (sub, new_name) { - var old_name = sub.name; + const old_name = sub.name; // Rename the stream internally. stream_data.rename_sub(sub, new_name); - var stream_id = sub.stream_id; + const stream_id = sub.stream_id; // Update the left sidebar. 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); // 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); // Update the message feed. @@ -161,7 +161,7 @@ exports.update_stream_description = function (sub, description, rendered_descrip sub.rendered_description = rendered_description.replace('

', '').replace('

', ''); // 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); // Update stream settings @@ -190,7 +190,7 @@ exports.update_stream_announcement_only = function (sub, new_value) { }; 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); }; @@ -218,8 +218,8 @@ exports.add_sub_to_table = function (sub) { return; } - var html = render_subscription(sub); - var settings_html = render_subscription_settings(sub); + const html = render_subscription(sub); + const settings_html = render_subscription_settings(sub); if (stream_create.get_name() === sub.name) { ui.get_content_element($(".streams-list")).prepend(html); ui.reset_scrollbar($(".streams-list")); @@ -243,7 +243,7 @@ exports.add_sub_to_table = function (sub) { exports.is_sub_already_present = function (sub) { // This checks if a stream is already listed the "Manage streams" // 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) { return true; } @@ -253,9 +253,9 @@ exports.is_sub_already_present = function (sub) { exports.remove_stream = function (stream_id) { // It is possible that row is empty when we deactivate a // 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(); - 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)) { 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 () { - var selected_row = get_hash_safe().split(/\//)[1]; + const selected_row = get_hash_safe().split(/\//)[1]; 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"); } }; @@ -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) { - var val = sub[attr]; + const val = sub[attr]; return search_util.vanilla_match({ val: val, @@ -354,15 +354,15 @@ function get_stream_id_buckets(stream_ids, query) { // When we simplify the settings UI, we can get // rid of the "others" bucket. - var buckets = { + const buckets = { name: [], desc: [], other: [], }; _.each(stream_ids, function (stream_id) { - var sub = stream_data.get_sub_by_id(stream_id); - var match_status = triage_stream(query, sub); + const sub = stream_data.get_sub_by_id(stream_id); + const match_status = triage_stream(query, sub); if (match_status === 'name_match') { buckets.name.push(stream_id); @@ -380,11 +380,11 @@ function get_stream_id_buckets(stream_ids, query) { } exports.populate_stream_settings_left_panel = function () { - var sub_rows = stream_data.get_updated_unsorted_subs(); - var template_data = { + const sub_rows = stream_data.get_updated_unsorted_subs(); + const template_data = { 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); }; @@ -393,26 +393,26 @@ exports.populate_stream_settings_left_panel = function () { exports.filter_table = function (query) { exports.show_active_stream_in_left_panel(); - var widgets = {}; - var streams_list_scrolltop = ui.get_scroll_element($(".streams-list")).scrollTop(); + const widgets = {}; + const streams_list_scrolltop = ui.get_scroll_element($(".streams-list")).scrollTop(); - var stream_ids = []; + const stream_ids = []; _.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); }); - 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 // all this hidden/notdisplayed logic. - var hidden_ids = {}; + const hidden_ids = {}; _.each(buckets.other, function (stream_id) { hidden_ids[stream_id] = true; }); _.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. if (hidden_ids[stream_id]) { @@ -428,7 +428,7 @@ exports.filter_table = function (query) { ui.reset_scrollbar($("#subscription_overlay .streams-list")); - var all_stream_ids = [].concat( + const all_stream_ids = [].concat( buckets.name, buckets.desc, buckets.other @@ -444,12 +444,12 @@ exports.filter_table = function (query) { ui.get_scroll_element($(".streams-list")).scrollTop(streams_list_scrolltop); }; -var subscribed_only = true; +let subscribed_only = true; exports.get_search_params = function () { - var search_box = $("#add_new_subscription input[type='text']"); - var input = search_box.expectOne().val().trim(); - var params = { + const search_box = $("#add_new_subscription input[type='text']"); + const input = search_box.expectOne().val().trim(); + const params = { input: input, subscribed_only: subscribed_only, }; @@ -465,11 +465,11 @@ exports.maybe_reset_right_panel = 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); }; -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. exports.toggler = undefined; @@ -518,7 +518,7 @@ exports.setup_page = function (callback) { }); if (should_list_all_streams()) { - var toggler_elem = exports.toggler.get(); + const toggler_elem = exports.toggler.get(); $("#subscriptions_table .search-container").prepend(toggler_elem); } if (page_params.is_guest) { @@ -533,7 +533,7 @@ exports.setup_page = function (callback) { $('#subscriptions_table').empty(); - var template_data = { + const template_data = { can_create_streams: page_params.can_create_streams, hide_all_streams: !should_list_all_streams(), max_name_length: page_params.stream_name_max_length, @@ -541,7 +541,7 @@ exports.setup_page = function (callback) { 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); exports.populate_stream_settings_left_panel(); @@ -567,7 +567,7 @@ exports.setup_page = function (callback) { }; 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"); stream_row.addClass("active"); @@ -605,7 +605,7 @@ exports.change_state = function (section) { // if the section is a valid number. if (/\d+/.test(section)) { - var stream_id = section; + const stream_id = section; // Guest users can not access unsubscribed streams // So redirect guest users to 'subscribed' tab // for any unsubscribed stream settings hash @@ -640,8 +640,8 @@ exports.close = function () { }; exports.switch_rows = function (event) { - var active_data = exports.get_active_data(); - var switch_row; + const active_data = exports.get_active_data(); + let switch_row; if (window.location.hash === '#streams/new') { // Prevent switching stream rows when creating a new stream 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) { - var stream_id = row_data.id; + const stream_id = row_data.id; exports.switch_to_stream_row(stream_id); } else if (event === 'up_arrow' && !row_data) { $('#search_stream_name').focus(); @@ -674,8 +674,8 @@ exports.switch_rows = function (event) { }; exports.keyboard_sub = function () { - var active_data = exports.get_active_data(); - var row_data = get_row_data(active_data.row); + const active_data = exports.get_active_data(); + const row_data = get_row_data(active_data.row); if (row_data) { exports.sub_or_unsub(row_data.object); if (row_data.object.subscribed && active_data.tab.text() === 'Subscribed') { @@ -686,7 +686,7 @@ exports.keyboard_sub = function () { }; 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') { exports.toggler.goto('all-streams'); @@ -696,17 +696,17 @@ exports.toggle_view = function (event) { }; exports.view_stream = function () { - var active_data = exports.get_active_data(); - var row_data = get_row_data(active_data.row); + const active_data = exports.get_active_data(); + const row_data = get_row_data(active_data.row); 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); } }; function ajaxSubscribe(stream, color) { // Subscribe yourself to a single stream. - var true_stream_name; + let true_stream_name; return channel.post({ url: "/json/users/me/subscriptions", @@ -716,7 +716,7 @@ function ajaxSubscribe(stream, color) { $("#create_stream_name").val(""); } - var res = JSON.parse(xhr.responseText); + const res = JSON.parse(xhr.responseText); if (!$.isEmptyObject(res.already_subscribed)) { // Display the canonical stream capitalization. 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. // Prefer open_create_stream(). - var stream = $.trim($("#search_stream_name").val()); + const stream = $.trim($("#search_stream_name").val()); if (!should_list_all_streams()) { // Realms that don't allow listing streams should simply be subscribed to. @@ -809,11 +809,11 @@ exports.initialize = function () { e.preventDefault(); $('#subscription-status').hide(); - var stream_name = narrow_state.stream(); + const stream_name = narrow_state.stream(); if (stream_name === undefined) { return; } - var sub = stream_data.get_sub(stream_name); + const sub = stream_data.get_sub(stream_name); exports.sub_or_unsub(sub); $('.empty_feed_notice').hide(); @@ -831,7 +831,7 @@ exports.initialize = function () { }); (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) { if ($(e.target).is(sel)) { diff --git a/tools/webpack-helpers.ts b/tools/webpack-helpers.ts index 38fecbbf91..52f9b015a8 100644 --- a/tools/webpack-helpers.ts +++ b/tools/webpack-helpers.ts @@ -27,7 +27,7 @@ interface ExportLoaderOptions { } function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] { const exposeLoaders = []; - for (var loaderEntry of optionsArr) { + for (const loaderEntry of optionsArr) { const path = loaderEntry.path; let name = ""; const useArr = [cacheLoader]; @@ -38,7 +38,7 @@ function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] { } else { // If name is an array if (Array.isArray(loaderEntry.name)) { - for (var exposeName of loaderEntry.name) { + for (const exposeName of loaderEntry.name) { useArr.push({loader: 'expose-loader', options: exposeName}); } // If name is a string diff --git a/tools/webpack.config.ts b/tools/webpack.config.ts index 8f8e3f3d7d..0a673e269c 100644 --- a/tools/webpack.config.ts +++ b/tools/webpack.config.ts @@ -216,7 +216,7 @@ export default (env?: string): webpack.Configuration[] => { // Expose Global variables for third party libraries to webpack modules // Use the unminified versions of jquery and underscore so that // Good error messages show up in production and development in the source maps - var exposeOptions = [ + const exposeOptions = [ { path: "blueimp-md5/js/md5.js" }, { path: "clipboard/dist/clipboard.js", name: "ClipboardJS" }, { path: "xdate/src/xdate.js", name: "XDate" },