Files
zulip/static/js/stream_sort.js
madrix01 c1b5021d84 stream_list: Sort muted to end of sections and add labels.
The stream list left sidebar currently has 3 sections:
* Pinned (+ Muted pinned streams)
* Active (+ Muted active streams)
* Inactive streams

Previously, these sections were separated by horizontal lines, which
did not provide an easy way to discern why there were sections. We add
labels to these section dividers to help with this.

Additionally, within each section, we now sort all muted streams to
the bottom, so that they general minimal clutter.

Fixes #19812.
2022-08-06 21:59:23 -07:00

140 lines
3.7 KiB
JavaScript

import * as stream_data from "./stream_data";
import * as sub_store from "./sub_store";
import * as util from "./util";
let previous_pinned;
let previous_normal;
let previous_dormant;
let previous_muted_active;
let previous_muted_pinned;
let all_streams = [];
export function get_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 = sub_store.get(a);
const stream_b = sub_store.get(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);
}
export function sort_groups(streams, search_term) {
const stream_id_to_name = (stream) => sub_store.get(stream).name;
// Use -, _ and / as word separators apart from the default space character
const word_separator_regex = /[\s/_-]/;
streams = util.filter_by_word_prefix_match(
streams,
search_term,
stream_id_to_name,
word_separator_regex,
);
function is_normal(sub) {
return stream_data.is_active(sub);
}
const pinned_streams = [];
const normal_streams = [];
const muted_pinned_streams = [];
const muted_active_streams = [];
const dormant_streams = [];
for (const stream of streams) {
const sub = sub_store.get(stream);
const pinned = sub.pin_to_top;
if (pinned) {
if (!sub.is_muted) {
pinned_streams.push(stream);
} else {
muted_pinned_streams.push(stream);
}
} else if (is_normal(sub)) {
if (!sub.is_muted) {
normal_streams.push(stream);
} else {
muted_active_streams.push(stream);
}
} else {
dormant_streams.push(stream);
}
}
pinned_streams.sort(compare_function);
normal_streams.sort(compare_function);
muted_pinned_streams.sort(compare_function);
muted_active_streams.sort(compare_function);
dormant_streams.sort(compare_function);
const same_as_before =
previous_pinned !== undefined &&
util.array_compare(previous_pinned, pinned_streams) &&
util.array_compare(previous_normal, normal_streams) &&
util.array_compare(previous_muted_pinned, muted_pinned_streams) &&
util.array_compare(previous_muted_active, muted_active_streams) &&
util.array_compare(previous_dormant, dormant_streams);
if (!same_as_before) {
previous_pinned = pinned_streams;
previous_normal = normal_streams;
previous_muted_pinned = muted_pinned_streams;
previous_muted_active = muted_active_streams;
previous_dormant = dormant_streams;
all_streams = pinned_streams.concat(
muted_pinned_streams,
normal_streams,
muted_active_streams,
dormant_streams,
);
}
return {
same_as_before,
pinned_streams,
normal_streams,
dormant_streams,
muted_pinned_streams,
muted_active_streams,
};
}
function maybe_get_stream_id(i) {
if (i < 0 || i >= all_streams.length) {
return undefined;
}
return all_streams[i];
}
export function first_stream_id() {
return maybe_get_stream_id(0);
}
export function prev_stream_id(stream_id) {
const i = all_streams.indexOf(stream_id);
if (i < 0) {
return undefined;
}
return maybe_get_stream_id(i - 1);
}
export function next_stream_id(stream_id) {
const i = all_streams.indexOf(stream_id);
if (i < 0) {
return undefined;
}
return maybe_get_stream_id(i + 1);
}