mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	This adds custom CSS through JavaScript for things that do not scope well and will override other inherited styles. This should ONLY be used for problematic CSS that has no obvious or easy CSS-only solution. (Specifically, we need this for the "default link" styling, which is hard to override because we don't want to start winning ties due to specificity that we would not have won in the light theme).
		
			
				
	
	
		
			382 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			382 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var server_events_dispatch = (function () {
 | 
						|
 | 
						|
var exports = {};
 | 
						|
 | 
						|
exports.dispatch_normal_event = function dispatch_normal_event(event) {
 | 
						|
    var noop = function () {};
 | 
						|
    switch (event.type) {
 | 
						|
    case 'alert_words':
 | 
						|
        alert_words.words = event.alert_words;
 | 
						|
        alert_words_ui.render_alert_words_ui();
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'default_streams':
 | 
						|
        stream_data.set_realm_default_streams(event.default_streams);
 | 
						|
        settings_streams.update_default_streams_table();
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'hotspots':
 | 
						|
        hotspots.load_new(event.hotspots);
 | 
						|
        page_params.hotspots = page_params.hotspots ?
 | 
						|
            page_params.hotspots.concat(event.hotspots) :
 | 
						|
            event.hotspots;
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'muted_topics':
 | 
						|
        muting_ui.handle_updates(event.muted_topics);
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'presence':
 | 
						|
        activity.set_user_status(event.email, event.presence, event.server_timestamp);
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'restart':
 | 
						|
        var reload_options = {save_pointer: true,
 | 
						|
                              save_narrow: true,
 | 
						|
                              save_compose: true,
 | 
						|
                              message: "The application has been updated; reloading!",
 | 
						|
                             };
 | 
						|
        if (event.immediate) {
 | 
						|
            reload_options.immediate = true;
 | 
						|
        }
 | 
						|
        reload.initiate(reload_options);
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'reaction':
 | 
						|
        if (event.op === 'add') {
 | 
						|
            reactions.add_reaction(event);
 | 
						|
        } else if (event.op === 'remove') {
 | 
						|
            reactions.remove_reaction(event);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'realm':
 | 
						|
        var realm_settings = {
 | 
						|
            add_emoji_by_admins_only: settings_emoji.update_custom_emoji_ui,
 | 
						|
            allow_edit_history: noop,
 | 
						|
            allow_message_deleting: noop,
 | 
						|
            allow_message_editing: noop,
 | 
						|
            create_stream_by_admins_only: noop,
 | 
						|
            default_language: settings_org.reset_realm_default_language,
 | 
						|
            description: settings_org.update_realm_description,
 | 
						|
            email_changes_disabled: settings_org.toggle_email_change_display,
 | 
						|
            inline_image_preview: noop,
 | 
						|
            inline_url_embed_preview: noop,
 | 
						|
            invite_by_admins_only: noop,
 | 
						|
            invite_required: noop,
 | 
						|
            mandatory_topics: noop,
 | 
						|
            message_retention_days: settings_org.update_message_retention_days,
 | 
						|
            name: notifications.redraw_title,
 | 
						|
            name_changes_disabled: settings_org.toggle_name_change_display,
 | 
						|
            notifications_stream_id: noop,
 | 
						|
            signup_notifications_stream_id: noop,
 | 
						|
            restricted_to_domain: noop,
 | 
						|
            waiting_period_threshold: noop,
 | 
						|
        };
 | 
						|
        if (event.op === 'update' && _.has(realm_settings, event.property)) {
 | 
						|
            page_params['realm_' + event.property] = event.value;
 | 
						|
            realm_settings[event.property]();
 | 
						|
            if (event.property === 'create_stream_by_admins_only') {
 | 
						|
                if (!page_params.is_admin) {
 | 
						|
                    page_params.can_create_streams = (!page_params.
 | 
						|
                                                        realm_create_stream_by_admins_only);
 | 
						|
                }
 | 
						|
            } else if (event.property === 'notifications_stream_id') {
 | 
						|
                settings_org.render_notifications_stream_ui(
 | 
						|
                    page_params.realm_notifications_stream_id);
 | 
						|
            } else if (event.property === 'signup_notifications_stream_id') {
 | 
						|
                settings_org.render_signup_notifications_stream_ui(
 | 
						|
                    page_params.realm_signup_notifications_stream_id);
 | 
						|
            }
 | 
						|
        } else if (event.op === 'update_dict' && event.property === 'default') {
 | 
						|
            _.each(event.data, function (value, key) {
 | 
						|
                page_params['realm_' + key] = value;
 | 
						|
                if (key === 'allow_message_editing') {
 | 
						|
                    settings_org.toggle_allow_message_editing_pencil();
 | 
						|
                }
 | 
						|
            });
 | 
						|
            if (event.data.authentication_methods !== undefined) {
 | 
						|
                settings_org.populate_auth_methods(event.data.authentication_methods);
 | 
						|
            }
 | 
						|
        } else if (event.op === 'update_dict' && event.property === 'icon') {
 | 
						|
            page_params.realm_icon_url = event.data.icon_url;
 | 
						|
            page_params.realm_icon_source = event.data.icon_source;
 | 
						|
            realm_icon.rerender();
 | 
						|
        }
 | 
						|
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'realm_bot':
 | 
						|
        if (event.op === 'add') {
 | 
						|
            bot_data.add(event.bot);
 | 
						|
            settings_users.update_user_data(event.bot.user_id, event.bot);
 | 
						|
        } else if (event.op === 'remove') {
 | 
						|
            bot_data.deactivate(event.bot.email);
 | 
						|
            event.bot.is_active = false;
 | 
						|
            settings_users.update_user_data(event.bot.user_id, event.bot);
 | 
						|
        } else if (event.op === 'update') {
 | 
						|
            if (_.has(event.bot, 'owner_id')) {
 | 
						|
                event.bot.owner = people.get_person_from_user_id(event.bot.owner_id).email;
 | 
						|
            }
 | 
						|
            bot_data.update(event.bot.email, event.bot);
 | 
						|
            settings_users.update_user_data(event.bot.user_id, event.bot);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'realm_emoji':
 | 
						|
        // Update `page_params.realm_emoji` so that settings page
 | 
						|
        // can display it properly when reopened without refresh.
 | 
						|
        page_params.realm_emoji = event.realm_emoji;
 | 
						|
        emoji.update_emojis(event.realm_emoji);
 | 
						|
        settings_emoji.populate_emoji(event.realm_emoji);
 | 
						|
        emoji_picker.generate_emoji_picker_data(emoji.active_realm_emojis);
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'realm_filters':
 | 
						|
        page_params.realm_filters = event.realm_filters;
 | 
						|
        markdown.set_realm_filters(page_params.realm_filters);
 | 
						|
        settings_filters.populate_filters(page_params.realm_filters);
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'realm_domains':
 | 
						|
        var i;
 | 
						|
        if (event.op === 'add') {
 | 
						|
            page_params.realm_domains.push(event.realm_domain);
 | 
						|
        } else if (event.op === 'change') {
 | 
						|
            for (i = 0; i < page_params.realm_domains.length; i += 1) {
 | 
						|
                if (page_params.realm_domains[i].domain === event.realm_domain.domain) {
 | 
						|
                    page_params.realm_domains[i].allow_subdomains =
 | 
						|
                        event.realm_domain.allow_subdomains;
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        } else if (event.op === 'remove') {
 | 
						|
            for (i = 0; i < page_params.realm_domains.length; i += 1) {
 | 
						|
                if (page_params.realm_domains[i].domain === event.domain) {
 | 
						|
                    page_params.realm_domains.splice(i, 1);
 | 
						|
                    break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        settings_org.populate_realm_domains(page_params.realm_domains);
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'realm_user':
 | 
						|
        if (event.op === 'add') {
 | 
						|
            people.add_in_realm(event.person);
 | 
						|
        } else if (event.op === 'remove') {
 | 
						|
            people.deactivate(event.person);
 | 
						|
        } else if (event.op === 'update') {
 | 
						|
            user_events.update_person(event.person);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'stream':
 | 
						|
        if (event.op === 'update') {
 | 
						|
            // Legacy: Stream properties are still managed by subs.js on the client side.
 | 
						|
            stream_events.update_property(
 | 
						|
                event.stream_id,
 | 
						|
                event.property,
 | 
						|
                event.value
 | 
						|
            );
 | 
						|
            settings_streams.update_default_streams_table();
 | 
						|
        } else if (event.op === 'create') {
 | 
						|
            stream_data.create_streams(event.streams);
 | 
						|
        } else if (event.op === 'delete') {
 | 
						|
            _.each(event.streams, function (stream) {
 | 
						|
                var was_subscribed = stream_data.get_sub_by_id(stream.stream_id).subscribed;
 | 
						|
                stream_data.delete_sub(stream.stream_id);
 | 
						|
                subs.remove_stream(stream.stream_id);
 | 
						|
                if (was_subscribed) {
 | 
						|
                    stream_list.remove_sidebar_row(stream.stream_id);
 | 
						|
                }
 | 
						|
                settings_streams.remove_default_stream(stream.stream_id);
 | 
						|
                stream_data.remove_default_stream(stream.stream_id);
 | 
						|
                if (page_params.realm_notifications_stream_id === stream.stream_id) {
 | 
						|
                    page_params.realm_notifications_stream_id = -1;
 | 
						|
                    settings_org.render_notifications_stream_ui(
 | 
						|
                        page_params.realm_notifications_stream_id);
 | 
						|
                }
 | 
						|
                if (page_params.realm_signup_notifications_stream_id === stream.stream_id) {
 | 
						|
                    page_params.realm_signup_notifications_stream_id = -1;
 | 
						|
                    settings_org.render_signup_notifications_stream_ui(
 | 
						|
                        page_params.realm_signup_notifications_stream_id);
 | 
						|
                }
 | 
						|
            });
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'subscription':
 | 
						|
        var person;
 | 
						|
        var email;
 | 
						|
 | 
						|
        if (event.op === 'add') {
 | 
						|
            _.each(event.subscriptions, function (rec) {
 | 
						|
                var sub = stream_data.get_sub_by_id(rec.stream_id);
 | 
						|
                if (sub) {
 | 
						|
                    stream_events.mark_subscribed(sub, rec.subscribers);
 | 
						|
                } else {
 | 
						|
                    blueslip.error('Subscribing to unknown stream with ID ' + rec.stream_id);
 | 
						|
                }
 | 
						|
            });
 | 
						|
        } else if (event.op === 'peer_add') {
 | 
						|
            // TODO: remove email shim here and fix called functions
 | 
						|
            //       to use user_ids
 | 
						|
            person = people.get_person_from_user_id(event.user_id);
 | 
						|
            email = person.email;
 | 
						|
            _.each(event.subscriptions, function (sub) {
 | 
						|
                if (stream_data.add_subscriber(sub, event.user_id)) {
 | 
						|
                    $(document).trigger(
 | 
						|
                        'peer_subscribe.zulip',
 | 
						|
                        {stream_name: sub, user_email: email});
 | 
						|
                } else {
 | 
						|
                    blueslip.warn('Cannot process peer_add event');
 | 
						|
                }
 | 
						|
            });
 | 
						|
        } else if (event.op === 'peer_remove') {
 | 
						|
            // TODO: remove email shim here and fix called functions
 | 
						|
            //       to use user_ids
 | 
						|
            person = people.get_person_from_user_id(event.user_id);
 | 
						|
            email = person.email;
 | 
						|
            _.each(event.subscriptions, function (sub) {
 | 
						|
                if (stream_data.remove_subscriber(sub, event.user_id)) {
 | 
						|
                    $(document).trigger(
 | 
						|
                        'peer_unsubscribe.zulip',
 | 
						|
                        {stream_name: sub, user_email: email});
 | 
						|
                } else {
 | 
						|
                    blueslip.warn('Cannot process peer_remove event.');
 | 
						|
                }
 | 
						|
            });
 | 
						|
        } else if (event.op === 'remove') {
 | 
						|
            _.each(event.subscriptions, function (rec) {
 | 
						|
                var sub = stream_data.get_sub_by_id(rec.stream_id);
 | 
						|
                stream_events.mark_unsubscribed(sub);
 | 
						|
            });
 | 
						|
        } else if (event.op === 'update') {
 | 
						|
            stream_events.update_property(
 | 
						|
                event.stream_id,
 | 
						|
                event.property,
 | 
						|
                event.value
 | 
						|
            );
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'typing':
 | 
						|
        if (event.sender.user_id === page_params.user_id) {
 | 
						|
            // typing notifications are sent to the user who is typing
 | 
						|
            // as well as recipients; we ignore such self-generated events.
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (event.op === 'start') {
 | 
						|
            typing_events.display_notification(event);
 | 
						|
        } else if (event.op === 'stop') {
 | 
						|
            typing_events.hide_notification(event);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'update_display_settings':
 | 
						|
        var user_display_settings = [
 | 
						|
            'default_language',
 | 
						|
            'emoji_alt_code',
 | 
						|
            'emojiset',
 | 
						|
            'high_contrast_mode',
 | 
						|
            'night_mode',
 | 
						|
            'left_side_userlist',
 | 
						|
            'timezone',
 | 
						|
            'twenty_four_hour_time',
 | 
						|
        ];
 | 
						|
        if (_.contains(user_display_settings, event.setting_name)) {
 | 
						|
            page_params[event.setting_name] = event.setting;
 | 
						|
        }
 | 
						|
        if (event.setting_name === 'twenty_four_hour_time') {
 | 
						|
            // Rerender the whole message list UI
 | 
						|
            home_msg_list.rerender();
 | 
						|
            if (current_msg_list === message_list.narrowed) {
 | 
						|
                message_list.narrowed.rerender();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (event.setting_name === 'high_contrast_mode') {
 | 
						|
            $("body").toggleClass("high-contrast");
 | 
						|
        }
 | 
						|
        if (event.setting_name === 'night_mode') {
 | 
						|
            $("body").fadeOut(300);
 | 
						|
            setTimeout(function () {
 | 
						|
                if (event.setting === true) {
 | 
						|
                    night_mode.enable();
 | 
						|
                } else {
 | 
						|
                    night_mode.disable();
 | 
						|
                }
 | 
						|
                $("body").fadeIn(300);
 | 
						|
            }, 300);
 | 
						|
        }
 | 
						|
        if (event.setting_name === 'emoji_alt_code') {
 | 
						|
            // Rerender the whole message list UI
 | 
						|
            home_msg_list.rerender();
 | 
						|
            if (current_msg_list === message_list.narrowed) {
 | 
						|
                message_list.narrowed.rerender();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        if (event.setting_name === 'left_side_userlist') {
 | 
						|
            // TODO: Make this change the view immediately rather
 | 
						|
            // than requiring a reload or page resize.
 | 
						|
        }
 | 
						|
        if (event.setting_name === 'default_language') {
 | 
						|
            // TODO: Make this change the view immediately rather
 | 
						|
            // than requiring a reload or page resize.
 | 
						|
        }
 | 
						|
        if (event.setting_name === 'emojiset') {
 | 
						|
            var sprite = new Image();
 | 
						|
            sprite.onload = function () {
 | 
						|
                $("#emoji-spritesheet").attr('href', "/static/generated/emoji/" + page_params.emojiset + "_sprite.css");
 | 
						|
                if ($("#display-settings-status").length) {
 | 
						|
                    loading.destroy_indicator($("#emojiset_spinner"));
 | 
						|
                    $("#emojiset_select").val(page_params.emojiset);
 | 
						|
                    ui_report.success(i18n.t("Emojiset changed successfully!!"),
 | 
						|
                                      $('#display-settings-status').expectOne());
 | 
						|
                }
 | 
						|
            };
 | 
						|
            sprite.src = "/static/generated/emoji/sheet_" + page_params.emojiset + "_32.png";
 | 
						|
        }
 | 
						|
        if ($("#settings.tab-pane.active").length) {
 | 
						|
            settings_display.update_page();
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'update_global_notifications':
 | 
						|
        notifications.handle_global_notification_updates(event.notification_name,
 | 
						|
                                                         event.setting);
 | 
						|
        if ($("#settings.tab-pane.active").length) {
 | 
						|
            settings_notifications.update_page();
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'update_message_flags':
 | 
						|
        var new_value = event.operation === "add";
 | 
						|
        switch (event.flag) {
 | 
						|
        case 'starred':
 | 
						|
            _.each(event.messages, function (message_id) {
 | 
						|
                ui.update_starred(message_id, new_value);
 | 
						|
            });
 | 
						|
            break;
 | 
						|
        case 'read':
 | 
						|
            unread_ops.process_read_messages_event(event.messages);
 | 
						|
            break;
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
    case 'delete_message':
 | 
						|
        var msg_id = event.message_id;
 | 
						|
        ui.remove_message(msg_id);
 | 
						|
        break;
 | 
						|
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
return exports;
 | 
						|
 | 
						|
}());
 | 
						|
if (typeof module !== 'undefined') {
 | 
						|
    module.exports = server_events_dispatch;
 | 
						|
}
 |