mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	filter: Store reference to _sub instead of _stream_params.
				
					
				
			In commit 4f6377d493 we added
`_stream_params` as a way of storing attributes such as stream name
and stream privacy, this involved adding a few calls within functions
that updated these values (in order to maintain consistency).
This commit replaces `_stream_params` with an always consistent `_sub`
object and removes unnecessary `_stream_params` related code. Once the
`_sub` object is available, calls to `stream_data` may be considered
suspicious as they can often be avoided by just picking the desired
attribute off of the `_sub` object.
			
			
This commit is contained in:
		@@ -151,10 +151,12 @@ function message_matches_search_term(message, operator, operand) {
 | 
				
			|||||||
function Filter(operators) {
 | 
					function Filter(operators) {
 | 
				
			||||||
    if (operators === undefined) {
 | 
					    if (operators === undefined) {
 | 
				
			||||||
        this._operators = [];
 | 
					        this._operators = [];
 | 
				
			||||||
        this._stream_params = undefined;
 | 
					        this._sub = undefined;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        this._operators = this.fix_operators(operators);
 | 
					        this._operators = this.fix_operators(operators);
 | 
				
			||||||
        this.fix_stream_params();
 | 
					        if (this.has_operator('stream')) {
 | 
				
			||||||
 | 
					            this._sub = stream_data.get_sub_by_name(this.operands('stream')[0]);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -480,7 +482,7 @@ Filter.prototype = {
 | 
				
			|||||||
        // this comes first because it has 3 term_types but is not a "complex filter"
 | 
					        // this comes first because it has 3 term_types but is not a "complex filter"
 | 
				
			||||||
        if (_.isEqual(term_types, ['stream', 'topic', 'search'])) {
 | 
					        if (_.isEqual(term_types, ['stream', 'topic', 'search'])) {
 | 
				
			||||||
            // if stream does not exist, redirect to All
 | 
					            // if stream does not exist, redirect to All
 | 
				
			||||||
            if (!this._stream_params) {
 | 
					            if (!this._sub) {
 | 
				
			||||||
                return "#";
 | 
					                return "#";
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return  '/#narrow/stream/' + stream_data.name_to_slug(this.operands('stream')[0]) + '/topic/' + this.operands('topic')[0];
 | 
					            return  '/#narrow/stream/' + stream_data.name_to_slug(this.operands('stream')[0]) + '/topic/' + this.operands('topic')[0];
 | 
				
			||||||
@@ -495,7 +497,7 @@ Filter.prototype = {
 | 
				
			|||||||
            switch (term_types[0]) {
 | 
					            switch (term_types[0]) {
 | 
				
			||||||
            case 'stream':
 | 
					            case 'stream':
 | 
				
			||||||
                // if stream does not exist, redirect to All
 | 
					                // if stream does not exist, redirect to All
 | 
				
			||||||
                if (!this._stream_params) {
 | 
					                if (!this._sub) {
 | 
				
			||||||
                    return "#";
 | 
					                    return "#";
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return  '/#narrow/stream/' + stream_data.name_to_slug(this.operands('stream')[0]);
 | 
					                return  '/#narrow/stream/' + stream_data.name_to_slug(this.operands('stream')[0]);
 | 
				
			||||||
@@ -520,27 +522,6 @@ Filter.prototype = {
 | 
				
			|||||||
        return "#"; // redirect to All
 | 
					        return "#"; // redirect to All
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fix_stream_params: function () {
 | 
					 | 
				
			||||||
        this._stream_params = this.get_stream_params();
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    get_stream_params: function () {
 | 
					 | 
				
			||||||
        // we return undefined when we are unable to get these parameters
 | 
					 | 
				
			||||||
        if (!this.has_operator('stream')) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        const stream_name_from_search = this.operands('stream')[0];
 | 
					 | 
				
			||||||
        const sub = stream_data.get_sub_by_name(stream_name_from_search);
 | 
					 | 
				
			||||||
        if (!sub) {
 | 
					 | 
				
			||||||
            return;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return {
 | 
					 | 
				
			||||||
            _stream_name: sub.name,
 | 
					 | 
				
			||||||
            _is_stream_private: sub.invite_only,
 | 
					 | 
				
			||||||
            _is_web_public: sub.is_web_public,
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    get_icon: function () {
 | 
					    get_icon: function () {
 | 
				
			||||||
        // We have special icons for the simple narrows available for the via sidebars.
 | 
					        // We have special icons for the simple narrows available for the via sidebars.
 | 
				
			||||||
        const term_types = this.sorted_term_types();
 | 
					        const term_types = this.sorted_term_types();
 | 
				
			||||||
@@ -549,13 +530,13 @@ Filter.prototype = {
 | 
				
			|||||||
        case 'in-all':
 | 
					        case 'in-all':
 | 
				
			||||||
            return 'home';
 | 
					            return 'home';
 | 
				
			||||||
        case 'stream':
 | 
					        case 'stream':
 | 
				
			||||||
            if (!this._stream_params) {
 | 
					            if (!this._sub) {
 | 
				
			||||||
                return 'question-circle-o';
 | 
					                return 'question-circle-o';
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (this._stream_params._is_stream_private) {
 | 
					            if (this._sub.invite_only) {
 | 
				
			||||||
                return 'lock';
 | 
					                return 'lock';
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (this._stream_params._is_web_public) {
 | 
					            if (this._sub.is_web_public) {
 | 
				
			||||||
                return 'globe';
 | 
					                return 'globe';
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return 'hashtag';
 | 
					            return 'hashtag';
 | 
				
			||||||
@@ -575,10 +556,10 @@ Filter.prototype = {
 | 
				
			|||||||
        const term_types = this.sorted_term_types();
 | 
					        const term_types = this.sorted_term_types();
 | 
				
			||||||
        if (term_types.length === 3 && _.isEqual(term_types, ['stream', 'topic', 'search']) ||
 | 
					        if (term_types.length === 3 && _.isEqual(term_types, ['stream', 'topic', 'search']) ||
 | 
				
			||||||
            term_types.length === 2 && _.isEqual(term_types, ['stream', 'topic'])) {
 | 
					            term_types.length === 2 && _.isEqual(term_types, ['stream', 'topic'])) {
 | 
				
			||||||
            if (!this._stream_params) {
 | 
					            if (!this._sub) {
 | 
				
			||||||
                return i18n.t('Unknown stream');
 | 
					                return i18n.t('Unknown stream');
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return this._stream_params._stream_name;
 | 
					            return this._sub.name;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (term_types.length === 1 || term_types.length === 2 && term_types[1] === 'search') {
 | 
					        if (term_types.length === 1 || term_types.length === 2 && term_types[1] === 'search') {
 | 
				
			||||||
            switch (term_types[0]) {
 | 
					            switch (term_types[0]) {
 | 
				
			||||||
@@ -589,10 +570,10 @@ Filter.prototype = {
 | 
				
			|||||||
            case 'streams-public':
 | 
					            case 'streams-public':
 | 
				
			||||||
                return i18n.t('Public stream messages in organization');
 | 
					                return i18n.t('Public stream messages in organization');
 | 
				
			||||||
            case 'stream':
 | 
					            case 'stream':
 | 
				
			||||||
                if (!this._stream_params) {
 | 
					                if (!this._sub) {
 | 
				
			||||||
                    return i18n.t('Unknown stream');
 | 
					                    return i18n.t('Unknown stream');
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                return this._stream_params._stream_name;
 | 
					                return this._sub.name;
 | 
				
			||||||
            case 'is-starred':
 | 
					            case 'is-starred':
 | 
				
			||||||
                return i18n.t('Starred messages');
 | 
					                return i18n.t('Starred messages');
 | 
				
			||||||
            case 'is-mentioned':
 | 
					            case 'is-mentioned':
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,20 +140,9 @@ exports.update_stream_name = function (sub, new_name) {
 | 
				
			|||||||
        compose_state.stream_name(new_name);
 | 
					        compose_state.stream_name(new_name);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update navbar stream name if needed
 | 
					    // Update navbar if needed
 | 
				
			||||||
    const filter = narrow_state.filter();
 | 
					    const filter = narrow_state.filter();
 | 
				
			||||||
    if (filter && filter.operands("stream")[0] === old_name) {
 | 
					    if (filter && filter._sub && filter._sub.stream_id === sub.stream_id) {
 | 
				
			||||||
        // This works, but it relies on `filter.fix_stream_params` masking
 | 
					 | 
				
			||||||
        // some bad behaviour in the Filter object. In particular, the fact
 | 
					 | 
				
			||||||
        // that the Filter object relies on the search box which doesn't
 | 
					 | 
				
			||||||
        // rename the currently focused stream.
 | 
					 | 
				
			||||||
        //
 | 
					 | 
				
			||||||
        // This will likely be improved as we migrate to using search pills
 | 
					 | 
				
			||||||
        // and then a stream ID based representation of the stream in Filter.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // update the stream_params stored in the filter object
 | 
					 | 
				
			||||||
        filter.fix_stream_params();
 | 
					 | 
				
			||||||
        // use these to update the navbar
 | 
					 | 
				
			||||||
        tab_bar.render_title_area();
 | 
					        tab_bar.render_title_area();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -171,7 +160,7 @@ exports.update_stream_description = function (sub, description, rendered_descrip
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Update navbar if needed
 | 
					    // Update navbar if needed
 | 
				
			||||||
    const filter = narrow_state.filter();
 | 
					    const filter = narrow_state.filter();
 | 
				
			||||||
    if (filter && filter.operands("stream")[0] === sub.name) {
 | 
					    if (filter && filter._sub && filter._sub.stream_id === sub.stream_id) {
 | 
				
			||||||
        tab_bar.render_title_area();
 | 
					        tab_bar.render_title_area();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -189,12 +178,9 @@ exports.update_stream_privacy = function (sub, values) {
 | 
				
			|||||||
    stream_ui_updates.update_add_subscriptions_elements(sub);
 | 
					    stream_ui_updates.update_add_subscriptions_elements(sub);
 | 
				
			||||||
    stream_list.redraw_stream_privacy(sub);
 | 
					    stream_list.redraw_stream_privacy(sub);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update navbar stream name if needed
 | 
					    // Update navbar if needed
 | 
				
			||||||
    const filter = narrow_state.filter();
 | 
					    const filter = narrow_state.filter();
 | 
				
			||||||
    if (filter && filter.operands("stream")[0] === sub.name) {
 | 
					    if (filter && filter._sub && filter._sub.stream_id === sub.stream_id) {
 | 
				
			||||||
        // update the stream_params stored in the filter object
 | 
					 | 
				
			||||||
        filter.fix_stream_params();
 | 
					 | 
				
			||||||
        // use these to update the navbar
 | 
					 | 
				
			||||||
        tab_bar.render_title_area();
 | 
					        tab_bar.render_title_area();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -49,9 +49,8 @@ function make_tab_data(filter) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
exports.colorize_tab_bar = function () {
 | 
					exports.colorize_tab_bar = function () {
 | 
				
			||||||
    const filter = narrow_state.filter();
 | 
					    const filter = narrow_state.filter();
 | 
				
			||||||
    if (filter === undefined || !filter.has_operator('stream') || !filter._stream_params) {return;}
 | 
					    if (filter === undefined || !filter._sub) {return;}
 | 
				
			||||||
    const color_for_stream = stream_data.get_color(filter._stream_params._stream_name);
 | 
					    $("#tab_list .stream > .fa").css('color', filter._sub.color);
 | 
				
			||||||
    $("#tab_list .stream > .fa").css('color', color_for_stream);
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function append_and_display_title_area(tab_bar_data) {
 | 
					function append_and_display_title_area(tab_bar_data) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user