a11y: add aria attribute to file widget (#71085) #285

Merged
fpeters merged 1 commits from wip/71085-a11y-file-hint into main 2023-05-03 13:24:36 +02:00
2 changed files with 33 additions and 10 deletions

View File

@ -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)

View File

@ -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)