mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	js: Automatically convert var to let and const in more files.
This commit was automatically generated by `tools/lint --only=eslint --fix`, after an `.eslintrc.json` change. A half dozen files were removed from the changes by tabbott pending further work to ensure we avoid breaking valuable PRs with merge conflicts. Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
This commit is contained in:
		@@ -128,9 +128,9 @@ run_test('buddy_status', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
run_test('title_data', () => {
 | 
					run_test('title_data', () => {
 | 
				
			||||||
    // Groups
 | 
					    // Groups
 | 
				
			||||||
    var is_group = true;
 | 
					    let is_group = true;
 | 
				
			||||||
    var user_ids_string = "9999,1000";
 | 
					    const user_ids_string = "9999,1000";
 | 
				
			||||||
    var expected_group_data = {
 | 
					    let expected_group_data = {
 | 
				
			||||||
        is_group: is_group,
 | 
					        is_group: is_group,
 | 
				
			||||||
        recipients: "Human Selma, Old User",
 | 
					        recipients: "Human Selma, Old User",
 | 
				
			||||||
        is_bot: false,
 | 
					        is_bot: false,
 | 
				
			||||||
@@ -140,7 +140,7 @@ run_test('title_data', () => {
 | 
				
			|||||||
    is_group = '';
 | 
					    is_group = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Bots with owners.
 | 
					    // Bots with owners.
 | 
				
			||||||
    var bot_owner_exists = true;
 | 
					    let bot_owner_exists = true;
 | 
				
			||||||
    expected_group_data = {
 | 
					    expected_group_data = {
 | 
				
			||||||
        is_group: '',
 | 
					        is_group: '',
 | 
				
			||||||
        name: 'Blue Herring Bot',
 | 
					        name: 'Blue Herring Bot',
 | 
				
			||||||
@@ -168,7 +168,7 @@ run_test('title_data', () => {
 | 
				
			|||||||
        status_text: 'out to lunch',
 | 
					        status_text: 'out to lunch',
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var expected_data = {
 | 
					    let expected_data = {
 | 
				
			||||||
        is_group: is_group,
 | 
					        is_group: is_group,
 | 
				
			||||||
        status_text: 'out to lunch',
 | 
					        status_text: 'out to lunch',
 | 
				
			||||||
        last_seen: 'translated: Active now',
 | 
					        last_seen: 'translated: Active now',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,19 +9,19 @@ set_global('message_store', {});
 | 
				
			|||||||
set_global('page_params', {});
 | 
					set_global('page_params', {});
 | 
				
			||||||
set_global('feature_flags', {});
 | 
					set_global('feature_flags', {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var me = {
 | 
					const me = {
 | 
				
			||||||
    email: 'me@example.com',
 | 
					    email: 'me@example.com',
 | 
				
			||||||
    user_id: 30,
 | 
					    user_id: 30,
 | 
				
			||||||
    full_name: 'Me Myself',
 | 
					    full_name: 'Me Myself',
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var joe = {
 | 
					const joe = {
 | 
				
			||||||
    email: 'joe@example.com',
 | 
					    email: 'joe@example.com',
 | 
				
			||||||
    user_id: 31,
 | 
					    user_id: 31,
 | 
				
			||||||
    full_name: 'joe',
 | 
					    full_name: 'joe',
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var steve = {
 | 
					const steve = {
 | 
				
			||||||
    email: 'STEVE@foo.com',
 | 
					    email: 'STEVE@foo.com',
 | 
				
			||||||
    user_id: 32,
 | 
					    user_id: 32,
 | 
				
			||||||
    full_name: 'steve',
 | 
					    full_name: 'steve',
 | 
				
			||||||
@@ -36,7 +36,7 @@ function assert_same_operators(result, terms) {
 | 
				
			|||||||
    terms = _.map(terms, function (term) {
 | 
					    terms = _.map(terms, function (term) {
 | 
				
			||||||
        // If negated flag is undefined, we explicitly
 | 
					        // If negated flag is undefined, we explicitly
 | 
				
			||||||
        // set it to false.
 | 
					        // set it to false.
 | 
				
			||||||
        var negated = term.negated;
 | 
					        let negated = term.negated;
 | 
				
			||||||
        if (!negated) {
 | 
					        if (!negated) {
 | 
				
			||||||
            negated = false;
 | 
					            negated = false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -50,12 +50,12 @@ function assert_same_operators(result, terms) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('basics', () => {
 | 
					run_test('basics', () => {
 | 
				
			||||||
    var operators = [
 | 
					    let operators = [
 | 
				
			||||||
        {operator: 'stream', operand: 'foo'},
 | 
					        {operator: 'stream', operand: 'foo'},
 | 
				
			||||||
        {operator: 'stream', operand: 'exclude_stream', negated: true},
 | 
					        {operator: 'stream', operand: 'exclude_stream', negated: true},
 | 
				
			||||||
        {operator: 'topic', operand: 'bar'},
 | 
					        {operator: 'topic', operand: 'bar'},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    var filter = new Filter(operators);
 | 
					    let filter = new Filter(operators);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert_same_operators(filter.operators(), operators);
 | 
					    assert_same_operators(filter.operators(), operators);
 | 
				
			||||||
    assert.deepEqual(filter.operands('stream'), ['foo']);
 | 
					    assert.deepEqual(filter.operands('stream'), ['foo']);
 | 
				
			||||||
@@ -162,10 +162,10 @@ run_test('basics', () => {
 | 
				
			|||||||
    assert(filter.can_apply_locally());
 | 
					    assert(filter.can_apply_locally());
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
run_test('show_first_unread', () => {
 | 
					run_test('show_first_unread', () => {
 | 
				
			||||||
    var operators = [
 | 
					    let operators = [
 | 
				
			||||||
        {operator: 'is', operand: 'any'},
 | 
					        {operator: 'is', operand: 'any'},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    var filter = new Filter(operators);
 | 
					    let filter = new Filter(operators);
 | 
				
			||||||
    assert(filter.allow_use_first_unread_when_narrowing());
 | 
					    assert(filter.allow_use_first_unread_when_narrowing());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    operators = [
 | 
					    operators = [
 | 
				
			||||||
@@ -188,42 +188,42 @@ run_test('show_first_unread', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
run_test('topic_stuff', () => {
 | 
					run_test('topic_stuff', () => {
 | 
				
			||||||
    var operators = [
 | 
					    const operators = [
 | 
				
			||||||
        {operator: 'stream', operand: 'foo'},
 | 
					        {operator: 'stream', operand: 'foo'},
 | 
				
			||||||
        {operator: 'topic', operand: 'old topic'},
 | 
					        {operator: 'topic', operand: 'old topic'},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    var filter = new Filter(operators);
 | 
					    const filter = new Filter(operators);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(filter.has_topic('foo', 'old topic'));
 | 
					    assert(filter.has_topic('foo', 'old topic'));
 | 
				
			||||||
    assert(!filter.has_topic('wrong', 'old topic'));
 | 
					    assert(!filter.has_topic('wrong', 'old topic'));
 | 
				
			||||||
    assert(!filter.has_topic('foo', 'wrong'));
 | 
					    assert(!filter.has_topic('foo', 'wrong'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var new_filter = filter.filter_with_new_topic('new topic');
 | 
					    const new_filter = filter.filter_with_new_topic('new topic');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert.deepEqual(new_filter.operands('stream'), ['foo']);
 | 
					    assert.deepEqual(new_filter.operands('stream'), ['foo']);
 | 
				
			||||||
    assert.deepEqual(new_filter.operands('topic'), ['new topic']);
 | 
					    assert.deepEqual(new_filter.operands('topic'), ['new topic']);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('new_style_operators', () => {
 | 
					run_test('new_style_operators', () => {
 | 
				
			||||||
    var term = {
 | 
					    const term = {
 | 
				
			||||||
        operator: 'stream',
 | 
					        operator: 'stream',
 | 
				
			||||||
        operand: 'foo',
 | 
					        operand: 'foo',
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    var operators = [term];
 | 
					    const operators = [term];
 | 
				
			||||||
    var filter = new Filter(operators);
 | 
					    const filter = new Filter(operators);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert.deepEqual(filter.operands('stream'), ['foo']);
 | 
					    assert.deepEqual(filter.operands('stream'), ['foo']);
 | 
				
			||||||
    assert(filter.is_exactly('stream'));
 | 
					    assert(filter.is_exactly('stream'));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('public_operators', () => {
 | 
					run_test('public_operators', () => {
 | 
				
			||||||
    var operators = [
 | 
					    let operators = [
 | 
				
			||||||
        {operator: 'stream', operand: 'foo'},
 | 
					        {operator: 'stream', operand: 'foo'},
 | 
				
			||||||
        {operator: 'in', operand: 'all'},
 | 
					        {operator: 'in', operand: 'all'},
 | 
				
			||||||
        {operator: 'topic', operand: 'bar'},
 | 
					        {operator: 'topic', operand: 'bar'},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var filter = new Filter(operators);
 | 
					    let filter = new Filter(operators);
 | 
				
			||||||
    assert_same_operators(filter.public_operators(), operators);
 | 
					    assert_same_operators(filter.public_operators(), operators);
 | 
				
			||||||
    assert(!filter.is_exactly('stream'));
 | 
					    assert(!filter.is_exactly('stream'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -241,7 +241,7 @@ run_test('canonicalizations', () => {
 | 
				
			|||||||
    assert.equal(Filter.canonicalize_operator('Subject'), 'topic');
 | 
					    assert.equal(Filter.canonicalize_operator('Subject'), 'topic');
 | 
				
			||||||
    assert.equal(Filter.canonicalize_operator('FROM'), 'sender');
 | 
					    assert.equal(Filter.canonicalize_operator('FROM'), 'sender');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var term;
 | 
					    let term;
 | 
				
			||||||
    term = Filter.canonicalize_term({operator: 'Stream', operand: 'Denmark'});
 | 
					    term = Filter.canonicalize_term({operator: 'Stream', operand: 'Denmark'});
 | 
				
			||||||
    assert.equal(term.operator, 'stream');
 | 
					    assert.equal(term.operator, 'stream');
 | 
				
			||||||
    assert.equal(term.operand, 'Denmark');
 | 
					    assert.equal(term.operand, 'Denmark');
 | 
				
			||||||
@@ -292,7 +292,7 @@ function get_predicate(operators) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function make_sub(name, stream_id) {
 | 
					function make_sub(name, stream_id) {
 | 
				
			||||||
    var sub = {
 | 
					    const sub = {
 | 
				
			||||||
        name: name,
 | 
					        name: name,
 | 
				
			||||||
        stream_id: stream_id,
 | 
					        stream_id: stream_id,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -308,9 +308,9 @@ run_test('predicate_basics', () => {
 | 
				
			|||||||
    // To keep these tests simple, we only pass objects with a few relevant attributes
 | 
					    // To keep these tests simple, we only pass objects with a few relevant attributes
 | 
				
			||||||
    // rather than full-fledged message objects.
 | 
					    // rather than full-fledged message objects.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var stream_id = 42;
 | 
					    const stream_id = 42;
 | 
				
			||||||
    make_sub('Foo', stream_id);
 | 
					    make_sub('Foo', stream_id);
 | 
				
			||||||
    var predicate = get_predicate([['stream', 'Foo'], ['topic', 'Bar']]);
 | 
					    let predicate = get_predicate([['stream', 'Foo'], ['topic', 'Bar']]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(predicate({type: 'stream', stream_id: stream_id, topic: 'bar'}));
 | 
					    assert(predicate({type: 'stream', stream_id: stream_id, topic: 'bar'}));
 | 
				
			||||||
    assert(!predicate({type: 'stream', stream_id: stream_id, topic: 'whatever'}));
 | 
					    assert(!predicate({type: 'stream', stream_id: stream_id, topic: 'whatever'}));
 | 
				
			||||||
@@ -356,7 +356,7 @@ run_test('predicate_basics', () => {
 | 
				
			|||||||
    predicate = get_predicate([['in', 'all']]);
 | 
					    predicate = get_predicate([['in', 'all']]);
 | 
				
			||||||
    assert(predicate({}));
 | 
					    assert(predicate({}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var unknown_stream_id = 999;
 | 
					    const unknown_stream_id = 999;
 | 
				
			||||||
    predicate = get_predicate([['in', 'home']]);
 | 
					    predicate = get_predicate([['in', 'home']]);
 | 
				
			||||||
    assert(!predicate({stream_id: unknown_stream_id, stream: 'unknown'}));
 | 
					    assert(!predicate({stream_id: unknown_stream_id, stream: 'unknown'}));
 | 
				
			||||||
    assert(predicate({type: 'private'}));
 | 
					    assert(predicate({type: 'private'}));
 | 
				
			||||||
@@ -435,10 +435,10 @@ run_test('predicate_basics', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('negated_predicates', () => {
 | 
					run_test('negated_predicates', () => {
 | 
				
			||||||
    var predicate;
 | 
					    let predicate;
 | 
				
			||||||
    var narrow;
 | 
					    let narrow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var social_stream_id = 555;
 | 
					    const social_stream_id = 555;
 | 
				
			||||||
    make_sub('social', social_stream_id);
 | 
					    make_sub('social', social_stream_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    narrow = [
 | 
					    narrow = [
 | 
				
			||||||
@@ -459,7 +459,7 @@ run_test('negated_predicates', () => {
 | 
				
			|||||||
run_test('mit_exceptions', () => {
 | 
					run_test('mit_exceptions', () => {
 | 
				
			||||||
    global.page_params.realm_is_zephyr_mirror_realm = true;
 | 
					    global.page_params.realm_is_zephyr_mirror_realm = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var predicate = get_predicate([['stream', 'Foo'], ['topic', 'personal']]);
 | 
					    let predicate = get_predicate([['stream', 'Foo'], ['topic', 'personal']]);
 | 
				
			||||||
    assert(predicate({type: 'stream', stream: 'foo', topic: 'personal'}));
 | 
					    assert(predicate({type: 'stream', stream: 'foo', topic: 'personal'}));
 | 
				
			||||||
    assert(predicate({type: 'stream', stream: 'foo.d', topic: 'personal'}));
 | 
					    assert(predicate({type: 'stream', stream: 'foo.d', topic: 'personal'}));
 | 
				
			||||||
    assert(predicate({type: 'stream', stream: 'foo.d', topic: ''}));
 | 
					    assert(predicate({type: 'stream', stream: 'foo.d', topic: ''}));
 | 
				
			||||||
@@ -471,7 +471,7 @@ run_test('mit_exceptions', () => {
 | 
				
			|||||||
    assert(predicate({type: 'stream', stream: 'foo', topic: 'bar.d'}));
 | 
					    assert(predicate({type: 'stream', stream: 'foo', topic: 'bar.d'}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Try to get the MIT regex to explode for an empty stream.
 | 
					    // Try to get the MIT regex to explode for an empty stream.
 | 
				
			||||||
    var terms = [
 | 
					    let terms = [
 | 
				
			||||||
        {operator: 'stream', operand: ''},
 | 
					        {operator: 'stream', operand: ''},
 | 
				
			||||||
        {operator: 'topic', operand: 'bar'},
 | 
					        {operator: 'topic', operand: 'bar'},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
@@ -488,7 +488,7 @@ run_test('mit_exceptions', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('predicate_edge_cases', () => {
 | 
					run_test('predicate_edge_cases', () => {
 | 
				
			||||||
    var predicate;
 | 
					    let predicate;
 | 
				
			||||||
    // The code supports undefined as an operator to Filter, which results
 | 
					    // The code supports undefined as an operator to Filter, which results
 | 
				
			||||||
    // in a predicate that accepts any message.
 | 
					    // in a predicate that accepts any message.
 | 
				
			||||||
    predicate = new Filter().predicate();
 | 
					    predicate = new Filter().predicate();
 | 
				
			||||||
@@ -507,11 +507,11 @@ run_test('predicate_edge_cases', () => {
 | 
				
			|||||||
    assert(predicate({}));
 | 
					    assert(predicate({}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Exercise caching feature.
 | 
					    // Exercise caching feature.
 | 
				
			||||||
    var terms = [
 | 
					    const terms = [
 | 
				
			||||||
        {operator: 'stream', operand: 'Foo'},
 | 
					        {operator: 'stream', operand: 'Foo'},
 | 
				
			||||||
        {operator: 'topic', operand: 'bar'},
 | 
					        {operator: 'topic', operand: 'bar'},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    var filter = new Filter(terms);
 | 
					    const filter = new Filter(terms);
 | 
				
			||||||
    filter.predicate();
 | 
					    filter.predicate();
 | 
				
			||||||
    predicate = filter.predicate(); // get cached version
 | 
					    predicate = filter.predicate(); // get cached version
 | 
				
			||||||
    assert(predicate({type: 'stream', stream: 'foo', topic: 'bar'}));
 | 
					    assert(predicate({type: 'stream', stream: 'foo', topic: 'bar'}));
 | 
				
			||||||
@@ -519,11 +519,11 @@ run_test('predicate_edge_cases', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('parse', () => {
 | 
					run_test('parse', () => {
 | 
				
			||||||
    var string;
 | 
					    let string;
 | 
				
			||||||
    var operators;
 | 
					    let operators;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function _test() {
 | 
					    function _test() {
 | 
				
			||||||
        var result = Filter.parse(string);
 | 
					        const result = Filter.parse(string);
 | 
				
			||||||
        assert_same_operators(result, operators);
 | 
					        assert_same_operators(result, operators);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -646,8 +646,8 @@ run_test('parse', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('unparse', () => {
 | 
					run_test('unparse', () => {
 | 
				
			||||||
    var string;
 | 
					    let string;
 | 
				
			||||||
    var operators;
 | 
					    let operators;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    operators = [
 | 
					    operators = [
 | 
				
			||||||
        {operator: 'stream', operand: 'Foo'},
 | 
					        {operator: 'stream', operand: 'Foo'},
 | 
				
			||||||
@@ -697,8 +697,8 @@ run_test('unparse', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('describe', () => {
 | 
					run_test('describe', () => {
 | 
				
			||||||
    var narrow;
 | 
					    let narrow;
 | 
				
			||||||
    var string;
 | 
					    let string;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    narrow = [
 | 
					    narrow = [
 | 
				
			||||||
        {operator: 'streams', operand: 'public'},
 | 
					        {operator: 'streams', operand: 'public'},
 | 
				
			||||||
@@ -825,10 +825,10 @@ run_test('describe', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('is_functions', () => {
 | 
					run_test('is_functions', () => {
 | 
				
			||||||
    var terms = [
 | 
					    let terms = [
 | 
				
			||||||
        {operator: 'stream', operand: 'My Stream'},
 | 
					        {operator: 'stream', operand: 'My Stream'},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    var filter = new Filter(terms);
 | 
					    let filter = new Filter(terms);
 | 
				
			||||||
    assert.equal(filter.is_exactly('stream'), true);
 | 
					    assert.equal(filter.is_exactly('stream'), true);
 | 
				
			||||||
    assert.equal(filter.is_exactly('stream', 'topic'), false);
 | 
					    assert.equal(filter.is_exactly('stream', 'topic'), false);
 | 
				
			||||||
    assert.equal(filter.is_exactly('pm-with'), false);
 | 
					    assert.equal(filter.is_exactly('pm-with'), false);
 | 
				
			||||||
@@ -995,12 +995,12 @@ run_test('first_valid_id_from', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('update_email', () => {
 | 
					run_test('update_email', () => {
 | 
				
			||||||
    var terms = [
 | 
					    const terms = [
 | 
				
			||||||
        {operator: 'pm-with', operand: 'steve@foo.com'},
 | 
					        {operator: 'pm-with', operand: 'steve@foo.com'},
 | 
				
			||||||
        {operator: 'sender', operand: 'steve@foo.com'},
 | 
					        {operator: 'sender', operand: 'steve@foo.com'},
 | 
				
			||||||
        {operator: 'stream', operand: 'steve@foo.com'}, // try to be tricky
 | 
					        {operator: 'stream', operand: 'steve@foo.com'}, // try to be tricky
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    var filter = new Filter(terms);
 | 
					    const filter = new Filter(terms);
 | 
				
			||||||
    filter.update_email(steve.user_id, 'showell@foo.com');
 | 
					    filter.update_email(steve.user_id, 'showell@foo.com');
 | 
				
			||||||
    assert.deepEqual(filter.operands('pm-with'), ['showell@foo.com']);
 | 
					    assert.deepEqual(filter.operands('pm-with'), ['showell@foo.com']);
 | 
				
			||||||
    assert.deepEqual(filter.operands('sender'), ['showell@foo.com']);
 | 
					    assert.deepEqual(filter.operands('sender'), ['showell@foo.com']);
 | 
				
			||||||
@@ -1013,6 +1013,6 @@ run_test('error_cases', () => {
 | 
				
			|||||||
    // should not be reached unless we break other code.
 | 
					    // should not be reached unless we break other code.
 | 
				
			||||||
    people.pm_with_user_ids = function () {};
 | 
					    people.pm_with_user_ids = function () {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var predicate = get_predicate([['pm-with', 'Joe@example.com']]);
 | 
					    const predicate = get_predicate([['pm-with', 'Joe@example.com']]);
 | 
				
			||||||
    assert(!predicate({type: 'private'}));
 | 
					    assert(!predicate({type: 'private'}));
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -48,16 +48,16 @@ set_global('Image', function () {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
emoji.initialize();
 | 
					emoji.initialize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var doc = "";
 | 
					const doc = "";
 | 
				
			||||||
set_global('document', doc);
 | 
					set_global('document', doc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set_global('$', global.make_zjquery());
 | 
					set_global('$', global.make_zjquery());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set_global('feature_flags', {local_echo: true});
 | 
					set_global('feature_flags', {local_echo: true});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var people = global.people;
 | 
					const people = global.people;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var cordelia = {
 | 
					const cordelia = {
 | 
				
			||||||
    full_name: 'Cordelia Lear',
 | 
					    full_name: 'Cordelia Lear',
 | 
				
			||||||
    user_id: 101,
 | 
					    user_id: 101,
 | 
				
			||||||
    email: 'cordelia@zulip.com',
 | 
					    email: 'cordelia@zulip.com',
 | 
				
			||||||
@@ -96,21 +96,21 @@ people.add({
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
people.initialize_current_user(cordelia.user_id);
 | 
					people.initialize_current_user(cordelia.user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var hamletcharacters = {
 | 
					const hamletcharacters = {
 | 
				
			||||||
    name: "hamletcharacters",
 | 
					    name: "hamletcharacters",
 | 
				
			||||||
    id: 1,
 | 
					    id: 1,
 | 
				
			||||||
    description: "Characters of Hamlet",
 | 
					    description: "Characters of Hamlet",
 | 
				
			||||||
    members: [cordelia.user_id],
 | 
					    members: [cordelia.user_id],
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var backend = {
 | 
					const backend = {
 | 
				
			||||||
    name: "Backend",
 | 
					    name: "Backend",
 | 
				
			||||||
    id: 2,
 | 
					    id: 2,
 | 
				
			||||||
    description: "Backend team",
 | 
					    description: "Backend team",
 | 
				
			||||||
    members: [],
 | 
					    members: [],
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var edgecase_group = {
 | 
					const edgecase_group = {
 | 
				
			||||||
    name: "Bobby <h1>Tables</h1>",
 | 
					    name: "Bobby <h1>Tables</h1>",
 | 
				
			||||||
    id: 3,
 | 
					    id: 3,
 | 
				
			||||||
    description: "HTML Syntax to check for Markdown edge cases.",
 | 
					    description: "HTML Syntax to check for Markdown edge cases.",
 | 
				
			||||||
@@ -121,15 +121,15 @@ global.user_groups.add(hamletcharacters);
 | 
				
			|||||||
global.user_groups.add(backend);
 | 
					global.user_groups.add(backend);
 | 
				
			||||||
global.user_groups.add(edgecase_group);
 | 
					global.user_groups.add(edgecase_group);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var stream_data = global.stream_data;
 | 
					const stream_data = global.stream_data;
 | 
				
			||||||
var denmark = {
 | 
					const denmark = {
 | 
				
			||||||
    subscribed: false,
 | 
					    subscribed: false,
 | 
				
			||||||
    color: 'blue',
 | 
					    color: 'blue',
 | 
				
			||||||
    name: 'Denmark',
 | 
					    name: 'Denmark',
 | 
				
			||||||
    stream_id: 1,
 | 
					    stream_id: 1,
 | 
				
			||||||
    is_muted: true,
 | 
					    is_muted: true,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
var social = {
 | 
					const social = {
 | 
				
			||||||
    subscribed: true,
 | 
					    subscribed: true,
 | 
				
			||||||
    color: 'red',
 | 
					    color: 'red',
 | 
				
			||||||
    name: 'social',
 | 
					    name: 'social',
 | 
				
			||||||
@@ -137,14 +137,14 @@ var social = {
 | 
				
			|||||||
    is_muted: false,
 | 
					    is_muted: false,
 | 
				
			||||||
    invite_only: true,
 | 
					    invite_only: true,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
var edgecase_stream = {
 | 
					const edgecase_stream = {
 | 
				
			||||||
    subscribed: true,
 | 
					    subscribed: true,
 | 
				
			||||||
    color: 'green',
 | 
					    color: 'green',
 | 
				
			||||||
    name: 'Bobby <h1>Tables</h1>',
 | 
					    name: 'Bobby <h1>Tables</h1>',
 | 
				
			||||||
    stream_id: 3,
 | 
					    stream_id: 3,
 | 
				
			||||||
    is_muted: false,
 | 
					    is_muted: false,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
var edgecase_stream_2 = {
 | 
					const edgecase_stream_2 = {
 | 
				
			||||||
    subscribed: true,
 | 
					    subscribed: true,
 | 
				
			||||||
    color: 'yellow',
 | 
					    color: 'yellow',
 | 
				
			||||||
    name: 'Bobby <h1',
 | 
					    name: 'Bobby <h1',
 | 
				
			||||||
@@ -161,18 +161,18 @@ stream_data.add_sub('Bobby <h1', edgecase_stream_2);
 | 
				
			|||||||
// Check the default behavior of fenced code blocks
 | 
					// Check the default behavior of fenced code blocks
 | 
				
			||||||
// works properly before markdown is initialized.
 | 
					// works properly before markdown is initialized.
 | 
				
			||||||
run_test('fenced_block_defaults', () => {
 | 
					run_test('fenced_block_defaults', () => {
 | 
				
			||||||
    var input = '\n```\nfenced code\n```\n\nand then after\n';
 | 
					    const input = '\n```\nfenced code\n```\n\nand then after\n';
 | 
				
			||||||
    var expected = '\n\n<div class="codehilite"><pre><span></span>fenced code\n</pre></div>\n\n\n\nand then after\n\n';
 | 
					    const expected = '\n\n<div class="codehilite"><pre><span></span>fenced code\n</pre></div>\n\n\n\nand then after\n\n';
 | 
				
			||||||
    var output = fenced_code.process_fenced_code(input);
 | 
					    const output = fenced_code.process_fenced_code(input);
 | 
				
			||||||
    assert.equal(output, expected);
 | 
					    assert.equal(output, expected);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
markdown.initialize();
 | 
					markdown.initialize();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var bugdown_data = global.read_fixture_data('markdown_test_cases.json');
 | 
					const bugdown_data = global.read_fixture_data('markdown_test_cases.json');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('bugdown_detection', () => {
 | 
					run_test('bugdown_detection', () => {
 | 
				
			||||||
    var no_markup = [
 | 
					    const no_markup = [
 | 
				
			||||||
        "This is a plaintext message",
 | 
					        "This is a plaintext message",
 | 
				
			||||||
        "This is a plaintext: message",
 | 
					        "This is a plaintext: message",
 | 
				
			||||||
        "This is a :plaintext message",
 | 
					        "This is a :plaintext message",
 | 
				
			||||||
@@ -195,7 +195,7 @@ run_test('bugdown_detection', () => {
 | 
				
			|||||||
        "And an avatar !avatar(leo@zulip.com) is here",
 | 
					        "And an avatar !avatar(leo@zulip.com) is here",
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var markup = [
 | 
					    const markup = [
 | 
				
			||||||
        "Contains a https://zulip.com/image.png file",
 | 
					        "Contains a https://zulip.com/image.png file",
 | 
				
			||||||
        "Contains a https://zulip.com/image.jpg file",
 | 
					        "Contains a https://zulip.com/image.jpg file",
 | 
				
			||||||
        "https://zulip.com/image.jpg",
 | 
					        "https://zulip.com/image.jpg",
 | 
				
			||||||
@@ -220,7 +220,7 @@ run_test('bugdown_detection', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('marked_shared', () => {
 | 
					run_test('marked_shared', () => {
 | 
				
			||||||
    var tests = bugdown_data.regular_tests;
 | 
					    const tests = bugdown_data.regular_tests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tests.forEach(function (test) {
 | 
					    tests.forEach(function (test) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -229,11 +229,11 @@ run_test('marked_shared', () => {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var message = {raw_content: test.input};
 | 
					        const message = {raw_content: test.input};
 | 
				
			||||||
        page_params.translate_emoticons = test.translate_emoticons || false;
 | 
					        page_params.translate_emoticons = test.translate_emoticons || false;
 | 
				
			||||||
        markdown.apply_markdown(message);
 | 
					        markdown.apply_markdown(message);
 | 
				
			||||||
        var output = message.content;
 | 
					        const output = message.content;
 | 
				
			||||||
        var error_message = `Failure in test: ${test.name}`;
 | 
					        const error_message = `Failure in test: ${test.name}`;
 | 
				
			||||||
        if (test.marked_expected_output) {
 | 
					        if (test.marked_expected_output) {
 | 
				
			||||||
            global.bugdown_assert.notEqual(test.expected_output, output, error_message);
 | 
					            global.bugdown_assert.notEqual(test.expected_output, output, error_message);
 | 
				
			||||||
            global.bugdown_assert.equal(test.marked_expected_output, output, error_message);
 | 
					            global.bugdown_assert.equal(test.marked_expected_output, output, error_message);
 | 
				
			||||||
@@ -246,7 +246,7 @@ run_test('marked_shared', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('message_flags', () => {
 | 
					run_test('message_flags', () => {
 | 
				
			||||||
    var message = {raw_content: '@**Leo**'};
 | 
					    let message = {raw_content: '@**Leo**'};
 | 
				
			||||||
    markdown.apply_markdown(message);
 | 
					    markdown.apply_markdown(message);
 | 
				
			||||||
    assert(!message.mentioned);
 | 
					    assert(!message.mentioned);
 | 
				
			||||||
    assert(!message.mentioned_me_directly);
 | 
					    assert(!message.mentioned_me_directly);
 | 
				
			||||||
@@ -263,7 +263,7 @@ run_test('message_flags', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('marked', () => {
 | 
					run_test('marked', () => {
 | 
				
			||||||
    var test_cases = [
 | 
					    const test_cases = [
 | 
				
			||||||
        {input: 'hello', expected: '<p>hello</p>'},
 | 
					        {input: 'hello', expected: '<p>hello</p>'},
 | 
				
			||||||
        {input: 'hello there', expected: '<p>hello there</p>'},
 | 
					        {input: 'hello there', expected: '<p>hello there</p>'},
 | 
				
			||||||
        {input: 'hello **bold** for you', expected: '<p>hello <strong>bold</strong> for you</p>'},
 | 
					        {input: 'hello **bold** for you', expected: '<p>hello <strong>bold</strong> for you</p>'},
 | 
				
			||||||
@@ -396,18 +396,18 @@ run_test('marked', () => {
 | 
				
			|||||||
        // Disable emoji conversion by default.
 | 
					        // Disable emoji conversion by default.
 | 
				
			||||||
        page_params.translate_emoticons = test_case.translate_emoticons || false;
 | 
					        page_params.translate_emoticons = test_case.translate_emoticons || false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var input = test_case.input;
 | 
					        const input = test_case.input;
 | 
				
			||||||
        var expected = test_case.expected;
 | 
					        const expected = test_case.expected;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var message = {raw_content: input};
 | 
					        const message = {raw_content: input};
 | 
				
			||||||
        markdown.apply_markdown(message);
 | 
					        markdown.apply_markdown(message);
 | 
				
			||||||
        var output = message.content;
 | 
					        const output = message.content;
 | 
				
			||||||
        assert.equal(expected, output);
 | 
					        assert.equal(expected, output);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('topic_links', () => {
 | 
					run_test('topic_links', () => {
 | 
				
			||||||
    var message = {type: 'stream', topic: "No links here"};
 | 
					    let message = {type: 'stream', topic: "No links here"};
 | 
				
			||||||
    markdown.add_topic_links(message);
 | 
					    markdown.add_topic_links(message);
 | 
				
			||||||
    assert.equal(util.get_topic_links(message).length, []);
 | 
					    assert.equal(util.get_topic_links(message).length, []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -456,8 +456,8 @@ run_test('topic_links', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('message_flags', () => {
 | 
					run_test('message_flags', () => {
 | 
				
			||||||
    var input = "/me is testing this";
 | 
					    let input = "/me is testing this";
 | 
				
			||||||
    var message = {topic: "No links here", raw_content: input};
 | 
					    let message = {topic: "No links here", raw_content: input};
 | 
				
			||||||
    markdown.apply_markdown(message);
 | 
					    markdown.apply_markdown(message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert.equal(message.is_me_message, true);
 | 
					    assert.equal(message.is_me_message, true);
 | 
				
			||||||
@@ -528,7 +528,7 @@ run_test('message_flags', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('backend_only_realm_filters', () => {
 | 
					run_test('backend_only_realm_filters', () => {
 | 
				
			||||||
    var backend_only_realm_filters = [
 | 
					    const backend_only_realm_filters = [
 | 
				
			||||||
        'Here is the PR-#123.',
 | 
					        'Here is the PR-#123.',
 | 
				
			||||||
        'Function abc() was introduced in (PR)#123.',
 | 
					        'Function abc() was introduced in (PR)#123.',
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
@@ -541,8 +541,8 @@ run_test('python_to_js_filter', () => {
 | 
				
			|||||||
    // The only way to reach python_to_js_filter is indirectly, hence the call
 | 
					    // The only way to reach python_to_js_filter is indirectly, hence the call
 | 
				
			||||||
    // to set_realm_filters.
 | 
					    // to set_realm_filters.
 | 
				
			||||||
    markdown.set_realm_filters([['/a(?im)a/g'], ['/a(?L)a/g']]);
 | 
					    markdown.set_realm_filters([['/a(?im)a/g'], ['/a(?L)a/g']]);
 | 
				
			||||||
    var actual_value = marked.InlineLexer.rules.zulip.realm_filters;
 | 
					    let actual_value = marked.InlineLexer.rules.zulip.realm_filters;
 | 
				
			||||||
    var expected_value = [/\/aa\/g(?![\w])/gim, /\/aa\/g(?![\w])/g];
 | 
					    let expected_value = [/\/aa\/g(?![\w])/gim, /\/aa\/g(?![\w])/g];
 | 
				
			||||||
    assert.deepEqual(actual_value, expected_value);
 | 
					    assert.deepEqual(actual_value, expected_value);
 | 
				
			||||||
    // Test case with multiple replacements.
 | 
					    // Test case with multiple replacements.
 | 
				
			||||||
    markdown.set_realm_filters([['#cf(?P<contest>[0-9]+)(?P<problem>[A-Z][0-9A-Z]*)', 'http://google.com']]);
 | 
					    markdown.set_realm_filters([['#cf(?P<contest>[0-9]+)(?P<problem>[A-Z][0-9A-Z]*)', 'http://google.com']]);
 | 
				
			||||||
@@ -562,7 +562,7 @@ run_test('python_to_js_filter', () => {
 | 
				
			|||||||
run_test('katex_throws_unexpected_exceptions', () => {
 | 
					run_test('katex_throws_unexpected_exceptions', () => {
 | 
				
			||||||
    katex.renderToString = function () { throw new Error('some-exception'); };
 | 
					    katex.renderToString = function () { throw new Error('some-exception'); };
 | 
				
			||||||
    blueslip.set_test_data('error', 'Error: some-exception');
 | 
					    blueslip.set_test_data('error', 'Error: some-exception');
 | 
				
			||||||
    var message = { raw_content: '$$a$$' };
 | 
					    const message = { raw_content: '$$a$$' };
 | 
				
			||||||
    markdown.apply_markdown(message);
 | 
					    markdown.apply_markdown(message);
 | 
				
			||||||
    assert.equal(blueslip.get_test_logs('error').length, 1);
 | 
					    assert.equal(blueslip.get_test_logs('error').length, 1);
 | 
				
			||||||
    blueslip.clear_test_data();
 | 
					    blueslip.clear_test_data();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,13 +5,13 @@ set_global('$', global.make_zjquery());
 | 
				
			|||||||
set_global('i18n', global.stub_i18n);
 | 
					set_global('i18n', global.stub_i18n);
 | 
				
			||||||
set_global('confirm_dialog', {});
 | 
					set_global('confirm_dialog', {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var noop = function () {};
 | 
					const noop = function () {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var pills = {
 | 
					const pills = {
 | 
				
			||||||
    pill: {},
 | 
					    pill: {},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var create_item_handler;
 | 
					let create_item_handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set_global('channel', {});
 | 
					set_global('channel', {});
 | 
				
			||||||
set_global('blueslip', global.make_zblueslip());
 | 
					set_global('blueslip', global.make_zblueslip());
 | 
				
			||||||
@@ -83,31 +83,31 @@ run_test('can_edit', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var user_group_selector = "#user-groups #1";
 | 
					const user_group_selector = "#user-groups #1";
 | 
				
			||||||
var cancel_selector = "#user-groups #1 .save-status.btn-danger";
 | 
					const cancel_selector = "#user-groups #1 .save-status.btn-danger";
 | 
				
			||||||
var saved_selector = "#user-groups #1 .save-status.sea-green";
 | 
					const saved_selector = "#user-groups #1 .save-status.sea-green";
 | 
				
			||||||
var name_selector = "#user-groups #1 .name";
 | 
					const name_selector = "#user-groups #1 .name";
 | 
				
			||||||
var description_selector = "#user-groups #1 .description";
 | 
					const description_selector = "#user-groups #1 .description";
 | 
				
			||||||
var instructions_selector = "#user-groups #1 .save-instructions";
 | 
					const instructions_selector = "#user-groups #1 .save-instructions";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('populate_user_groups', () => {
 | 
					run_test('populate_user_groups', () => {
 | 
				
			||||||
    var realm_user_group = {
 | 
					    const realm_user_group = {
 | 
				
			||||||
        id: 1,
 | 
					        id: 1,
 | 
				
			||||||
        name: 'Mobile',
 | 
					        name: 'Mobile',
 | 
				
			||||||
        description: 'All mobile people',
 | 
					        description: 'All mobile people',
 | 
				
			||||||
        members: Dict.from_array([2, 4]),
 | 
					        members: Dict.from_array([2, 4]),
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    var iago = {
 | 
					    const iago = {
 | 
				
			||||||
        email: 'iago@zulip.com',
 | 
					        email: 'iago@zulip.com',
 | 
				
			||||||
        user_id: 2,
 | 
					        user_id: 2,
 | 
				
			||||||
        full_name: 'Iago',
 | 
					        full_name: 'Iago',
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    var alice = {
 | 
					    const alice = {
 | 
				
			||||||
        email: 'alice@example.com',
 | 
					        email: 'alice@example.com',
 | 
				
			||||||
        user_id: 31,
 | 
					        user_id: 31,
 | 
				
			||||||
        full_name: 'Alice',
 | 
					        full_name: 'Alice',
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    var bob = {
 | 
					    const bob = {
 | 
				
			||||||
        email: 'bob@example.com',
 | 
					        email: 'bob@example.com',
 | 
				
			||||||
        user_id: 32,
 | 
					        user_id: 32,
 | 
				
			||||||
        full_name: 'Bob',
 | 
					        full_name: 'Bob',
 | 
				
			||||||
@@ -121,8 +121,8 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
        return [realm_user_group];
 | 
					        return [realm_user_group];
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var templates_render_called = false;
 | 
					    let templates_render_called = false;
 | 
				
			||||||
    var fake_rendered_temp = $.create('fake_admin_user_group_list_template_rendered');
 | 
					    const fake_rendered_temp = $.create('fake_admin_user_group_list_template_rendered');
 | 
				
			||||||
    global.stub_templates(function (template, args) {
 | 
					    global.stub_templates(function (template, args) {
 | 
				
			||||||
        assert.equal(template, 'admin_user_group_list');
 | 
					        assert.equal(template, 'admin_user_group_list');
 | 
				
			||||||
        assert.equal(args.user_group.id, 1);
 | 
					        assert.equal(args.user_group.id, 1);
 | 
				
			||||||
@@ -132,13 +132,13 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
        return fake_rendered_temp;
 | 
					        return fake_rendered_temp;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var user_groups_list_append_called = false;
 | 
					    let user_groups_list_append_called = false;
 | 
				
			||||||
    $('#user-groups').append = function (rendered_temp) {
 | 
					    $('#user-groups').append = function (rendered_temp) {
 | 
				
			||||||
        assert.equal(rendered_temp, fake_rendered_temp);
 | 
					        assert.equal(rendered_temp, fake_rendered_temp);
 | 
				
			||||||
        user_groups_list_append_called = true;
 | 
					        user_groups_list_append_called = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var get_person_from_user_id_called = false;
 | 
					    let get_person_from_user_id_called = false;
 | 
				
			||||||
    people.get_person_from_user_id = function (user_id) {
 | 
					    people.get_person_from_user_id = function (user_id) {
 | 
				
			||||||
        if (user_id === iago.user_id) {
 | 
					        if (user_id === iago.user_id) {
 | 
				
			||||||
            return iago;
 | 
					            return iago;
 | 
				
			||||||
@@ -155,11 +155,11 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var all_pills = {};
 | 
					    const all_pills = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var pill_container_stub = $('.pill-container[data-group-pills="1"]');
 | 
					    const pill_container_stub = $('.pill-container[data-group-pills="1"]');
 | 
				
			||||||
    pills.appendValidatedData = function (item) {
 | 
					    pills.appendValidatedData = function (item) {
 | 
				
			||||||
        var id = item.user_id;
 | 
					        const id = item.user_id;
 | 
				
			||||||
        assert.equal(all_pills[id], undefined);
 | 
					        assert.equal(all_pills[id], undefined);
 | 
				
			||||||
        all_pills[id] = item;
 | 
					        all_pills[id] = item;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -167,17 +167,17 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
        return _.values(all_pills);
 | 
					        return _.values(all_pills);
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var text_cleared;
 | 
					    let text_cleared;
 | 
				
			||||||
    pills.clear_text = function () {
 | 
					    pills.clear_text = function () {
 | 
				
			||||||
        text_cleared = true;
 | 
					        text_cleared = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var input_field_stub = $.create('fake-input-field');
 | 
					    const input_field_stub = $.create('fake-input-field');
 | 
				
			||||||
    pill_container_stub.children = function () {
 | 
					    pill_container_stub.children = function () {
 | 
				
			||||||
        return input_field_stub;
 | 
					        return input_field_stub;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var input_typeahead_called = false;
 | 
					    let input_typeahead_called = false;
 | 
				
			||||||
    input_field_stub.typeahead = function (config) {
 | 
					    input_field_stub.typeahead = function (config) {
 | 
				
			||||||
        assert.equal(config.items, 5);
 | 
					        assert.equal(config.items, 5);
 | 
				
			||||||
        assert(config.fixed);
 | 
					        assert(config.fixed);
 | 
				
			||||||
@@ -190,27 +190,27 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
        assert.equal(typeof config.updater, 'function');
 | 
					        assert.equal(typeof config.updater, 'function');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (function test_highlighter() {
 | 
					        (function test_highlighter() {
 | 
				
			||||||
            var fake_person = $.create('fake-person');
 | 
					            const fake_person = $.create('fake-person');
 | 
				
			||||||
            typeahead_helper.render_person = function () {
 | 
					            typeahead_helper.render_person = function () {
 | 
				
			||||||
                return fake_person;
 | 
					                return fake_person;
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            assert.equal(config.highlighter(), fake_person);
 | 
					            assert.equal(config.highlighter(), fake_person);
 | 
				
			||||||
        }());
 | 
					        }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var fake_context = {
 | 
					        const fake_context = {
 | 
				
			||||||
            query: 'ali',
 | 
					            query: 'ali',
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (function test_source() {
 | 
					        (function test_source() {
 | 
				
			||||||
            var result = config.source.call(fake_context, iago);
 | 
					            const result = config.source.call(fake_context, iago);
 | 
				
			||||||
            var emails = _.pluck(result, 'email').sort();
 | 
					            const emails = _.pluck(result, 'email').sort();
 | 
				
			||||||
            assert.deepEqual(emails, [alice.email, bob.email]);
 | 
					            assert.deepEqual(emails, [alice.email, bob.email]);
 | 
				
			||||||
        }());
 | 
					        }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (function test_matcher() {
 | 
					        (function test_matcher() {
 | 
				
			||||||
            /* Here the query doesn't begin with an '@' because typeahead is triggered
 | 
					            /* Here the query doesn't begin with an '@' because typeahead is triggered
 | 
				
			||||||
            by the '@' sign and thus removed in the query. */
 | 
					            by the '@' sign and thus removed in the query. */
 | 
				
			||||||
            var result = config.matcher.call(fake_context, iago);
 | 
					            let result = config.matcher.call(fake_context, iago);
 | 
				
			||||||
            assert(!result);
 | 
					            assert(!result);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            result = config.matcher.call(fake_context, alice);
 | 
					            result = config.matcher.call(fake_context, alice);
 | 
				
			||||||
@@ -218,7 +218,7 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
        }());
 | 
					        }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (function test_sorter() {
 | 
					        (function test_sorter() {
 | 
				
			||||||
            var sort_recipientbox_typeahead_called = false;
 | 
					            let sort_recipientbox_typeahead_called = false;
 | 
				
			||||||
            typeahead_helper.sort_recipientbox_typeahead = function () {
 | 
					            typeahead_helper.sort_recipientbox_typeahead = function () {
 | 
				
			||||||
                sort_recipientbox_typeahead_called = true;
 | 
					                sort_recipientbox_typeahead_called = true;
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
@@ -232,9 +232,9 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
                return realm_user_group;
 | 
					                return realm_user_group;
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var saved_fade_out_called = false;
 | 
					            let saved_fade_out_called = false;
 | 
				
			||||||
            var cancel_fade_to_called = false;
 | 
					            let cancel_fade_to_called = false;
 | 
				
			||||||
            var instructions_fade_to_called = false;
 | 
					            let instructions_fade_to_called = false;
 | 
				
			||||||
            $(saved_selector).fadeOut = function () {
 | 
					            $(saved_selector).fadeOut = function () {
 | 
				
			||||||
                saved_fade_out_called = true;
 | 
					                saved_fade_out_called = true;
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
@@ -274,7 +274,7 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
        input_typeahead_called = true;
 | 
					        input_typeahead_called = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var get_by_email_called = false;
 | 
					    let get_by_email_called = false;
 | 
				
			||||||
    people.get_by_email = function (user_email) {
 | 
					    people.get_by_email = function (user_email) {
 | 
				
			||||||
        get_by_email_called = true;
 | 
					        get_by_email_called = true;
 | 
				
			||||||
        if (user_email === iago.email) {
 | 
					        if (user_email === iago.email) {
 | 
				
			||||||
@@ -293,14 +293,14 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    function test_create_item(handler) {
 | 
					    function test_create_item(handler) {
 | 
				
			||||||
        (function test_rejection_path() {
 | 
					        (function test_rejection_path() {
 | 
				
			||||||
            var item = handler(iago.email, pills.items());
 | 
					            const item = handler(iago.email, pills.items());
 | 
				
			||||||
            assert(get_by_email_called);
 | 
					            assert(get_by_email_called);
 | 
				
			||||||
            assert.equal(item, undefined);
 | 
					            assert.equal(item, undefined);
 | 
				
			||||||
        }());
 | 
					        }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (function test_success_path() {
 | 
					        (function test_success_path() {
 | 
				
			||||||
            get_by_email_called = false;
 | 
					            get_by_email_called = false;
 | 
				
			||||||
            var res = handler(bob.email, pills.items());
 | 
					            const res = handler(bob.email, pills.items());
 | 
				
			||||||
            assert(get_by_email_called);
 | 
					            assert(get_by_email_called);
 | 
				
			||||||
            assert.equal(typeof res, 'object');
 | 
					            assert.equal(typeof res, 'object');
 | 
				
			||||||
            assert.equal(res.user_id, bob.user_id);
 | 
					            assert.equal(res.user_id, bob.user_id);
 | 
				
			||||||
@@ -333,7 +333,7 @@ run_test('populate_user_groups', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
run_test('with_external_user', () => {
 | 
					run_test('with_external_user', () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var realm_user_group = {
 | 
					    const realm_user_group = {
 | 
				
			||||||
        id: 1,
 | 
					        id: 1,
 | 
				
			||||||
        name: 'Mobile',
 | 
					        name: 'Mobile',
 | 
				
			||||||
        description: 'All mobile people',
 | 
					        description: 'All mobile people',
 | 
				
			||||||
@@ -361,7 +361,7 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
        return noop;
 | 
					        return noop;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var can_edit_called = 0;
 | 
					    let can_edit_called = 0;
 | 
				
			||||||
    settings_user_groups.can_edit = function () {
 | 
					    settings_user_groups.can_edit = function () {
 | 
				
			||||||
        can_edit_called += 1;
 | 
					        can_edit_called += 1;
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
@@ -370,11 +370,11 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
    // Reset zjquery to test stuff with user who cannot edit
 | 
					    // Reset zjquery to test stuff with user who cannot edit
 | 
				
			||||||
    set_global('$', global.make_zjquery());
 | 
					    set_global('$', global.make_zjquery());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var user_group_find_called = 0;
 | 
					    let user_group_find_called = 0;
 | 
				
			||||||
    var user_group_stub = $('div.user-group[id="1"]');
 | 
					    const user_group_stub = $('div.user-group[id="1"]');
 | 
				
			||||||
    var name_field_stub = $.create('fake-name-field');
 | 
					    const name_field_stub = $.create('fake-name-field');
 | 
				
			||||||
    var description_field_stub = $.create('fake-description-field');
 | 
					    const description_field_stub = $.create('fake-description-field');
 | 
				
			||||||
    var input_stub = $.create('fake-input');
 | 
					    const input_stub = $.create('fake-input');
 | 
				
			||||||
    user_group_stub.find = function (elem) {
 | 
					    user_group_stub.find = function (elem) {
 | 
				
			||||||
        if (elem === '.name') {
 | 
					        if (elem === '.name') {
 | 
				
			||||||
            user_group_find_called += 1;
 | 
					            user_group_find_called += 1;
 | 
				
			||||||
@@ -386,9 +386,9 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var pill_container_stub = $('.pill-container[data-group-pills="1"]');
 | 
					    const pill_container_stub = $('.pill-container[data-group-pills="1"]');
 | 
				
			||||||
    var pill_stub = $.create('fake-pill');
 | 
					    const pill_stub = $.create('fake-pill');
 | 
				
			||||||
    var pill_container_find_called = 0;
 | 
					    let pill_container_find_called = 0;
 | 
				
			||||||
    pill_container_stub.find = function (elem) {
 | 
					    pill_container_stub.find = function (elem) {
 | 
				
			||||||
        if (elem === '.input') {
 | 
					        if (elem === '.input') {
 | 
				
			||||||
            pill_container_find_called += 1;
 | 
					            pill_container_find_called += 1;
 | 
				
			||||||
@@ -406,7 +406,7 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Test the 'off' handlers on the pill-container
 | 
					    // Test the 'off' handlers on the pill-container
 | 
				
			||||||
    var turned_off = {};
 | 
					    const turned_off = {};
 | 
				
			||||||
    pill_container_stub.off = function (event_name, sel) {
 | 
					    pill_container_stub.off = function (event_name, sel) {
 | 
				
			||||||
        if (sel === undefined) {
 | 
					        if (sel === undefined) {
 | 
				
			||||||
            sel = 'whole';
 | 
					            sel = 'whole';
 | 
				
			||||||
@@ -414,9 +414,9 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
        turned_off[event_name + '/' + sel] = true;
 | 
					        turned_off[event_name + '/' + sel] = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var pill_hover_called = false;
 | 
					    let pill_hover_called = false;
 | 
				
			||||||
    var callback;
 | 
					    let callback;
 | 
				
			||||||
    var empty_fn;
 | 
					    let empty_fn;
 | 
				
			||||||
    pill_stub.hover = function (one, two) {
 | 
					    pill_stub.hover = function (one, two) {
 | 
				
			||||||
        callback = one;
 | 
					        callback = one;
 | 
				
			||||||
        empty_fn = two;
 | 
					        empty_fn = two;
 | 
				
			||||||
@@ -425,9 +425,9 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
        assert.equal(typeof two, 'function');
 | 
					        assert.equal(typeof two, 'function');
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var exit_button = $.create('fake-pill-exit');
 | 
					    const exit_button = $.create('fake-pill-exit');
 | 
				
			||||||
    pill_stub.set_find_results('.exit', exit_button);
 | 
					    pill_stub.set_find_results('.exit', exit_button);
 | 
				
			||||||
    var exit_button_called = false;
 | 
					    let exit_button_called = false;
 | 
				
			||||||
    exit_button.css = function (property, value) {
 | 
					    exit_button.css = function (property, value) {
 | 
				
			||||||
        exit_button_called = true;
 | 
					        exit_button_called = true;
 | 
				
			||||||
        assert.equal(property, 'opacity');
 | 
					        assert.equal(property, 'opacity');
 | 
				
			||||||
@@ -447,32 +447,32 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    settings_user_groups.set_up();
 | 
					    settings_user_groups.set_up();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var set_parents_result_called = 0;
 | 
					    let set_parents_result_called = 0;
 | 
				
			||||||
    var set_attributes_called = 0;
 | 
					    let set_attributes_called = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Test different handlers with an external user
 | 
					    // Test different handlers with an external user
 | 
				
			||||||
    var delete_handler = $('#user-groups').get_on_handler('click', '.delete');
 | 
					    const delete_handler = $('#user-groups').get_on_handler('click', '.delete');
 | 
				
			||||||
    var fake_delete = $.create('fk-#user-groups.delete_btn');
 | 
					    const fake_delete = $.create('fk-#user-groups.delete_btn');
 | 
				
			||||||
    fake_delete.set_parents_result('.user-group', $('.user-group'));
 | 
					    fake_delete.set_parents_result('.user-group', $('.user-group'));
 | 
				
			||||||
    set_parents_result_called += 1;
 | 
					    set_parents_result_called += 1;
 | 
				
			||||||
    $('.user-group').attr('id', '1');
 | 
					    $('.user-group').attr('id', '1');
 | 
				
			||||||
    set_attributes_called += 1;
 | 
					    set_attributes_called += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var name_update_handler = $(user_group_selector).get_on_handler("input", ".name");
 | 
					    const name_update_handler = $(user_group_selector).get_on_handler("input", ".name");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var des_update_handler = $(user_group_selector).get_on_handler("input", ".description");
 | 
					    const des_update_handler = $(user_group_selector).get_on_handler("input", ".description");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var member_change_handler = $(user_group_selector).get_on_handler("blur", ".input");
 | 
					    const member_change_handler = $(user_group_selector).get_on_handler("blur", ".input");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var name_change_handler = $(user_group_selector).get_on_handler("blur", ".name");
 | 
					    const name_change_handler = $(user_group_selector).get_on_handler("blur", ".name");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var des_change_handler = $(user_group_selector).get_on_handler("blur", ".description");
 | 
					    const des_change_handler = $(user_group_selector).get_on_handler("blur", ".description");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var event = {
 | 
					    const event = {
 | 
				
			||||||
        stopPropagation: noop,
 | 
					        stopPropagation: noop,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    var pill_click_called = false;
 | 
					    let pill_click_called = false;
 | 
				
			||||||
    var pill_click_handler = pill_container_stub.get_on_handler('click');
 | 
					    const pill_click_handler = pill_container_stub.get_on_handler('click');
 | 
				
			||||||
    pill_click_called = true;
 | 
					    pill_click_called = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert(callback);
 | 
					    assert(callback);
 | 
				
			||||||
@@ -501,7 +501,7 @@ run_test('with_external_user', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
run_test('reload', () => {
 | 
					run_test('reload', () => {
 | 
				
			||||||
    $('#user-groups').html('Some text');
 | 
					    $('#user-groups').html('Some text');
 | 
				
			||||||
    var populate_user_groups_called = false;
 | 
					    let populate_user_groups_called = false;
 | 
				
			||||||
    settings_user_groups.populate_user_groups = function () {
 | 
					    settings_user_groups.populate_user_groups = function () {
 | 
				
			||||||
        populate_user_groups_called = true;
 | 
					        populate_user_groups_called = true;
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -512,7 +512,7 @@ run_test('reload', () => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
run_test('reset', () => {
 | 
					run_test('reset', () => {
 | 
				
			||||||
    settings_user_groups.reset();
 | 
					    settings_user_groups.reset();
 | 
				
			||||||
    var result = settings_user_groups.reload();
 | 
					    const result = settings_user_groups.reload();
 | 
				
			||||||
    assert.equal(result, undefined);
 | 
					    assert.equal(result, undefined);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -523,13 +523,13 @@ run_test('on_events', () => {
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function test_admin_user_group_form_submit_triggered() {
 | 
					    (function test_admin_user_group_form_submit_triggered() {
 | 
				
			||||||
        var handler = $('.organization form.admin-user-group-form').get_on_handler("submit");
 | 
					        const handler = $('.organization form.admin-user-group-form').get_on_handler("submit");
 | 
				
			||||||
        var event = {
 | 
					        const event = {
 | 
				
			||||||
            stopPropagation: noop,
 | 
					            stopPropagation: noop,
 | 
				
			||||||
            preventDefault: noop,
 | 
					            preventDefault: noop,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        var fake_this = $.create('fake-form.admin-user-group-form');
 | 
					        const fake_this = $.create('fake-form.admin-user-group-form');
 | 
				
			||||||
        var fake_object_array = [{
 | 
					        const fake_object_array = [{
 | 
				
			||||||
            name: 'fake-name',
 | 
					            name: 'fake-name',
 | 
				
			||||||
            value: '',
 | 
					            value: '',
 | 
				
			||||||
        }, {
 | 
					        }, {
 | 
				
			||||||
@@ -540,7 +540,7 @@ run_test('on_events', () => {
 | 
				
			|||||||
            return fake_object_array;
 | 
					            return fake_object_array;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        channel.post = function (opts) {
 | 
					        channel.post = function (opts) {
 | 
				
			||||||
            var data = {
 | 
					            const data = {
 | 
				
			||||||
                members: '[null]',
 | 
					                members: '[null]',
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            data[fake_object_array[1].name] = fake_object_array[1].value;
 | 
					            data[fake_object_array[1].name] = fake_object_array[1].value;
 | 
				
			||||||
@@ -564,14 +564,14 @@ run_test('on_events', () => {
 | 
				
			|||||||
            (function test_post_error() {
 | 
					            (function test_post_error() {
 | 
				
			||||||
                $('#admin-user-group-status').show();
 | 
					                $('#admin-user-group-status').show();
 | 
				
			||||||
                ui_report.error = function (error_msg, error_obj, ele) {
 | 
					                ui_report.error = function (error_msg, error_obj, ele) {
 | 
				
			||||||
                    var xhr = {
 | 
					                    const xhr = {
 | 
				
			||||||
                        responseText: '{"msg":"fake-msg"}',
 | 
					                        responseText: '{"msg":"fake-msg"}',
 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
                    assert.equal(error_msg, 'translated: Failed');
 | 
					                    assert.equal(error_msg, 'translated: Failed');
 | 
				
			||||||
                    assert.deepEqual(error_obj, xhr);
 | 
					                    assert.deepEqual(error_obj, xhr);
 | 
				
			||||||
                    assert.equal(ele, $('#admin-user-group-status'));
 | 
					                    assert.equal(ele, $('#admin-user-group-status'));
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                var xhr = {
 | 
					                const xhr = {
 | 
				
			||||||
                    responseText: '{"msg":"fake-msg", "attrib":"val"}',
 | 
					                    responseText: '{"msg":"fake-msg", "attrib":"val"}',
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                opts.error(xhr);
 | 
					                opts.error(xhr);
 | 
				
			||||||
@@ -584,16 +584,16 @@ run_test('on_events', () => {
 | 
				
			|||||||
    }());
 | 
					    }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function test_user_groups_delete_click_triggered() {
 | 
					    (function test_user_groups_delete_click_triggered() {
 | 
				
			||||||
        var handler = $('#user-groups').get_on_handler("click", ".delete");
 | 
					        const handler = $('#user-groups').get_on_handler("click", ".delete");
 | 
				
			||||||
        var fake_this = $.create('fake-#user-groups.delete_btn');
 | 
					        const fake_this = $.create('fake-#user-groups.delete_btn');
 | 
				
			||||||
        fake_this.set_parents_result('.user-group', $('.user-group'));
 | 
					        fake_this.set_parents_result('.user-group', $('.user-group'));
 | 
				
			||||||
        $('.user-group').attr('id', '1');
 | 
					        $('.user-group').attr('id', '1');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        channel.del = function (opts) {
 | 
					        channel.del = function (opts) {
 | 
				
			||||||
            var data = {
 | 
					            const data = {
 | 
				
			||||||
                id: 1,
 | 
					                id: 1,
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
            var settings_user_groups_reload_called = false;
 | 
					            let settings_user_groups_reload_called = false;
 | 
				
			||||||
            assert.equal(opts.url, "/json/user_groups/1");
 | 
					            assert.equal(opts.url, "/json/user_groups/1");
 | 
				
			||||||
            assert.deepEqual(opts.data, data);
 | 
					            assert.deepEqual(opts.data, data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -616,9 +616,9 @@ run_test('on_events', () => {
 | 
				
			|||||||
    }());
 | 
					    }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function test_user_groups_keypress_enter_triggered() {
 | 
					    (function test_user_groups_keypress_enter_triggered() {
 | 
				
			||||||
        var handler = $('#user-groups').get_on_handler("keypress", ".user-group h4 > span");
 | 
					        const handler = $('#user-groups').get_on_handler("keypress", ".user-group h4 > span");
 | 
				
			||||||
        var default_action_for_enter_stopped = false;
 | 
					        let default_action_for_enter_stopped = false;
 | 
				
			||||||
        var event = {
 | 
					        const event = {
 | 
				
			||||||
            which: 13,
 | 
					            which: 13,
 | 
				
			||||||
            preventDefault: function () {
 | 
					            preventDefault: function () {
 | 
				
			||||||
                default_action_for_enter_stopped = true;
 | 
					                default_action_for_enter_stopped = true;
 | 
				
			||||||
@@ -629,22 +629,22 @@ run_test('on_events', () => {
 | 
				
			|||||||
    }());
 | 
					    }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function test_do_not_blur() {
 | 
					    (function test_do_not_blur() {
 | 
				
			||||||
        var blur_event_classes = [".name", ".description", ".input"];
 | 
					        const blur_event_classes = [".name", ".description", ".input"];
 | 
				
			||||||
        var api_endpoint_called = false;
 | 
					        let api_endpoint_called = false;
 | 
				
			||||||
        channel.post = function () {
 | 
					        channel.post = function () {
 | 
				
			||||||
            api_endpoint_called = true;
 | 
					            api_endpoint_called = true;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        channel.patch = noop;
 | 
					        channel.patch = noop;
 | 
				
			||||||
        var fake_this = $.create('fake-#user-groups_do_not_blur');
 | 
					        const fake_this = $.create('fake-#user-groups_do_not_blur');
 | 
				
			||||||
        var event = {
 | 
					        const event = {
 | 
				
			||||||
            relatedTarget: fake_this,
 | 
					            relatedTarget: fake_this,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Any of the blur_exceptions trigger blur event.
 | 
					        // Any of the blur_exceptions trigger blur event.
 | 
				
			||||||
        _.each(blur_event_classes, function (class_name) {
 | 
					        _.each(blur_event_classes, function (class_name) {
 | 
				
			||||||
            var handler = $(user_group_selector).get_on_handler("blur", class_name);
 | 
					            const handler = $(user_group_selector).get_on_handler("blur", class_name);
 | 
				
			||||||
            var blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"],
 | 
					            const blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"],
 | 
				
			||||||
                                            class_name);
 | 
					                                              class_name);
 | 
				
			||||||
            _.each(blur_exceptions, function (blur_exception) {
 | 
					            _.each(blur_exceptions, function (blur_exception) {
 | 
				
			||||||
                api_endpoint_called = false;
 | 
					                api_endpoint_called = false;
 | 
				
			||||||
                fake_this.closest = function (class_name) {
 | 
					                fake_this.closest = function (class_name) {
 | 
				
			||||||
@@ -668,7 +668,7 @@ run_test('on_events', () => {
 | 
				
			|||||||
            assert(!api_endpoint_called);
 | 
					            assert(!api_endpoint_called);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Cancel button triggers blur event.
 | 
					            // Cancel button triggers blur event.
 | 
				
			||||||
            var settings_user_groups_reload_called = false;
 | 
					            let settings_user_groups_reload_called = false;
 | 
				
			||||||
            settings_user_groups.reload = function () {
 | 
					            settings_user_groups.reload = function () {
 | 
				
			||||||
                settings_user_groups_reload_called = true;
 | 
					                settings_user_groups_reload_called = true;
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
@@ -687,14 +687,14 @@ run_test('on_events', () => {
 | 
				
			|||||||
    }());
 | 
					    }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function test_update_cancel_button() {
 | 
					    (function test_update_cancel_button() {
 | 
				
			||||||
        var handler_name = $(user_group_selector).get_on_handler("input", ".name");
 | 
					        const handler_name = $(user_group_selector).get_on_handler("input", ".name");
 | 
				
			||||||
        var handler_desc = $(user_group_selector).get_on_handler("input", ".description");
 | 
					        const handler_desc = $(user_group_selector).get_on_handler("input", ".description");
 | 
				
			||||||
        var sib_des = $(description_selector);
 | 
					        const sib_des = $(description_selector);
 | 
				
			||||||
        var sib_name = $(name_selector);
 | 
					        const sib_name = $(name_selector);
 | 
				
			||||||
        sib_name.text(i18n.t('mobile'));
 | 
					        sib_name.text(i18n.t('mobile'));
 | 
				
			||||||
        sib_des.text(i18n.t('All mobile members'));
 | 
					        sib_des.text(i18n.t('All mobile members'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var group_data = {
 | 
					        const group_data = {
 | 
				
			||||||
            name: 'translated: mobile',
 | 
					            name: 'translated: mobile',
 | 
				
			||||||
            description: 'translated: All mobile members',
 | 
					            description: 'translated: All mobile members',
 | 
				
			||||||
            members: Dict.from_array([2, 31])};
 | 
					            members: Dict.from_array([2, 31])};
 | 
				
			||||||
@@ -702,8 +702,8 @@ run_test('on_events', () => {
 | 
				
			|||||||
            return group_data;
 | 
					            return group_data;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var cancel_fade_out_called = false;
 | 
					        let cancel_fade_out_called = false;
 | 
				
			||||||
        var instructions_fade_out_called = false;
 | 
					        let instructions_fade_out_called = false;
 | 
				
			||||||
        $(cancel_selector).show();
 | 
					        $(cancel_selector).show();
 | 
				
			||||||
        $(cancel_selector).fadeOut = function () {
 | 
					        $(cancel_selector).fadeOut = function () {
 | 
				
			||||||
            cancel_fade_out_called = true;
 | 
					            cancel_fade_out_called = true;
 | 
				
			||||||
@@ -713,7 +713,7 @@ run_test('on_events', () => {
 | 
				
			|||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Cancel button removed if user group if user group has no changes.
 | 
					        // Cancel button removed if user group if user group has no changes.
 | 
				
			||||||
        var fake_this = $.create('fake-#update_cancel_button');
 | 
					        const fake_this = $.create('fake-#update_cancel_button');
 | 
				
			||||||
        handler_name.call(fake_this);
 | 
					        handler_name.call(fake_this);
 | 
				
			||||||
        assert(cancel_fade_out_called);
 | 
					        assert(cancel_fade_out_called);
 | 
				
			||||||
        assert(instructions_fade_out_called);
 | 
					        assert(instructions_fade_out_called);
 | 
				
			||||||
@@ -735,21 +735,21 @@ run_test('on_events', () => {
 | 
				
			|||||||
    }());
 | 
					    }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function test_user_groups_save_group_changes_triggered() {
 | 
					    (function test_user_groups_save_group_changes_triggered() {
 | 
				
			||||||
        var handler_name = $(user_group_selector).get_on_handler("blur", ".name");
 | 
					        const handler_name = $(user_group_selector).get_on_handler("blur", ".name");
 | 
				
			||||||
        var handler_desc = $(user_group_selector).get_on_handler("blur", ".description");
 | 
					        const handler_desc = $(user_group_selector).get_on_handler("blur", ".description");
 | 
				
			||||||
        var sib_des = $(description_selector);
 | 
					        const sib_des = $(description_selector);
 | 
				
			||||||
        var sib_name = $(name_selector);
 | 
					        const sib_name = $(name_selector);
 | 
				
			||||||
        sib_name.text(i18n.t('mobile'));
 | 
					        sib_name.text(i18n.t('mobile'));
 | 
				
			||||||
        sib_des.text(i18n.t('All mobile members'));
 | 
					        sib_des.text(i18n.t('All mobile members'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var group_data = {members: Dict.from_array([2, 31])};
 | 
					        const group_data = {members: Dict.from_array([2, 31])};
 | 
				
			||||||
        user_groups.get_user_group_from_id = function () {
 | 
					        user_groups.get_user_group_from_id = function () {
 | 
				
			||||||
            return group_data;
 | 
					            return group_data;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        var api_endpoint_called = false;
 | 
					        let api_endpoint_called = false;
 | 
				
			||||||
        var cancel_fade_out_called = false;
 | 
					        let cancel_fade_out_called = false;
 | 
				
			||||||
        var saved_fade_to_called = false;
 | 
					        let saved_fade_to_called = false;
 | 
				
			||||||
        var instructions_fade_out_called = false;
 | 
					        let instructions_fade_out_called = false;
 | 
				
			||||||
        $(instructions_selector).fadeOut = function () {
 | 
					        $(instructions_selector).fadeOut = function () {
 | 
				
			||||||
            instructions_fade_out_called = true;
 | 
					            instructions_fade_out_called = true;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
@@ -785,17 +785,17 @@ run_test('on_events', () => {
 | 
				
			|||||||
                assert(saved_fade_to_called);
 | 
					                assert(saved_fade_to_called);
 | 
				
			||||||
            }());
 | 
					            }());
 | 
				
			||||||
            (function test_post_error() {
 | 
					            (function test_post_error() {
 | 
				
			||||||
                var user_group_error = $(user_group_selector + ' .user-group-status');
 | 
					                const user_group_error = $(user_group_selector + ' .user-group-status');
 | 
				
			||||||
                user_group_error.show();
 | 
					                user_group_error.show();
 | 
				
			||||||
                ui_report.error = function (error_msg, error_obj, ele) {
 | 
					                ui_report.error = function (error_msg, error_obj, ele) {
 | 
				
			||||||
                    var xhr = {
 | 
					                    const xhr = {
 | 
				
			||||||
                        responseText: '{"msg":"fake-msg"}',
 | 
					                        responseText: '{"msg":"fake-msg"}',
 | 
				
			||||||
                    };
 | 
					                    };
 | 
				
			||||||
                    assert.equal(error_msg, 'translated: Failed');
 | 
					                    assert.equal(error_msg, 'translated: Failed');
 | 
				
			||||||
                    assert.deepEqual(error_obj, xhr);
 | 
					                    assert.deepEqual(error_obj, xhr);
 | 
				
			||||||
                    assert.equal(ele, user_group_error);
 | 
					                    assert.equal(ele, user_group_error);
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                var xhr = {
 | 
					                const xhr = {
 | 
				
			||||||
                    responseText: '{"msg":"fake-msg", "attrib":"val"}',
 | 
					                    responseText: '{"msg":"fake-msg", "attrib":"val"}',
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                opts.error(xhr);
 | 
					                opts.error(xhr);
 | 
				
			||||||
@@ -804,12 +804,12 @@ run_test('on_events', () => {
 | 
				
			|||||||
            }());
 | 
					            }());
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var fake_this = $.create('fake-#user-groups_blur_name');
 | 
					        const fake_this = $.create('fake-#user-groups_blur_name');
 | 
				
			||||||
        fake_this.closest = function () {
 | 
					        fake_this.closest = function () {
 | 
				
			||||||
            return [];
 | 
					            return [];
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        fake_this.set_parents_result(user_group_selector, $(user_group_selector));
 | 
					        fake_this.set_parents_result(user_group_selector, $(user_group_selector));
 | 
				
			||||||
        var event = {
 | 
					        const event = {
 | 
				
			||||||
            relatedTarget: fake_this,
 | 
					            relatedTarget: fake_this,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -831,8 +831,8 @@ run_test('on_events', () => {
 | 
				
			|||||||
    }());
 | 
					    }());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function test_user_groups_save_member_changes_triggered() {
 | 
					    (function test_user_groups_save_member_changes_triggered() {
 | 
				
			||||||
        var handler = $(user_group_selector).get_on_handler("blur", ".input");
 | 
					        const handler = $(user_group_selector).get_on_handler("blur", ".input");
 | 
				
			||||||
        var realm_user_group = {
 | 
					        const realm_user_group = {
 | 
				
			||||||
            id: 1,
 | 
					            id: 1,
 | 
				
			||||||
            name: 'Mobile',
 | 
					            name: 'Mobile',
 | 
				
			||||||
            description: 'All mobile people',
 | 
					            description: 'All mobile people',
 | 
				
			||||||
@@ -844,9 +844,9 @@ run_test('on_events', () => {
 | 
				
			|||||||
            return realm_user_group;
 | 
					            return realm_user_group;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var cancel_fade_out_called = false;
 | 
					        let cancel_fade_out_called = false;
 | 
				
			||||||
        var saved_fade_to_called = false;
 | 
					        let saved_fade_to_called = false;
 | 
				
			||||||
        var instructions_fade_out_called = false;
 | 
					        let instructions_fade_out_called = false;
 | 
				
			||||||
        $(instructions_selector).fadeOut = function () {
 | 
					        $(instructions_selector).fadeOut = function () {
 | 
				
			||||||
            instructions_fade_out_called = true;
 | 
					            instructions_fade_out_called = true;
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
@@ -861,7 +861,7 @@ run_test('on_events', () => {
 | 
				
			|||||||
            return $(saved_selector);
 | 
					            return $(saved_selector);
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var api_endpoint_called = false;
 | 
					        let api_endpoint_called = false;
 | 
				
			||||||
        channel.post = function (opts) {
 | 
					        channel.post = function (opts) {
 | 
				
			||||||
            assert.equal(opts.url, "/json/user_groups/1/members");
 | 
					            assert.equal(opts.url, "/json/user_groups/1/members");
 | 
				
			||||||
            assert.equal(opts.data.add, '[31]');
 | 
					            assert.equal(opts.data.add, '[31]');
 | 
				
			||||||
@@ -876,12 +876,12 @@ run_test('on_events', () => {
 | 
				
			|||||||
            }());
 | 
					            }());
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var fake_this = $.create('fake-#user-groups_blur_input');
 | 
					        const fake_this = $.create('fake-#user-groups_blur_input');
 | 
				
			||||||
        fake_this.set_parents_result(user_group_selector, $(user_group_selector));
 | 
					        fake_this.set_parents_result(user_group_selector, $(user_group_selector));
 | 
				
			||||||
        fake_this.closest = function () {
 | 
					        fake_this.closest = function () {
 | 
				
			||||||
            return [];
 | 
					            return [];
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        var event = {
 | 
					        const event = {
 | 
				
			||||||
            relatedTarget: fake_this,
 | 
					            relatedTarget: fake_this,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1590,7 +1590,7 @@ run_test('user_presence_rows', () => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
run_test('buddy_list_tooltip_content', () => {
 | 
					run_test('buddy_list_tooltip_content', () => {
 | 
				
			||||||
    var args = {
 | 
					    const args = {
 | 
				
			||||||
        status_text: 'out to lunch',
 | 
					        status_text: 'out to lunch',
 | 
				
			||||||
        last_seen: 'Active now',
 | 
					        last_seen: 'Active now',
 | 
				
			||||||
        is_away: false,
 | 
					        is_away: false,
 | 
				
			||||||
@@ -1598,8 +1598,8 @@ run_test('buddy_list_tooltip_content', () => {
 | 
				
			|||||||
        online_now: true,
 | 
					        online_now: true,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var html = render('buddy_list_tooltip_content', args);
 | 
					    const html = render('buddy_list_tooltip_content', args);
 | 
				
			||||||
    var tooltip_content = $(html).find(".tooltip_inner_content");
 | 
					    const tooltip_content = $(html).find(".tooltip_inner_content");
 | 
				
			||||||
    assert.equal(tooltip_content.text().trim(), 'Iagoout to lunchActive now');
 | 
					    assert.equal(tooltip_content.text().trim(), 'Iagoout to lunchActive now');
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.max_size_before_shrinking = 600;
 | 
					exports.max_size_before_shrinking = 600;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var fade_config = {
 | 
					const fade_config = {
 | 
				
			||||||
    get_user_id: function (item) {
 | 
					    get_user_id: function (item) {
 | 
				
			||||||
        return item.user_id;
 | 
					        return item.user_id;
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
@@ -22,7 +22,7 @@ var fade_config = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.get_user_circle_class = function (user_id) {
 | 
					exports.get_user_circle_class = function (user_id) {
 | 
				
			||||||
    var status = exports.buddy_status(user_id);
 | 
					    const status = exports.buddy_status(user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (status) {
 | 
					    switch (status) {
 | 
				
			||||||
    case 'active':
 | 
					    case 'active':
 | 
				
			||||||
@@ -38,7 +38,7 @@ exports.get_user_circle_class = function (user_id) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.status_description = function (user_id) {
 | 
					exports.status_description = function (user_id) {
 | 
				
			||||||
    var status = exports.buddy_status(user_id);
 | 
					    const status = exports.buddy_status(user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (status) {
 | 
					    switch (status) {
 | 
				
			||||||
    case 'active':
 | 
					    case 'active':
 | 
				
			||||||
@@ -59,7 +59,7 @@ exports.level = function (user_id) {
 | 
				
			|||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var status = exports.buddy_status(user_id);
 | 
					    const status = exports.buddy_status(user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (status) {
 | 
					    switch (status) {
 | 
				
			||||||
    case 'active':
 | 
					    case 'active':
 | 
				
			||||||
@@ -87,19 +87,19 @@ exports.buddy_status = function (user_id) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.compare_function = function (a, b) {
 | 
					exports.compare_function = function (a, b) {
 | 
				
			||||||
    var level_a = exports.level(a);
 | 
					    const level_a = exports.level(a);
 | 
				
			||||||
    var level_b = exports.level(b);
 | 
					    const level_b = exports.level(b);
 | 
				
			||||||
    var diff = level_a - level_b;
 | 
					    const diff = level_a - level_b;
 | 
				
			||||||
    if (diff !== 0) {
 | 
					    if (diff !== 0) {
 | 
				
			||||||
        return diff;
 | 
					        return diff;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Sort equivalent PM names alphabetically
 | 
					    // Sort equivalent PM names alphabetically
 | 
				
			||||||
    var person_a = people.get_person_from_user_id(a);
 | 
					    const person_a = people.get_person_from_user_id(a);
 | 
				
			||||||
    var person_b = people.get_person_from_user_id(b);
 | 
					    const person_b = people.get_person_from_user_id(b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var full_name_a = person_a ? person_a.full_name : '';
 | 
					    const full_name_a = person_a ? person_a.full_name : '';
 | 
				
			||||||
    var full_name_b = person_b ? person_b.full_name : '';
 | 
					    const full_name_b = person_b ? person_b.full_name : '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return util.strcmp(full_name_a, full_name_b);
 | 
					    return util.strcmp(full_name_a, full_name_b);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -117,16 +117,16 @@ function filter_user_ids(filter_text, user_ids) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    user_ids = _.reject(user_ids, people.is_my_user_id);
 | 
					    user_ids = _.reject(user_ids, people.is_my_user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var search_terms = filter_text.toLowerCase().split(/[|,]+/);
 | 
					    let search_terms = filter_text.toLowerCase().split(/[|,]+/);
 | 
				
			||||||
    search_terms = _.map(search_terms, function (s) {
 | 
					    search_terms = _.map(search_terms, function (s) {
 | 
				
			||||||
        return s.trim();
 | 
					        return s.trim();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var persons = _.map(user_ids, function (user_id) {
 | 
					    const persons = _.map(user_ids, function (user_id) {
 | 
				
			||||||
        return people.get_person_from_user_id(user_id);
 | 
					        return people.get_person_from_user_id(user_id);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var user_id_dict = people.filter_people_by_search_terms(persons, search_terms);
 | 
					    const user_id_dict = people.filter_people_by_search_terms(persons, search_terms);
 | 
				
			||||||
    return user_id_dict.keys();
 | 
					    return user_id_dict.keys();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -156,7 +156,7 @@ exports.my_user_status = function (user_id) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.user_last_seen_time_status = function (user_id) {
 | 
					exports.user_last_seen_time_status = function (user_id) {
 | 
				
			||||||
    var status = presence.get_status(user_id);
 | 
					    const status = presence.get_status(user_id);
 | 
				
			||||||
    if (status === "active") {
 | 
					    if (status === "active") {
 | 
				
			||||||
        return i18n.t("Active now");
 | 
					        return i18n.t("Active now");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -172,7 +172,7 @@ exports.user_last_seen_time_status = function (user_id) {
 | 
				
			|||||||
    // may have queries on presence that go back only N weeks).
 | 
					    // may have queries on presence that go back only N weeks).
 | 
				
			||||||
    //
 | 
					    //
 | 
				
			||||||
    // We give the somewhat vague status of "Unknown" for these users.
 | 
					    // We give the somewhat vague status of "Unknown" for these users.
 | 
				
			||||||
    var last_active_date = presence.last_active_date(user_id);
 | 
					    const last_active_date = presence.last_active_date(user_id);
 | 
				
			||||||
    if (last_active_date === undefined) {
 | 
					    if (last_active_date === undefined) {
 | 
				
			||||||
        return i18n.t("More than 2 weeks ago");
 | 
					        return i18n.t("More than 2 weeks ago");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -180,10 +180,10 @@ exports.user_last_seen_time_status = function (user_id) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.info_for = function (user_id) {
 | 
					exports.info_for = function (user_id) {
 | 
				
			||||||
    var user_circle_class = exports.get_user_circle_class(user_id);
 | 
					    const user_circle_class = exports.get_user_circle_class(user_id);
 | 
				
			||||||
    var person = people.get_person_from_user_id(user_id);
 | 
					    const person = people.get_person_from_user_id(user_id);
 | 
				
			||||||
    var my_user_status = exports.my_user_status(user_id);
 | 
					    const my_user_status = exports.my_user_status(user_id);
 | 
				
			||||||
    var user_circle_status = exports.status_description(user_id);
 | 
					    const user_circle_status = exports.status_description(user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
        href: hash_util.pm_with_uri(person.email),
 | 
					        href: hash_util.pm_with_uri(person.email),
 | 
				
			||||||
@@ -208,9 +208,9 @@ exports.get_title_data = function (user_ids_string, is_group) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Since it's not a group, user_ids_string is a single user ID.
 | 
					    // Since it's not a group, user_ids_string is a single user ID.
 | 
				
			||||||
    var user_id = user_ids_string;
 | 
					    const user_id = user_ids_string;
 | 
				
			||||||
    var person = people.get_person_from_user_id(user_id);
 | 
					    const person = people.get_person_from_user_id(user_id);
 | 
				
			||||||
    var bot_owner_exists = false;
 | 
					    let bot_owner_exists = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (person.is_bot) {
 | 
					    if (person.is_bot) {
 | 
				
			||||||
        if (person.bot_owner_id !== null) {
 | 
					        if (person.bot_owner_id !== null) {
 | 
				
			||||||
@@ -231,9 +231,9 @@ exports.get_title_data = function (user_ids_string, is_group) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // For buddy list and individual PMS.  Since is_group=False, it's
 | 
					    // For buddy list and individual PMS.  Since is_group=False, it's
 | 
				
			||||||
    // a single, human, user.
 | 
					    // a single, human, user.
 | 
				
			||||||
    var active_status = presence.get_status(user_id);
 | 
					    const active_status = presence.get_status(user_id);
 | 
				
			||||||
    var last_seen = exports.user_last_seen_time_status(user_id);
 | 
					    const last_seen = exports.user_last_seen_time_status(user_id);
 | 
				
			||||||
    var online_now = active_status === 'active';
 | 
					    const online_now = active_status === 'active';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
        is_group: '',
 | 
					        is_group: '',
 | 
				
			||||||
@@ -247,7 +247,7 @@ exports.get_title_data = function (user_ids_string, is_group) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.get_item = function (user_id) {
 | 
					exports.get_item = function (user_id) {
 | 
				
			||||||
    var info = exports.info_for(user_id);
 | 
					    const info = exports.info_for(user_id);
 | 
				
			||||||
    compose_fade.update_user_info([info], fade_config);
 | 
					    compose_fade.update_user_info([info], fade_config);
 | 
				
			||||||
    return info;
 | 
					    return info;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -278,7 +278,7 @@ function maybe_shrink_list(user_ids, filter_text) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.get_filtered_and_sorted_user_ids = function (filter_text) {
 | 
					exports.get_filtered_and_sorted_user_ids = function (filter_text) {
 | 
				
			||||||
    var user_ids;
 | 
					    let user_ids;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (filter_text) {
 | 
					    if (filter_text) {
 | 
				
			||||||
        // If there's a filter, select from all users, not just those
 | 
					        // If there's a filter, select from all users, not just those
 | 
				
			||||||
@@ -292,7 +292,7 @@ exports.get_filtered_and_sorted_user_ids = function (filter_text) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    user_ids = _.filter(user_ids, function (user_id) {
 | 
					    user_ids = _.filter(user_ids, function (user_id) {
 | 
				
			||||||
        var person = people.get_person_from_user_id(user_id);
 | 
					        const person = people.get_person_from_user_id(user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (person) {
 | 
					        if (person) {
 | 
				
			||||||
            // if the user is bot, do not show in presence data.
 | 
					            // if the user is bot, do not show in presence data.
 | 
				
			||||||
@@ -310,7 +310,7 @@ exports.get_filtered_and_sorted_user_ids = function (filter_text) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.get_items_for_users = function (user_ids) {
 | 
					exports.get_items_for_users = function (user_ids) {
 | 
				
			||||||
    var user_info = _.map(user_ids, exports.info_for).filter(function (person) {
 | 
					    const user_info = _.map(user_ids, exports.info_for).filter(function (person) {
 | 
				
			||||||
        // filtered bots and yourself are set to "undefined" in the `info_for`
 | 
					        // filtered bots and yourself are set to "undefined" in the `info_for`
 | 
				
			||||||
        // function.
 | 
					        // function.
 | 
				
			||||||
        return typeof person !== "undefined";
 | 
					        return typeof person !== "undefined";
 | 
				
			||||||
@@ -322,9 +322,9 @@ exports.get_items_for_users = function (user_ids) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.huddle_fraction_present = function (huddle) {
 | 
					exports.huddle_fraction_present = function (huddle) {
 | 
				
			||||||
    var user_ids = huddle.split(',');
 | 
					    const user_ids = huddle.split(',');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var num_present = 0;
 | 
					    let num_present = 0;
 | 
				
			||||||
    _.each(user_ids, function (user_id) {
 | 
					    _.each(user_ids, function (user_id) {
 | 
				
			||||||
        if (presence.is_active(user_id)) {
 | 
					        if (presence.is_active(user_id)) {
 | 
				
			||||||
            num_present += 1;
 | 
					            num_present += 1;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,15 +1,15 @@
 | 
				
			|||||||
// You won't find every click handler here, but it's a good place to start!
 | 
					// You won't find every click handler here, but it's a good place to start!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var render_buddy_list_tooltip = require('../templates/buddy_list_tooltip.hbs');
 | 
					const render_buddy_list_tooltip = require('../templates/buddy_list_tooltip.hbs');
 | 
				
			||||||
var render_buddy_list_tooltip_content = require('../templates/buddy_list_tooltip_content.hbs');
 | 
					const render_buddy_list_tooltip_content = require('../templates/buddy_list_tooltip_content.hbs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.initialize = function () {
 | 
					exports.initialize = function () {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // MOUSE MOVING VS DRAGGING FOR SELECTION DATA TRACKING
 | 
					    // MOUSE MOVING VS DRAGGING FOR SELECTION DATA TRACKING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var drag = (function () {
 | 
					    const drag = (function () {
 | 
				
			||||||
        var start;
 | 
					        let start;
 | 
				
			||||||
        var time;
 | 
					        let time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            start: function (e) {
 | 
					            start: function (e) {
 | 
				
			||||||
@@ -18,9 +18,9 @@ exports.initialize = function () {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            end: function (e) {
 | 
					            end: function (e) {
 | 
				
			||||||
                var end = { x: e.offsetX, y: e.offsetY };
 | 
					                const end = { x: e.offsetX, y: e.offsetY };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                var dist;
 | 
					                let dist;
 | 
				
			||||||
                if (start) {
 | 
					                if (start) {
 | 
				
			||||||
                    // get the linear difference between two coordinates on the screen.
 | 
					                    // get the linear difference between two coordinates on the screen.
 | 
				
			||||||
                    dist = Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2));
 | 
					                    dist = Math.sqrt(Math.pow(end.x - start.x, 2) + Math.pow(end.y - start.y, 2));
 | 
				
			||||||
@@ -60,8 +60,8 @@ exports.initialize = function () {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function initialize_long_tap() {
 | 
					    function initialize_long_tap() {
 | 
				
			||||||
        var MS_DELAY = 750;
 | 
					        const MS_DELAY = 750;
 | 
				
			||||||
        var meta = {
 | 
					        const meta = {
 | 
				
			||||||
            touchdown: false,
 | 
					            touchdown: false,
 | 
				
			||||||
            current_target: undefined,
 | 
					            current_target: undefined,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
@@ -69,7 +69,7 @@ exports.initialize = function () {
 | 
				
			|||||||
        $("#main_div").on("touchstart", ".messagebox", function () {
 | 
					        $("#main_div").on("touchstart", ".messagebox", function () {
 | 
				
			||||||
            meta.touchdown = true;
 | 
					            meta.touchdown = true;
 | 
				
			||||||
            meta.invalid = false;
 | 
					            meta.invalid = false;
 | 
				
			||||||
            var id = rows.id($(this).closest(".message_row"));
 | 
					            const id = rows.id($(this).closest(".message_row"));
 | 
				
			||||||
            meta.current_target = id;
 | 
					            meta.current_target = id;
 | 
				
			||||||
            if (!id) {
 | 
					            if (!id) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
@@ -111,7 +111,7 @@ exports.initialize = function () {
 | 
				
			|||||||
        initialize_long_tap();
 | 
					        initialize_long_tap();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var select_message_function = function (e) {
 | 
					    const select_message_function = function (e) {
 | 
				
			||||||
        if (is_clickable_message_element($(e.target))) {
 | 
					        if (is_clickable_message_element($(e.target))) {
 | 
				
			||||||
            // If this click came from a hyperlink, don't trigger the
 | 
					            // If this click came from a hyperlink, don't trigger the
 | 
				
			||||||
            // reply action.  The simple way of doing this is simply
 | 
					            // reply action.  The simple way of doing this is simply
 | 
				
			||||||
@@ -139,8 +139,8 @@ exports.initialize = function () {
 | 
				
			|||||||
        // older browsers, we may be able to use the window.selection
 | 
					        // older browsers, we may be able to use the window.selection
 | 
				
			||||||
        // API instead.
 | 
					        // API instead.
 | 
				
			||||||
        if (drag.val < 5 && drag.time < 150 || drag.val < 2) {
 | 
					        if (drag.val < 5 && drag.time < 150 || drag.val < 2) {
 | 
				
			||||||
            var row = $(this).closest(".message_row");
 | 
					            const row = $(this).closest(".message_row");
 | 
				
			||||||
            var id = rows.id(row);
 | 
					            const id = rows.id(row);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (message_edit.is_editing(id)) {
 | 
					            if (message_edit.is_editing(id)) {
 | 
				
			||||||
                // Clicks on a message being edited shouldn't trigger a reply.
 | 
					                // Clicks on a message being edited shouldn't trigger a reply.
 | 
				
			||||||
@@ -162,7 +162,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        $("#main_div").on("longtap", ".messagebox", function (e) {
 | 
					        $("#main_div").on("longtap", ".messagebox", function (e) {
 | 
				
			||||||
            // find the correct selection API for the browser.
 | 
					            // find the correct selection API for the browser.
 | 
				
			||||||
            var sel = window.getSelection ? window.getSelection() : document.selection;
 | 
					            const sel = window.getSelection ? window.getSelection() : document.selection;
 | 
				
			||||||
            // if one matches, remove the current selections.
 | 
					            // if one matches, remove the current selections.
 | 
				
			||||||
            // after a longtap that is valid, there should be no text selected.
 | 
					            // after a longtap that is valid, there should be no text selected.
 | 
				
			||||||
            if (sel) {
 | 
					            if (sel) {
 | 
				
			||||||
@@ -181,15 +181,15 @@ exports.initialize = function () {
 | 
				
			|||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var message_id = rows.id($(this).closest(".message_row"));
 | 
					        const message_id = rows.id($(this).closest(".message_row"));
 | 
				
			||||||
        var message = message_store.get(message_id);
 | 
					        const message = message_store.get(message_id);
 | 
				
			||||||
        message_flags.toggle_starred_and_update_server(message);
 | 
					        message_flags.toggle_starred_and_update_server(message);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("#main_div").on("click", ".message_reaction", function (e) {
 | 
					    $("#main_div").on("click", ".message_reaction", function (e) {
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var local_id = $(this).attr('data-reaction-id');
 | 
					        const local_id = $(this).attr('data-reaction-id');
 | 
				
			||||||
        var message_id = rows.get_message_id(this);
 | 
					        const message_id = rows.get_message_id(this);
 | 
				
			||||||
        reactions.process_reaction_click(message_id, local_id);
 | 
					        reactions.process_reaction_click(message_id, local_id);
 | 
				
			||||||
        $(".tooltip").remove();
 | 
					        $(".tooltip").remove();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -208,10 +208,10 @@ exports.initialize = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.message_edit_notice', function (e) {
 | 
					    $('body').on('click', '.message_edit_notice', function (e) {
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
        var message_id = rows.id($(e.currentTarget).closest(".message_row"));
 | 
					        const message_id = rows.id($(e.currentTarget).closest(".message_row"));
 | 
				
			||||||
        var row = current_msg_list.get_row(message_id);
 | 
					        const row = current_msg_list.get_row(message_id);
 | 
				
			||||||
        var message = current_msg_list.get(rows.id(row));
 | 
					        const message = current_msg_list.get(rows.id(row));
 | 
				
			||||||
        var message_history_cancel_btn = $('#message-history-cancel');
 | 
					        const message_history_cancel_btn = $('#message-history-cancel');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (page_params.realm_allow_edit_history) {
 | 
					        if (page_params.realm_allow_edit_history) {
 | 
				
			||||||
            message_edit.show_history(message);
 | 
					            message_edit.show_history(message);
 | 
				
			||||||
@@ -225,10 +225,10 @@ exports.initialize = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $('#main_div').on('mouseenter', '.message_reaction', function (e) {
 | 
					    $('#main_div').on('mouseenter', '.message_reaction', function (e) {
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var elem = $(e.currentTarget);
 | 
					        const elem = $(e.currentTarget);
 | 
				
			||||||
        var local_id = elem.attr('data-reaction-id');
 | 
					        const local_id = elem.attr('data-reaction-id');
 | 
				
			||||||
        var message_id = rows.get_message_id(e.currentTarget);
 | 
					        const message_id = rows.get_message_id(e.currentTarget);
 | 
				
			||||||
        var title = reactions.get_reaction_title_data(message_id, local_id);
 | 
					        const title = reactions.get_reaction_title_data(message_id, local_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        elem.tooltip({
 | 
					        elem.tooltip({
 | 
				
			||||||
            title: title,
 | 
					            title: title,
 | 
				
			||||||
@@ -258,7 +258,7 @@ exports.initialize = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        // Note that we may have an href here, but we trust the stream id more,
 | 
					        // Note that we may have an href here, but we trust the stream id more,
 | 
				
			||||||
        // so we re-encode the hash.
 | 
					        // so we re-encode the hash.
 | 
				
			||||||
        var stream_id = $(this).attr('data-stream-id');
 | 
					        const stream_id = $(this).attr('data-stream-id');
 | 
				
			||||||
        if (stream_id) {
 | 
					        if (stream_id) {
 | 
				
			||||||
            hashchange.go_to_location(hash_util.by_stream_uri(stream_id));
 | 
					            hashchange.go_to_location(hash_util.by_stream_uri(stream_id));
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -270,7 +270,7 @@ exports.initialize = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $(".user-status-value").on("click", function (e) {
 | 
					    $(".user-status-value").on("click", function (e) {
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var user_status_value = $(e.currentTarget).attr("data-user-status-value");
 | 
					        const user_status_value = $(e.currentTarget).attr("data-user-status-value");
 | 
				
			||||||
        $("input.user_status").val(user_status_value);
 | 
					        $("input.user_status").val(user_status_value);
 | 
				
			||||||
        user_status_ui.toggle_clear_message_button();
 | 
					        user_status_ui.toggle_clear_message_button();
 | 
				
			||||||
        user_status_ui.update_button();
 | 
					        user_status_ui.update_button();
 | 
				
			||||||
@@ -279,7 +279,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    // NOTIFICATION CLICK
 | 
					    // NOTIFICATION CLICK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.notification', function () {
 | 
					    $('body').on('click', '.notification', function () {
 | 
				
			||||||
        var payload = $(this).data("narrow");
 | 
					        const payload = $(this).data("narrow");
 | 
				
			||||||
        ui_util.change_tab_to('#home');
 | 
					        ui_util.change_tab_to('#home');
 | 
				
			||||||
        narrow.activate(payload.raw_operators, payload.opts_notif);
 | 
					        narrow.activate(payload.raw_operators, payload.opts_notif);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -287,51 +287,51 @@ exports.initialize = function () {
 | 
				
			|||||||
    // MESSAGE EDITING
 | 
					    // MESSAGE EDITING
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.edit_content_button', function (e) {
 | 
					    $('body').on('click', '.edit_content_button', function (e) {
 | 
				
			||||||
        var row = current_msg_list.get_row(rows.id($(this).closest(".message_row")));
 | 
					        const row = current_msg_list.get_row(rows.id($(this).closest(".message_row")));
 | 
				
			||||||
        current_msg_list.select_id(rows.id(row));
 | 
					        current_msg_list.select_id(rows.id(row));
 | 
				
			||||||
        message_edit.start(row);
 | 
					        message_edit.start(row);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $('body').on('click', '.always_visible_topic_edit,.on_hover_topic_edit', function (e) {
 | 
					    $('body').on('click', '.always_visible_topic_edit,.on_hover_topic_edit', function (e) {
 | 
				
			||||||
        var recipient_row = $(this).closest(".recipient_row");
 | 
					        const recipient_row = $(this).closest(".recipient_row");
 | 
				
			||||||
        message_edit.start_topic_edit(recipient_row);
 | 
					        message_edit.start_topic_edit(recipient_row);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $("body").on("click", ".topic_edit_save", function (e) {
 | 
					    $("body").on("click", ".topic_edit_save", function (e) {
 | 
				
			||||||
        var recipient_row = $(this).closest(".recipient_row");
 | 
					        const recipient_row = $(this).closest(".recipient_row");
 | 
				
			||||||
        message_edit.show_topic_edit_spinner(recipient_row);
 | 
					        message_edit.show_topic_edit_spinner(recipient_row);
 | 
				
			||||||
        message_edit.save(recipient_row, true);
 | 
					        message_edit.save(recipient_row, true);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $("body").on("click", ".topic_edit_cancel", function (e) {
 | 
					    $("body").on("click", ".topic_edit_cancel", function (e) {
 | 
				
			||||||
        var recipient_row = $(this).closest(".recipient_row");
 | 
					        const recipient_row = $(this).closest(".recipient_row");
 | 
				
			||||||
        current_msg_list.hide_edit_topic(recipient_row);
 | 
					        current_msg_list.hide_edit_topic(recipient_row);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $("body").on("click", ".message_edit_save", function (e) {
 | 
					    $("body").on("click", ".message_edit_save", function (e) {
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        message_edit.save(row, false);
 | 
					        message_edit.save(row, false);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $("body").on("click", ".message_edit_cancel", function (e) {
 | 
					    $("body").on("click", ".message_edit_cancel", function (e) {
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        message_edit.end(row);
 | 
					        message_edit.end(row);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $("body").on("click", ".message_edit_close", function (e) {
 | 
					    $("body").on("click", ".message_edit_close", function (e) {
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        message_edit.end(row);
 | 
					        message_edit.end(row);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $("body").on("click", ".copy_message", function (e) {
 | 
					    $("body").on("click", ".copy_message", function (e) {
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        message_edit.end(row);
 | 
					        message_edit.end(row);
 | 
				
			||||||
        row.find(".alert-msg").text(i18n.t("Copied!"));
 | 
					        row.find(".alert-msg").text(i18n.t("Copied!"));
 | 
				
			||||||
        row.find(".alert-msg").css("display", "block");
 | 
					        row.find(".alert-msg").css("display", "block");
 | 
				
			||||||
@@ -345,26 +345,26 @@ exports.initialize = function () {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $('#message_edit_form .send-status-close').click(function () {
 | 
					    $('#message_edit_form .send-status-close').click(function () {
 | 
				
			||||||
        var row_id = rows.id($(this).closest(".message_row"));
 | 
					        const row_id = rows.id($(this).closest(".message_row"));
 | 
				
			||||||
        var send_status = $('#message-edit-send-status-' + row_id);
 | 
					        const send_status = $('#message-edit-send-status-' + row_id);
 | 
				
			||||||
        $(send_status).stop(true).fadeOut(200);
 | 
					        $(send_status).stop(true).fadeOut(200);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $("body").on("click", "#message_edit_form [id^='attach_files_']", function (e) {
 | 
					    $("body").on("click", "#message_edit_form [id^='attach_files_']", function (e) {
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var row_id = rows.id($(this).closest(".message_row"));
 | 
					        const row_id = rows.id($(this).closest(".message_row"));
 | 
				
			||||||
        $("#message_edit_file_input_" + row_id).trigger("click");
 | 
					        $("#message_edit_file_input_" + row_id).trigger("click");
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("body").on("click", "#message_edit_form [id^='markdown_preview_']", function (e) {
 | 
					    $("body").on("click", "#message_edit_form [id^='markdown_preview_']", function (e) {
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var row_id = rows.id($(this).closest(".message_row"));
 | 
					        const row_id = rows.id($(this).closest(".message_row"));
 | 
				
			||||||
        function $_(selector) {
 | 
					        function $_(selector) {
 | 
				
			||||||
            return $(selector + "_" + row_id);
 | 
					            return $(selector + "_" + row_id);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var content = $_("#message_edit_content").val();
 | 
					        const content = $_("#message_edit_content").val();
 | 
				
			||||||
        $_("#message_edit_content").hide();
 | 
					        $_("#message_edit_content").hide();
 | 
				
			||||||
        $_("#markdown_preview").hide();
 | 
					        $_("#markdown_preview").hide();
 | 
				
			||||||
        $_("#undo_markdown_preview").show();
 | 
					        $_("#undo_markdown_preview").show();
 | 
				
			||||||
@@ -376,7 +376,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    $("body").on("click", "#message_edit_form [id^='undo_markdown_preview_']", function (e) {
 | 
					    $("body").on("click", "#message_edit_form [id^='undo_markdown_preview_']", function (e) {
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var row_id = rows.id($(this).closest(".message_row"));
 | 
					        const row_id = rows.id($(this).closest(".message_row"));
 | 
				
			||||||
        function $_(selector) {
 | 
					        function $_(selector) {
 | 
				
			||||||
            return $(selector + "_" + row_id);
 | 
					            return $(selector + "_" + row_id);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -392,19 +392,19 @@ exports.initialize = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.on_hover_topic_mute', function (e) {
 | 
					    $('body').on('click', '.on_hover_topic_mute', function (e) {
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var stream_id = $(e.currentTarget).attr('data-stream-id');
 | 
					        const stream_id = $(e.currentTarget).attr('data-stream-id');
 | 
				
			||||||
        var topic = $(e.currentTarget).attr('data-topic-name');
 | 
					        const topic = $(e.currentTarget).attr('data-topic-name');
 | 
				
			||||||
        muting_ui.mute(stream_id, topic);
 | 
					        muting_ui.mute(stream_id, topic);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // RECIPIENT BARS
 | 
					    // RECIPIENT BARS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function get_row_id_for_narrowing(narrow_link_elem) {
 | 
					    function get_row_id_for_narrowing(narrow_link_elem) {
 | 
				
			||||||
        var group = rows.get_closest_group(narrow_link_elem);
 | 
					        const group = rows.get_closest_group(narrow_link_elem);
 | 
				
			||||||
        var msg_id = rows.id_for_recipient_row(group);
 | 
					        const msg_id = rows.id_for_recipient_row(group);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var nearest = current_msg_list.get(msg_id);
 | 
					        const nearest = current_msg_list.get(msg_id);
 | 
				
			||||||
        var selected = current_msg_list.selected_message();
 | 
					        const selected = current_msg_list.selected_message();
 | 
				
			||||||
        if (util.same_recipient(nearest, selected)) {
 | 
					        if (util.same_recipient(nearest, selected)) {
 | 
				
			||||||
            return selected.id;
 | 
					            return selected.id;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -416,7 +416,7 @@ exports.initialize = function () {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        var row_id = get_row_id_for_narrowing(this);
 | 
					        const row_id = get_row_id_for_narrowing(this);
 | 
				
			||||||
        narrow.by_recipient(row_id, {trigger: 'message header'});
 | 
					        narrow.by_recipient(row_id, {trigger: 'message header'});
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -425,7 +425,7 @@ exports.initialize = function () {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        var row_id = get_row_id_for_narrowing(this);
 | 
					        const row_id = get_row_id_for_narrowing(this);
 | 
				
			||||||
        narrow.by_topic(row_id, {trigger: 'message header'});
 | 
					        narrow.by_topic(row_id, {trigger: 'message header'});
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -435,7 +435,7 @@ exports.initialize = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var sidebarHidden = !$(".app-main .column-right").hasClass("expanded");
 | 
					        const sidebarHidden = !$(".app-main .column-right").hasClass("expanded");
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
        if (sidebarHidden) {
 | 
					        if (sidebarHidden) {
 | 
				
			||||||
            popovers.show_userlist_sidebar();
 | 
					            popovers.show_userlist_sidebar();
 | 
				
			||||||
@@ -446,7 +446,7 @@ exports.initialize = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var sidebarHidden = !$(".app-main .column-left").hasClass("expanded");
 | 
					        const sidebarHidden = !$(".app-main .column-left").hasClass("expanded");
 | 
				
			||||||
        popovers.hide_all();
 | 
					        popovers.hide_all();
 | 
				
			||||||
        if (sidebarHidden) {
 | 
					        if (sidebarHidden) {
 | 
				
			||||||
            stream_popover.show_streamlist_sidebar();
 | 
					            stream_popover.show_streamlist_sidebar();
 | 
				
			||||||
@@ -454,7 +454,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('#user_presences').expectOne().on('click', '.selectable_sidebar_block', function (e) {
 | 
					    $('#user_presences').expectOne().on('click', '.selectable_sidebar_block', function (e) {
 | 
				
			||||||
        var li = $(e.target).parents('li');
 | 
					        const li = $(e.target).parents('li');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        activity.narrow_for_user({li: li});
 | 
					        activity.narrow_for_user({li: li});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -465,8 +465,8 @@ exports.initialize = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('#group-pms').expectOne().on('click', '.selectable_sidebar_block', function (e) {
 | 
					    $('#group-pms').expectOne().on('click', '.selectable_sidebar_block', function (e) {
 | 
				
			||||||
        var user_ids_string = $(e.target).parents('li').attr('data-user-ids');
 | 
					        const user_ids_string = $(e.target).parents('li').attr('data-user-ids');
 | 
				
			||||||
        var emails = people.user_ids_string_to_emails_string(user_ids_string);
 | 
					        const emails = people.user_ids_string_to_emails_string(user_ids_string);
 | 
				
			||||||
        narrow.by('pm-with', emails, {trigger: 'sidebar'});
 | 
					        narrow.by('pm-with', emails, {trigger: 'sidebar'});
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
@@ -498,15 +498,15 @@ exports.initialize = function () {
 | 
				
			|||||||
    // BUDDY LIST TOOLTIPS
 | 
					    // BUDDY LIST TOOLTIPS
 | 
				
			||||||
    $('#user_presences').on('mouseenter', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) {
 | 
					    $('#user_presences').on('mouseenter', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) {
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link");
 | 
					        const elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link");
 | 
				
			||||||
        var user_id = elem.attr('data-user-id');
 | 
					        const user_id = elem.attr('data-user-id');
 | 
				
			||||||
        var title_data = buddy_data.get_title_data(user_id, false);
 | 
					        const title_data = buddy_data.get_title_data(user_id, false);
 | 
				
			||||||
        do_render_buddy_list_tooltip(elem, title_data);
 | 
					        do_render_buddy_list_tooltip(elem, title_data);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('#user_presences').on('mouseleave click', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) {
 | 
					    $('#user_presences').on('mouseleave click', '.user-presence-link, .user_sidebar_entry .user_circle, .user_sidebar_entry .selectable_sidebar_block', function (e) {
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link");
 | 
					        const elem = $(e.currentTarget).closest(".user_sidebar_entry").find(".user-presence-link");
 | 
				
			||||||
        $(elem).tooltip('destroy');
 | 
					        $(elem).tooltip('destroy');
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -514,12 +514,12 @@ exports.initialize = function () {
 | 
				
			|||||||
    $("body").on('mouseenter', '#pm_user_status, #group_pms_right_sidebar', function (e) {
 | 
					    $("body").on('mouseenter', '#pm_user_status, #group_pms_right_sidebar', function (e) {
 | 
				
			||||||
        $(".tooltip").remove();
 | 
					        $(".tooltip").remove();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var elem = $(e.currentTarget);
 | 
					        const elem = $(e.currentTarget);
 | 
				
			||||||
        var user_ids_string = elem.attr('data-user-ids-string');
 | 
					        const user_ids_string = elem.attr('data-user-ids-string');
 | 
				
			||||||
        // This converts from 'true' in the DOM to true.
 | 
					        // This converts from 'true' in the DOM to true.
 | 
				
			||||||
        var is_group = JSON.parse(elem.attr('data-is-group'));
 | 
					        const is_group = JSON.parse(elem.attr('data-is-group'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var title_data = buddy_data.get_title_data(user_ids_string, is_group);
 | 
					        const title_data = buddy_data.get_title_data(user_ids_string, is_group);
 | 
				
			||||||
        do_render_buddy_list_tooltip(elem, title_data);
 | 
					        do_render_buddy_list_tooltip(elem, title_data);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -553,7 +553,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    // MISC
 | 
					    // MISC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function () {
 | 
					    (function () {
 | 
				
			||||||
        var sel = ["#group-pm-list", "#stream_filters", "#global_filters", "#user_presences"].join(", ");
 | 
					        const sel = ["#group-pm-list", "#stream_filters", "#global_filters", "#user_presences"].join(", ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $(sel).on("click", "a", function () {
 | 
					        $(sel).on("click", "a", function () {
 | 
				
			||||||
            this.blur();
 | 
					            this.blur();
 | 
				
			||||||
@@ -575,7 +575,7 @@ exports.initialize = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // this will hide the alerts that you click "x" on.
 | 
					    // this will hide the alerts that you click "x" on.
 | 
				
			||||||
    $("body").on("click", ".alert-box > div .exit", function () {
 | 
					    $("body").on("click", ".alert-box > div .exit", function () {
 | 
				
			||||||
        var $alert = $(this).closest(".alert-box > div");
 | 
					        const $alert = $(this).closest(".alert-box > div");
 | 
				
			||||||
        $alert.addClass("fade-out");
 | 
					        $alert.addClass("fade-out");
 | 
				
			||||||
        setTimeout(function () {
 | 
					        setTimeout(function () {
 | 
				
			||||||
            $alert.removeClass("fade-out show");
 | 
					            $alert.removeClass("fade-out show");
 | 
				
			||||||
@@ -634,7 +634,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("body").on("click", "[data-overlay-trigger]", function () {
 | 
					    $("body").on("click", "[data-overlay-trigger]", function () {
 | 
				
			||||||
        var target = $(this).attr("data-overlay-trigger");
 | 
					        const target = $(this).attr("data-overlay-trigger");
 | 
				
			||||||
        info_overlay.show(target);
 | 
					        info_overlay.show(target);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -704,7 +704,7 @@ exports.initialize = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.webathena_login', function (e) {
 | 
					    $('body').on('click', '.webathena_login', function (e) {
 | 
				
			||||||
        $("#zephyr-mirror-error").removeClass("show");
 | 
					        $("#zephyr-mirror-error").removeClass("show");
 | 
				
			||||||
        var principal = ["zephyr", "zephyr"];
 | 
					        const principal = ["zephyr", "zephyr"];
 | 
				
			||||||
        WinChan.open({
 | 
					        WinChan.open({
 | 
				
			||||||
            url: "https://webathena.mit.edu/#!request_ticket_v1",
 | 
					            url: "https://webathena.mit.edu/#!request_ticket_v1",
 | 
				
			||||||
            relay_url: "https://webathena.mit.edu/relay.html",
 | 
					            relay_url: "https://webathena.mit.edu/relay.html",
 | 
				
			||||||
@@ -745,7 +745,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function () {
 | 
					    (function () {
 | 
				
			||||||
        var map = {
 | 
					        const map = {
 | 
				
			||||||
            ".stream-description-editable": {
 | 
					            ".stream-description-editable": {
 | 
				
			||||||
                on_start: stream_edit.set_raw_description,
 | 
					                on_start: stream_edit.set_raw_description,
 | 
				
			||||||
                on_save: stream_edit.change_stream_description,
 | 
					                on_save: stream_edit.change_stream_description,
 | 
				
			||||||
@@ -777,7 +777,7 @@ exports.initialize = function () {
 | 
				
			|||||||
            // if there are any child nodes, inclusive of <br> which means you
 | 
					            // if there are any child nodes, inclusive of <br> which means you
 | 
				
			||||||
            // have lines in your description or title, you're doing something
 | 
					            // have lines in your description or title, you're doing something
 | 
				
			||||||
            // wrong.
 | 
					            // wrong.
 | 
				
			||||||
            for (var x = 0; x < this.childNodes.length; x += 1) {
 | 
					            for (let x = 0; x < this.childNodes.length; x += 1) {
 | 
				
			||||||
                if (this.childNodes[x].nodeType !== 3) {
 | 
					                if (this.childNodes[x].nodeType !== 3) {
 | 
				
			||||||
                    this.innerText = this.innerText.replace(/\n/, "");
 | 
					                    this.innerText = this.innerText.replace(/\n/, "");
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
@@ -786,8 +786,8 @@ exports.initialize = function () {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $("body").on("click", "[data-make-editable]", function () {
 | 
					        $("body").on("click", "[data-make-editable]", function () {
 | 
				
			||||||
            var selector = $(this).attr("data-make-editable");
 | 
					            const selector = $(this).attr("data-make-editable");
 | 
				
			||||||
            var edit_area = $(this).parent().find(selector);
 | 
					            const edit_area = $(this).parent().find(selector);
 | 
				
			||||||
            if (edit_area.attr("contenteditable") === "true") {
 | 
					            if (edit_area.attr("contenteditable") === "true") {
 | 
				
			||||||
                $("[data-finish-editing='" + selector + "']").hide();
 | 
					                $("[data-finish-editing='" + selector + "']").hide();
 | 
				
			||||||
                edit_area.attr("contenteditable", false);
 | 
					                edit_area.attr("contenteditable", false);
 | 
				
			||||||
@@ -810,7 +810,7 @@ exports.initialize = function () {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $("body").on("click", "[data-finish-editing]", function (e) {
 | 
					        $("body").on("click", "[data-finish-editing]", function (e) {
 | 
				
			||||||
            var selector = $(this).attr("data-finish-editing");
 | 
					            const selector = $(this).attr("data-finish-editing");
 | 
				
			||||||
            if (map[selector].on_save) {
 | 
					            if (map[selector].on_save) {
 | 
				
			||||||
                map[selector].on_save(e);
 | 
					                map[selector].on_save(e);
 | 
				
			||||||
                $(this).hide();
 | 
					                $(this).hide();
 | 
				
			||||||
@@ -829,11 +829,11 @@ exports.initialize = function () {
 | 
				
			|||||||
        hotspots.close_hotspot_icon(this);
 | 
					        hotspots.close_hotspot_icon(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // show popover
 | 
					        // show popover
 | 
				
			||||||
        var hotspot_name = $(e.target).closest('.hotspot-icon')
 | 
					        const hotspot_name = $(e.target).closest('.hotspot-icon')
 | 
				
			||||||
            .attr('id')
 | 
					            .attr('id')
 | 
				
			||||||
            .replace('hotspot_', '')
 | 
					            .replace('hotspot_', '')
 | 
				
			||||||
            .replace('_icon', '');
 | 
					            .replace('_icon', '');
 | 
				
			||||||
        var overlay_name = 'hotspot_' + hotspot_name + '_overlay';
 | 
					        const overlay_name = 'hotspot_' + hotspot_name + '_overlay';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        overlays.open_overlay({
 | 
					        overlays.open_overlay({
 | 
				
			||||||
            name: overlay_name,
 | 
					            name: overlay_name,
 | 
				
			||||||
@@ -856,9 +856,9 @@ exports.initialize = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var overlay_name = $(this).closest('.hotspot.overlay').attr('id');
 | 
					        const overlay_name = $(this).closest('.hotspot.overlay').attr('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var hotspot_name = overlay_name
 | 
					        const hotspot_name = overlay_name
 | 
				
			||||||
            .replace('hotspot_', '')
 | 
					            .replace('hotspot_', '')
 | 
				
			||||||
            .replace('_overlay', '');
 | 
					            .replace('_overlay', '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
const TurndownService = require("turndown/lib/turndown.cjs.js");
 | 
					const TurndownService = require("turndown/lib/turndown.cjs.js");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function find_boundary_tr(initial_tr, iterate_row) {
 | 
					function find_boundary_tr(initial_tr, iterate_row) {
 | 
				
			||||||
    var j;
 | 
					    let j;
 | 
				
			||||||
    var skip_same_td_check = false;
 | 
					    let skip_same_td_check = false;
 | 
				
			||||||
    var tr = initial_tr;
 | 
					    let tr = initial_tr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If the selection boundary is somewhere that does not have a
 | 
					    // If the selection boundary is somewhere that does not have a
 | 
				
			||||||
    // parent tr, we should let the browser handle the copy-paste
 | 
					    // parent tr, we should let the browser handle the copy-paste
 | 
				
			||||||
@@ -34,7 +34,7 @@ function find_boundary_tr(initial_tr, iterate_row) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function construct_recipient_header(message_row) {
 | 
					function construct_recipient_header(message_row) {
 | 
				
			||||||
    var message_header_content = rows.get_message_recipient_header(message_row)
 | 
					    const message_header_content = rows.get_message_recipient_header(message_row)
 | 
				
			||||||
        .text()
 | 
					        .text()
 | 
				
			||||||
        .replace(/\s+/g, " ")
 | 
					        .replace(/\s+/g, " ")
 | 
				
			||||||
        .replace(/^\s/, "").replace(/\s$/, "");
 | 
					        .replace(/^\s/, "").replace(/\s$/, "");
 | 
				
			||||||
@@ -57,14 +57,14 @@ how modern browsers deal with copy/paste.  Just test
 | 
				
			|||||||
your changes carefully.
 | 
					your changes carefully.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
function construct_copy_div(div, start_id, end_id) {
 | 
					function construct_copy_div(div, start_id, end_id) {
 | 
				
			||||||
    var start_row = current_msg_list.get_row(start_id);
 | 
					    const start_row = current_msg_list.get_row(start_id);
 | 
				
			||||||
    var start_recipient_row = rows.get_message_recipient_row(start_row);
 | 
					    const start_recipient_row = rows.get_message_recipient_row(start_row);
 | 
				
			||||||
    var start_recipient_row_id = rows.id_for_recipient_row(start_recipient_row);
 | 
					    const start_recipient_row_id = rows.id_for_recipient_row(start_recipient_row);
 | 
				
			||||||
    var should_include_start_recipient_header = false;
 | 
					    let should_include_start_recipient_header = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var last_recipient_row_id = start_recipient_row_id;
 | 
					    let last_recipient_row_id = start_recipient_row_id;
 | 
				
			||||||
    for (var row = start_row; rows.id(row) <= end_id; row = rows.next_visible(row)) {
 | 
					    for (let row = start_row; rows.id(row) <= end_id; row = rows.next_visible(row)) {
 | 
				
			||||||
        var recipient_row_id = rows.id_for_recipient_row(rows.get_message_recipient_row(row));
 | 
					        const recipient_row_id = rows.id_for_recipient_row(rows.get_message_recipient_row(row));
 | 
				
			||||||
        // if we found a message from another recipient,
 | 
					        // if we found a message from another recipient,
 | 
				
			||||||
        // it means that we have messages from several recipients,
 | 
					        // it means that we have messages from several recipients,
 | 
				
			||||||
        // so we have to add new recipient's bar to final copied message
 | 
					        // so we have to add new recipient's bar to final copied message
 | 
				
			||||||
@@ -74,8 +74,8 @@ function construct_copy_div(div, start_id, end_id) {
 | 
				
			|||||||
            last_recipient_row_id = recipient_row_id;
 | 
					            last_recipient_row_id = recipient_row_id;
 | 
				
			||||||
            should_include_start_recipient_header = true;
 | 
					            should_include_start_recipient_header = true;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var message = current_msg_list.get(rows.id(row));
 | 
					        const message = current_msg_list.get(rows.id(row));
 | 
				
			||||||
        var message_firstp = $(message.content).slice(0, 1);
 | 
					        const message_firstp = $(message.content).slice(0, 1);
 | 
				
			||||||
        message_firstp.prepend(message.sender_full_name + ": ");
 | 
					        message_firstp.prepend(message.sender_full_name + ": ");
 | 
				
			||||||
        div.append(message_firstp);
 | 
					        div.append(message_firstp);
 | 
				
			||||||
        div.append($(message.content).slice(1));
 | 
					        div.append($(message.content).slice(1));
 | 
				
			||||||
@@ -132,13 +132,13 @@ exports.copy_handler = function () {
 | 
				
			|||||||
    // * Otherwise, we want to copy the bodies of all messages that
 | 
					    // * Otherwise, we want to copy the bodies of all messages that
 | 
				
			||||||
    //   were partially covered by the selection.
 | 
					    //   were partially covered by the selection.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var selection = window.getSelection();
 | 
					    const selection = window.getSelection();
 | 
				
			||||||
    var analysis = exports.analyze_selection(selection);
 | 
					    const analysis = exports.analyze_selection(selection);
 | 
				
			||||||
    var ranges = analysis.ranges;
 | 
					    const ranges = analysis.ranges;
 | 
				
			||||||
    var start_id = analysis.start_id;
 | 
					    const start_id = analysis.start_id;
 | 
				
			||||||
    var end_id = analysis.end_id;
 | 
					    const end_id = analysis.end_id;
 | 
				
			||||||
    var skip_same_td_check = analysis.skip_same_td_check;
 | 
					    const skip_same_td_check = analysis.skip_same_td_check;
 | 
				
			||||||
    var div = $('<div>');
 | 
					    const div = $('<div>');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (start_id === undefined || end_id === undefined) {
 | 
					    if (start_id === undefined || end_id === undefined) {
 | 
				
			||||||
        // In this case either the starting message or the ending
 | 
					        // In this case either the starting message or the ending
 | 
				
			||||||
@@ -186,20 +186,20 @@ exports.analyze_selection = function (selection) {
 | 
				
			|||||||
    // analyze the combined range of the selections, and copy their
 | 
					    // analyze the combined range of the selections, and copy their
 | 
				
			||||||
    // full content.
 | 
					    // full content.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var i;
 | 
					    let i;
 | 
				
			||||||
    var range;
 | 
					    let range;
 | 
				
			||||||
    var ranges = [];
 | 
					    const ranges = [];
 | 
				
			||||||
    var startc;
 | 
					    let startc;
 | 
				
			||||||
    var endc;
 | 
					    let endc;
 | 
				
			||||||
    var initial_end_tr;
 | 
					    let initial_end_tr;
 | 
				
			||||||
    var start_id;
 | 
					    let start_id;
 | 
				
			||||||
    var end_id;
 | 
					    let end_id;
 | 
				
			||||||
    var start_data;
 | 
					    let start_data;
 | 
				
			||||||
    var end_data;
 | 
					    let end_data;
 | 
				
			||||||
    // skip_same_td_check is true whenever we know for a fact that the
 | 
					    // skip_same_td_check is true whenever we know for a fact that the
 | 
				
			||||||
    // selection covers multiple messages (and thus we should no
 | 
					    // selection covers multiple messages (and thus we should no
 | 
				
			||||||
    // longer consider letting the browser handle the copy event).
 | 
					    // longer consider letting the browser handle the copy event).
 | 
				
			||||||
    var skip_same_td_check = false;
 | 
					    let skip_same_td_check = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < selection.rangeCount; i += 1) {
 | 
					    for (i = 0; i < selection.rangeCount; i += 1) {
 | 
				
			||||||
        range = selection.getRangeAt(i);
 | 
					        range = selection.getRangeAt(i);
 | 
				
			||||||
@@ -297,7 +297,7 @@ exports.paste_handler_converter = function (paste_html) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.paste_handler = function (event) {
 | 
					exports.paste_handler = function (event) {
 | 
				
			||||||
    var clipboardData = event.originalEvent.clipboardData;
 | 
					    const clipboardData = event.originalEvent.clipboardData;
 | 
				
			||||||
    if (!clipboardData) {
 | 
					    if (!clipboardData) {
 | 
				
			||||||
        // On IE11, ClipboardData isn't defined.  One can instead
 | 
					        // On IE11, ClipboardData isn't defined.  One can instead
 | 
				
			||||||
        // access it with `window.clipboardData`, but even that
 | 
					        // access it with `window.clipboardData`, but even that
 | 
				
			||||||
@@ -308,10 +308,10 @@ exports.paste_handler = function (event) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (clipboardData.getData) {
 | 
					    if (clipboardData.getData) {
 | 
				
			||||||
        var paste_html = clipboardData.getData('text/html');
 | 
					        const paste_html = clipboardData.getData('text/html');
 | 
				
			||||||
        if (paste_html && page_params.development_environment) {
 | 
					        if (paste_html && page_params.development_environment) {
 | 
				
			||||||
            var text = exports.paste_handler_converter(paste_html);
 | 
					            const text = exports.paste_handler_converter(paste_html);
 | 
				
			||||||
            var mdImageRegex = /^!\[.*\]\(.*\)$/;
 | 
					            const mdImageRegex = /^!\[.*\]\(.*\)$/;
 | 
				
			||||||
            if (text.match(mdImageRegex)) {
 | 
					            if (text.match(mdImageRegex)) {
 | 
				
			||||||
                // This block catches cases where we are pasting an
 | 
					                // This block catches cases where we are pasting an
 | 
				
			||||||
                // image into Zulip, which should be handled by the
 | 
					                // image into Zulip, which should be handled by the
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@ exports.get_hash_section = function (hash) {
 | 
				
			|||||||
        return '';
 | 
					        return '';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var parts = hash.replace(/\/$/, "").split(/\//);
 | 
					    const parts = hash.replace(/\/$/, "").split(/\//);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return parts[1] || '';
 | 
					    return parts[1] || '';
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -26,7 +26,7 @@ exports.encodeHashComponent = function (str) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.encode_operand = function (operator, operand) {
 | 
					exports.encode_operand = function (operator, operand) {
 | 
				
			||||||
    if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
 | 
					    if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
 | 
				
			||||||
        var slug = people.emails_to_slug(operand);
 | 
					        const slug = people.emails_to_slug(operand);
 | 
				
			||||||
        if (slug) {
 | 
					        if (slug) {
 | 
				
			||||||
            return slug;
 | 
					            return slug;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -42,7 +42,7 @@ exports.encode_operand = function (operator, operand) {
 | 
				
			|||||||
exports.encode_stream_id = function (stream_id) {
 | 
					exports.encode_stream_id = function (stream_id) {
 | 
				
			||||||
    // stream_data appends the stream name, but it does not do the
 | 
					    // stream_data appends the stream name, but it does not do the
 | 
				
			||||||
    // URI encoding piece
 | 
					    // URI encoding piece
 | 
				
			||||||
    var slug = stream_data.id_to_slug(stream_id);
 | 
					    const slug = stream_data.id_to_slug(stream_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return exports.encodeHashComponent(slug);
 | 
					    return exports.encodeHashComponent(slug);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -61,7 +61,7 @@ exports.decodeHashComponent = function (str) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.decode_operand = function (operator, operand) {
 | 
					exports.decode_operand = function (operator, operand) {
 | 
				
			||||||
    if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
 | 
					    if (operator === 'group-pm-with' || operator === 'pm-with' || operator === 'sender') {
 | 
				
			||||||
        var emails = people.slug_to_emails(operand);
 | 
					        const emails = people.slug_to_emails(operand);
 | 
				
			||||||
        if (emails) {
 | 
					        if (emails) {
 | 
				
			||||||
            return emails;
 | 
					            return emails;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -89,16 +89,16 @@ exports.by_stream_topic_uri = function (stream_id, topic) {
 | 
				
			|||||||
// corresponding hash: the # component
 | 
					// corresponding hash: the # component
 | 
				
			||||||
// of the narrow URL
 | 
					// of the narrow URL
 | 
				
			||||||
exports.operators_to_hash = function (operators) {
 | 
					exports.operators_to_hash = function (operators) {
 | 
				
			||||||
    var hash = '#';
 | 
					    let hash = '#';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (operators !== undefined) {
 | 
					    if (operators !== undefined) {
 | 
				
			||||||
        hash = '#narrow';
 | 
					        hash = '#narrow';
 | 
				
			||||||
        _.each(operators, function (elem) {
 | 
					        _.each(operators, function (elem) {
 | 
				
			||||||
            // Support legacy tuples.
 | 
					            // Support legacy tuples.
 | 
				
			||||||
            var operator = elem.operator;
 | 
					            const operator = elem.operator;
 | 
				
			||||||
            var operand = elem.operand;
 | 
					            const operand = elem.operand;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var sign = elem.negated ? '-' : '';
 | 
					            const sign = elem.negated ? '-' : '';
 | 
				
			||||||
            hash += '/' + sign + exports.encodeHashComponent(operator)
 | 
					            hash += '/' + sign + exports.encodeHashComponent(operator)
 | 
				
			||||||
                  + '/' + exports.encode_operand(operator, operand);
 | 
					                  + '/' + exports.encode_operand(operator, operand);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -128,11 +128,11 @@ exports.huddle_with_uri = function (user_ids_string) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.by_conversation_and_time_uri = function (message) {
 | 
					exports.by_conversation_and_time_uri = function (message) {
 | 
				
			||||||
    var absolute_url = window.location.protocol + "//" +
 | 
					    const absolute_url = window.location.protocol + "//" +
 | 
				
			||||||
        window.location.host + "/" +
 | 
					        window.location.host + "/" +
 | 
				
			||||||
        window.location.pathname.split('/')[1];
 | 
					        window.location.pathname.split('/')[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var suffix = "/near/" + exports.encodeHashComponent(message.id);
 | 
					    const suffix = "/near/" + exports.encodeHashComponent(message.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (message.type === "stream") {
 | 
					    if (message.type === "stream") {
 | 
				
			||||||
        return absolute_url +
 | 
					        return absolute_url +
 | 
				
			||||||
@@ -144,30 +144,30 @@ exports.by_conversation_and_time_uri = function (message) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.stream_edit_uri = function (sub) {
 | 
					exports.stream_edit_uri = function (sub) {
 | 
				
			||||||
    var hash = "#streams" + "/" + sub.stream_id + "/" + exports.encodeHashComponent(sub.name);
 | 
					    const hash = "#streams" + "/" + sub.stream_id + "/" + exports.encodeHashComponent(sub.name);
 | 
				
			||||||
    return hash;
 | 
					    return hash;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.parse_narrow = function (hash) {
 | 
					exports.parse_narrow = function (hash) {
 | 
				
			||||||
    var i;
 | 
					    let i;
 | 
				
			||||||
    var operators = [];
 | 
					    const operators = [];
 | 
				
			||||||
    for (i = 1; i < hash.length; i += 2) {
 | 
					    for (i = 1; i < hash.length; i += 2) {
 | 
				
			||||||
        // We don't construct URLs with an odd number of components,
 | 
					        // We don't construct URLs with an odd number of components,
 | 
				
			||||||
        // but the user might write one.
 | 
					        // but the user might write one.
 | 
				
			||||||
        var operator = exports.decodeHashComponent(hash[i]);
 | 
					        let operator = exports.decodeHashComponent(hash[i]);
 | 
				
			||||||
        // Do not parse further if empty operator encountered.
 | 
					        // Do not parse further if empty operator encountered.
 | 
				
			||||||
        if (operator === '') {
 | 
					        if (operator === '') {
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var raw_operand = hash[i + 1];
 | 
					        const raw_operand = hash[i + 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!raw_operand) {
 | 
					        if (!raw_operand) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var operand  = exports.decode_operand(operator, raw_operand);
 | 
					        const operand  = exports.decode_operand(operator, raw_operand);
 | 
				
			||||||
        var negated = false;
 | 
					        let negated = false;
 | 
				
			||||||
        if (operator[0] === '-') {
 | 
					        if (operator[0] === '-') {
 | 
				
			||||||
            negated = true;
 | 
					            negated = true;
 | 
				
			||||||
            operator = operator.slice(1);
 | 
					            operator = operator.slice(1);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
var render_bookend = require('../templates/bookend.hbs');
 | 
					const render_bookend = require('../templates/bookend.hbs');
 | 
				
			||||||
var render_message_group = require('../templates/message_group.hbs');
 | 
					const render_message_group = require('../templates/message_group.hbs');
 | 
				
			||||||
var render_recipient_row = require('../templates/recipient_row.hbs');
 | 
					const render_recipient_row = require('../templates/recipient_row.hbs');
 | 
				
			||||||
var render_single_message = require('../templates/single_message.hbs');
 | 
					const render_single_message = require('../templates/single_message.hbs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function MessageListView(list, table_name, collapse_messages) {
 | 
					function MessageListView(list, table_name, collapse_messages) {
 | 
				
			||||||
    this.list = list;
 | 
					    this.list = list;
 | 
				
			||||||
@@ -20,10 +20,10 @@ function MessageListView(list, table_name, collapse_messages) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function get_user_id_for_mention_button(elem) {
 | 
					function get_user_id_for_mention_button(elem) {
 | 
				
			||||||
    var user_id = $(elem).attr('data-user-id');
 | 
					    const user_id = $(elem).attr('data-user-id');
 | 
				
			||||||
    // Handle legacy markdown that was rendered before we cut
 | 
					    // Handle legacy markdown that was rendered before we cut
 | 
				
			||||||
    // over to using data-user-id.
 | 
					    // over to using data-user-id.
 | 
				
			||||||
    var email = $(elem).attr('data-user-email');
 | 
					    const email = $(elem).attr('data-user-email');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (user_id === "*" || email === "*") {
 | 
					    if (user_id === "*" || email === "*") {
 | 
				
			||||||
        return "*";
 | 
					        return "*";
 | 
				
			||||||
@@ -35,7 +35,7 @@ function get_user_id_for_mention_button(elem) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (email) {
 | 
					    if (email) {
 | 
				
			||||||
        // Will return undefined if there's no match
 | 
					        // Will return undefined if there's no match
 | 
				
			||||||
        var user = people.get_by_email(email);
 | 
					        const user = people.get_by_email(email);
 | 
				
			||||||
        if (user) {
 | 
					        if (user) {
 | 
				
			||||||
            return user.user_id;
 | 
					            return user.user_id;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -45,7 +45,7 @@ function get_user_id_for_mention_button(elem) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function get_user_group_id_for_mention_button(elem) {
 | 
					function get_user_group_id_for_mention_button(elem) {
 | 
				
			||||||
    var user_group_id = $(elem).attr('data-user-group-id');
 | 
					    const user_group_id = $(elem).attr('data-user-group-id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (user_group_id) {
 | 
					    if (user_group_id) {
 | 
				
			||||||
        return user_group_id;
 | 
					        return user_group_id;
 | 
				
			||||||
@@ -58,8 +58,8 @@ function same_day(earlier_msg, later_msg) {
 | 
				
			|||||||
    if (earlier_msg === undefined || later_msg === undefined) {
 | 
					    if (earlier_msg === undefined || later_msg === undefined) {
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    var earlier_time = new XDate(earlier_msg.msg.timestamp * 1000);
 | 
					    const earlier_time = new XDate(earlier_msg.msg.timestamp * 1000);
 | 
				
			||||||
    var later_time = new XDate(later_msg.msg.timestamp * 1000);
 | 
					    const later_time = new XDate(later_msg.msg.timestamp * 1000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return earlier_time.toDateString() === later_time.toDateString();
 | 
					    return earlier_time.toDateString() === later_time.toDateString();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -79,19 +79,19 @@ function same_recipient(a, b) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function render_group_display_date(group, message_container) {
 | 
					function render_group_display_date(group, message_container) {
 | 
				
			||||||
    var time = new XDate(message_container.msg.timestamp * 1000);
 | 
					    const time = new XDate(message_container.msg.timestamp * 1000);
 | 
				
			||||||
    var today = new XDate();
 | 
					    const today = new XDate();
 | 
				
			||||||
    var date_element = timerender.render_date(time, undefined, today)[0];
 | 
					    const date_element = timerender.render_date(time, undefined, today)[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    group.date = date_element.outerHTML;
 | 
					    group.date = date_element.outerHTML;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function update_group_date_divider(group, message_container, prev) {
 | 
					function update_group_date_divider(group, message_container, prev) {
 | 
				
			||||||
    var time = new XDate(message_container.msg.timestamp * 1000);
 | 
					    const time = new XDate(message_container.msg.timestamp * 1000);
 | 
				
			||||||
    var today = new XDate();
 | 
					    const today = new XDate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (prev !== undefined) {
 | 
					    if (prev !== undefined) {
 | 
				
			||||||
        var prev_time = new XDate(prev.msg.timestamp * 1000);
 | 
					        const prev_time = new XDate(prev.msg.timestamp * 1000);
 | 
				
			||||||
        if (time.toDateString() !== prev_time.toDateString()) {
 | 
					        if (time.toDateString() !== prev_time.toDateString()) {
 | 
				
			||||||
            // NB: group_date_divider_html is HTML, inserted into the document without escaping.
 | 
					            // NB: group_date_divider_html is HTML, inserted into the document without escaping.
 | 
				
			||||||
            group.group_date_divider_html = timerender.render_date(time, prev_time,
 | 
					            group.group_date_divider_html = timerender.render_date(time, prev_time,
 | 
				
			||||||
@@ -118,17 +118,17 @@ function clear_message_date_divider(msg) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function update_message_date_divider(opts) {
 | 
					function update_message_date_divider(opts) {
 | 
				
			||||||
    var prev_msg_container = opts.prev_msg_container;
 | 
					    const prev_msg_container = opts.prev_msg_container;
 | 
				
			||||||
    var curr_msg_container = opts.curr_msg_container;
 | 
					    const curr_msg_container = opts.curr_msg_container;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!prev_msg_container || same_day(curr_msg_container, prev_msg_container)) {
 | 
					    if (!prev_msg_container || same_day(curr_msg_container, prev_msg_container)) {
 | 
				
			||||||
        clear_message_date_divider(curr_msg_container);
 | 
					        clear_message_date_divider(curr_msg_container);
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var prev_time = new XDate(prev_msg_container.msg.timestamp * 1000);
 | 
					    const prev_time = new XDate(prev_msg_container.msg.timestamp * 1000);
 | 
				
			||||||
    var curr_time = new XDate(curr_msg_container.msg.timestamp * 1000);
 | 
					    const curr_time = new XDate(curr_msg_container.msg.timestamp * 1000);
 | 
				
			||||||
    var today = new XDate();
 | 
					    const today = new XDate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    curr_msg_container.want_date_divider = true;
 | 
					    curr_msg_container.want_date_divider = true;
 | 
				
			||||||
    curr_msg_container.date_divider_html =
 | 
					    curr_msg_container.date_divider_html =
 | 
				
			||||||
@@ -136,7 +136,7 @@ function update_message_date_divider(opts) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function set_timestr(message_container) {
 | 
					function set_timestr(message_container) {
 | 
				
			||||||
    var time = new XDate(message_container.msg.timestamp * 1000);
 | 
					    const time = new XDate(message_container.msg.timestamp * 1000);
 | 
				
			||||||
    message_container.timestr = timerender.stringify_time(time);
 | 
					    message_container.timestr = timerender.stringify_time(time);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -166,7 +166,7 @@ function populate_group_from_message_container(group, message_container) {
 | 
				
			|||||||
        group.match_topic = util.get_match_topic(message_container.msg);
 | 
					        group.match_topic = util.get_match_topic(message_container.msg);
 | 
				
			||||||
        group.stream_url = message_container.stream_url;
 | 
					        group.stream_url = message_container.stream_url;
 | 
				
			||||||
        group.topic_url = message_container.topic_url;
 | 
					        group.topic_url = message_container.topic_url;
 | 
				
			||||||
        var sub = stream_data.get_sub(message_container.msg.stream);
 | 
					        const sub = stream_data.get_sub(message_container.msg.stream);
 | 
				
			||||||
        if (sub === undefined) {
 | 
					        if (sub === undefined) {
 | 
				
			||||||
            // Hack to handle unusual cases like the tutorial where
 | 
					            // Hack to handle unusual cases like the tutorial where
 | 
				
			||||||
            // the streams used don't actually exist in the subs
 | 
					            // the streams used don't actually exist in the subs
 | 
				
			||||||
@@ -196,8 +196,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    _get_msg_timestring: function (message_container) {
 | 
					    _get_msg_timestring: function (message_container) {
 | 
				
			||||||
        if (message_container.msg.last_edit_timestamp !== undefined) {
 | 
					        if (message_container.msg.last_edit_timestamp !== undefined) {
 | 
				
			||||||
            var last_edit_time = new XDate(message_container.msg.last_edit_timestamp * 1000);
 | 
					            const last_edit_time = new XDate(message_container.msg.last_edit_timestamp * 1000);
 | 
				
			||||||
            var today = new XDate();
 | 
					            const today = new XDate();
 | 
				
			||||||
            return timerender.render_date(last_edit_time, undefined, today)[0].textContent +
 | 
					            return timerender.render_date(last_edit_time, undefined, today)[0].textContent +
 | 
				
			||||||
                " at " + timerender.stringify_time(last_edit_time);
 | 
					                " at " + timerender.stringify_time(last_edit_time);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -211,9 +211,9 @@ MessageListView.prototype = {
 | 
				
			|||||||
        //   * `edited_in_left_col`      -- when label appears in left column.
 | 
					        //   * `edited_in_left_col`      -- when label appears in left column.
 | 
				
			||||||
        //   * `edited_alongside_sender` -- when label appears alongside sender info.
 | 
					        //   * `edited_alongside_sender` -- when label appears alongside sender info.
 | 
				
			||||||
        //   * `edited_status_msg`       -- when label appears for a "/me" message.
 | 
					        //   * `edited_status_msg`       -- when label appears for a "/me" message.
 | 
				
			||||||
        var last_edit_timestr = this._get_msg_timestring(message_container);
 | 
					        const last_edit_timestr = this._get_msg_timestring(message_container);
 | 
				
			||||||
        var include_sender = message_container.include_sender;
 | 
					        const include_sender = message_container.include_sender;
 | 
				
			||||||
        var status_message = Boolean(message_container.status_message);
 | 
					        const status_message = Boolean(message_container.status_message);
 | 
				
			||||||
        if (last_edit_timestr !== undefined) {
 | 
					        if (last_edit_timestr !== undefined) {
 | 
				
			||||||
            message_container.last_edit_timestr = last_edit_timestr;
 | 
					            message_container.last_edit_timestr = last_edit_timestr;
 | 
				
			||||||
            message_container.edited_in_left_col = !include_sender;
 | 
					            message_container.edited_in_left_col = !include_sender;
 | 
				
			||||||
@@ -227,9 +227,9 @@ MessageListView.prototype = {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var last_subscribed = !last_msg_container.msg.historical;
 | 
					        const last_subscribed = !last_msg_container.msg.historical;
 | 
				
			||||||
        var first_subscribed = !first_msg_container.msg.historical;
 | 
					        const first_subscribed = !first_msg_container.msg.historical;
 | 
				
			||||||
        var stream = first_msg_container.msg.stream;
 | 
					        const stream = first_msg_container.msg.stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!last_subscribed && first_subscribed) {
 | 
					        if (!last_subscribed && first_subscribed) {
 | 
				
			||||||
            group.bookend_top = true;
 | 
					            group.bookend_top = true;
 | 
				
			||||||
@@ -254,10 +254,10 @@ MessageListView.prototype = {
 | 
				
			|||||||
            };
 | 
					            };
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var self = this;
 | 
					        const self = this;
 | 
				
			||||||
        var current_group = start_group();
 | 
					        let current_group = start_group();
 | 
				
			||||||
        var new_message_groups = [];
 | 
					        const new_message_groups = [];
 | 
				
			||||||
        var prev;
 | 
					        let prev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function add_message_container_to_group(message_container) {
 | 
					        function add_message_container_to_group(message_container) {
 | 
				
			||||||
            if (same_sender(prev, message_container)) {
 | 
					            if (same_sender(prev, message_container)) {
 | 
				
			||||||
@@ -278,7 +278,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _.each(message_containers, function (message_container) {
 | 
					        _.each(message_containers, function (message_container) {
 | 
				
			||||||
            var message_reactions = reactions.get_message_reactions(message_container.msg);
 | 
					            const message_reactions = reactions.get_message_reactions(message_container.msg);
 | 
				
			||||||
            message_container.msg.message_reactions = message_reactions;
 | 
					            message_container.msg.message_reactions = message_reactions;
 | 
				
			||||||
            message_container.include_recipient = false;
 | 
					            message_container.include_recipient = false;
 | 
				
			||||||
            message_container.include_footer    = false;
 | 
					            message_container.include_footer    = false;
 | 
				
			||||||
@@ -364,8 +364,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
        if (first_group === undefined || second_group === undefined) {
 | 
					        if (first_group === undefined || second_group === undefined) {
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var last_msg_container = _.last(first_group.message_containers);
 | 
					        const last_msg_container = _.last(first_group.message_containers);
 | 
				
			||||||
        var first_msg_container = _.first(second_group.message_containers);
 | 
					        const first_msg_container = _.first(second_group.message_containers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Join two groups into one.
 | 
					        // Join two groups into one.
 | 
				
			||||||
        if (this.collapse_messages && same_recipient(last_msg_container, first_msg_container) &&
 | 
					        if (this.collapse_messages && same_recipient(last_msg_container, first_msg_container) &&
 | 
				
			||||||
@@ -403,17 +403,17 @@ MessageListView.prototype = {
 | 
				
			|||||||
        // append_messages are messages which should be added to the last group in the DOM
 | 
					        // append_messages are messages which should be added to the last group in the DOM
 | 
				
			||||||
        // rerender_messages are messages which should be updated in place in the DOM
 | 
					        // rerender_messages are messages which should be updated in place in the DOM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var message_actions = {
 | 
					        const message_actions = {
 | 
				
			||||||
            append_groups: [],
 | 
					            append_groups: [],
 | 
				
			||||||
            prepend_groups: [],
 | 
					            prepend_groups: [],
 | 
				
			||||||
            rerender_groups: [],
 | 
					            rerender_groups: [],
 | 
				
			||||||
            append_messages: [],
 | 
					            append_messages: [],
 | 
				
			||||||
            rerender_messages_next_same_sender: [],
 | 
					            rerender_messages_next_same_sender: [],
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        var first_group;
 | 
					        let first_group;
 | 
				
			||||||
        var second_group;
 | 
					        let second_group;
 | 
				
			||||||
        var curr_msg_container;
 | 
					        let curr_msg_container;
 | 
				
			||||||
        var prev_msg_container;
 | 
					        let prev_msg_container;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (where === 'top') {
 | 
					        if (where === 'top') {
 | 
				
			||||||
            first_group = _.last(new_message_groups);
 | 
					            first_group = _.last(new_message_groups);
 | 
				
			||||||
@@ -431,7 +431,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
            curr_msg_container = _.first(second_group.message_containers);
 | 
					            curr_msg_container = _.first(second_group.message_containers);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var was_joined = this.join_message_groups(first_group, second_group);
 | 
					        const was_joined = this.join_message_groups(first_group, second_group);
 | 
				
			||||||
        if (was_joined) {
 | 
					        if (was_joined) {
 | 
				
			||||||
            update_message_date_divider({
 | 
					            update_message_date_divider({
 | 
				
			||||||
                prev_msg_container: prev_msg_container,
 | 
					                prev_msg_container: prev_msg_container,
 | 
				
			||||||
@@ -501,9 +501,9 @@ MessageListView.prototype = {
 | 
				
			|||||||
            blueslip.error('programming error--pass in jQuery objects');
 | 
					            blueslip.error('programming error--pass in jQuery objects');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var self = this;
 | 
					        const self = this;
 | 
				
			||||||
        _.each($message_rows, function (dom_row) {
 | 
					        _.each($message_rows, function (dom_row) {
 | 
				
			||||||
            var row = $(dom_row);
 | 
					            const row = $(dom_row);
 | 
				
			||||||
            self._put_row(row);
 | 
					            self._put_row(row);
 | 
				
			||||||
            self._post_process_single_row(row);
 | 
					            self._post_process_single_row(row);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -521,7 +521,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
            blueslip.error('programming error--expected single element');
 | 
					            blueslip.error('programming error--expected single element');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var content = row.find('.message_content');
 | 
					        const content = row.find('.message_content');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set the rtl class if the text has an rtl direction
 | 
					        // Set the rtl class if the text has an rtl direction
 | 
				
			||||||
        if (rtl.get_direction(content.text()) === 'rtl') {
 | 
					        if (rtl.get_direction(content.text()) === 'rtl') {
 | 
				
			||||||
@@ -529,7 +529,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content.find('.user-mention').each(function () {
 | 
					        content.find('.user-mention').each(function () {
 | 
				
			||||||
            var user_id = get_user_id_for_mention_button(this);
 | 
					            const user_id = get_user_id_for_mention_button(this);
 | 
				
			||||||
            // We give special highlights to the mention buttons
 | 
					            // We give special highlights to the mention buttons
 | 
				
			||||||
            // that refer to the current user.
 | 
					            // that refer to the current user.
 | 
				
			||||||
            if (user_id === "*" || people.is_my_user_id(user_id)) {
 | 
					            if (user_id === "*" || people.is_my_user_id(user_id)) {
 | 
				
			||||||
@@ -541,7 +541,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
                // mention text to show the user's current name,
 | 
					                // mention text to show the user's current name,
 | 
				
			||||||
                // assuming that you're not searching for text
 | 
					                // assuming that you're not searching for text
 | 
				
			||||||
                // inside the highlight.
 | 
					                // inside the highlight.
 | 
				
			||||||
                var person = people.get_person_from_user_id(user_id);
 | 
					                const person = people.get_person_from_user_id(user_id);
 | 
				
			||||||
                if (person !== undefined) {
 | 
					                if (person !== undefined) {
 | 
				
			||||||
                    // Note that person might be undefined in some
 | 
					                    // Note that person might be undefined in some
 | 
				
			||||||
                    // unpleasant corner cases involving data import.
 | 
					                    // unpleasant corner cases involving data import.
 | 
				
			||||||
@@ -551,8 +551,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content.find('.user-group-mention').each(function () {
 | 
					        content.find('.user-group-mention').each(function () {
 | 
				
			||||||
            var user_group_id = get_user_group_id_for_mention_button(this);
 | 
					            const user_group_id = get_user_group_id_for_mention_button(this);
 | 
				
			||||||
            var user_group = user_groups.get_user_group_from_id(user_group_id, true);
 | 
					            const user_group = user_groups.get_user_group_from_id(user_group_id, true);
 | 
				
			||||||
            if (user_group === undefined) {
 | 
					            if (user_group === undefined) {
 | 
				
			||||||
                // This is a user group the current user doesn't have
 | 
					                // This is a user group the current user doesn't have
 | 
				
			||||||
                // data on.  This can happen when user groups are
 | 
					                // data on.  This can happen when user groups are
 | 
				
			||||||
@@ -561,7 +561,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var my_user_id = people.my_current_user_id();
 | 
					            const my_user_id = people.my_current_user_id();
 | 
				
			||||||
            // Mark user group you're a member of.
 | 
					            // Mark user group you're a member of.
 | 
				
			||||||
            if (user_groups.is_member_of(user_group_id, my_user_id)) {
 | 
					            if (user_groups.is_member_of(user_group_id, my_user_id)) {
 | 
				
			||||||
                $(this).addClass('user-mention-me');
 | 
					                $(this).addClass('user-mention-me');
 | 
				
			||||||
@@ -575,7 +575,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content.find('a.stream').each(function () {
 | 
					        content.find('a.stream').each(function () {
 | 
				
			||||||
            var stream_id = $(this).attr('data-stream-id');
 | 
					            const stream_id = $(this).attr('data-stream-id');
 | 
				
			||||||
            if (stream_id && !$(this).find(".highlight").length) {
 | 
					            if (stream_id && !$(this).find(".highlight").length) {
 | 
				
			||||||
                // Display the current name for stream if it is not
 | 
					                // Display the current name for stream if it is not
 | 
				
			||||||
                // being displayed in search highlight.
 | 
					                // being displayed in search highlight.
 | 
				
			||||||
@@ -584,12 +584,12 @@ MessageListView.prototype = {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content.find('a.stream-topic').each(function () {
 | 
					        content.find('a.stream-topic').each(function () {
 | 
				
			||||||
            var stream_id = $(this).attr('data-stream-id');
 | 
					            const stream_id = $(this).attr('data-stream-id');
 | 
				
			||||||
            if (stream_id && !$(this).find(".highlight").length) {
 | 
					            if (stream_id && !$(this).find(".highlight").length) {
 | 
				
			||||||
                // Display the current name for stream if it is not
 | 
					                // Display the current name for stream if it is not
 | 
				
			||||||
                // being displayed in search highlight.
 | 
					                // being displayed in search highlight.
 | 
				
			||||||
                var text = $(this).text();
 | 
					                const text = $(this).text();
 | 
				
			||||||
                var topic = text.split('>', 2)[1];
 | 
					                const topic = text.split('>', 2)[1];
 | 
				
			||||||
                $(this).text("#" + stream_data.maybe_get_stream_name(stream_id) + ' > ' + topic);
 | 
					                $(this).text("#" + stream_data.maybe_get_stream_name(stream_id) + ' > ' + topic);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -598,12 +598,12 @@ MessageListView.prototype = {
 | 
				
			|||||||
        // page_params.emojiset is 'text'.
 | 
					        // page_params.emojiset is 'text'.
 | 
				
			||||||
        if (page_params.emojiset === 'text') {
 | 
					        if (page_params.emojiset === 'text') {
 | 
				
			||||||
            content.find(".emoji").replaceWith(function () {
 | 
					            content.find(".emoji").replaceWith(function () {
 | 
				
			||||||
                var text = $(this).attr("title");
 | 
					                const text = $(this).attr("title");
 | 
				
			||||||
                return ":" + text + ":";
 | 
					                return ":" + text + ":";
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var id = rows.id(row);
 | 
					        const id = rows.id(row);
 | 
				
			||||||
        message_edit.maybe_show_edit(row, id);
 | 
					        message_edit.maybe_show_edit(row, id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        submessage.process_submessages({
 | 
					        submessage.process_submessages({
 | 
				
			||||||
@@ -613,18 +613,18 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _get_message_template: function (message_container) {
 | 
					    _get_message_template: function (message_container) {
 | 
				
			||||||
        var msg_reactions = reactions.get_message_reactions(message_container.msg);
 | 
					        const msg_reactions = reactions.get_message_reactions(message_container.msg);
 | 
				
			||||||
        message_container.msg.message_reactions = msg_reactions;
 | 
					        message_container.msg.message_reactions = msg_reactions;
 | 
				
			||||||
        var msg_to_render = _.extend(message_container, {
 | 
					        const msg_to_render = _.extend(message_container, {
 | 
				
			||||||
            table_name: this.table_name,
 | 
					            table_name: this.table_name,
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        return render_single_message(msg_to_render);
 | 
					        return render_single_message(msg_to_render);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _render_group: function (opts) {
 | 
					    _render_group: function (opts) {
 | 
				
			||||||
        var message_groups = opts.message_groups;
 | 
					        const message_groups = opts.message_groups;
 | 
				
			||||||
        var use_match_properties = opts.use_match_properties;
 | 
					        const use_match_properties = opts.use_match_properties;
 | 
				
			||||||
        var table_name = opts.table_name;
 | 
					        const table_name = opts.table_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return $(render_message_group({
 | 
					        return $(render_message_group({
 | 
				
			||||||
            message_groups: message_groups,
 | 
					            message_groups: message_groups,
 | 
				
			||||||
@@ -639,22 +639,22 @@ MessageListView.prototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // Store this in a separate variable so it doesn't get
 | 
					        // Store this in a separate variable so it doesn't get
 | 
				
			||||||
        // confusingly masked in upcoming loops.
 | 
					        // confusingly masked in upcoming loops.
 | 
				
			||||||
        var self = this;
 | 
					        const self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (messages.length === 0 || self.table_name === undefined) {
 | 
					        if (messages.length === 0 || self.table_name === undefined) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var list = self.list; // for convenience
 | 
					        const list = self.list; // for convenience
 | 
				
			||||||
        var table_name = self.table_name;
 | 
					        const table_name = self.table_name;
 | 
				
			||||||
        var table = rows.get_table(table_name);
 | 
					        const table = rows.get_table(table_name);
 | 
				
			||||||
        var orig_scrolltop_offset;
 | 
					        let orig_scrolltop_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // If we start with the message feed scrolled up (i.e.
 | 
					        // If we start with the message feed scrolled up (i.e.
 | 
				
			||||||
        // the bottom message is not visible), then we will respect
 | 
					        // the bottom message is not visible), then we will respect
 | 
				
			||||||
        // the user's current position after rendering, rather
 | 
					        // the user's current position after rendering, rather
 | 
				
			||||||
        // than auto-scrolling.
 | 
					        // than auto-scrolling.
 | 
				
			||||||
        var started_scrolled_up = message_viewport.is_scrolled_up();
 | 
					        const started_scrolled_up = message_viewport.is_scrolled_up();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // The messages we are being asked to render are shared with between
 | 
					        // The messages we are being asked to render are shared with between
 | 
				
			||||||
        // all messages lists. To prevent having both list views overwriting
 | 
					        // all messages lists. To prevent having both list views overwriting
 | 
				
			||||||
@@ -690,13 +690,13 @@ MessageListView.prototype = {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var new_message_groups = self.build_message_groups(message_containers, self.table_name);
 | 
					        const new_message_groups = self.build_message_groups(message_containers, self.table_name);
 | 
				
			||||||
        var message_actions = self.merge_message_groups(new_message_groups, where);
 | 
					        const message_actions = self.merge_message_groups(new_message_groups, where);
 | 
				
			||||||
        var new_dom_elements = [];
 | 
					        let new_dom_elements = [];
 | 
				
			||||||
        var rendered_groups;
 | 
					        let rendered_groups;
 | 
				
			||||||
        var dom_messages;
 | 
					        let dom_messages;
 | 
				
			||||||
        var last_message_row;
 | 
					        let last_message_row;
 | 
				
			||||||
        var last_group_row;
 | 
					        let last_group_row;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        _.each(message_containers, function (message_container) {
 | 
					        _.each(message_containers, function (message_container) {
 | 
				
			||||||
            self.message_containers[message_container.msg.id] = message_container;
 | 
					            self.message_containers[message_container.msg.id] = message_container;
 | 
				
			||||||
@@ -729,7 +729,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
            save_scroll_position();
 | 
					            save_scroll_position();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            _.each(message_actions.rerender_groups, function (message_group) {
 | 
					            _.each(message_actions.rerender_groups, function (message_group) {
 | 
				
			||||||
                var old_message_group = $('#' + message_group.message_group_id);
 | 
					                const old_message_group = $('#' + message_group.message_group_id);
 | 
				
			||||||
                // Remove the top date_row, we'll re-add it after rendering
 | 
					                // Remove the top date_row, we'll re-add it after rendering
 | 
				
			||||||
                old_message_group.prev('.date_row').remove();
 | 
					                old_message_group.prev('.date_row').remove();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -756,9 +756,9 @@ MessageListView.prototype = {
 | 
				
			|||||||
        // entirely, since it appears the next_is_same_sender CSS
 | 
					        // entirely, since it appears the next_is_same_sender CSS
 | 
				
			||||||
        // class doesn't do anything.
 | 
					        // class doesn't do anything.
 | 
				
			||||||
        if (message_actions.rerender_messages_next_same_sender.length > 0) {
 | 
					        if (message_actions.rerender_messages_next_same_sender.length > 0) {
 | 
				
			||||||
            var targets = message_actions.rerender_messages_next_same_sender;
 | 
					            const targets = message_actions.rerender_messages_next_same_sender;
 | 
				
			||||||
            _.each(targets, function (message_container) {
 | 
					            _.each(targets, function (message_container) {
 | 
				
			||||||
                var row = self.get_row(message_container.msg.id);
 | 
					                const row = self.get_row(message_container.msg.id);
 | 
				
			||||||
                $(row).find("div.messagebox").toggleClass("next_is_same_sender",
 | 
					                $(row).find("div.messagebox").toggleClass("next_is_same_sender",
 | 
				
			||||||
                                                          message_container.next_is_same_sender);
 | 
					                                                          message_container.next_is_same_sender);
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
@@ -815,17 +815,17 @@ MessageListView.prototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        restore_scroll_position();
 | 
					        restore_scroll_position();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var last_message_group = _.last(self._message_groups);
 | 
					        const last_message_group = _.last(self._message_groups);
 | 
				
			||||||
        if (last_message_group !== undefined) {
 | 
					        if (last_message_group !== undefined) {
 | 
				
			||||||
            list.last_message_historical =
 | 
					            list.last_message_historical =
 | 
				
			||||||
                _.last(last_message_group.message_containers).msg.historical;
 | 
					                _.last(last_message_group.message_containers).msg.historical;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var stream_name = narrow_state.stream();
 | 
					        const stream_name = narrow_state.stream();
 | 
				
			||||||
        if (stream_name !== undefined) {
 | 
					        if (stream_name !== undefined) {
 | 
				
			||||||
            // If user narrows to a stream, doesn't update
 | 
					            // If user narrows to a stream, doesn't update
 | 
				
			||||||
            // trailing bookend if user is subscribed.
 | 
					            // trailing bookend if user is subscribed.
 | 
				
			||||||
            var sub = stream_data.get_sub(stream_name);
 | 
					            const sub = stream_data.get_sub(stream_name);
 | 
				
			||||||
            if (sub === undefined || !sub.subscribed) {
 | 
					            if (sub === undefined || !sub.subscribed) {
 | 
				
			||||||
                list.update_trailing_bookend();
 | 
					                list.update_trailing_bookend();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -834,12 +834,12 @@ MessageListView.prototype = {
 | 
				
			|||||||
        if (list === current_msg_list) {
 | 
					        if (list === current_msg_list) {
 | 
				
			||||||
            // Update the fade.
 | 
					            // Update the fade.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var get_element = function (message_group) {
 | 
					            const get_element = function (message_group) {
 | 
				
			||||||
                // We don't have a MessageGroup class, but we can at least hide the messy details
 | 
					                // We don't have a MessageGroup class, but we can at least hide the messy details
 | 
				
			||||||
                // of rows.js from compose_fade.  We provide a callback function to be lazy--
 | 
					                // of rows.js from compose_fade.  We provide a callback function to be lazy--
 | 
				
			||||||
                // compose_fade may not actually need the elements depending on its internal
 | 
					                // compose_fade may not actually need the elements depending on its internal
 | 
				
			||||||
                // state.
 | 
					                // state.
 | 
				
			||||||
                var message_row = self.get_row(message_group.message_containers[0].msg.id);
 | 
					                const message_row = self.get_row(message_group.message_containers[0].msg.id);
 | 
				
			||||||
                return rows.get_message_recipient_row(message_row);
 | 
					                return rows.get_message_recipient_row(message_row);
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -850,8 +850,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
            // First, in single-recipient narrows, potentially
 | 
					            // First, in single-recipient narrows, potentially
 | 
				
			||||||
            // auto-scroll to the latest message if it was sent by us.
 | 
					            // auto-scroll to the latest message if it was sent by us.
 | 
				
			||||||
            if (narrow_state.narrowed_by_reply()) {
 | 
					            if (narrow_state.narrowed_by_reply()) {
 | 
				
			||||||
                var selected_id = list.selected_id();
 | 
					                const selected_id = list.selected_id();
 | 
				
			||||||
                var i;
 | 
					                let i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // Iterate backwards to find the last message
 | 
					                // Iterate backwards to find the last message
 | 
				
			||||||
                // sent_by_me, stopping at the pointer position.
 | 
					                // sent_by_me, stopping at the pointer position.
 | 
				
			||||||
@@ -859,7 +859,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
                // should be limited in how far offscreen it's willing
 | 
					                // should be limited in how far offscreen it's willing
 | 
				
			||||||
                // to go.
 | 
					                // to go.
 | 
				
			||||||
                for (i = messages.length - 1; i >= 0; i -= 1) {
 | 
					                for (i = messages.length - 1; i >= 0; i -= 1) {
 | 
				
			||||||
                    var id = messages[i].id;
 | 
					                    const id = messages[i].id;
 | 
				
			||||||
                    if (id <= selected_id) {
 | 
					                    if (id <= selected_id) {
 | 
				
			||||||
                        break;
 | 
					                        break;
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
@@ -878,8 +878,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
                    need_user_to_scroll: true,
 | 
					                    need_user_to_scroll: true,
 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var new_messages_height = self._new_messages_height(new_dom_elements);
 | 
					            const new_messages_height = self._new_messages_height(new_dom_elements);
 | 
				
			||||||
            var need_user_to_scroll = self._maybe_autoscroll(new_messages_height);
 | 
					            const need_user_to_scroll = self._maybe_autoscroll(new_messages_height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (need_user_to_scroll) {
 | 
					            if (need_user_to_scroll) {
 | 
				
			||||||
                return {
 | 
					                return {
 | 
				
			||||||
@@ -890,8 +890,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _new_messages_height: function (rendered_elems) {
 | 
					    _new_messages_height: function (rendered_elems) {
 | 
				
			||||||
        var new_messages_height = 0;
 | 
					        let new_messages_height = 0;
 | 
				
			||||||
        var id_of_last_message_sent_by_us = -1;
 | 
					        let id_of_last_message_sent_by_us = -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // C++ iterators would have made this less painful
 | 
					        // C++ iterators would have made this less painful
 | 
				
			||||||
        _.each(rendered_elems.reverse(), function (elem) {
 | 
					        _.each(rendered_elems.reverse(), function (elem) {
 | 
				
			||||||
@@ -903,7 +903,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
                if (id_of_last_message_sent_by_us > -1) {
 | 
					                if (id_of_last_message_sent_by_us > -1) {
 | 
				
			||||||
                    return;
 | 
					                    return;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                var row_id = rows.id(elem);
 | 
					                const row_id = rows.id(elem);
 | 
				
			||||||
                // check for `row_id` NaN in case we're looking at a date row or bookend row
 | 
					                // check for `row_id` NaN in case we're looking at a date row or bookend row
 | 
				
			||||||
                if (row_id > -1 &&
 | 
					                if (row_id > -1 &&
 | 
				
			||||||
                    people.is_current_user(this.get_message(row_id).sender_email)) {
 | 
					                    people.is_current_user(this.get_message(row_id).sender_email)) {
 | 
				
			||||||
@@ -920,8 +920,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
        // it's the max amount that we can scroll down (or "skooch
 | 
					        // it's the max amount that we can scroll down (or "skooch
 | 
				
			||||||
        // up" the messages) before knocking the selected message
 | 
					        // up" the messages) before knocking the selected message
 | 
				
			||||||
        // out of the feed.
 | 
					        // out of the feed.
 | 
				
			||||||
        var selected_row_top = selected_row.offset().top;
 | 
					        const selected_row_top = selected_row.offset().top;
 | 
				
			||||||
        var scroll_limit = selected_row_top - viewport_info.visible_top;
 | 
					        let scroll_limit = selected_row_top - viewport_info.visible_top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (scroll_limit < 0) {
 | 
					        if (scroll_limit < 0) {
 | 
				
			||||||
            // This shouldn't happen, but if we're off by a pixel or
 | 
					            // This shouldn't happen, but if we're off by a pixel or
 | 
				
			||||||
@@ -940,8 +940,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
        //
 | 
					        //
 | 
				
			||||||
        // returns `true` if we need the user to scroll
 | 
					        // returns `true` if we need the user to scroll
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var selected_row = this.selected_row();
 | 
					        const selected_row = this.selected_row();
 | 
				
			||||||
        var last_visible = rows.last_visible();
 | 
					        const last_visible = rows.last_visible();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Make sure we have a selected row and last visible row. (defensive)
 | 
					        // Make sure we have a selected row and last visible row. (defensive)
 | 
				
			||||||
        if (!(selected_row && selected_row.length > 0 && last_visible)) {
 | 
					        if (!(selected_row && selected_row.length > 0 && last_visible)) {
 | 
				
			||||||
@@ -971,8 +971,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var info = message_viewport.message_viewport_info();
 | 
					        const info = message_viewport.message_viewport_info();
 | 
				
			||||||
        var scroll_limit = this._scroll_limit(selected_row, info);
 | 
					        const scroll_limit = this._scroll_limit(selected_row, info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // This next decision is fairly debatable.  For a big message that
 | 
					        // This next decision is fairly debatable.  For a big message that
 | 
				
			||||||
        // would push the pointer off the screen, we do a partial autoscroll,
 | 
					        // would push the pointer off the screen, we do a partial autoscroll,
 | 
				
			||||||
@@ -982,8 +982,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
        //    c) scroll amount isn't really tied to size of new messages (bad)
 | 
					        //    c) scroll amount isn't really tied to size of new messages (bad)
 | 
				
			||||||
        //    d) all the bad things about scrolling for users who want messages
 | 
					        //    d) all the bad things about scrolling for users who want messages
 | 
				
			||||||
        //       to stay on the screen
 | 
					        //       to stay on the screen
 | 
				
			||||||
        var scroll_amount;
 | 
					        let scroll_amount;
 | 
				
			||||||
        var need_user_to_scroll;
 | 
					        let need_user_to_scroll;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (new_messages_height <= scroll_limit) {
 | 
					        if (new_messages_height <= scroll_limit) {
 | 
				
			||||||
            // This is the happy path where we can just scroll
 | 
					            // This is the happy path where we can just scroll
 | 
				
			||||||
@@ -997,7 +997,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
            // (Even if we are somewhat constrained here, the message may
 | 
					            // (Even if we are somewhat constrained here, the message may
 | 
				
			||||||
            // still end up being visible, so we do some arithmetic.)
 | 
					            // still end up being visible, so we do some arithmetic.)
 | 
				
			||||||
            scroll_amount = scroll_limit;
 | 
					            scroll_amount = scroll_limit;
 | 
				
			||||||
            var offset = message_viewport.offset_from_bottom(last_visible);
 | 
					            const offset = message_viewport.offset_from_bottom(last_visible);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // For determining whether we need to show the user a "you
 | 
					            // For determining whether we need to show the user a "you
 | 
				
			||||||
            // need to scroll down" notification, the obvious check
 | 
					            // need to scroll down" notification, the obvious check
 | 
				
			||||||
@@ -1011,11 +1011,11 @@ MessageListView.prototype = {
 | 
				
			|||||||
            // this notification, we need to adjust by the amount that
 | 
					            // this notification, we need to adjust by the amount that
 | 
				
			||||||
            // the current compose is bigger than the empty, open
 | 
					            // the current compose is bigger than the empty, open
 | 
				
			||||||
            // compose box.
 | 
					            // compose box.
 | 
				
			||||||
            var compose_textarea_default_height = 42;
 | 
					            const compose_textarea_default_height = 42;
 | 
				
			||||||
            var compose_textarea_current_height = $("#compose-textarea").height();
 | 
					            const compose_textarea_current_height = $("#compose-textarea").height();
 | 
				
			||||||
            var expected_change =
 | 
					            const expected_change =
 | 
				
			||||||
                compose_textarea_current_height - compose_textarea_default_height;
 | 
					                compose_textarea_current_height - compose_textarea_default_height;
 | 
				
			||||||
            var expected_offset = offset - expected_change;
 | 
					            const expected_offset = offset - expected_change;
 | 
				
			||||||
            need_user_to_scroll = expected_offset > scroll_amount;
 | 
					            need_user_to_scroll = expected_offset > scroll_amount;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1039,7 +1039,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    update_render_window: function (selected_idx, check_for_changed) {
 | 
					    update_render_window: function (selected_idx, check_for_changed) {
 | 
				
			||||||
        var new_start = Math.max(selected_idx - this._RENDER_WINDOW_SIZE / 2, 0);
 | 
					        const new_start = Math.max(selected_idx - this._RENDER_WINDOW_SIZE / 2, 0);
 | 
				
			||||||
        if (check_for_changed && new_start === this._render_win_start) {
 | 
					        if (check_for_changed && new_start === this._render_win_start) {
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1056,7 +1056,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var selected_idx = this.list.selected_idx();
 | 
					        const selected_idx = this.list.selected_idx();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // We rerender under the following conditions:
 | 
					        // We rerender under the following conditions:
 | 
				
			||||||
        // * The selected message is within this._RENDER_THRESHOLD messages
 | 
					        // * The selected message is within this._RENDER_THRESHOLD messages
 | 
				
			||||||
@@ -1085,9 +1085,9 @@ MessageListView.prototype = {
 | 
				
			|||||||
    rerender_preserving_scrolltop: function (discard_rendering_state) {
 | 
					    rerender_preserving_scrolltop: function (discard_rendering_state) {
 | 
				
			||||||
        // old_offset is the number of pixels between the top of the
 | 
					        // old_offset is the number of pixels between the top of the
 | 
				
			||||||
        // viewable window and the selected message
 | 
					        // viewable window and the selected message
 | 
				
			||||||
        var old_offset;
 | 
					        let old_offset;
 | 
				
			||||||
        var selected_row = this.selected_row();
 | 
					        const selected_row = this.selected_row();
 | 
				
			||||||
        var selected_in_view = selected_row.length > 0;
 | 
					        const selected_in_view = selected_row.length > 0;
 | 
				
			||||||
        if (selected_in_view) {
 | 
					        if (selected_in_view) {
 | 
				
			||||||
            old_offset = selected_row.offset().top;
 | 
					            old_offset = selected_row.offset().top;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1102,7 +1102,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set_message_offset: function (offset) {
 | 
					    set_message_offset: function (offset) {
 | 
				
			||||||
        var msg = this.selected_row();
 | 
					        const msg = this.selected_row();
 | 
				
			||||||
        message_viewport.scrollTop(message_viewport.scrollTop() + msg.offset().top - offset);
 | 
					        message_viewport.scrollTop(message_viewport.scrollTop() + msg.offset().top - offset);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1148,23 +1148,23 @@ MessageListView.prototype = {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var first_row = this.get_row(message_containers[0].msg.id);
 | 
					        const first_row = this.get_row(message_containers[0].msg.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // We may not have the row if the stream or topic was muted
 | 
					        // We may not have the row if the stream or topic was muted
 | 
				
			||||||
        if (first_row.length === 0) {
 | 
					        if (first_row.length === 0) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var recipient_row = rows.get_message_recipient_row(first_row);
 | 
					        const recipient_row = rows.get_message_recipient_row(first_row);
 | 
				
			||||||
        var header = recipient_row.find('.message_header');
 | 
					        const header = recipient_row.find('.message_header');
 | 
				
			||||||
        var message_group_id = recipient_row.attr("id");
 | 
					        const message_group_id = recipient_row.attr("id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Since there might be multiple dates within the message
 | 
					        // Since there might be multiple dates within the message
 | 
				
			||||||
        // group, it's important to lookup the original/full message
 | 
					        // group, it's important to lookup the original/full message
 | 
				
			||||||
        // group rather than doing an artificial rerendering of the
 | 
					        // group rather than doing an artificial rerendering of the
 | 
				
			||||||
        // message header from the set of message containers passed in
 | 
					        // message header from the set of message containers passed in
 | 
				
			||||||
        // here.
 | 
					        // here.
 | 
				
			||||||
        var group = this._find_message_group(message_group_id);
 | 
					        const group = this._find_message_group(message_group_id);
 | 
				
			||||||
        if (group === undefined) {
 | 
					        if (group === undefined) {
 | 
				
			||||||
            blueslip.error("Could not find message group for rerendering headers");
 | 
					            blueslip.error("Could not find message group for rerendering headers");
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -1176,14 +1176,14 @@ MessageListView.prototype = {
 | 
				
			|||||||
        // rerendering rather than looking up the original version.
 | 
					        // rerendering rather than looking up the original version.
 | 
				
			||||||
        populate_group_from_message_container(group, group.message_containers[0]);
 | 
					        populate_group_from_message_container(group, group.message_containers[0]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var rendered_recipient_row = $(render_recipient_row(group));
 | 
					        const rendered_recipient_row = $(render_recipient_row(group));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        header.replaceWith(rendered_recipient_row);
 | 
					        header.replaceWith(rendered_recipient_row);
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _rerender_message: function (message_container, message_content_edited) {
 | 
					    _rerender_message: function (message_container, message_content_edited) {
 | 
				
			||||||
        var row = this.get_row(message_container.msg.id);
 | 
					        const row = this.get_row(message_container.msg.id);
 | 
				
			||||||
        var was_selected = this.list.selected_message() === message_container.msg;
 | 
					        const was_selected = this.list.selected_message() === message_container.msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Re-render just this one message
 | 
					        // Re-render just this one message
 | 
				
			||||||
        this._maybe_format_me_message(message_container);
 | 
					        this._maybe_format_me_message(message_container);
 | 
				
			||||||
@@ -1192,7 +1192,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
        // Make sure the right thing happens if the message was edited to mention us.
 | 
					        // Make sure the right thing happens if the message was edited to mention us.
 | 
				
			||||||
        message_container.contains_mention = message_container.msg.mentioned;
 | 
					        message_container.contains_mention = message_container.msg.mentioned;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var rendered_msg = $(this._get_message_template(message_container));
 | 
					        const rendered_msg = $(this._get_message_template(message_container));
 | 
				
			||||||
        if (message_content_edited) {
 | 
					        if (message_content_edited) {
 | 
				
			||||||
            rendered_msg.addClass("fade-in-message");
 | 
					            rendered_msg.addClass("fade-in-message");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1205,10 +1205,10 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rerender_messages: function (messages, message_content_edited) {
 | 
					    rerender_messages: function (messages, message_content_edited) {
 | 
				
			||||||
        var self = this;
 | 
					        const self = this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Convert messages to list messages
 | 
					        // Convert messages to list messages
 | 
				
			||||||
        var message_containers = _.map(messages, function (message) {
 | 
					        let message_containers = _.map(messages, function (message) {
 | 
				
			||||||
            return self.message_containers[message.id];
 | 
					            return self.message_containers[message.id];
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        // We may not have the message_container if the stream or topic was muted
 | 
					        // We may not have the message_container if the stream or topic was muted
 | 
				
			||||||
@@ -1216,8 +1216,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
            return message_container === undefined;
 | 
					            return message_container === undefined;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var message_groups = [];
 | 
					        const message_groups = [];
 | 
				
			||||||
        var current_group = [];
 | 
					        let current_group = [];
 | 
				
			||||||
        _.each(message_containers, function (message_container) {
 | 
					        _.each(message_containers, function (message_container) {
 | 
				
			||||||
            if (current_group.length === 0 ||
 | 
					            if (current_group.length === 0 ||
 | 
				
			||||||
                same_recipient(current_group[current_group.length - 1], message_container)) {
 | 
					                same_recipient(current_group[current_group.length - 1], message_container)) {
 | 
				
			||||||
@@ -1237,11 +1237,11 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    append: function (messages, messages_are_new) {
 | 
					    append: function (messages, messages_are_new) {
 | 
				
			||||||
        var cur_window_size = this._render_win_end - this._render_win_start;
 | 
					        const cur_window_size = this._render_win_end - this._render_win_start;
 | 
				
			||||||
        var render_info;
 | 
					        let render_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (cur_window_size < this._RENDER_WINDOW_SIZE) {
 | 
					        if (cur_window_size < this._RENDER_WINDOW_SIZE) {
 | 
				
			||||||
            var slice_to_render = messages.slice(0, this._RENDER_WINDOW_SIZE - cur_window_size);
 | 
					            const slice_to_render = messages.slice(0, this._RENDER_WINDOW_SIZE - cur_window_size);
 | 
				
			||||||
            render_info = this.render(slice_to_render, 'bottom', messages_are_new);
 | 
					            render_info = this.render(slice_to_render, 'bottom', messages_are_new);
 | 
				
			||||||
            this._render_win_end += slice_to_render.length;
 | 
					            this._render_win_end += slice_to_render.length;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1251,7 +1251,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
        // newly received message should trigger a rerender so that
 | 
					        // newly received message should trigger a rerender so that
 | 
				
			||||||
        // the new message, which will appear in the viewable area,
 | 
					        // the new message, which will appear in the viewable area,
 | 
				
			||||||
        // is rendered.
 | 
					        // is rendered.
 | 
				
			||||||
        var needed_rerender = this.maybe_rerender();
 | 
					        const needed_rerender = this.maybe_rerender();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (needed_rerender) {
 | 
					        if (needed_rerender) {
 | 
				
			||||||
            render_info = {need_user_to_scroll: true};
 | 
					            render_info = {need_user_to_scroll: true};
 | 
				
			||||||
@@ -1264,10 +1264,10 @@ MessageListView.prototype = {
 | 
				
			|||||||
        this._render_win_start += messages.length;
 | 
					        this._render_win_start += messages.length;
 | 
				
			||||||
        this._render_win_end += messages.length;
 | 
					        this._render_win_end += messages.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var cur_window_size = this._render_win_end - this._render_win_start;
 | 
					        const cur_window_size = this._render_win_end - this._render_win_start;
 | 
				
			||||||
        if (cur_window_size < this._RENDER_WINDOW_SIZE) {
 | 
					        if (cur_window_size < this._RENDER_WINDOW_SIZE) {
 | 
				
			||||||
            var msgs_to_render_count = this._RENDER_WINDOW_SIZE - cur_window_size;
 | 
					            const msgs_to_render_count = this._RENDER_WINDOW_SIZE - cur_window_size;
 | 
				
			||||||
            var slice_to_render = messages.slice(messages.length - msgs_to_render_count);
 | 
					            const slice_to_render = messages.slice(messages.length - msgs_to_render_count);
 | 
				
			||||||
            this.render(slice_to_render, 'top', false);
 | 
					            this.render(slice_to_render, 'top', false);
 | 
				
			||||||
            this._render_win_start -= slice_to_render.length;
 | 
					            this._render_win_start -= slice_to_render.length;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1287,7 +1287,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    get_row: function (id) {
 | 
					    get_row: function (id) {
 | 
				
			||||||
        var row = this._rows[id];
 | 
					        const row = this._rows[id];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (row === undefined) {
 | 
					        if (row === undefined) {
 | 
				
			||||||
            // For legacy reasons we need to return an empty
 | 
					            // For legacy reasons we need to return an empty
 | 
				
			||||||
@@ -1299,12 +1299,12 @@ MessageListView.prototype = {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    clear_trailing_bookend: function () {
 | 
					    clear_trailing_bookend: function () {
 | 
				
			||||||
        var trailing_bookend = rows.get_table(this.table_name).find('.trailing_bookend');
 | 
					        const trailing_bookend = rows.get_table(this.table_name).find('.trailing_bookend');
 | 
				
			||||||
        trailing_bookend.remove();
 | 
					        trailing_bookend.remove();
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render_trailing_bookend: function (trailing_bookend_content, subscribed, show_button) {
 | 
					    render_trailing_bookend: function (trailing_bookend_content, subscribed, show_button) {
 | 
				
			||||||
        var rendered_trailing_bookend = $(render_bookend({
 | 
					        const rendered_trailing_bookend = $(render_bookend({
 | 
				
			||||||
            bookend_content: trailing_bookend_content,
 | 
					            bookend_content: trailing_bookend_content,
 | 
				
			||||||
            trailing: show_button,
 | 
					            trailing: show_button,
 | 
				
			||||||
            subscribed: subscribed,
 | 
					            subscribed: subscribed,
 | 
				
			||||||
@@ -1322,7 +1322,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    change_message_id: function (old_id, new_id) {
 | 
					    change_message_id: function (old_id, new_id) {
 | 
				
			||||||
        if (this._rows[old_id] !== undefined) {
 | 
					        if (this._rows[old_id] !== undefined) {
 | 
				
			||||||
            var row = this._rows[old_id];
 | 
					            const row = this._rows[old_id];
 | 
				
			||||||
            delete this._rows[old_id];
 | 
					            delete this._rows[old_id];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            row.attr('zid', new_id);
 | 
					            row.attr('zid', new_id);
 | 
				
			||||||
@@ -1332,7 +1332,7 @@ MessageListView.prototype = {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.message_containers[old_id] !== undefined) {
 | 
					        if (this.message_containers[old_id] !== undefined) {
 | 
				
			||||||
            var message_container = this.message_containers[old_id];
 | 
					            const message_container = this.message_containers[old_id];
 | 
				
			||||||
            delete this.message_containers[old_id];
 | 
					            delete this.message_containers[old_id];
 | 
				
			||||||
            this.message_containers[new_id] = message_container;
 | 
					            this.message_containers[new_id] = message_container;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -1344,8 +1344,8 @@ MessageListView.prototype = {
 | 
				
			|||||||
            // Slice the '<p>/me ' off the front, and '</p>' off the first line
 | 
					            // Slice the '<p>/me ' off the front, and '</p>' off the first line
 | 
				
			||||||
            // 'p' tag is sliced off to get sender in the same line as the
 | 
					            // 'p' tag is sliced off to get sender in the same line as the
 | 
				
			||||||
            // first line of the message
 | 
					            // first line of the message
 | 
				
			||||||
            var msg_content = message_container.msg.content;
 | 
					            const msg_content = message_container.msg.content;
 | 
				
			||||||
            var p_index = msg_content.indexOf('</p>');
 | 
					            const p_index = msg_content.indexOf('</p>');
 | 
				
			||||||
            message_container.status_message = msg_content.slice('<p>/me '.length, p_index) +
 | 
					            message_container.status_message = msg_content.slice('<p>/me '.length, p_index) +
 | 
				
			||||||
                                                msg_content.slice(p_index + '</p>'.length);
 | 
					                                                msg_content.slice(p_index + '</p>'.length);
 | 
				
			||||||
            message_container.include_sender = true;
 | 
					            message_container.include_sender = true;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
var unnarrow_times;
 | 
					let unnarrow_times;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function report_narrow_time(initial_core_time, initial_free_time, network_time) {
 | 
					function report_narrow_time(initial_core_time, initial_free_time, network_time) {
 | 
				
			||||||
    channel.post({
 | 
					    channel.post({
 | 
				
			||||||
@@ -28,8 +28,8 @@ function report_unnarrow_time() {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var initial_core_time = unnarrow_times.initial_core_time - unnarrow_times.start_time;
 | 
					    const initial_core_time = unnarrow_times.initial_core_time - unnarrow_times.start_time;
 | 
				
			||||||
    var initial_free_time = unnarrow_times.initial_free_time - unnarrow_times.start_time;
 | 
					    const initial_free_time = unnarrow_times.initial_free_time - unnarrow_times.start_time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    channel.post({
 | 
					    channel.post({
 | 
				
			||||||
        url: '/json/report/unnarrow_times',
 | 
					        url: '/json/report/unnarrow_times',
 | 
				
			||||||
@@ -58,8 +58,8 @@ exports.save_pre_narrow_offset_for_reload = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.narrow_title = "home";
 | 
					exports.narrow_title = "home";
 | 
				
			||||||
exports.activate = function (raw_operators, opts) {
 | 
					exports.activate = function (raw_operators, opts) {
 | 
				
			||||||
    var start_time = new Date();
 | 
					    const start_time = new Date();
 | 
				
			||||||
    var was_narrowed_already = narrow_state.active();
 | 
					    const was_narrowed_already = narrow_state.active();
 | 
				
			||||||
    // most users aren't going to send a bunch of a out-of-narrow messages
 | 
					    // most users aren't going to send a bunch of a out-of-narrow messages
 | 
				
			||||||
    // and expect to visit a list of narrows, so let's get these out of the way.
 | 
					    // and expect to visit a list of narrows, so let's get these out of the way.
 | 
				
			||||||
    notifications.clear_compose_notifications();
 | 
					    notifications.clear_compose_notifications();
 | 
				
			||||||
@@ -71,8 +71,8 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
    if (raw_operators.length === 0) {
 | 
					    if (raw_operators.length === 0) {
 | 
				
			||||||
        return exports.deactivate();
 | 
					        return exports.deactivate();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    var filter = new Filter(raw_operators);
 | 
					    const filter = new Filter(raw_operators);
 | 
				
			||||||
    var operators = filter.operators();
 | 
					    const operators = filter.operators();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Take the most detailed part of the narrow to use as the title.
 | 
					    // Take the most detailed part of the narrow to use as the title.
 | 
				
			||||||
    // If the operator is something other than "stream", "topic", or
 | 
					    // If the operator is something other than "stream", "topic", or
 | 
				
			||||||
@@ -84,14 +84,14 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
            exports.narrow_title = filter.operands("stream")[0];
 | 
					            exports.narrow_title = filter.operands("stream")[0];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else if (filter.has_operator("is")) {
 | 
					    } else if (filter.has_operator("is")) {
 | 
				
			||||||
        var title = filter.operands("is")[0];
 | 
					        let title = filter.operands("is")[0];
 | 
				
			||||||
        title = title.charAt(0).toUpperCase() + title.slice(1) + " messages";
 | 
					        title = title.charAt(0).toUpperCase() + title.slice(1) + " messages";
 | 
				
			||||||
        exports.narrow_title = title;
 | 
					        exports.narrow_title = title;
 | 
				
			||||||
    } else if (filter.has_operator("pm-with") || filter.has_operator("group-pm-with")) {
 | 
					    } else if (filter.has_operator("pm-with") || filter.has_operator("group-pm-with")) {
 | 
				
			||||||
        var emails = filter.public_operators()[0].operand;
 | 
					        const emails = filter.public_operators()[0].operand;
 | 
				
			||||||
        var user_ids = people.emails_strings_to_user_ids_string(emails);
 | 
					        const user_ids = people.emails_strings_to_user_ids_string(emails);
 | 
				
			||||||
        if (user_ids !== undefined) {
 | 
					        if (user_ids !== undefined) {
 | 
				
			||||||
            var names = people.get_recipients(user_ids);
 | 
					            const names = people.get_recipients(user_ids);
 | 
				
			||||||
            if (filter.has_operator("pm-with")) {
 | 
					            if (filter.has_operator("pm-with")) {
 | 
				
			||||||
                exports.narrow_title = names;
 | 
					                exports.narrow_title = names;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
@@ -120,7 +120,7 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
        trigger: 'unknown',
 | 
					        trigger: 'unknown',
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var id_info = {
 | 
					    const id_info = {
 | 
				
			||||||
        target_id: undefined,
 | 
					        target_id: undefined,
 | 
				
			||||||
        local_select_id: undefined,
 | 
					        local_select_id: undefined,
 | 
				
			||||||
        final_select_id: undefined,
 | 
					        final_select_id: undefined,
 | 
				
			||||||
@@ -140,7 +140,7 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
        // having a near: narrow auto-reloaded.
 | 
					        // having a near: narrow auto-reloaded.
 | 
				
			||||||
        id_info.target_id = opts.then_select_id;
 | 
					        id_info.target_id = opts.then_select_id;
 | 
				
			||||||
        if (opts.then_select_offset === undefined) {
 | 
					        if (opts.then_select_offset === undefined) {
 | 
				
			||||||
            var row = current_msg_list.get_row(opts.then_select_id);
 | 
					            const row = current_msg_list.get_row(opts.then_select_id);
 | 
				
			||||||
            if (row.length > 0) {
 | 
					            if (row.length > 0) {
 | 
				
			||||||
                opts.then_select_offset = row.offset().top;
 | 
					                opts.then_select_offset = row.offset().top;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -157,12 +157,12 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
    // reflect the upcoming narrow.
 | 
					    // reflect the upcoming narrow.
 | 
				
			||||||
    narrow_state.set_current_filter(filter);
 | 
					    narrow_state.set_current_filter(filter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var muting_enabled = narrow_state.muting_enabled();
 | 
					    const muting_enabled = narrow_state.muting_enabled();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Save how far from the pointer the top of the message list was.
 | 
					    // Save how far from the pointer the top of the message list was.
 | 
				
			||||||
    exports.save_pre_narrow_offset_for_reload();
 | 
					    exports.save_pre_narrow_offset_for_reload();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var msg_data =  new MessageListData({
 | 
					    let msg_data =  new MessageListData({
 | 
				
			||||||
        filter: narrow_state.filter(),
 | 
					        filter: narrow_state.filter(),
 | 
				
			||||||
        muting_enabled: muting_enabled,
 | 
					        muting_enabled: muting_enabled,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
@@ -189,7 +189,7 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var msg_list = new message_list.MessageList({
 | 
					    const msg_list = new message_list.MessageList({
 | 
				
			||||||
        data: msg_data,
 | 
					        data: msg_data,
 | 
				
			||||||
        table_name: 'zfilt',
 | 
					        table_name: 'zfilt',
 | 
				
			||||||
        collapse_messages: !narrow_state.filter().is_search(),
 | 
					        collapse_messages: !narrow_state.filter().is_search(),
 | 
				
			||||||
@@ -208,16 +208,16 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
    message_list.set_narrowed(msg_list);
 | 
					    message_list.set_narrowed(msg_list);
 | 
				
			||||||
    current_msg_list = message_list.narrowed;
 | 
					    current_msg_list = message_list.narrowed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var then_select_offset;
 | 
					    let then_select_offset;
 | 
				
			||||||
    if (id_info.target_id === id_info.final_select_id) {
 | 
					    if (id_info.target_id === id_info.final_select_id) {
 | 
				
			||||||
        then_select_offset = opts.then_select_offset;
 | 
					        then_select_offset = opts.then_select_offset;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var select_immediately = id_info.local_select_id !== undefined;
 | 
					    const select_immediately = id_info.local_select_id !== undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function fetch_messages() {
 | 
					    (function fetch_messages() {
 | 
				
			||||||
        var anchor;
 | 
					        let anchor;
 | 
				
			||||||
        var use_first_unread;
 | 
					        let use_first_unread;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (id_info.final_select_id !== undefined) {
 | 
					        if (id_info.final_select_id !== undefined) {
 | 
				
			||||||
            anchor = id_info.final_select_id;
 | 
					            anchor = id_info.final_select_id;
 | 
				
			||||||
@@ -266,7 +266,7 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
    if (page_params.search_pills_enabled && opts.trigger !== 'search') {
 | 
					    if (page_params.search_pills_enabled && opts.trigger !== 'search') {
 | 
				
			||||||
        search_pill_widget.widget.clear(true);
 | 
					        search_pill_widget.widget.clear(true);
 | 
				
			||||||
        _.each(operators, function (operator) {
 | 
					        _.each(operators, function (operator) {
 | 
				
			||||||
            var search_string = Filter.unparse([operator]);
 | 
					            const search_string = Filter.unparse([operator]);
 | 
				
			||||||
            search_pill.append_search_string(search_string, search_pill_widget.widget);
 | 
					            search_pill.append_search_string(search_string, search_pill_widget.widget);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -295,7 +295,7 @@ exports.activate = function (raw_operators, opts) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    compose_actions.on_narrow(opts);
 | 
					    compose_actions.on_narrow(opts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var current_filter = narrow_state.filter();
 | 
					    const current_filter = narrow_state.filter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    top_left_corner.handle_narrow_activated(current_filter);
 | 
					    top_left_corner.handle_narrow_activated(current_filter);
 | 
				
			||||||
    stream_list.handle_narrow_activated(current_filter);
 | 
					    stream_list.handle_narrow_activated(current_filter);
 | 
				
			||||||
@@ -325,7 +325,7 @@ function load_local_messages(msg_data) {
 | 
				
			|||||||
    // cases when our local cache (message_list.all) has at least
 | 
					    // cases when our local cache (message_list.all) has at least
 | 
				
			||||||
    // one message the user will expect to see in the new narrow.
 | 
					    // one message the user will expect to see in the new narrow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var in_msgs = message_list.all.all_messages();
 | 
					    const in_msgs = message_list.all.all_messages();
 | 
				
			||||||
    msg_data.add_messages(in_msgs);
 | 
					    msg_data.add_messages(in_msgs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return !msg_data.empty();
 | 
					    return !msg_data.empty();
 | 
				
			||||||
@@ -337,9 +337,9 @@ exports.maybe_add_local_messages = function (opts) {
 | 
				
			|||||||
    //
 | 
					    //
 | 
				
			||||||
    //  - update id_info with more complete values
 | 
					    //  - update id_info with more complete values
 | 
				
			||||||
    //  - add messages into our message list from our local cache
 | 
					    //  - add messages into our message list from our local cache
 | 
				
			||||||
    var id_info = opts.id_info;
 | 
					    const id_info = opts.id_info;
 | 
				
			||||||
    var msg_data = opts.msg_data;
 | 
					    const msg_data = opts.msg_data;
 | 
				
			||||||
    var unread_info = narrow_state.get_first_unread_info();
 | 
					    const unread_info = narrow_state.get_first_unread_info();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (unread_info.flavor === 'cannot_compute') {
 | 
					    if (unread_info.flavor === 'cannot_compute') {
 | 
				
			||||||
        if (id_info.target_id) {
 | 
					        if (id_info.target_id) {
 | 
				
			||||||
@@ -405,7 +405,7 @@ exports.maybe_add_local_messages = function (opts) {
 | 
				
			|||||||
        // is caught up, so the last message in our now-populated
 | 
					        // is caught up, so the last message in our now-populated
 | 
				
			||||||
        // msg_data object must be the last message matching the
 | 
					        // msg_data object must be the last message matching the
 | 
				
			||||||
        // narrow the server could give us, so we can render locally.
 | 
					        // narrow the server could give us, so we can render locally.
 | 
				
			||||||
        var last_msg = msg_data.last();
 | 
					        const last_msg = msg_data.last();
 | 
				
			||||||
        id_info.final_select_id = last_msg.id;
 | 
					        id_info.final_select_id = last_msg.id;
 | 
				
			||||||
        id_info.local_select_id = id_info.final_select_id;
 | 
					        id_info.local_select_id = id_info.final_select_id;
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -445,19 +445,19 @@ exports.update_selection = function (opts) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var id_info = opts.id_info;
 | 
					    const id_info = opts.id_info;
 | 
				
			||||||
    var select_offset = opts.select_offset;
 | 
					    const select_offset = opts.select_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var msg_id = id_info.final_select_id;
 | 
					    let msg_id = id_info.final_select_id;
 | 
				
			||||||
    if (msg_id === undefined) {
 | 
					    if (msg_id === undefined) {
 | 
				
			||||||
        msg_id = message_list.narrowed.first_unread_message_id();
 | 
					        msg_id = message_list.narrowed.first_unread_message_id();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var preserve_pre_narrowing_screen_position =
 | 
					    const preserve_pre_narrowing_screen_position =
 | 
				
			||||||
        message_list.narrowed.get(msg_id) !== undefined &&
 | 
					        message_list.narrowed.get(msg_id) !== undefined &&
 | 
				
			||||||
        select_offset !== undefined;
 | 
					        select_offset !== undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var then_scroll = !preserve_pre_narrowing_screen_position;
 | 
					    const then_scroll = !preserve_pre_narrowing_screen_position;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    message_list.narrowed.select_id(msg_id, {
 | 
					    message_list.narrowed.select_id(msg_id, {
 | 
				
			||||||
        then_scroll: then_scroll,
 | 
					        then_scroll: then_scroll,
 | 
				
			||||||
@@ -478,7 +478,7 @@ exports.stream_topic = function () {
 | 
				
			|||||||
    // This function returns the stream/topic that we most
 | 
					    // This function returns the stream/topic that we most
 | 
				
			||||||
    // specifically care about, according (mostly) to the
 | 
					    // specifically care about, according (mostly) to the
 | 
				
			||||||
    // currently selected message.
 | 
					    // currently selected message.
 | 
				
			||||||
    var msg = current_msg_list.selected_message();
 | 
					    const msg = current_msg_list.selected_message();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (msg) {
 | 
					    if (msg) {
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
@@ -497,7 +497,7 @@ exports.stream_topic = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.activate_stream_for_cycle_hotkey = function (stream_name) {
 | 
					exports.activate_stream_for_cycle_hotkey = function (stream_name) {
 | 
				
			||||||
    // This is the common code for A/D hotkeys.
 | 
					    // This is the common code for A/D hotkeys.
 | 
				
			||||||
    var filter_expr = [
 | 
					    const filter_expr = [
 | 
				
			||||||
        {operator: 'stream', operand: stream_name},
 | 
					        {operator: 'stream', operand: stream_name},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
    exports.activate(filter_expr, {});
 | 
					    exports.activate(filter_expr, {});
 | 
				
			||||||
@@ -505,13 +505,13 @@ exports.activate_stream_for_cycle_hotkey = function (stream_name) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.stream_cycle_backward = function () {
 | 
					exports.stream_cycle_backward = function () {
 | 
				
			||||||
    var curr_stream = narrow_state.stream();
 | 
					    const curr_stream = narrow_state.stream();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!curr_stream) {
 | 
					    if (!curr_stream) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var stream_name = topic_generator.get_prev_stream(curr_stream);
 | 
					    const stream_name = topic_generator.get_prev_stream(curr_stream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!stream_name) {
 | 
					    if (!stream_name) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -521,13 +521,13 @@ exports.stream_cycle_backward = function () {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.stream_cycle_forward = function () {
 | 
					exports.stream_cycle_forward = function () {
 | 
				
			||||||
    var curr_stream = narrow_state.stream();
 | 
					    const curr_stream = narrow_state.stream();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!curr_stream) {
 | 
					    if (!curr_stream) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var stream_name = topic_generator.get_next_stream(curr_stream);
 | 
					    const stream_name = topic_generator.get_next_stream(curr_stream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!stream_name) {
 | 
					    if (!stream_name) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -537,13 +537,13 @@ exports.stream_cycle_forward = function () {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.narrow_to_next_topic = function () {
 | 
					exports.narrow_to_next_topic = function () {
 | 
				
			||||||
    var curr_info = exports.stream_topic();
 | 
					    const curr_info = exports.stream_topic();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!curr_info) {
 | 
					    if (!curr_info) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var next_narrow = topic_generator.get_next_topic(
 | 
					    const next_narrow = topic_generator.get_next_topic(
 | 
				
			||||||
        curr_info.stream,
 | 
					        curr_info.stream,
 | 
				
			||||||
        curr_info.topic
 | 
					        curr_info.topic
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
@@ -552,7 +552,7 @@ exports.narrow_to_next_topic = function () {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var filter_expr = [
 | 
					    const filter_expr = [
 | 
				
			||||||
        {operator: 'stream', operand: next_narrow.stream},
 | 
					        {operator: 'stream', operand: next_narrow.stream},
 | 
				
			||||||
        {operator: 'topic', operand: next_narrow.topic},
 | 
					        {operator: 'topic', operand: next_narrow.topic},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
@@ -562,9 +562,9 @@ exports.narrow_to_next_topic = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.narrow_to_next_pm_string = function () {
 | 
					exports.narrow_to_next_pm_string = function () {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var curr_pm = narrow_state.pm_string();
 | 
					    const curr_pm = narrow_state.pm_string();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var next_pm = topic_generator.get_next_unread_pm_string(curr_pm);
 | 
					    const next_pm = topic_generator.get_next_unread_pm_string(curr_pm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!next_pm) {
 | 
					    if (!next_pm) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -572,14 +572,14 @@ exports.narrow_to_next_pm_string = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Hopefully someday we can narrow by user_ids_string instead of
 | 
					    // Hopefully someday we can narrow by user_ids_string instead of
 | 
				
			||||||
    // mapping back to emails.
 | 
					    // mapping back to emails.
 | 
				
			||||||
    var pm_with = people.user_ids_string_to_emails_string(next_pm);
 | 
					    const pm_with = people.user_ids_string_to_emails_string(next_pm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var filter_expr = [
 | 
					    const filter_expr = [
 | 
				
			||||||
        {operator: 'pm-with', operand: pm_with},
 | 
					        {operator: 'pm-with', operand: pm_with},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // force_close parameter is true to not auto open compose_box
 | 
					    // force_close parameter is true to not auto open compose_box
 | 
				
			||||||
    var opts = {
 | 
					    const opts = {
 | 
				
			||||||
        force_close: true,
 | 
					        force_close: true,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -595,7 +595,7 @@ exports.by = function (operator, operand, opts) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.by_topic = function (target_id, opts) {
 | 
					exports.by_topic = function (target_id, opts) {
 | 
				
			||||||
    // don't use current_msg_list as it won't work for muted messages or for out-of-narrow links
 | 
					    // don't use current_msg_list as it won't work for muted messages or for out-of-narrow links
 | 
				
			||||||
    var original = message_store.get(target_id);
 | 
					    const original = message_store.get(target_id);
 | 
				
			||||||
    if (original.type !== 'stream') {
 | 
					    if (original.type !== 'stream') {
 | 
				
			||||||
        // Only stream messages have topics, but the
 | 
					        // Only stream messages have topics, but the
 | 
				
			||||||
        // user wants us to narrow in some way.
 | 
					        // user wants us to narrow in some way.
 | 
				
			||||||
@@ -608,7 +608,7 @@ exports.by_topic = function (target_id, opts) {
 | 
				
			|||||||
    // message is about to be marked read in the new view.
 | 
					    // message is about to be marked read in the new view.
 | 
				
			||||||
    unread_ops.notify_server_message_read(original);
 | 
					    unread_ops.notify_server_message_read(original);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var search_terms = [
 | 
					    const search_terms = [
 | 
				
			||||||
        {operator: 'stream', operand: original.stream},
 | 
					        {operator: 'stream', operand: original.stream},
 | 
				
			||||||
        {operator: 'topic', operand: util.get_message_topic(original)},
 | 
					        {operator: 'topic', operand: util.get_message_topic(original)},
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
@@ -620,7 +620,7 @@ exports.by_topic = function (target_id, opts) {
 | 
				
			|||||||
exports.by_recipient = function (target_id, opts) {
 | 
					exports.by_recipient = function (target_id, opts) {
 | 
				
			||||||
    opts = _.defaults({}, opts, {then_select_id: target_id});
 | 
					    opts = _.defaults({}, opts, {then_select_id: target_id});
 | 
				
			||||||
    // don't use current_msg_list as it won't work for muted messages or for out-of-narrow links
 | 
					    // don't use current_msg_list as it won't work for muted messages or for out-of-narrow links
 | 
				
			||||||
    var message = message_store.get(target_id);
 | 
					    const message = message_store.get(target_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // We don't check msg_list.can_mark_messages_read here only because
 | 
					    // We don't check msg_list.can_mark_messages_read here only because
 | 
				
			||||||
    // the target msg_list isn't initialized yet; in any case, the
 | 
					    // the target msg_list isn't initialized yet; in any case, the
 | 
				
			||||||
@@ -644,21 +644,21 @@ exports.to_compose_target = function () {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var opts = {
 | 
					    const opts = {
 | 
				
			||||||
        trigger: 'narrow_to_compose_target',
 | 
					        trigger: 'narrow_to_compose_target',
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (compose_state.get_message_type() === 'stream') {
 | 
					    if (compose_state.get_message_type() === 'stream') {
 | 
				
			||||||
        var stream_name = compose_state.stream_name();
 | 
					        const stream_name = compose_state.stream_name();
 | 
				
			||||||
        var stream_id = stream_data.get_stream_id(stream_name);
 | 
					        const stream_id = stream_data.get_stream_id(stream_name);
 | 
				
			||||||
        if (!stream_id) {
 | 
					        if (!stream_id) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // If we are composing to a new topic, we narrow to the stream but
 | 
					        // If we are composing to a new topic, we narrow to the stream but
 | 
				
			||||||
        // grey-out the message view instead of narrowing to an empty view.
 | 
					        // grey-out the message view instead of narrowing to an empty view.
 | 
				
			||||||
        var topics = topic_data.get_recent_names(stream_id);
 | 
					        const topics = topic_data.get_recent_names(stream_id);
 | 
				
			||||||
        var operators = [{operator: 'stream', operand: stream_name}];
 | 
					        const operators = [{operator: 'stream', operand: stream_name}];
 | 
				
			||||||
        var topic = compose_state.topic();
 | 
					        const topic = compose_state.topic();
 | 
				
			||||||
        if (topics.indexOf(topic) !== -1) {
 | 
					        if (topics.indexOf(topic) !== -1) {
 | 
				
			||||||
            operators.push({operator: 'topic', operand: topic});
 | 
					            operators.push({operator: 'topic', operand: topic});
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -667,9 +667,9 @@ exports.to_compose_target = function () {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (compose_state.get_message_type() === 'private') {
 | 
					    if (compose_state.get_message_type() === 'private') {
 | 
				
			||||||
        var recipient_string = compose_state.recipient();
 | 
					        const recipient_string = compose_state.recipient();
 | 
				
			||||||
        var emails = util.extract_pm_recipients(recipient_string);
 | 
					        const emails = util.extract_pm_recipients(recipient_string);
 | 
				
			||||||
        var invalid = _.reject(emails, people.is_valid_email_for_compose);
 | 
					        const invalid = _.reject(emails, people.is_valid_email_for_compose);
 | 
				
			||||||
        // If there are no recipients or any recipient is
 | 
					        // If there are no recipients or any recipient is
 | 
				
			||||||
        // invalid, narrow to all PMs.
 | 
					        // invalid, narrow to all PMs.
 | 
				
			||||||
        if (emails.length === 0 || invalid.length > 0) {
 | 
					        if (emails.length === 0 || invalid.length > 0) {
 | 
				
			||||||
@@ -735,11 +735,11 @@ exports.deactivate = function () {
 | 
				
			|||||||
    hashchange.save_narrow();
 | 
					    hashchange.save_narrow();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (current_msg_list.selected_id() !== -1) {
 | 
					    if (current_msg_list.selected_id() !== -1) {
 | 
				
			||||||
        var preserve_pre_narrowing_screen_position =
 | 
					        const preserve_pre_narrowing_screen_position =
 | 
				
			||||||
            current_msg_list.selected_row().length > 0 &&
 | 
					            current_msg_list.selected_row().length > 0 &&
 | 
				
			||||||
            current_msg_list.pre_narrow_offset !== undefined;
 | 
					            current_msg_list.pre_narrow_offset !== undefined;
 | 
				
			||||||
        var message_id_to_select;
 | 
					        let message_id_to_select;
 | 
				
			||||||
        var select_opts = {
 | 
					        const select_opts = {
 | 
				
			||||||
            then_scroll: true,
 | 
					            then_scroll: true,
 | 
				
			||||||
            use_closest: true,
 | 
					            use_closest: true,
 | 
				
			||||||
            empty_ok: true,
 | 
					            empty_ok: true,
 | 
				
			||||||
@@ -790,27 +790,27 @@ exports.restore_home_state = function () {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function set_invalid_narrow_message(invalid_narrow_message) {
 | 
					function set_invalid_narrow_message(invalid_narrow_message) {
 | 
				
			||||||
    var search_string_display = $("#empty_search_stop_words_string");
 | 
					    const search_string_display = $("#empty_search_stop_words_string");
 | 
				
			||||||
    search_string_display.text(invalid_narrow_message);
 | 
					    search_string_display.text(invalid_narrow_message);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function show_search_query() {
 | 
					function show_search_query() {
 | 
				
			||||||
    // when search bar contains multiple filters, only show search queries
 | 
					    // when search bar contains multiple filters, only show search queries
 | 
				
			||||||
    var current_filter = narrow_state.filter();
 | 
					    const current_filter = narrow_state.filter();
 | 
				
			||||||
    var search_query = current_filter.operands("search")[0];
 | 
					    const search_query = current_filter.operands("search")[0];
 | 
				
			||||||
    var query_words = search_query.split(" ");
 | 
					    const query_words = search_query.split(" ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var search_string_display = $("#empty_search_stop_words_string");
 | 
					    const search_string_display = $("#empty_search_stop_words_string");
 | 
				
			||||||
    var query_contains_stop_words = false;
 | 
					    let query_contains_stop_words = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Also removes previous search_string if any
 | 
					    // Also removes previous search_string if any
 | 
				
			||||||
    search_string_display.text(i18n.t("You searched for:"));
 | 
					    search_string_display.text(i18n.t("You searched for:"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Add in stream:foo and topic:bar if present
 | 
					    // Add in stream:foo and topic:bar if present
 | 
				
			||||||
    if (current_filter.has_operator("stream") || current_filter.has_operator("topic")) {
 | 
					    if (current_filter.has_operator("stream") || current_filter.has_operator("topic")) {
 | 
				
			||||||
        var stream_topic_string = "";
 | 
					        let stream_topic_string = "";
 | 
				
			||||||
        var stream = current_filter.operands('stream')[0];
 | 
					        const stream = current_filter.operands('stream')[0];
 | 
				
			||||||
        var topic = current_filter.operands('topic')[0];
 | 
					        const topic = current_filter.operands('topic')[0];
 | 
				
			||||||
        if (stream) {
 | 
					        if (stream) {
 | 
				
			||||||
            stream_topic_string = "stream: " + stream;
 | 
					            stream_topic_string = "stream: " + stream;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -843,24 +843,24 @@ function show_search_query() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function pick_empty_narrow_banner() {
 | 
					function pick_empty_narrow_banner() {
 | 
				
			||||||
    var default_banner = $('#empty_narrow_message');
 | 
					    const default_banner = $('#empty_narrow_message');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var current_filter = narrow_state.filter();
 | 
					    const current_filter = narrow_state.filter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (current_filter === undefined) {
 | 
					    if (current_filter === undefined) {
 | 
				
			||||||
        return default_banner;
 | 
					        return default_banner;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var first_term = current_filter.operators()[0];
 | 
					    const first_term = current_filter.operators()[0];
 | 
				
			||||||
    var first_operator = first_term.operator;
 | 
					    const first_operator = first_term.operator;
 | 
				
			||||||
    var first_operand = first_term.operand;
 | 
					    const first_operand = first_term.operand;
 | 
				
			||||||
    var num_operators = current_filter.operators().length;
 | 
					    const num_operators = current_filter.operators().length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (num_operators !== 1) {
 | 
					    if (num_operators !== 1) {
 | 
				
			||||||
        // For invalid-multi-operator narrows, we display an invalid narrow message
 | 
					        // For invalid-multi-operator narrows, we display an invalid narrow message
 | 
				
			||||||
        var streams = current_filter.operands("stream");
 | 
					        const streams = current_filter.operands("stream");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var invalid_narrow_message = "";
 | 
					        let invalid_narrow_message = "";
 | 
				
			||||||
        // No message can have multiple streams
 | 
					        // No message can have multiple streams
 | 
				
			||||||
        if (streams.length > 1) {
 | 
					        if (streams.length > 1) {
 | 
				
			||||||
            invalid_narrow_message = i18n.t("You are searching for messages that belong to more than one stream, which is not possible.");
 | 
					            invalid_narrow_message = i18n.t("You are searching for messages that belong to more than one stream, which is not possible.");
 | 
				
			||||||
@@ -901,7 +901,7 @@ function pick_empty_narrow_banner() {
 | 
				
			|||||||
    } else if (first_operator === "stream" && !stream_data.is_subscribed(first_operand)) {
 | 
					    } else if (first_operator === "stream" && !stream_data.is_subscribed(first_operand)) {
 | 
				
			||||||
        // You are narrowed to a stream which does not exist or is a private stream
 | 
					        // You are narrowed to a stream which does not exist or is a private stream
 | 
				
			||||||
        // in which you were never subscribed.
 | 
					        // in which you were never subscribed.
 | 
				
			||||||
        var stream_sub = stream_data.get_sub(narrow_state.stream());
 | 
					        const stream_sub = stream_data.get_sub(narrow_state.stream());
 | 
				
			||||||
        if (!stream_sub || !stream_sub.should_display_subscription_button) {
 | 
					        if (!stream_sub || !stream_sub.should_display_subscription_button) {
 | 
				
			||||||
            return $("#nonsubbed_private_nonexistent_stream_narrow_message");
 | 
					            return $("#nonsubbed_private_nonexistent_stream_narrow_message");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,22 @@
 | 
				
			|||||||
var confirmDatePlugin = require("flatpickr/dist/plugins/confirmDate/confirmDate.js");
 | 
					const confirmDatePlugin = require("flatpickr/dist/plugins/confirmDate/confirmDate.js");
 | 
				
			||||||
var render_actions_popover_content = require('../templates/actions_popover_content.hbs');
 | 
					const render_actions_popover_content = require('../templates/actions_popover_content.hbs');
 | 
				
			||||||
var render_mobile_message_buttons_popover = require('../templates/mobile_message_buttons_popover.hbs');
 | 
					const render_mobile_message_buttons_popover = require('../templates/mobile_message_buttons_popover.hbs');
 | 
				
			||||||
var render_mobile_message_buttons_popover_content = require('../templates/mobile_message_buttons_popover_content.hbs');
 | 
					const render_mobile_message_buttons_popover_content = require('../templates/mobile_message_buttons_popover_content.hbs');
 | 
				
			||||||
var render_no_arrow_popover = require('../templates/no_arrow_popover.hbs');
 | 
					const render_no_arrow_popover = require('../templates/no_arrow_popover.hbs');
 | 
				
			||||||
var render_remind_me_popover_content = require('../templates/remind_me_popover_content.hbs');
 | 
					const render_remind_me_popover_content = require('../templates/remind_me_popover_content.hbs');
 | 
				
			||||||
var render_user_group_info_popover = require('../templates/user_group_info_popover.hbs');
 | 
					const render_user_group_info_popover = require('../templates/user_group_info_popover.hbs');
 | 
				
			||||||
var render_user_group_info_popover_content = require('../templates/user_group_info_popover_content.hbs');
 | 
					const render_user_group_info_popover_content = require('../templates/user_group_info_popover_content.hbs');
 | 
				
			||||||
var render_user_info_popover_content = require('../templates/user_info_popover_content.hbs');
 | 
					const render_user_info_popover_content = require('../templates/user_info_popover_content.hbs');
 | 
				
			||||||
var render_user_info_popover_title = require('../templates/user_info_popover_title.hbs');
 | 
					const render_user_info_popover_title = require('../templates/user_info_popover_title.hbs');
 | 
				
			||||||
var render_user_profile_modal = require("../templates/user_profile_modal.hbs");
 | 
					const render_user_profile_modal = require("../templates/user_profile_modal.hbs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var current_actions_popover_elem;
 | 
					let current_actions_popover_elem;
 | 
				
			||||||
var current_flatpickr_instance;
 | 
					let current_flatpickr_instance;
 | 
				
			||||||
var current_message_info_popover_elem;
 | 
					let current_message_info_popover_elem;
 | 
				
			||||||
var current_mobile_message_buttons_popover_elem;
 | 
					let current_mobile_message_buttons_popover_elem;
 | 
				
			||||||
var userlist_placement = "right";
 | 
					let userlist_placement = "right";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var list_of_popovers = [];
 | 
					let list_of_popovers = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// this utilizes the proxy pattern to intercept all calls to $.fn.popover
 | 
					// this utilizes the proxy pattern to intercept all calls to $.fn.popover
 | 
				
			||||||
// and push the $.fn.data($o, "popover") results to an array.
 | 
					// and push the $.fn.data($o, "popover") results to an array.
 | 
				
			||||||
@@ -36,7 +36,7 @@ var list_of_popovers = [];
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // add back all shallow properties of $.fn.popover to the new proxied version.
 | 
					    // add back all shallow properties of $.fn.popover to the new proxied version.
 | 
				
			||||||
    for (var x in popover) {
 | 
					    for (const x in popover) {
 | 
				
			||||||
        if (popover.hasOwnProperty(x)) {
 | 
					        if (popover.hasOwnProperty(x)) {
 | 
				
			||||||
            $.fn.popover[x] = popover[x];
 | 
					            $.fn.popover[x] = popover[x];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -44,12 +44,12 @@ var list_of_popovers = [];
 | 
				
			|||||||
}($.fn.popover));
 | 
					}($.fn.popover));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function copy_email_handler(e) {
 | 
					function copy_email_handler(e) {
 | 
				
			||||||
    var email_el = $(e.trigger.parentElement);
 | 
					    const email_el = $(e.trigger.parentElement);
 | 
				
			||||||
    var copy_icon = email_el.find('i');
 | 
					    const copy_icon = email_el.find('i');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // only change the parent element's text back to email
 | 
					    // only change the parent element's text back to email
 | 
				
			||||||
    // and not overwrite the tooltip.
 | 
					    // and not overwrite the tooltip.
 | 
				
			||||||
    var email_textnode = email_el[0].childNodes[2];
 | 
					    const email_textnode = email_el[0].childNodes[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    email_el.addClass('email_copied');
 | 
					    email_el.addClass('email_copied');
 | 
				
			||||||
    email_textnode.nodeValue = i18n.t('Email copied');
 | 
					    email_textnode.nodeValue = i18n.t('Email copied');
 | 
				
			||||||
@@ -64,19 +64,19 @@ function copy_email_handler(e) {
 | 
				
			|||||||
function init_email_clipboard() {
 | 
					function init_email_clipboard() {
 | 
				
			||||||
    $('.user_popover_email').each(function () {
 | 
					    $('.user_popover_email').each(function () {
 | 
				
			||||||
        if (this.clientWidth < this.scrollWidth) {
 | 
					        if (this.clientWidth < this.scrollWidth) {
 | 
				
			||||||
            var email_el = $(this);
 | 
					            const email_el = $(this);
 | 
				
			||||||
            var copy_email_icon = email_el.find('i');
 | 
					            const copy_email_icon = email_el.find('i');
 | 
				
			||||||
            copy_email_icon.removeClass('hide_copy_icon');
 | 
					            copy_email_icon.removeClass('hide_copy_icon');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var copy_email_clipboard = new ClipboardJS(copy_email_icon[0]);
 | 
					            const copy_email_clipboard = new ClipboardJS(copy_email_icon[0]);
 | 
				
			||||||
            copy_email_clipboard.on('success', copy_email_handler);
 | 
					            copy_email_clipboard.on('success', copy_email_handler);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function load_medium_avatar(user, elt) {
 | 
					function load_medium_avatar(user, elt) {
 | 
				
			||||||
    var user_avatar_url = "avatar/" + user.user_id + "/medium";
 | 
					    const user_avatar_url = "avatar/" + user.user_id + "/medium";
 | 
				
			||||||
    var sender_avatar_medium = new Image();
 | 
					    const sender_avatar_medium = new Image();
 | 
				
			||||||
    sender_avatar_medium.src = user_avatar_url;
 | 
					    sender_avatar_medium.src = user_avatar_url;
 | 
				
			||||||
    $(sender_avatar_medium).on("load", function () {
 | 
					    $(sender_avatar_medium).on("load", function () {
 | 
				
			||||||
        elt.css("background-image", "url(" + $(this).attr("src") + ")");
 | 
					        elt.css("background-image", "url(" + $(this).attr("src") + ")");
 | 
				
			||||||
@@ -84,7 +84,7 @@ function load_medium_avatar(user, elt) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function calculate_info_popover_placement(size, elt) {
 | 
					function calculate_info_popover_placement(size, elt) {
 | 
				
			||||||
    var ypos = elt.offset().top;
 | 
					    const ypos = elt.offset().top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(ypos + size / 2 < message_viewport.height() &&
 | 
					    if (!(ypos + size / 2 < message_viewport.height() &&
 | 
				
			||||||
          ypos > size / 2)) {
 | 
					          ypos > size / 2)) {
 | 
				
			||||||
@@ -97,9 +97,9 @@ function calculate_info_popover_placement(size, elt) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function get_custom_profile_field_data(user, field, field_types, dateFormat) {
 | 
					function get_custom_profile_field_data(user, field, field_types, dateFormat) {
 | 
				
			||||||
    var field_value = people.get_custom_profile_data(user.user_id, field.id);
 | 
					    const field_value = people.get_custom_profile_data(user.user_id, field.id);
 | 
				
			||||||
    var field_type = field.type;
 | 
					    const field_type = field.type;
 | 
				
			||||||
    var profile_field = {};
 | 
					    const profile_field = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!field_value) {
 | 
					    if (!field_value) {
 | 
				
			||||||
        return profile_field;
 | 
					        return profile_field;
 | 
				
			||||||
@@ -123,7 +123,7 @@ function get_custom_profile_field_data(user, field, field_types, dateFormat) {
 | 
				
			|||||||
        profile_field.value = field_value.value;
 | 
					        profile_field.value = field_value.value;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case field_types.CHOICE.id: {
 | 
					    case field_types.CHOICE.id: {
 | 
				
			||||||
        var field_choice_dict = JSON.parse(field.field_data);
 | 
					        const field_choice_dict = JSON.parse(field.field_data);
 | 
				
			||||||
        profile_field.value = field_choice_dict[field_value.value].text;
 | 
					        profile_field.value = field_choice_dict[field_value.value].text;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -152,10 +152,10 @@ function get_visible_email(user) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function render_user_info_popover(user, popover_element, is_sender_popover, private_msg_class,
 | 
					function render_user_info_popover(user, popover_element, is_sender_popover, private_msg_class,
 | 
				
			||||||
                                  template_class, popover_placement) {
 | 
					                                  template_class, popover_placement) {
 | 
				
			||||||
    var is_me = people.is_my_user_id(user.user_id);
 | 
					    const is_me = people.is_my_user_id(user.user_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var can_set_away = false;
 | 
					    let can_set_away = false;
 | 
				
			||||||
    var can_revoke_away = false;
 | 
					    let can_revoke_away = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (is_me) {
 | 
					    if (is_me) {
 | 
				
			||||||
        if (user_status.is_away(user.user_id)) {
 | 
					        if (user_status.is_away(user.user_id)) {
 | 
				
			||||||
@@ -165,7 +165,7 @@ function render_user_info_popover(user, popover_element, is_sender_popover, priv
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var args = {
 | 
					    const args = {
 | 
				
			||||||
        can_revoke_away: can_revoke_away,
 | 
					        can_revoke_away: can_revoke_away,
 | 
				
			||||||
        can_set_away: can_set_away,
 | 
					        can_set_away: can_set_away,
 | 
				
			||||||
        is_active: people.is_active_user_for_popover(user.user_id),
 | 
					        is_active: people.is_active_user_for_popover(user.user_id),
 | 
				
			||||||
@@ -188,12 +188,12 @@ function render_user_info_popover(user, popover_element, is_sender_popover, priv
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (user.is_bot) {
 | 
					    if (user.is_bot) {
 | 
				
			||||||
        var is_cross_realm_bot = user.is_cross_realm_bot;
 | 
					        const is_cross_realm_bot = user.is_cross_realm_bot;
 | 
				
			||||||
        var bot_owner_id = user.bot_owner_id;
 | 
					        const bot_owner_id = user.bot_owner_id;
 | 
				
			||||||
        if (is_cross_realm_bot) {
 | 
					        if (is_cross_realm_bot) {
 | 
				
			||||||
            args.is_cross_realm_bot = is_cross_realm_bot;
 | 
					            args.is_cross_realm_bot = is_cross_realm_bot;
 | 
				
			||||||
        } else if (bot_owner_id) {
 | 
					        } else if (bot_owner_id) {
 | 
				
			||||||
            var bot_owner = people.get_person_from_user_id(bot_owner_id);
 | 
					            const bot_owner = people.get_person_from_user_id(bot_owner_id);
 | 
				
			||||||
            args.bot_owner = bot_owner;
 | 
					            args.bot_owner = bot_owner;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -228,7 +228,7 @@ exports._test_calculate_info_popover_placement = calculate_info_popover_placemen
 | 
				
			|||||||
// user is the user whose profile to show
 | 
					// user is the user whose profile to show
 | 
				
			||||||
// message is the message containing it, which should be selected
 | 
					// message is the message containing it, which should be selected
 | 
				
			||||||
function show_user_info_popover(element, user, message) {
 | 
					function show_user_info_popover(element, user, message) {
 | 
				
			||||||
    var last_popover_elem = current_message_info_popover_elem;
 | 
					    const last_popover_elem = current_message_info_popover_elem;
 | 
				
			||||||
    exports.hide_all();
 | 
					    exports.hide_all();
 | 
				
			||||||
    if (last_popover_elem !== undefined
 | 
					    if (last_popover_elem !== undefined
 | 
				
			||||||
        && last_popover_elem.get()[0] === element) {
 | 
					        && last_popover_elem.get()[0] === element) {
 | 
				
			||||||
@@ -237,7 +237,7 @@ function show_user_info_popover(element, user, message) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    current_msg_list.select_id(message.id);
 | 
					    current_msg_list.select_id(message.id);
 | 
				
			||||||
    var elt = $(element);
 | 
					    const elt = $(element);
 | 
				
			||||||
    if (elt.data('popover') === undefined) {
 | 
					    if (elt.data('popover') === undefined) {
 | 
				
			||||||
        if (user === undefined) {
 | 
					        if (user === undefined) {
 | 
				
			||||||
            // This is never supposed to happen, not even for deactivated
 | 
					            // This is never supposed to happen, not even for deactivated
 | 
				
			||||||
@@ -246,7 +246,7 @@ function show_user_info_popover(element, user, message) {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var is_sender_popover =  message.sender_id === user.user_id;
 | 
					        const is_sender_popover =  message.sender_id === user.user_id;
 | 
				
			||||||
        render_user_info_popover(user, elt, is_sender_popover, "respond_personal_button",
 | 
					        render_user_info_popover(user, elt, is_sender_popover, "respond_personal_button",
 | 
				
			||||||
                                 "message-info-popover", "right");
 | 
					                                 "message-info-popover", "right");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -255,7 +255,7 @@ function show_user_info_popover(element, user, message) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function show_mobile_message_buttons_popover(element) {
 | 
					function show_mobile_message_buttons_popover(element) {
 | 
				
			||||||
    var last_popover_elem = current_mobile_message_buttons_popover_elem;
 | 
					    const last_popover_elem = current_mobile_message_buttons_popover_elem;
 | 
				
			||||||
    exports.hide_all();
 | 
					    exports.hide_all();
 | 
				
			||||||
    if (last_popover_elem !== undefined
 | 
					    if (last_popover_elem !== undefined
 | 
				
			||||||
        && last_popover_elem.get()[0] === element) {
 | 
					        && last_popover_elem.get()[0] === element) {
 | 
				
			||||||
@@ -264,7 +264,7 @@ function show_mobile_message_buttons_popover(element) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var $element = $(element);
 | 
					    const $element = $(element);
 | 
				
			||||||
    $element.popover({
 | 
					    $element.popover({
 | 
				
			||||||
        placement: "left",
 | 
					        placement: "left",
 | 
				
			||||||
        template: render_mobile_message_buttons_popover(),
 | 
					        template: render_mobile_message_buttons_popover(),
 | 
				
			||||||
@@ -293,13 +293,13 @@ exports.hide_user_profile = function () {
 | 
				
			|||||||
exports.show_user_profile = function (user) {
 | 
					exports.show_user_profile = function (user) {
 | 
				
			||||||
    exports.hide_all();
 | 
					    exports.hide_all();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var dateFormat = moment.localeData().longDateFormat('LL');
 | 
					    const dateFormat = moment.localeData().longDateFormat('LL');
 | 
				
			||||||
    var field_types = page_params.custom_profile_field_types;
 | 
					    const field_types = page_params.custom_profile_field_types;
 | 
				
			||||||
    var profile_data = page_params.custom_profile_fields
 | 
					    const profile_data = page_params.custom_profile_fields
 | 
				
			||||||
        .map(function (f) {return get_custom_profile_field_data(user, f, field_types, dateFormat);})
 | 
					        .map(function (f) {return get_custom_profile_field_data(user, f, field_types, dateFormat);})
 | 
				
			||||||
        .filter(function (f) {return f.name !== undefined;});
 | 
					        .filter(function (f) {return f.name !== undefined;});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var args = {
 | 
					    const args = {
 | 
				
			||||||
        full_name: user.full_name,
 | 
					        full_name: user.full_name,
 | 
				
			||||||
        email: get_visible_email(user),
 | 
					        email: get_visible_email(user),
 | 
				
			||||||
        profile_data: profile_data,
 | 
					        profile_data: profile_data,
 | 
				
			||||||
@@ -325,7 +325,7 @@ function get_user_info_popover_items() {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var popover_data = current_message_info_popover_elem.data('popover');
 | 
					    const popover_data = current_message_info_popover_elem.data('popover');
 | 
				
			||||||
    if (!popover_data) {
 | 
					    if (!popover_data) {
 | 
				
			||||||
        blueslip.error('Cannot find popover data for actions menu.');
 | 
					        blueslip.error('Cannot find popover data for actions menu.');
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -366,10 +366,10 @@ exports._test_sort_group_members = sort_group_members;
 | 
				
			|||||||
// user is the user whose profile to show
 | 
					// user is the user whose profile to show
 | 
				
			||||||
// message is the message containing it, which should be selected
 | 
					// message is the message containing it, which should be selected
 | 
				
			||||||
function show_user_group_info_popover(element, group, message) {
 | 
					function show_user_group_info_popover(element, group, message) {
 | 
				
			||||||
    var last_popover_elem = current_message_info_popover_elem;
 | 
					    const last_popover_elem = current_message_info_popover_elem;
 | 
				
			||||||
    // hardcoded pixel height of the popover
 | 
					    // hardcoded pixel height of the popover
 | 
				
			||||||
    // note that the actual size varies (in group size), but this is about as big as it gets
 | 
					    // note that the actual size varies (in group size), but this is about as big as it gets
 | 
				
			||||||
    var popover_size = 390;
 | 
					    const popover_size = 390;
 | 
				
			||||||
    exports.hide_all();
 | 
					    exports.hide_all();
 | 
				
			||||||
    if (last_popover_elem !== undefined
 | 
					    if (last_popover_elem !== undefined
 | 
				
			||||||
        && last_popover_elem.get()[0] === element) {
 | 
					        && last_popover_elem.get()[0] === element) {
 | 
				
			||||||
@@ -378,9 +378,9 @@ function show_user_group_info_popover(element, group, message) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    current_msg_list.select_id(message.id);
 | 
					    current_msg_list.select_id(message.id);
 | 
				
			||||||
    var elt = $(element);
 | 
					    const elt = $(element);
 | 
				
			||||||
    if (elt.data('popover') === undefined) {
 | 
					    if (elt.data('popover') === undefined) {
 | 
				
			||||||
        var args = {
 | 
					        const args = {
 | 
				
			||||||
            group_name: group.name,
 | 
					            group_name: group.name,
 | 
				
			||||||
            group_description: group.description,
 | 
					            group_description: group.description,
 | 
				
			||||||
            members: sort_group_members(fetch_group_members(group.members.keys())),
 | 
					            members: sort_group_members(fetch_group_members(group.members.keys())),
 | 
				
			||||||
@@ -398,7 +398,7 @@ function show_user_group_info_popover(element, group, message) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.toggle_actions_popover = function (element, id) {
 | 
					exports.toggle_actions_popover = function (element, id) {
 | 
				
			||||||
    var last_popover_elem = current_actions_popover_elem;
 | 
					    const last_popover_elem = current_actions_popover_elem;
 | 
				
			||||||
    exports.hide_all();
 | 
					    exports.hide_all();
 | 
				
			||||||
    if (last_popover_elem !== undefined
 | 
					    if (last_popover_elem !== undefined
 | 
				
			||||||
        && last_popover_elem.get()[0] === element) {
 | 
					        && last_popover_elem.get()[0] === element) {
 | 
				
			||||||
@@ -409,12 +409,12 @@ exports.toggle_actions_popover = function (element, id) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $(element).closest('.message_row').toggleClass('has_popover has_actions_popover');
 | 
					    $(element).closest('.message_row').toggleClass('has_popover has_actions_popover');
 | 
				
			||||||
    current_msg_list.select_id(id);
 | 
					    current_msg_list.select_id(id);
 | 
				
			||||||
    var elt = $(element);
 | 
					    const elt = $(element);
 | 
				
			||||||
    if (elt.data('popover') === undefined) {
 | 
					    if (elt.data('popover') === undefined) {
 | 
				
			||||||
        var message = current_msg_list.get(id);
 | 
					        const message = current_msg_list.get(id);
 | 
				
			||||||
        var editability = message_edit.get_editability(message);
 | 
					        const editability = message_edit.get_editability(message);
 | 
				
			||||||
        var use_edit_icon;
 | 
					        let use_edit_icon;
 | 
				
			||||||
        var editability_menu_item;
 | 
					        let editability_menu_item;
 | 
				
			||||||
        if (editability === message_edit.editability_types.FULL) {
 | 
					        if (editability === message_edit.editability_types.FULL) {
 | 
				
			||||||
            use_edit_icon = true;
 | 
					            use_edit_icon = true;
 | 
				
			||||||
            editability_menu_item = i18n.t("Edit");
 | 
					            editability_menu_item = i18n.t("Edit");
 | 
				
			||||||
@@ -425,43 +425,43 @@ exports.toggle_actions_popover = function (element, id) {
 | 
				
			|||||||
            use_edit_icon = false;
 | 
					            use_edit_icon = false;
 | 
				
			||||||
            editability_menu_item = i18n.t("View source");
 | 
					            editability_menu_item = i18n.t("View source");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var topic = util.get_message_topic(message);
 | 
					        const topic = util.get_message_topic(message);
 | 
				
			||||||
        var can_mute_topic =
 | 
					        const can_mute_topic =
 | 
				
			||||||
                message.stream &&
 | 
					                message.stream &&
 | 
				
			||||||
                topic &&
 | 
					                topic &&
 | 
				
			||||||
                !muting.is_topic_muted(message.stream_id, topic);
 | 
					                !muting.is_topic_muted(message.stream_id, topic);
 | 
				
			||||||
        var can_unmute_topic =
 | 
					        const can_unmute_topic =
 | 
				
			||||||
                message.stream &&
 | 
					                message.stream &&
 | 
				
			||||||
                topic &&
 | 
					                topic &&
 | 
				
			||||||
                muting.is_topic_muted(message.stream_id, topic);
 | 
					                muting.is_topic_muted(message.stream_id, topic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var should_display_edit_history_option = _.any(message.edit_history, function (entry) {
 | 
					        const should_display_edit_history_option = _.any(message.edit_history, function (entry) {
 | 
				
			||||||
            var prev_topic = util.get_edit_event_prev_topic(entry);
 | 
					            const prev_topic = util.get_edit_event_prev_topic(entry);
 | 
				
			||||||
            return entry.prev_content !== undefined || prev_topic !== undefined;
 | 
					            return entry.prev_content !== undefined || prev_topic !== undefined;
 | 
				
			||||||
        }) && page_params.realm_allow_edit_history;
 | 
					        }) && page_params.realm_allow_edit_history;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Disabling this for /me messages is a temporary workaround
 | 
					        // Disabling this for /me messages is a temporary workaround
 | 
				
			||||||
        // for the fact that we don't have a styling for how that
 | 
					        // for the fact that we don't have a styling for how that
 | 
				
			||||||
        // should look.  See also condense.js.
 | 
					        // should look.  See also condense.js.
 | 
				
			||||||
        var should_display_collapse = !message.locally_echoed &&
 | 
					        const should_display_collapse = !message.locally_echoed &&
 | 
				
			||||||
                                      !message.is_me_message &&
 | 
					                                      !message.is_me_message &&
 | 
				
			||||||
                                      !message.collapsed;
 | 
					                                      !message.collapsed;
 | 
				
			||||||
        var should_display_uncollapse = !message.locally_echoed &&
 | 
					        const should_display_uncollapse = !message.locally_echoed &&
 | 
				
			||||||
                                        !message.is_me_message &&
 | 
					                                        !message.is_me_message &&
 | 
				
			||||||
                                        message.collapsed;
 | 
					                                        message.collapsed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var should_display_edit_and_view_source =
 | 
					        const should_display_edit_and_view_source =
 | 
				
			||||||
                message.content !== '<p>(deleted)</p>' ||
 | 
					                message.content !== '<p>(deleted)</p>' ||
 | 
				
			||||||
                editability === message_edit.editability_types.FULL ||
 | 
					                editability === message_edit.editability_types.FULL ||
 | 
				
			||||||
                editability === message_edit.editability_types.TOPIC_ONLY;
 | 
					                editability === message_edit.editability_types.TOPIC_ONLY;
 | 
				
			||||||
        var should_display_quote_and_reply = message.content !== '<p>(deleted)</p>';
 | 
					        const should_display_quote_and_reply = message.content !== '<p>(deleted)</p>';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var conversation_time_uri = hash_util.by_conversation_and_time_uri(message)
 | 
					        const conversation_time_uri = hash_util.by_conversation_and_time_uri(message)
 | 
				
			||||||
            .replace(/\(/g, '%28')
 | 
					            .replace(/\(/g, '%28')
 | 
				
			||||||
            .replace(/\)/g, '%29');
 | 
					            .replace(/\)/g, '%29');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var should_display_delete_option = message_edit.get_deletability(message);
 | 
					        const should_display_delete_option = message_edit.get_deletability(message);
 | 
				
			||||||
        var args = {
 | 
					        const args = {
 | 
				
			||||||
            message_id: message.id,
 | 
					            message_id: message.id,
 | 
				
			||||||
            historical: message.historical,
 | 
					            historical: message.historical,
 | 
				
			||||||
            stream_id: message.stream_id,
 | 
					            stream_id: message.stream_id,
 | 
				
			||||||
@@ -482,7 +482,7 @@ exports.toggle_actions_popover = function (element, id) {
 | 
				
			|||||||
            should_display_quote_and_reply: should_display_quote_and_reply,
 | 
					            should_display_quote_and_reply: should_display_quote_and_reply,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var ypos = elt.offset().top;
 | 
					        const ypos = elt.offset().top;
 | 
				
			||||||
        elt.popover({
 | 
					        elt.popover({
 | 
				
			||||||
            // Popover height with 7 items in it is ~190 px
 | 
					            // Popover height with 7 items in it is ~190 px
 | 
				
			||||||
            placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom',
 | 
					            placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom',
 | 
				
			||||||
@@ -500,13 +500,13 @@ exports.render_actions_remind_popover = function (element, id) {
 | 
				
			|||||||
    exports.hide_all();
 | 
					    exports.hide_all();
 | 
				
			||||||
    $(element).closest('.message_row').toggleClass('has_popover has_actions_popover');
 | 
					    $(element).closest('.message_row').toggleClass('has_popover has_actions_popover');
 | 
				
			||||||
    current_msg_list.select_id(id);
 | 
					    current_msg_list.select_id(id);
 | 
				
			||||||
    var elt = $(element);
 | 
					    const elt = $(element);
 | 
				
			||||||
    if (elt.data('popover') === undefined) {
 | 
					    if (elt.data('popover') === undefined) {
 | 
				
			||||||
        var message = current_msg_list.get(id);
 | 
					        const message = current_msg_list.get(id);
 | 
				
			||||||
        var args = {
 | 
					        const args = {
 | 
				
			||||||
            message: message,
 | 
					            message: message,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        var ypos = elt.offset().top;
 | 
					        const ypos = elt.offset().top;
 | 
				
			||||||
        elt.popover({
 | 
					        elt.popover({
 | 
				
			||||||
            // Popover height with 7 items in it is ~190 px
 | 
					            // Popover height with 7 items in it is ~190 px
 | 
				
			||||||
            placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom',
 | 
					            placement: message_viewport.height() - ypos < 220 ? 'top' : 'bottom',
 | 
				
			||||||
@@ -533,7 +533,7 @@ function get_action_menu_menu_items() {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var popover_data = current_actions_popover_elem.data('popover');
 | 
					    const popover_data = current_actions_popover_elem.data('popover');
 | 
				
			||||||
    if (!popover_data) {
 | 
					    if (!popover_data) {
 | 
				
			||||||
        blueslip.error('Cannot find popover data for actions menu.');
 | 
					        blueslip.error('Cannot find popover data for actions menu.');
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@@ -555,7 +555,7 @@ function popover_items_handle_keyboard(key, items) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var index = items.index(items.filter(':focus'));
 | 
					    let index = items.index(items.filter(':focus'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (key === "enter" && index >= 0 && index < items.length) {
 | 
					    if (key === "enter" && index >= 0 && index < items.length) {
 | 
				
			||||||
        return items[index].click();
 | 
					        return items[index].click();
 | 
				
			||||||
@@ -573,7 +573,7 @@ function popover_items_handle_keyboard(key, items) {
 | 
				
			|||||||
function focus_first_action_popover_item() {
 | 
					function focus_first_action_popover_item() {
 | 
				
			||||||
    // For now I recommend only calling this when the user opens the menu with a hotkey.
 | 
					    // For now I recommend only calling this when the user opens the menu with a hotkey.
 | 
				
			||||||
    // Our popup menus act kind of funny when you mix keyboard and mouse.
 | 
					    // Our popup menus act kind of funny when you mix keyboard and mouse.
 | 
				
			||||||
    var items = get_action_menu_menu_items();
 | 
					    const items = get_action_menu_menu_items();
 | 
				
			||||||
    focus_first_popover_item(items);
 | 
					    focus_first_popover_item(items);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -585,7 +585,7 @@ exports.open_message_menu = function (message) {
 | 
				
			|||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var id = message.id;
 | 
					    const id = message.id;
 | 
				
			||||||
    exports.toggle_actions_popover($(".selected_message .actions_hover")[0], id);
 | 
					    exports.toggle_actions_popover($(".selected_message .actions_hover")[0], id);
 | 
				
			||||||
    if (current_actions_popover_elem) {
 | 
					    if (current_actions_popover_elem) {
 | 
				
			||||||
        focus_first_action_popover_item();
 | 
					        focus_first_action_popover_item();
 | 
				
			||||||
@@ -594,7 +594,7 @@ exports.open_message_menu = function (message) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.actions_menu_handle_keyboard = function (key) {
 | 
					exports.actions_menu_handle_keyboard = function (key) {
 | 
				
			||||||
    var items = get_action_menu_menu_items();
 | 
					    const items = get_action_menu_menu_items();
 | 
				
			||||||
    popover_items_handle_keyboard(key, items);
 | 
					    popover_items_handle_keyboard(key, items);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -643,8 +643,8 @@ exports.show_pm_list_sidebar = function () {
 | 
				
			|||||||
    resize.resize_page_components();
 | 
					    resize.resize_page_components();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var current_user_sidebar_user_id;
 | 
					let current_user_sidebar_user_id;
 | 
				
			||||||
var current_user_sidebar_popover;
 | 
					let current_user_sidebar_popover;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function user_sidebar_popped() {
 | 
					function user_sidebar_popped() {
 | 
				
			||||||
    return current_user_sidebar_popover !== undefined;
 | 
					    return current_user_sidebar_popover !== undefined;
 | 
				
			||||||
@@ -667,21 +667,21 @@ exports.hide_user_sidebar_popover = function () {
 | 
				
			|||||||
function focus_user_info_popover_item() {
 | 
					function focus_user_info_popover_item() {
 | 
				
			||||||
    // For now I recommend only calling this when the user opens the menu with a hotkey.
 | 
					    // For now I recommend only calling this when the user opens the menu with a hotkey.
 | 
				
			||||||
    // Our popup menus act kind of funny when you mix keyboard and mouse.
 | 
					    // Our popup menus act kind of funny when you mix keyboard and mouse.
 | 
				
			||||||
    var items = get_user_info_popover_items();
 | 
					    const items = get_user_info_popover_items();
 | 
				
			||||||
    focus_first_popover_item(items);
 | 
					    focus_first_popover_item(items);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.user_info_popover_handle_keyboard = function (key) {
 | 
					exports.user_info_popover_handle_keyboard = function (key) {
 | 
				
			||||||
    var items = get_user_info_popover_items();
 | 
					    const items = get_user_info_popover_items();
 | 
				
			||||||
    popover_items_handle_keyboard(key, items);
 | 
					    popover_items_handle_keyboard(key, items);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.show_sender_info = function () {
 | 
					exports.show_sender_info = function () {
 | 
				
			||||||
    var $message = $(".selected_message");
 | 
					    const $message = $(".selected_message");
 | 
				
			||||||
    var $sender = $message.find('.sender_info_hover');
 | 
					    const $sender = $message.find('.sender_info_hover');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var message = current_msg_list.get(rows.id($message));
 | 
					    const message = current_msg_list.get(rows.id($message));
 | 
				
			||||||
    var user = people.get_person_from_user_id(message.sender_id);
 | 
					    const user = people.get_person_from_user_id(message.sender_id);
 | 
				
			||||||
    show_user_info_popover($sender[0], user, message);
 | 
					    show_user_info_popover($sender[0], user, message);
 | 
				
			||||||
    if (current_message_info_popover_elem) {
 | 
					    if (current_message_info_popover_elem) {
 | 
				
			||||||
        focus_user_info_popover_item();
 | 
					        focus_user_info_popover_item();
 | 
				
			||||||
@@ -693,7 +693,7 @@ exports.show_sender_info = function () {
 | 
				
			|||||||
// side effect of closing popovers, which we don't want.  So we
 | 
					// side effect of closing popovers, which we don't want.  So we
 | 
				
			||||||
// suppress the first hide from scrolling after a resize using this
 | 
					// suppress the first hide from scrolling after a resize using this
 | 
				
			||||||
// variable.
 | 
					// variable.
 | 
				
			||||||
var suppress_scroll_hide = false;
 | 
					let suppress_scroll_hide = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.set_suppress_scroll_hide = function () {
 | 
					exports.set_suppress_scroll_hide = function () {
 | 
				
			||||||
    suppress_scroll_hide = true;
 | 
					    suppress_scroll_hide = true;
 | 
				
			||||||
@@ -701,32 +701,32 @@ exports.set_suppress_scroll_hide = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.register_click_handlers = function () {
 | 
					exports.register_click_handlers = function () {
 | 
				
			||||||
    $("#main_div").on("click", ".actions_hover", function (e) {
 | 
					    $("#main_div").on("click", ".actions_hover", function (e) {
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        exports.toggle_actions_popover(this, rows.id(row));
 | 
					        exports.toggle_actions_popover(this, rows.id(row));
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("#main_div").on("click", ".sender_name, .sender_name-in-status, .inline_profile_picture", function (e) {
 | 
					    $("#main_div").on("click", ".sender_name, .sender_name-in-status, .inline_profile_picture", function (e) {
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var message = current_msg_list.get(rows.id(row));
 | 
					        const message = current_msg_list.get(rows.id(row));
 | 
				
			||||||
        var user = people.get_person_from_user_id(message.sender_id);
 | 
					        const user = people.get_person_from_user_id(message.sender_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        show_user_info_popover(this, user, message);
 | 
					        show_user_info_popover(this, user, message);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("#main_div").on("click", ".user-mention", function (e) {
 | 
					    $("#main_div").on("click", ".user-mention", function (e) {
 | 
				
			||||||
        var id = $(this).attr('data-user-id');
 | 
					        const id = $(this).attr('data-user-id');
 | 
				
			||||||
        // We fallback to email to handle legacy markdown that was rendered
 | 
					        // We fallback to email to handle legacy markdown that was rendered
 | 
				
			||||||
        // before we cut over to using data-user-id
 | 
					        // before we cut over to using data-user-id
 | 
				
			||||||
        var email = $(this).attr('data-user-email');
 | 
					        const email = $(this).attr('data-user-email');
 | 
				
			||||||
        if (id === '*' || email === '*') {
 | 
					        if (id === '*' || email === '*') {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var message = current_msg_list.get(rows.id(row));
 | 
					        const message = current_msg_list.get(rows.id(row));
 | 
				
			||||||
        var user;
 | 
					        let user;
 | 
				
			||||||
        if (id) {
 | 
					        if (id) {
 | 
				
			||||||
            user = people.get_person_from_user_id(id);
 | 
					            user = people.get_person_from_user_id(id);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
@@ -736,11 +736,11 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("#main_div").on("click", ".user-group-mention", function (e) {
 | 
					    $("#main_div").on("click", ".user-group-mention", function (e) {
 | 
				
			||||||
        var id = $(this).attr('data-user-group-id');
 | 
					        const id = $(this).attr('data-user-group-id');
 | 
				
			||||||
        var row = $(this).closest(".message_row");
 | 
					        const row = $(this).closest(".message_row");
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        var message = current_msg_list.get(rows.id(row));
 | 
					        const message = current_msg_list.get(rows.id(row));
 | 
				
			||||||
        var group = user_groups.get_user_group_from_id(id, true);
 | 
					        const group = user_groups.get_user_group_from_id(id, true);
 | 
				
			||||||
        if (group === undefined) {
 | 
					        if (group === undefined) {
 | 
				
			||||||
            // This user group has likely been deleted.
 | 
					            // This user group has likely been deleted.
 | 
				
			||||||
            blueslip.info('Unable to find user group in message' + message.sender_id);
 | 
					            blueslip.info('Unable to find user group in message' + message.sender_id);
 | 
				
			||||||
@@ -751,8 +751,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.info_popover_actions .narrow_to_private_messages', function (e) {
 | 
					    $('body').on('click', '.info_popover_actions .narrow_to_private_messages', function (e) {
 | 
				
			||||||
        var user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
					        const user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
				
			||||||
        var email = people.get_person_from_user_id(user_id).email;
 | 
					        const email = people.get_person_from_user_id(user_id).email;
 | 
				
			||||||
        exports.hide_message_info_popover();
 | 
					        exports.hide_message_info_popover();
 | 
				
			||||||
        narrow.by('pm-with', email, {trigger: 'user sidebar popover'});
 | 
					        narrow.by('pm-with', email, {trigger: 'user sidebar popover'});
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
@@ -760,8 +760,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.info_popover_actions .narrow_to_messages_sent', function (e) {
 | 
					    $('body').on('click', '.info_popover_actions .narrow_to_messages_sent', function (e) {
 | 
				
			||||||
        var user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
					        const user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
				
			||||||
        var email = people.get_person_from_user_id(user_id).email;
 | 
					        const email = people.get_person_from_user_id(user_id).email;
 | 
				
			||||||
        exports.hide_message_info_popover();
 | 
					        exports.hide_message_info_popover();
 | 
				
			||||||
        narrow.by('sender', email, {trigger: 'user sidebar popover'});
 | 
					        narrow.by('sender', email, {trigger: 'user sidebar popover'});
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
@@ -772,9 +772,9 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
        if (!compose_state.composing()) {
 | 
					        if (!compose_state.composing()) {
 | 
				
			||||||
            compose_actions.start('stream', {trigger: 'sidebar user actions'});
 | 
					            compose_actions.start('stream', {trigger: 'sidebar user actions'});
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
					        const user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
				
			||||||
        var name = people.get_person_from_user_id(user_id).full_name;
 | 
					        const name = people.get_person_from_user_id(user_id).full_name;
 | 
				
			||||||
        var mention = people.get_mention_syntax(name, user_id);
 | 
					        const mention = people.get_mention_syntax(name, user_id);
 | 
				
			||||||
        compose_ui.insert_syntax_and_focus(mention);
 | 
					        compose_ui.insert_syntax_and_focus(mention);
 | 
				
			||||||
        exports.hide_user_sidebar_popover();
 | 
					        exports.hide_user_sidebar_popover();
 | 
				
			||||||
        exports.hide_userlist_sidebar();
 | 
					        exports.hide_userlist_sidebar();
 | 
				
			||||||
@@ -786,9 +786,9 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
        if (!compose_state.composing()) {
 | 
					        if (!compose_state.composing()) {
 | 
				
			||||||
            compose_actions.respond_to_message({trigger: 'user sidebar popover'});
 | 
					            compose_actions.respond_to_message({trigger: 'user sidebar popover'});
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
					        const user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
				
			||||||
        var name = people.get_person_from_user_id(user_id).full_name;
 | 
					        const name = people.get_person_from_user_id(user_id).full_name;
 | 
				
			||||||
        var mention = people.get_mention_syntax(name, user_id);
 | 
					        const mention = people.get_mention_syntax(name, user_id);
 | 
				
			||||||
        compose_ui.insert_syntax_and_focus(mention);
 | 
					        compose_ui.insert_syntax_and_focus(mention);
 | 
				
			||||||
        exports.hide_message_info_popover();
 | 
					        exports.hide_message_info_popover();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
@@ -796,8 +796,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.info_popover_actions .view_user_profile', function (e) {
 | 
					    $('body').on('click', '.info_popover_actions .view_user_profile', function (e) {
 | 
				
			||||||
        var user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
					        const user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
				
			||||||
        var user = people.get_person_from_user_id(user_id);
 | 
					        const user = people.get_person_from_user_id(user_id);
 | 
				
			||||||
        exports.show_user_profile(user);
 | 
					        exports.show_user_profile(user);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
@@ -805,7 +805,7 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.info_popover_actions .clear_status', function (e) {
 | 
					    $('body').on('click', '.info_popover_actions .clear_status', function (e) {
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        var me = $(e.target).parents('ul').attr('data-user-id');
 | 
					        const me = $(e.target).parents('ul').attr('data-user-id');
 | 
				
			||||||
        user_status.server_update({
 | 
					        user_status.server_update({
 | 
				
			||||||
            user_id: me,
 | 
					            user_id: me,
 | 
				
			||||||
            status_text: '',
 | 
					            status_text: '',
 | 
				
			||||||
@@ -816,8 +816,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.bot-owner-name', function (e) {
 | 
					    $('body').on('click', '.bot-owner-name', function (e) {
 | 
				
			||||||
        var user_id = $(e.target).attr('data-bot-owner-id');
 | 
					        const user_id = $(e.target).attr('data-bot-owner-id');
 | 
				
			||||||
        var user = people.get_person_from_user_id(user_id);
 | 
					        const user = people.get_person_from_user_id(user_id);
 | 
				
			||||||
        exports.show_user_profile(user);
 | 
					        exports.show_user_profile(user);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -859,8 +859,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        // use email of currently selected user, rather than some elem comparison,
 | 
					        // use email of currently selected user, rather than some elem comparison,
 | 
				
			||||||
        // as the presence list may be redrawn with new elements.
 | 
					        // as the presence list may be redrawn with new elements.
 | 
				
			||||||
        var target = $(this).closest('li');
 | 
					        const target = $(this).closest('li');
 | 
				
			||||||
        var user_id = target.find('a').attr('data-user-id');
 | 
					        const user_id = target.find('a').attr('data-user-id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (String(current_user_sidebar_user_id) === user_id) {
 | 
					        if (String(current_user_sidebar_user_id) === user_id) {
 | 
				
			||||||
            // If the popover is already shown, clicking again should toggle it.
 | 
					            // If the popover is already shown, clicking again should toggle it.
 | 
				
			||||||
@@ -877,8 +877,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
            stream_popover.show_streamlist_sidebar();
 | 
					            stream_popover.show_streamlist_sidebar();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var user = people.get_person_from_user_id(user_id);
 | 
					        const user = people.get_person_from_user_id(user_id);
 | 
				
			||||||
        var popover_placement = userlist_placement === "left" ? "right" : "left";
 | 
					        const popover_placement = userlist_placement === "left" ? "right" : "left";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        render_user_info_popover(user, target, false, "compose_private_message",
 | 
					        render_user_info_popover(user, target, false, "compose_private_message",
 | 
				
			||||||
                                 "user_popover", popover_placement);
 | 
					                                 "user_popover", popover_placement);
 | 
				
			||||||
@@ -888,7 +888,7 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on("mouseenter", ".user_popover_email", function () {
 | 
					    $('body').on("mouseenter", ".user_popover_email", function () {
 | 
				
			||||||
        var tooltip_holder = $(this).find('div');
 | 
					        const tooltip_holder = $(this).find('div');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (this.offsetWidth < this.scrollWidth) {
 | 
					        if (this.offsetWidth < this.scrollWidth) {
 | 
				
			||||||
            tooltip_holder.addClass('display-tooltip');
 | 
					            tooltip_holder.addClass('display-tooltip');
 | 
				
			||||||
@@ -910,7 +910,7 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.reminder_button', function (e) {
 | 
					    $('body').on('click', '.reminder_button', function (e) {
 | 
				
			||||||
        var message_id = $(e.currentTarget).data('message-id');
 | 
					        const message_id = $(e.currentTarget).data('message-id');
 | 
				
			||||||
        exports.render_actions_remind_popover($(".selected_message .actions_hover")[0], message_id);
 | 
					        exports.render_actions_remind_popover($(".selected_message .actions_hover")[0], message_id);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
@@ -923,7 +923,7 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function reminder_click_handler(datestr, e) {
 | 
					    function reminder_click_handler(datestr, e) {
 | 
				
			||||||
        var id = $(".remind.custom").data('message-id');
 | 
					        const id = $(".remind.custom").data('message-id');
 | 
				
			||||||
        reminder.do_set_reminder_for_message(id, datestr);
 | 
					        reminder.do_set_reminder_for_message(id, datestr);
 | 
				
			||||||
        exports.hide_all();
 | 
					        exports.hide_all();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
@@ -931,27 +931,27 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.remind.in_20m', function (e) {
 | 
					    $('body').on('click', '.remind.in_20m', function (e) {
 | 
				
			||||||
        var datestr = moment().add(20, 'm').format();
 | 
					        const datestr = moment().add(20, 'm').format();
 | 
				
			||||||
        reminder_click_handler(datestr, e);
 | 
					        reminder_click_handler(datestr, e);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.remind.in_1h', function (e) {
 | 
					    $('body').on('click', '.remind.in_1h', function (e) {
 | 
				
			||||||
        var datestr = moment().add(1, 'h').format();
 | 
					        const datestr = moment().add(1, 'h').format();
 | 
				
			||||||
        reminder_click_handler(datestr, e);
 | 
					        reminder_click_handler(datestr, e);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.remind.in_3h', function (e) {
 | 
					    $('body').on('click', '.remind.in_3h', function (e) {
 | 
				
			||||||
        var datestr = moment().add(3, 'h').format();
 | 
					        const datestr = moment().add(3, 'h').format();
 | 
				
			||||||
        reminder_click_handler(datestr, e);
 | 
					        reminder_click_handler(datestr, e);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.remind.tomo', function (e) {
 | 
					    $('body').on('click', '.remind.tomo', function (e) {
 | 
				
			||||||
        var datestr = moment().add(1, 'd').hour(9).minute(0).seconds(0).format();
 | 
					        const datestr = moment().add(1, 'd').hour(9).minute(0).seconds(0).format();
 | 
				
			||||||
        reminder_click_handler(datestr, e);
 | 
					        reminder_click_handler(datestr, e);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.remind.nxtw', function (e) {
 | 
					    $('body').on('click', '.remind.nxtw', function (e) {
 | 
				
			||||||
        var datestr = moment().add(1, 'w').day('monday').hour(9).minute(0).seconds(0).format();
 | 
					        const datestr = moment().add(1, 'w').day('monday').hour(9).minute(0).seconds(0).format();
 | 
				
			||||||
        reminder_click_handler(datestr, e);
 | 
					        reminder_click_handler(datestr, e);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -961,13 +961,13 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.flatpickr-confirm', function (e) {
 | 
					    $('body').on('click', '.flatpickr-confirm', function (e) {
 | 
				
			||||||
        var datestr = $(".remind.custom")[0].value;
 | 
					        const datestr = $(".remind.custom")[0].value;
 | 
				
			||||||
        reminder_click_handler(datestr, e);
 | 
					        reminder_click_handler(datestr, e);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.respond_personal_button, .compose_private_message', function (e) {
 | 
					    $('body').on('click', '.respond_personal_button, .compose_private_message', function (e) {
 | 
				
			||||||
        var user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
					        const user_id = $(e.target).parents('ul').attr('data-user-id');
 | 
				
			||||||
        var email = people.get_person_from_user_id(user_id).email;
 | 
					        const email = people.get_person_from_user_id(user_id).email;
 | 
				
			||||||
        compose_actions.start('private', {
 | 
					        compose_actions.start('private', {
 | 
				
			||||||
            trigger: 'popover send private',
 | 
					            trigger: 'popover send private',
 | 
				
			||||||
            private_message_recipient: email});
 | 
					            private_message_recipient: email});
 | 
				
			||||||
@@ -976,9 +976,9 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $('body').on('click', '.popover_toggle_collapse', function (e) {
 | 
					    $('body').on('click', '.popover_toggle_collapse', function (e) {
 | 
				
			||||||
        var message_id = $(e.currentTarget).data('message-id');
 | 
					        const message_id = $(e.currentTarget).data('message-id');
 | 
				
			||||||
        var row = current_msg_list.get_row(message_id);
 | 
					        const row = current_msg_list.get_row(message_id);
 | 
				
			||||||
        var message = current_msg_list.get(rows.id(row));
 | 
					        const message = current_msg_list.get(rows.id(row));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        exports.hide_actions_popover();
 | 
					        exports.hide_actions_popover();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -994,18 +994,18 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $('body').on('click', '.popover_edit_message', function (e) {
 | 
					    $('body').on('click', '.popover_edit_message', function (e) {
 | 
				
			||||||
        var message_id = $(e.currentTarget).data('message-id');
 | 
					        const message_id = $(e.currentTarget).data('message-id');
 | 
				
			||||||
        var row = current_msg_list.get_row(message_id);
 | 
					        const row = current_msg_list.get_row(message_id);
 | 
				
			||||||
        exports.hide_actions_popover();
 | 
					        exports.hide_actions_popover();
 | 
				
			||||||
        message_edit.start(row);
 | 
					        message_edit.start(row);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    $('body').on('click', '.view_edit_history', function (e) {
 | 
					    $('body').on('click', '.view_edit_history', function (e) {
 | 
				
			||||||
        var message_id = $(e.currentTarget).data('message-id');
 | 
					        const message_id = $(e.currentTarget).data('message-id');
 | 
				
			||||||
        var row = current_msg_list.get_row(message_id);
 | 
					        const row = current_msg_list.get_row(message_id);
 | 
				
			||||||
        var message = current_msg_list.get(rows.id(row));
 | 
					        const message = current_msg_list.get(rows.id(row));
 | 
				
			||||||
        var message_history_cancel_btn = $('#message-history-cancel');
 | 
					        const message_history_cancel_btn = $('#message-history-cancel');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        exports.hide_actions_popover();
 | 
					        exports.hide_actions_popover();
 | 
				
			||||||
        message_edit.show_history(message);
 | 
					        message_edit.show_history(message);
 | 
				
			||||||
@@ -1015,8 +1015,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.popover_mute_topic', function (e) {
 | 
					    $('body').on('click', '.popover_mute_topic', function (e) {
 | 
				
			||||||
        var stream_id = $(e.currentTarget).attr('data-msg-stream-id');
 | 
					        const stream_id = $(e.currentTarget).attr('data-msg-stream-id');
 | 
				
			||||||
        var topic = $(e.currentTarget).attr('data-msg-topic');
 | 
					        const topic = $(e.currentTarget).attr('data-msg-topic');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        exports.hide_actions_popover();
 | 
					        exports.hide_actions_popover();
 | 
				
			||||||
        muting_ui.mute(stream_id, topic);
 | 
					        muting_ui.mute(stream_id, topic);
 | 
				
			||||||
@@ -1025,8 +1025,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.popover_unmute_topic', function (e) {
 | 
					    $('body').on('click', '.popover_unmute_topic', function (e) {
 | 
				
			||||||
        var stream_id = $(e.currentTarget).attr('data-msg-stream-id');
 | 
					        const stream_id = $(e.currentTarget).attr('data-msg-stream-id');
 | 
				
			||||||
        var topic = $(e.currentTarget).attr('data-msg-topic');
 | 
					        const topic = $(e.currentTarget).attr('data-msg-topic');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        exports.hide_actions_popover();
 | 
					        exports.hide_actions_popover();
 | 
				
			||||||
        muting_ui.unmute(stream_id, topic);
 | 
					        muting_ui.unmute(stream_id, topic);
 | 
				
			||||||
@@ -1035,7 +1035,7 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.delete_message', function (e) {
 | 
					    $('body').on('click', '.delete_message', function (e) {
 | 
				
			||||||
        var message_id = $(e.currentTarget).data('message-id');
 | 
					        const message_id = $(e.currentTarget).data('message-id');
 | 
				
			||||||
        exports.hide_actions_popover();
 | 
					        exports.hide_actions_popover();
 | 
				
			||||||
        message_edit.delete_message(message_id);
 | 
					        message_edit.delete_message(message_id);
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
@@ -1046,8 +1046,8 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $('body').on('click', '.copy_link', function (e) {
 | 
					    $('body').on('click', '.copy_link', function (e) {
 | 
				
			||||||
        exports.hide_actions_popover();
 | 
					        exports.hide_actions_popover();
 | 
				
			||||||
        var id = $(this).attr("data-message-id");
 | 
					        const id = $(this).attr("data-message-id");
 | 
				
			||||||
        var row = $("[zid='" + id + "']");
 | 
					        const row = $("[zid='" + id + "']");
 | 
				
			||||||
        row.find(".alert-msg")
 | 
					        row.find(".alert-msg")
 | 
				
			||||||
            .text(i18n.t("Copied!"))
 | 
					            .text(i18n.t("Copied!"))
 | 
				
			||||||
            .css("display", "block")
 | 
					            .css("display", "block")
 | 
				
			||||||
@@ -1064,7 +1064,7 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function () {
 | 
					    (function () {
 | 
				
			||||||
        var last_scroll = 0;
 | 
					        let last_scroll = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $('.app').on('scroll', function () {
 | 
					        $('.app').on('scroll', function () {
 | 
				
			||||||
            if (suppress_scroll_hide) {
 | 
					            if (suppress_scroll_hide) {
 | 
				
			||||||
@@ -1072,7 +1072,7 @@ exports.register_click_handlers = function () {
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var date = new Date().getTime();
 | 
					            const date = new Date().getTime();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // only run `popovers.hide_all()` if the last scroll was more
 | 
					            // only run `popovers.hide_all()` if the last scroll was more
 | 
				
			||||||
            // than 250ms ago.
 | 
					            // than 250ms ago.
 | 
				
			||||||
@@ -1135,22 +1135,22 @@ exports.set_userlist_placement = function (placement) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.compute_placement = function (elt, popover_height, popover_width,
 | 
					exports.compute_placement = function (elt, popover_height, popover_width,
 | 
				
			||||||
                                      prefer_vertical_positioning) {
 | 
					                                      prefer_vertical_positioning) {
 | 
				
			||||||
    var client_rect = elt.get(0).getBoundingClientRect();
 | 
					    const client_rect = elt.get(0).getBoundingClientRect();
 | 
				
			||||||
    var distance_from_top = client_rect.top;
 | 
					    const distance_from_top = client_rect.top;
 | 
				
			||||||
    var distance_from_bottom = message_viewport.height() - client_rect.bottom;
 | 
					    const distance_from_bottom = message_viewport.height() - client_rect.bottom;
 | 
				
			||||||
    var distance_from_left = client_rect.left;
 | 
					    const distance_from_left = client_rect.left;
 | 
				
			||||||
    var distance_from_right = message_viewport.width() - client_rect.right;
 | 
					    const distance_from_right = message_viewport.width() - client_rect.right;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var elt_will_fit_horizontally =
 | 
					    const elt_will_fit_horizontally =
 | 
				
			||||||
        distance_from_left + elt.width() / 2 > popover_width / 2 &&
 | 
					        distance_from_left + elt.width() / 2 > popover_width / 2 &&
 | 
				
			||||||
        distance_from_right + elt.width() / 2 > popover_width / 2;
 | 
					        distance_from_right + elt.width() / 2 > popover_width / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var elt_will_fit_vertically =
 | 
					    const elt_will_fit_vertically =
 | 
				
			||||||
        distance_from_bottom + elt.height() / 2 > popover_height / 2 &&
 | 
					        distance_from_bottom + elt.height() / 2 > popover_height / 2 &&
 | 
				
			||||||
        distance_from_top + elt.height() / 2 > popover_height / 2;
 | 
					        distance_from_top + elt.height() / 2 > popover_height / 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // default to placing the popover in the center of the screen
 | 
					    // default to placing the popover in the center of the screen
 | 
				
			||||||
    var placement = 'viewport_center';
 | 
					    let placement = 'viewport_center';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // prioritize left/right over top/bottom
 | 
					    // prioritize left/right over top/bottom
 | 
				
			||||||
    if (distance_from_top > popover_height && elt_will_fit_horizontally) {
 | 
					    if (distance_from_top > popover_height && elt_will_fit_horizontally) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -216,7 +216,7 @@ function set_invite_to_stream_policy_dropdown() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function set_user_group_edit_policy_dropdown() {
 | 
					function set_user_group_edit_policy_dropdown() {
 | 
				
			||||||
    var value = get_property_value("realm_user_group_edit_policy");
 | 
					    const value = get_property_value("realm_user_group_edit_policy");
 | 
				
			||||||
    $("#id_realm_user_group_edit_policy").val(value);
 | 
					    $("#id_realm_user_group_edit_policy").val(value);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -839,7 +839,7 @@ exports.build_page = function () {
 | 
				
			|||||||
            data = {};
 | 
					            data = {};
 | 
				
			||||||
            data.authentication_methods = JSON.stringify(get_auth_method_table_data());
 | 
					            data.authentication_methods = JSON.stringify(get_auth_method_table_data());
 | 
				
			||||||
        } else if (subsection === 'user_defaults') {
 | 
					        } else if (subsection === 'user_defaults') {
 | 
				
			||||||
            var realm_default_twenty_four_hour_time = $('#id_realm_default_twenty_four_hour_time').val();
 | 
					            const realm_default_twenty_four_hour_time = $('#id_realm_default_twenty_four_hour_time').val();
 | 
				
			||||||
            data.default_twenty_four_hour_time = realm_default_twenty_four_hour_time;
 | 
					            data.default_twenty_four_hour_time = realm_default_twenty_four_hour_time;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return data;
 | 
					        return data;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
var render_admin_user_group_list = require('../templates/admin_user_group_list.hbs');
 | 
					const render_admin_user_group_list = require('../templates/admin_user_group_list.hbs');
 | 
				
			||||||
var render_confirm_delete_user = require('../templates/confirm_delete_user.hbs');
 | 
					const render_confirm_delete_user = require('../templates/confirm_delete_user.hbs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var meta = {
 | 
					const meta = {
 | 
				
			||||||
    loaded: false,
 | 
					    loaded: false,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -14,7 +14,7 @@ exports.reload = function () {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var user_groups_section = $('#user-groups').expectOne();
 | 
					    const user_groups_section = $('#user-groups').expectOne();
 | 
				
			||||||
    user_groups_section.html('');
 | 
					    user_groups_section.html('');
 | 
				
			||||||
    exports.populate_user_groups();
 | 
					    exports.populate_user_groups();
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -39,8 +39,8 @@ exports.can_edit = function (group_id) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.populate_user_groups = function () {
 | 
					exports.populate_user_groups = function () {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var user_groups_section = $('#user-groups').expectOne();
 | 
					    const user_groups_section = $('#user-groups').expectOne();
 | 
				
			||||||
    var user_groups_array = user_groups.get_realm_user_groups();
 | 
					    const user_groups_array = user_groups.get_realm_user_groups();
 | 
				
			||||||
    _.each(user_groups_array, function (data) {
 | 
					    _.each(user_groups_array, function (data) {
 | 
				
			||||||
        user_groups_section.append(render_admin_user_group_list({
 | 
					        user_groups_section.append(render_admin_user_group_list({
 | 
				
			||||||
            user_group: {
 | 
					            user_group: {
 | 
				
			||||||
@@ -49,16 +49,16 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
                description: data.description,
 | 
					                description: data.description,
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        }));
 | 
					        }));
 | 
				
			||||||
        var pill_container = $('.pill-container[data-group-pills="' + data.id + '"]');
 | 
					        const pill_container = $('.pill-container[data-group-pills="' + data.id + '"]');
 | 
				
			||||||
        var pills = user_pill.create_pills(pill_container);
 | 
					        const pills = user_pill.create_pills(pill_container);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function get_pill_user_ids() {
 | 
					        function get_pill_user_ids() {
 | 
				
			||||||
            return user_pill.get_user_ids(pills);
 | 
					            return user_pill.get_user_ids(pills);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var userg = $('div.user-group[id="' + data.id + '"]');
 | 
					        const userg = $('div.user-group[id="' + data.id + '"]');
 | 
				
			||||||
        data.members.keys().forEach(function (user_id) {
 | 
					        data.members.keys().forEach(function (user_id) {
 | 
				
			||||||
            var user = people.get_person_from_user_id(user_id);
 | 
					            const user = people.get_person_from_user_id(user_id);
 | 
				
			||||||
            user_pill.append_user(user, pills);
 | 
					            user_pill.append_user(user, pills);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,13 +85,13 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
        update_membership(data.id);
 | 
					        update_membership(data.id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function is_user_group_changed() {
 | 
					        function is_user_group_changed() {
 | 
				
			||||||
            var draft_group = get_pill_user_ids();
 | 
					            const draft_group = get_pill_user_ids();
 | 
				
			||||||
            var group_data = user_groups.get_user_group_from_id(data.id);
 | 
					            const group_data = user_groups.get_user_group_from_id(data.id);
 | 
				
			||||||
            var original_group = group_data.members.keys();
 | 
					            const original_group = group_data.members.keys();
 | 
				
			||||||
            var same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group));
 | 
					            const same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group));
 | 
				
			||||||
            var description = $('#user-groups #' + data.id + ' .description').text().trim();
 | 
					            const description = $('#user-groups #' + data.id + ' .description').text().trim();
 | 
				
			||||||
            var name = $('#user-groups #' + data.id + ' .name').text().trim();
 | 
					            const name = $('#user-groups #' + data.id + ' .name').text().trim();
 | 
				
			||||||
            var user_group_status = $('#user-groups #' + data.id + ' .user-group-status');
 | 
					            const user_group_status = $('#user-groups #' + data.id + ' .user-group-status');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (user_group_status.is(':visible')) {
 | 
					            if (user_group_status.is(':visible')) {
 | 
				
			||||||
                return false;
 | 
					                return false;
 | 
				
			||||||
@@ -108,9 +108,9 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
            if (!exports.can_edit(data.id)) {
 | 
					            if (!exports.can_edit(data.id)) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger');
 | 
					            const cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger');
 | 
				
			||||||
            var saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green');
 | 
					            const saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green');
 | 
				
			||||||
            var save_instructions = $('#user-groups #' + data.id + ' .save-instructions');
 | 
					            const save_instructions = $('#user-groups #' + data.id + ' .save-instructions');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (is_user_group_changed() &&
 | 
					            if (is_user_group_changed() &&
 | 
				
			||||||
               !cancel_button.is(':visible')) {
 | 
					               !cancel_button.is(':visible')) {
 | 
				
			||||||
@@ -125,9 +125,9 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function show_saved_button() {
 | 
					        function show_saved_button() {
 | 
				
			||||||
            var cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger');
 | 
					            const cancel_button = $('#user-groups #' + data.id + ' .save-status.btn-danger');
 | 
				
			||||||
            var saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green');
 | 
					            const saved_button = $('#user-groups #' + data.id + ' .save-status.sea-green');
 | 
				
			||||||
            var save_instructions = $('#user-groups #' + data.id + ' .save-instructions');
 | 
					            const save_instructions = $('#user-groups #' + data.id + ' .save-instructions');
 | 
				
			||||||
            if (!saved_button.is(':visible')) {
 | 
					            if (!saved_button.is(':visible')) {
 | 
				
			||||||
                cancel_button.fadeOut(0);
 | 
					                cancel_button.fadeOut(0);
 | 
				
			||||||
                save_instructions.fadeOut(0);
 | 
					                save_instructions.fadeOut(0);
 | 
				
			||||||
@@ -136,15 +136,15 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function save_members() {
 | 
					        function save_members() {
 | 
				
			||||||
            var draft_group = get_pill_user_ids();
 | 
					            const draft_group = get_pill_user_ids();
 | 
				
			||||||
            var group_data = user_groups.get_user_group_from_id(data.id);
 | 
					            const group_data = user_groups.get_user_group_from_id(data.id);
 | 
				
			||||||
            var original_group = group_data.members.keys();
 | 
					            const original_group = group_data.members.keys();
 | 
				
			||||||
            var same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group));
 | 
					            const same_groups = _.isEqual(_.sortBy(draft_group), _.sortBy(original_group));
 | 
				
			||||||
            if (!draft_group.length || same_groups) {
 | 
					            if (!draft_group.length || same_groups) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var added = _.difference(draft_group, original_group);
 | 
					            const added = _.difference(draft_group, original_group);
 | 
				
			||||||
            var removed = _.difference(original_group, draft_group);
 | 
					            const removed = _.difference(original_group, draft_group);
 | 
				
			||||||
            channel.post({
 | 
					            channel.post({
 | 
				
			||||||
                url: "/json/user_groups/" + data.id + '/members',
 | 
					                url: "/json/user_groups/" + data.id + '/members',
 | 
				
			||||||
                data: {
 | 
					                data: {
 | 
				
			||||||
@@ -158,10 +158,10 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function save_name_desc() {
 | 
					        function save_name_desc() {
 | 
				
			||||||
            var user_group_status = $('#user-groups #' + data.id + ' .user-group-status');
 | 
					            const user_group_status = $('#user-groups #' + data.id + ' .user-group-status');
 | 
				
			||||||
            var group_data = user_groups.get_user_group_from_id(data.id);
 | 
					            const group_data = user_groups.get_user_group_from_id(data.id);
 | 
				
			||||||
            var description = $('#user-groups #' + data.id + ' .description').text().trim();
 | 
					            const description = $('#user-groups #' + data.id + ' .description').text().trim();
 | 
				
			||||||
            var name = $('#user-groups #' + data.id + ' .name').text().trim();
 | 
					            const name = $('#user-groups #' + data.id + ' .name').text().trim();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (group_data.description === description && group_data.name === name) {
 | 
					            if (group_data.description === description && group_data.name === name) {
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
@@ -178,7 +178,7 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
                    setTimeout(show_saved_button, 200);
 | 
					                    setTimeout(show_saved_button, 200);
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                error: function (xhr) {
 | 
					                error: function (xhr) {
 | 
				
			||||||
                    var errors = JSON.parse(xhr.responseText).msg;
 | 
					                    const errors = JSON.parse(xhr.responseText).msg;
 | 
				
			||||||
                    xhr.responseText = JSON.stringify({msg: errors});
 | 
					                    xhr.responseText = JSON.stringify({msg: errors});
 | 
				
			||||||
                    ui_report.error(i18n.t("Failed"), xhr, user_group_status);
 | 
					                    ui_report.error(i18n.t("Failed"), xhr, user_group_status);
 | 
				
			||||||
                    update_cancel_button();
 | 
					                    update_cancel_button();
 | 
				
			||||||
@@ -194,8 +194,8 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
                return true;
 | 
					                return true;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"],
 | 
					            const blur_exceptions = _.without([".pill-container", ".name", ".description", ".input", ".delete"],
 | 
				
			||||||
                                            except_class);
 | 
					                                              except_class);
 | 
				
			||||||
            if ($(event.relatedTarget).closest('#user-groups #' + data.id).length) {
 | 
					            if ($(event.relatedTarget).closest('#user-groups #' + data.id).length) {
 | 
				
			||||||
                return _.some(blur_exceptions, function (class_name) {
 | 
					                return _.some(blur_exceptions, function (class_name) {
 | 
				
			||||||
                    return $(event.relatedTarget).closest(class_name).length;
 | 
					                    return $(event.relatedTarget).closest(class_name).length;
 | 
				
			||||||
@@ -239,7 +239,7 @@ exports.populate_user_groups = function () {
 | 
				
			|||||||
            update_cancel_button();
 | 
					            update_cancel_button();
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var input = pill_container.children('.input');
 | 
					        const input = pill_container.children('.input');
 | 
				
			||||||
        if (exports.can_edit(data.id)) {
 | 
					        if (exports.can_edit(data.id)) {
 | 
				
			||||||
            user_pill.set_up_typeahead_on_pills(input, pills, update_cancel_button);
 | 
					            user_pill.set_up_typeahead_on_pills(input, pills, update_cancel_button);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -268,9 +268,9 @@ exports.set_up = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        e.stopPropagation();
 | 
					        e.stopPropagation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var user_group_status = $('#admin-user-group-status');
 | 
					        const user_group_status = $('#admin-user-group-status');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var group = {
 | 
					        const group = {
 | 
				
			||||||
            members: JSON.stringify([people.my_current_user_id()]),
 | 
					            members: JSON.stringify([people.my_current_user_id()]),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        _.each($(this).serializeArray(), function (obj) {
 | 
					        _.each($(this).serializeArray(), function (obj) {
 | 
				
			||||||
@@ -290,7 +290,7 @@ exports.set_up = function () {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            error: function (xhr) {
 | 
					            error: function (xhr) {
 | 
				
			||||||
                user_group_status.hide();
 | 
					                user_group_status.hide();
 | 
				
			||||||
                var errors = JSON.parse(xhr.responseText).msg;
 | 
					                const errors = JSON.parse(xhr.responseText).msg;
 | 
				
			||||||
                xhr.responseText = JSON.stringify({msg: errors});
 | 
					                xhr.responseText = JSON.stringify({msg: errors});
 | 
				
			||||||
                ui_report.error(i18n.t("Failed"), xhr, user_group_status);
 | 
					                ui_report.error(i18n.t("Failed"), xhr, user_group_status);
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
@@ -298,12 +298,12 @@ exports.set_up = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $('#user-groups').on('click', '.delete', function () {
 | 
					    $('#user-groups').on('click', '.delete', function () {
 | 
				
			||||||
        var group_id = $(this).parents('.user-group').attr('id');
 | 
					        const group_id = $(this).parents('.user-group').attr('id');
 | 
				
			||||||
        if (!exports.can_edit(group_id)) {
 | 
					        if (!exports.can_edit(group_id)) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var user_group = user_groups.get_user_group_from_id(group_id);
 | 
					        const user_group = user_groups.get_user_group_from_id(group_id);
 | 
				
			||||||
        var btn = $(this);
 | 
					        const btn = $(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function delete_user_group() {
 | 
					        function delete_user_group() {
 | 
				
			||||||
            channel.del({
 | 
					            channel.del({
 | 
				
			||||||
@@ -322,9 +322,9 @@ exports.set_up = function () {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // This is mostly important for styling concerns.
 | 
					        // This is mostly important for styling concerns.
 | 
				
			||||||
        var modal_parent = $('#settings_content');
 | 
					        const modal_parent = $('#settings_content');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var html_body = render_confirm_delete_user({
 | 
					        const html_body = render_confirm_delete_user({
 | 
				
			||||||
            group_name: user_group.name,
 | 
					            group_name: user_group.name,
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
var render_announce_stream_docs = require('../templates/announce_stream_docs.hbs');
 | 
					const render_announce_stream_docs = require('../templates/announce_stream_docs.hbs');
 | 
				
			||||||
var render_new_stream_users = require('../templates/new_stream_users.hbs');
 | 
					const render_new_stream_users = require('../templates/new_stream_users.hbs');
 | 
				
			||||||
var render_subscription_invites_warning_modal = require('../templates/subscription_invites_warning_modal.hbs');
 | 
					const render_subscription_invites_warning_modal = require('../templates/subscription_invites_warning_modal.hbs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var created_stream;
 | 
					let created_stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.reset_created_stream = function () {
 | 
					exports.reset_created_stream = function () {
 | 
				
			||||||
    created_stream = undefined;
 | 
					    created_stream = undefined;
 | 
				
			||||||
@@ -16,8 +16,8 @@ exports.get_name = function () {
 | 
				
			|||||||
    return created_stream;
 | 
					    return created_stream;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var stream_subscription_error = (function () {
 | 
					const stream_subscription_error = (function () {
 | 
				
			||||||
    var self = {};
 | 
					    const self = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    self.report_no_subs_to_stream = function () {
 | 
					    self.report_no_subs_to_stream = function () {
 | 
				
			||||||
        $("#stream_subscription_error").text(i18n.t("You cannot create a stream with no subscribers!"));
 | 
					        $("#stream_subscription_error").text(i18n.t("You cannot create a stream with no subscribers!"));
 | 
				
			||||||
@@ -37,8 +37,8 @@ var stream_subscription_error = (function () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}());
 | 
					}());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var stream_name_error = (function () {
 | 
					const stream_name_error = (function () {
 | 
				
			||||||
    var self = {};
 | 
					    const self = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    self.report_already_exists = function () {
 | 
					    self.report_already_exists = function () {
 | 
				
			||||||
        $("#stream_name_error").text(i18n.t("A stream with this name already exists"));
 | 
					        $("#stream_name_error").text(i18n.t("A stream with this name already exists"));
 | 
				
			||||||
@@ -118,7 +118,7 @@ function ajaxSubscribeForCreation(stream_name, description, principals, invite_o
 | 
				
			|||||||
            // The rest of the work is done via the subscribe event we will get
 | 
					            // The rest of the work is done via the subscribe event we will get
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        error: function (xhr) {
 | 
					        error: function (xhr) {
 | 
				
			||||||
            var msg = JSON.parse(xhr.responseText).msg;
 | 
					            const msg = JSON.parse(xhr.responseText).msg;
 | 
				
			||||||
            if (msg.indexOf('access') >= 0) {
 | 
					            if (msg.indexOf('access') >= 0) {
 | 
				
			||||||
                // If we can't access the stream, we can safely assume it's
 | 
					                // If we can't access the stream, we can safely assume it's
 | 
				
			||||||
                // a duplicate stream that we are not invited to.
 | 
					                // a duplicate stream that we are not invited to.
 | 
				
			||||||
@@ -143,11 +143,11 @@ function update_announce_stream_state() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // If the stream is invite only, disable the "Announce stream" option.
 | 
					    // If the stream is invite only, disable the "Announce stream" option.
 | 
				
			||||||
    // Otherwise enable it.
 | 
					    // Otherwise enable it.
 | 
				
			||||||
    var announce_stream_checkbox = $('#announce-new-stream input');
 | 
					    const announce_stream_checkbox = $('#announce-new-stream input');
 | 
				
			||||||
    var announce_stream_label = $('#announce-new-stream');
 | 
					    const announce_stream_label = $('#announce-new-stream');
 | 
				
			||||||
    var disable_it = false;
 | 
					    let disable_it = false;
 | 
				
			||||||
    var privacy_type = $('input:radio[name=privacy]:checked').val();
 | 
					    const privacy_type = $('input:radio[name=privacy]:checked').val();
 | 
				
			||||||
    var is_invite_only = privacy_type === "invite-only" || privacy_type === "invite-only-public-history";
 | 
					    const is_invite_only = privacy_type === "invite-only" || privacy_type === "invite-only-public-history";
 | 
				
			||||||
    announce_stream_label.removeClass("control-label-disabled");
 | 
					    announce_stream_label.removeClass("control-label-disabled");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (is_invite_only) {
 | 
					    if (is_invite_only) {
 | 
				
			||||||
@@ -170,14 +170,14 @@ function get_principals() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function create_stream() {
 | 
					function create_stream() {
 | 
				
			||||||
    var stream_name = $.trim($("#create_stream_name").val());
 | 
					    const stream_name = $.trim($("#create_stream_name").val());
 | 
				
			||||||
    var description = $.trim($("#create_stream_description").val());
 | 
					    const description = $.trim($("#create_stream_description").val());
 | 
				
			||||||
    var privacy_setting = $('#stream_creation_form input[name=privacy]:checked').val();
 | 
					    const privacy_setting = $('#stream_creation_form input[name=privacy]:checked').val();
 | 
				
			||||||
    var is_announcement_only = $('#stream_creation_form input[name=is-announcement-only]').prop('checked');
 | 
					    const is_announcement_only = $('#stream_creation_form input[name=is-announcement-only]').prop('checked');
 | 
				
			||||||
    var principals = get_principals();
 | 
					    const principals = get_principals();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var invite_only;
 | 
					    let invite_only;
 | 
				
			||||||
    var history_public_to_subscribers;
 | 
					    let history_public_to_subscribers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (privacy_setting === 'invite-only') {
 | 
					    if (privacy_setting === 'invite-only') {
 | 
				
			||||||
        invite_only = true;
 | 
					        invite_only = true;
 | 
				
			||||||
@@ -192,7 +192,7 @@ function create_stream() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    created_stream = stream_name;
 | 
					    created_stream = stream_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var announce = !!page_params.notifications_stream &&
 | 
					    const announce = !!page_params.notifications_stream &&
 | 
				
			||||||
        $('#announce-new-stream input').prop('checked');
 | 
					        $('#announce-new-stream input').prop('checked');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Even though we already check to make sure that while typing the user cannot enter
 | 
					    // Even though we already check to make sure that while typing the user cannot enter
 | 
				
			||||||
@@ -254,16 +254,16 @@ exports.show_new_stream_modal = function () {
 | 
				
			|||||||
    $("#stream-creation").removeClass("hide");
 | 
					    $("#stream-creation").removeClass("hide");
 | 
				
			||||||
    $(".right .settings").hide();
 | 
					    $(".right .settings").hide();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var all_users = people.get_rest_of_realm();
 | 
					    const all_users = people.get_rest_of_realm();
 | 
				
			||||||
    // Add current user on top of list
 | 
					    // Add current user on top of list
 | 
				
			||||||
    all_users.unshift(people.get_person_from_user_id(page_params.user_id));
 | 
					    all_users.unshift(people.get_person_from_user_id(page_params.user_id));
 | 
				
			||||||
    var html = render_new_stream_users({
 | 
					    const html = render_new_stream_users({
 | 
				
			||||||
        users: all_users,
 | 
					        users: all_users,
 | 
				
			||||||
        streams: stream_data.get_streams_for_settings_page(),
 | 
					        streams: stream_data.get_streams_for_settings_page(),
 | 
				
			||||||
        is_admin: page_params.is_admin,
 | 
					        is_admin: page_params.is_admin,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var container = $('#people_to_add');
 | 
					    const container = $('#people_to_add');
 | 
				
			||||||
    container.html(html);
 | 
					    container.html(html);
 | 
				
			||||||
    exports.create_handlers_for_users(container);
 | 
					    exports.create_handlers_for_users(container);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -281,14 +281,14 @@ exports.show_new_stream_modal = function () {
 | 
				
			|||||||
    clear_error_display();
 | 
					    clear_error_display();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $("#stream-checkboxes label.checkbox").on('change', function (e) {
 | 
					    $("#stream-checkboxes label.checkbox").on('change', function (e) {
 | 
				
			||||||
        var elem = $(this);
 | 
					        const elem = $(this);
 | 
				
			||||||
        var stream_id = elem.attr('data-stream-id');
 | 
					        const stream_id = elem.attr('data-stream-id');
 | 
				
			||||||
        var checked = elem.find('input').prop('checked');
 | 
					        const checked = elem.find('input').prop('checked');
 | 
				
			||||||
        var subscriber_ids = stream_data.get_sub_by_id(stream_id).subscribers;
 | 
					        const subscriber_ids = stream_data.get_sub_by_id(stream_id).subscribers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $('#user-checkboxes label.checkbox').each(function () {
 | 
					        $('#user-checkboxes label.checkbox').each(function () {
 | 
				
			||||||
            var user_elem = $(this);
 | 
					            const user_elem = $(this);
 | 
				
			||||||
            var user_id = user_elem.attr('data-user-id');
 | 
					            const user_id = user_elem.attr('data-user-id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (subscriber_ids.has(user_id)) {
 | 
					            if (subscriber_ids.has(user_id)) {
 | 
				
			||||||
                user_elem.find('input').prop('checked', checked);
 | 
					                user_elem.find('input').prop('checked', checked);
 | 
				
			||||||
@@ -337,23 +337,23 @@ exports.create_handlers_for_users = function (container) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Search People or Streams
 | 
					    // Search People or Streams
 | 
				
			||||||
    container.on('input', '.add-user-list-filter', function (e) {
 | 
					    container.on('input', '.add-user-list-filter', function (e) {
 | 
				
			||||||
        var user_list = $(".add-user-list-filter");
 | 
					        const user_list = $(".add-user-list-filter");
 | 
				
			||||||
        if (user_list === 0) {
 | 
					        if (user_list === 0) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var search_term = user_list.expectOne().val().trim();
 | 
					        const search_term = user_list.expectOne().val().trim();
 | 
				
			||||||
        var search_terms = search_term.toLowerCase().split(",");
 | 
					        const search_terms = search_term.toLowerCase().split(",");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        (function filter_user_checkboxes() {
 | 
					        (function filter_user_checkboxes() {
 | 
				
			||||||
            var user_labels = $("#user-checkboxes label.add-user-label");
 | 
					            const user_labels = $("#user-checkboxes label.add-user-label");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (search_term === '') {
 | 
					            if (search_term === '') {
 | 
				
			||||||
                user_labels.css({display: 'block'});
 | 
					                user_labels.css({display: 'block'});
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var users = people.get_rest_of_realm();
 | 
					            const users = people.get_rest_of_realm();
 | 
				
			||||||
            var filtered_users = people.filter_people_by_search_terms(users, search_terms);
 | 
					            const filtered_users = people.filter_people_by_search_terms(users, search_terms);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Be careful about modifying the follow code.  A naive implementation
 | 
					            // Be careful about modifying the follow code.  A naive implementation
 | 
				
			||||||
            // will work very poorly with a large user population (~1000 users).
 | 
					            // will work very poorly with a large user population (~1000 users).
 | 
				
			||||||
@@ -363,10 +363,10 @@ exports.create_handlers_for_users = function (container) {
 | 
				
			|||||||
            // This would break the previous implementation, whereas the new
 | 
					            // This would break the previous implementation, whereas the new
 | 
				
			||||||
            // implementation is merely sluggish.
 | 
					            // implementation is merely sluggish.
 | 
				
			||||||
            user_labels.each(function () {
 | 
					            user_labels.each(function () {
 | 
				
			||||||
                var elem = $(this);
 | 
					                const elem = $(this);
 | 
				
			||||||
                var user_id = elem.attr('data-user-id');
 | 
					                const user_id = elem.attr('data-user-id');
 | 
				
			||||||
                var user_checked = filtered_users.has(user_id);
 | 
					                const user_checked = filtered_users.has(user_id);
 | 
				
			||||||
                var display = user_checked ? "block" : "none";
 | 
					                const display = user_checked ? "block" : "none";
 | 
				
			||||||
                elem.css({display: display});
 | 
					                elem.css({display: display});
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
        }());
 | 
					        }());
 | 
				
			||||||
@@ -377,7 +377,7 @@ exports.create_handlers_for_users = function (container) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.set_up_handlers = function () {
 | 
					exports.set_up_handlers = function () {
 | 
				
			||||||
    var container = $('#stream-creation').expectOne();
 | 
					    const container = $('#stream-creation').expectOne();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    container.on('change', '#make-invite-only input', update_announce_stream_state);
 | 
					    container.on('change', '#make-invite-only input', update_announce_stream_state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -385,14 +385,14 @@ exports.set_up_handlers = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
        clear_error_display();
 | 
					        clear_error_display();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var stream_name = $.trim($("#create_stream_name").val());
 | 
					        const stream_name = $.trim($("#create_stream_name").val());
 | 
				
			||||||
        var name_ok = stream_name_error.validate_for_submit(stream_name);
 | 
					        const name_ok = stream_name_error.validate_for_submit(stream_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!name_ok) {
 | 
					        if (!name_ok) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var principals = get_principals();
 | 
					        const principals = get_principals();
 | 
				
			||||||
        if (principals.length === 0) {
 | 
					        if (principals.length === 0) {
 | 
				
			||||||
            stream_subscription_error.report_no_subs_to_stream();
 | 
					            stream_subscription_error.report_no_subs_to_stream();
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
@@ -403,7 +403,7 @@ exports.set_up_handlers = function () {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (principals.length >= 50) {
 | 
					        if (principals.length >= 50) {
 | 
				
			||||||
            var invites_warning_modal = render_subscription_invites_warning_modal({
 | 
					            const invites_warning_modal = render_subscription_invites_warning_modal({
 | 
				
			||||||
                stream_name: stream_name,
 | 
					                stream_name: stream_name,
 | 
				
			||||||
                count: principals.length,
 | 
					                count: principals.length,
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
@@ -423,14 +423,14 @@ exports.set_up_handlers = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    container.on("input", "#create_stream_name", function () {
 | 
					    container.on("input", "#create_stream_name", function () {
 | 
				
			||||||
        var stream_name = $.trim($("#create_stream_name").val());
 | 
					        const stream_name = $.trim($("#create_stream_name").val());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // This is an inexpensive check.
 | 
					        // This is an inexpensive check.
 | 
				
			||||||
        stream_name_error.pre_validate(stream_name);
 | 
					        stream_name_error.pre_validate(stream_name);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    container.on("mouseover", "#announce-stream-docs", function (e) {
 | 
					    container.on("mouseover", "#announce-stream-docs", function (e) {
 | 
				
			||||||
        var announce_stream_docs = $("#announce-stream-docs");
 | 
					        const announce_stream_docs = $("#announce-stream-docs");
 | 
				
			||||||
        announce_stream_docs.popover({
 | 
					        announce_stream_docs.popover({
 | 
				
			||||||
            placement: "right",
 | 
					            placement: "right",
 | 
				
			||||||
            content: render_announce_stream_docs({
 | 
					            content: render_announce_stream_docs({
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
var render_subscription = require('../templates/subscription.hbs');
 | 
					const render_subscription = require('../templates/subscription.hbs');
 | 
				
			||||||
var render_subscription_settings = require('../templates/subscription_settings.hbs');
 | 
					const render_subscription_settings = require('../templates/subscription_settings.hbs');
 | 
				
			||||||
var render_subscription_table_body = require('../templates/subscription_table_body.hbs');
 | 
					const render_subscription_table_body = require('../templates/subscription_table_body.hbs');
 | 
				
			||||||
var render_subscriptions = require('../templates/subscriptions.hbs');
 | 
					const render_subscriptions = require('../templates/subscriptions.hbs');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.show_subs_pane = {
 | 
					exports.show_subs_pane = {
 | 
				
			||||||
    nothing_selected: function () {
 | 
					    nothing_selected: function () {
 | 
				
			||||||
@@ -15,7 +15,7 @@ exports.show_subs_pane = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.check_button_for_sub = function (sub) {
 | 
					exports.check_button_for_sub = function (sub) {
 | 
				
			||||||
    var id = parseInt(sub.stream_id, 10);
 | 
					    const id = parseInt(sub.stream_id, 10);
 | 
				
			||||||
    return $(".stream-row[data-stream-id='" + id + "'] .check");
 | 
					    return $(".stream-row[data-stream-id='" + id + "'] .check");
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,14 +26,14 @@ exports.row_for_stream_id = function (stream_id) {
 | 
				
			|||||||
exports.settings_button_for_sub = function (sub) {
 | 
					exports.settings_button_for_sub = function (sub) {
 | 
				
			||||||
    // We don't do expectOne() here, because this button is only
 | 
					    // We don't do expectOne() here, because this button is only
 | 
				
			||||||
    // visible if the user has that stream selected in the streams UI.
 | 
					    // visible if the user has that stream selected in the streams UI.
 | 
				
			||||||
    var id = parseInt(sub.stream_id, 10);
 | 
					    const id = parseInt(sub.stream_id, 10);
 | 
				
			||||||
    return $(".subscription_settings[data-stream-id='" + id + "'] .subscribe-button");
 | 
					    return $(".subscription_settings[data-stream-id='" + id + "'] .subscribe-button");
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function get_row_data(row) {
 | 
					function get_row_data(row) {
 | 
				
			||||||
    var row_id = row.attr('data-stream-id');
 | 
					    const row_id = row.attr('data-stream-id');
 | 
				
			||||||
    if (row_id) {
 | 
					    if (row_id) {
 | 
				
			||||||
        var row_object = stream_data.get_sub_by_id(row_id);
 | 
					        const row_object = stream_data.get_sub_by_id(row_id);
 | 
				
			||||||
        return {
 | 
					        return {
 | 
				
			||||||
            id: row_id,
 | 
					            id: row_id,
 | 
				
			||||||
            object: row_object,
 | 
					            object: row_object,
 | 
				
			||||||
@@ -42,9 +42,9 @@ function get_row_data(row) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.get_active_data = function () {
 | 
					exports.get_active_data = function () {
 | 
				
			||||||
    var active_row = $('div.stream-row.active');
 | 
					    const active_row = $('div.stream-row.active');
 | 
				
			||||||
    var valid_active_id = active_row.attr('data-stream-id');
 | 
					    const valid_active_id = active_row.attr('data-stream-id');
 | 
				
			||||||
    var active_tab = $('.subscriptions-container').find('div.ind-tab.selected');
 | 
					    const active_tab = $('.subscriptions-container').find('div.ind-tab.selected');
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
        row: active_row,
 | 
					        row: active_row,
 | 
				
			||||||
        id: valid_active_id,
 | 
					        id: valid_active_id,
 | 
				
			||||||
@@ -61,8 +61,8 @@ function get_hash_safe() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function selectText(element) {
 | 
					function selectText(element) {
 | 
				
			||||||
    var range;
 | 
					    let range;
 | 
				
			||||||
    var sel;
 | 
					    let sel;
 | 
				
			||||||
    if (window.getSelection) {
 | 
					    if (window.getSelection) {
 | 
				
			||||||
        sel = window.getSelection();
 | 
					        sel = window.getSelection();
 | 
				
			||||||
        range = document.createRange();
 | 
					        range = document.createRange();
 | 
				
			||||||
@@ -84,7 +84,7 @@ function should_list_all_streams() {
 | 
				
			|||||||
// this finds the stream that is actively open in the settings and focused in
 | 
					// this finds the stream that is actively open in the settings and focused in
 | 
				
			||||||
// the left side.
 | 
					// the left side.
 | 
				
			||||||
exports.active_stream = function () {
 | 
					exports.active_stream = function () {
 | 
				
			||||||
    var hash_components = window.location.hash.substr(1).split(/\//);
 | 
					    const hash_components = window.location.hash.substr(1).split(/\//);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // if the string casted to a number is valid, and another component
 | 
					    // if the string casted to a number is valid, and another component
 | 
				
			||||||
    // after exists then it's a stream name/id pair.
 | 
					    // after exists then it's a stream name/id pair.
 | 
				
			||||||
@@ -106,7 +106,7 @@ exports.toggle_pin_to_top_stream = function (sub) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.maybe_update_realm_default_stream_name  = function (stream_id, new_name) {
 | 
					exports.maybe_update_realm_default_stream_name  = function (stream_id, new_name) {
 | 
				
			||||||
    var idx = _.findIndex(page_params.realm_default_streams, function (stream) {
 | 
					    const idx = _.findIndex(page_params.realm_default_streams, function (stream) {
 | 
				
			||||||
        return stream.stream_id === stream_id;
 | 
					        return stream.stream_id === stream_id;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    if (idx === -1) {
 | 
					    if (idx === -1) {
 | 
				
			||||||
@@ -125,11 +125,11 @@ exports.is_subscribed_stream_tab_active = function () {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.update_stream_name = function (sub, new_name) {
 | 
					exports.update_stream_name = function (sub, new_name) {
 | 
				
			||||||
    var old_name = sub.name;
 | 
					    const old_name = sub.name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Rename the stream internally.
 | 
					    // Rename the stream internally.
 | 
				
			||||||
    stream_data.rename_sub(sub, new_name);
 | 
					    stream_data.rename_sub(sub, new_name);
 | 
				
			||||||
    var stream_id = sub.stream_id;
 | 
					    const stream_id = sub.stream_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update the left sidebar.
 | 
					    // Update the left sidebar.
 | 
				
			||||||
    stream_list.rename_stream(sub, new_name);
 | 
					    stream_list.rename_stream(sub, new_name);
 | 
				
			||||||
@@ -141,7 +141,7 @@ exports.update_stream_name = function (sub, new_name) {
 | 
				
			|||||||
    stream_edit.update_stream_name(sub, new_name);
 | 
					    stream_edit.update_stream_name(sub, new_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update the subscriptions page
 | 
					    // Update the subscriptions page
 | 
				
			||||||
    var sub_row = exports.row_for_stream_id(stream_id);
 | 
					    const sub_row = exports.row_for_stream_id(stream_id);
 | 
				
			||||||
    sub_row.find(".stream-name").text(new_name);
 | 
					    sub_row.find(".stream-name").text(new_name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update the message feed.
 | 
					    // Update the message feed.
 | 
				
			||||||
@@ -161,7 +161,7 @@ exports.update_stream_description = function (sub, description, rendered_descrip
 | 
				
			|||||||
    sub.rendered_description = rendered_description.replace('<p>', '').replace('</p>', '');
 | 
					    sub.rendered_description = rendered_description.replace('<p>', '').replace('</p>', '');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update stream row
 | 
					    // Update stream row
 | 
				
			||||||
    var sub_row = exports.row_for_stream_id(sub.stream_id);
 | 
					    const sub_row = exports.row_for_stream_id(sub.stream_id);
 | 
				
			||||||
    sub_row.find(".description").html(sub.rendered_description);
 | 
					    sub_row.find(".description").html(sub.rendered_description);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update stream settings
 | 
					    // Update stream settings
 | 
				
			||||||
@@ -190,7 +190,7 @@ exports.update_stream_announcement_only = function (sub, new_value) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.set_color = function (stream_id, color) {
 | 
					exports.set_color = function (stream_id, color) {
 | 
				
			||||||
    var sub = stream_data.get_sub_by_id(stream_id);
 | 
					    const sub = stream_data.get_sub_by_id(stream_id);
 | 
				
			||||||
    stream_edit.set_stream_property(sub, 'color', color);
 | 
					    stream_edit.set_stream_property(sub, 'color', color);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -218,8 +218,8 @@ exports.add_sub_to_table = function (sub) {
 | 
				
			|||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var html = render_subscription(sub);
 | 
					    const html = render_subscription(sub);
 | 
				
			||||||
    var settings_html = render_subscription_settings(sub);
 | 
					    const settings_html = render_subscription_settings(sub);
 | 
				
			||||||
    if (stream_create.get_name() === sub.name) {
 | 
					    if (stream_create.get_name() === sub.name) {
 | 
				
			||||||
        ui.get_content_element($(".streams-list")).prepend(html);
 | 
					        ui.get_content_element($(".streams-list")).prepend(html);
 | 
				
			||||||
        ui.reset_scrollbar($(".streams-list"));
 | 
					        ui.reset_scrollbar($(".streams-list"));
 | 
				
			||||||
@@ -243,7 +243,7 @@ exports.add_sub_to_table = function (sub) {
 | 
				
			|||||||
exports.is_sub_already_present = function (sub) {
 | 
					exports.is_sub_already_present = function (sub) {
 | 
				
			||||||
    // This checks if a stream is already listed the "Manage streams"
 | 
					    // This checks if a stream is already listed the "Manage streams"
 | 
				
			||||||
    // UI, by checking for its subscribe/unsubscribe checkmark button.
 | 
					    // UI, by checking for its subscribe/unsubscribe checkmark button.
 | 
				
			||||||
    var button = exports.check_button_for_sub(sub);
 | 
					    const button = exports.check_button_for_sub(sub);
 | 
				
			||||||
    if (button.length !== 0) {
 | 
					    if (button.length !== 0) {
 | 
				
			||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -253,9 +253,9 @@ exports.is_sub_already_present = function (sub) {
 | 
				
			|||||||
exports.remove_stream = function (stream_id) {
 | 
					exports.remove_stream = function (stream_id) {
 | 
				
			||||||
    // It is possible that row is empty when we deactivate a
 | 
					    // It is possible that row is empty when we deactivate a
 | 
				
			||||||
    // stream, but we let jQuery silently handle that.
 | 
					    // stream, but we let jQuery silently handle that.
 | 
				
			||||||
    var row = exports.row_for_stream_id(stream_id);
 | 
					    const row = exports.row_for_stream_id(stream_id);
 | 
				
			||||||
    row.remove();
 | 
					    row.remove();
 | 
				
			||||||
    var sub = stream_data.get_sub_by_id(stream_id);
 | 
					    const sub = stream_data.get_sub_by_id(stream_id);
 | 
				
			||||||
    if (stream_edit.is_sub_settings_active(sub)) {
 | 
					    if (stream_edit.is_sub_settings_active(sub)) {
 | 
				
			||||||
        exports.show_subs_pane.nothing_selected();
 | 
					        exports.show_subs_pane.nothing_selected();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -283,10 +283,10 @@ exports.update_settings_for_subscribed = function (sub) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.show_active_stream_in_left_panel = function () {
 | 
					exports.show_active_stream_in_left_panel = function () {
 | 
				
			||||||
    var selected_row = get_hash_safe().split(/\//)[1];
 | 
					    const selected_row = get_hash_safe().split(/\//)[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (parseFloat(selected_row)) {
 | 
					    if (parseFloat(selected_row)) {
 | 
				
			||||||
        var sub_row = exports.row_for_stream_id(selected_row);
 | 
					        const sub_row = exports.row_for_stream_id(selected_row);
 | 
				
			||||||
        sub_row.addClass("active");
 | 
					        sub_row.addClass("active");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -328,10 +328,10 @@ function triage_stream(query, sub) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var search_terms = search_util.get_search_terms(query.input);
 | 
					    const search_terms = search_util.get_search_terms(query.input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function match(attr) {
 | 
					    function match(attr) {
 | 
				
			||||||
        var val = sub[attr];
 | 
					        const val = sub[attr];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return search_util.vanilla_match({
 | 
					        return search_util.vanilla_match({
 | 
				
			||||||
            val: val,
 | 
					            val: val,
 | 
				
			||||||
@@ -354,15 +354,15 @@ function get_stream_id_buckets(stream_ids, query) {
 | 
				
			|||||||
    // When we simplify the settings UI, we can get
 | 
					    // When we simplify the settings UI, we can get
 | 
				
			||||||
    // rid of the "others" bucket.
 | 
					    // rid of the "others" bucket.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var buckets = {
 | 
					    const buckets = {
 | 
				
			||||||
        name: [],
 | 
					        name: [],
 | 
				
			||||||
        desc: [],
 | 
					        desc: [],
 | 
				
			||||||
        other: [],
 | 
					        other: [],
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _.each(stream_ids, function (stream_id) {
 | 
					    _.each(stream_ids, function (stream_id) {
 | 
				
			||||||
        var sub = stream_data.get_sub_by_id(stream_id);
 | 
					        const sub = stream_data.get_sub_by_id(stream_id);
 | 
				
			||||||
        var match_status = triage_stream(query, sub);
 | 
					        const match_status = triage_stream(query, sub);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (match_status === 'name_match') {
 | 
					        if (match_status === 'name_match') {
 | 
				
			||||||
            buckets.name.push(stream_id);
 | 
					            buckets.name.push(stream_id);
 | 
				
			||||||
@@ -380,11 +380,11 @@ function get_stream_id_buckets(stream_ids, query) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.populate_stream_settings_left_panel = function () {
 | 
					exports.populate_stream_settings_left_panel = function () {
 | 
				
			||||||
    var sub_rows = stream_data.get_updated_unsorted_subs();
 | 
					    const sub_rows = stream_data.get_updated_unsorted_subs();
 | 
				
			||||||
    var template_data = {
 | 
					    const template_data = {
 | 
				
			||||||
        subscriptions: sub_rows,
 | 
					        subscriptions: sub_rows,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    var html = render_subscriptions(template_data);
 | 
					    const html = render_subscriptions(template_data);
 | 
				
			||||||
    ui.get_content_element($('#subscriptions_table .streams-list')).html(html);
 | 
					    ui.get_content_element($('#subscriptions_table .streams-list')).html(html);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -393,26 +393,26 @@ exports.populate_stream_settings_left_panel = function () {
 | 
				
			|||||||
exports.filter_table = function (query) {
 | 
					exports.filter_table = function (query) {
 | 
				
			||||||
    exports.show_active_stream_in_left_panel();
 | 
					    exports.show_active_stream_in_left_panel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var widgets = {};
 | 
					    const widgets = {};
 | 
				
			||||||
    var streams_list_scrolltop = ui.get_scroll_element($(".streams-list")).scrollTop();
 | 
					    const streams_list_scrolltop = ui.get_scroll_element($(".streams-list")).scrollTop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var stream_ids = [];
 | 
					    const stream_ids = [];
 | 
				
			||||||
    _.each($("#subscriptions_table .stream-row"), function (row) {
 | 
					    _.each($("#subscriptions_table .stream-row"), function (row) {
 | 
				
			||||||
        var stream_id = $(row).attr('data-stream-id');
 | 
					        const stream_id = $(row).attr('data-stream-id');
 | 
				
			||||||
        stream_ids.push(stream_id);
 | 
					        stream_ids.push(stream_id);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var buckets = get_stream_id_buckets(stream_ids, query);
 | 
					    const buckets = get_stream_id_buckets(stream_ids, query);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If we just re-built the DOM from scratch we wouldn't need
 | 
					    // If we just re-built the DOM from scratch we wouldn't need
 | 
				
			||||||
    // all this hidden/notdisplayed logic.
 | 
					    // all this hidden/notdisplayed logic.
 | 
				
			||||||
    var hidden_ids = {};
 | 
					    const hidden_ids = {};
 | 
				
			||||||
    _.each(buckets.other, function (stream_id) {
 | 
					    _.each(buckets.other, function (stream_id) {
 | 
				
			||||||
        hidden_ids[stream_id] = true;
 | 
					        hidden_ids[stream_id] = true;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _.each($("#subscriptions_table .stream-row"), function (row) {
 | 
					    _.each($("#subscriptions_table .stream-row"), function (row) {
 | 
				
			||||||
        var stream_id = $(row).attr('data-stream-id');
 | 
					        const stream_id = $(row).attr('data-stream-id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Below code goes away if we don't do sort-DOM-in-place.
 | 
					        // Below code goes away if we don't do sort-DOM-in-place.
 | 
				
			||||||
        if (hidden_ids[stream_id]) {
 | 
					        if (hidden_ids[stream_id]) {
 | 
				
			||||||
@@ -428,7 +428,7 @@ exports.filter_table = function (query) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ui.reset_scrollbar($("#subscription_overlay .streams-list"));
 | 
					    ui.reset_scrollbar($("#subscription_overlay .streams-list"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var all_stream_ids = [].concat(
 | 
					    const all_stream_ids = [].concat(
 | 
				
			||||||
        buckets.name,
 | 
					        buckets.name,
 | 
				
			||||||
        buckets.desc,
 | 
					        buckets.desc,
 | 
				
			||||||
        buckets.other
 | 
					        buckets.other
 | 
				
			||||||
@@ -444,12 +444,12 @@ exports.filter_table = function (query) {
 | 
				
			|||||||
    ui.get_scroll_element($(".streams-list")).scrollTop(streams_list_scrolltop);
 | 
					    ui.get_scroll_element($(".streams-list")).scrollTop(streams_list_scrolltop);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var subscribed_only = true;
 | 
					let subscribed_only = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.get_search_params = function () {
 | 
					exports.get_search_params = function () {
 | 
				
			||||||
    var search_box = $("#add_new_subscription input[type='text']");
 | 
					    const search_box = $("#add_new_subscription input[type='text']");
 | 
				
			||||||
    var input = search_box.expectOne().val().trim();
 | 
					    const input = search_box.expectOne().val().trim();
 | 
				
			||||||
    var params = {
 | 
					    const params = {
 | 
				
			||||||
        input: input,
 | 
					        input: input,
 | 
				
			||||||
        subscribed_only: subscribed_only,
 | 
					        subscribed_only: subscribed_only,
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
@@ -465,11 +465,11 @@ exports.maybe_reset_right_panel = function () {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.actually_filter_streams = function () {
 | 
					exports.actually_filter_streams = function () {
 | 
				
			||||||
    var search_params = exports.get_search_params();
 | 
					    const search_params = exports.get_search_params();
 | 
				
			||||||
    exports.filter_table(search_params);
 | 
					    exports.filter_table(search_params);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var filter_streams = _.throttle(exports.actually_filter_streams, 50);
 | 
					const filter_streams = _.throttle(exports.actually_filter_streams, 50);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Make it explicit that our toggler is not created right away.
 | 
					// Make it explicit that our toggler is not created right away.
 | 
				
			||||||
exports.toggler = undefined;
 | 
					exports.toggler = undefined;
 | 
				
			||||||
@@ -518,7 +518,7 @@ exports.setup_page = function (callback) {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (should_list_all_streams()) {
 | 
					        if (should_list_all_streams()) {
 | 
				
			||||||
            var toggler_elem = exports.toggler.get();
 | 
					            const toggler_elem = exports.toggler.get();
 | 
				
			||||||
            $("#subscriptions_table .search-container").prepend(toggler_elem);
 | 
					            $("#subscriptions_table .search-container").prepend(toggler_elem);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (page_params.is_guest) {
 | 
					        if (page_params.is_guest) {
 | 
				
			||||||
@@ -533,7 +533,7 @@ exports.setup_page = function (callback) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        $('#subscriptions_table').empty();
 | 
					        $('#subscriptions_table').empty();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var template_data = {
 | 
					        const template_data = {
 | 
				
			||||||
            can_create_streams: page_params.can_create_streams,
 | 
					            can_create_streams: page_params.can_create_streams,
 | 
				
			||||||
            hide_all_streams: !should_list_all_streams(),
 | 
					            hide_all_streams: !should_list_all_streams(),
 | 
				
			||||||
            max_name_length: page_params.stream_name_max_length,
 | 
					            max_name_length: page_params.stream_name_max_length,
 | 
				
			||||||
@@ -541,7 +541,7 @@ exports.setup_page = function (callback) {
 | 
				
			|||||||
            is_admin: page_params.is_admin,
 | 
					            is_admin: page_params.is_admin,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        var rendered = render_subscription_table_body(template_data);
 | 
					        const rendered = render_subscription_table_body(template_data);
 | 
				
			||||||
        $('#subscriptions_table').append(rendered);
 | 
					        $('#subscriptions_table').append(rendered);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        exports.populate_stream_settings_left_panel();
 | 
					        exports.populate_stream_settings_left_panel();
 | 
				
			||||||
@@ -567,7 +567,7 @@ exports.setup_page = function (callback) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.switch_to_stream_row = function (stream_id) {
 | 
					exports.switch_to_stream_row = function (stream_id) {
 | 
				
			||||||
    var stream_row = exports.row_for_stream_id(stream_id);
 | 
					    const stream_row = exports.row_for_stream_id(stream_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    exports.get_active_data().row.removeClass("active");
 | 
					    exports.get_active_data().row.removeClass("active");
 | 
				
			||||||
    stream_row.addClass("active");
 | 
					    stream_row.addClass("active");
 | 
				
			||||||
@@ -605,7 +605,7 @@ exports.change_state = function (section) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // if the section is a valid number.
 | 
					    // if the section is a valid number.
 | 
				
			||||||
    if (/\d+/.test(section)) {
 | 
					    if (/\d+/.test(section)) {
 | 
				
			||||||
        var stream_id = section;
 | 
					        const stream_id = section;
 | 
				
			||||||
        // Guest users can not access unsubscribed streams
 | 
					        // Guest users can not access unsubscribed streams
 | 
				
			||||||
        // So redirect guest users to 'subscribed' tab
 | 
					        // So redirect guest users to 'subscribed' tab
 | 
				
			||||||
        // for any unsubscribed stream settings hash
 | 
					        // for any unsubscribed stream settings hash
 | 
				
			||||||
@@ -640,8 +640,8 @@ exports.close = function () {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.switch_rows = function (event) {
 | 
					exports.switch_rows = function (event) {
 | 
				
			||||||
    var active_data = exports.get_active_data();
 | 
					    const active_data = exports.get_active_data();
 | 
				
			||||||
    var switch_row;
 | 
					    let switch_row;
 | 
				
			||||||
    if (window.location.hash === '#streams/new') {
 | 
					    if (window.location.hash === '#streams/new') {
 | 
				
			||||||
        // Prevent switching stream rows when creating a new stream
 | 
					        // Prevent switching stream rows when creating a new stream
 | 
				
			||||||
        return false;
 | 
					        return false;
 | 
				
			||||||
@@ -663,9 +663,9 @@ exports.switch_rows = function (event) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var row_data = get_row_data(switch_row);
 | 
					    const row_data = get_row_data(switch_row);
 | 
				
			||||||
    if (row_data) {
 | 
					    if (row_data) {
 | 
				
			||||||
        var stream_id = row_data.id;
 | 
					        const stream_id = row_data.id;
 | 
				
			||||||
        exports.switch_to_stream_row(stream_id);
 | 
					        exports.switch_to_stream_row(stream_id);
 | 
				
			||||||
    } else if (event === 'up_arrow' && !row_data) {
 | 
					    } else if (event === 'up_arrow' && !row_data) {
 | 
				
			||||||
        $('#search_stream_name').focus();
 | 
					        $('#search_stream_name').focus();
 | 
				
			||||||
@@ -674,8 +674,8 @@ exports.switch_rows = function (event) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.keyboard_sub = function () {
 | 
					exports.keyboard_sub = function () {
 | 
				
			||||||
    var active_data = exports.get_active_data();
 | 
					    const active_data = exports.get_active_data();
 | 
				
			||||||
    var row_data = get_row_data(active_data.row);
 | 
					    const row_data = get_row_data(active_data.row);
 | 
				
			||||||
    if (row_data) {
 | 
					    if (row_data) {
 | 
				
			||||||
        exports.sub_or_unsub(row_data.object);
 | 
					        exports.sub_or_unsub(row_data.object);
 | 
				
			||||||
        if (row_data.object.subscribed && active_data.tab.text() === 'Subscribed') {
 | 
					        if (row_data.object.subscribed && active_data.tab.text() === 'Subscribed') {
 | 
				
			||||||
@@ -686,7 +686,7 @@ exports.keyboard_sub = function () {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.toggle_view = function (event) {
 | 
					exports.toggle_view = function (event) {
 | 
				
			||||||
    var active_data = exports.get_active_data();
 | 
					    const active_data = exports.get_active_data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (event === 'right_arrow' && active_data.tab.text() === 'Subscribed') {
 | 
					    if (event === 'right_arrow' && active_data.tab.text() === 'Subscribed') {
 | 
				
			||||||
        exports.toggler.goto('all-streams');
 | 
					        exports.toggler.goto('all-streams');
 | 
				
			||||||
@@ -696,17 +696,17 @@ exports.toggle_view = function (event) {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
exports.view_stream = function () {
 | 
					exports.view_stream = function () {
 | 
				
			||||||
    var active_data = exports.get_active_data();
 | 
					    const active_data = exports.get_active_data();
 | 
				
			||||||
    var row_data = get_row_data(active_data.row);
 | 
					    const row_data = get_row_data(active_data.row);
 | 
				
			||||||
    if (row_data) {
 | 
					    if (row_data) {
 | 
				
			||||||
        var stream_narrow_hash = '#narrow/stream/' + hash_util.encode_stream_name(row_data.object.name);
 | 
					        const stream_narrow_hash = '#narrow/stream/' + hash_util.encode_stream_name(row_data.object.name);
 | 
				
			||||||
        hashchange.go_to_location(stream_narrow_hash);
 | 
					        hashchange.go_to_location(stream_narrow_hash);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function ajaxSubscribe(stream, color) {
 | 
					function ajaxSubscribe(stream, color) {
 | 
				
			||||||
    // Subscribe yourself to a single stream.
 | 
					    // Subscribe yourself to a single stream.
 | 
				
			||||||
    var true_stream_name;
 | 
					    let true_stream_name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return channel.post({
 | 
					    return channel.post({
 | 
				
			||||||
        url: "/json/users/me/subscriptions",
 | 
					        url: "/json/users/me/subscriptions",
 | 
				
			||||||
@@ -716,7 +716,7 @@ function ajaxSubscribe(stream, color) {
 | 
				
			|||||||
                $("#create_stream_name").val("");
 | 
					                $("#create_stream_name").val("");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var res = JSON.parse(xhr.responseText);
 | 
					            const res = JSON.parse(xhr.responseText);
 | 
				
			||||||
            if (!$.isEmptyObject(res.already_subscribed)) {
 | 
					            if (!$.isEmptyObject(res.already_subscribed)) {
 | 
				
			||||||
                // Display the canonical stream capitalization.
 | 
					                // Display the canonical stream capitalization.
 | 
				
			||||||
                true_stream_name = res.already_subscribed[people.my_current_email()][0];
 | 
					                true_stream_name = res.already_subscribed[people.my_current_email()][0];
 | 
				
			||||||
@@ -752,7 +752,7 @@ exports.do_open_create_stream = function () {
 | 
				
			|||||||
    // Only call this directly for hash changes.
 | 
					    // Only call this directly for hash changes.
 | 
				
			||||||
    // Prefer open_create_stream().
 | 
					    // Prefer open_create_stream().
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    var stream = $.trim($("#search_stream_name").val());
 | 
					    const stream = $.trim($("#search_stream_name").val());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!should_list_all_streams()) {
 | 
					    if (!should_list_all_streams()) {
 | 
				
			||||||
        // Realms that don't allow listing streams should simply be subscribed to.
 | 
					        // Realms that don't allow listing streams should simply be subscribed to.
 | 
				
			||||||
@@ -809,11 +809,11 @@ exports.initialize = function () {
 | 
				
			|||||||
        e.preventDefault();
 | 
					        e.preventDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $('#subscription-status').hide();
 | 
					        $('#subscription-status').hide();
 | 
				
			||||||
        var stream_name = narrow_state.stream();
 | 
					        const stream_name = narrow_state.stream();
 | 
				
			||||||
        if (stream_name === undefined) {
 | 
					        if (stream_name === undefined) {
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        var sub = stream_data.get_sub(stream_name);
 | 
					        const sub = stream_data.get_sub(stream_name);
 | 
				
			||||||
        exports.sub_or_unsub(sub);
 | 
					        exports.sub_or_unsub(sub);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $('.empty_feed_notice').hide();
 | 
					        $('.empty_feed_notice').hide();
 | 
				
			||||||
@@ -831,7 +831,7 @@ exports.initialize = function () {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    (function defocus_sub_settings() {
 | 
					    (function defocus_sub_settings() {
 | 
				
			||||||
        var sel = ".search-container, .streams-list, .subscriptions-header";
 | 
					        const sel = ".search-container, .streams-list, .subscriptions-header";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $("#subscriptions_table").on("click", sel, function (e) {
 | 
					        $("#subscriptions_table").on("click", sel, function (e) {
 | 
				
			||||||
            if ($(e.target).is(sel)) {
 | 
					            if ($(e.target).is(sel)) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,7 +27,7 @@ interface ExportLoaderOptions {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] {
 | 
					function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] {
 | 
				
			||||||
    const exposeLoaders = [];
 | 
					    const exposeLoaders = [];
 | 
				
			||||||
    for (var loaderEntry of optionsArr) {
 | 
					    for (const loaderEntry of optionsArr) {
 | 
				
			||||||
        const path = loaderEntry.path;
 | 
					        const path = loaderEntry.path;
 | 
				
			||||||
        let name = "";
 | 
					        let name = "";
 | 
				
			||||||
        const useArr = [cacheLoader];
 | 
					        const useArr = [cacheLoader];
 | 
				
			||||||
@@ -38,7 +38,7 @@ function getExposeLoaders(optionsArr: ExportLoaderOptions[]): RuleSetRule[] {
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            // If name is an array
 | 
					            // If name is an array
 | 
				
			||||||
            if (Array.isArray(loaderEntry.name)) {
 | 
					            if (Array.isArray(loaderEntry.name)) {
 | 
				
			||||||
                for (var exposeName of loaderEntry.name) {
 | 
					                for (const exposeName of loaderEntry.name) {
 | 
				
			||||||
                    useArr.push({loader: 'expose-loader', options: exposeName});
 | 
					                    useArr.push({loader: 'expose-loader', options: exposeName});
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            // If name is a string
 | 
					            // If name is a string
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -216,7 +216,7 @@ export default (env?: string): webpack.Configuration[] => {
 | 
				
			|||||||
    // Expose Global variables for third party libraries to webpack modules
 | 
					    // Expose Global variables for third party libraries to webpack modules
 | 
				
			||||||
    // Use the unminified versions of jquery and underscore so that
 | 
					    // Use the unminified versions of jquery and underscore so that
 | 
				
			||||||
    // Good error messages show up in production and development in the source maps
 | 
					    // Good error messages show up in production and development in the source maps
 | 
				
			||||||
    var exposeOptions = [
 | 
					    const exposeOptions = [
 | 
				
			||||||
        { path: "blueimp-md5/js/md5.js" },
 | 
					        { path: "blueimp-md5/js/md5.js" },
 | 
				
			||||||
        { path: "clipboard/dist/clipboard.js", name: "ClipboardJS" },
 | 
					        { path: "clipboard/dist/clipboard.js", name: "ClipboardJS" },
 | 
				
			||||||
        { path: "xdate/src/xdate.js", name: "XDate" },
 | 
					        { path: "xdate/src/xdate.js", name: "XDate" },
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user