Commit 4810bd6d by Dave St.Germain

Improved sequence navigation accessibility

parent 25c0776c
...@@ -323,7 +323,7 @@ nav.sequence-nav { ...@@ -323,7 +323,7 @@ nav.sequence-nav {
} }
} }
div.seq_contents { .seq_contents {
display: none; display: none;
} }
......
...@@ -22,12 +22,12 @@ class @Conditional ...@@ -22,12 +22,12 @@ class @Conditional
parentId = parentEl.attr 'id' parentId = parentEl.attr 'id'
if response.message is false if response.message is false
if parentId.indexOf('vert') is 0 if parentEl.hasClass('vert')
parentEl.hide() parentEl.hide()
else else
$(element).hide() $(element).hide()
else else
if parentId.indexOf('vert') is 0 if parentEl.hasClass('vert')
parentEl.show() parentEl.show()
else else
$(element).show() $(element).show()
......
...@@ -2,6 +2,7 @@ class @Sequence ...@@ -2,6 +2,7 @@ class @Sequence
constructor: (element) -> constructor: (element) ->
@el = $(element).find('.sequence') @el = $(element).find('.sequence')
@contents = @$('.seq_contents') @contents = @$('.seq_contents')
@content_container = @$('#seq_content')
@num_contents = @contents.length @num_contents = @contents.length
@id = @el.data('id') @id = @el.data('id')
@ajaxUrl = @el.data('ajax-url') @ajaxUrl = @el.data('ajax-url')
...@@ -22,8 +23,8 @@ class @Sequence ...@@ -22,8 +23,8 @@ class @Sequence
updatePageTitle: -> updatePageTitle: ->
# update the page title to include the current section # update the page title to include the current section
position_link = @link_for(@position) position_link = @link_for(@position)
if position_link and position_link.data('title') if position_link and position_link.attr('title')
document.title = position_link.data('title') + @base_page_title document.title = position_link.attr('title') + @base_page_title
hookUpProgressEvent: -> hookUpProgressEvent: ->
$('.problems-wrapper').bind 'progressChanged', @updateProgress $('.problems-wrapper').bind 'progressChanged', @updateProgress
...@@ -97,10 +98,12 @@ class @Sequence ...@@ -97,10 +98,12 @@ class @Sequence
# Added for aborting video bufferization, see ../video/10_main.js # Added for aborting video bufferization, see ../video/10_main.js
@el.trigger "sequence:change" @el.trigger "sequence:change"
@mark_active new_position @mark_active new_position
@$('#seq_content').html @contents.eq(new_position - 1).text()
XBlock.initializeBlocks(@$('#seq_content')) current_tab = @contents.eq(new_position - 1)
@content_container.html(current_tab.text()).attr("aria-labelledby", current_tab.attr("aria-labelledby"))
XBlock.initializeBlocks(@content_container)
MathJax.Hub.Queue(["Typeset", MathJax.Hub, "seq_content"]) # NOTE: Actually redundant. Some other MathJax call also being performed
window.update_schematics() # For embedded circuit simulator exercises in 6.002x window.update_schematics() # For embedded circuit simulator exercises in 6.002x
@position = new_position @position = new_position
...@@ -108,10 +111,12 @@ class @Sequence ...@@ -108,10 +111,12 @@ class @Sequence
@hookUpProgressEvent() @hookUpProgressEvent()
@updatePageTitle() @updatePageTitle()
sequence_links = @$('#seq_content a.seqnav') sequence_links = @content_container.find('a.seqnav')
sequence_links.click @goto sequence_links.click @goto
@$("a.active").blur() # Focus on the first available xblock.
@content_container.find('.vert .xblock :first').focus()
@$("a.active").blur()
goto: (event) => goto: (event) =>
event.preventDefault() event.preventDefault()
if $(event.target).hasClass 'seqnav' # Links from courseware <a class='seqnav' href='n'>...</a> if $(event.target).hasClass 'seqnav' # Links from courseware <a class='seqnav' href='n'>...</a>
...@@ -187,8 +192,11 @@ class @Sequence ...@@ -187,8 +192,11 @@ class @Sequence
.addClass("visited") .addClass("visited")
mark_active: (position) -> mark_active: (position) ->
# Mark the correct tab as selected, for a11y helpfulness.
@$("#sequence-list a[aria-selected='true']").attr("aria-selected", "false")
# Don't overwrite class attribute to avoid changing Progress class # Don't overwrite class attribute to avoid changing Progress class
element = @link_for(position) element = @link_for(position)
element.removeClass("inactive") element.removeClass("inactive")
.removeClass("visited") .removeClass("visited")
.addClass("active") .addClass("active")
.attr("aria-selected", "true")
<div class="${' '.join(classes)}" ${data_attributes} aria-label="${display_name}"> <div class="${' '.join(classes)}" ${data_attributes} tabindex="0">
${content} ${content}
</div> </div>
...@@ -46,13 +46,13 @@ div.course-wrapper { ...@@ -46,13 +46,13 @@ div.course-wrapper {
} }
} }
ol.vert-mod { .vert-mod {
padding: 0; padding: 0;
margin: 0; margin: 0;
line-height: 1.4; line-height: 1.4;
list-style: none; list-style: none;
> li { > div {
@extend .clearfix; @extend .clearfix;
border-bottom: 1px solid #ddd; border-bottom: 1px solid #ddd;
margin-bottom: 15px; margin-bottom: 15px;
...@@ -232,6 +232,12 @@ div.course-wrapper { ...@@ -232,6 +232,12 @@ div.course-wrapper {
} }
.xblock {
&:focus {
outline: 0;
}
}
textarea.short-form-response { textarea.short-form-response {
height: 200px; height: 200px;
padding: 5px; padding: 5px;
......
...@@ -3,22 +3,26 @@ ...@@ -3,22 +3,26 @@
<div id="sequence_${element_id}" class="sequence" data-id="${item_id}" data-position="${position}" data-ajax-url="${ajax_url}" > <div id="sequence_${element_id}" class="sequence" data-id="${item_id}" data-position="${position}" data-ajax-url="${ajax_url}" >
<nav class="sequence-nav"> <nav class="sequence-nav">
<ul class="sequence-nav-buttons"> <ul class="sequence-nav-buttons">
<li class="prev"><a href="#">${_('Previous')}</a></li> <li class="prev"><a role="button" href="#">${_('Previous')}</a></li>
</ul> </ul>
<div class="sequence-list-wrapper"> <div class="sequence-list-wrapper">
<ol aria-label="${_('Section Navigation')}" id="sequence-list"> <ol role="tablist" aria-label="${_('Section Navigation')}" id="sequence-list">
% for idx, item in enumerate(items): % for idx, item in enumerate(items):
## TODO (vshnayder): add item.progress_detail either to the title or somewhere else. ## TODO (vshnayder): add item.progress_detail either to the title or somewhere else.
## Make sure it gets updated after ajax calls. ## Make sure it gets updated after ajax calls.
## implementation note: will need to figure out how to handle combining detail ## implementation note: will need to figure out how to handle combining detail
## statuses of multiple modules in js. ## statuses of multiple modules in js.
<li aria-label="${item['title']}"> <li>
<a class="seq_${item['type']} inactive progress-${item['progress_status']}" <a class="seq_${item['type']} inactive progress-${item['progress_status']}"
data-id="${item['id']}" data-id="${item['id']}"
data-element="${idx+1}" data-element="${idx+1}"
data-title="${item['title']}" href="javascript:void(0);"
href="javascript:void(0);"> title="${item['title']|h}"
aria-controls="seq_contents_${idx}"
id="tab_${idx}"
tabindex="0"
role="tab">
<p aria-hidden="false">${item['title']}<span class="sr" aria-hidden="true">, ${item['type']}</span></p> <p aria-hidden="false">${item['title']}<span class="sr" aria-hidden="true">, ${item['type']}</span></p>
</a> </a>
</li> </li>
...@@ -27,19 +31,24 @@ ...@@ -27,19 +31,24 @@
</div> </div>
<ul class="sequence-nav-buttons"> <ul class="sequence-nav-buttons">
<li class="next"><a href="#">${_("Next")}</a></li> <li class="next"><a role="button" href="#">${_("Next")}</a></li>
</ul> </ul>
</nav> </nav>
% for item in items: % for idx, item in enumerate(items):
<div class="seq_contents tex2jax_ignore asciimath2jax_ignore">${item['content'] | h}</div> <div id="seq_contents_${idx}"
aria-labelledby="tab_${idx}"
aria-hidden="true"
class="seq_contents tex2jax_ignore asciimath2jax_ignore">
${item['content'] | h}
</div>
% endfor % endfor
<div id="seq_content"></div> <div id="seq_content" role="tabpanel"></div>
<nav class="sequence-bottom"> <nav class="sequence-bottom">
<ul aria-label="${_('Section Navigation')}" class="sequence-nav-buttons"> <ul aria-label="${_('Section Navigation')}" class="sequence-nav-buttons">
<li class="prev"><a href="#">${_("Previous")}</a></li> <li class="prev"><a role="button" href="#">${_("Previous")}</a></li>
<li class="next"><a href="#">${_("Next")}</a></li> <li class="next"><a role="button" href="#">${_("Next")}</a></li>
</ul> </ul>
</nav> </nav>
</div> </div>
......
<div class="vert-mod"> <div class="vert-mod">
% for idx, item in enumerate(items): % for idx, item in enumerate(items):
<div id="vert-${idx}" data-id="${item['id']}"> <div class="vert vert-${idx}" data-id="${item['id']}">
${item['content']} ${item['content']}
</div> </div>
% endfor % endfor
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment