diff --git a/js/ext/angular/src/service/ionicLoading.js b/js/ext/angular/src/service/ionicLoading.js
index 5690eca9731..1d72f83e4b5 100644
--- a/js/ext/angular/src/service/ionicLoading.js
+++ b/js/ext/angular/src/service/ionicLoading.js
@@ -3,11 +3,11 @@ var TPL_LOADING =
'
' +
'
';
-var HIDE_DEPRECATED = '$ionicLoading instance.hide() has been deprecated. Use $ionicLoading.hide().';
-var SHOW_DEPRECATED = '$ionicLoading instance.show() has been deprecated. Use $ionicLoading.show().';
-var SET_DEPRECATED = '$ionicLoading instance.setContent() has been deprecated. Use $ionicLoading.show({ content: \'my content\' }).';
-var SHOW_DELAY_DEPRECATED = '$ionicLoading options.showDelay has been deprecated. Use options.delay instead.';
-var SHOW_BACKDROP_DEPRECATED = '$ionicLoading options.showBackdrop has been deprecated. Use options.noBackdrop instead.';
+var HIDE_LOADING_DEPRECATED = '$ionicLoading instance.hide() has been deprecated. Use $ionicLoading.hide().';
+var SHOW_LOADING_DEPRECATED = '$ionicLoading instance.show() has been deprecated. Use $ionicLoading.show().';
+var SET_LOADING_DEPRECATED = '$ionicLoading instance.setContent() has been deprecated. Use $ionicLoading.show({ content: \'my content\' }).';
+var SHOW_DELAY_LOADING_DEPRECATED = '$ionicLoading options.showDelay has been deprecated. Use options.delay instead.';
+var SHOW_BACKDROP_LOADING_DEPRECATED = '$ionicLoading options.showBackdrop has been deprecated. Use options.noBackdrop instead.';
angular.module('ionic.service.loading', [])
@@ -97,9 +97,16 @@ function($animate, $document, $ionicTemplateLoader, $ionicBackdrop, $timeout, $q
}
var el = this.element;
+ var scope = this.scope;
ionic.requestAnimationFrame(function() {
$animate.removeClass(el, 'ng-hide');
+ //Fix for ios: if we center the element twice, it always gets
+ //position right. Otherwise, it doesn't
ionic.DomUtil.centerElementByMargin(el[0]);
+ //One frame after it's visible, position it
+ ionic.requestAnimationFrame(function() {
+ ionic.DomUtil.centerElementByMargin(el[0]);
+ });
});
this.isShown = true;
@@ -123,8 +130,8 @@ function($animate, $document, $ionicTemplateLoader, $ionicBackdrop, $timeout, $q
function showLoader(options) {
options || (options = {});
- deprecated.field(SHOW_DELAY_DEPRECATED, $log.warn, options, 'showDelay', options.showDelay);
- deprecated.field(SHOW_BACKDROP_DEPRECATED, $log.warn, options, 'showBackdrop', options.showBackdrop);
+ deprecated.field(SHOW_DELAY_LOADING_DEPRECATED, $log.warn, options, 'showDelay', options.showDelay);
+ deprecated.field(SHOW_BACKDROP_LOADING_DEPRECATED, $log.warn, options, 'showBackdrop', options.showBackdrop);
$timeout(getLoader, options.delay || options.showDelay || 0)
.then(function(loader) {
@@ -132,11 +139,11 @@ function($animate, $document, $ionicTemplateLoader, $ionicBackdrop, $timeout, $q
});
return {
- hide: deprecated.method(HIDE_DEPRECATED, $log.warn, hideLoader),
- show: deprecated.method(SHOW_DEPRECATED, $log.warn, function() {
+ hide: deprecated.method(HIDE_LOADING_DEPRECATED, $log.warn, hideLoader),
+ show: deprecated.method(SHOW_LOADING_DEPRECATED, $log.warn, function() {
showLoader(options);
}),
- setContent: deprecated.method(SET_DEPRECATED, $log.warn, function(content) {
+ setContent: deprecated.method(SET_LOADING_DEPRECATED, $log.warn, function(content) {
getLoader().then(function(loader) {
loader.scope.html = content;
});
diff --git a/js/ext/angular/src/service/ionicPopup.js b/js/ext/angular/src/service/ionicPopup.js
index c10cb52d868..68375980c99 100644
--- a/js/ext/angular/src/service/ionicPopup.js
+++ b/js/ext/angular/src/service/ionicPopup.js
@@ -12,6 +12,8 @@ var TPL_POPUP =
'' +
'';
+var CONTENT_POPUP_DEPRECATED = '$ionicPopup options.content has been deprecated. Use options.template instead.';
+
angular.module('ionic.service.popup', ['ionic.service.templateLoad'])
/**
@@ -22,102 +24,81 @@ angular.module('ionic.service.popup', ['ionic.service.templateLoad'])
* @codepen zkmhJ
* @description
*
- * The Ionic Popup service makes it easy to programmatically create and show popup
- * windows that require the user to respond in order to continue:
- *
- * The popup system has support for nicer versions of the built in `alert()` `prompt()` and `confirm()` functions
- * you are used to in the browser, but with more powerful support for customizing input types in the case of
- * prompt, or customizing the look of the window.
+ * The Ionic Popup service allows programmatically creating and showing popup
+ * windows that require the user to respond in order to continue.
*
- * But the true power of the Popup is when a built-in popup just won't cut it. Luckily, the popup window
- * has full support for arbitrary popup content, and a simple promise-based system for returning data
- * entered by the user.
+ * The popup system has support for more flexible versions of the built in `alert()`, `prompt()`,
+ * and `confirm()` functions that users are used to, in addition to allowing popups with completely
+ * custom content and look.
*
* @usage
- * To trigger a Popup in your code, use the $ionicPopup service in your angular controllers:
+ * A few basic examples, see below for details about all of the options available.
*
* ```js
* angular.module('mySuperApp', ['ionic'])
- * .controller(function($scope, $ionicPopup) {
+ * .controller(function($scope, $ionicPopup, $timeout) {
*
* // Triggered on a button click, or some other target
- $scope.showPopup = function() {
- $scope.data = {}
-
- // An elaborate, custom popup
- $ionicPopup.show({
- templateUrl: 'popup-template.html',
- title: 'Enter Wi-Fi Password',
- subTitle: 'Please use normal things',
- scope: $scope,
- buttons: [
- { text: 'Cancel', onTap: function(e) { return true; } },
- {
- text: 'Save',
- type: 'button-positive',
- onTap: function(e) {
- return $scope.data.wifi;
- }
- },
- ]
- }).then(function(res) {
- console.log('Tapped!', res);
- }, function(err) {
- console.log('Err:', err);
- }, function(popup) {
- // If you need to access the popup directly, do it in the notify method
- // This is also where you can programmatically close the popup:
- // popup.close();
- });
-
- // A confirm dialog
- $scope.showConfirm = function() {
- $ionicPopup.confirm({
- title: 'Consume Ice Cream',
- content: 'Are you sure you want to eat this ice cream?'
- }).then(function(res) {
- if(res) {
- console.log('You are sure');
- } else {
- console.log('You are not sure');
- }
- });
- };
-
- // A prompt dialog
- $scope.showPrompt = function() {
- $ionicPopup.prompt({
- title: 'ID Check',
- content: 'What is your name?'
- }).then(function(res) {
- console.log('Your name is', res);
- });
- };
-
- // A prompt with password input dialog
- $scope.showPasswordPrompt = function() {
- $ionicPopup.prompt({
- title: 'Password Check',
- content: 'Enter your secret password',
- inputType: 'password',
- inputPlaceholder: 'Your password'
- }).then(function(res) {
- console.log('Your password is', res);
- });
- };
-
- // An alert dialog
- $scope.showAlert = function() {
- $ionicPopup.alert({
- title: 'Don\'t eat that!',
- content: 'It might taste good'
- }).then(function(res) {
- console.log('Thank you for not eating my delicious ice cream cone');
- });
- };
- };
- });
- ```
+ * $scope.showPopup = function() {
+ * $scope.data = {}
+ *
+ * // An elaborate, custom popup
+ * var myPopup = $ionicPopup.show({
+ * template: '',
+ * title: 'Enter Wi-Fi Password',
+ * subTitle: 'Please use normal things',
+ * scope: $scope,
+ * buttons: [
+ * { text: 'Cancel' },
+ * {
+ * text: 'Save',
+ * type: 'button-positive',
+ * onTap: function(e) {
+ * if (!$scope.data.wifi) {
+ * //don't allow the user to close unless he enters wifi password
+ * e.preventDefault();
+ * } else {
+ * return $scope.data.wifi;
+ * }
+ * }
+ * },
+ * ]
+ * });
+ * myPopup.then(function(res) {
+ * console.log('Tapped!', res);
+ * });
+ * $timeout(function() {
+ * myPopup.close(); //close the popup after 3 seconds for some reason
+ * }, 3000);
+ *
+ * // A confirm dialog
+ * $scope.showConfirm = function() {
+ * var confirmPopup = $ionicPopup.confirm({
+ * title: 'Consume Ice Cream',
+ * template: 'Are you sure you want to eat this ice cream?'
+ * });
+ * confirmPopup.then(function(res) {
+ * if(res) {
+ * console.log('You are sure');
+ * } else {
+ * console.log('You are not sure');
+ * }
+ * });
+ * };
+ *
+ * // An alert dialog
+ * $scope.showAlert = function() {
+ * var alertPopup = $ionicPopup.alert({
+ * title: 'Don\'t eat that!',
+ * template: 'It might taste good'
+ * });
+ * alertPopup.then(function(res) {
+ * console.log('Thank you for not eating my delicious ice cream cone');
+ * });
+ * };
+ * };
+ *});
+ *```
*/
@@ -125,12 +106,13 @@ angular.module('ionic.service.popup', ['ionic.service.templateLoad'])
'$animate',
'$ionicTemplateLoader',
'$ionicBackdrop',
+ '$log',
'$q',
'$timeout',
'$rootScope',
'$document',
'$compile',
-function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScope, $document, $compile) {
+function($animate, $ionicTemplateLoader, $ionicBackdrop, $log, $q, $timeout, $rootScope, $document, $compile) {
//TODO allow this to be configured
var config = {
stackPushDelay: 50
@@ -139,68 +121,71 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
var $ionicPopup = {
/**
* @ngdoc method
- * @description Show a complex popup. This is the master show function for all popups.
+ * @description
+ * Show a complex popup. This is the master show function for all popups.
+ *
+ * A complex popup has a `buttons` array, with each button having a `text` and `type`
+ * field, in addition to an `onTap` function. The `onTap` function, called when
+ * the correspondingbutton on the popup is tapped, will by default close the popup
+ * and resolve the popup promise with its return value. If you wish to prevent the
+ * default and keep the popup open on button tap, call `event.preventDefault()` on the
+ * passed in tap event. Details below.
+ *
* @name $ionicPopup#show
- * @param {data} object The options for showing a popup, of the form:
- * @returns {Promise} an Angular promise which resolves when the user enters the correct data, and also sends the constructed popup in the notify function (for programmatic closing, as shown in the example above).
+ * @param {object} options The options for the new popup, of the form:
*
* ```
* {
- * content: '', // String. The content of the popup
- * title: '', // String. The title of the popup
- * subTitle: '', // String (optional). The sub-title of the popup
- * templateUrl: '', // URL String (optional). The URL of a template to load as the content (instead of the `content` field)
- * scope: null, // Scope (optional). A scope to apply to the popup content (for using ng-model in a template, for example)
- * buttons: [{
+ * title: '', // String. The title of the popup.
+ * subTitle: '', // String (optional). The sub-title of the popup.
+ * template: '', // String (optional). The html template to place in the popup body.
+ * templateUrl: '', // String (optional). The URL of an html template to place in the popup body.
+ * scope: null, // Scope (optional). A scope to link to the popup content.
+ * buttons: [{ //Array[Object] (optional). Buttons to place in the popup footer.
* text: 'Cancel',
* type: 'button-default',
* onTap: function(e) {
- * // e.preventDefault() or giving no return value will stop the popup
- * // from closing on tap
+ * // e.preventDefault() will stop the popup from closing when tapped.
* e.preventDefault();
* }
* }, {
* text: 'OK',
* type: 'button-positive',
* onTap: function(e) {
- * // When the user taps one of the buttons, you need to return the
- * // Data you want back to the popup service which will then resolve
- * // the promise waiting for a response.
+ * // Returning a value will cause the promise to resolve with the given value.
* return scope.data.response;
* }
* }]
* }
* ```
+ *
+ * @returns {object} A promise which is resolved when the popup is closed. Has an additional
+ * `close` function, which can be used to programmatically close the popup.
*/
show: showPopup,
/**
* @ngdoc method
* @name $ionicPopup#alert
- * @description show a simple popup with one button that the user has to tap
- *
- * Show a simple alert dialog
- *
- * ```javascript
- * $ionicPopup.alert({
- * title: 'Hey!',
- * content: 'Don\'t do that!'
- * }).then(function(res) {
- * // Accepted
- * });
- * ```
+ * @description Show a simple alert popup with a message and one button that the user can
+ * tap to close the popup.
*
- * @returns {Promise} that resolves when the alert is accepted
- * @param {data} object The options for showing an alert, of the form:
+ * @param {object} options The options for showing the alert, of the form:
*
* ```
* {
- * content: '', // String. The content of the popup
- * title: '', // String. The title of the popup
- * okText: '', // String. The text of the OK button
- * okType: '', // String (default: button-positive). The type of the OK button
+ * title: '', // String. The title of the popup.
+ * subTitle: '', // String (optional). The sub-title of the popup.
+ * template: '', // String (optional). The html template to place in the popup body.
+ * templateUrl: '', // String (optional). The URL of an html template to place in the popup body.
+ * okText: '', // String (default: 'OK'). The text of the OK button.
+ * okType: '', // String (default: 'button-positive'). The type of the OK button.
* }
* ```
+ *
+ * @returns {object} A promise which is resolved when the popup is closed. Has one additional
+ * function `close`, which can be called with any value to programmatically close the popup
+ * with the given value.
*/
alert: showAlert,
@@ -208,69 +193,69 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
* @ngdoc method
* @name $ionicPopup#confirm
* @description
- * Show a simple confirm popup with a cancel and accept button:
+ * Show a simple confirm popup with a Cancel and OK button.
*
- * ```javascript
- * $ionicPopup.confirm({
- * title: 'Consume Ice Cream',
- * content: 'Are you sure you want to eat this ice cream?'
- * }).then(function(res) {
- * if(res) {
- * console.log('You are sure');
- * } else {
- * console.log('You are not sure');
- * }
- * });
- * ```
+ * Resolves the promise with true if the user presses the OK button, and false if the
+ * user presses the Cancel button.
*
- * @returns {Promise} that resolves with the chosen option
- * @param {data} object The options for showing a confirm dialog, of the form:
+ * @param {object} options The options for showing the confirm popup, of the form:
*
* ```
* {
- * content: '', // String. The content of the popup
- * title: '', // String. The title of the popup
- * cancelText: '', // String. The text of the Cancel button
- * cancelType: '', // String (default: button-default). The type of the kCancel button
- * okText: '', // String. The text of the OK button
- * okType: '', // String (default: button-positive). The type of the OK button
+ * title: '', // String. The title of the popup.
+ * subTitle: '', // String (optional). The sub-title of the popup.
+ * template: '', // String (optional). The html template to place in the popup body.
+ * templateUrl: '', // String (optional). The URL of an html template to place in the popup body.
+ * cancelText: '', // String (default: 'Cancel'). The text of the Cancel button.
+ * cancelType: '', // String (default: 'button-default'). The type of the Cancel button.
+ * okText: '', // String (default: 'OK'). The text of the OK button.
+ * okType: '', // String (default: 'button-positive'). The type of the OK button.
* }
* ```
+ *
+ * @returns {object} A promise which is resolved when the popup is closed. Has one additional
+ * function `close`, which can be called with any value to programmatically close the popup
+ * with the given value.
*/
confirm: showConfirm,
/**
* @ngdoc method
* @name $ionicPopup#prompt
- * @description show a simple prompt dialog.
+ * @description Show a simple prompt popup, which has an input, OK button, and Cancel button.
+ * Resolves the promise with the value of the input if the user presses OK, and with undefined
+ * if the user presses Cancel.
*
* ```javascript
* $ionicPopup.prompt({
* title: 'Password Check',
- * content: 'Enter your secret password',
+ * template: 'Enter your secret password',
* inputType: 'password',
* inputPlaceholder: 'Your password'
* }).then(function(res) {
* console.log('Your password is', res);
* });
* ```
- *
- * @returns {Promise} that resolves with the entered data
- * @param {data} object The options for showing a prompt dialog, of the form:
+ * @param {object} options The options for showing the prompt popup, of the form:
*
* ```
* {
- * content: // String. The content of the popup
- * title: // String. The title of the popup
- * subTitle: // String. The sub title of the popup
- * inputType: // String (default: "text"). The type of input to use
- * inputPlaceholder: // String (default: ""). A placeholder to use for the input.
- * cancelText: // String. The text of the Cancel button
- * cancelType: // String (default: button-default). The type of the kCancel button
- * okText: // String. The text of the OK button
- * okType: // String (default: button-positive). The type of the OK button
+ * title: '', // String. The title of the popup.
+ * subTitle: '', // String (optional). The sub-title of the popup.
+ * template: '', // String (optional). The html template to place in the popup body.
+ * templateUrl: '', // String (optional). The URL of an html template to place in the popup body.
+ * inputType: // String (default: 'text'). The type of input to use
+ * inputPlaceholder: // String (default: ''). A placeholder to use for the input.
+ * cancelText: // String (default: 'Cancel'. The text of the Cancel button.
+ * cancelType: // String (default: 'button-default'). The type of the Cancel button.
+ * okText: // String (default: 'OK'). The text of the OK button.
+ * okType: // String (default: 'button-positive'). The type of the OK button.
* }
* ```
+ *
+ * @returns {object} A promise which is resolved when the popup is closed. Has one additional
+ * function `close`, which can be called with any value to programmatically close the popup
+ * with the given value.
*/
prompt: showPrompt,
/**
@@ -289,6 +274,8 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
buttons: [],
}, options || {});
+ deprecated.field(CONTENT_POPUP_DEPRECATED, $log.warn, options, 'content', options.content);
+
var popupPromise = $ionicTemplateLoader.compile({
template: TPL_POPUP,
scope: options.scope && options.scope.$new(),
@@ -305,7 +292,6 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
var responseDeferred = $q.defer();
self.responseDeferred = responseDeferred;
- self.responseDeferred.notify(self);
//Can't ng-bind-html for popup-body because it can be insecure html
//(eg an input in case of prompt)
@@ -317,17 +303,16 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
body.remove();
}
-
angular.extend(self.scope, {
title: options.title,
buttons: options.buttons,
subTitle: options.subTitle,
$buttonTapped: function(button, event) {
- var result = button.onTap && button.onTap(event);
- event = event.originalEvent || event;
+ var result = (button.onTap || angular.noop)(event);
+ event = event.originalEvent || event; //jquery events
- if (event.defaultPrevented || angular.isDefined(result)) {
- responseDeferred.resolve(event.defaultPrevented ? undefined : result);
+ if (!event.defaultPrevented) {
+ responseDeferred.resolve(result);
}
}
});
@@ -339,7 +324,13 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
self.element.removeClass('popup-hidden');
self.element.addClass('popup-showing active');
focusLastButton(self.element);
+ //Fix for ios: if we center the element twice, it always gets
+ //position right. Otherwise, it doesn't
ionic.DomUtil.centerElementByMargin(self.element[0]);
+ //One frame after it's visible, position it
+ ionic.requestAnimationFrame(function() {
+ ionic.DomUtil.centerElementByMargin(self.element[0]);
+ });
});
self.isShown = true;
@@ -355,10 +346,14 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
self.isShown = false;
};
self.remove = function() {
+ if (self.removed) return;
+
self.hide(function() {
self.element.remove();
self.scope.$destroy();
});
+
+ self.removed = true;
};
return self;
@@ -373,7 +368,7 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
previousPopup.hide();
}
- return $timeout(angular.noop, previousPopup ? config.stackPushDelay : 0)
+ var resultPromise = $timeout(angular.noop, previousPopup ? config.stackPushDelay : 0)
.then(function() { return popupPromise; })
.then(function(popup) {
if (!previousPopup) {
@@ -384,8 +379,16 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
popupStack.unshift(popup);
popup.show();
+ //DEPRECATED: notify the promise with an object with a close method
+ popup.responseDeferred.notify({
+ close: resultPromise.close
+ });
+
return popup.responseDeferred.promise.then(function(result) {
- popupStack.shift();
+ var index = popupStack.indexOf(popup);
+ if (index !== -1) {
+ popupStack.splice(index, 1);
+ }
popup.remove();
var previousPopup = popupStack[0];
@@ -400,6 +403,17 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
return result;
});
});
+
+ function close(result) {
+ popupPromise.then(function(popup) {
+ if (!popup.removed) {
+ popup.responseDeferred.resolve(result);
+ }
+ });
+ }
+ resultPromise.close = close;
+
+ return resultPromise;
}
function focusLastButton(element) {
@@ -411,9 +425,7 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
}
function showAlert(opts) {
- return showPopup({
- content: opts.content,
- title: opts.title,
+ return showPopup( angular.extend({
buttons: [{
text: opts.okText || 'OK',
type: opts.okType || 'button-positive',
@@ -421,13 +433,11 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
return true;
}
}]
- });
+ }, opts || {}) );
}
function showConfirm(opts) {
- return showPopup({
- content: opts.content || '',
- title: opts.title || '',
+ return showPopup( angular.extend({
buttons: [{
text: opts.cancelText || 'Cancel' ,
type: opts.cancelType || 'button-default',
@@ -437,17 +447,15 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
type: opts.okType || 'button-positive',
onTap: function(e) { return true; }
}]
- });
+ }, opts || {}) );
}
function showPrompt(opts) {
var scope = $rootScope.$new(true);
scope.data = {};
- return showPopup({
- content: opts.content ||
- '',
- title: opts.title || '',
- subTitle: opts.subTitle || '',
+ return showPopup( angular.extend({
+ template: '',
scope: scope,
buttons: [{
text: opts.cancelText || 'Cancel',
@@ -457,10 +465,10 @@ function($animate, $ionicTemplateLoader, $ionicBackdrop, $q, $timeout, $rootScop
text: opts.okText || 'OK',
type: opts.okType || 'button-positive',
onTap: function(e) {
- return scope.data.response;
+ return scope.data.response || '';
}
}]
- });
+ }, opts || {}) );
}
}]);
diff --git a/js/ext/angular/test/service/ionicPopup.unit.js b/js/ext/angular/test/service/ionicPopup.unit.js
index ad15d4316c6..558facc3cc9 100644
--- a/js/ext/angular/test/service/ionicPopup.unit.js
+++ b/js/ext/angular/test/service/ionicPopup.unit.js
@@ -55,12 +55,8 @@ describe('$ionicPopup service', function() {
describe('$buttonTapped', function() {
var popup;
- var button;
- var event;
beforeEach(function() {
popup = TestUtil.unwrapPromise($ionicPopup._createPopup());
- button = { onTap: jasmine.createSpy('onTap') };
- event = {};
spyOn(popup.responseDeferred, 'resolve');
});
it('should call button.onTap with event', function() {
@@ -69,20 +65,20 @@ describe('$ionicPopup service', function() {
popup.scope.$buttonTapped(button, event);
expect(button.onTap).toHaveBeenCalledWith(event);
});
- it('should do nothing if no result & not defaultPrevented', function() {
- popup.scope.$buttonTapped(button, event);
- expect(popup.responseDeferred.resolve).not.toHaveBeenCalled();
- });
- it('should resolve if defaultPrevented', function() {
- event.defaultPrevented = true;
- popup.scope.$buttonTapped(button, event);
- expect(popup.responseDeferred.resolve).toHaveBeenCalledWith(undefined);
- });
- it('should resolve with result if result', function() {
- button.onTap = jasmine.createSpy('onTap').andReturn('123');
- popup.scope.$buttonTapped(button, event);
+ it('should resolve with return value from button.onTap', function() {
+ popup.scope.$buttonTapped({
+ onTap: function() { return '123' }
+ }, {});
expect(popup.responseDeferred.resolve).toHaveBeenCalledWith('123');
});
+ it('should not resolve if defaultPrevented', function() {
+ popup.scope.$buttonTapped({
+ onTap: function(){}
+ }, {
+ defaultPrevented: true
+ });
+ expect(popup.responseDeferred.resolve).not.toHaveBeenCalled();
+ });
});
describe('show', function() {
@@ -140,7 +136,7 @@ describe('$ionicPopup service', function() {
});
- describe('show()', function() {
+ describe('$ionicPopup.showPopup()', function() {
afterEach(function() {
document.body.classList.remove('popup-open');
});
@@ -177,6 +173,16 @@ describe('$ionicPopup service', function() {
expect(fakePopup.show).toHaveBeenCalled();
}));
+ it('should have close function which resolves promise with argument', inject(function($ionicPopup, $q, $rootScope) {
+ var popup = TestUtil.unwrapPromise($ionicPopup._createPopup());
+ spyOn($ionicPopup, '_createPopup').andReturn($q.when(popup));
+ var result = $ionicPopup.show();
+ spyOn(popup.responseDeferred, 'resolve');
+ result.close('foobar');
+ $rootScope.$apply();
+ expect(popup.responseDeferred.resolve).toHaveBeenCalledWith('foobar');
+ }));
+
it('should after timeout and resolve remove popup, then return result', inject(function($ionicPopup, $timeout, $q, $rootScope) {
var fakePopup = {
show: jasmine.createSpy('show'),
diff --git a/scss/_popup.scss b/scss/_popup.scss
index c1ddff83a5b..f2ce6fb0509 100644
--- a/scss/_popup.scss
+++ b/scss/_popup.scss
@@ -89,20 +89,3 @@
pointer-events: auto;
}
}
-
-.popup-backdrop {
- @include animation-name(fadeIn);
- @include animation-duration($popup-backdrop-fadein-duration);
- @include animation-timing-function(linear);
- @include animation-fill-mode(both);
-
- position: fixed;
- top: 0;
- left: 0;
- z-index: $z-index-popup-backdrop;
-
- width: 100%;
- height: 100%;
-
- background-color: rgba(0,0,0,0.4);
-}