From 31926b2fe46dcbe24f02d6a12e855b009cc45243 Mon Sep 17 00:00:00 2001 From: Petr Vobornik Date: Mon, 21 Oct 2013 14:22:31 +0200 Subject: [PATCH] Dialog keyboard behavior https://fedorahosted.org/freeipa/ticket/3904 --- install/ui/src/freeipa/dialog.js | 36 +++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/install/ui/src/freeipa/dialog.js b/install/ui/src/freeipa/dialog.js index 29f480c55..337d2e610 100644 --- a/install/ui/src/freeipa/dialog.js +++ b/install/ui/src/freeipa/dialog.js @@ -224,7 +224,8 @@ IPA.dialog = function(spec) { } that.dom_node = $('
', { - 'class': 'rcue-dialog-background' + 'class': 'rcue-dialog-background', + keydown: that.on_key_down }); var container_node = $('
', { @@ -361,6 +362,39 @@ IPA.dialog = function(spec) { return that.buttons_node; }; + /** + * Default keyboard behavior + * + * - close on escape if enabled by `close_on_escape` + * - makes sure that tabbing doesn't leave the dialog + */ + that.on_key_down = function(event) { + + if ( that.close_on_escape && !event.isDefaultPrevented() && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE ) { + event.preventDefault(); + that.close(); + return; + } + + // prevent tabbing out of dialogs + if ( event.keyCode !== $.ui.keyCode.TAB ) { + return; + } + + var tabbables = that.dom_node.find(":tabbable"), + first = tabbables.filter(":first"), + last = tabbables.filter(":last"); + + if ( ( event.target === last[0] || event.target === that.dialog_node[0] ) && !event.shiftKey ) { + first.focus( 1 ); + event.preventDefault(); + } else if ( ( event.target === first[0] || event.target === that.dialog_node[0] ) && event.shiftKey ) { + last.focus( 1 ); + event.preventDefault(); + } + }; + /** * Show message in dialog's message container * @param {string} message