2020-08-01 03:43:15 +02:00
|
|
|
"use strict";
|
|
|
|
|
2020-11-30 23:46:45 +01:00
|
|
|
const {strict: assert} = require("assert");
|
|
|
|
|
2020-12-01 00:19:42 +01:00
|
|
|
const {stub_templates} = require("../zjsunit/handlebars");
|
2020-12-01 00:02:16 +01:00
|
|
|
const {set_global, zrequire} = require("../zjsunit/namespace");
|
2020-12-01 00:39:47 +01:00
|
|
|
const {run_test} = require("../zjsunit/test");
|
2020-12-01 00:12:33 +01:00
|
|
|
const {make_zjquery} = require("../zjsunit/zjquery");
|
2020-12-01 00:02:16 +01:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
set_global("document", "document-stub");
|
2020-12-01 00:12:33 +01:00
|
|
|
set_global("$", make_zjquery());
|
2020-07-15 01:29:15 +02:00
|
|
|
|
|
|
|
zrequire("unread_ui");
|
2021-02-10 04:53:22 +01:00
|
|
|
const Filter = zrequire("Filter", "js/filter");
|
|
|
|
const stream_sort = zrequire("stream_sort");
|
|
|
|
const stream_color = zrequire("stream_color");
|
2020-07-15 01:29:15 +02:00
|
|
|
zrequire("hash_util");
|
2021-02-10 04:53:22 +01:00
|
|
|
const unread = zrequire("unread");
|
|
|
|
const stream_data = zrequire("stream_data");
|
|
|
|
const scroll_util = zrequire("scroll_util");
|
2020-07-15 01:29:15 +02:00
|
|
|
zrequire("list_cursor");
|
2021-02-10 04:53:22 +01:00
|
|
|
const stream_list = zrequire("stream_list");
|
2020-07-15 01:29:15 +02:00
|
|
|
zrequire("ui");
|
|
|
|
set_global("page_params", {
|
2019-06-13 13:55:53 +02:00
|
|
|
is_admin: false,
|
|
|
|
realm_users: [],
|
|
|
|
});
|
2013-11-26 16:39:58 +01:00
|
|
|
|
2018-05-15 22:03:14 +02:00
|
|
|
stream_color.initialize();
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const noop = function () {};
|
2020-07-15 00:34:28 +02:00
|
|
|
const return_false = function () {
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
const return_true = function () {
|
|
|
|
return true;
|
|
|
|
};
|
2017-06-14 14:33:04 +02:00
|
|
|
|
2021-02-10 04:53:22 +01:00
|
|
|
const topic_list = set_global("topic_list", {});
|
2020-07-15 01:29:15 +02:00
|
|
|
set_global("overlays", {});
|
|
|
|
set_global("popovers", {});
|
2017-06-14 20:17:09 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
set_global("keydown_util", {
|
2018-04-24 16:59:01 +02:00
|
|
|
handle: noop,
|
|
|
|
});
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("create_sidebar_row", () => {
|
2016-10-17 20:02:32 +02:00
|
|
|
// Make a couple calls to create_sidebar_row() and make sure they
|
2014-01-16 21:38:40 +01:00
|
|
|
// generate the right markup as well as play nice with get_stream_li().
|
2019-03-17 14:48:51 +01:00
|
|
|
page_params.demote_inactive_streams = 1;
|
2019-11-02 00:06:25 +01:00
|
|
|
const devel = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "devel",
|
2016-11-11 14:20:19 +01:00
|
|
|
stream_id: 100,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2016-11-11 02:39:22 +01:00
|
|
|
subscribed: true,
|
2017-11-13 17:17:34 +01:00
|
|
|
pin_to_top: true,
|
2014-01-16 21:38:40 +01:00
|
|
|
};
|
2020-12-01 00:57:57 +01:00
|
|
|
stream_data.add_sub(devel);
|
2014-01-16 21:38:40 +01:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const social = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "social",
|
2016-11-11 14:20:19 +01:00
|
|
|
stream_id: 200,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "green",
|
2016-11-11 02:39:22 +01:00
|
|
|
subscribed: true,
|
2014-01-16 21:38:40 +01:00
|
|
|
};
|
2020-12-01 00:57:57 +01:00
|
|
|
stream_data.add_sub(social);
|
2014-01-16 21:38:40 +01:00
|
|
|
|
2020-12-01 00:57:57 +01:00
|
|
|
unread.num_unread_for_stream = function () {
|
2017-01-15 17:09:16 +01:00
|
|
|
return 42;
|
|
|
|
};
|
|
|
|
|
2017-06-02 00:33:39 +02:00
|
|
|
(function create_devel_sidebar_row() {
|
2020-07-15 01:29:15 +02:00
|
|
|
const devel_value = $.create("devel-value");
|
|
|
|
const devel_count = $.create("devel-count");
|
2017-07-08 15:16:19 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const sidebar_row = $("<devel sidebar row>");
|
2017-07-08 15:16:19 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
sidebar_row.set_find_results(".count", devel_count);
|
|
|
|
devel_count.set_find_results(".value", devel_value);
|
2017-07-08 15:16:19 +02:00
|
|
|
devel_count.set_parent(sidebar_row);
|
2017-06-02 00:33:39 +02:00
|
|
|
|
2020-12-01 00:19:42 +01:00
|
|
|
stub_templates((template_name, data) => {
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(template_name, "stream_sidebar_row");
|
|
|
|
assert.equal(data.uri, "#narrow/stream/100-devel");
|
|
|
|
return "<devel sidebar row>";
|
2019-07-11 05:06:20 +02:00
|
|
|
});
|
2017-06-02 00:33:39 +02:00
|
|
|
|
|
|
|
stream_list.create_sidebar_row(devel);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(devel_value.text(), "42");
|
2020-07-16 22:35:58 +02:00
|
|
|
})();
|
2017-06-02 00:33:39 +02:00
|
|
|
|
|
|
|
(function create_social_sidebar_row() {
|
2020-07-15 01:29:15 +02:00
|
|
|
const social_value = $.create("social-value");
|
|
|
|
const social_count = $.create("social-count");
|
|
|
|
const sidebar_row = $("<social sidebar row>");
|
2017-07-08 15:16:19 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
sidebar_row.set_find_results(".count", social_count);
|
|
|
|
social_count.set_find_results(".value", social_value);
|
2017-07-08 15:16:19 +02:00
|
|
|
social_count.set_parent(sidebar_row);
|
2017-06-02 00:33:39 +02:00
|
|
|
|
2020-12-01 00:19:42 +01:00
|
|
|
stub_templates((template_name, data) => {
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(template_name, "stream_sidebar_row");
|
|
|
|
assert.equal(data.uri, "#narrow/stream/200-social");
|
|
|
|
return "<social sidebar row>";
|
2019-07-11 05:06:20 +02:00
|
|
|
});
|
2017-06-02 00:33:39 +02:00
|
|
|
|
|
|
|
stream_list.create_sidebar_row(social);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(social_value.text(), "42");
|
2020-07-16 22:35:58 +02:00
|
|
|
})();
|
2017-06-02 00:33:39 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const split = '<hr class="stream-split">';
|
2020-07-15 01:29:15 +02:00
|
|
|
const devel_sidebar = $("<devel sidebar row>");
|
|
|
|
const social_sidebar = $("<social sidebar row>");
|
2017-06-02 00:33:39 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let appended_elems;
|
2020-07-15 01:29:15 +02:00
|
|
|
$("#stream_filters").append = function (elems) {
|
2017-06-02 00:33:39 +02:00
|
|
|
appended_elems = elems;
|
|
|
|
};
|
2014-01-16 21:38:40 +01:00
|
|
|
|
2020-04-06 19:16:01 +02:00
|
|
|
let topic_list_cleared;
|
|
|
|
topic_list.clear = () => {
|
|
|
|
topic_list_cleared = true;
|
|
|
|
};
|
|
|
|
|
2017-06-02 00:33:39 +02:00
|
|
|
stream_list.build_stream_list();
|
2016-11-11 02:39:22 +01:00
|
|
|
|
2020-04-06 19:16:01 +02:00
|
|
|
assert(topic_list_cleared);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const expected_elems = [
|
2020-07-16 23:29:01 +02:00
|
|
|
devel_sidebar, //pinned
|
|
|
|
split, //separator
|
|
|
|
social_sidebar, //not pinned
|
2017-06-02 00:33:39 +02:00
|
|
|
];
|
2014-01-17 18:23:39 +01:00
|
|
|
|
2017-06-02 00:33:39 +02:00
|
|
|
assert.deepEqual(appended_elems, expected_elems);
|
2014-01-17 18:23:39 +01:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const social_li = $("<social sidebar row>");
|
2019-11-02 00:06:25 +01:00
|
|
|
const stream_id = social.stream_id;
|
2017-06-14 16:06:21 +02:00
|
|
|
|
2019-04-18 21:11:30 +02:00
|
|
|
social_li.length = 0;
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const privacy_elem = $.create("privacy-stub");
|
|
|
|
social_li.set_find_results(".stream-privacy", privacy_elem);
|
2017-06-14 16:33:30 +02:00
|
|
|
|
|
|
|
social.invite_only = true;
|
2020-07-15 01:29:15 +02:00
|
|
|
social.color = "#222222";
|
2020-12-01 00:19:42 +01:00
|
|
|
stub_templates((template_name, data) => {
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(template_name, "stream_privacy");
|
2017-06-14 16:33:30 +02:00
|
|
|
assert.equal(data.invite_only, true);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(data.dark_background, "dark_background");
|
|
|
|
return "<div>privacy-html";
|
2019-07-11 05:06:20 +02:00
|
|
|
});
|
2017-06-14 16:33:30 +02:00
|
|
|
stream_list.redraw_stream_privacy(social);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(privacy_elem.html(), "<div>privacy-html");
|
2017-06-14 16:33:30 +02:00
|
|
|
|
2017-06-14 16:06:21 +02:00
|
|
|
stream_list.set_in_home_view(stream_id, false);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(social_li.hasClass("out_of_home_view"));
|
2017-06-14 16:06:21 +02:00
|
|
|
|
|
|
|
stream_list.set_in_home_view(stream_id, true);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!social_li.hasClass("out_of_home_view"));
|
2017-06-14 16:06:21 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const row = stream_list.stream_sidebar.get_row(stream_id);
|
2017-06-14 16:06:21 +02:00
|
|
|
stream_data.is_active = return_true;
|
|
|
|
row.update_whether_active();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!social_li.hasClass("inactive_stream"));
|
2017-06-14 16:06:21 +02:00
|
|
|
|
|
|
|
stream_data.is_active = return_false;
|
|
|
|
row.update_whether_active();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(social_li.hasClass("inactive_stream"));
|
2017-06-14 16:06:21 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let removed;
|
2017-06-14 16:06:21 +02:00
|
|
|
social_li.remove = function () {
|
|
|
|
removed = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
row.remove();
|
|
|
|
assert(removed);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("pinned_streams_never_inactive", () => {
|
2019-04-11 08:25:50 +02:00
|
|
|
// Ensure that pinned streams are never treated as dormant ie never given "inactive" class
|
|
|
|
stream_data.clear_subscriptions();
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const devel = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "devel",
|
2019-04-11 08:25:50 +02:00
|
|
|
stream_id: 100,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2019-04-11 08:25:50 +02:00
|
|
|
subscribed: true,
|
|
|
|
pin_to_top: true,
|
|
|
|
};
|
2020-12-01 00:57:57 +01:00
|
|
|
stream_data.add_sub(devel);
|
2019-04-11 08:25:50 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const social = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "social",
|
2019-04-11 08:25:50 +02:00
|
|
|
stream_id: 200,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "green",
|
2019-04-11 08:25:50 +02:00
|
|
|
subscribed: true,
|
|
|
|
};
|
2020-12-01 00:57:57 +01:00
|
|
|
stream_data.add_sub(social);
|
2019-04-11 08:25:50 +02:00
|
|
|
|
|
|
|
// we use social and devel created in create_social_sidebar_row() and create_devel_sidebar_row()
|
|
|
|
|
|
|
|
// non-pinned streams can be made inactive
|
2020-07-15 01:29:15 +02:00
|
|
|
const social_sidebar = $("<social sidebar row>");
|
2019-11-02 00:06:25 +01:00
|
|
|
let stream_id = social.stream_id;
|
|
|
|
let row = stream_list.stream_sidebar.get_row(stream_id);
|
2019-04-11 08:25:50 +02:00
|
|
|
stream_data.is_active = return_false;
|
|
|
|
|
|
|
|
stream_list.build_stream_list();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(social_sidebar.hasClass("inactive_stream"));
|
2019-04-11 08:25:50 +02:00
|
|
|
|
|
|
|
stream_data.is_active = return_true;
|
|
|
|
row.update_whether_active();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!social_sidebar.hasClass("inactive_stream"));
|
2019-04-11 08:25:50 +02:00
|
|
|
|
|
|
|
stream_data.is_active = return_false;
|
|
|
|
row.update_whether_active();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(social_sidebar.hasClass("inactive_stream"));
|
2019-04-11 08:25:50 +02:00
|
|
|
|
|
|
|
// pinned streams can never be made inactive
|
2020-07-15 01:29:15 +02:00
|
|
|
const devel_sidebar = $("<devel sidebar row>");
|
2019-04-11 08:25:50 +02:00
|
|
|
stream_id = devel.stream_id;
|
|
|
|
row = stream_list.stream_sidebar.get_row(stream_id);
|
|
|
|
stream_data.is_active = return_false;
|
|
|
|
|
|
|
|
stream_list.build_stream_list();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!devel_sidebar.hasClass("inactive_stream"));
|
2019-04-11 08:25:50 +02:00
|
|
|
|
|
|
|
row.update_whether_active();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!devel_sidebar.hasClass("inactive_stream"));
|
2019-04-11 08:25:50 +02:00
|
|
|
});
|
|
|
|
|
2020-12-01 00:12:33 +01:00
|
|
|
set_global("$", make_zjquery());
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2017-11-13 17:17:34 +01:00
|
|
|
function add_row(sub) {
|
2020-12-01 00:57:57 +01:00
|
|
|
stream_data.add_sub(sub);
|
2019-11-02 00:06:25 +01:00
|
|
|
const row = {
|
2020-07-20 22:18:43 +02:00
|
|
|
update_whether_active() {},
|
|
|
|
get_li() {
|
2020-07-15 01:29:15 +02:00
|
|
|
const html = "<" + sub.name + " sidebar row html>";
|
2019-11-02 00:06:25 +01:00
|
|
|
const obj = $(html);
|
2017-11-13 17:17:34 +01:00
|
|
|
|
2020-07-16 23:29:01 +02:00
|
|
|
obj.length = 1; // bypass blueslip error
|
2017-11-13 17:17:34 +01:00
|
|
|
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
};
|
|
|
|
stream_list.stream_sidebar.set_row(sub.stream_id, row);
|
|
|
|
}
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2017-06-14 14:33:04 +02:00
|
|
|
function initialize_stream_data() {
|
2017-04-28 15:37:52 +02:00
|
|
|
stream_data.clear_subscriptions();
|
|
|
|
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
// pinned streams
|
2019-11-02 00:06:25 +01:00
|
|
|
const develSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "devel",
|
2016-07-01 07:26:09 +02:00
|
|
|
stream_id: 1000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
pin_to_top: true,
|
2016-12-03 23:17:57 +01:00
|
|
|
subscribed: true,
|
2016-07-01 07:26:09 +02:00
|
|
|
};
|
2017-06-02 00:33:39 +02:00
|
|
|
add_row(develSub);
|
2016-07-01 07:26:09 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const RomeSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "Rome",
|
2016-07-01 07:26:09 +02:00
|
|
|
stream_id: 2000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2016-07-01 07:26:09 +02:00
|
|
|
pin_to_top: true,
|
2016-12-03 23:17:57 +01:00
|
|
|
subscribed: true,
|
2016-07-01 07:26:09 +02:00
|
|
|
};
|
2017-06-02 00:33:39 +02:00
|
|
|
add_row(RomeSub);
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const testSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "test",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
stream_id: 3000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
pin_to_top: true,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
2017-06-02 00:33:39 +02:00
|
|
|
add_row(testSub);
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
|
|
|
|
// unpinned streams
|
2019-11-02 00:06:25 +01:00
|
|
|
const announceSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "announce",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
stream_id: 4000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "green",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
pin_to_top: false,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
2017-06-02 00:33:39 +02:00
|
|
|
add_row(announceSub);
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const DenmarkSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "Denmark",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
stream_id: 5000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "green",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
pin_to_top: false,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
2017-06-02 00:33:39 +02:00
|
|
|
add_row(DenmarkSub);
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const carSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "cars",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
stream_id: 6000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "green",
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
pin_to_top: false,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
2017-06-02 00:33:39 +02:00
|
|
|
add_row(carSub);
|
2017-06-14 14:33:04 +02:00
|
|
|
}
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
|
2018-04-25 13:03:39 +02:00
|
|
|
function elem($obj) {
|
|
|
|
return {to_$: () => $obj};
|
|
|
|
}
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("zoom_in_and_zoom_out", () => {
|
|
|
|
const label1 = $.create("label1 stub");
|
|
|
|
const label2 = $.create("label2 stub");
|
2018-04-25 13:03:39 +02:00
|
|
|
|
|
|
|
label1.show();
|
|
|
|
label2.show();
|
|
|
|
|
|
|
|
assert(label1.visible());
|
|
|
|
assert(label2.visible());
|
|
|
|
|
2021-02-08 15:48:50 +01:00
|
|
|
$.create(".stream-filters-label", {
|
|
|
|
children: [elem(label1), elem(label2)],
|
|
|
|
});
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const splitter = $.create("hr stub");
|
2018-04-25 13:03:39 +02:00
|
|
|
|
|
|
|
splitter.show();
|
|
|
|
assert(splitter.visible());
|
|
|
|
|
2021-02-08 15:48:50 +01:00
|
|
|
$.create(".stream-split", {
|
|
|
|
children: [elem(splitter)],
|
|
|
|
});
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const stream_li1 = $.create("stream1 stub");
|
|
|
|
const stream_li2 = $.create("stream2 stub");
|
2018-04-25 13:03:39 +02:00
|
|
|
|
|
|
|
function make_attr(arg) {
|
|
|
|
return (sel) => {
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(sel, "data-stream-id");
|
2018-04-25 13:03:39 +02:00
|
|
|
return arg;
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
stream_li1.attr = make_attr("42");
|
2018-04-25 13:03:39 +02:00
|
|
|
stream_li1.hide();
|
2020-07-15 01:29:15 +02:00
|
|
|
stream_li2.attr = make_attr("99");
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2021-02-08 15:48:50 +01:00
|
|
|
$.create("#stream_filters li.narrow-filter", {
|
|
|
|
children: [elem(stream_li1), elem(stream_li2)],
|
|
|
|
});
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
$("#stream-filters-container")[0] = {
|
2019-07-26 00:22:43 +02:00
|
|
|
dataset: {},
|
|
|
|
};
|
2019-03-22 17:26:51 +01:00
|
|
|
stream_list.set_event_handlers();
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2018-09-10 14:52:58 +02:00
|
|
|
stream_list.zoom_in_topics({stream_id: 42});
|
2018-04-25 13:03:39 +02:00
|
|
|
|
|
|
|
assert(!label1.visible());
|
|
|
|
assert(!label2.visible());
|
|
|
|
assert(!splitter.visible());
|
|
|
|
assert(stream_li1.visible());
|
|
|
|
assert(!stream_li2.visible());
|
2020-07-15 01:29:15 +02:00
|
|
|
assert($("#streams_list").hasClass("zoom-in"));
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
$("#stream_filters li.narrow-filter").show = () => {
|
2018-04-25 13:03:39 +02:00
|
|
|
stream_li1.show();
|
|
|
|
stream_li2.show();
|
|
|
|
};
|
|
|
|
|
|
|
|
stream_li1.length = 1;
|
2018-09-10 14:52:58 +02:00
|
|
|
stream_list.zoom_out_topics({stream_li: stream_li1});
|
2018-04-25 13:03:39 +02:00
|
|
|
|
|
|
|
assert(label1.visible());
|
|
|
|
assert(label2.visible());
|
|
|
|
assert(splitter.visible());
|
|
|
|
assert(stream_li1.visible());
|
|
|
|
assert(stream_li2.visible());
|
2020-07-15 01:29:15 +02:00
|
|
|
assert($("#streams_list").hasClass("zoom-out"));
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2020-12-01 00:12:33 +01:00
|
|
|
set_global("$", make_zjquery());
|
2018-04-25 13:03:39 +02:00
|
|
|
|
2021-02-10 04:53:22 +01:00
|
|
|
let narrow_state;
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("narrowing", () => {
|
2017-06-14 20:17:09 +02:00
|
|
|
initialize_stream_data();
|
|
|
|
|
2021-02-10 04:53:22 +01:00
|
|
|
narrow_state = set_global("narrow_state", {
|
2020-07-20 22:18:43 +02:00
|
|
|
stream() {
|
2020-07-15 00:34:28 +02:00
|
|
|
return "devel";
|
|
|
|
},
|
2017-06-14 20:17:09 +02:00
|
|
|
topic: noop,
|
|
|
|
});
|
|
|
|
|
2017-08-11 00:30:23 +02:00
|
|
|
topic_list.close = noop;
|
2017-06-14 20:17:09 +02:00
|
|
|
topic_list.rebuild = noop;
|
2017-08-11 00:30:23 +02:00
|
|
|
topic_list.active_stream_id = noop;
|
2018-09-10 23:45:31 +02:00
|
|
|
topic_list.get_stream_li = noop;
|
2018-04-24 14:09:16 +02:00
|
|
|
scroll_util.scroll_element_into_container = noop;
|
2017-06-14 20:17:09 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
set_global("ui", {
|
2020-07-02 01:39:34 +02:00
|
|
|
get_scroll_element: (element) => element,
|
2017-07-01 22:30:50 +02:00
|
|
|
});
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!$("<devel sidebar row html>").hasClass("active-filter"));
|
2017-06-14 20:17:09 +02:00
|
|
|
|
2019-03-22 17:26:51 +01:00
|
|
|
stream_list.set_event_handlers();
|
2017-06-14 20:17:09 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let filter;
|
2017-06-14 20:17:09 +02:00
|
|
|
|
2020-07-15 00:34:28 +02:00
|
|
|
filter = new Filter([{operator: "stream", operand: "devel"}]);
|
2017-08-12 16:49:10 +02:00
|
|
|
stream_list.handle_narrow_activated(filter);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert($("<devel sidebar row html>").hasClass("active-filter"));
|
2017-06-14 20:17:09 +02:00
|
|
|
|
|
|
|
filter = new Filter([
|
2020-07-15 01:29:15 +02:00
|
|
|
{operator: "stream", operand: "cars"},
|
|
|
|
{operator: "topic", operand: "sedans"},
|
2017-06-14 20:17:09 +02:00
|
|
|
]);
|
2017-08-12 16:49:10 +02:00
|
|
|
stream_list.handle_narrow_activated(filter);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!$("ul.filters li").hasClass("active-filter"));
|
|
|
|
assert(!$("<cars sidebar row html>").hasClass("active-filter")); // false because of topic
|
2017-06-14 20:17:09 +02:00
|
|
|
|
2020-07-15 00:34:28 +02:00
|
|
|
filter = new Filter([{operator: "stream", operand: "cars"}]);
|
2017-08-12 16:49:10 +02:00
|
|
|
stream_list.handle_narrow_activated(filter);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert(!$("ul.filters li").hasClass("active-filter"));
|
|
|
|
assert($("<cars sidebar row html>").hasClass("active-filter"));
|
2018-04-25 18:30:07 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let removed_classes;
|
2018-04-25 18:30:07 +02:00
|
|
|
$("ul#stream_filters li").removeClass = (classes) => {
|
|
|
|
removed_classes = classes;
|
|
|
|
};
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let topics_closed;
|
2018-04-25 18:30:07 +02:00
|
|
|
topic_list.close = () => {
|
|
|
|
topics_closed = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
stream_list.handle_narrow_deactivated();
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(removed_classes, "active-filter");
|
2018-04-25 18:30:07 +02:00
|
|
|
assert(topics_closed);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-06-14 20:17:09 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("focusout_user_filter", () => {
|
2020-07-15 00:34:28 +02:00
|
|
|
const e = {};
|
2020-07-15 01:29:15 +02:00
|
|
|
const click_handler = $(".stream-list-filter").get_on_handler("focusout");
|
2018-02-12 22:56:37 +01:00
|
|
|
click_handler(e);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2018-02-12 22:56:37 +01:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("focus_user_filter", () => {
|
2019-11-02 00:06:25 +01:00
|
|
|
const e = {
|
2020-07-20 22:18:43 +02:00
|
|
|
stopPropagation() {},
|
2018-02-12 22:56:37 +01:00
|
|
|
};
|
2020-07-15 01:29:15 +02:00
|
|
|
const click_handler = $(".stream-list-filter").get_on_handler("click");
|
2018-02-12 22:56:37 +01:00
|
|
|
click_handler(e);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2018-02-12 22:56:37 +01:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("sort_streams", () => {
|
2017-06-14 14:33:04 +02:00
|
|
|
stream_data.clear_subscriptions();
|
|
|
|
|
|
|
|
// Get coverage on early-exit.
|
|
|
|
stream_list.build_stream_list();
|
|
|
|
|
|
|
|
initialize_stream_data();
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
|
2020-12-01 00:57:57 +01:00
|
|
|
stream_data.is_active = function (sub) {
|
2020-07-15 01:29:15 +02:00
|
|
|
return sub.name !== "cars";
|
2017-04-18 19:59:35 +02:00
|
|
|
};
|
left-sidebar: Sort pinned streams by lowercase stream name.
The pinned streams were sorted in alphabetic order (i.e. Verona appears
before devel). The reason is that after we plucked pinned streams out from
stream_data.subscribed_streams(), we didn't sort them again, so they
remained in the alphabetic order used in stream_data.
However, we did sort unpinned streams explicitly by using custom compare
function in stream_list.js (by default sort by lowercase stream name,
but when there are more than 40 subscribed streams, sort active streams
first). That's why this issue only relates to pinned streams.
Changes were made to sort pinned streams by lowercase stream name, always,
whether they are active or not (different from unpinned streams).
Tests were added to ensure this overall sort order is correct, i.e.
1. pinned streams are always sorted by lowercase stream name.
2. pinned streams are always before unpinned streams.
3. unpinned streams are sorted by lowercase stream name, if there are more
than 40 subscribed streams, sort active streams at the top, among active
and inactive streams, still sorted by lowercase stream name.
Fixes #3701
2017-02-19 15:24:27 +01:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let appended_elems;
|
2020-07-15 01:29:15 +02:00
|
|
|
$("#stream_filters").append = function (elems) {
|
2017-06-02 00:33:39 +02:00
|
|
|
appended_elems = elems;
|
|
|
|
};
|
|
|
|
|
2017-04-28 15:37:52 +02:00
|
|
|
stream_list.build_stream_list();
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const split = '<hr class="stream-split">';
|
|
|
|
const expected_elems = [
|
2020-07-15 01:29:15 +02:00
|
|
|
$("<devel sidebar row html>"),
|
|
|
|
$("<Rome sidebar row html>"),
|
|
|
|
$("<test sidebar row html>"),
|
2017-07-18 13:30:14 +02:00
|
|
|
split,
|
2020-07-15 01:29:15 +02:00
|
|
|
$("<announce sidebar row html>"),
|
|
|
|
$("<Denmark sidebar row html>"),
|
2017-07-18 13:30:14 +02:00
|
|
|
split,
|
2020-07-15 01:29:15 +02:00
|
|
|
$("<cars sidebar row html>"),
|
2017-06-02 00:33:39 +02:00
|
|
|
];
|
2017-07-18 13:30:14 +02:00
|
|
|
|
2017-06-02 00:33:39 +02:00
|
|
|
assert.deepEqual(appended_elems, expected_elems);
|
|
|
|
|
2020-12-01 00:57:57 +01:00
|
|
|
const streams = stream_sort.get_streams();
|
2017-04-18 17:08:59 +02:00
|
|
|
|
|
|
|
assert.deepEqual(streams, [
|
2017-04-18 19:59:35 +02:00
|
|
|
// three groups: pinned, normal, dormant
|
2020-07-15 01:29:15 +02:00
|
|
|
"devel",
|
|
|
|
"Rome",
|
|
|
|
"test",
|
2017-04-18 19:59:35 +02:00
|
|
|
//
|
2020-07-15 01:29:15 +02:00
|
|
|
"announce",
|
|
|
|
"Denmark",
|
2017-04-18 19:59:35 +02:00
|
|
|
//
|
2020-07-15 01:29:15 +02:00
|
|
|
"cars",
|
2017-04-18 17:08:59 +02:00
|
|
|
]);
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const denmark_sub = stream_data.get_sub("Denmark");
|
2019-11-02 00:06:25 +01:00
|
|
|
const stream_id = denmark_sub.stream_id;
|
2017-06-14 14:33:04 +02:00
|
|
|
assert(stream_list.stream_sidebar.has_row_for(stream_id));
|
|
|
|
stream_list.remove_sidebar_row(stream_id);
|
|
|
|
assert(!stream_list.stream_sidebar.has_row_for(stream_id));
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-06-14 00:27:06 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("separators_only_pinned_and_dormant", () => {
|
2017-11-13 17:17:34 +01:00
|
|
|
// Test only pinned and dormant streams
|
|
|
|
|
|
|
|
stream_data.clear_subscriptions();
|
|
|
|
|
|
|
|
// Get coverage on early-exit.
|
|
|
|
stream_list.build_stream_list();
|
|
|
|
|
|
|
|
// pinned streams
|
2019-11-02 00:06:25 +01:00
|
|
|
const develSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "devel",
|
2017-11-13 17:17:34 +01:00
|
|
|
stream_id: 1000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2017-11-13 17:17:34 +01:00
|
|
|
pin_to_top: true,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
|
|
|
add_row(develSub);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const RomeSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "Rome",
|
2017-11-13 17:17:34 +01:00
|
|
|
stream_id: 2000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2017-11-13 17:17:34 +01:00
|
|
|
pin_to_top: true,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
|
|
|
add_row(RomeSub);
|
2020-03-28 01:25:56 +01:00
|
|
|
// dormant stream
|
2019-11-02 00:06:25 +01:00
|
|
|
const DenmarkSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "Denmark",
|
2017-11-13 17:17:34 +01:00
|
|
|
stream_id: 3000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2017-11-13 17:17:34 +01:00
|
|
|
pin_to_top: false,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
|
|
|
add_row(DenmarkSub);
|
|
|
|
|
2020-12-01 00:57:57 +01:00
|
|
|
stream_data.is_active = function (sub) {
|
2020-07-15 01:29:15 +02:00
|
|
|
return sub.name !== "Denmark";
|
2017-11-13 17:17:34 +01:00
|
|
|
};
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let appended_elems;
|
2020-07-15 01:29:15 +02:00
|
|
|
$("#stream_filters").append = function (elems) {
|
2017-11-13 17:17:34 +01:00
|
|
|
appended_elems = elems;
|
|
|
|
};
|
|
|
|
|
|
|
|
stream_list.build_stream_list();
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const split = '<hr class="stream-split">';
|
|
|
|
const expected_elems = [
|
2017-11-13 17:17:34 +01:00
|
|
|
// pinned
|
2020-07-15 01:29:15 +02:00
|
|
|
$("<devel sidebar row html>"),
|
|
|
|
$("<Rome sidebar row html>"),
|
2017-11-13 17:17:34 +01:00
|
|
|
split,
|
|
|
|
// dormant
|
2020-07-15 01:29:15 +02:00
|
|
|
$("<Denmark sidebar row html>"),
|
2017-11-13 17:17:34 +01:00
|
|
|
];
|
|
|
|
|
|
|
|
assert.deepEqual(appended_elems, expected_elems);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-11-13 17:17:34 +01:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("separators_only_pinned", () => {
|
2017-11-13 17:17:34 +01:00
|
|
|
// Test only pinned streams
|
|
|
|
|
|
|
|
stream_data.clear_subscriptions();
|
|
|
|
|
|
|
|
// Get coverage on early-exit.
|
|
|
|
stream_list.build_stream_list();
|
|
|
|
|
|
|
|
// pinned streams
|
2019-11-02 00:06:25 +01:00
|
|
|
const develSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "devel",
|
2017-11-13 17:17:34 +01:00
|
|
|
stream_id: 1000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2017-11-13 17:17:34 +01:00
|
|
|
pin_to_top: true,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
|
|
|
add_row(develSub);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const RomeSub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "Rome",
|
2017-11-13 17:17:34 +01:00
|
|
|
stream_id: 2000,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2017-11-13 17:17:34 +01:00
|
|
|
pin_to_top: true,
|
|
|
|
subscribed: true,
|
|
|
|
};
|
|
|
|
add_row(RomeSub);
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let appended_elems;
|
2020-07-15 01:29:15 +02:00
|
|
|
$("#stream_filters").append = function (elems) {
|
2017-11-13 17:17:34 +01:00
|
|
|
appended_elems = elems;
|
|
|
|
};
|
|
|
|
|
|
|
|
stream_list.build_stream_list();
|
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const expected_elems = [
|
2017-11-13 17:17:34 +01:00
|
|
|
// pinned
|
2020-07-15 01:29:15 +02:00
|
|
|
$("<devel sidebar row html>"),
|
|
|
|
$("<Rome sidebar row html>"),
|
2017-11-13 17:17:34 +01:00
|
|
|
// no separator at the end as no stream follows
|
|
|
|
];
|
|
|
|
|
|
|
|
assert.deepEqual(appended_elems, expected_elems);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2019-04-11 08:25:50 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("update_count_in_dom", () => {
|
2017-07-08 15:16:19 +02:00
|
|
|
function make_elem(elem, count_selector, value_selector) {
|
2019-11-02 00:06:25 +01:00
|
|
|
const count = $(count_selector);
|
|
|
|
const value = $(value_selector);
|
2020-07-15 01:29:15 +02:00
|
|
|
elem.set_find_results(".count", count);
|
|
|
|
count.set_find_results(".value", value);
|
2017-07-08 14:05:49 +02:00
|
|
|
count.set_parent(elem);
|
2017-06-14 18:21:50 +02:00
|
|
|
|
|
|
|
return elem;
|
|
|
|
}
|
|
|
|
|
2020-07-15 00:34:28 +02:00
|
|
|
const stream_li = make_elem($("<stream li>"), "<stream-count>", "<stream-value>");
|
2017-06-14 18:21:50 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
$("<stream li>").length = 0;
|
|
|
|
stream_li.addClass("subscription_block");
|
|
|
|
stream_li.addClass("stream-with-count");
|
|
|
|
assert(stream_li.hasClass("stream-with-count"));
|
2017-06-14 18:21:50 +02:00
|
|
|
|
2020-02-03 09:42:50 +01:00
|
|
|
const stream_count = new Map();
|
2019-11-02 00:06:25 +01:00
|
|
|
const stream_id = 11;
|
2017-06-14 18:21:50 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
const stream_row = {
|
2020-07-20 22:18:43 +02:00
|
|
|
get_li() {
|
2020-07-15 00:34:28 +02:00
|
|
|
return stream_li;
|
|
|
|
},
|
2017-06-14 18:21:50 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
stream_list.stream_sidebar.set_row(stream_id, stream_row);
|
|
|
|
|
|
|
|
stream_count.set(stream_id, 0);
|
2019-11-02 00:06:25 +01:00
|
|
|
const counts = {
|
2020-07-20 22:18:43 +02:00
|
|
|
stream_count,
|
2020-02-03 09:42:50 +01:00
|
|
|
topic_count: new Map(),
|
2017-06-14 18:21:50 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
stream_list.update_dom_with_unread_counts(counts);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal($("<stream li>").text(), "never-been-set");
|
|
|
|
assert(!stream_li.hasClass("stream-with-count"));
|
2017-06-14 18:21:50 +02:00
|
|
|
|
|
|
|
stream_count.set(stream_id, 99);
|
|
|
|
|
|
|
|
stream_list.update_dom_with_unread_counts(counts);
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal($("<stream-value>").text(), "99");
|
|
|
|
assert(stream_li.hasClass("stream-with-count"));
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2017-06-14 14:33:04 +02:00
|
|
|
|
2018-04-25 17:40:49 +02:00
|
|
|
narrow_state.active = () => false;
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("rename_stream", () => {
|
|
|
|
const sub = stream_data.get_sub_by_name("devel");
|
|
|
|
const new_name = "Development";
|
2018-12-14 19:18:24 +01:00
|
|
|
|
|
|
|
stream_data.rename_sub(sub, new_name);
|
2018-04-25 17:40:49 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const li_stub = $.create("li stub");
|
2019-04-18 21:11:30 +02:00
|
|
|
li_stub.length = 0;
|
|
|
|
|
2020-12-01 00:19:42 +01:00
|
|
|
stub_templates((name, payload) => {
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(name, "stream_sidebar_row");
|
2018-04-25 17:40:49 +02:00
|
|
|
assert.deepEqual(payload, {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "Development",
|
2018-04-25 17:40:49 +02:00
|
|
|
id: 1000,
|
2020-07-15 01:29:15 +02:00
|
|
|
uri: "#narrow/stream/1000-Development",
|
2019-05-15 08:54:25 +02:00
|
|
|
is_muted: false,
|
2018-04-25 17:40:49 +02:00
|
|
|
invite_only: undefined,
|
2019-04-07 20:29:25 +02:00
|
|
|
is_web_public: undefined,
|
2018-04-25 17:40:49 +02:00
|
|
|
color: payload.color,
|
|
|
|
pin_to_top: true,
|
|
|
|
dark_background: payload.dark_background,
|
|
|
|
});
|
|
|
|
return {to_$: () => li_stub};
|
2019-07-11 05:06:20 +02:00
|
|
|
});
|
2018-04-25 17:40:49 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let count_updated;
|
2018-04-25 17:40:49 +02:00
|
|
|
stream_list.update_count_in_dom = (li) => {
|
|
|
|
assert.equal(li, li_stub);
|
|
|
|
count_updated = true;
|
|
|
|
};
|
|
|
|
|
2018-12-14 19:18:24 +01:00
|
|
|
stream_list.rename_stream(sub);
|
2018-04-25 17:40:49 +02:00
|
|
|
assert(count_updated);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2018-04-25 17:40:49 +02:00
|
|
|
|
2020-12-01 00:12:33 +01:00
|
|
|
set_global("$", make_zjquery());
|
2018-04-25 18:12:16 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("refresh_pin", () => {
|
2018-04-25 18:12:16 +02:00
|
|
|
initialize_stream_data();
|
|
|
|
|
|
|
|
const sub = {
|
2020-07-15 01:29:15 +02:00
|
|
|
name: "maybe_pin",
|
2018-04-25 18:12:16 +02:00
|
|
|
stream_id: 100,
|
2020-07-15 01:29:15 +02:00
|
|
|
color: "blue",
|
2018-04-25 18:12:16 +02:00
|
|
|
pin_to_top: false,
|
|
|
|
};
|
|
|
|
|
2020-02-09 22:02:55 +01:00
|
|
|
stream_data.add_sub(sub);
|
2018-04-25 18:12:16 +02:00
|
|
|
|
2020-02-09 04:15:38 +01:00
|
|
|
const pinned_sub = {
|
|
|
|
...sub,
|
2018-04-25 18:12:16 +02:00
|
|
|
pin_to_top: true,
|
2020-02-09 04:15:38 +01:00
|
|
|
};
|
2018-04-25 18:12:16 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
const li_stub = $.create("li stub");
|
2019-04-18 21:11:30 +02:00
|
|
|
li_stub.length = 0;
|
|
|
|
|
2020-12-01 00:19:42 +01:00
|
|
|
stub_templates(() => ({to_$: () => li_stub}));
|
2018-04-25 18:12:16 +02:00
|
|
|
|
|
|
|
stream_list.update_count_in_dom = noop;
|
2020-07-15 01:29:15 +02:00
|
|
|
$("#stream_filters").append = noop;
|
2018-04-25 18:12:16 +02:00
|
|
|
|
2019-11-02 00:06:25 +01:00
|
|
|
let scrolled;
|
2018-04-25 18:12:16 +02:00
|
|
|
stream_list.scroll_stream_into_view = (li) => {
|
|
|
|
assert.equal(li, li_stub);
|
|
|
|
scrolled = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
stream_list.refresh_pinned_or_unpinned_stream(pinned_sub);
|
|
|
|
assert(scrolled);
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|
2018-04-25 18:12:16 +02:00
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
run_test("create_initial_sidebar_rows", () => {
|
2017-06-14 14:33:04 +02:00
|
|
|
initialize_stream_data();
|
|
|
|
|
2020-02-03 09:42:50 +01:00
|
|
|
const html_dict = new Map();
|
2017-06-14 14:33:04 +02:00
|
|
|
|
|
|
|
stream_list.stream_sidebar = {
|
|
|
|
has_row_for: return_false,
|
2020-07-20 22:18:43 +02:00
|
|
|
set_row(stream_id, widget) {
|
2017-06-14 14:33:04 +02:00
|
|
|
html_dict.set(stream_id, widget.get_li().html());
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
stream_list.update_count_in_dom = noop;
|
|
|
|
|
2020-12-01 00:19:42 +01:00
|
|
|
stub_templates((template_name, data) => {
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(template_name, "stream_sidebar_row");
|
|
|
|
return "<div>stub-html-" + data.name;
|
2019-07-11 05:06:20 +02:00
|
|
|
});
|
2017-06-14 14:33:04 +02:00
|
|
|
|
|
|
|
// Test this code with stubs above...
|
|
|
|
stream_list.create_initial_sidebar_rows();
|
|
|
|
|
2020-07-15 01:29:15 +02:00
|
|
|
assert.equal(html_dict.get(1000), "<div>stub-html-devel");
|
|
|
|
assert.equal(html_dict.get(5000), "<div>stub-html-Denmark");
|
2018-05-15 12:40:07 +02:00
|
|
|
});
|