import { Injectable } from '@angular/core';
import { App } from '../app/app';
import { isPresent } from '../../util/util';
import { NavOptions } from '../../navigation/nav-util';
import { PopoverCmp } from './popover-component';
import { PopoverOptions } from './popover-options';
import { ViewController } from '../../navigation/view-controller';
/**
* @private
*/
export class Popover extends ViewController {
private _app: App;
constructor(app: App, component: any, data: any = {}, opts: PopoverOptions = {}) {
opts.showBackdrop = isPresent(opts.showBackdrop) ? !!opts.showBackdrop : true;
opts.enableBackdropDismiss = isPresent(opts.enableBackdropDismiss) ? !!opts.enableBackdropDismiss : true;
data.component = component;
data.opts = opts;
super(PopoverCmp, data, null);
this._app = app;
this.isOverlay = true;
}
/**
* @private
*/
getTransitionName(direction: string) {
let key = (direction === 'back' ? 'popoverLeave' : 'popoverEnter');
return this._nav && this._nav.config.get(key);
}
/**
* Present the popover instance.
*
* @param {NavOptions} [opts={}] Nav options to go with this transition.
* @returns {Promise} Returns a promise which is resolved when the transition has completed.
*/
present(navOptions: NavOptions = {}) {
return this._app.present(this, navOptions);
}
/**
* @private
* DEPRECATED: Please inject PopoverController instead
*/
static create(component: any, data = {}, opts: PopoverOptions = {}) {
// deprecated warning: added beta.11 2016-06-27
console.warn('Popover.create(..) has been deprecated. Please inject PopoverController instead');
}
}
/**
* @name PopoverController
* @description
* A Popover is a dialog that appears on top of the current page.
* It can be used for anything, but generally it is used for overflow
* actions that don't fit in the navigation bar.
*
* ### Creating
* A popover can be created by calling the `create` method. The view
* to display in the popover should be passed as the first argument.
* Any data to pass to the popover view can optionally be passed in
* the second argument. Options for the popover can optionally be
* passed in the third argument. See the [create](#create) method
* below for all available options.
*
* ### Presenting
* To present a popover, call the `present` method on a [PopoverController](../../nav/PopoverConroller) instance.
* In order to position the popover relative to the element clicked, a click event
* needs to be passed into the options of the the `present method. If the event
* is not passed, the popover will be positioned in the center of the current
* view. See the [usage](#usage) section for an example of passing this event.
*
* ### Dismissing
* To dismiss the popover after creation, call the `dismiss()` method on the
* `Popover` instance. The popover can also be dismissed from within the popover's
* view by calling the `dismiss()` method on the [ViewController](../../nav/ViewController).
* The `onDidDismiss` function can be called to perform an action after the popover
* is dismissed. The popover will dismiss when the backdrop is clicked, but this
* can be disabled by setting `enableBackdropDismiss` to `false` in the popover
* options.
*
* > Note that after the component is dismissed, it will not be usable anymore and
* another one must be created. This can be avoided by wrapping the creation and
* presentation of the component in a reusable function as shown in the [usage](#usage)
* section below.
*
* @usage
*
* To open a popover on the click of a button, pass `$event` to the method
* which creates and presents the popover:
*
* ```html
*
* ```
*
* ```ts
* @Component({})
* class MyPage {
* constructor(public popoverCtrl: PopoverController) {}
*
* presentPopover(myEvent) {
* let popover = this.popoverCtrl.create(PopoverPage);
* popover.present({
* ev: myEvent
* });
* }
* }
* ```
*
* The `PopoverPage` will display inside of the popover, and
* can be anything. Below is an example of a page with items
* that close the popover on click.
*
* ```ts
* @Component({
* template: `
*
* Ionic
*
*
*
*
*
* `
* })
* class PopoverPage {
* constructor(public viewCtrl: ViewController) {}
*
* close() {
* this.viewCtrl.dismiss();
* }
* }
* ```
* @advanced
* Popover Options
*
* | Option | Type | Description |
* |-----------------------|------------|------------------------------------------------------------------------------------------------------------------|
* | cssClass |`string` | Additional classes for custom styles, separated by spaces. |
* | showBackdrop |`boolean` | Whether to show the backdrop. Default true. |
* | enableBackdropDismiss |`boolean` | Whether the popover should be dismissed by tapping the backdrop. Default true. |
*
*
*
* @demo /docs/v2/demos/popover/
*/
@Injectable()
export class PopoverController {
constructor(private _app: App) {}
/**
* Present a popover. See below for options
* @param {object} component The Popover
* @param {object} data Any data to pass to the Popover view
* @param {PopoverOptions} opts Popover options
*/
create(component: any, data = {}, opts: PopoverOptions = {}): Popover {
return new Popover(this._app, component, data, opts);
}
}