diff --git a/static/js/message_list_view.js b/static/js/message_list_view.js index edf7633bd1..06341b6e78 100644 --- a/static/js/message_list_view.js +++ b/static/js/message_list_view.js @@ -156,7 +156,17 @@ MessageListView.prototype = { finish_summary(); } - if (list.is_summarized_message(message)) { + var summary_adjective; + + if (!_.contains(message.flags, 'force_expand')) { + if (muting.is_topic_muted(message.stream, message.subject)) { + summary_adjective = 'muted'; + } else if (list.is_summarized_message(message)) { + summary_adjective = 'read'; + } + } + + if (summary_adjective) { if (prev) { prev.include_footer = true; } @@ -176,6 +186,7 @@ MessageListView.prototype = { include_footer: false, include_bookend: false, first_message_id: message.id, + summary_adjective: summary_adjective, messages: [message] }); } else { @@ -248,14 +259,15 @@ MessageListView.prototype = { if (prev) { prev.include_footer = true; } - if (messages_to_render.length === 0) { - return; - } if (has_summary) { finish_summary(); } + if (messages_to_render.length === 0) { + return; + } + if (current_group.length > 0) { new_message_groups.push(current_group); } diff --git a/static/js/muting.js b/static/js/muting.js new file mode 100644 index 0000000000..cb3d956192 --- /dev/null +++ b/static/js/muting.js @@ -0,0 +1,28 @@ +var muting = (function () { + +var exports = {}; + +var muted_topics = new Dict(); + +exports.mute_topic = function (stream, topic) { + var sub_dict = muted_topics.get(stream); + if (!sub_dict) { + sub_dict = new Dict(); + muted_topics.set(stream, sub_dict); + } + sub_dict.set(topic, true); +}; + +exports.is_topic_muted = function (stream, topic) { + if (page_params.domain === 'zulip.com' && topic === 'muted') { + return true; + } + var sub_dict = muted_topics.get(stream); + return sub_dict && sub_dict.get(topic); +}; + +return exports; +}()); +if (typeof module !== 'undefined') { + module.exports = muting; +} diff --git a/static/js/ui.js b/static/js/ui.js index 6f2a90eaae..83dbe4fb01 100644 --- a/static/js/ui.js +++ b/static/js/ui.js @@ -718,17 +718,11 @@ exports.expand_summary_row = function (row) { return all_msg_list.get(id); }); - function remove_flag(flag) { - _.each(messages, function (msg){ - msg.flags = _.without(msg.flags, flag); - }); - update_message_flag(messages, flag, false); - } + _.each(messages, function (msg){ + msg.flags.push('force_expand'); + }); + update_message_flag(messages, 'force_expand', true); - remove_flag('summarize_in_stream'); - if (!narrow.active()) { - remove_flag('summarize_in_home'); - } //TODO: Avoid a full re-render home_msg_list.rerender(); diff --git a/static/templates/message.handlebars b/static/templates/message.handlebars index 7e36b7451b..d4282ff0eb 100644 --- a/static/templates/message.handlebars +++ b/static/templates/message.handlebars @@ -37,9 +37,9 @@
diff --git a/tools/jslint/check-all.js b/tools/jslint/check-all.js index ae2f5cbffc..2b22fb7dce 100644 --- a/tools/jslint/check-all.js +++ b/tools/jslint/check-all.js @@ -26,7 +26,7 @@ var globals = + ' invite ui util activity timerender MessageList MessageListView blueslip unread stream_list' + ' onboarding message_edit tab_bar emoji popovers navigate message_tour' + ' avatar feature_flags search_suggestion referral stream_color Dict' - + ' Filter summary admin stream_data' + + ' Filter summary admin stream_data muting' // colorspace.js + ' colorspace' diff --git a/zerver/models.py b/zerver/models.py index 7508f04a97..2df795fc5d 100644 --- a/zerver/models.py +++ b/zerver/models.py @@ -508,7 +508,7 @@ class UserMessage(models.Model): # on later archived = models.BooleanField() ALL_FLAGS = ['read', 'starred', 'collapsed', 'mentioned', 'wildcard_mentioned', - 'summarize_in_home', 'summarize_in_stream'] + 'summarize_in_home', 'summarize_in_stream', 'force_expand'] flags = BitField(flags=ALL_FLAGS, default=0) class Meta: diff --git a/zerver/tests/frontend/node/muting.js b/zerver/tests/frontend/node/muting.js new file mode 100644 index 0000000000..2eb768eb58 --- /dev/null +++ b/zerver/tests/frontend/node/muting.js @@ -0,0 +1,19 @@ +var assert = require('assert'); + +add_dependencies({ + _: 'third/underscore/underscore.js', + Dict: 'js/dict.js' +}); + +set_global('page_params', { + domain: 'zulip.com' +}); + +var muting = require('js/muting.js'); + +(function test_basics() { + assert(!muting.is_topic_muted('devel', 'java')); + muting.mute_topic('devel', 'java'); + assert(muting.is_topic_muted('devel', 'java')); + assert(muting.is_topic_muted('whatever', 'muted')); +}()); diff --git a/zproject/settings.py b/zproject/settings.py index 86a81562ea..aa9ec14cca 100644 --- a/zproject/settings.py +++ b/zproject/settings.py @@ -365,6 +365,7 @@ JS_SPECS = { 'js/summary.js', 'js/util.js', 'js/dict.js', + 'js/muting.js', 'js/setup.js', 'js/viewport.js', 'js/rows.js',