From b9827d3229e48d92e12e80a0e890220c9a432637 Mon Sep 17 00:00:00 2001 From: MikeMatusz Date: Mon, 12 Jan 2015 15:40:38 -0500 Subject: [PATCH 1/2] Don't stop ESC propagation unless dropdown is open In reference to issue #3096 If the escape key should have other functionality in the context of a form (for example, if datepicker is on a modal) it makes sense to prevent this from happening if escape is used to close the dropdown. If the dropdown is closed, however, the event should be allowed to propagate. --- src/datepicker/datepicker.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/datepicker/datepicker.js b/src/datepicker/datepicker.js index 05784947d0..1afe23c466 100644 --- a/src/datepicker/datepicker.js +++ b/src/datepicker/datepicker.js @@ -567,7 +567,9 @@ function ($compile, $parse, $document, $position, dateFilter, dateParser, datepi scope.keydown = function(evt) { if (evt.which === 27) { evt.preventDefault(); - evt.stopPropagation(); + if (scope.isOpen) { + evt.stopPropagation(); + } scope.close(); } else if (evt.which === 40 && !scope.isOpen) { scope.isOpen = true; From 7123d9f460e11916d27ebf6d86b3e070b98f7c51 Mon Sep 17 00:00:00 2001 From: MikeMatusz Date: Tue, 13 Jan 2015 09:11:07 -0500 Subject: [PATCH 2/2] Adding test for ESC keydown propagation. --- src/datepicker/test/datepicker.spec.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/datepicker/test/datepicker.spec.js b/src/datepicker/test/datepicker.spec.js index b673d162da..bab11e772f 100644 --- a/src/datepicker/test/datepicker.spec.js +++ b/src/datepicker/test/datepicker.spec.js @@ -1248,6 +1248,27 @@ describe('datepicker directive', function () { expect(dropdownEl).toBeHidden(); expect(document.activeElement.tagName).toBe('INPUT'); }); + + it('stops the ESC key from propagating if the dropdown is open, but not when closed', function() { + expect(dropdownEl).not.toBeHidden(); + + dropdownEl.find('button').eq(0).focus(); + expect(document.activeElement.tagName).toBe('BUTTON'); + + var documentKey = -1; + var getKey = function(evt) { documentKey = evt.which; }; + $document.bind('keydown', getKey); + + triggerKeyDown(inputEl, 'esc'); + $rootScope.$digest(); + expect(dropdownEl).toBeHidden(); + expect(documentKey).toBe(-1); + + triggerKeyDown(inputEl, 'esc'); + expect(documentKey).toBe(27); + + $document.unbind('keydown', getKey); + }); }); });