mirror of https://github.com/zulip/zulip.git
js: Break cyclic dependency between modules related to `stream_data`.
Moved `stream_data.is_active` to `stream_sort.has_recent_activity` to remove the cyclic dependency between `stream_data` and `stream_topic_history`.
This commit is contained in:
parent
40cea58f87
commit
2996e8e722
|
@ -63,6 +63,7 @@ import * as stream_data from "./stream_data";
|
||||||
import * as stream_events from "./stream_events";
|
import * as stream_events from "./stream_events";
|
||||||
import * as stream_list from "./stream_list";
|
import * as stream_list from "./stream_list";
|
||||||
import * as stream_settings_ui from "./stream_settings_ui";
|
import * as stream_settings_ui from "./stream_settings_ui";
|
||||||
|
import * as stream_sort from "./stream_sort";
|
||||||
import * as stream_topic_history from "./stream_topic_history";
|
import * as stream_topic_history from "./stream_topic_history";
|
||||||
import * as stream_ui_updates from "./stream_ui_updates";
|
import * as stream_ui_updates from "./stream_ui_updates";
|
||||||
import * as sub_store from "./sub_store";
|
import * as sub_store from "./sub_store";
|
||||||
|
@ -668,7 +669,7 @@ export function dispatch_normal_event(event) {
|
||||||
}
|
}
|
||||||
if (event.property === "demote_inactive_streams") {
|
if (event.property === "demote_inactive_streams") {
|
||||||
stream_list.update_streams_sidebar();
|
stream_list.update_streams_sidebar();
|
||||||
stream_data.set_filter_out_inactives();
|
stream_sort.set_filter_out_inactives();
|
||||||
}
|
}
|
||||||
if (event.property === "user_list_style") {
|
if (event.property === "user_list_style") {
|
||||||
settings_display.report_user_list_style_change(
|
settings_display.report_user_list_style_change(
|
||||||
|
|
|
@ -6,7 +6,6 @@ import {page_params} from "./page_params";
|
||||||
import * as peer_data from "./peer_data";
|
import * as peer_data from "./peer_data";
|
||||||
import * as people from "./people";
|
import * as people from "./people";
|
||||||
import * as settings_config from "./settings_config";
|
import * as settings_config from "./settings_config";
|
||||||
import * as stream_topic_history from "./stream_topic_history";
|
|
||||||
import * as sub_store from "./sub_store";
|
import * as sub_store from "./sub_store";
|
||||||
import * as user_groups from "./user_groups";
|
import * as user_groups from "./user_groups";
|
||||||
import {user_settings} from "./user_settings";
|
import {user_settings} from "./user_settings";
|
||||||
|
@ -98,7 +97,6 @@ class BinaryDict {
|
||||||
// The stream_info variable maps stream names to stream properties objects
|
// The stream_info variable maps stream names to stream properties objects
|
||||||
// Call clear_subscriptions() to initialize it.
|
// Call clear_subscriptions() to initialize it.
|
||||||
let stream_info;
|
let stream_info;
|
||||||
let filter_out_inactives = false;
|
|
||||||
|
|
||||||
const stream_ids_by_name = new FoldDict();
|
const stream_ids_by_name = new FoldDict();
|
||||||
const default_stream_ids = new Set();
|
const default_stream_ids = new Set();
|
||||||
|
@ -170,45 +168,6 @@ export function clear_subscriptions() {
|
||||||
|
|
||||||
clear_subscriptions();
|
clear_subscriptions();
|
||||||
|
|
||||||
export function set_filter_out_inactives() {
|
|
||||||
if (
|
|
||||||
user_settings.demote_inactive_streams ===
|
|
||||||
settings_config.demote_inactive_streams_values.automatic.code
|
|
||||||
) {
|
|
||||||
filter_out_inactives = num_subscribed_subs() >= 30;
|
|
||||||
} else if (
|
|
||||||
user_settings.demote_inactive_streams ===
|
|
||||||
settings_config.demote_inactive_streams_values.always.code
|
|
||||||
) {
|
|
||||||
filter_out_inactives = true;
|
|
||||||
} else {
|
|
||||||
filter_out_inactives = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// for testing:
|
|
||||||
export function is_filtering_inactives() {
|
|
||||||
return filter_out_inactives;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function is_active(sub) {
|
|
||||||
if (!filter_out_inactives || sub.pin_to_top) {
|
|
||||||
// If users don't want to filter inactive streams
|
|
||||||
// to the bottom, we respect that setting and don't
|
|
||||||
// treat any streams as dormant.
|
|
||||||
//
|
|
||||||
// Currently this setting is automatically determined
|
|
||||||
// by the number of streams. See the callers
|
|
||||||
// to set_filter_out_inactives.
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return stream_topic_history.stream_has_topics(sub.stream_id) || sub.newly_subscribed;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function is_muted_active(sub) {
|
|
||||||
return sub.is_muted && is_active(sub);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function rename_sub(sub, new_name) {
|
export function rename_sub(sub, new_name) {
|
||||||
const old_name = sub.name;
|
const old_name = sub.name;
|
||||||
|
|
||||||
|
@ -889,8 +848,6 @@ export function initialize(params) {
|
||||||
populate_subscriptions(subscriptions, true, true);
|
populate_subscriptions(subscriptions, true, true);
|
||||||
populate_subscriptions(unsubscribed, false, true);
|
populate_subscriptions(unsubscribed, false, true);
|
||||||
populate_subscriptions(never_subscribed, false, false);
|
populate_subscriptions(never_subscribed, false, false);
|
||||||
|
|
||||||
set_filter_out_inactives();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function remove_default_stream(stream_id) {
|
export function remove_default_stream(stream_id) {
|
||||||
|
|
|
@ -374,7 +374,7 @@ class StreamSidebarRow {
|
||||||
}
|
}
|
||||||
|
|
||||||
update_whether_active() {
|
update_whether_active() {
|
||||||
if (stream_data.is_active(this.sub) || this.sub.pin_to_top === true) {
|
if (stream_sort.has_recent_activity(this.sub) || this.sub.pin_to_top === true) {
|
||||||
this.$list_item.removeClass("inactive_stream");
|
this.$list_item.removeClass("inactive_stream");
|
||||||
} else {
|
} else {
|
||||||
this.$list_item.addClass("inactive_stream");
|
this.$list_item.addClass("inactive_stream");
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
import * as settings_config from "./settings_config";
|
||||||
import * as stream_data from "./stream_data";
|
import * as stream_data from "./stream_data";
|
||||||
|
import * as stream_topic_history from "./stream_topic_history";
|
||||||
import * as sub_store from "./sub_store";
|
import * as sub_store from "./sub_store";
|
||||||
|
import {user_settings} from "./user_settings";
|
||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
|
|
||||||
let previous_pinned;
|
let previous_pinned;
|
||||||
|
@ -9,6 +12,13 @@ let previous_muted_active;
|
||||||
let previous_muted_pinned;
|
let previous_muted_pinned;
|
||||||
let all_streams = [];
|
let all_streams = [];
|
||||||
|
|
||||||
|
// Because we need to check whether we are filtering inactive streams
|
||||||
|
// in a loop over all streams to render the left sidebar, and the
|
||||||
|
// definition of demote_inactive_streams involves how many streams
|
||||||
|
// there are, we maintain this variable as a cache of the calculation
|
||||||
|
// to avoid making left sidebar rendering a quadratic operation.
|
||||||
|
let filter_out_inactives = false;
|
||||||
|
|
||||||
export function get_streams() {
|
export function get_streams() {
|
||||||
const sorted_streams = all_streams.map((stream_id) =>
|
const sorted_streams = all_streams.map((stream_id) =>
|
||||||
stream_data.maybe_get_stream_name(stream_id),
|
stream_data.maybe_get_stream_name(stream_id),
|
||||||
|
@ -26,6 +36,45 @@ function compare_function(a, b) {
|
||||||
return util.strcmp(stream_name_a, stream_name_b);
|
return util.strcmp(stream_name_a, stream_name_b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function set_filter_out_inactives() {
|
||||||
|
if (
|
||||||
|
user_settings.demote_inactive_streams ===
|
||||||
|
settings_config.demote_inactive_streams_values.automatic.code
|
||||||
|
) {
|
||||||
|
filter_out_inactives = stream_data.num_subscribed_subs() >= 30;
|
||||||
|
} else if (
|
||||||
|
user_settings.demote_inactive_streams ===
|
||||||
|
settings_config.demote_inactive_streams_values.always.code
|
||||||
|
) {
|
||||||
|
filter_out_inactives = true;
|
||||||
|
} else {
|
||||||
|
filter_out_inactives = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exported for access by unit tests.
|
||||||
|
export function is_filtering_inactives() {
|
||||||
|
return filter_out_inactives;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function has_recent_activity(sub) {
|
||||||
|
if (!filter_out_inactives || sub.pin_to_top) {
|
||||||
|
// If users don't want to filter inactive streams
|
||||||
|
// to the bottom, we respect that setting and don't
|
||||||
|
// treat any streams as dormant.
|
||||||
|
//
|
||||||
|
// Currently this setting is automatically determined
|
||||||
|
// by the number of streams. See the callers
|
||||||
|
// to set_filter_out_inactives.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return stream_topic_history.stream_has_topics(sub.stream_id) || sub.newly_subscribed;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function has_recent_activity_but_muted(sub) {
|
||||||
|
return has_recent_activity(sub) && sub.is_muted;
|
||||||
|
}
|
||||||
|
|
||||||
export function sort_groups(streams, search_term) {
|
export function sort_groups(streams, search_term) {
|
||||||
const stream_id_to_name = (stream) => sub_store.get(stream).name;
|
const stream_id_to_name = (stream) => sub_store.get(stream).name;
|
||||||
// Use -, _ and / as word separators apart from the default space character
|
// Use -, _ and / as word separators apart from the default space character
|
||||||
|
@ -38,7 +87,7 @@ export function sort_groups(streams, search_term) {
|
||||||
);
|
);
|
||||||
|
|
||||||
function is_normal(sub) {
|
function is_normal(sub) {
|
||||||
return stream_data.is_active(sub);
|
return has_recent_activity(sub);
|
||||||
}
|
}
|
||||||
|
|
||||||
const pinned_streams = [];
|
const pinned_streams = [];
|
||||||
|
@ -138,3 +187,7 @@ export function next_stream_id(stream_id) {
|
||||||
|
|
||||||
return maybe_get_stream_id(i + 1);
|
return maybe_get_stream_id(i + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function initialize() {
|
||||||
|
set_filter_out_inactives();
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import * as people from "./people";
|
||||||
import * as pm_conversations from "./pm_conversations";
|
import * as pm_conversations from "./pm_conversations";
|
||||||
import * as recent_senders from "./recent_senders";
|
import * as recent_senders from "./recent_senders";
|
||||||
import * as stream_data from "./stream_data";
|
import * as stream_data from "./stream_data";
|
||||||
|
import * as stream_sort from "./stream_sort";
|
||||||
import * as user_groups from "./user_groups";
|
import * as user_groups from "./user_groups";
|
||||||
import * as user_status from "./user_status";
|
import * as user_status from "./user_status";
|
||||||
import * as util from "./util";
|
import * as util from "./util";
|
||||||
|
@ -430,8 +431,8 @@ function activity_score(sub) {
|
||||||
if (sub.pin_to_top) {
|
if (sub.pin_to_top) {
|
||||||
stream_score += 2;
|
stream_score += 2;
|
||||||
}
|
}
|
||||||
// Note: A pinned stream may accumulate a 3rd point if it is active
|
// Note: A pinned stream may accumulate a 3rd point if it has recent activity.
|
||||||
if (stream_data.is_active(sub)) {
|
if (stream_sort.has_recent_activity(sub)) {
|
||||||
stream_score += 1;
|
stream_score += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,6 +94,7 @@ import * as stream_edit from "./stream_edit";
|
||||||
import * as stream_edit_subscribers from "./stream_edit_subscribers";
|
import * as stream_edit_subscribers from "./stream_edit_subscribers";
|
||||||
import * as stream_list from "./stream_list";
|
import * as stream_list from "./stream_list";
|
||||||
import * as stream_settings_ui from "./stream_settings_ui";
|
import * as stream_settings_ui from "./stream_settings_ui";
|
||||||
|
import * as stream_sort from "./stream_sort";
|
||||||
import * as timerender from "./timerender";
|
import * as timerender from "./timerender";
|
||||||
import * as tippyjs from "./tippyjs";
|
import * as tippyjs from "./tippyjs";
|
||||||
import * as topic_list from "./topic_list";
|
import * as topic_list from "./topic_list";
|
||||||
|
@ -639,6 +640,7 @@ export function initialize_everything() {
|
||||||
stream_settings_ui.initialize();
|
stream_settings_ui.initialize();
|
||||||
user_group_settings_ui.initialize();
|
user_group_settings_ui.initialize();
|
||||||
stream_list.initialize();
|
stream_list.initialize();
|
||||||
|
stream_sort.initialize();
|
||||||
condense.initialize();
|
condense.initialize();
|
||||||
spoilers.initialize();
|
spoilers.initialize();
|
||||||
lightbox.initialize();
|
lightbox.initialize();
|
||||||
|
|
|
@ -40,6 +40,7 @@ const people = zrequire("people");
|
||||||
const user_groups = zrequire("user_groups");
|
const user_groups = zrequire("user_groups");
|
||||||
const stream_bar = zrequire("stream_bar");
|
const stream_bar = zrequire("stream_bar");
|
||||||
const stream_data = zrequire("stream_data");
|
const stream_data = zrequire("stream_data");
|
||||||
|
const stream_sort = zrequire("stream_sort");
|
||||||
const compose = zrequire("compose");
|
const compose = zrequire("compose");
|
||||||
const compose_pm_pill = zrequire("compose_pm_pill");
|
const compose_pm_pill = zrequire("compose_pm_pill");
|
||||||
const compose_ui = zrequire("compose_ui");
|
const compose_ui = zrequire("compose_ui");
|
||||||
|
@ -1062,7 +1063,8 @@ test("initialize", ({override, override_rewire, mock_template}) => {
|
||||||
"demote_inactive_streams",
|
"demote_inactive_streams",
|
||||||
settings_config.demote_inactive_streams_values.never.code,
|
settings_config.demote_inactive_streams_values.never.code,
|
||||||
);
|
);
|
||||||
stream_data.set_filter_out_inactives();
|
|
||||||
|
stream_sort.set_filter_out_inactives();
|
||||||
fake_this = {completing: "stream", token: "s"};
|
fake_this = {completing: "stream", token: "s"};
|
||||||
actual_value = sort_items(fake_this, [sweden_stream, serbia_stream]);
|
actual_value = sort_items(fake_this, [sweden_stream, serbia_stream]);
|
||||||
expected_value = [sweden_stream, serbia_stream];
|
expected_value = [sweden_stream, serbia_stream];
|
||||||
|
@ -1073,7 +1075,8 @@ test("initialize", ({override, override_rewire, mock_template}) => {
|
||||||
"demote_inactive_streams",
|
"demote_inactive_streams",
|
||||||
settings_config.demote_inactive_streams_values.always.code,
|
settings_config.demote_inactive_streams_values.always.code,
|
||||||
);
|
);
|
||||||
stream_data.set_filter_out_inactives();
|
|
||||||
|
stream_sort.set_filter_out_inactives();
|
||||||
actual_value = sort_items(fake_this, [sweden_stream, serbia_stream]);
|
actual_value = sort_items(fake_this, [sweden_stream, serbia_stream]);
|
||||||
expected_value = [sweden_stream, serbia_stream];
|
expected_value = [sweden_stream, serbia_stream];
|
||||||
assert.deepEqual(actual_value, expected_value);
|
assert.deepEqual(actual_value, expected_value);
|
||||||
|
|
|
@ -63,6 +63,7 @@ const stream_data = mock_esm("../src/stream_data");
|
||||||
const stream_events = mock_esm("../src/stream_events");
|
const stream_events = mock_esm("../src/stream_events");
|
||||||
const stream_list = mock_esm("../src/stream_list");
|
const stream_list = mock_esm("../src/stream_list");
|
||||||
const stream_settings_ui = mock_esm("../src/stream_settings_ui");
|
const stream_settings_ui = mock_esm("../src/stream_settings_ui");
|
||||||
|
const stream_sort = mock_esm("../src/stream_sort");
|
||||||
const stream_topic_history = mock_esm("../src/stream_topic_history");
|
const stream_topic_history = mock_esm("../src/stream_topic_history");
|
||||||
const submessage = mock_esm("../src/submessage");
|
const submessage = mock_esm("../src/submessage");
|
||||||
mock_esm("../src/top_left_corner", {
|
mock_esm("../src/top_left_corner", {
|
||||||
|
@ -917,7 +918,7 @@ run_test("user_settings", ({override}) => {
|
||||||
{
|
{
|
||||||
const stub = make_stub();
|
const stub = make_stub();
|
||||||
event = event_fixtures.user_settings__demote_inactive_streams;
|
event = event_fixtures.user_settings__demote_inactive_streams;
|
||||||
override(stream_data, "set_filter_out_inactives", noop);
|
override(stream_sort, "set_filter_out_inactives", noop);
|
||||||
override(stream_list, "update_streams_sidebar", stub.f);
|
override(stream_list, "update_streams_sidebar", stub.f);
|
||||||
user_settings.demote_inactive_streams = 1;
|
user_settings.demote_inactive_streams = 1;
|
||||||
dispatch(event);
|
dispatch(event);
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
const {strict: assert} = require("assert");
|
const {strict: assert} = require("assert");
|
||||||
|
|
||||||
const _ = require("lodash");
|
|
||||||
|
|
||||||
const {zrequire} = require("./lib/namespace");
|
const {zrequire} = require("./lib/namespace");
|
||||||
const {run_test} = require("./lib/test");
|
const {run_test} = require("./lib/test");
|
||||||
const blueslip = require("./lib/zblueslip");
|
const blueslip = require("./lib/zblueslip");
|
||||||
|
@ -14,13 +12,11 @@ const {page_params, user_settings} = require("./lib/zpage_params");
|
||||||
page_params.development_environment = true;
|
page_params.development_environment = true;
|
||||||
|
|
||||||
const color_data = zrequire("color_data");
|
const color_data = zrequire("color_data");
|
||||||
const stream_topic_history = zrequire("stream_topic_history");
|
|
||||||
const peer_data = zrequire("peer_data");
|
const peer_data = zrequire("peer_data");
|
||||||
const people = zrequire("people");
|
const people = zrequire("people");
|
||||||
const sub_store = zrequire("sub_store");
|
const sub_store = zrequire("sub_store");
|
||||||
const stream_data = zrequire("stream_data");
|
const stream_data = zrequire("stream_data");
|
||||||
const stream_settings_data = zrequire("stream_settings_data");
|
const stream_settings_data = zrequire("stream_settings_data");
|
||||||
const settings_config = zrequire("settings_config");
|
|
||||||
const user_groups = zrequire("user_groups");
|
const user_groups = zrequire("user_groups");
|
||||||
|
|
||||||
const me = {
|
const me = {
|
||||||
|
@ -36,10 +32,6 @@ const test_user = {
|
||||||
};
|
};
|
||||||
|
|
||||||
// set up user data
|
// set up user data
|
||||||
function contains_sub(subs, sub) {
|
|
||||||
return subs.some((s) => s.name === sub.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
const admins_group = {
|
const admins_group = {
|
||||||
name: "Admins",
|
name: "Admins",
|
||||||
id: 1,
|
id: 1,
|
||||||
|
@ -251,97 +243,6 @@ test("renames", () => {
|
||||||
assert.equal(actual_id, 42);
|
assert.equal(actual_id, 42);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("is_active", () => {
|
|
||||||
let sub;
|
|
||||||
|
|
||||||
user_settings.demote_inactive_streams =
|
|
||||||
settings_config.demote_inactive_streams_values.automatic.code;
|
|
||||||
stream_data.set_filter_out_inactives();
|
|
||||||
|
|
||||||
sub = {name: "pets", subscribed: false, stream_id: 111};
|
|
||||||
stream_data.add_sub(sub);
|
|
||||||
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
stream_data.subscribe_myself(sub);
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
assert.ok(contains_sub(stream_data.subscribed_subs(), sub));
|
|
||||||
assert.ok(!contains_sub(stream_data.unsubscribed_subs(), sub));
|
|
||||||
|
|
||||||
stream_data.unsubscribe_myself(sub);
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
sub.pin_to_top = true;
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
sub.pin_to_top = false;
|
|
||||||
|
|
||||||
const opts = {
|
|
||||||
stream_id: 222,
|
|
||||||
message_id: 108,
|
|
||||||
topic_name: "topic2",
|
|
||||||
};
|
|
||||||
stream_topic_history.add_message(opts);
|
|
||||||
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
user_settings.demote_inactive_streams =
|
|
||||||
settings_config.demote_inactive_streams_values.always.code;
|
|
||||||
stream_data.set_filter_out_inactives();
|
|
||||||
|
|
||||||
sub = {name: "pets", subscribed: false, stream_id: 111};
|
|
||||||
stream_data.add_sub(sub);
|
|
||||||
|
|
||||||
assert.ok(!stream_data.is_active(sub));
|
|
||||||
|
|
||||||
sub.pin_to_top = true;
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
sub.pin_to_top = false;
|
|
||||||
|
|
||||||
stream_data.subscribe_myself(sub);
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
stream_data.unsubscribe_myself(sub);
|
|
||||||
assert.ok(!stream_data.is_active(sub));
|
|
||||||
|
|
||||||
sub = {name: "lunch", subscribed: false, stream_id: 222};
|
|
||||||
stream_data.add_sub(sub);
|
|
||||||
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
stream_topic_history.add_message(opts);
|
|
||||||
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
user_settings.demote_inactive_streams =
|
|
||||||
settings_config.demote_inactive_streams_values.never.code;
|
|
||||||
stream_data.set_filter_out_inactives();
|
|
||||||
|
|
||||||
sub = {name: "pets", subscribed: false, stream_id: 111};
|
|
||||||
stream_data.add_sub(sub);
|
|
||||||
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
stream_data.subscribe_myself(sub);
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
stream_data.unsubscribe_myself(sub);
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
sub.pin_to_top = true;
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
|
|
||||||
stream_topic_history.add_message(opts);
|
|
||||||
|
|
||||||
assert.ok(stream_data.is_active(sub));
|
|
||||||
});
|
|
||||||
|
|
||||||
test("is_muted_active", () => {
|
|
||||||
const sub = {name: "cats", subscribed: true, stream_id: 111, is_muted: true};
|
|
||||||
stream_data.add_sub(sub);
|
|
||||||
assert.ok(stream_data.is_muted_active(sub));
|
|
||||||
});
|
|
||||||
|
|
||||||
test("admin_options", () => {
|
test("admin_options", () => {
|
||||||
function make_sub() {
|
function make_sub() {
|
||||||
const sub = {
|
const sub = {
|
||||||
|
@ -870,11 +771,9 @@ test("initialize", () => {
|
||||||
stream_data.initialize(get_params());
|
stream_data.initialize(get_params());
|
||||||
}
|
}
|
||||||
|
|
||||||
user_settings.demote_inactive_streams = 1;
|
|
||||||
page_params.realm_notifications_stream_id = -1;
|
page_params.realm_notifications_stream_id = -1;
|
||||||
|
|
||||||
initialize();
|
initialize();
|
||||||
assert.ok(!stream_data.is_filtering_inactives());
|
|
||||||
|
|
||||||
const stream_names = new Set(stream_data.get_streams_for_admin().map((elem) => elem.name));
|
const stream_names = new Set(stream_data.get_streams_for_admin().map((elem) => elem.name));
|
||||||
assert.ok(stream_names.has("subscriptions"));
|
assert.ok(stream_names.has("subscriptions"));
|
||||||
|
@ -899,35 +798,6 @@ test("initialize", () => {
|
||||||
assert.equal(stream_data.get_notifications_stream(), "foo");
|
assert.equal(stream_data.get_notifications_stream(), "foo");
|
||||||
});
|
});
|
||||||
|
|
||||||
test("filter inactives", () => {
|
|
||||||
user_settings.demote_inactive_streams =
|
|
||||||
settings_config.demote_inactive_streams_values.automatic.code;
|
|
||||||
|
|
||||||
const params = {};
|
|
||||||
params.unsubscribed = [];
|
|
||||||
params.never_subscribed = [];
|
|
||||||
params.subscriptions = [];
|
|
||||||
params.realm_default_streams = [];
|
|
||||||
|
|
||||||
stream_data.initialize(params);
|
|
||||||
assert.ok(!stream_data.is_filtering_inactives());
|
|
||||||
|
|
||||||
_.times(30, (i) => {
|
|
||||||
const name = "random" + i.toString();
|
|
||||||
const stream_id = 100 + i;
|
|
||||||
|
|
||||||
const sub = {
|
|
||||||
name,
|
|
||||||
subscribed: true,
|
|
||||||
newly_subscribed: false,
|
|
||||||
stream_id,
|
|
||||||
};
|
|
||||||
stream_data.add_sub(sub);
|
|
||||||
});
|
|
||||||
stream_data.initialize(params);
|
|
||||||
assert.ok(stream_data.is_filtering_inactives());
|
|
||||||
});
|
|
||||||
|
|
||||||
test("edge_cases", () => {
|
test("edge_cases", () => {
|
||||||
const bad_stream_ids = [555555, 99999];
|
const bad_stream_ids = [555555, 99999];
|
||||||
|
|
||||||
|
|
|
@ -200,11 +200,11 @@ test_ui("create_sidebar_row", ({override_rewire, mock_template}) => {
|
||||||
assert.ok(!$social_li.hasClass("out_of_home_view"));
|
assert.ok(!$social_li.hasClass("out_of_home_view"));
|
||||||
|
|
||||||
const row = stream_list.stream_sidebar.get_row(stream_id);
|
const row = stream_list.stream_sidebar.get_row(stream_id);
|
||||||
override_rewire(stream_data, "is_active", () => true);
|
override_rewire(stream_sort, "has_recent_activity", () => true);
|
||||||
row.update_whether_active();
|
row.update_whether_active();
|
||||||
assert.ok(!$social_li.hasClass("inactive_stream"));
|
assert.ok(!$social_li.hasClass("inactive_stream"));
|
||||||
|
|
||||||
override_rewire(stream_data, "is_active", () => false);
|
override_rewire(stream_sort, "has_recent_activity", () => false);
|
||||||
row.update_whether_active();
|
row.update_whether_active();
|
||||||
assert.ok($social_li.hasClass("inactive_stream"));
|
assert.ok($social_li.hasClass("inactive_stream"));
|
||||||
|
|
||||||
|
@ -229,16 +229,16 @@ test_ui("pinned_streams_never_inactive", ({override_rewire, mock_template}) => {
|
||||||
const $social_sidebar = $("<social-sidebar-row-stub>");
|
const $social_sidebar = $("<social-sidebar-row-stub>");
|
||||||
let stream_id = social.stream_id;
|
let stream_id = social.stream_id;
|
||||||
let row = stream_list.stream_sidebar.get_row(stream_id);
|
let row = stream_list.stream_sidebar.get_row(stream_id);
|
||||||
override_rewire(stream_data, "is_active", () => false);
|
override_rewire(stream_sort, "has_recent_activity", () => false);
|
||||||
|
|
||||||
stream_list.build_stream_list();
|
stream_list.build_stream_list();
|
||||||
assert.ok($social_sidebar.hasClass("inactive_stream"));
|
assert.ok($social_sidebar.hasClass("inactive_stream"));
|
||||||
|
|
||||||
override_rewire(stream_data, "is_active", () => true);
|
override_rewire(stream_sort, "has_recent_activity", () => true);
|
||||||
row.update_whether_active();
|
row.update_whether_active();
|
||||||
assert.ok(!$social_sidebar.hasClass("inactive_stream"));
|
assert.ok(!$social_sidebar.hasClass("inactive_stream"));
|
||||||
|
|
||||||
override_rewire(stream_data, "is_active", () => false);
|
override_rewire(stream_sort, "has_recent_activity", () => false);
|
||||||
row.update_whether_active();
|
row.update_whether_active();
|
||||||
assert.ok($social_sidebar.hasClass("inactive_stream"));
|
assert.ok($social_sidebar.hasClass("inactive_stream"));
|
||||||
|
|
||||||
|
@ -246,7 +246,7 @@ test_ui("pinned_streams_never_inactive", ({override_rewire, mock_template}) => {
|
||||||
const $devel_sidebar = $("<devel-sidebar-row-stub>");
|
const $devel_sidebar = $("<devel-sidebar-row-stub>");
|
||||||
stream_id = devel.stream_id;
|
stream_id = devel.stream_id;
|
||||||
row = stream_list.stream_sidebar.get_row(stream_id);
|
row = stream_list.stream_sidebar.get_row(stream_id);
|
||||||
override_rewire(stream_data, "is_active", () => false);
|
override_rewire(stream_sort, "has_recent_activity", () => false);
|
||||||
|
|
||||||
stream_list.build_stream_list();
|
stream_list.build_stream_list();
|
||||||
assert.ok(!$devel_sidebar.hasClass("inactive_stream"));
|
assert.ok(!$devel_sidebar.hasClass("inactive_stream"));
|
||||||
|
@ -499,7 +499,7 @@ test_ui("sort_streams", ({override_rewire, mock_template}) => {
|
||||||
|
|
||||||
initialize_stream_data();
|
initialize_stream_data();
|
||||||
|
|
||||||
override_rewire(stream_data, "is_active", (sub) => sub.name !== "cars");
|
override_rewire(stream_sort, "has_recent_activity", (sub) => sub.name !== "cars");
|
||||||
|
|
||||||
let appended_elems;
|
let appended_elems;
|
||||||
$("#stream_filters").append = (elems) => {
|
$("#stream_filters").append = (elems) => {
|
||||||
|
@ -587,7 +587,7 @@ test_ui("separators_only_pinned_and_dormant", ({override_rewire, mock_template})
|
||||||
};
|
};
|
||||||
add_row(DenmarkSub);
|
add_row(DenmarkSub);
|
||||||
|
|
||||||
override_rewire(stream_data, "is_active", (sub) => sub.name !== "Denmark");
|
override_rewire(stream_sort, "has_recent_activity", (sub) => sub.name !== "Denmark");
|
||||||
|
|
||||||
let appended_elems;
|
let appended_elems;
|
||||||
$("#stream_filters").append = (elems) => {
|
$("#stream_filters").append = (elems) => {
|
||||||
|
|
|
@ -2,11 +2,27 @@
|
||||||
|
|
||||||
const {strict: assert} = require("assert");
|
const {strict: assert} = require("assert");
|
||||||
|
|
||||||
|
const _ = require("lodash");
|
||||||
|
|
||||||
const {zrequire} = require("./lib/namespace");
|
const {zrequire} = require("./lib/namespace");
|
||||||
const {run_test} = require("./lib/test");
|
const {run_test} = require("./lib/test");
|
||||||
|
const {user_settings} = require("./lib/zpage_params");
|
||||||
|
|
||||||
|
const people = zrequire("people");
|
||||||
const stream_data = zrequire("stream_data");
|
const stream_data = zrequire("stream_data");
|
||||||
|
const stream_topic_history = zrequire("stream_topic_history");
|
||||||
const stream_sort = zrequire("stream_sort");
|
const stream_sort = zrequire("stream_sort");
|
||||||
|
const settings_config = zrequire("settings_config");
|
||||||
|
|
||||||
|
function contains_sub(subs, sub) {
|
||||||
|
return subs.some((s) => s.name === sub.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
const me = {
|
||||||
|
email: "me@zulip.com",
|
||||||
|
full_name: "Current User",
|
||||||
|
user_id: 100,
|
||||||
|
};
|
||||||
|
|
||||||
const scalene = {
|
const scalene = {
|
||||||
subscribed: true,
|
subscribed: true,
|
||||||
|
@ -94,7 +110,7 @@ test("basics", ({override_rewire}) => {
|
||||||
stream_data.add_sub(muted_active);
|
stream_data.add_sub(muted_active);
|
||||||
stream_data.add_sub(muted_pinned);
|
stream_data.add_sub(muted_pinned);
|
||||||
|
|
||||||
override_rewire(stream_data, "is_active", (sub) => sub.name !== "pneumonia");
|
override_rewire(stream_sort, "has_recent_activity", (sub) => sub.name !== "pneumonia");
|
||||||
|
|
||||||
// Test sorting into categories/alphabetized
|
// Test sorting into categories/alphabetized
|
||||||
let sorted = sort_groups("");
|
let sorted = sort_groups("");
|
||||||
|
@ -175,3 +191,131 @@ test("basics", ({override_rewire}) => {
|
||||||
assert.deepEqual(sorted.normal_streams, [stream_hyphen_underscore_slash.stream_id]);
|
assert.deepEqual(sorted.normal_streams, [stream_hyphen_underscore_slash.stream_id]);
|
||||||
assert.deepEqual(sorted.dormant_streams, []);
|
assert.deepEqual(sorted.dormant_streams, []);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("has_recent_activity", () => {
|
||||||
|
people.init();
|
||||||
|
people.add_active_user(me);
|
||||||
|
people.initialize_current_user(me.user_id);
|
||||||
|
|
||||||
|
let sub;
|
||||||
|
|
||||||
|
user_settings.demote_inactive_streams =
|
||||||
|
settings_config.demote_inactive_streams_values.automatic.code;
|
||||||
|
|
||||||
|
stream_sort.set_filter_out_inactives();
|
||||||
|
|
||||||
|
sub = {name: "pets", subscribed: false, stream_id: 111};
|
||||||
|
stream_data.add_sub(sub);
|
||||||
|
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
stream_data.subscribe_myself(sub);
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
assert.ok(contains_sub(stream_data.subscribed_subs(), sub));
|
||||||
|
assert.ok(!contains_sub(stream_data.unsubscribed_subs(), sub));
|
||||||
|
|
||||||
|
stream_data.unsubscribe_myself(sub);
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
sub.pin_to_top = true;
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
sub.pin_to_top = false;
|
||||||
|
|
||||||
|
const opts = {
|
||||||
|
stream_id: 222,
|
||||||
|
message_id: 108,
|
||||||
|
topic_name: "topic2",
|
||||||
|
};
|
||||||
|
stream_topic_history.add_message(opts);
|
||||||
|
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
user_settings.demote_inactive_streams =
|
||||||
|
settings_config.demote_inactive_streams_values.always.code;
|
||||||
|
|
||||||
|
stream_sort.set_filter_out_inactives();
|
||||||
|
|
||||||
|
sub = {name: "pets", subscribed: false, stream_id: 111};
|
||||||
|
stream_data.add_sub(sub);
|
||||||
|
|
||||||
|
assert.ok(!stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
sub.pin_to_top = true;
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
sub.pin_to_top = false;
|
||||||
|
|
||||||
|
stream_data.subscribe_myself(sub);
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
stream_data.unsubscribe_myself(sub);
|
||||||
|
assert.ok(!stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
sub = {name: "lunch", subscribed: false, stream_id: 222};
|
||||||
|
stream_data.add_sub(sub);
|
||||||
|
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
stream_topic_history.add_message(opts);
|
||||||
|
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
user_settings.demote_inactive_streams =
|
||||||
|
settings_config.demote_inactive_streams_values.never.code;
|
||||||
|
|
||||||
|
stream_sort.set_filter_out_inactives();
|
||||||
|
|
||||||
|
sub = {name: "pets", subscribed: false, stream_id: 111};
|
||||||
|
stream_data.add_sub(sub);
|
||||||
|
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
stream_data.subscribe_myself(sub);
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
stream_data.unsubscribe_myself(sub);
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
sub.pin_to_top = true;
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
|
||||||
|
stream_topic_history.add_message(opts);
|
||||||
|
|
||||||
|
assert.ok(stream_sort.has_recent_activity(sub));
|
||||||
|
});
|
||||||
|
|
||||||
|
test("has_recent_activity_but_muted", () => {
|
||||||
|
const sub = {name: "cats", subscribed: true, stream_id: 111, is_muted: true};
|
||||||
|
stream_data.add_sub(sub);
|
||||||
|
assert.ok(stream_sort.has_recent_activity_but_muted(sub));
|
||||||
|
});
|
||||||
|
|
||||||
|
test("filter inactives", () => {
|
||||||
|
user_settings.demote_inactive_streams =
|
||||||
|
settings_config.demote_inactive_streams_values.automatic.code;
|
||||||
|
|
||||||
|
assert.ok(!stream_sort.is_filtering_inactives());
|
||||||
|
|
||||||
|
_.times(30, (i) => {
|
||||||
|
const name = "random" + i.toString();
|
||||||
|
const stream_id = 100 + i;
|
||||||
|
|
||||||
|
const sub = {
|
||||||
|
name,
|
||||||
|
subscribed: true,
|
||||||
|
newly_subscribed: false,
|
||||||
|
stream_id,
|
||||||
|
};
|
||||||
|
stream_data.add_sub(sub);
|
||||||
|
});
|
||||||
|
stream_sort.set_filter_out_inactives();
|
||||||
|
|
||||||
|
assert.ok(stream_sort.is_filtering_inactives());
|
||||||
|
});
|
||||||
|
|
||||||
|
test("initialize", () => {
|
||||||
|
user_settings.demote_inactive_streams = 1;
|
||||||
|
stream_sort.initialize();
|
||||||
|
|
||||||
|
assert.ok(!stream_sort.is_filtering_inactives());
|
||||||
|
});
|
||||||
|
|
|
@ -15,6 +15,7 @@ const recent_senders = zrequire("recent_senders");
|
||||||
const peer_data = zrequire("peer_data");
|
const peer_data = zrequire("peer_data");
|
||||||
const people = zrequire("people");
|
const people = zrequire("people");
|
||||||
const stream_data = zrequire("stream_data");
|
const stream_data = zrequire("stream_data");
|
||||||
|
const stream_sort = zrequire("stream_sort");
|
||||||
const compose_state = zrequire("compose_state");
|
const compose_state = zrequire("compose_state");
|
||||||
const emoji = zrequire("emoji");
|
const emoji = zrequire("emoji");
|
||||||
const pygments_data = zrequire("../generated/pygments_data.json");
|
const pygments_data = zrequire("../generated/pygments_data.json");
|
||||||
|
@ -156,7 +157,8 @@ test("sort_streams", ({override}) => {
|
||||||
"demote_inactive_streams",
|
"demote_inactive_streams",
|
||||||
settings_config.demote_inactive_streams_values.always.code,
|
settings_config.demote_inactive_streams_values.always.code,
|
||||||
);
|
);
|
||||||
stream_data.set_filter_out_inactives();
|
|
||||||
|
stream_sort.set_filter_out_inactives();
|
||||||
override(
|
override(
|
||||||
stream_topic_history,
|
stream_topic_history,
|
||||||
"stream_has_topics",
|
"stream_has_topics",
|
||||||
|
|
Loading…
Reference in New Issue