diff --git a/src/pretix/presale/forms/renderers.py b/src/pretix/presale/forms/renderers.py index 8106fc63bd..accc41cfb0 100644 --- a/src/pretix/presale/forms/renderers.py +++ b/src/pretix/presale/forms/renderers.py @@ -65,6 +65,8 @@ def render_label(content, label_for=None, label_class=None, label_title='', labe elif not optional: opt += '{}'.format(pgettext('form', 'required')) + opt += '' + builder = '<{tag}{attrs}>{content}{opt}' return format_html( builder, diff --git a/src/pretix/static/pretixpresale/js/ui/main.js b/src/pretix/static/pretixpresale/js/ui/main.js index a79e017d07..3b5a72aec8 100644 --- a/src/pretix/static/pretixpresale/js/ui/main.js +++ b/src/pretix/static/pretixpresale/js/ui/main.js @@ -60,6 +60,7 @@ var form_handlers = function (el) { locale: $("body").attr("data-datetimelocale"), useCurrent: false, showClear: !$(this).prop("required"), + keepInvalid: true, icons: { time: 'fa fa-clock-o', date: 'fa fa-calendar', @@ -82,8 +83,7 @@ var form_handlers = function (el) { Math.abs(+new Date(opts.minDate) - new Date()) < Math.abs(+new Date(opts.maxDate) - new Date()) ) ? opts.minDate : opts.maxDate; } - var alert = $(''); - $("#"+this.getAttribute("aria-describedby")).prepend(alert); + var alert = $('label[for=' + this.id + '] .label-alert'); $(this).datetimepicker(opts).on("dp.hide", function() { // when min/max is used in datetimepicker, closing and re-opening the picker opens at the wrong date // therefore keep the current viewDate and re-set it after datetimepicker is done hiding @@ -93,14 +93,21 @@ var form_handlers = function (el) { $dtp.viewDate(currentViewDate); }, 50); }).on('dp.error', function (e) { - console.log(this, e.date, e.oldDate, opts["minDate"], opts["maxDate"]); - alert.text("Mist, das ist ein Fehler! "); - // TODO: + if (e.date) { + if (e.date.isBefore(opts["minDate"])) { + alert.text(gettext("The date you entered is too early.")); + } else if (e.date.isAfter(opts["maxDate"])) { + alert.text(gettext("The date you entered is too late.")); + } + } else { + alert.text(gettext("We could not recognize the date you entered.")); + } var self = this; window.setTimeout(function () { - console.log(self); - //self.focus(); + self.focus(); }, 50); + }).on('dp.change', function (e) { + alert.text(""); }); diff --git a/src/pretix/static/pretixpresale/scss/_forms.scss b/src/pretix/static/pretixpresale/scss/_forms.scss index 62c397153f..95ca46ba76 100644 --- a/src/pretix/static/pretixpresale/scss/_forms.scss +++ b/src/pretix/static/pretixpresale/scss/_forms.scss @@ -145,15 +145,16 @@ output { color: $brand-primary; font-weight: bold; } -.label-required { - color: $text-muted; - display: block; + +.label-required, +.label-alert { + display: inline; font-weight: normal; font-style: normal; font-size: 85%; + color: $text-muted; } -.checkbox .label-required { - display: inline; +.label-required { &:before { content: " ("; } @@ -161,6 +162,22 @@ output { content: ")"; } } +.label-alert:not(:empty):before { + content: " – "; +} +@media (min-width: $screen-md-min) { + .form-group:not(:has(.checkbox)) { + .label-required, + .label-alert:not(:empty) { + display: block; + } + .label-required:before, + .label-required:after, + .label-alert:before { + content: ""; + } + } +} .form-control-text { padding-top: 7px;