a11y: add aria attribute to file widget (#71085) #285
|
@ -150,6 +150,19 @@ def test_aria_hint_error():
|
|||
assert 'aria-describedby="form_error_test"' in str(widget.render())
|
||||
|
||||
|
||||
def test_file_with_preview_aria_hint_error():
|
||||
req.session = sessions.Session(id=1) # needed by FileWithPreviewWidget
|
||||
widget = FileWithPreviewWidget('test')
|
||||
assert 'aria-describedby' not in str(widget.render())
|
||||
widget = FileWithPreviewWidget('test', value='foo', hint='hint')
|
||||
assert 'aria-describedby="form_hint_test"' in str(widget.render())
|
||||
widget.set_error('plop')
|
||||
assert 'aria-describedby="form_hint_test form_error_test"' in str(widget.render())
|
||||
widget = FileWithPreviewWidget('test', value='foo')
|
||||
widget.set_error('plop')
|
||||
assert 'aria-describedby="form_error_test"' in str(widget.render())
|
||||
|
||||
|
||||
def test_table_list_rows():
|
||||
widget = TableListRowsWidget('test', columns=['a', 'b', 'c'])
|
||||
form = MockHtmlForm(widget)
|
||||
|
|
|
@ -134,6 +134,19 @@ def get_template_names(widget):
|
|||
return template_names
|
||||
|
||||
|
||||
def set_aria_attributes(widget, attrs):
|
||||
hint = widget.get_hint()
|
||||
if hint:
|
||||
attrs['aria-describedby'] = 'form_hint_%s' % widget.get_name_for_id()
|
||||
error = widget.get_error()
|
||||
if error:
|
||||
attrs['aria-invalid'] = 'true'
|
||||
if 'aria-describedby' not in attrs:
|
||||
attrs['aria-describedby'] = 'form_error_%s' % widget.get_name_for_id()
|
||||
else:
|
||||
attrs['aria-describedby'] += ' form_error_%s' % widget.get_name_for_id()
|
||||
|
||||
|
||||
def render(self):
|
||||
# quixote/form/widget.py, Widget::render
|
||||
def safe(text):
|
||||
|
@ -150,16 +163,7 @@ def render(self):
|
|||
else:
|
||||
context = {}
|
||||
context['widget'] = self
|
||||
hint = self.get_hint()
|
||||
if hint:
|
||||
self.attrs['aria-describedby'] = 'form_hint_%s' % self.get_name_for_id()
|
||||
error = self.get_error()
|
||||
if error:
|
||||
self.attrs['aria-invalid'] = 'true'
|
||||
if 'aria-describedby' not in self.attrs:
|
||||
self.attrs['aria-describedby'] = 'form_error_%s' % self.get_name_for_id()
|
||||
else:
|
||||
self.attrs['aria-describedby'] += ' form_error_%s' % self.get_name_for_id()
|
||||
set_aria_attributes(widget=self, attrs=self.attrs)
|
||||
|
||||
template_names = get_template_names(self)
|
||||
return htmltext(render_template(template_names, context))
|
||||
|
@ -940,6 +944,12 @@ class FileWithPreviewWidget(CompositeWidget):
|
|||
if token:
|
||||
self.value = session.get_tempfile_content(token)
|
||||
|
||||
def render(self):
|
||||
file_widget = self.get_widget('file')
|
||||
if file_widget:
|
||||
set_aria_attributes(widget=self, attrs=file_widget.attrs)
|
||||
return super().render()
|
||||
|
||||
def _parse(self, request):
|
||||
if self.get_value_from_token:
|
||||
self.set_value_from_token(request)
|
||||
|
|
Loading…
Reference in New Issue