Skip to content

Commit c2253f5

Browse files
authored
Merge pull request nasa#1374 from cseale/mct1197
[Dialogs] Close dialogs by pressing the ESC key
2 parents 290dd0a + bee2231 commit c2253f5

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

platform/commonUI/dialog/bundle.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ define([
5353
"depends": [
5454
"overlayService",
5555
"$q",
56-
"$log"
56+
"$log",
57+
"$document"
5758
]
5859
},
5960
{

platform/commonUI/dialog/src/DialogService.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ define(
3535
* @memberof platform/commonUI/dialog
3636
* @constructor
3737
*/
38-
function DialogService(overlayService, $q, $log) {
38+
function DialogService(overlayService, $q, $log, $document) {
3939
this.overlayService = overlayService;
4040
this.$q = $q;
4141
this.$log = $log;
4242
this.activeOverlay = undefined;
43+
44+
this.findBody = function () {
45+
return $document.find('body');
46+
};
4347
}
4448

4549
/**
@@ -76,13 +80,22 @@ define(
7680
// Cancel or X button click
7781
function cancel() {
7882
deferred.reject();
83+
self.findBody().off('keydown', handleEscKeydown);
7984
self.dismissOverlay(overlay);
8085
}
8186

87+
function handleEscKeydown(event){
88+
if (event.keyCode === 27) {
89+
cancel();
90+
}
91+
}
92+
8293
// Add confirm/cancel callbacks
8394
model.confirm = confirm;
8495
model.cancel = cancel;
8596

97+
this.findBody().on('keydown', handleEscKeydown);
98+
8699
if (this.canShowDialog(model)) {
87100
// Add the overlay using the OverlayService, which
88101
// will handle actual insertion into the DOM

platform/commonUI/dialog/test/DialogServiceSpec.js

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ define(
3333
mockLog,
3434
mockOverlay,
3535
mockDeferred,
36+
mockDocument,
37+
mockBody,
3638
dialogService;
3739

3840
beforeEach(function () {
@@ -56,6 +58,16 @@ define(
5658
"deferred",
5759
["resolve", "reject"]
5860
);
61+
mockDocument = jasmine.createSpyObj(
62+
"$document",
63+
["find"]
64+
);
65+
mockBody = angular.element(document.createElement('body'));
66+
spyOn(mockBody, 'on').andCallThrough();
67+
spyOn(mockBody, 'off').andCallThrough();
68+
69+
mockDocument.find.andReturn(mockBody);
70+
5971
mockDeferred.promise = "mock promise";
6072

6173
mockQ.defer.andReturn(mockDeferred);
@@ -64,7 +76,8 @@ define(
6476
dialogService = new DialogService(
6577
mockOverlayService,
6678
mockQ,
67-
mockLog
79+
mockLog,
80+
mockDocument
6881
);
6982
});
7083

@@ -130,6 +143,38 @@ define(
130143
);
131144
});
132145

146+
it("adds a keydown event listener to the body", function () {
147+
dialogService.getUserInput({}, {});
148+
expect(mockDocument.find).toHaveBeenCalledWith("body");
149+
expect(mockBody.on).toHaveBeenCalledWith("keydown", jasmine.any(Function));
150+
});
151+
152+
it("destroys the event listener when the dialog is cancelled", function () {
153+
dialogService.getUserInput({}, {});
154+
mockOverlayService.createOverlay.mostRecentCall.args[1].cancel();
155+
expect(mockBody.off).toHaveBeenCalledWith("keydown", jasmine.any(Function));
156+
});
157+
158+
it("cancels the dialog when an escape keydown event is triggered", function () {
159+
dialogService.getUserInput({}, {});
160+
mockBody.triggerHandler({
161+
type: 'keydown',
162+
keyCode: 27
163+
});
164+
expect(mockDeferred.reject).toHaveBeenCalled();
165+
expect(mockDeferred.resolve).not.toHaveBeenCalled();
166+
});
167+
168+
it("ignores non escape keydown events", function () {
169+
dialogService.getUserInput({}, {});
170+
mockBody.triggerHandler({
171+
type: 'keydown',
172+
keyCode: 13
173+
});
174+
expect(mockDeferred.reject).not.toHaveBeenCalled();
175+
expect(mockDeferred.resolve).not.toHaveBeenCalled();
176+
});
177+
133178
describe("the blocking message dialog", function () {
134179
var dialogModel = {};
135180
var dialogHandle;

0 commit comments

Comments
 (0)