mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	The new list_cursor class is more generic and saves the state of your cursor across redraws. Note that we no longer cycle from bottom to top or vice versa. The node test code that was removed here was kind of complex and didn't actually assert useful things after calling methods.
		
			
				
	
	
		
			145 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			3.4 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();
 | 
						|
            var cands = lower_stream_name.split(" ");
 | 
						|
            cands.push(lower_stream_name);
 | 
						|
            return _.any(cands, 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(sub) {
 | 
						|
        return stream_data.is_active(sub);
 | 
						|
    }
 | 
						|
 | 
						|
    var pinned_streams = [];
 | 
						|
    var normal_streams = [];
 | 
						|
    var dormant_streams = [];
 | 
						|
 | 
						|
    _.each(streams, function (stream) {
 | 
						|
        var sub = stream_data.get_sub(stream);
 | 
						|
        var pinned = sub.pin_to_top;
 | 
						|
        if (pinned) {
 | 
						|
            pinned_streams.push(stream);
 | 
						|
        } else if (is_normal(sub)) {
 | 
						|
            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,
 | 
						|
    };
 | 
						|
};
 | 
						|
 | 
						|
function pos(stream_id) {
 | 
						|
    var sub = stream_data.get_sub_by_id(stream_id);
 | 
						|
    var name = sub.name;
 | 
						|
    var 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;
 | 
						|
    }
 | 
						|
 | 
						|
    var name = all_streams[i];
 | 
						|
    var stream_id = stream_data.get_stream_id(name);
 | 
						|
    return stream_id;
 | 
						|
}
 | 
						|
 | 
						|
exports.first_stream_id = function () {
 | 
						|
    return maybe_get_stream_id(0);
 | 
						|
};
 | 
						|
 | 
						|
exports.prev_stream_id = function (stream_id) {
 | 
						|
    var i = pos(stream_id);
 | 
						|
 | 
						|
    if (i === undefined) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    return maybe_get_stream_id(i - 1);
 | 
						|
};
 | 
						|
 | 
						|
exports.next_stream_id = function (stream_id) {
 | 
						|
    var i = pos(stream_id);
 | 
						|
 | 
						|
    if (i === undefined) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
    return maybe_get_stream_id(i + 1);
 | 
						|
};
 | 
						|
 | 
						|
return exports;
 | 
						|
}());
 | 
						|
if (typeof module !== 'undefined') {
 | 
						|
    module.exports = stream_sort;
 | 
						|
}
 |