Commit 33445405 by swdanielli

aria: focus, region, mouseover event

parent e5f69ce6
...@@ -180,17 +180,14 @@ ...@@ -180,17 +180,14 @@
width: 40px; width: 40px;
} }
.redTxt { .redTxt { color: #B4053D; }
color: #B4053D; .redTxt:before { content: '*'; }
}
.recommenderVoteArrowDown, .recommenderVoteArrowUp, .resourceEditButton, .flagResource, .deendorse, .resourceImportButton, .resourceExportButton, .resourceAddButton, .paginationPageNumber, .backToViewButton, .endorse, .resourceRankingForDeendorsementButton { cursor: pointer; } .recommenderVoteArrowDown, .recommenderVoteArrowUp, .resourceEditButton, .flagResource, .deendorse, .resourceImportButton, .resourceExportButton, .resourceAddButton, .paginationPageNumber, .backToViewButton, .endorse, .resourceRankingForDeendorsementButton { cursor: pointer; }
.resourceAddButton, .resourceExportButton, .resourceImportButton { float: right; background-color: rgba(0,0,0,0.05); padding: 0.3em 1em 0.3em 1em; margin-left: 1em;} .resourceAddButton, .resourceExportButton, .resourceImportButton { float: right; background-color: rgba(0,0,0,0.05); padding: 0.3em 1em 0.3em 1em; margin-left: 1em;}
.resourceEditButton { float: left; } .resourceEditButton { float: left; }
.addResourcePageTitle, .editResourcePageTitle, .flagResourcePageTitle, .deendorsePageTitle, .endorsePageTitle, .importResourcePageTitle { .modifyPageTitle { margin-bottom: 1em; }
margin-bottom: 1em;
}
.editResourcePage, .addResourcePage, .flagResourcePage { .editResourcePage, .addResourcePage, .flagResourcePage {
padding-left: 1em; padding-left: 1em;
...@@ -279,3 +276,4 @@ input[type="button"]:not([DISABLED]){ ...@@ -279,3 +276,4 @@ input[type="button"]:not([DISABLED]){
a:link, a:visited { color: black; } a:link, a:visited { color: black; }
form { margin: 0em; } form { margin: 0em; }
label { width: 100%; }
<%page args="title,votes,url,description,descriptionText,id,isProblematic,problematicReason,voteMode,endorseMode,endorsedReason"/> <%page args="title,votes,url,description,descriptionText,id,isProblematic,problematicReason,voteMode,endorseMode,endorsedReason"/>
<div class="recommenderResource"> <div class="recommenderResource" role="region" aria-label="Resource: ${title}" tabindex="0">
<div class="recommenderVoteBox"> <div class="recommenderVoteBox">
<div class="recommenderVoteArrowUp ${voteMode}" role="button" aria-label="upvote" tabindex="0"></div> <div class="recommenderVoteArrowUp ${voteMode}" role="button" aria-label="upvote" tabindex="0"></div>
<div class="recommenderVoteScore ${voteMode}" aria-label="Votes: ">${votes}</div> <div class="recommenderVoteScore ${voteMode}" aria-label="${votes} votes" tabindex="0">${votes}</div>
<div class="recommenderVoteArrowDown ${voteMode}" role="button" aria-label="downvote" tabindex="0"></div> <div class="recommenderVoteArrowDown ${voteMode}" role="button" aria-label="downvote" tabindex="0"></div>
</div> </div>
<div class="recommenderBlurb"> <div class="recommenderBlurb">
<div class="recommenderTitle"><a href="${url}" target="_blank" role="button" aria-label="Resource: " tabindex="0">${title}</a></div> <div class="recommenderTitle"><a href="${url}" target="_blank" tabindex="0" aria-label="${descriptionText}">${title}</a></div>
<div class="recommenderDescriptionText">${descriptionText}</div> <div class="recommenderDescriptionText">${descriptionText}</div>
<div class="recommenderDescriptionImg">${description}</div> <div class="recommenderDescriptionImg">${description}</div>
<div class="recommenderEntryId">${id}</div> <div class="recommenderEntryId">${id}</div>
......
...@@ -89,6 +89,8 @@ var importResourceErrorText = { ...@@ -89,6 +89,8 @@ var importResourceErrorText = {
var problematicReasonsPrefix = '<br/>Here is a list of reasons why students think this resource problematic: <br/>&nbsp;&nbsp;&nbsp;&nbsp;'; var problematicReasonsPrefix = '<br/>Here is a list of reasons why students think this resource problematic: <br/>&nbsp;&nbsp;&nbsp;&nbsp;';
var endorsedReasonsPrefix = '<br/>The reason why it is endorsed is: <br/>&nbsp;&nbsp;&nbsp;&nbsp;'; var endorsedReasonsPrefix = '<br/>The reason why it is endorsed is: <br/>&nbsp;&nbsp;&nbsp;&nbsp;';
var recommenderResourceAriaPrefix = 'Resource: ';
var recommenderVoteScorePostfix = ' votes';
var reasonSeparator = '<br/>&nbsp;&nbsp;&nbsp;&nbsp;'; var reasonSeparator = '<br/>&nbsp;&nbsp;&nbsp;&nbsp;';
var exportResourceFileInfo = { var exportResourceFileInfo = {
...@@ -107,6 +109,15 @@ var headerText = { ...@@ -107,6 +109,15 @@ var headerText = {
'.deendorsePage': 'Deendorse Resource' '.deendorsePage': 'Deendorse Resource'
}; };
var modifyPageTitle = {
'.importResourcePage': 'Upload resources in JSON format to the database.',
'.addResourcePage': 'Suggest a resource which can help other students with this problem. Please do not give the answer directly.',
'.editResourcePage': 'Edit the resource and make it more helpful for other students with this problem. Please do not give the answer directly.',
'.flagResourcePage': 'Why would you like to flag this resource? The staff will review all flagged resources, and remove inappropriate ones (spam, incorrect, abusive, etc.). Giving a clear reason will help us do this efficiently.',
'.endorsePage': 'Endorse this resource and give the reason why you do that.',
'.deendorsePage': 'Deendorse this resource and give the reason why you do that.'
};
var writeDatabaseEnum = { var writeDatabaseEnum = {
ADD: 'add', ADD: 'add',
EDIT: 'edit' EDIT: 'edit'
......
...@@ -40,19 +40,37 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -40,19 +40,37 @@ function RecommenderXBlock(runtime, element, init_data) {
} }
/** /**
* Focus on the first shown resource in list.
*/
function focusFirstResource() {
if ($('.recommenderResource', element).length == 0) { $('.noResourceIntro', element).focus(); }
else {
$($('.recommenderResource', element).get().reverse()).each(function() {
if ($(this).css('display') != 'none') {
$(this).focus();
return;
}
});
}
}
/**
* Expand or collapse resource list. * Expand or collapse resource list.
* This function is triggered when clicking on the header of the resource list. * This function is triggered when clicking on the header of the resource list.
*/ */
function bindToggleResourceListEvent() { function bindToggleResourceListEvent() {
if ($(this).hasClass('resourceListExpanded')) { if ($(this).hasClass('resourceListExpanded')) {
Logger.log('mit.recommender.hideShow', generateLog(loggerStatus['hideShow']['hide'])); Logger.log('mit.recommender.hideShow', generateLog(loggerStatus['hideShow']['hide']));
$(".recommenderRowInner", element).slideUp('fast'); $(".recommenderRowInner", element).slideUp('fast').attr('aria-hidden', 'true');
$(this).text(resourceListHeader['show']); $(this).text(resourceListHeader['show']).attr('aria-expanded', 'false');
} }
else { else {
Logger.log('mit.recommender.hideShow', generateLog(loggerStatus['hideShow']['show'])); Logger.log('mit.recommender.hideShow', generateLog(loggerStatus['hideShow']['show']));
$(".recommenderRowInner", element).slideDown('fast'); $(".recommenderRowInner", element).slideDown('fast').attr('aria-hidden', 'false');
$(this).text(resourceListHeader['hide']); $(this).text(resourceListHeader['hide']).attr('aria-expanded', 'true');
focusFirstResource();
} }
$(this).toggleClass('resourceListExpanded'); $(this).toggleClass('resourceListExpanded');
addTooltip(); addTooltip();
...@@ -73,6 +91,7 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -73,6 +91,7 @@ function RecommenderXBlock(runtime, element, init_data) {
if (index + 1 == CURRENT_PAGE) { $(ele, element).show().attr('aria-hidden', 'false'); } if (index + 1 == CURRENT_PAGE) { $(ele, element).show().attr('aria-hidden', 'false'); }
else { $(ele, element).hide().attr('aria-hidden', 'true'); } else { $(ele, element).hide().attr('aria-hidden', 'true'); }
}); });
focusFirstResource();
} }
/** /**
...@@ -174,8 +193,9 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -174,8 +193,9 @@ function RecommenderXBlock(runtime, element, init_data) {
*/ */
function showModifyingPage(page) { function showModifyingPage(page) {
$(page, element).show().attr('aria-hidden', 'false'); $(page, element).show().attr('aria-hidden', 'false');
$(page, element).find('.modifyPageTitle').text(modifyPageTitle[page]);
$('.recommenderContent', element).hide().attr('aria-hidden', 'true'); $('.recommenderContent', element).hide().attr('aria-hidden', 'true');
$('.recommenderModify', element).show().attr('aria-hidden', 'false'); $('.recommenderModify', element).show().attr('aria-hidden', 'false').attr('aria-label', modifyPageTitle[page]).focus();
$('.recommenderModifyTitle', element).text(headerText[page]); $('.recommenderModifyTitle', element).text(headerText[page]);
} }
...@@ -258,6 +278,7 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -258,6 +278,7 @@ function RecommenderXBlock(runtime, element, init_data) {
$('.showEndorsedReasons', element).hide().attr('aria-hidden', 'true'); $('.showEndorsedReasons', element).hide().attr('aria-hidden', 'true');
} }
$('.recommenderContent', element).show().attr('aria-hidden', 'false'); $('.recommenderContent', element).show().attr('aria-hidden', 'false');
$('.hideShow').focus();
} }
/** /**
...@@ -365,7 +386,8 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -365,7 +386,8 @@ function RecommenderXBlock(runtime, element, init_data) {
resourceTitle: resource['title'], resourceTitle: resource['title'],
resourceImg: resource['description'], resourceImg: resource['description'],
resourceText: resource['descriptionText'], resourceText: resource['descriptionText'],
resourceId: resource['id'] resourceId: resource['id'],
resourceVotes: votes
} }
var newDiv = $(Mustache.render($("#recommenderResourceTemplate").html(), renderData)); var newDiv = $(Mustache.render($("#recommenderResourceTemplate").html(), renderData));
...@@ -379,7 +401,6 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -379,7 +401,6 @@ function RecommenderXBlock(runtime, element, init_data) {
if (pos == -1) { $(toDiv).after(newDiv); } if (pos == -1) { $(toDiv).after(newDiv); }
else { $(toDiv).before(newDiv); } else { $(toDiv).before(newDiv); }
} }
$('.recommenderVoteScore', newDiv).text(votes);
addResourceDependentTooltip(newDiv); addResourceDependentTooltip(newDiv);
return newDiv; return newDiv;
...@@ -510,6 +531,7 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -510,6 +531,7 @@ function RecommenderXBlock(runtime, element, init_data) {
success: function(result) { success: function(result) {
if (result['Success'] == true) { if (result['Success'] == true) {
var resource = $('.recommenderResource:eq(' + findResourceDiv(result['id']).toString() + ')', element); var resource = $('.recommenderResource:eq(' + findResourceDiv(result['id']).toString() + ')', element);
var newVotes = result['newVotes'].toString();
$('.recommenderVoteArrowUp, .recommenderVoteArrowDown, .recommenderVoteScore', resource) $('.recommenderVoteArrowUp, .recommenderVoteArrowDown, .recommenderVoteScore', resource)
.toggleClass(voteConfig['voteClassName']); .toggleClass(voteConfig['voteClassName']);
if (toggleVoteFlag in result) { if (toggleVoteFlag in result) {
...@@ -517,7 +539,7 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -517,7 +539,7 @@ function RecommenderXBlock(runtime, element, init_data) {
.toggleClass(voteConfig['previousVoteClassName']); .toggleClass(voteConfig['previousVoteClassName']);
} }
setVoteAriaParam(resource); setVoteAriaParam(resource);
$('.recommenderVoteScore', resource).html(result['newVotes'].toString()); $('.recommenderVoteScore', resource).html(newVotes).attr('aria-label', newVotes + recommenderVoteScorePostfix);
} }
else { alert(result['error']); } else { alert(result['error']); }
} }
...@@ -601,10 +623,12 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -601,10 +623,12 @@ function RecommenderXBlock(runtime, element, init_data) {
var resourceDiv = $('.recommenderResource:eq(' + findResourceDiv(result['old_id']).toString() + ')', element); var resourceDiv = $('.recommenderResource:eq(' + findResourceDiv(result['old_id']).toString() + ')', element);
/* Update the edited resource */ /* Update the edited resource */
$('.recommenderTitle', resourceDiv).find('a').text(result['title']); $('.recommenderTitle', resourceDiv).find('a').text(result['title']);
resourceDiv.attr('aria-label', recommenderResourceAriaPrefix + result['title']);
$('.recommenderTitle', resourceDiv).find('a').attr('href', result['url']); $('.recommenderTitle', resourceDiv).find('a').attr('href', result['url']);
$('.recommenderEntryId', resourceDiv).text(result['id']); $('.recommenderEntryId', resourceDiv).text(result['id']);
if (data["description"] != "") { $('.recommenderDescriptionImg', resourceDiv).text(result['description']); } if (data["description"] != "") { $('.recommenderDescriptionImg', resourceDiv).text(result['description']); }
if (data["descriptionText"] != "") { $('.recommenderDescriptionText', resourceDiv).text(result['descriptionText']); } if (data["descriptionText"] != "") { $('.recommenderDescriptionText', resourceDiv).text(result['descriptionText']); }
$('.recommenderTitle', resourceDiv).find('a').attr('aria-label', $('.recommenderDescriptionText', resourceDiv).text());
backToView(); backToView();
} }
else { alert(result['error']); } else { alert(result['error']); }
...@@ -1156,6 +1180,10 @@ function RecommenderXBlock(runtime, element, init_data) { ...@@ -1156,6 +1180,10 @@ function RecommenderXBlock(runtime, element, init_data) {
$('.noResourceIntro', element).show().attr('aria-hidden', 'false'); $('.noResourceIntro', element).show().attr('aria-hidden', 'false');
$('.descriptionText', element).hide().attr('aria-hidden', 'true'); $('.descriptionText', element).hide().attr('aria-hidden', 'true');
} }
/* For accessibility of expandable resource list header */
$('.recommenderRowInner', element).attr('id', 'recommenderRowInner-' + $(element).attr('data-usage-id'));
$('.hideShow', element).attr('aria-controls', 'recommenderRowInner-' + $(element).attr('data-usage-id'));
} }
initializeRecommender(); initializeRecommender();
} }
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