mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-03 21:43:21 +00:00 
			
		
		
		
	Enable display of emoji as their alt codes in reactions.
This currently only supports this in emoji reactions, not in actual emoji in message bodies, but it's a great start for people who want a text-only view. Tweaked to update the text by tabbott. Fixes #3169.
This commit is contained in:
		
				
					committed by
					
						
						Tim Abbott
					
				
			
			
				
	
			
			
			
						parent
						
							2bbfdeeb7b
						
					
				
				
					commit
					4616ee7762
				
			@@ -343,6 +343,12 @@ var event_fixtures = {
 | 
			
		||||
        setting: true,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    update_display_settings__emoji_alt_code: {
 | 
			
		||||
        type: 'update_display_settings',
 | 
			
		||||
        setting_name: 'emoji_alt_code',
 | 
			
		||||
        setting: true,
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    update_display_settings__twenty_four_hour_time: {
 | 
			
		||||
        type: 'update_display_settings',
 | 
			
		||||
        setting_name: 'twenty_four_hour_time',
 | 
			
		||||
@@ -705,6 +711,11 @@ run(function (override) {
 | 
			
		||||
    dispatch(event);
 | 
			
		||||
    assert_same(page_params.twenty_four_hour_time, true);
 | 
			
		||||
 | 
			
		||||
    event = event_fixtures.update_display_settings__emoji_alt_code;
 | 
			
		||||
    page_params.emoji_alt_code = false;
 | 
			
		||||
    dispatch(event);
 | 
			
		||||
    assert_same(page_params.emoji_alt_code, true);
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
run(function (override, capture, args) {
 | 
			
		||||
 
 | 
			
		||||
@@ -127,6 +127,7 @@ exports.add_reaction = function (event) {
 | 
			
		||||
        }
 | 
			
		||||
        event.count = 1;
 | 
			
		||||
        event.title = new_title;
 | 
			
		||||
        event.emoji_alt_code = page_params.emoji_alt_code;
 | 
			
		||||
        if (event.user.id === page_params.user_id) {
 | 
			
		||||
            event.class = "message_reaction reacted";
 | 
			
		||||
        } else {
 | 
			
		||||
@@ -204,6 +205,7 @@ exports.get_message_reactions = function (message) {
 | 
			
		||||
            emoji_name_css_class: emoji.emoji_name_to_css_class(item[0]),
 | 
			
		||||
            count: item[1].length,
 | 
			
		||||
            title: generate_title(item[0], item[1]),
 | 
			
		||||
            emoji_alt_code: page_params.emoji_alt_code,
 | 
			
		||||
        };
 | 
			
		||||
        if (emoji.realm_emojis[reaction.emoji_name]) {
 | 
			
		||||
            reaction.is_realm_emoji = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -216,6 +216,14 @@ function dispatch_normal_event(event) {
 | 
			
		||||
                message_list.narrowed.rerender();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (event.setting_name === 'emoji_alt_code') {
 | 
			
		||||
            page_params.emoji_alt_code = event.setting;
 | 
			
		||||
            // 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.
 | 
			
		||||
 
 | 
			
		||||
@@ -502,6 +502,30 @@ function _setup_page() {
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $("#emoji_alt_code").change(function () {
 | 
			
		||||
        var emoji_alt_code = this.checked;
 | 
			
		||||
        var data = {};
 | 
			
		||||
        data.emoji_alt_code = JSON.stringify(emoji_alt_code);
 | 
			
		||||
        var context = {};
 | 
			
		||||
        if (data.emoji_alt_code === "true") {
 | 
			
		||||
            context.text_or_images = i18n.t('text');
 | 
			
		||||
        } else {
 | 
			
		||||
            context.text_or_images = i18n.t('images');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        channel.patch({
 | 
			
		||||
            url: '/json/settings/display',
 | 
			
		||||
            data: data,
 | 
			
		||||
            success: function () {
 | 
			
		||||
                ui.report_success(i18n.t("Emoji reactions will appear as __text_or_images__!", context),
 | 
			
		||||
                                  $('#display-settings-status').expectOne());
 | 
			
		||||
            },
 | 
			
		||||
            error: function (xhr) {
 | 
			
		||||
                ui.report_error(i18n.t("Error updating emoji appearance setting"), xhr, $('#display-settings-status').expectOne());
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $("#twenty_four_hour_time").change(function () {
 | 
			
		||||
        var data = {};
 | 
			
		||||
        var setting_value = $("#twenty_four_hour_time").is(":checked");
 | 
			
		||||
@@ -938,6 +962,7 @@ function _setup_page() {
 | 
			
		||||
function _update_page() {
 | 
			
		||||
    $("#twenty_four_hour_time").prop('checked', page_params.twenty_four_hour_time);
 | 
			
		||||
    $("#left_side_userlist").prop('checked', page_params.left_side_userlist);
 | 
			
		||||
    $("#emoji_alt_code").prop('checked', page_params.emoji_alt_code);
 | 
			
		||||
    $("#default_language_name").text(page_params.default_language_name);
 | 
			
		||||
 | 
			
		||||
    $("#enable_stream_desktop_notifications").prop('checked', page_params.stream_desktop_notifications_enabled);
 | 
			
		||||
 
 | 
			
		||||
@@ -161,3 +161,14 @@
 | 
			
		||||
    background-color: #eef7fa;
 | 
			
		||||
    border-color: #add8e6;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.emoji_alt_code {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    top: 4px;
 | 
			
		||||
    font-size: 0.8em;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    vertical-align: top;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    margin: 0px 1px 0px 0px;
 | 
			
		||||
    line-height: 1em;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,12 @@
 | 
			
		||||
<div class="{{this.class}}" title="{{this.title}}" data-emoji-name="{{this.emoji_name}}">
 | 
			
		||||
  {{#if this.is_realm_emoji}}
 | 
			
		||||
    <img src="{{this.url}}" class="emoji" />
 | 
			
		||||
  {{#if this.emoji_alt_code}}
 | 
			
		||||
    <div class="emoji_alt_code"> :{{this.emoji_name}}:</div>
 | 
			
		||||
  {{else}}
 | 
			
		||||
    <div class="emoji emoji-{{this.emoji_name_css_class}}" />
 | 
			
		||||
    {{#if this.is_realm_emoji}}
 | 
			
		||||
      <img src="{{this.url}}" class="emoji" />
 | 
			
		||||
    {{else}}
 | 
			
		||||
      <div class="emoji emoji-{{this.emoji_name_css_class}}" />
 | 
			
		||||
    {{/if}}
 | 
			
		||||
  {{/if}}
 | 
			
		||||
  <div class="message_reaction_count">{{this.count}}</div>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
@@ -71,6 +71,17 @@
 | 
			
		||||
        <label for="left_side_userlist" class="inline-block">{{t "Display user list on left side in narrow windows." }}</label>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="input-group">
 | 
			
		||||
      <label class="checkbox">
 | 
			
		||||
        <input type="checkbox" name="emoji_alt_code" id="emoji_alt_code"
 | 
			
		||||
        {{#if page_params.emoji_alt_code}}
 | 
			
		||||
          checked="checked"
 | 
			
		||||
        {{/if}} />
 | 
			
		||||
        <span></span>
 | 
			
		||||
      </label>
 | 
			
		||||
        <label for="emoji_alt_code" class="inline-block">{{t 'Display emoji reactions as text (:heart: instead of <img alt=":heart:" class="emoji" src="/static/generated/emoji/images/emoji/unicode/2764.png" title=":heart:"/>).' }}</label>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="input-group">
 | 
			
		||||
      <label class="checkbox">
 | 
			
		||||
        <input type="checkbox" name="twenty_four_hour_time" id="twenty_four_hour_time"
 | 
			
		||||
 
 | 
			
		||||
@@ -2377,6 +2377,18 @@ def do_change_left_side_userlist(user_profile, setting_value, log=True):
 | 
			
		||||
        log_event(event)
 | 
			
		||||
    send_event(event, [user_profile.id])
 | 
			
		||||
 | 
			
		||||
def do_change_emoji_alt_code(user_profile, setting_value, log=True):
 | 
			
		||||
    # type: (UserProfile, bool, bool) -> None
 | 
			
		||||
    user_profile.emoji_alt_code = setting_value
 | 
			
		||||
    user_profile.save(update_fields=["emoji_alt_code"])
 | 
			
		||||
    event = {'type': 'update_display_settings',
 | 
			
		||||
             'user': user_profile.email,
 | 
			
		||||
             'setting_name': 'emoji_alt_code',
 | 
			
		||||
             'setting': setting_value}
 | 
			
		||||
    if log:
 | 
			
		||||
        log_event(event)
 | 
			
		||||
    send_event(event, [user_profile.id])
 | 
			
		||||
 | 
			
		||||
def do_change_default_language(user_profile, setting_value, log=True):
 | 
			
		||||
    # type: (UserProfile, Text, bool) -> None
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -148,6 +148,7 @@ def fetch_initial_state_data(user_profile, event_types, queue_id,
 | 
			
		||||
    if want('update_display_settings'):
 | 
			
		||||
        state['twenty_four_hour_time'] = user_profile.twenty_four_hour_time
 | 
			
		||||
        state['left_side_userlist'] = user_profile.left_side_userlist
 | 
			
		||||
        state['emoji_alt_code'] = user_profile.emoji_alt_code
 | 
			
		||||
 | 
			
		||||
        default_language = user_profile.default_language
 | 
			
		||||
        state['default_language'] = default_language
 | 
			
		||||
@@ -374,6 +375,8 @@ def apply_event(state, event, user_profile, include_subscribers):
 | 
			
		||||
            state['twenty_four_hour_time'] = event["setting"]
 | 
			
		||||
        if event['setting_name'] == 'left_side_userlist':
 | 
			
		||||
            state['left_side_userlist'] = event["setting"]
 | 
			
		||||
        if event['setting_name'] == 'emoji_alt_code':
 | 
			
		||||
            state['emoji_alt_code'] = event["setting"]
 | 
			
		||||
    elif event['type'] == "update_global_notifications":
 | 
			
		||||
        if event['notification_name'] == "enable_stream_desktop_notifications":
 | 
			
		||||
            state['enable_stream_desktop_notifications'] = event['setting']
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								zerver/migrations/0056_userprofile_emoji_alt_code.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								zerver/migrations/0056_userprofile_emoji_alt_code.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
# -*- coding: utf-8 -*-
 | 
			
		||||
# Generated by Django 1.10.5 on 2017-03-02 07:28
 | 
			
		||||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('zerver', '0055_attachment_size'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.AddField(
 | 
			
		||||
            model_name='userprofile',
 | 
			
		||||
            name='emoji_alt_code',
 | 
			
		||||
            field=models.BooleanField(default=False),
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
@@ -566,6 +566,7 @@ class UserProfile(ModelReprMixin, AbstractBaseUser, PermissionsMixin):
 | 
			
		||||
    enter_sends = models.NullBooleanField(default=False) # type: Optional[bool]
 | 
			
		||||
    autoscroll_forever = models.BooleanField(default=False) # type: bool
 | 
			
		||||
    left_side_userlist = models.BooleanField(default=False) # type: bool
 | 
			
		||||
    emoji_alt_code = models.BooleanField(default=False) # type: bool
 | 
			
		||||
 | 
			
		||||
    # display settings
 | 
			
		||||
    twenty_four_hour_time = models.BooleanField(default=False) # type: bool
 | 
			
		||||
 
 | 
			
		||||
@@ -52,6 +52,7 @@ from zerver.lib.actions import (
 | 
			
		||||
    do_update_pointer,
 | 
			
		||||
    do_change_twenty_four_hour_time,
 | 
			
		||||
    do_change_left_side_userlist,
 | 
			
		||||
    do_change_emoji_alt_code,
 | 
			
		||||
    do_change_enable_stream_desktop_notifications,
 | 
			
		||||
    do_change_enable_stream_sounds,
 | 
			
		||||
    do_change_enable_desktop_notifications,
 | 
			
		||||
@@ -717,6 +718,20 @@ class EventsRegisterTest(ZulipTestCase):
 | 
			
		||||
            error = schema_checker('events[0]', events[0])
 | 
			
		||||
            self.assert_on_error(error)
 | 
			
		||||
 | 
			
		||||
    def test_change_emoji_alt_code(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        schema_checker = check_dict([
 | 
			
		||||
            ('type', equals('update_display_settings')),
 | 
			
		||||
            ('setting_name', equals('emoji_alt_code')),
 | 
			
		||||
            ('user', check_string),
 | 
			
		||||
            ('setting', check_bool),
 | 
			
		||||
        ])
 | 
			
		||||
        do_change_emoji_alt_code(self.user_profile, False)
 | 
			
		||||
        for setting_value in [True, False]:
 | 
			
		||||
            events = self.do_test(lambda: do_change_emoji_alt_code(self.user_profile, setting_value))
 | 
			
		||||
            error = schema_checker('events[0]', events[0])
 | 
			
		||||
            self.assert_on_error(error)
 | 
			
		||||
 | 
			
		||||
    def test_change_enable_stream_desktop_notifications(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        schema_checker = check_dict([
 | 
			
		||||
 
 | 
			
		||||
@@ -1730,6 +1730,10 @@ class ChangeSettingsTest(ZulipTestCase):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        self.check_for_toggle_param_patch("/json/settings/display", "left_side_userlist")
 | 
			
		||||
 | 
			
		||||
    def test_toggling_emoji_alt_code(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        self.check_for_toggle_param_patch("/json/settings/display", "emoji_alt_code")
 | 
			
		||||
 | 
			
		||||
    def test_time_setting(self):
 | 
			
		||||
        # type: () -> None
 | 
			
		||||
        self.check_for_toggle_param_patch("/json/settings/display", "twenty_four_hour_time")
 | 
			
		||||
@@ -1953,6 +1957,7 @@ class HomeTest(ZulipTestCase):
 | 
			
		||||
            "domain",
 | 
			
		||||
            "domains",
 | 
			
		||||
            "email",
 | 
			
		||||
            "emoji_alt_code",
 | 
			
		||||
            "enable_digest_emails",
 | 
			
		||||
            "enable_offline_email_notifications",
 | 
			
		||||
            "enable_offline_push_notifications",
 | 
			
		||||
 
 | 
			
		||||
@@ -283,6 +283,7 @@ def home_real(request):
 | 
			
		||||
        'alert_words',
 | 
			
		||||
        'attachments',
 | 
			
		||||
        'default_language',
 | 
			
		||||
        'emoji_alt_code',
 | 
			
		||||
        'last_event_id',
 | 
			
		||||
        'left_side_userlist',
 | 
			
		||||
        'max_message_id',
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ from zerver.lib.actions import do_change_password, \
 | 
			
		||||
    do_change_default_desktop_notifications, do_change_autoscroll_forever, \
 | 
			
		||||
    do_change_enable_stream_desktop_notifications, do_change_enable_stream_sounds, \
 | 
			
		||||
    do_regenerate_api_key, do_change_avatar_fields, do_change_twenty_four_hour_time, \
 | 
			
		||||
    do_change_left_side_userlist, do_change_default_language, \
 | 
			
		||||
    do_change_left_side_userlist, do_change_emoji_alt_code, do_change_default_language, \
 | 
			
		||||
    do_change_pm_content_in_desktop_notifications, validate_email, \
 | 
			
		||||
    do_change_user_email, do_start_email_change_process
 | 
			
		||||
from zerver.lib.avatar import avatar_url
 | 
			
		||||
@@ -149,8 +149,9 @@ def json_change_settings(request, user_profile,
 | 
			
		||||
def update_display_settings_backend(request, user_profile,
 | 
			
		||||
                                    twenty_four_hour_time=REQ(validator=check_bool, default=None),
 | 
			
		||||
                                    default_language=REQ(validator=check_string, default=None),
 | 
			
		||||
                                    left_side_userlist=REQ(validator=check_bool, default=None)):
 | 
			
		||||
    # type: (HttpRequest, UserProfile, Optional[bool], Optional[str], Optional[bool]) -> HttpResponse
 | 
			
		||||
                                    left_side_userlist=REQ(validator=check_bool, default=None),
 | 
			
		||||
                                    emoji_alt_code=REQ(validator=check_bool, default=None)):
 | 
			
		||||
    # type: (HttpRequest, UserProfile, Optional[bool], Optional[str], Optional[bool], Optional[bool]) -> HttpResponse
 | 
			
		||||
    if (default_language is not None and
 | 
			
		||||
            default_language not in get_available_language_codes()):
 | 
			
		||||
        raise JsonableError(_("Invalid language '%s'" % (default_language,)))
 | 
			
		||||
@@ -171,6 +172,11 @@ def update_display_settings_backend(request, user_profile,
 | 
			
		||||
        do_change_left_side_userlist(user_profile, left_side_userlist)
 | 
			
		||||
        result['left_side_userlist'] = left_side_userlist
 | 
			
		||||
 | 
			
		||||
    elif (emoji_alt_code is not None and
 | 
			
		||||
            user_profile.emoji_alt_code != emoji_alt_code):
 | 
			
		||||
        do_change_emoji_alt_code(user_profile, emoji_alt_code)
 | 
			
		||||
        result['emoji_alt_code'] = emoji_alt_code
 | 
			
		||||
 | 
			
		||||
    return json_success(result)
 | 
			
		||||
 | 
			
		||||
@has_request_variables
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user