mirror of
https://github.com/pretix/pretix.git
synced 2026-08-23 12:51:59 +00:00
A11y: add date and time labels in MultiWidget (Z#23132744) (#3718)
* A11y: add date and time labels in MultiWidget * fix code style issues
This commit is contained in:
@@ -209,7 +209,10 @@ class SplitDateTimePickerWidget(forms.SplitDateTimeWidget):
|
|||||||
|
|
||||||
date_attrs['placeholder'] = lazy(date_placeholder, str)
|
date_attrs['placeholder'] = lazy(date_placeholder, str)
|
||||||
time_attrs['placeholder'] = lazy(time_placeholder, str)
|
time_attrs['placeholder'] = lazy(time_placeholder, str)
|
||||||
|
date_attrs['aria-label'] = _('Date')
|
||||||
|
time_attrs['aria-label'] = _('Time')
|
||||||
|
if 'aria-label' in attrs:
|
||||||
|
del attrs['aria-label']
|
||||||
widgets = (
|
widgets = (
|
||||||
forms.DateInput(attrs=date_attrs, format=date_format),
|
forms.DateInput(attrs=date_attrs, format=date_format),
|
||||||
forms.TimeInput(attrs=time_attrs, format=time_format),
|
forms.TimeInput(attrs=time_attrs, format=time_format),
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
from bootstrap3.text import text_value
|
from bootstrap3.text import text_value
|
||||||
from django.forms import CheckboxInput
|
from django.forms import CheckboxInput, CheckboxSelectMultiple, RadioSelect
|
||||||
from django.forms.utils import flatatt
|
from django.forms.utils import flatatt
|
||||||
from django.utils.html import format_html
|
from django.utils.html import format_html
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
@@ -30,7 +30,7 @@ from i18nfield.forms import I18nFormField
|
|||||||
from pretix.base.forms.renderers import FieldRenderer, InlineFieldRenderer
|
from pretix.base.forms.renderers import FieldRenderer, InlineFieldRenderer
|
||||||
|
|
||||||
|
|
||||||
def render_label(content, label_for=None, label_class=None, label_title='', optional=False):
|
def render_label(content, label_for=None, label_class=None, label_title='', label_id='', optional=False):
|
||||||
"""
|
"""
|
||||||
Render a label with content
|
Render a label with content
|
||||||
"""
|
"""
|
||||||
@@ -41,6 +41,8 @@ def render_label(content, label_for=None, label_class=None, label_title='', opti
|
|||||||
attrs['class'] = label_class
|
attrs['class'] = label_class
|
||||||
if label_title:
|
if label_title:
|
||||||
attrs['title'] = label_title
|
attrs['title'] = label_title
|
||||||
|
if label_id:
|
||||||
|
attrs['id'] = label_id
|
||||||
|
|
||||||
if text_value(content) == ' ':
|
if text_value(content) == ' ':
|
||||||
# Empty label, e.g. checkbox
|
# Empty label, e.g. checkbox
|
||||||
@@ -61,6 +63,7 @@ class ControlFieldRenderer(FieldRenderer):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
kwargs['layout'] = 'horizontal'
|
kwargs['layout'] = 'horizontal'
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
self.is_group_widget = isinstance(self.widget, (CheckboxSelectMultiple, RadioSelect, )) or (self.is_multi_widget and len(self.widget.widgets) > 1)
|
||||||
|
|
||||||
def add_label(self, html):
|
def add_label(self, html):
|
||||||
label = self.get_label()
|
label = self.get_label()
|
||||||
@@ -73,14 +76,29 @@ class ControlFieldRenderer(FieldRenderer):
|
|||||||
else:
|
else:
|
||||||
required = self.field.field.required
|
required = self.field.field.required
|
||||||
|
|
||||||
|
if self.is_group_widget:
|
||||||
|
label_for = ""
|
||||||
|
label_id = "legend-{}".format(self.field.html_name)
|
||||||
|
else:
|
||||||
|
label_for = self.field.id_for_label
|
||||||
|
label_id = ""
|
||||||
|
|
||||||
html = render_label(
|
html = render_label(
|
||||||
label,
|
label,
|
||||||
label_for=self.field.id_for_label,
|
label_for=label_for,
|
||||||
label_class=self.get_label_class(),
|
label_class=self.get_label_class(),
|
||||||
|
label_id=label_id,
|
||||||
optional=not required and not isinstance(self.widget, CheckboxInput)
|
optional=not required and not isinstance(self.widget, CheckboxInput)
|
||||||
) + html
|
) + html
|
||||||
return html
|
return html
|
||||||
|
|
||||||
|
def wrap_label_and_field(self, html):
|
||||||
|
if self.is_group_widget:
|
||||||
|
attrs = ' role="group" aria-labelledby="legend-{}"'.format(self.field.html_name)
|
||||||
|
else:
|
||||||
|
attrs = ''
|
||||||
|
return '<div class="{klass}"{attrs}>{html}</div>'.format(klass=self.get_form_group_class(), html=html, attrs=attrs)
|
||||||
|
|
||||||
|
|
||||||
class BulkEditMixin:
|
class BulkEditMixin:
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user