From ddff0065b737b5a0070871e1dbca1ed590dfc3df Mon Sep 17 00:00:00 2001 From: Greg Allensworth Date: Mon, 7 Dec 2015 18:35:15 -0800 Subject: [PATCH 1/6] Issue #4737 - adds to a keypress framework, and adds Enter/Escape handling to .prompt --- js/angular/service/popup.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/js/angular/service/popup.js b/js/angular/service/popup.js index 1cbeb70b0b8..c20ef044ffe 100644 --- a/js/angular/service/popup.js +++ b/js/angular/service/popup.js @@ -391,6 +391,16 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB //DEPRECATED: notify the promise with an object with a close method popup.responseDeferred.notify({ close: popup.responseDeferred.close }); + // if any keypress handlers were requested, go ahead and assign them now + // options.keyPressHandlers is the user-generated assoc: keycode => function() + // popup.keyPressHandlers is a list of event-listener handles returned by addEventListener() + // and is used to unbind these event listeners when the popup is closing ("then" block below) + popup.element[0].keyPressHandlers = options.keyPressHandlers || {}; + popup.keylistener = popup.element[0].addEventListener('keypress', function (keyEvent) { + var userfunc = this.keyPressHandlers[keyEvent.keyCode]; + if (userfunc) userfunc(popup); + }); + doShow(); return popup.responseDeferred.promise; @@ -405,6 +415,8 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB popupStack.splice(index, 1); } + popup.element[0].removeEventListener('keypress', popup.keylistener); + popup.remove(); if (popupStack.length > 0) { @@ -470,11 +482,28 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB scope.data.response = opts.defaultText ? opts.defaultText : ''; scope.data.placeholder = opts.inputPlaceholder ? opts.inputPlaceholder : ''; scope.data.maxlength = opts.maxLength ? parseInt(opts.maxLength) : ''; + var text = ''; if (opts.template && /<[a-z][\s\S]*>/i.test(opts.template) === false) { text = '' + opts.template + ''; delete opts.template; } + + var keyPressHandlers = { + "13": function (popup) { // 13 = Enter = OK + var button = popup.scope.buttons[1]; + var tapper = popup.scope.$buttonTapped; + var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); + tapper(button,fclick); + }, + "27": function (popup) { // 27 = Esc = Cancel + var button = popup.scope.buttons[0]; + var tapper = popup.scope.$buttonTapped; + var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); + tapper(button,fclick); + } + }; + return showPopup(extend({ template: text + ' Date: Mon, 7 Dec 2015 18:37:54 -0800 Subject: [PATCH 2/6] Issue #4737 - adds to a keypress framework, and adds Enter/Escape handling to .prompt --- js/angular/service/popup.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/angular/service/popup.js b/js/angular/service/popup.js index c20ef044ffe..8579bb226f9 100644 --- a/js/angular/service/popup.js +++ b/js/angular/service/popup.js @@ -505,6 +505,7 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB }; return showPopup(extend({ + keyPressHandlers: keyPressHandlers, template: text + ' Date: Mon, 7 Dec 2015 18:54:12 -0800 Subject: [PATCH 3/6] issue #4737 - Enter/Esc support for Alert and Confirm popups --- js/angular/service/popup.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/js/angular/service/popup.js b/js/angular/service/popup.js index 8579bb226f9..6fce50e1b24 100644 --- a/js/angular/service/popup.js +++ b/js/angular/service/popup.js @@ -450,7 +450,23 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB } function showAlert(opts) { + var keyPressHandlers = { + "13": function (popup) { // 13 = Enter = OK + var button = popup.scope.buttons[0]; + var tapper = popup.scope.$buttonTapped; + var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); + tapper(button,fclick); + }, + "27": function (popup) { // 27 = Esc = Cancel + var button = popup.scope.buttons[0]; + var tapper = popup.scope.$buttonTapped; + var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); + tapper(button,fclick); + } + }; + return showPopup(extend({ + keyPressHandlers: keyPressHandlers, buttons: [{ text: opts.okText || 'OK', type: opts.okType || 'button-positive', @@ -462,7 +478,23 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB } function showConfirm(opts) { + var keyPressHandlers = { + "13": function (popup) { // 13 = Enter = OK + var button = popup.scope.buttons[1]; + var tapper = popup.scope.$buttonTapped; + var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); + tapper(button,fclick); + }, + "27": function (popup) { // 27 = Esc = Cancel + var button = popup.scope.buttons[0]; + var tapper = popup.scope.$buttonTapped; + var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); + tapper(button,fclick); + } + }; + return showPopup(extend({ + keyPressHandlers: keyPressHandlers, buttons: [{ text: opts.cancelText || 'Cancel', type: opts.cancelType || 'button-default', From 48c20c7250e27541ce0ac103f37c18e3969dc091 Mon Sep 17 00:00:00 2001 From: Greg Allensworth Date: Mon, 7 Dec 2015 18:56:37 -0800 Subject: [PATCH 4/6] issue #4737 - Enter/Esc listener bound to window instead of popup element --- js/angular/service/popup.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/angular/service/popup.js b/js/angular/service/popup.js index 6fce50e1b24..2d9c4cd0566 100644 --- a/js/angular/service/popup.js +++ b/js/angular/service/popup.js @@ -396,8 +396,8 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB // popup.keyPressHandlers is a list of event-listener handles returned by addEventListener() // and is used to unbind these event listeners when the popup is closing ("then" block below) popup.element[0].keyPressHandlers = options.keyPressHandlers || {}; - popup.keylistener = popup.element[0].addEventListener('keypress', function (keyEvent) { - var userfunc = this.keyPressHandlers[keyEvent.keyCode]; + popup.keylistener = window.addEventListener('keypress', function (keyEvent) { + var userfunc = popup.element[0].keyPressHandlers[keyEvent.keyCode]; if (userfunc) userfunc(popup); }); @@ -415,7 +415,7 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB popupStack.splice(index, 1); } - popup.element[0].removeEventListener('keypress', popup.keylistener); + window.removeEventListener('keypress', popup.keylistener); popup.remove(); From 650093cd771305cf29b8c2d9da5440c5bb69c367 Mon Sep 17 00:00:00 2001 From: Greg Allensworth Date: Mon, 7 Dec 2015 19:05:40 -0800 Subject: [PATCH 5/6] issue #4737 Fixes for circleci --- js/angular/service/popup.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/js/angular/service/popup.js b/js/angular/service/popup.js index 2d9c4cd0566..ae4b828b94d 100644 --- a/js/angular/service/popup.js +++ b/js/angular/service/popup.js @@ -454,14 +454,14 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB "13": function (popup) { // 13 = Enter = OK var button = popup.scope.buttons[0]; var tapper = popup.scope.$buttonTapped; - var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); - tapper(button,fclick); + var fclick = new MouseEvent('click', { 'view': window, 'bubbles': true, 'cancelable': true }); + tapper(button, fclick); }, "27": function (popup) { // 27 = Esc = Cancel var button = popup.scope.buttons[0]; var tapper = popup.scope.$buttonTapped; - var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); - tapper(button,fclick); + var fclick = new MouseEvent('click', { 'view': window, 'bubbles': true, 'cancelable': true }); + tapper(button, fclick); } }; @@ -482,14 +482,14 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB "13": function (popup) { // 13 = Enter = OK var button = popup.scope.buttons[1]; var tapper = popup.scope.$buttonTapped; - var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); - tapper(button,fclick); + var fclick = new MouseEvent('click', { 'view': window, 'bubbles': true, 'cancelable': true }); + tapper(button, fclick); }, "27": function (popup) { // 27 = Esc = Cancel var button = popup.scope.buttons[0]; var tapper = popup.scope.$buttonTapped; - var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); - tapper(button,fclick); + var fclick = new MouseEvent('click', { 'view': window, 'bubbles': true, 'cancelable': true }); + tapper(button, fclick); } }; @@ -525,14 +525,14 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB "13": function (popup) { // 13 = Enter = OK var button = popup.scope.buttons[1]; var tapper = popup.scope.$buttonTapped; - var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); - tapper(button,fclick); + var fclick = new MouseEvent('click', { 'view': window, 'bubbles': true, 'cancelable': true }); + tapper(button, fclick); }, "27": function (popup) { // 27 = Esc = Cancel var button = popup.scope.buttons[0]; var tapper = popup.scope.$buttonTapped; - var fclick = new MouseEvent('click', { 'view':window, 'bubbles':true, 'cancelable':true }); - tapper(button,fclick); + var fclick = new MouseEvent('click', { 'view': window, 'bubbles': true, 'cancelable': true }); + tapper(button, fclick); } }; From cd8974d1c34d0f27b1b4c3a79503151389ea8eaa Mon Sep 17 00:00:00 2001 From: Greg Allensworth Date: Mon, 7 Dec 2015 19:17:29 -0800 Subject: [PATCH 6/6] issue #4737 Fixes for circleci --- js/angular/service/popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/angular/service/popup.js b/js/angular/service/popup.js index ae4b828b94d..a9b1332312f 100644 --- a/js/angular/service/popup.js +++ b/js/angular/service/popup.js @@ -395,7 +395,7 @@ function($ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $ionicB // options.keyPressHandlers is the user-generated assoc: keycode => function() // popup.keyPressHandlers is a list of event-listener handles returned by addEventListener() // and is used to unbind these event listeners when the popup is closing ("then" block below) - popup.element[0].keyPressHandlers = options.keyPressHandlers || {}; + popup.element[0].keyPressHandlers = options.keyPressHandlers ? options.keyPressHandlers : {}; popup.keylistener = window.addEventListener('keypress', function (keyEvent) { var userfunc = popup.element[0].keyPressHandlers[keyEvent.keyCode]; if (userfunc) userfunc(popup);