mirror of https://github.com/zulip/zulip.git
streams: Store list of stream ids instead of names for sorting.
We will store list of stream ids to sort streams instead of names. We have added a compare_function for sorting the list of stream_ids by comparing stream names. This change helps us to remove a couple of get_sub calls and using stream ids instead of name also helps in avoiding bugs caused due to live update on renaming of stream.
This commit is contained in:
parent
ed96758614
commit
dcc24992b9
|
@ -2,7 +2,7 @@ zrequire("stream_data");
|
|||
zrequire("stream_sort");
|
||||
|
||||
run_test("no_subscribed_streams", () => {
|
||||
assert.equal(stream_sort.sort_groups(""), undefined);
|
||||
assert.equal(stream_sort.sort_groups([]), undefined);
|
||||
assert.equal(stream_sort.first_stream_id(), undefined);
|
||||
});
|
||||
|
||||
|
@ -44,7 +44,7 @@ stream_data.add_sub(clarinet);
|
|||
stream_data.add_sub(weaving);
|
||||
|
||||
function sort_groups(query) {
|
||||
const streams = stream_data.subscribed_streams();
|
||||
const streams = stream_data.subscribed_stream_ids();
|
||||
return stream_sort.sort_groups(streams, query);
|
||||
}
|
||||
|
||||
|
@ -53,9 +53,9 @@ run_test("basics", (override) => {
|
|||
|
||||
// Test sorting into categories/alphabetized
|
||||
let sorted = sort_groups("");
|
||||
assert.deepEqual(sorted.pinned_streams, ["scalene"]);
|
||||
assert.deepEqual(sorted.normal_streams, ["clarinet", "fast tortoise"]);
|
||||
assert.deepEqual(sorted.dormant_streams, ["pneumonia"]);
|
||||
assert.deepEqual(sorted.pinned_streams, [scalene.stream_id]);
|
||||
assert.deepEqual(sorted.normal_streams, [clarinet.stream_id, fast_tortoise.stream_id]);
|
||||
assert.deepEqual(sorted.dormant_streams, [pneumonia.stream_id]);
|
||||
|
||||
// Test cursor helpers.
|
||||
assert.equal(stream_sort.first_stream_id(), scalene.stream_id);
|
||||
|
@ -68,7 +68,7 @@ run_test("basics", (override) => {
|
|||
|
||||
// Test filtering
|
||||
sorted = sort_groups("s");
|
||||
assert.deepEqual(sorted.pinned_streams, ["scalene"]);
|
||||
assert.deepEqual(sorted.pinned_streams, [scalene.stream_id]);
|
||||
assert.deepEqual(sorted.normal_streams, []);
|
||||
assert.deepEqual(sorted.dormant_streams, []);
|
||||
|
||||
|
@ -80,17 +80,17 @@ run_test("basics", (override) => {
|
|||
sorted = sort_groups("PnEuMoNiA");
|
||||
assert.deepEqual(sorted.pinned_streams, []);
|
||||
assert.deepEqual(sorted.normal_streams, []);
|
||||
assert.deepEqual(sorted.dormant_streams, ["pneumonia"]);
|
||||
assert.deepEqual(sorted.dormant_streams, [pneumonia.stream_id]);
|
||||
|
||||
// Test searching part of word
|
||||
sorted = sort_groups("tortoise");
|
||||
assert.deepEqual(sorted.pinned_streams, []);
|
||||
assert.deepEqual(sorted.normal_streams, ["fast tortoise"]);
|
||||
assert.deepEqual(sorted.normal_streams, [fast_tortoise.stream_id]);
|
||||
assert.deepEqual(sorted.dormant_streams, []);
|
||||
|
||||
// Test searching stream with spaces
|
||||
sorted = sort_groups("fast t");
|
||||
assert.deepEqual(sorted.pinned_streams, []);
|
||||
assert.deepEqual(sorted.normal_streams, ["fast tortoise"]);
|
||||
assert.deepEqual(sorted.normal_streams, [fast_tortoise.stream_id]);
|
||||
assert.deepEqual(sorted.dormant_streams, []);
|
||||
});
|
||||
|
|
|
@ -87,7 +87,7 @@ exports.build_stream_list = function () {
|
|||
// sidebar rows. Our job here is to build the bigger widget,
|
||||
// which largely is a matter of arranging the individual rows in
|
||||
// the right order.
|
||||
const streams = stream_data.subscribed_streams();
|
||||
const streams = stream_data.subscribed_stream_ids();
|
||||
if (streams.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
@ -103,9 +103,8 @@ exports.build_stream_list = function () {
|
|||
const parent = $("#stream_filters");
|
||||
const elems = [];
|
||||
|
||||
function add_sidebar_li(stream) {
|
||||
const sub = stream_data.get_sub(stream);
|
||||
const sidebar_row = exports.stream_sidebar.get_row(sub.stream_id);
|
||||
function add_sidebar_li(stream_id) {
|
||||
const sidebar_row = exports.stream_sidebar.get_row(stream_id);
|
||||
sidebar_row.update_whether_active();
|
||||
elems.push(sidebar_row.get_li());
|
||||
}
|
||||
|
|
|
@ -8,9 +8,22 @@ let all_streams = [];
|
|||
exports.get_streams = function () {
|
||||
// Right now this is only used for testing, but we should
|
||||
// use it for things like hotkeys that cycle through streams.
|
||||
return all_streams;
|
||||
const sorted_streams = all_streams.map((stream_id) =>
|
||||
stream_data.maybe_get_stream_name(stream_id),
|
||||
);
|
||||
return sorted_streams;
|
||||
};
|
||||
|
||||
function compare_function(a, b) {
|
||||
const stream_a = stream_data.get_sub_by_id(a);
|
||||
const stream_b = stream_data.get_sub_by_id(b);
|
||||
|
||||
const stream_name_a = stream_a ? stream_a.name : "";
|
||||
const stream_name_b = stream_b ? stream_b.name : "";
|
||||
|
||||
return util.strcmp(stream_name_a, stream_name_b);
|
||||
}
|
||||
|
||||
function filter_streams_by_search(streams, search_term) {
|
||||
if (search_term === "") {
|
||||
return streams;
|
||||
|
@ -21,7 +34,7 @@ function filter_streams_by_search(streams, search_term) {
|
|||
|
||||
const filtered_streams = streams.filter((stream) =>
|
||||
search_terms.some((search_term) => {
|
||||
const lower_stream_name = stream.toLowerCase();
|
||||
const lower_stream_name = stream_data.get_sub_by_id(stream).name.toLowerCase();
|
||||
const cands = lower_stream_name.split(" ");
|
||||
cands.push(lower_stream_name);
|
||||
return cands.some((name) => name.startsWith(search_term));
|
||||
|
@ -47,7 +60,7 @@ exports.sort_groups = function (streams, search_term) {
|
|||
const dormant_streams = [];
|
||||
|
||||
for (const stream of streams) {
|
||||
const sub = stream_data.get_sub(stream);
|
||||
const sub = stream_data.get_sub_by_id(stream);
|
||||
const pinned = sub.pin_to_top;
|
||||
if (pinned) {
|
||||
pinned_streams.push(stream);
|
||||
|
@ -58,9 +71,9 @@ exports.sort_groups = function (streams, search_term) {
|
|||
}
|
||||
}
|
||||
|
||||
pinned_streams.sort(util.strcmp);
|
||||
normal_streams.sort(util.strcmp);
|
||||
dormant_streams.sort(util.strcmp);
|
||||
pinned_streams.sort(compare_function);
|
||||
normal_streams.sort(compare_function);
|
||||
dormant_streams.sort(compare_function);
|
||||
|
||||
const same_as_before =
|
||||
previous_pinned !== undefined &&
|
||||
|
@ -84,26 +97,12 @@ exports.sort_groups = function (streams, search_term) {
|
|||
};
|
||||
};
|
||||
|
||||
function pos(stream_id) {
|
||||
const sub = stream_data.get_sub_by_id(stream_id);
|
||||
const name = sub.name;
|
||||
const i = all_streams.indexOf(name);
|
||||
|
||||
if (i < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
function maybe_get_stream_id(i) {
|
||||
if (i < 0 || i >= all_streams.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
const name = all_streams[i];
|
||||
const stream_id = stream_data.get_stream_id(name);
|
||||
return stream_id;
|
||||
return all_streams[i];
|
||||
}
|
||||
|
||||
exports.first_stream_id = function () {
|
||||
|
@ -111,9 +110,9 @@ exports.first_stream_id = function () {
|
|||
};
|
||||
|
||||
exports.prev_stream_id = function (stream_id) {
|
||||
const i = pos(stream_id);
|
||||
const i = all_streams.indexOf(stream_id);
|
||||
|
||||
if (i === undefined) {
|
||||
if (i < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -121,9 +120,9 @@ exports.prev_stream_id = function (stream_id) {
|
|||
};
|
||||
|
||||
exports.next_stream_id = function (stream_id) {
|
||||
const i = pos(stream_id);
|
||||
const i = all_streams.indexOf(stream_id);
|
||||
|
||||
if (i === undefined) {
|
||||
if (i < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue