mirror of
https://github.com/zulip/zulip.git
synced 2025-11-06 15:03:34 +00:00
Before this change, we would move "dormant" streams to the bottom of your stream sidebar, but only if you had 40+ streams. Now we do this in all cases to be more consistent. This commit also changes the redraw strategy when we remove rows. Before this change, we were doing incremental updates, but now we call build_stream_list to do a complete rebuild. This was partly motivated by adding the new divider, which would have complicated the incrememental approach when you removed the last remaining dormant stream.
96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
var stream_sort = (function () {
|
|
|
|
var exports = {};
|
|
|
|
var previous_pinned;
|
|
var previous_normal;
|
|
var previous_dormant;
|
|
var 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;
|
|
};
|
|
|
|
function filter_streams_by_search(streams, search_term) {
|
|
if (search_term === '') {
|
|
return streams;
|
|
}
|
|
|
|
var search_terms = search_term.toLowerCase().split(",");
|
|
search_terms = _.map(search_terms, function (s) {
|
|
return s.trim();
|
|
});
|
|
|
|
var filtered_streams = _.filter(streams, function (stream) {
|
|
return _.any(search_terms, function (search_term) {
|
|
var lower_stream_name = stream.toLowerCase().split(" ");
|
|
return _.any(lower_stream_name, function (name) {
|
|
return name.indexOf(search_term) === 0;
|
|
});
|
|
});
|
|
});
|
|
|
|
return filtered_streams;
|
|
}
|
|
|
|
exports.sort_groups = function (search_term) {
|
|
var streams = stream_data.subscribed_streams();
|
|
if (streams.length === 0) {
|
|
return;
|
|
}
|
|
|
|
streams = filter_streams_by_search(streams, search_term);
|
|
|
|
function is_normal(stream) {
|
|
return stream_data.is_active(stream);
|
|
}
|
|
|
|
var pinned_streams = [];
|
|
var normal_streams = [];
|
|
var dormant_streams = [];
|
|
|
|
_.each(streams, function (stream) {
|
|
var pinned = stream_data.get_sub(stream).pin_to_top;
|
|
if (pinned) {
|
|
pinned_streams.push(stream);
|
|
} else if (is_normal(stream)) {
|
|
normal_streams.push(stream);
|
|
} else {
|
|
dormant_streams.push(stream);
|
|
}
|
|
});
|
|
|
|
pinned_streams.sort(util.strcmp);
|
|
normal_streams.sort(util.strcmp);
|
|
dormant_streams.sort(util.strcmp);
|
|
|
|
var same_as_before = (
|
|
previous_pinned !== undefined &&
|
|
util.array_compare(previous_pinned, pinned_streams) &&
|
|
util.array_compare(previous_normal, normal_streams) &&
|
|
util.array_compare(previous_dormant, dormant_streams));
|
|
|
|
if (!same_as_before) {
|
|
previous_pinned = pinned_streams;
|
|
previous_normal = normal_streams;
|
|
previous_dormant = dormant_streams;
|
|
|
|
all_streams = pinned_streams.concat(normal_streams, dormant_streams);
|
|
}
|
|
|
|
return {
|
|
same_as_before: same_as_before,
|
|
pinned_streams: pinned_streams,
|
|
normal_streams: normal_streams,
|
|
dormant_streams: dormant_streams,
|
|
};
|
|
};
|
|
|
|
return exports;
|
|
}());
|
|
if (typeof module !== 'undefined') {
|
|
module.exports = stream_sort;
|
|
}
|