mirror of https://github.com/zulip/zulip.git
Extract stream_sort.js.
This commit is contained in:
parent
4fb450d4a9
commit
9591b3a95b
|
@ -92,6 +92,7 @@
|
||||||
"notifications": false,
|
"notifications": false,
|
||||||
"message_flags": false,
|
"message_flags": false,
|
||||||
"bot_data": false,
|
"bot_data": false,
|
||||||
|
"stream_sort": false,
|
||||||
"stream_list": false,
|
"stream_list": false,
|
||||||
"stream_popover": false,
|
"stream_popover": false,
|
||||||
"narrow": false,
|
"narrow": false,
|
||||||
|
|
|
@ -9,6 +9,7 @@ add_dependencies({
|
||||||
narrow: 'js/narrow',
|
narrow: 'js/narrow',
|
||||||
stream_color: 'js/stream_color',
|
stream_color: 'js/stream_color',
|
||||||
stream_data: 'js/stream_data',
|
stream_data: 'js/stream_data',
|
||||||
|
stream_sort: 'js/stream_sort',
|
||||||
subs: 'js/subs',
|
subs: 'js/subs',
|
||||||
templates: 'js/templates',
|
templates: 'js/templates',
|
||||||
unread: 'js/unread',
|
unread: 'js/unread',
|
||||||
|
@ -204,6 +205,17 @@ function clear_filters() {
|
||||||
|
|
||||||
stream_list.build_stream_list();
|
stream_list.build_stream_list();
|
||||||
|
|
||||||
|
var streams = global.stream_sort.get_streams().slice(0, 6);
|
||||||
|
|
||||||
|
assert.deepEqual(streams, [
|
||||||
|
'devel',
|
||||||
|
'Rome',
|
||||||
|
'test',
|
||||||
|
'Denmark',
|
||||||
|
'social',
|
||||||
|
'announce',
|
||||||
|
]);
|
||||||
|
|
||||||
// verify pinned streams are still sorted by lowercase name
|
// verify pinned streams are still sorted by lowercase name
|
||||||
// i.e. not affected by sort_recent set to true
|
// i.e. not affected by sort_recent set to true
|
||||||
assert.equal(devel_li.next().find('[ data-name="Rome"]').length, 1);
|
assert.equal(devel_li.next().find('[ data-name="Rome"]').length, 1);
|
||||||
|
|
|
@ -3,8 +3,6 @@ var stream_list = (function () {
|
||||||
var exports = {};
|
var exports = {};
|
||||||
|
|
||||||
var zoomed_stream = '';
|
var zoomed_stream = '';
|
||||||
var previous_sort_order;
|
|
||||||
var previous_unpinned_order;
|
|
||||||
|
|
||||||
function update_count_in_dom(unread_count_elem, count) {
|
function update_count_in_dom(unread_count_elem, count) {
|
||||||
var count_span = unread_count_elem.find('.count');
|
var count_span = unread_count_elem.find('.count');
|
||||||
|
@ -27,32 +25,6 @@ function update_count_in_dom(unread_count_elem, count) {
|
||||||
value_span.text(count);
|
value_span.text(count);
|
||||||
}
|
}
|
||||||
|
|
||||||
function filter_streams_by_search(streams) {
|
|
||||||
var search_box = $(".stream-list-filter");
|
|
||||||
|
|
||||||
var search_term = search_box.expectOne().val().trim();
|
|
||||||
|
|
||||||
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.stream_sidebar = (function () {
|
exports.stream_sidebar = (function () {
|
||||||
var self = {};
|
var self = {};
|
||||||
|
|
||||||
|
@ -93,11 +65,21 @@ exports.stream_sidebar = (function () {
|
||||||
return self;
|
return self;
|
||||||
}());
|
}());
|
||||||
|
|
||||||
|
function get_search_term() {
|
||||||
|
var search_box = $(".stream-list-filter");
|
||||||
|
var search_term = search_box.expectOne().val().trim();
|
||||||
|
return search_term;
|
||||||
|
}
|
||||||
|
|
||||||
exports.remove_sidebar_row = function (stream_id) {
|
exports.remove_sidebar_row = function (stream_id) {
|
||||||
exports.stream_sidebar.remove_row(stream_id);
|
exports.stream_sidebar.remove_row(stream_id);
|
||||||
// We need to make sure we resort if the removed sub gets added again
|
|
||||||
previous_sort_order = undefined;
|
// We call sort_groups to update our list of streams,
|
||||||
previous_unpinned_order = undefined;
|
// even though we don't use the result, since we can
|
||||||
|
// just remove the row. (The list of streams will
|
||||||
|
// be used by things like typeahead and hotkeys to
|
||||||
|
// advance to the next stream.)
|
||||||
|
stream_sort.sort_groups(get_search_term());
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.create_initial_sidebar_rows = function () {
|
exports.create_initial_sidebar_rows = function () {
|
||||||
|
@ -121,63 +103,39 @@ exports.build_stream_list = function () {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
streams = filter_streams_by_search(streams);
|
// The main logic to build the list is in stream_sort.js, and
|
||||||
|
// we get three lists of streams (pinned/normal/dormant).
|
||||||
|
var stream_groups = stream_sort.sort_groups(get_search_term());
|
||||||
|
|
||||||
|
if (stream_groups.same_as_before) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var sort_recent = (streams.length > 40);
|
|
||||||
var pinned_streams = [];
|
|
||||||
var unpinned_streams = [];
|
|
||||||
var parent = $('#stream_filters');
|
var parent = $('#stream_filters');
|
||||||
var elems = [];
|
var elems = [];
|
||||||
|
|
||||||
function add_sidebar_li(stream) {
|
function add_sidebar_li(stream) {
|
||||||
var sub = stream_data.get_sub(stream);
|
var sub = stream_data.get_sub(stream);
|
||||||
var sidebar_row = exports.stream_sidebar.get_row(sub.stream_id);
|
var sidebar_row = exports.stream_sidebar.get_row(sub.stream_id);
|
||||||
if (sort_recent) {
|
if (stream_groups.sort_recent) {
|
||||||
sidebar_row.update_whether_active();
|
sidebar_row.update_whether_active();
|
||||||
}
|
}
|
||||||
elems.push(sidebar_row.get_li().get(0));
|
elems.push(sidebar_row.get_li().get(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
_.each(streams, function (stream) {
|
|
||||||
var pinned = stream_data.get_sub(stream).pin_to_top;
|
|
||||||
if (pinned) {
|
|
||||||
pinned_streams.push(stream);
|
|
||||||
} else {
|
|
||||||
unpinned_streams.push(stream);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
pinned_streams.sort(util.strcmp);
|
|
||||||
|
|
||||||
unpinned_streams.sort(function (a, b) {
|
|
||||||
if (sort_recent) {
|
|
||||||
if (stream_data.is_active(b) && ! stream_data.is_active(a)) {
|
|
||||||
return 1;
|
|
||||||
} else if (! stream_data.is_active(b) && stream_data.is_active(a)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return util.strcmp(a, b);
|
|
||||||
});
|
|
||||||
|
|
||||||
streams = pinned_streams.concat(unpinned_streams);
|
|
||||||
|
|
||||||
if (previous_sort_order !== undefined &&
|
|
||||||
util.array_compare(previous_sort_order, streams) &&
|
|
||||||
util.array_compare(previous_unpinned_order, unpinned_streams)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
previous_sort_order = streams;
|
|
||||||
previous_unpinned_order = unpinned_streams;
|
|
||||||
parent.empty();
|
parent.empty();
|
||||||
|
|
||||||
if (pinned_streams.length > 0) {
|
_.each(stream_groups.pinned_streams, add_sidebar_li);
|
||||||
_.each(pinned_streams, add_sidebar_li);
|
|
||||||
|
if (stream_groups.pinned_streams.length > 0) {
|
||||||
elems.push($('<hr class="pinned-stream-split">').get(0));
|
elems.push($('<hr class="pinned-stream-split">').get(0));
|
||||||
}
|
}
|
||||||
if (unpinned_streams.length > 0) {
|
|
||||||
_.each(unpinned_streams, add_sidebar_li);
|
_.each(stream_groups.normal_streams, add_sidebar_li);
|
||||||
}
|
|
||||||
|
// TODO: Add a divider here if there are dormant streams.
|
||||||
|
|
||||||
|
_.each(stream_groups.dormant_streams, add_sidebar_li);
|
||||||
|
|
||||||
$(elems).appendTo(parent);
|
$(elems).appendTo(parent);
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
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);
|
||||||
|
|
||||||
|
var sort_recent = (streams.length > 40);
|
||||||
|
|
||||||
|
function is_normal(stream) {
|
||||||
|
return !sort_recent || 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,
|
||||||
|
sort_recent: sort_recent,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
}());
|
||||||
|
if (typeof module !== 'undefined') {
|
||||||
|
module.exports = stream_sort;
|
||||||
|
}
|
|
@ -846,6 +846,7 @@ JS_SPECS = {
|
||||||
'js/unread.js',
|
'js/unread.js',
|
||||||
'js/topic_list.js',
|
'js/topic_list.js',
|
||||||
'js/pm_list.js',
|
'js/pm_list.js',
|
||||||
|
'js/stream_sort.js',
|
||||||
'js/stream_list.js',
|
'js/stream_list.js',
|
||||||
'js/filter.js',
|
'js/filter.js',
|
||||||
'js/message_list_view.js',
|
'js/message_list_view.js',
|
||||||
|
|
Loading…
Reference in New Issue