diff --git a/src/pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html b/src/pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html index 95cddb600b..b715843bda 100644 --- a/src/pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html +++ b/src/pretix/control/templates/pretixcontrol/event/mail_settings_fragment.html @@ -36,7 +36,7 @@
{% for l in request.event.settings.locales %} -

+                                        
{% endfor %}
diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 449976ae55..33be8d9619 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -5,6 +5,7 @@ from datetime import timedelta from decimal import Decimal from urllib.parse import urlsplit +import bleach from django.conf import settings from django.contrib import messages from django.contrib.contenttypes.models import ContentType @@ -38,6 +39,7 @@ from pretix.base.services import tickets from pretix.base.services.invoices import build_preview_invoice_pdf from pretix.base.signals import register_ticket_outputs from pretix.base.templatetags.money import money_filter +from pretix.base.templatetags.rich_text import markdown_compile from pretix.control.forms.event import ( CommentForm, DisplaySettingsForm, EventDeleteForm, EventMetaValueForm, EventSettingsForm, EventUpdateForm, InvoiceSettingsForm, MailSettingsForm, @@ -614,7 +616,9 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View): idx = matched.group('idx') if idx in self.supported_locale: with translation.override(self.supported_locale[idx]): - msgs[self.supported_locale[idx]] = v.format_map(self.placeholders(preview_item)) + msgs[self.supported_locale[idx]] = bleach.linkify(markdown_compile( + v.format_map(self.placeholders(preview_item)) + )) return JsonResponse({ 'item': preview_item, diff --git a/src/pretix/static/pretixcontrol/js/ui/mail.js b/src/pretix/static/pretixcontrol/js/ui/mail.js index 33c67e99ac..fcfa90f545 100644 --- a/src/pretix/static/pretixcontrol/js/ui/mail.js +++ b/src/pretix/static/pretixcontrol/js/ui/mail.js @@ -3,9 +3,9 @@ function preview_task_callback(data, jqXHR, status) { if (data.item) { $('#' + data.item + '_panel').data('ajaxing', false); for (var m in data.msgs){ - var target = $('pre[for=' + data.item + '][lang=' + m +']'); + var target = $('div[for=' + data.item + '][lang=' + m +']'); if (target.length === 1){ - target.text(data.msgs[m]); + target.html(data.msgs[m]); } } } @@ -15,7 +15,7 @@ function preview_task_error(item) { "use strict"; return function(jqXHR, textStatus, errorThrown) { $('#' + item + '_panel').data('ajaxing', false); - $('#' + item + '_preview pre').text(gettext('An error has occurred.')); + $('#' + item + '_preview div').text(gettext('An error has occurred.')); if (textStatus === "timeout") { alert(gettext("The request took to long. Please try again.")); } else { @@ -49,7 +49,7 @@ $(function () { // prepare for ajax $('#' + itemName + '_panel').data('ajaxing', true); - $('#' + itemName + '_preview pre').text(gettext('Generating messages …')); + $('#' + itemName + '_preview div').text(gettext('Generating messages …')); $.ajax( { diff --git a/src/pretix/static/pretixcontrol/scss/_forms.scss b/src/pretix/static/pretixcontrol/scss/_forms.scss index cfc0949d20..877dd182ec 100644 --- a/src/pretix/static/pretixcontrol/scss/_forms.scss +++ b/src/pretix/static/pretixcontrol/scss/_forms.scss @@ -133,16 +133,18 @@ div[data-formset-body], div[data-formset-form], div[data-nested-formset-form], d line-height: 30px; } -pre.mail-preview { - white-space: pre-line; /* Since CSS 2.1 */ - word-wrap: break-word; /* Internet Explorer 5.5+ */ +div.mail-preview { + border: 1px solid #ccc; + border-top-width: 1px; + border-radius: 3px; } -.mail-preview-group pre[lang] { +.mail-preview-group div[lang] { @include border-top-radius(0px); @include border-bottom-radius(0px); border-top-width: 0; margin-bottom: 0; + padding: 15px; &:first-child { @include border-top-radius($input-border-radius); @@ -152,6 +154,32 @@ pre.mail-preview { @include border-bottom-radius($input-border-radius); margin-bottom: 20px; } + h2, h3 { + margin-bottom: 20px; + margin-top: 10px; + } + p { + margin: 0 0 10px; + + /* These are technically the same, but use both */ + overflow-wrap: break-word; + word-wrap: break-word; + + -ms-word-break: break-all; + /* This is the dangerous one in WebKit, as it breaks things wherever */ + word-break: break-all; + /* Instead use this non-standard one: */ + word-break: break-word; + + /* Adds a hyphen where the word breaks, if supported (No Blink) */ + -ms-hyphens: auto; + -moz-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; + } + p:last-child { + margin-bottom: 0; + } } .search-line {