diff --git a/app/coffeescripts/AssignmentMuter.js b/app/coffeescripts/AssignmentMuter.js
index fb6fc2c8009..766cfef6321 100644
--- a/app/coffeescripts/AssignmentMuter.js
+++ b/app/coffeescripts/AssignmentMuter.js
@@ -16,12 +16,12 @@ export default class AssignmentMuter {
this.options = options
}
- show () {
+ show (onClose) {
if (this.options && this.options.openDialogInstantly) {
if (this.assignment.muted) {
this.confirmUnmute()
} else {
- this.showDialog()
+ this.showDialog(onClose)
}
} else {
this.$link = $(this.$link)
@@ -31,7 +31,7 @@ export default class AssignmentMuter {
if (this.assignment.muted) {
this.confirmUnmute()
} else {
- this.showDialog()
+ this.showDialog(onClose)
}
})
}
@@ -41,7 +41,7 @@ export default class AssignmentMuter {
this.$link.text(this.assignment.muted ? I18n.t('Unmute Assignment') : I18n.t('Mute Assignment'))
}
- showDialog () {
+ showDialog (onClose) {
this.$dialog = $(mute_dialog_template()).dialog({
buttons: [{
text: I18n.t('Cancel'),
@@ -61,6 +61,7 @@ export default class AssignmentMuter {
resizable: false,
width: 400
})
+ this.$dialog.on('dialogclose', onClose)
}
afterUpdate (serverResponse) {
@@ -92,7 +93,7 @@ export default class AssignmentMuter {
click: () => this.$dialog.disableWhileLoading($.ajaxJSON(this.url, 'put', {status: false}, this.afterUpdate))
}],
open: () => setTimeout(() => this.$dialog.parent().find('.ui-dialog-titlebar-close').focus(), 100),
- close: () => this.$dialog.remove(),
+ close: () => this.$dialog.dialog('close'),
resizable: false,
title: I18n.t('unmute_assignment', 'Unmute Assignment'),
width: 400,
diff --git a/app/coffeescripts/gradezilla/Gradebook.coffee b/app/coffeescripts/gradezilla/Gradebook.coffee
index 25b38ad9e2f..43f688b6669 100644
--- a/app/coffeescripts/gradezilla/Gradebook.coffee
+++ b/app/coffeescripts/gradezilla/Gradebook.coffee
@@ -1420,13 +1420,15 @@ define [
@grid.invalidate()
@renderTotalGradeColumnHeader()
- togglePointsOrPercentTotals: =>
+ togglePointsOrPercentTotals: (cb) =>
if UserSettings.contextGet('warned_about_totals_display')
@switchTotalDisplay()
+ cb() if typeof cb == 'function'
else
dialog_options =
showing_points: @options.show_total_grade_as_points
save: @switchTotalDisplay
+ onClose: cb
new GradeDisplayWarningDialog(dialog_options)
onUserFilterInput: (term) =>
@@ -2095,6 +2097,13 @@ define [
@renderStudentColumnHeader()
@renderTotalGradeColumnHeader()
+ # Column Header Helpers
+ handleHeaderKeyDown: (e, columnId) =>
+ @gridSupport.navigation.handleHeaderKeyDown e,
+ region: 'header'
+ cell: @grid.getColumnIndex(columnId)
+ columnId: columnId
+
# Student Column Header
getStudentColumnSortBySetting: =>
@@ -2129,6 +2138,8 @@ define [
addGradebookElement: @keyboardNav.addGradebookElement
removeGradebookElement: @keyboardNav.removeGradebookElement
onMenuClose: @handleColumnHeaderMenuClose
+ onHeaderKeyDown: (e) =>
+ @handleHeaderKeyDown(e, 'student')
renderStudentColumnHeader: =>
mountPoint = @getColumnHeaderNode('student')
@@ -2138,6 +2149,7 @@ define [
# Total Grade Column Header
freezeTotalGradeColumn: =>
+ @totalColumnPositionChanged = true
allColumns = @grid.getColumns()
# Remove total_grade column from aggregate section
@@ -2159,6 +2171,7 @@ define [
@updateFrozenColumnsAndRenderGrid(allColumns)
moveTotalGradeColumnToEnd: =>
+ @totalColumnPositionChanged = true
allColumns = @grid.getColumns()
# Remove total_grade column from aggregate or frozen section as needed
@@ -2222,6 +2235,13 @@ define [
@moveTotalGradeColumnToEnd()
, 10)
+ totalColumnShouldFocus: ->
+ if @totalColumnPositionChanged
+ @totalColumnPositionChanged = false
+ true
+ else
+ false
+
getTotalGradeColumnHeaderProps: ->
ref: (ref) =>
@setHeaderComponentRef('total_grade', ref)
@@ -2231,6 +2251,9 @@ define [
addGradebookElement: @keyboardNav.addGradebookElement
removeGradebookElement: @keyboardNav.removeGradebookElement
onMenuClose: @handleColumnHeaderMenuClose
+ grabFocus: @totalColumnShouldFocus()
+ onHeaderKeyDown: (e) =>
+ @handleHeaderKeyDown(e, 'total_grade')
renderTotalGradeColumnHeader: =>
return if @hideAggregateColumns()
@@ -2364,6 +2387,8 @@ define [
removeGradebookElement: @keyboardNav.removeGradebookElement
onMenuClose: @handleColumnHeaderMenuClose
showUnpostedMenuItem: @options.new_gradebook_development_enabled
+ onHeaderKeyDown: (e) =>
+ @handleHeaderKeyDown(e, @getAssignmentColumnId(assignmentId))
}
renderAssignmentColumnHeader: (assignmentId) =>
@@ -2406,6 +2431,8 @@ define [
addGradebookElement: @keyboardNav.addGradebookElement
removeGradebookElement: @keyboardNav.removeGradebookElement
onMenuClose: @handleColumnHeaderMenuClose
+ onHeaderKeyDown: (e) =>
+ @handleHeaderKeyDown(e, @getAssignmentGroupColumnId(assignmentGroupId))
}
renderAssignmentGroupColumnHeader: (assignmentGroupId) =>
diff --git a/app/coffeescripts/gradezilla/SetDefaultGradeDialog.coffee b/app/coffeescripts/gradezilla/SetDefaultGradeDialog.coffee
index 3afc37550d0..5a575119460 100644
--- a/app/coffeescripts/gradezilla/SetDefaultGradeDialog.coffee
+++ b/app/coffeescripts/gradezilla/SetDefaultGradeDialog.coffee
@@ -38,7 +38,7 @@ define [
class SetDefaultGradeDialog
constructor: ({@assignment, @students, @context_id, @selected_section}) ->
- show: =>
+ show: (onClose) =>
templateLocals =
assignment: @assignment
showPointsPossible: (@assignment.points_possible || @assignment.points_possible == '0') && @assignment.grading_type != "gpa_scale"
@@ -52,6 +52,7 @@ define [
open: => @$dialog.find(".grading_box").focus()
close: => @$dialog.remove()
).fixDialogButtons()
+ @$dialog.on 'dialogclose', onClose
$form = @$dialog
$(".ui-dialog-titlebar-close").focus()
@@ -85,7 +86,7 @@ define [
count: submissions.length)
submittingDfd.resolve()
$("#set_default_grade").focus()
- @$dialog.remove()
+ @$dialog.dialog('close')
getStudents = =>
if @selected_section
diff --git a/app/coffeescripts/shared/CurveGradesDialog.coffee b/app/coffeescripts/shared/CurveGradesDialog.coffee
index 26e70e8837a..62640d008b1 100644
--- a/app/coffeescripts/shared/CurveGradesDialog.coffee
+++ b/app/coffeescripts/shared/CurveGradesDialog.coffee
@@ -32,7 +32,7 @@ define [
class CurveGradesDialog
constructor: ({@assignment, @students, @context_url}) ->
- show: =>
+ show: (onClose) =>
locals =
assignment: @assignment
action: "#{@context_url}/gradebook/update_submission"
@@ -90,6 +90,7 @@ define [
close: => @$dialog.remove()
.fixDialogButtons()
+ @$dialog.on 'dialogclose', onClose
@$dialog.parent().find('.ui-dialog-titlebar-close').focus()
@$dialog.find("#middle_score").bind "blur change keyup focus", @curve
@$dialog.find("#assign_blanks").change @curve
diff --git a/app/coffeescripts/shared/GradeDisplayWarningDialog.coffee b/app/coffeescripts/shared/GradeDisplayWarningDialog.coffee
index 3dcef137d58..3fbcf091090 100644
--- a/app/coffeescripts/shared/GradeDisplayWarningDialog.coffee
+++ b/app/coffeescripts/shared/GradeDisplayWarningDialog.coffee
@@ -36,13 +36,16 @@ define [
buttons: [{
text: I18n.t("grade_display_warning.cancel", "Cancel"), click: @cancel},
{text: I18n.t("grade_display_warning.continue", "Continue"), click: @save}]
+ close: =>
+ @$dialog.remove()
+ options.onClose() if typeof options.onClose == 'function'
save: () =>
if @$dialog.find('#hide_warning').prop('checked')
@options.save({ dontWarnAgain: true })
else
@options.save({ dontWarnAgain: false })
- @$dialog.remove()
+ @$dialog.dialog('close')
cancel: () =>
- @$dialog.remove()
+ @$dialog.dialog('close')
diff --git a/app/jsx/gradezilla/default_gradebook/CurveGradesDialogManager.js b/app/jsx/gradezilla/default_gradebook/CurveGradesDialogManager.js
index 17908c34741..1bafa49ba9a 100644
--- a/app/jsx/gradezilla/default_gradebook/CurveGradesDialogManager.js
+++ b/app/jsx/gradezilla/default_gradebook/CurveGradesDialogManager.js
@@ -27,13 +27,13 @@ import 'compiled/jquery.rails_flash_notifications'
return {
isDisabled: !submissionsLoaded || gradingType === 'pass_fail' || pointsPossible == null || pointsPossible === 0,
- onSelect () { // eslint-disable-line consistent-return
+ onSelect (onClose) { // eslint-disable-line consistent-return
if (!isAdmin && assignment.inClosedGradingPeriod) {
return $.flashError(I18n.t('Unable to curve grades because this assignment is due in a closed ' +
'grading period for at least one student'));
}
const dialog = new CurveGradesDialog({assignment, students, context_url: contextUrl});
- dialog.show();
+ dialog.show(onClose);
}
};
}
diff --git a/app/jsx/gradezilla/default_gradebook/components/AssignmentColumnHeader.js b/app/jsx/gradezilla/default_gradebook/components/AssignmentColumnHeader.js
index 3bf7e1c32ad..aa51c6bee86 100644
--- a/app/jsx/gradezilla/default_gradebook/components/AssignmentColumnHeader.js
+++ b/app/jsx/gradezilla/default_gradebook/components/AssignmentColumnHeader.js
@@ -38,6 +38,7 @@ import ColumnHeader from 'jsx/gradezilla/default_gradebook/components/ColumnHead
class AssignmentColumnHeader extends ColumnHeader {
static propTypes = {
+ ...ColumnHeader.propTypes,
assignment: shape({
courseId: string.isRequired,
htmlUrl: string.isRequired,
@@ -92,8 +93,7 @@ class AssignmentColumnHeader extends ColumnHeader {
onSelect: func.isRequired
}).isRequired,
onMenuClose: func.isRequired,
- showUnpostedMenuItem: bool.isRequired,
- ...ColumnHeader.propTypes
+ showUnpostedMenuItem: bool.isRequired
};
static defaultProps = {
@@ -117,6 +117,18 @@ class AssignmentColumnHeader extends ColumnHeader {
}
bindAssignmentLink = (ref) => { this.assignmentLink = ref };
+
+ curveGrades = () => { this.invokeAndSkipFocus(this.props.curveGradesAction) };
+ setDefaultGrades = () => { this.invokeAndSkipFocus(this.props.setDefaultGradeAction) };
+ muteAssignment = () => { this.invokeAndSkipFocus(this.props.muteAssignmentAction) };
+ downloadSubmissions = () => { this.invokeAndSkipFocus(this.props.downloadSubmissionsAction) };
+ reuploadSubmissions = () => { this.invokeAndSkipFocus(this.props.reuploadSubmissionsAction) };
+
+ invokeAndSkipFocus (action) {
+ this.setState({ skipFocusOnClose: true });
+ action.onSelect(this.focusAtEnd);
+ }
+
focusAtStart = () => { this.assignmentLink.focus() };
handleKeyDown = (event) => {
@@ -138,7 +150,9 @@ class AssignmentColumnHeader extends ColumnHeader {
};
showMessageStudentsWhoDialog = () => {
+ this.setState({ skipFocusOnClose: true });
const settings = MessageStudentsWhoHelper.settings(this.props.assignment, this.activeStudentDetails());
+ settings.onClose = this.focusAtEnd;
window.messageStudents(settings);
}
@@ -266,7 +280,6 @@ class AssignmentColumnHeader extends ColumnHeader {
-