diff --git a/src/components/action-sheet/action-sheet-component.ts b/src/components/action-sheet/action-sheet-component.ts index 89ba8e2c5c..1f4160bb8c 100644 --- a/src/components/action-sheet/action-sheet-component.ts +++ b/src/components/action-sheet/action-sheet-component.ts @@ -1,15 +1,12 @@ import { Component, Renderer, ElementRef, HostListener, ViewEncapsulation } from '@angular/core'; -import { NgClass, NgFor, NgIf } from '@angular/common'; import { Animation } from '../../animations/animation'; -import { Backdrop } from '../backdrop/backdrop'; import { Config } from '../../config/config'; import { Form } from '../../util/form'; -import { Icon } from '../icon/icon'; import { Key } from '../../util/key'; -import { NavParams } from '../nav/nav-params'; -import { Transition, TransitionOptions } from '../../transitions/transition'; -import { ViewController } from '../nav/view-controller'; +import { NavParams } from '../../navigation/nav-params'; +import { Transition } from '../../transitions/transition'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -17,28 +14,26 @@ import { ViewController } from '../nav/view-controller'; */ @Component({ selector: 'ion-action-sheet', - template: ` - -
-
-
-
{{d.title}}
-
{{d.subTitle}}
- -
-
- -
-
-
- `, - directives: [Backdrop, Icon, NgClass, NgFor, NgIf], + template: + '' + + '
' + + '
' + + '
' + + '
{{d.title}}
' + + '
{{d.subTitle}}
' + + '' + + '
' + + '
' + + '' + + '
' + + '
' + + '
', host: { 'role': 'dialog', '[attr.aria-labelledby]': 'hdrId', @@ -47,7 +42,7 @@ import { ViewController } from '../nav/view-controller'; encapsulation: ViewEncapsulation.None, }) export class ActionSheetCmp { - private d: { + d: { title?: string; subTitle?: string; cssClass?: string; @@ -55,10 +50,11 @@ export class ActionSheetCmp { enableBackdropDismiss?: boolean; cancelButton: any; }; - private descId: string; - private enabled: boolean; - private hdrId: string; - private id: number; + descId: string; + enabled: boolean; + hdrId: string; + id: number; + mode: string; constructor( private _viewCtrl: ViewController, @@ -69,6 +65,8 @@ export class ActionSheetCmp { renderer: Renderer ) { this.d = params.data; + this.mode = _config.get('mode'); + renderer.setElementClass(_elementRef.nativeElement, `action-sheet-${this.mode}`, true); if (this.d.cssClass) { this.d.cssClass.split(' ').forEach(cssClass => { @@ -86,7 +84,7 @@ export class ActionSheetCmp { } } - ionViewLoaded() { + ionViewDidLoad() { // normalize the data let buttons: any[] = []; @@ -125,7 +123,7 @@ export class ActionSheetCmp { } @HostListener('body:keyup', ['$event']) - private _keyUp(ev: KeyboardEvent) { + keyUp(ev: KeyboardEvent) { if (this.enabled && this._viewCtrl.isLast()) { if (ev.keyCode === Key.ESCAPE) { console.debug('actionsheet, escape button'); @@ -174,10 +172,8 @@ export class ActionSheetCmp { class ActionSheetSlideIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.action-sheet-wrapper')); @@ -191,10 +187,8 @@ Transition.register('action-sheet-slide-in', ActionSheetSlideIn); class ActionSheetSlideOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.action-sheet-wrapper')); @@ -208,10 +202,8 @@ Transition.register('action-sheet-slide-out', ActionSheetSlideOut); class ActionSheetMdSlideIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.action-sheet-wrapper')); @@ -225,10 +217,8 @@ Transition.register('action-sheet-md-slide-in', ActionSheetMdSlideIn); class ActionSheetMdSlideOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.action-sheet-wrapper')); @@ -241,10 +231,8 @@ class ActionSheetMdSlideOut extends Transition { Transition.register('action-sheet-md-slide-out', ActionSheetMdSlideOut); class ActionSheetWpSlideIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.action-sheet-wrapper')); @@ -258,10 +246,8 @@ Transition.register('action-sheet-wp-slide-in', ActionSheetWpSlideIn); class ActionSheetWpSlideOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.action-sheet-wrapper')); diff --git a/src/components/action-sheet/action-sheet.ts b/src/components/action-sheet/action-sheet.ts index ed032d5517..c161910233 100644 --- a/src/components/action-sheet/action-sheet.ts +++ b/src/components/action-sheet/action-sheet.ts @@ -4,8 +4,8 @@ import { ActionSheetCmp } from './action-sheet-component'; import { ActionSheetOptions } from './action-sheet-options'; import { App } from '../app/app'; import { isPresent } from '../../util/util'; -import { NavOptions } from '../nav/nav-interfaces'; -import { ViewController } from '../nav/view-controller'; +import { NavOptions } from '../../navigation/nav-util'; +import { ViewController } from '../../navigation/view-controller'; /** * @private @@ -17,14 +17,9 @@ export class ActionSheet extends ViewController { opts.buttons = opts.buttons || []; opts.enableBackdropDismiss = isPresent(opts.enableBackdropDismiss) ? !!opts.enableBackdropDismiss : true; - super(ActionSheetCmp, opts); + super(ActionSheetCmp, opts, null); this._app = app; this.isOverlay = true; - - // by default, actionsheets should not fire lifecycle events of other views - // for example, when an actionsheets enters, the current active view should - // not fire its lifecycle events because it's not conceptually leaving - this.fireOtherLifecycles = false; } /** @@ -70,7 +65,7 @@ export class ActionSheet extends ViewController { * @private * DEPRECATED: Please inject ActionSheetController instead */ - private static create(opt: any) { + static create(opt: any) { // deprecated warning: added beta.11 2016-06-27 console.warn('ActionSheet.create(..) has been deprecated. Please inject ActionSheetController instead'); } diff --git a/src/components/alert/alert-component.ts b/src/components/alert/alert-component.ts index 8e206aef1c..4bf298d931 100644 --- a/src/components/alert/alert-component.ts +++ b/src/components/alert/alert-component.ts @@ -1,15 +1,12 @@ import { Component, ElementRef, HostListener, Renderer, ViewEncapsulation } from '@angular/core'; -import { NgClass, NgFor, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common'; -import { NgModel } from '@angular/forms'; import { Animation } from '../../animations/animation'; -import { Backdrop } from '../backdrop/backdrop'; import { Config } from '../../config/config'; import { isPresent } from '../../util/util'; import { Key } from '../../util/key'; -import { NavParams } from '../nav/nav-params'; -import { Transition, TransitionOptions } from '../../transitions/transition'; -import { ViewController } from '../nav/view-controller'; +import { NavParams } from '../../navigation/nav-params'; +import { Transition } from '../../transitions/transition'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -17,55 +14,53 @@ import { ViewController } from '../nav/view-controller'; */ @Component({ selector: 'ion-alert', - template: ` - -
-
-

-

-
-
-
+ template: + '' + + '
' + + '
' + + '

' + + '

' + + '
' + + '
' + + '
' + - + '' + - + '' + - + '' + -
-
- -
-
- `, - directives: [Backdrop, NgClass, NgFor, NgIf, NgModel, NgSwitch, NgSwitchCase, NgSwitchDefault], + '
' + + '
' + + '' + + '
' + + '
', host: { 'role': 'dialog', '[attr.aria-labelledby]': 'hdrId', @@ -74,32 +69,36 @@ import { ViewController } from '../nav/view-controller'; encapsulation: ViewEncapsulation.None, }) export class AlertCmp { - private activeId: string; - private descId: string; - private d: { + activeId: string; + descId: string; + d: { cssClass?: string; message?: string; + title?: string; subTitle?: string; buttons?: any[]; inputs?: any[]; enableBackdropDismiss?: boolean; }; - private enabled: boolean; - private hdrId: string; - private id: number; - private inputType: string; - private lastClick: number; - private msgId: string; - private subHdrId: string; + enabled: boolean; + hdrId: string; + id: number; + inputType: string; + lastClick: number; + msgId: string; + subHdrId: string; + mode: string; constructor( - private _viewCtrl: ViewController, - private _elementRef: ElementRef, - private _config: Config, + public _viewCtrl: ViewController, + public _elementRef: ElementRef, + public _config: Config, params: NavParams, renderer: Renderer ) { this.d = params.data; + this.mode = _config.get('mode'); + renderer.setElementClass(_elementRef.nativeElement, `alert-${this.mode}`, true); if (this.d.cssClass) { this.d.cssClass.split(' ').forEach(cssClass => { @@ -128,7 +127,7 @@ export class AlertCmp { } } - ionViewLoaded() { + ionViewDidLoad() { // normalize the data let data = this.d; @@ -175,7 +174,7 @@ export class AlertCmp { } @HostListener('body:keyup', ['$event']) - private _keyUp(ev: KeyboardEvent) { + keyUp(ev: KeyboardEvent) { if (this.enabled && this._viewCtrl.isLast()) { if (ev.keyCode === Key.ENTER) { if (this.lastClick + 1000 < Date.now()) { @@ -294,10 +293,8 @@ export class AlertCmp { * Animations for alerts */ class AlertPopIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.alert-wrapper')); @@ -315,10 +312,8 @@ Transition.register('alert-pop-in', AlertPopIn); class AlertPopOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.alert-wrapper')); @@ -336,10 +331,8 @@ Transition.register('alert-pop-out', AlertPopOut); class AlertMdPopIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.alert-wrapper')); @@ -357,10 +350,8 @@ Transition.register('alert-md-pop-in', AlertMdPopIn); class AlertMdPopOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.alert-wrapper')); @@ -377,12 +368,9 @@ class AlertMdPopOut extends Transition { Transition.register('alert-md-pop-out', AlertMdPopOut); - class AlertWpPopIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.alert-wrapper')); @@ -400,10 +388,8 @@ Transition.register('alert-wp-pop-in', AlertWpPopIn); class AlertWpPopOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.alert-wrapper')); diff --git a/src/components/alert/alert.ts b/src/components/alert/alert.ts index 3a511a5aa5..0b9ba0bc3c 100644 --- a/src/components/alert/alert.ts +++ b/src/components/alert/alert.ts @@ -4,8 +4,8 @@ import { App } from '../app/app'; import { AlertCmp } from './alert-component'; import { AlertOptions, AlertInputOptions } from './alert-options'; import { isPresent } from '../../util/util'; -import { NavOptions } from '../nav/nav-interfaces'; -import { ViewController } from '../nav/view-controller'; +import { NavOptions } from '../../navigation/nav-util'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -19,14 +19,9 @@ export class Alert extends ViewController { opts.buttons = opts.buttons || []; opts.enableBackdropDismiss = isPresent(opts.enableBackdropDismiss) ? !!opts.enableBackdropDismiss : true; - super(AlertCmp, opts); + super(AlertCmp, opts, null); this._app = app; this.isOverlay = true; - - // by default, alerts should not fire lifecycle events of other views - // for example, when an alert enters, the current active view should - // not fire its lifecycle events because it's not conceptually leaving - this.fireOtherLifecycles = false; } /** @@ -51,15 +46,6 @@ export class Alert extends ViewController { this.data.subTitle = subTitle; } - /** - * @private - */ - private setBody(message: string) { - // deprecated warning - console.warn('Alert setBody() has been renamed to setMessage()'); - this.setMessage(message); - } - /** * @param {string} message Alert message content */ @@ -102,7 +88,7 @@ export class Alert extends ViewController { * @private * DEPRECATED: Please inject AlertController instead */ - private static create(opt: any) { + static create(opt: any) { // deprecated warning: added beta.11 2016-06-27 console.warn('Alert.create(..) has been deprecated. Please inject AlertController instead'); } diff --git a/src/components/avatar/avatar.ts b/src/components/avatar/avatar.ts new file mode 100644 index 0000000000..4b8cc660a9 --- /dev/null +++ b/src/components/avatar/avatar.ts @@ -0,0 +1,13 @@ +import { Directive } from '@angular/core'; + +/** + * @name Avatar + * @module ionic + * @description + */ +@Directive({ + selector: 'ion-avatar' +}) +export class Avatar { + +} diff --git a/src/components/backdrop/backdrop.ts b/src/components/backdrop/backdrop.ts index 1193dd337e..6597352d31 100644 --- a/src/components/backdrop/backdrop.ts +++ b/src/components/backdrop/backdrop.ts @@ -1,6 +1,6 @@ import { Directive, ElementRef, Input } from '@angular/core'; -import { DisableScroll, GestureController, GestureDelegate } from '../../gestures/gesture-controller'; +import { GestureController } from '../../gestures/gesture-controller'; import { isTrueProperty } from '../../util/util'; diff --git a/src/components/card/card.ts b/src/components/card/card.ts new file mode 100644 index 0000000000..46d4920f84 --- /dev/null +++ b/src/components/card/card.ts @@ -0,0 +1,63 @@ +import { Directive, ElementRef, Input, Renderer } from '@angular/core'; + +import { Config } from '../../config/config'; +import { Ion } from '../ion'; + + +/** + * @private + */ +@Directive({ + selector: 'ion-card' +}) +export class Card extends Ion { + + /** + * @input {string} The predefined color to use. For example: `"primary"`, `"secondary"`, `"danger"`. + */ + @Input() + set color(val: string) { + this._setColor('card', val); + } + + /** + * @input {string} The mode to apply to this component. + */ + @Input() + set mode(val: string) { + this._setMode('card', val); + } + + constructor(config: Config, elementRef: ElementRef, renderer: Renderer) { + super(config, elementRef, renderer); + + this.mode = config.get('mode'); + } + +} + + +/** + * @private + */ +@Directive({ + selector: 'ion-card-content' +}) +export class CardContent {} + + +/** + * @private + */ +@Directive({ + selector: 'ion-card-header' +}) +export class CardHeader {} + +/** + * @private + */ +@Directive({ + selector: 'ion-card-title' +}) +export class CardTitle {} diff --git a/src/components/fixed/fixed.ts b/src/components/fixed/fixed.ts new file mode 100644 index 0000000000..acd6e66545 --- /dev/null +++ b/src/components/fixed/fixed.ts @@ -0,0 +1,13 @@ +import { Directive } from '@angular/core'; + +/** + * @name Fixed + * @module ionic + * @description + */ +@Directive({ + selector: 'ion-fixed' +}) +export class Fixed { + +} diff --git a/src/components/grid/grid.ts b/src/components/grid/grid.ts new file mode 100644 index 0000000000..8e72340bbc --- /dev/null +++ b/src/components/grid/grid.ts @@ -0,0 +1,37 @@ +import { Directive } from '@angular/core'; + +/** + * @name Grid + * @module ionic + * @description + */ +@Directive({ + selector: 'ion-grid' +}) +export class Grid { + +} + +/** + * @name Row + * @module ionic + * @description + */ +@Directive({ + selector: 'ion-row' +}) +export class Row { + +} + +/** + * @name Column + * @module ionic + * @description + */ +@Directive({ + selector: 'ion-col' +}) +export class Col { + +} diff --git a/src/components/icon/test/basic/e2e.ts b/src/components/icon/test/basic/e2e.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/components/img/img.ts b/src/components/img/img.ts index 85d5c1bbb2..10892a2aa0 100644 --- a/src/components/img/img.ts +++ b/src/components/img/img.ts @@ -16,13 +16,13 @@ import { Platform } from '../../platform/platform'; encapsulation: ViewEncapsulation.None, }) export class Img { - private _src: string = ''; - private _normalizeSrc: string = ''; - private _imgs: HTMLImageElement[] = []; - private _w: string; - private _h: string; - private _enabled: boolean = true; - private _init: boolean; + _src: string = ''; + _normalizeSrc: string = ''; + _imgs: HTMLImageElement[] = []; + _w: string; + _h: string; + _enabled: boolean = true; + _init: boolean; constructor(private _elementRef: ElementRef, private _platform: Platform, private _zone: NgZone) {} @@ -44,7 +44,7 @@ export class Img { this._update(); } - private _update() { + _update() { if (this._enabled && this._src !== '') { // actively update the image @@ -101,7 +101,7 @@ export class Img { } } - private _loaded(isLoaded: boolean) { + _loaded(isLoaded: boolean) { this._elementRef.nativeElement.classList[isLoaded ? 'add' : 'remove']('img-loaded'); } diff --git a/src/components/infinite-scroll/infinite-scroll-content.ts b/src/components/infinite-scroll/infinite-scroll-content.ts index b886de3268..d917aae727 100644 --- a/src/components/infinite-scroll/infinite-scroll-content.ts +++ b/src/components/infinite-scroll/infinite-scroll-content.ts @@ -1,9 +1,7 @@ import { Component, Input, ViewEncapsulation } from '@angular/core'; -import { NgIf } from '@angular/common'; import { Config } from '../../config/config'; import { InfiniteScroll } from './infinite-scroll'; -import { Spinner } from '../spinner/spinner'; /** @@ -18,7 +16,6 @@ import { Spinner } from '../spinner/spinner'; '' + '
' + '', - directives: [NgIf, Spinner], host: { '[attr.state]': 'inf.state' }, @@ -36,7 +33,7 @@ export class InfiniteScrollContent { */ @Input() loadingText: string; - constructor(private inf: InfiniteScroll, private _config: Config) {} + constructor(public inf: InfiniteScroll, private _config: Config) {} /** * @private diff --git a/src/components/infinite-scroll/infinite-scroll.ts b/src/components/infinite-scroll/infinite-scroll.ts index 6ac9f2b634..498f23862d 100644 --- a/src/components/infinite-scroll/infinite-scroll.ts +++ b/src/components/infinite-scroll/infinite-scroll.ts @@ -95,13 +95,13 @@ import { Content } from '../content/content'; selector: 'ion-infinite-scroll' }) export class InfiniteScroll { - private _lastCheck: number = 0; - private _highestY: number = 0; - private _scLsn: Function; - private _thr: string = '15%'; - private _thrPx: number = 0; - private _thrPc: number = 0.15; - private _init: boolean = false; + _lastCheck: number = 0; + _highestY: number = 0; + _scLsn: Function; + _thr: string = '15%'; + _thrPx: number = 0; + _thrPc: number = 0.15; + _init: boolean = false; state: string = STATE_ENABLED; @@ -144,10 +144,10 @@ export class InfiniteScroll { private _zone: NgZone, private _elementRef: ElementRef ) { - _content.addCssClass('has-infinite-scroll'); + _content.setElementClass('has-infinite-scroll', true); } - private _onScroll() { + _onScroll() { if (this.state === STATE_LOADING || this.state === STATE_DISABLED) { return 1; } @@ -217,7 +217,7 @@ export class InfiniteScroll { this._setListeners(shouldEnable); } - private _setListeners(shouldListen: boolean) { + _setListeners(shouldListen: boolean) { if (this._init) { if (shouldListen) { if (!this._scLsn) { diff --git a/src/components/item/item-reorder-gesture.ts b/src/components/item/item-reorder-gesture.ts index 0fb287cb24..ab1765f919 100644 --- a/src/components/item/item-reorder-gesture.ts +++ b/src/components/item/item-reorder-gesture.ts @@ -1,7 +1,6 @@ -import { Item } from './item'; +import { PointerCoordinates, CSS, pointerCoord } from '../../util/dom'; import { ItemReorder, indexForItem, findReorderItem } from '../item/item-reorder'; import { UIEventManager } from '../../util/ui-event-manager'; -import { closest, Coordinates, pointerCoord, CSS, nativeRaf } from '../../util/dom'; const AUTO_SCROLL_MARGIN = 60; @@ -15,7 +14,7 @@ export class ItemReorderGesture { private selectedItemEle: HTMLElement = null; private selectedItemHeight: number; - private offset: Coordinates; + private offset: PointerCoordinates; private lastToIndex: number; private lastYcoord: number; private lastScrollPosition: number; @@ -104,7 +103,7 @@ export class ItemReorderGesture { // Update selected item position let ydiff = Math.round(posY - this.offset.y + scrollPosition); - selectedItem.style[CSS.transform] = `translateY(${ydiff}px)`; + (selectedItem.style)[CSS.transform] = `translateY(${ydiff}px)`; } private onDragEnd() { @@ -129,7 +128,7 @@ export class ItemReorderGesture { this.reorderList.reorderEmit(fromIndex, toIndex); } - private itemForCoord(coord: Coordinates): HTMLElement { + private itemForCoord(coord: PointerCoordinates): HTMLElement { return itemForPosition(this.offset.x - 100, coord.y); } diff --git a/src/components/item/item-reorder.ts b/src/components/item/item-reorder.ts index 3aeb90c81e..bd92cee394 100644 --- a/src/components/item/item-reorder.ts +++ b/src/components/item/item-reorder.ts @@ -129,15 +129,24 @@ export interface ReorderIndexes { host: { '[class.reorder-enabled]': '_enableReorder', '[class.reorder-visible]': '_visibleReorder', - } }) export class ItemReorder { - private _enableReorder: boolean = false; - private _visibleReorder: boolean = false; - private _reorderGesture: ItemReorderGesture; - private _lastToIndex: number = -1; - private _element: HTMLElement; + + /** @private */ + _enableReorder: boolean = false; + + /** @private */ + _visibleReorder: boolean = false; + + /** @private */ + _reorderGesture: ItemReorderGesture; + + /** @private */ + _lastToIndex: number = -1; + + /** @private */ + _element: HTMLElement; /** * @output {object} The expression to evaluate when the item is reordered. Emits an object @@ -191,10 +200,9 @@ export class ItemReorder { * @private */ reorderPrepare() { - let children = this._element.children; - let len = children.length; - for (let i = 0; i < len; i++) { - children[i]['$ionIndex'] = i; + let children: any = this._element.children; + for (let i = 0, ilen = children.length; i < ilen; i++) { + children[i].$ionIndex = i; } } diff --git a/src/components/item/item-sliding-gesture.ts b/src/components/item/item-sliding-gesture.ts index 52ad430ed0..c7f5de1244 100644 --- a/src/components/item/item-sliding-gesture.ts +++ b/src/components/item/item-sliding-gesture.ts @@ -1,10 +1,9 @@ import { ItemSliding } from './item-sliding'; import { List } from '../list/list'; -import { closest, Coordinates, pointerCoord } from '../../util/dom'; -import { PointerEvents, UIEventManager } from '../../util/ui-event-manager'; -import { GestureDelegate, GestureOptions, GesturePriority } from '../../gestures/gesture-controller'; +import { GesturePriority } from '../../gestures/gesture-controller'; import { PanGesture } from '../../gestures/drag-gesture'; +import { pointerCoord } from '../../util/dom'; const DRAG_THRESHOLD = 10; const MAX_ATTACK_ANGLE = 20; @@ -66,10 +65,6 @@ export class ItemSlidingGesture extends PanGesture { onDragEnd(ev: any) { ev.preventDefault(); - let coordX = pointerCoord(ev).x; - let deltaX = (coordX - this.firstCoordX); - let deltaT = (Date.now() - this.firstTimestamp); - let openAmount = this.selectedContainer.endSliding(deltaX / deltaT); this.selectedContainer = null; this.preSelectedContainer = null; } @@ -101,9 +96,9 @@ export class ItemSlidingGesture extends PanGesture { } function getContainer(ev: any): ItemSliding { - let ele = closest(ev.target, 'ion-item-sliding', true); + let ele = ev.target.closest('ion-item-sliding', true); if (ele) { return (ele)['$ionComponent']; } return null; -} \ No newline at end of file +} diff --git a/src/components/item/item-sliding.ts b/src/components/item/item-sliding.ts index 652a52ed54..7c757019ff 100644 --- a/src/components/item/item-sliding.ts +++ b/src/components/item/item-sliding.ts @@ -81,7 +81,7 @@ export class ItemOptions { } -const enum SlidingState { +export const enum SlidingState { Disabled = 1 << 1, Enabled = 1 << 2, Right = 1 << 3, @@ -200,7 +200,7 @@ export class ItemSliding { /** * @private */ - @ContentChild(Item) private item: Item; + @ContentChild(Item) item: Item; /** * @output {event} Expression to evaluate when the sliding position changes. @@ -228,11 +228,11 @@ export class ItemSliding { constructor( @Optional() list: List, private _renderer: Renderer, private _elementRef: ElementRef) { list && list.containsSlidingItem(true); _elementRef.nativeElement.$ionComponent = this; - this.setCssClass('item-wrapper', true); + this._setCssClass('item-wrapper', true); } @ContentChildren(ItemOptions) - private set _itemOptions(itemOptions: QueryList) { + set _itemOptions(itemOptions: QueryList) { let sides = 0; for (var item of itemOptions.toArray()) { var side = item.getSides(); @@ -281,7 +281,7 @@ export class ItemSliding { this._setState(SlidingState.Enabled); } this._startX = startX + this._openAmount; - this.item.setCssStyle(CSS.transition, 'none'); + this.item.setElementStyle(CSS.transition, 'none'); } /** @@ -376,7 +376,7 @@ export class ItemSliding { this._openAmount = openAmount; if (isFinal) { - this.item.setCssStyle(CSS.transition, ''); + this.item.setElementStyle(CSS.transition, ''); } else { if (openAmount > 0) { @@ -399,11 +399,11 @@ export class ItemSliding { this._setState(SlidingState.Disabled); this._timer = null; }, 600); - this.item.setCssStyle(CSS.transform, ''); + this.item.setElementStyle(CSS.transform, ''); return; } - this.item.setCssStyle(CSS.transform, `translate3d(${-openAmount}px,0,0)`); + this.item.setElementStyle(CSS.transform, `translate3d(${-openAmount}px,0,0)`); this.ionDrag.emit(this); } @@ -411,11 +411,11 @@ export class ItemSliding { if (state === this._state) { return; } - this.setCssClass('active-slide', (state !== SlidingState.Disabled)); - this.setCssClass('active-options-right', !!(state & SlidingState.Right)); - this.setCssClass('active-options-left', !!(state & SlidingState.Left)); - this.setCssClass('active-swipe-right', !!(state & SlidingState.SwipeRight)); - this.setCssClass('active-swipe-left', !!(state & SlidingState.SwipeLeft)); + this._setCssClass('active-slide', (state !== SlidingState.Disabled)); + this._setCssClass('active-options-right', !!(state & SlidingState.Right)); + this._setCssClass('active-options-left', !!(state & SlidingState.Left)); + this._setCssClass('active-swipe-right', !!(state & SlidingState.SwipeRight)); + this._setCssClass('active-swipe-left', !!(state & SlidingState.SwipeLeft)); this._state = state; } @@ -461,14 +461,14 @@ export class ItemSliding { /** * @private */ - setCssClass(cssClass: string, shouldAdd: boolean) { + _setCssClass(cssClass: string, shouldAdd: boolean) { this._renderer.setElementClass(this._elementRef.nativeElement, cssClass, shouldAdd); } /** * @private */ - setCssStyle(property: string, value: string) { + _setCssStyle(property: string, value: string) { this._renderer.setElementStyle(this._elementRef.nativeElement, property, value); } } diff --git a/src/components/list/list-header.ts b/src/components/list/list-header.ts new file mode 100644 index 0000000000..04364b06b1 --- /dev/null +++ b/src/components/list/list-header.ts @@ -0,0 +1,26 @@ +import { Attribute, Directive, ElementRef, Renderer } from '@angular/core'; + +import { Config } from '../../config/config'; +import { Ion } from '../ion'; + +/** + * @private + */ +@Directive({ + selector: 'ion-list-header' +}) +export class ListHeader extends Ion { + constructor(config: Config, renderer: Renderer, elementRef: ElementRef, @Attribute('id') private _id: string) { + super(config, elementRef, renderer); + this._setMode('list-header', config.get('mode')); + } + + get id(): string { + return this._id; + } + + set id(val: string) { + this._id = val; + this.setElementAttribute('id', val); + } +} diff --git a/src/components/list/list.ts b/src/components/list/list.ts index fcb11cf016..7de46280be 100644 --- a/src/components/list/list.ts +++ b/src/components/list/list.ts @@ -1,6 +1,6 @@ -import { Attribute, Directive, ElementRef, EventEmitter, Input, NgZone, Optional, Output, Renderer } from '@angular/core'; +import { Directive, ElementRef, Input, Renderer } from '@angular/core'; -import { Content } from '../content/content'; +import { Config } from '../../config/config'; import { Ion } from '../ion'; import { isTrueProperty } from '../../util/util'; import { ItemSlidingGesture } from '../item/item-sliding-gesture'; @@ -50,17 +50,22 @@ export class List extends Ion { private _slidingGesture: ItemSlidingGesture; constructor( + config: Config, elementRef: ElementRef, - private _rendered: Renderer, - public _gestureCtrl: GestureController) { - super(elementRef); + renderer: Renderer, + public _gestureCtrl: GestureController + ) { + super(config, elementRef, renderer); + + this.mode = config.get('mode'); } /** - * @private + * @input {string} The mode to apply to this component. */ - ngOnDestroy() { - this._slidingGesture && this._slidingGesture.destroy(); + @Input() + set mode(val: string) { + this._setMode('list', val); } /** @@ -75,7 +80,6 @@ export class List extends Ion { this._updateSlidingState(); } - /** * @private */ @@ -98,31 +102,17 @@ export class List extends Ion { } } - /** * Close any sliding items that are open. */ closeSlidingItems() { this._slidingGesture && this._slidingGesture.closeOpened(); } -} - -/** - * @private - */ -@Directive({ - selector: 'ion-list-header' -}) -export class ListHeader { - constructor(private _renderer: Renderer, private _elementRef: ElementRef, @Attribute('id') private _id: string) { } - - public get id(): string { - return this._id; - } - - public set id(val: string) { - this._id = val; - this._renderer.setElementAttribute(this._elementRef.nativeElement, 'id', val); + /** + * @private + */ + destroy() { + this._slidingGesture && this._slidingGesture.destroy(); } } diff --git a/src/components/loading/loading-component.ts b/src/components/loading/loading-component.ts index a15569d631..d2a5e905a9 100644 --- a/src/components/loading/loading-component.ts +++ b/src/components/loading/loading-component.ts @@ -1,14 +1,11 @@ import { Component, ElementRef, Renderer, ViewEncapsulation } from '@angular/core'; -import { NgIf } from '@angular/common'; import { Animation } from '../../animations/animation'; -import { Backdrop } from '../backdrop/backdrop'; import { Config } from '../../config/config'; -import { isDefined, isPresent, isUndefined } from '../../util/util'; -import { NavParams } from '../nav/nav-params'; -import { Spinner } from '../spinner/spinner'; -import { Transition, TransitionOptions } from '../../transitions/transition'; -import { ViewController } from '../nav/view-controller'; +import { isDefined, isUndefined } from '../../util/util'; +import { NavParams } from '../../navigation/nav-params'; +import { Transition } from '../../transitions/transition'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -16,23 +13,21 @@ import { ViewController } from '../nav/view-controller'; */ @Component({ selector: 'ion-loading', - template: ` - -
-
- -
-
-
- `, - directives: [Backdrop, NgIf, Spinner], + template: + '' + + '
' + + '
' + + '' + + '
' + + '
' + + '
', host: { 'role': 'dialog' }, encapsulation: ViewEncapsulation.None, }) export class LoadingCmp { - private d: { + d: { spinner?: string; content?: string; cssClass?: string; @@ -41,9 +36,9 @@ export class LoadingCmp { delay?: number; duration?: number; }; - private id: number; - private showSpinner: boolean; - private durationTimeout: number; + id: number; + showSpinner: boolean; + durationTimeout: number; constructor( private _viewCtrl: ViewController, @@ -54,6 +49,8 @@ export class LoadingCmp { ) { this.d = params.data; + renderer.setElementClass(_elementRef.nativeElement, `loading-${_config.get('mode')}`, true); + if (this.d.cssClass) { this.d.cssClass.split(' ').forEach(cssClass => { // Make sure the class isn't whitespace, otherwise it throws exceptions @@ -82,7 +79,12 @@ export class LoadingCmp { } // If there is a duration, dismiss after that amount of time - this.d.duration ? this.durationTimeout = setTimeout(() => this.dismiss('backdrop'), this.d.duration) : null; + if ( this.d && this.d.duration ) { + this.durationTimeout = ( setTimeout( () => { + this.dismiss('backdrop'); + }, this.d.duration)); + } + } dismiss(role: any): Promise { @@ -98,10 +100,8 @@ export class LoadingCmp { * Animations for loading */ class LoadingPopIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.loading-wrapper')); @@ -119,10 +119,8 @@ export class LoadingCmp { class LoadingPopOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.loading-wrapper')); @@ -140,10 +138,8 @@ export class LoadingCmp { class LoadingMdPopIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.loading-wrapper')); @@ -161,10 +157,8 @@ export class LoadingCmp { class LoadingMdPopOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.loading-wrapper')); @@ -182,10 +176,8 @@ export class LoadingCmp { class LoadingWpPopIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.loading-wrapper')); @@ -203,10 +195,8 @@ export class LoadingCmp { class LoadingWpPopOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.loading-wrapper')); diff --git a/src/components/loading/loading.ts b/src/components/loading/loading.ts index 0fd242924d..e7d311b9f9 100644 --- a/src/components/loading/loading.ts +++ b/src/components/loading/loading.ts @@ -1,12 +1,12 @@ import { Injectable } from '@angular/core'; import { App } from '../app/app'; -import { Config } from '../../config/config'; +import { AppPortal } from '../app/app-root'; import { isPresent } from '../../util/util'; import { LoadingCmp } from './loading-component'; import { LoadingOptions } from './loading-options'; -import { NavOptions } from '../nav/nav-interfaces'; -import { ViewController } from '../nav/view-controller'; +import { NavOptions } from '../../navigation/nav-util'; +import { ViewController } from '../../navigation/view-controller'; /** * @private @@ -18,14 +18,9 @@ export class Loading extends ViewController { opts.showBackdrop = isPresent(opts.showBackdrop) ? !!opts.showBackdrop : true; opts.dismissOnPageChange = isPresent(opts.dismissOnPageChange) ? !!opts.dismissOnPageChange : false; - super(LoadingCmp, opts); + super(LoadingCmp, opts, null); this._app = app; this.isOverlay = true; - - // by default, loading indicators should not fire lifecycle events of other views - // for example, when an loading indicators enters, the current active view should - // not fire its lifecycle events because it's not conceptually leaving - this.fireOtherLifecycles = false; } /** @@ -43,7 +38,6 @@ export class Loading extends ViewController { this.data.content = content; } - /** * Present the loading instance. * @@ -51,14 +45,21 @@ export class Loading extends ViewController { * @returns {Promise} Returns a promise which is resolved when the transition has completed. */ present(navOptions: NavOptions = {}) { - return this._app.present(this, navOptions); + return this._app.present(this, navOptions, AppPortal.LOADING); + } + + /** + * Dismiss all loading components which have been presented. + */ + dismissAll() { + this._nav && this._nav.popAll(); } /** * @private * DEPRECATED: Please inject LoadingController instead */ - private static create(opt: any) { + static create(opt: any) { // deprecated warning: added beta.11 2016-06-27 console.warn('Loading.create(..) has been deprecated. Please inject LoadingController instead'); } @@ -108,7 +109,7 @@ export class Loading extends ViewController { * * @usage * ```ts - * constructor(private loadingCtrl: LoadingController) { + * constructor(public loadingCtrl: LoadingController) { * * } * diff --git a/src/components/menu/menu-close.ts b/src/components/menu/menu-close.ts index 06d79d972a..a6702ab734 100644 --- a/src/components/menu/menu-close.ts +++ b/src/components/menu/menu-close.ts @@ -44,7 +44,7 @@ export class MenuClose { */ @HostListener('click') close() { - let menu = this._menu.get(this.menuClose); + const menu = this._menu.get(this.menuClose); menu && menu.close(); } diff --git a/src/components/menu/menu-controller.ts b/src/components/menu/menu-controller.ts index 5d597df188..10ad8358ba 100644 --- a/src/components/menu/menu-controller.ts +++ b/src/components/menu/menu-controller.ts @@ -77,11 +77,11 @@ import { Platform } from '../../platform/platform'; * * ```ts * toggleLeftMenu() { - * this.menu.toggle(); + * this.menuCtrl.toggle(); * } * * toggleRightMenu() { - * this.menu.toggle('right'); + * this.menuCtrl.toggle('right'); * } * ``` * @@ -101,8 +101,8 @@ import { Platform } from '../../platform/platform'; * * ```ts * enableAuthenticatedMenu() { - * this.menu.enable(true, 'authenticated'); - * this.menu.enable(false, 'unauthenticated'); + * this.menuCtrl.enable(true, 'authenticated'); + * this.menuCtrl.enable(false, 'unauthenticated'); * } * ``` * diff --git a/src/components/menu/menu-toggle.ts b/src/components/menu/menu-toggle.ts index bd6097edc4..4157bee29b 100644 --- a/src/components/menu/menu-toggle.ts +++ b/src/components/menu/menu-toggle.ts @@ -2,7 +2,7 @@ import { Directive, ElementRef, Input, HostListener, Optional } from '@angular/c import { MenuController } from './menu-controller'; import { Navbar } from '../navbar/navbar'; -import { ViewController } from '../nav/view-controller'; +import { ViewController } from '../../navigation/view-controller'; /** * @name MenuToggle diff --git a/src/components/menu/menu.ts b/src/components/menu/menu.ts index f09b17c769..63e20f66e5 100644 --- a/src/components/menu/menu.ts +++ b/src/components/menu/menu.ts @@ -2,7 +2,6 @@ import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Ng import { Backdrop } from '../backdrop/backdrop'; import { Config } from '../../config/config'; -import { Ion } from '../ion'; import { isTrueProperty } from '../../util/util'; import { Keyboard } from '../../util/keyboard'; import { MenuContentGesture } from './menu-gestures'; @@ -177,14 +176,12 @@ import { GestureController } from '../../gestures/gesture-controller'; */ @Component({ selector: 'ion-menu', + template: + '' + + '', host: { 'role': 'navigation' }, - template: ` - - - `, - directives: [Backdrop], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, }) @@ -294,8 +291,11 @@ export class Menu { */ @Output() ionClose: EventEmitter = new EventEmitter(); + /** @private */ + _menuCtrl: MenuController; + constructor( - private _menuCtrl: MenuController, + _menuCtrl: MenuController, private _elementRef: ElementRef, private _config: Config, private _platform: Platform, @@ -303,7 +303,9 @@ export class Menu { private _keyboard: Keyboard, private _zone: NgZone, public gestureCtrl: GestureController - ) { } + ) { + this._menuCtrl = _menuCtrl; + } /** * @private @@ -496,7 +498,7 @@ export class Menu { this.isOpen = isOpen; - this._cntEle.classList[isOpen ? 'add' : 'remove']('menu-content-open'); + (this._cntEle.classList)[isOpen ? 'add' : 'remove']('menu-content-open'); this._cntEle.removeEventListener('click', this.onContentClick); @@ -557,10 +559,9 @@ export class Menu { // if this menu should be enabled // then find all the other menus on this same side // and automatically disable other same side menus - let sameSideMenus = this._menuCtrl - .getMenus() - .filter(m => m.side === this.side && m !== this) - .map(m => m.enabled = false); + this._menuCtrl.getMenus() + .filter(m => m.side === this.side && m !== this) + .map(m => m.enabled = false); } return this; diff --git a/src/components/modal/modal.ts b/src/components/modal/modal.ts index 42f8971d95..86ad248b53 100644 --- a/src/components/modal/modal.ts +++ b/src/components/modal/modal.ts @@ -4,8 +4,8 @@ import { App } from '../app/app'; import { isPresent } from '../../util/util'; import { ModalCmp } from './modal-component'; import { ModalOptions } from './modal-options'; -import { NavOptions } from '../nav/nav-interfaces'; -import { ViewController } from '../nav/view-controller'; +import { NavOptions } from '../../navigation/nav-util'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -14,13 +14,13 @@ import { ViewController } from '../nav/view-controller'; export class Modal extends ViewController { private _app: App; - constructor(app: App, componentType: any, data: any = {}, opts: ModalOptions = {}) { - data.componentType = componentType; + constructor(app: App, component: any, data: any = {}, opts: ModalOptions = {}) { + data.component = component; opts.showBackdrop = isPresent(opts.showBackdrop) ? !!opts.showBackdrop : true; opts.enableBackdropDismiss = isPresent(opts.enableBackdropDismiss) ? !!opts.enableBackdropDismiss : true; data.opts = opts; - super(ModalCmp, data); + super(ModalCmp, data, null); this._app = app; this.isOverlay = true; } @@ -33,22 +33,6 @@ export class Modal extends ViewController { return this._nav && this._nav.config.get(key); } - /** - * @private - * Override the load method and load our child component - */ - loaded(done: Function) { - // grab the instance, and proxy the ngAfterViewInit method - let originalNgAfterViewInit = this.instance.ngAfterViewInit; - - this.instance.ngAfterViewInit = () => { - if (originalNgAfterViewInit) { - originalNgAfterViewInit(); - } - this.instance.loadComponent(done); - }; - } - /** * Present the action sheet instance. * @@ -63,7 +47,7 @@ export class Modal extends ViewController { * @private * DEPRECATED: Please inject ModalController instead */ - private static create(cmp: any, opt: any) { + static create(cmp: any, opt: any) { // deprecated warning: added beta.11 2016-06-27 console.warn('Modal.create(..) has been deprecated. Please inject ModalController instead'); } @@ -184,11 +168,11 @@ export class ModalController { /** * Create a modal to display. See below for options. * - * @param {object} componentType The Modal view + * @param {object} component The Modal view * @param {object} data Any data to pass to the Modal view * @param {object} opts Modal options */ - create(componentType: any, data: any = {}, opts: ModalOptions = {}) { - return new Modal(this._app, componentType, data, opts); + create(component: any, data: any = {}, opts: ModalOptions = {}) { + return new Modal(this._app, component, data, opts); } } diff --git a/src/components/note/note.ts b/src/components/note/note.ts new file mode 100644 index 0000000000..795e2c4019 --- /dev/null +++ b/src/components/note/note.ts @@ -0,0 +1,10 @@ +import { Directive } from '@angular/core'; + + +/** + * @private + */ +@Directive({ + selector: 'ion-note' +}) +export class Note {} diff --git a/src/components/option/option.ts b/src/components/option/option.ts index 3578612584..de48a9cab8 100644 --- a/src/components/option/option.ts +++ b/src/components/option/option.ts @@ -13,9 +13,9 @@ import { isPresent, isTrueProperty } from '../../util/util'; selector: 'ion-option' }) export class Option { - private _selected: any = false; - private _disabled: any = false; - private _value: any; + _selected: any = false; + _disabled: any = false; + _value: any; /** * @input {any} Event to evaluate when option is selected diff --git a/src/components/picker/picker-component.ts b/src/components/picker/picker-component.ts index cdd69fc282..9a419b92df 100644 --- a/src/components/picker/picker-component.ts +++ b/src/components/picker/picker-component.ts @@ -1,19 +1,17 @@ import { Component, ElementRef, EventEmitter, Input, HostListener, Output, QueryList, Renderer, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core'; -import { NgClass, NgFor, NgIf } from '@angular/common'; -import { DomSanitizationService } from '@angular/platform-browser'; +import { DomSanitizer } from '@angular/platform-browser'; import { Animation } from '../../animations/animation'; -import { Backdrop } from '../backdrop/backdrop'; import { cancelRaf, pointerCoord, raf } from '../../util/dom'; import { clamp, isNumber, isPresent, isString } from '../../util/util'; import { Config } from '../../config/config'; import { Key } from '../../util/key'; -import { NavParams } from '../nav/nav-params'; +import { NavParams } from '../../navigation/nav-params'; import { Picker } from './picker'; import { PickerOptions, PickerColumn, PickerColumnOption } from './picker-options'; -import { Transition, TransitionOptions } from '../../transitions/transition'; +import { Transition } from '../../transitions/transition'; import { UIEventManager } from '../../util/ui-event-manager'; -import { ViewController } from '../nav/view-controller'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -21,16 +19,21 @@ import { ViewController } from '../nav/view-controller'; */ @Component({ selector: '.picker-col', - template: ` -
{{col.prefix}}
-
- -
-
{{col.suffix}}
- `, - directives: [NgFor, NgIf], + template: + '
{{col.prefix}}
' + + '
' + + '' + + '
' + + '
{{col.suffix}}
', host: { '[style.min-width]': 'col.columnWidth', '[class.picker-opts-left]': 'col.align=="left"', @@ -57,7 +60,7 @@ export class PickerColumnCmp { @Output() ionChange: EventEmitter = new EventEmitter(); - constructor(config: Config, private elementRef: ElementRef, private _sanitizer: DomSanitizationService) { + constructor(config: Config, private elementRef: ElementRef, private _sanitizer: DomSanitizer) { this.rotateFactor = config.getNumber('pickerRotateFactor', 0); } @@ -344,7 +347,6 @@ export class PickerColumnCmp { } - /** * @private */ @@ -367,18 +369,18 @@ export class PickerColumnCmp { `, - directives: [Backdrop, NgClass, NgFor, PickerColumnCmp], host: { 'role': 'dialog' }, encapsulation: ViewEncapsulation.None, }) export class PickerCmp { - @ViewChildren(PickerColumnCmp) private _cols: QueryList; - private d: PickerOptions; - private enabled: boolean; - private lastClick: number; - private id: number; + @ViewChildren(PickerColumnCmp) _cols: QueryList; + d: PickerOptions; + enabled: boolean; + lastClick: number; + id: number; + mode: string; constructor( private _viewCtrl: ViewController, @@ -388,6 +390,8 @@ export class PickerCmp { renderer: Renderer ) { this.d = params.data; + this.mode = _config.get('mode'); + renderer.setElementClass(_elementRef.nativeElement, `picker-${this.mode}`, true); if (this.d.cssClass) { this.d.cssClass.split(' ').forEach(cssClass => { @@ -399,7 +403,7 @@ export class PickerCmp { this.lastClick = 0; } - ionViewLoaded() { + ionViewDidLoad() { // normalize the data let data = this.d; @@ -452,14 +456,14 @@ export class PickerCmp { }); } - private _colChange(selectedOption: PickerColumnOption) { + _colChange(selectedOption: PickerColumnOption) { // one of the columns has changed its selected index var picker = this._viewCtrl; picker.ionChange.emit(this.getSelected()); } @HostListener('body:keyup', ['$event']) - private _keyUp(ev: KeyboardEvent) { + _keyUp(ev: KeyboardEvent) { if (this.enabled && this._viewCtrl.isLast()) { if (ev.keyCode === Key.ENTER) { if (this.lastClick + 1000 < Date.now()) { @@ -547,10 +551,8 @@ export class PickerCmp { * Animations for pickers */ class PickerSlideIn extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.picker-wrapper')); @@ -564,10 +566,8 @@ Transition.register('picker-slide-in', PickerSlideIn); class PickerSlideOut extends Transition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.picker-wrapper')); diff --git a/src/components/picker/picker.ts b/src/components/picker/picker.ts index 96d493df75..52d6cf423b 100644 --- a/src/components/picker/picker.ts +++ b/src/components/picker/picker.ts @@ -2,10 +2,10 @@ import { EventEmitter, Injectable, Output } from '@angular/core'; import { App } from '../app/app'; import { isPresent } from '../../util/util'; -import { NavOptions } from '../nav/nav-interfaces'; +import { NavOptions } from '../../navigation/nav-util'; import { PickerCmp } from './picker-component'; import { PickerOptions, PickerColumn } from './picker-options'; -import { ViewController } from '../nav/view-controller'; +import { ViewController } from '../../navigation/view-controller'; /** * @private @@ -20,16 +20,11 @@ export class Picker extends ViewController { opts.buttons = opts.buttons || []; opts.enableBackdropDismiss = isPresent(opts.enableBackdropDismiss) ? !!opts.enableBackdropDismiss : true; - super(PickerCmp, opts); + super(PickerCmp, opts, null); this._app = app; this.isOverlay = true; this.ionChange = new EventEmitter(); - - // by default, pickers should not fire lifecycle events of other views - // for example, when an picker enters, the current active view should - // not fire its lifecycle events because it's not conceptually leaving - this.fireOtherLifecycles = false; } /** @@ -59,7 +54,7 @@ export class Picker extends ViewController { } refresh() { - this.instance.refresh && this.instance.refresh(); + this._cmp && this._cmp.instance.refresh && this._cmp.instance.refresh(); } /** @@ -83,7 +78,7 @@ export class Picker extends ViewController { * @private * DEPRECATED: Please inject PickerController instead */ - private static create(opt: any) { + static create(opt: any) { // deprecated warning: added beta.11 2016-06-27 console.warn('Picker.create(..) has been deprecated. Please inject PickerController instead'); } diff --git a/src/components/popover/popover-component.ts b/src/components/popover/popover-component.ts index 6a7b4e53ea..e4081e446b 100644 --- a/src/components/popover/popover-component.ts +++ b/src/components/popover/popover-component.ts @@ -1,16 +1,13 @@ -import { Component, ComponentResolver, ElementRef, HostListener, Renderer, ViewChild, ViewContainerRef } from '@angular/core'; +import { Component, ComponentFactoryResolver, ElementRef, HostListener, Renderer, ViewChild, ViewContainerRef } from '@angular/core'; -import { addSelector } from '../../config/bootstrap'; import { Animation } from '../../animations/animation'; -import { Backdrop } from '../backdrop/backdrop'; import { Config } from '../../config/config'; import { CSS, nativeRaf } from '../../util/dom'; -import { isPresent, pascalCaseToDashCase } from '../../util/util'; +import { pascalCaseToDashCase } from '../../util/util'; import { Key } from '../../util/key'; -import { NavParams } from '../nav/nav-params'; +import { NavParams } from '../../navigation/nav-params'; import { PageTransition } from '../../transitions/page-transition'; -import { TransitionOptions } from '../../transitions/transition'; -import { ViewController } from '../nav/view-controller'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -18,41 +15,45 @@ import { ViewController } from '../nav/view-controller'; */ @Component({ selector: 'ion-popover', - template: ` - -
-
-
-
-
-
-
-
- `, - directives: [Backdrop] + template: + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' }) export class PopoverCmp { - @ViewChild('viewport', {read: ViewContainerRef}) viewport: ViewContainerRef; - private d: { + @ViewChild('viewport', {read: ViewContainerRef}) _viewport: ViewContainerRef; + + d: { cssClass?: string; showBackdrop?: boolean; enableBackdropDismiss?: boolean; }; - private enabled: boolean; - private id: number; - private showSpinner: boolean; + + /** @private */ + _enabled: boolean; + + /** @private */ + id: number; constructor( - private _compiler: ComponentResolver, - private _elementRef: ElementRef, - private _renderer: Renderer, - private _config: Config, - private _navParams: NavParams, - private _viewCtrl: ViewController + public _cfr: ComponentFactoryResolver, + public _elementRef: ElementRef, + public _renderer: Renderer, + public _config: Config, + public _navParams: NavParams, + public _viewCtrl: ViewController ) { this.d = _navParams.data.opts; + _renderer.setElementClass(_elementRef.nativeElement, `popover-${_config.get('mode')}`, true); + if (this.d.cssClass) { this.d.cssClass.split(' ').forEach(cssClass => { // Make sure the class isn't whitespace, otherwise it throws exceptions @@ -63,46 +64,43 @@ export class PopoverCmp { this.id = (++popoverIds); } - ionViewWillEnter() { - addSelector(this._navParams.data.componentType, 'ion-popover-inner'); - - this._compiler.resolveComponent(this._navParams.data.componentType).then((componentFactory) => { - let componentRef = this.viewport.createComponent(componentFactory, this.viewport.length, this.viewport.parentInjector); - - this._viewCtrl.setInstance(componentRef.instance); - - // manually fire ionViewWillEnter() since PopoverCmp's ionViewWillEnter already happened - this._viewCtrl.fireWillEnter(); - }); - } - ngAfterViewInit() { let activeElement: any = document.activeElement; if (document.activeElement) { activeElement.blur(); } - this.enabled = true; + this._load(this._navParams.data.component); } - dismiss(role: any): Promise { - return this._viewCtrl.dismiss(null, role); + /** @private */ + _load(component: any) { + if (component) { + const componentFactory = this._cfr.resolveComponentFactory(component); + + // ******** DOM WRITE **************** + const componentRef = this._viewport.createComponent(componentFactory, this._viewport.length, this._viewport.parentInjector, []); + this._viewCtrl._setInstance(componentRef.instance); + + this._setCssClass(componentRef, pascalCaseToDashCase(component.name)); + this._enabled = true; + } } - bdTouch(ev: UIEvent) { - ev.preventDefault(); - ev.stopPropagation(); + /** @private */ + _setCssClass(componentRef: any, className: string) { + this._renderer.setElementClass(componentRef.location.nativeElement, className, true); } - bdClick() { - if (this.enabled && this.d.enableBackdropDismiss) { - this.dismiss('backdrop'); + _bdClick() { + if (this._enabled && this.d.enableBackdropDismiss) { + return this._viewCtrl.dismiss(null, 'backdrop'); } } @HostListener('body:keyup', ['$event']) - private _keyUp(ev: KeyboardEvent) { - if (this.enabled && ev.keyCode === Key.ESCAPE && this._viewCtrl.isLast()) { - this.bdClick(); + _keyUp(ev: KeyboardEvent) { + if (this._enabled && ev.keyCode === Key.ESCAPE && this._viewCtrl.isLast()) { + this._bdClick(); } } } @@ -112,9 +110,6 @@ export class PopoverCmp { * Animations for popover */ class PopoverTransition extends PageTransition { - constructor(enteringView: ViewController, leavingView: ViewController, opts: TransitionOptions) { - super(enteringView, leavingView, opts); - } mdPositionView(nativeEle: HTMLElement, ev: any) { let originY = 'top'; @@ -138,7 +133,6 @@ class PopoverTransition extends PageTransition { let targetTop = (targetDim && 'top' in targetDim) ? targetDim.top : (bodyHeight / 2) - (popoverHeight / 2); let targetLeft = (targetDim && 'left' in targetDim) ? targetDim.left : (bodyWidth / 2) - (popoverWidth / 2); - let targetWidth = targetDim && targetDim.width || 0; let targetHeight = targetDim && targetDim.height || 0; let popoverCSS = { @@ -170,7 +164,7 @@ class PopoverTransition extends PageTransition { popoverEle.style.top = popoverCSS.top + 'px'; popoverEle.style.left = popoverCSS.left + 'px'; - popoverEle.style[CSS.transformOrigin] = originY + ' ' + originX; + (popoverEle.style)[CSS.transformOrigin] = originY + ' ' + originX; // Since the transition starts before styling is done we // want to wait for the styles to apply before showing the wrapper @@ -250,7 +244,7 @@ class PopoverTransition extends PageTransition { popoverEle.style.top = popoverCSS.top + 'px'; popoverEle.style.left = popoverCSS.left + 'px'; - popoverEle.style[CSS.transformOrigin] = originY + ' ' + originX; + (popoverEle.style)[CSS.transformOrigin] = originY + ' ' + originX; // Since the transition starts before styling is done we // want to wait for the styles to apply before showing the wrapper @@ -259,10 +253,8 @@ class PopoverTransition extends PageTransition { } class PopoverPopIn extends PopoverTransition { - constructor(enteringView: ViewController, leavingView: ViewController, private opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; + init() { + let ele = this.enteringView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.popover-wrapper')); @@ -288,10 +280,8 @@ PageTransition.register('popover-pop-in', PopoverPopIn); class PopoverPopOut extends PopoverTransition { - constructor(enteringView: ViewController, leavingView: ViewController, private opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let backdrop = new Animation(ele.querySelector('ion-backdrop')); let wrapper = new Animation(ele.querySelector('.popover-wrapper')); @@ -309,11 +299,8 @@ PageTransition.register('popover-pop-out', PopoverPopOut); class PopoverMdPopIn extends PopoverTransition { - constructor(enteringView: ViewController, leavingView: ViewController, private opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = enteringView.pageRef().nativeElement; - + init() { + let ele = this.enteringView.pageRef().nativeElement; let content = new Animation(ele.querySelector('.popover-content')); let viewport = new Animation(ele.querySelector('.popover-viewport')); @@ -338,10 +325,8 @@ PageTransition.register('popover-md-pop-in', PopoverMdPopIn); class PopoverMdPopOut extends PopoverTransition { - constructor(enteringView: ViewController, leavingView: ViewController, private opts: TransitionOptions) { - super(enteringView, leavingView, opts); - - let ele = leavingView.pageRef().nativeElement; + init() { + let ele = this.leavingView.pageRef().nativeElement; let wrapper = new Animation(ele.querySelector('.popover-wrapper')); wrapper.fromTo('opacity', 0.99, 0); diff --git a/src/components/popover/popover.ts b/src/components/popover/popover.ts index a3dd40c53b..82a26c7857 100644 --- a/src/components/popover/popover.ts +++ b/src/components/popover/popover.ts @@ -2,10 +2,10 @@ import { Injectable } from '@angular/core'; import { App } from '../app/app'; import { isPresent } from '../../util/util'; -import { NavOptions } from '../nav/nav-interfaces'; +import { NavOptions } from '../../navigation/nav-util'; import { PopoverCmp } from './popover-component'; import { PopoverOptions } from './popover-options'; -import { ViewController } from '../nav/view-controller'; +import { ViewController } from '../../navigation/view-controller'; /** @@ -14,20 +14,15 @@ import { ViewController } from '../nav/view-controller'; export class Popover extends ViewController { private _app: App; - constructor(app: App, componentType: any, data: any = {}, opts: PopoverOptions = {}) { + 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.componentType = componentType; + data.component = component; data.opts = opts; - super(PopoverCmp, data); + super(PopoverCmp, data, null); this._app = app; this.isOverlay = true; - - // by default, popovers should not fire lifecycle events of other views - // for example, when a popover enters, the current active view should - // not fire its lifecycle events because it's not conceptually leaving - this.fireOtherLifecycles = false; } /** @@ -52,7 +47,7 @@ export class Popover extends ViewController { * @private * DEPRECATED: Please inject PopoverController instead */ - static create(componentType: any, data = {}, opts: PopoverOptions = {}) { + 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'); } @@ -110,7 +105,7 @@ export class Popover extends ViewController { * ```ts * @Component({}) * class MyPage { - * constructor(private popoverCtrl: PopoverController) {} + * constructor(public popoverCtrl: PopoverController) {} * * presentPopover(myEvent) { * let popover = this.popoverCtrl.create(PopoverPage); @@ -138,7 +133,7 @@ export class Popover extends ViewController { * ` * }) * class PopoverPage { - * constructor(private viewCtrl: ViewController) {} + * constructor(public viewCtrl: ViewController) {} * * close() { * this.viewCtrl.dismiss(); @@ -165,12 +160,12 @@ export class PopoverController { /** * Present a popover. See below for options - * @param {object} componentType The Popover + * @param {object} component The Popover * @param {object} data Any data to pass to the Popover view * @param {PopoverOptions} opts Popover options */ - create(componentType: any, data = {}, opts: PopoverOptions = {}): Popover { - return new Popover(this._app, componentType, data, opts); + create(component: any, data = {}, opts: PopoverOptions = {}): Popover { + return new Popover(this._app, component, data, opts); } } diff --git a/src/components/radio/radio-group.ts b/src/components/radio/radio-group.ts index f8afe3d0fe..c39f846f09 100644 --- a/src/components/radio/radio-group.ts +++ b/src/components/radio/radio-group.ts @@ -1,12 +1,15 @@ -import { AfterContentInit, ContentChild, Directive, ElementRef, EventEmitter, forwardRef, Input, Output, Provider, Renderer } from '@angular/core'; -import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { ContentChild, Directive, ElementRef, EventEmitter, forwardRef, Output, Renderer } from '@angular/core'; +import { NG_VALUE_ACCESSOR } from '@angular/forms'; -import { ListHeader } from '../list/list'; +import { ListHeader } from '../list/list-header'; import { isCheckedProperty } from '../../util/util'; import { RadioButton } from './radio-button'; -export const RADIO_VALUE_ACCESSOR = new Provider( - NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => RadioGroup), multi: true}); +export const RADIO_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => RadioGroup), + multi: true +}; /** * @name RadioGroup @@ -62,16 +65,31 @@ export const RADIO_VALUE_ACCESSOR = new Provider( @Directive({ selector: '[radio-group]', host: { - '[attr.aria-activedescendant]': 'activeId', 'role': 'radiogroup' }, providers: [RADIO_VALUE_ACCESSOR] }) -export class RadioGroup implements AfterContentInit, ControlValueAccessor { - private _btns: Array = []; - private _fn: Function; - private _ids: number = -1; - private _init: boolean = false; +export class RadioGroup { + + /** + * @private + */ + _btns: RadioButton[] = []; + + /** + * @private + */ + _fn: Function; + + /** + * @private + */ + _ids: number = -1; + + /** + * @private + */ + _init: boolean = false; /** * @private @@ -145,7 +163,7 @@ export class RadioGroup implements AfterContentInit, ControlValueAccessor { /** * @private */ - private _update() { + _update() { // loop through each of the radiobuttons let hasChecked = false; this._btns.forEach(radioButton => { @@ -163,7 +181,10 @@ export class RadioGroup implements AfterContentInit, ControlValueAccessor { }); } - private _setActive(radioButton: RadioButton) { + /** + * @private + */ + _setActive(radioButton: RadioButton) { this._renderer.setElementAttribute(this._elementRef.nativeElement, 'aria-activedescendant', radioButton.id); } @@ -199,7 +220,7 @@ export class RadioGroup implements AfterContentInit, ControlValueAccessor { * @private */ @ContentChild(ListHeader) - private set _header(header: any) { + set _header(header: any) { if (header) { if (!header.id) { header.id = 'rg-hdr-' + this.id; diff --git a/src/components/refresher/refresher-content.ts b/src/components/refresher/refresher-content.ts index 2774377f18..2bb795c7e3 100644 --- a/src/components/refresher/refresher-content.ts +++ b/src/components/refresher/refresher-content.ts @@ -1,10 +1,7 @@ import { Component, Input, ViewEncapsulation } from '@angular/core'; -import { NgIf } from '@angular/common'; import { Config } from '../../config/config'; -import { Icon } from '../icon/icon'; import { Refresher } from './refresher'; -import { Spinner } from '../spinner/spinner'; /** @@ -12,21 +9,19 @@ import { Spinner } from '../spinner/spinner'; */ @Component({ selector: 'ion-refresher-content', - template: ` -
-
- -
-
-
-
-
- -
-
-
- `, - directives: [Icon, NgIf, Spinner], + template: + '
' + + '
' + + '' + + '
' + + '
' + + '
' + + '
' + + '
' + + '' + + '
' + + '
' + + '
', host: { '[attr.state]': 'r.state' }, @@ -55,7 +50,7 @@ export class RefresherContent { @Input() refreshingText: string; - constructor(private r: Refresher, private _config: Config) {} + constructor(public r: Refresher, private _config: Config) {} /** * @private diff --git a/src/components/refresher/refresher.ts b/src/components/refresher/refresher.ts index 7acebde8c2..1a595aafe8 100644 --- a/src/components/refresher/refresher.ts +++ b/src/components/refresher/refresher.ts @@ -95,14 +95,14 @@ import { PointerEvents, UIEventManager } from '../../util/ui-event-manager'; } }) export class Refresher { - private _appliedStyles: boolean = false; - private _didStart: boolean; - private _lastCheck: number = 0; - private _isEnabled: boolean = true; - private _gesture: GestureDelegate; - private _events: UIEventManager = new UIEventManager(false); - private _pointerEvents: PointerEvents; - private _top: string = ''; + _appliedStyles: boolean = false; + _didStart: boolean; + _lastCheck: number = 0; + _isEnabled: boolean = true; + _gesture: GestureDelegate; + _events: UIEventManager = new UIEventManager(false); + _pointerEvents: PointerEvents; + _top: string = ''; /** * The current state which the refresher is in. The refresher's states include: @@ -199,13 +199,13 @@ export class Refresher { constructor(@Host() private _content: Content, private _zone: NgZone, gestureCtrl: GestureController) { - _content.addCssClass('has-refresher'); + _content.setElementClass('has-refresher', true); this._gesture = gestureCtrl.create('refresher', { priority: GesturePriority.Refresher, }); } - private _onStart(ev: TouchEvent): any { + _onStart(ev: TouchEvent): any { // if multitouch then get out immediately if (ev.touches && ev.touches.length > 1) { return false; @@ -241,7 +241,7 @@ export class Refresher { return true; } - private _onMove(ev: TouchEvent) { + _onMove(ev: TouchEvent) { // this method can get called like a bazillion times per second, // so it's built to be as efficient as possible, and does its // best to do any DOM read/writes only when absolutely necessary @@ -340,7 +340,7 @@ export class Refresher { }); } - private _onMoveInZone() { + _onMoveInZone() { // set pull progress this.progress = (this.deltaY / this.pullMin); @@ -374,7 +374,7 @@ export class Refresher { return 4; } - private _onEnd(ev: UIEvent) { + _onEnd() { // only run in a zone when absolutely necessary if (this.state === STATE_READY) { @@ -397,7 +397,7 @@ export class Refresher { this.startY = null; } - private _beginRefresh() { + _beginRefresh() { // assumes we're already back in a zone // they pulled down far enough, so it's ready to refresh this.state = STATE_REFRESHING; @@ -430,7 +430,7 @@ export class Refresher { this._close(STATE_CANCELLING, ''); } - private _close(state: string, delay: string) { + _close(state: string, delay: string) { var timer: number; function close(ev: any) { @@ -461,7 +461,7 @@ export class Refresher { } } - private _setCss(y: number, duration: string, overflowVisible: boolean, delay: string) { + _setCss(y: number, duration: string, overflowVisible: boolean, delay: string) { this._appliedStyles = (y > 0); var content = this._content; @@ -471,7 +471,7 @@ export class Refresher { content.setScrollElementStyle('overflow', (overflowVisible ? 'hidden' : '')); } - private _setListeners(shouldListen: boolean) { + _setListeners(shouldListen: boolean) { this._events.unlistenAll(); this._pointerEvents = null; if (shouldListen) { diff --git a/src/components/refresher/test/refresher.spec.ts b/src/components/refresher/test/refresher.spec.ts index 8ddb21a1e8..b530200c62 100644 --- a/src/components/refresher/test/refresher.spec.ts +++ b/src/components/refresher/test/refresher.spec.ts @@ -1,6 +1,8 @@ -import { Refresher, Content, Config, GestureController, Ion } from '../../../../src'; +import { Refresher } from '../refresher'; +import { Content } from '../../content/content'; +import { GestureController } from '../../../gestures/gesture-controller'; +import { mockConfig, mockElementRef, mockRenderer, mockZone } from '../../../util/mock-providers'; -export function run() { describe('Refresher', () => { @@ -20,19 +22,19 @@ describe('Refresher', () => { it('should do nothing if state=cancelling', () => { refresher.state = 'cancelling'; - var results = refresher._onEnd(); + refresher._onEnd(); expect(refresher.state).toEqual('cancelling'); }); it('should do nothing if state=completing', () => { refresher.state = 'completing'; - var results = refresher._onEnd(); + refresher._onEnd(); expect(refresher.state).toEqual('completing'); }); it('should do nothing if state=refreshing', () => { refresher.state = 'refreshing'; - var results = refresher._onEnd(); + refresher._onEnd(); expect(refresher.state).toEqual('refreshing'); }); @@ -93,7 +95,7 @@ describe('Refresher', () => { setContentScrollTop(0); refresher.startY = 100; refresher.pullMin = 80; - let result = refresher._onMove( touchEv(125) ); + refresher._onMove( touchEv(125) ); expect(getScrollElementStyles().transform).toEqual('translateY(25px) translateZ(0px)'); expect(getScrollElementStyles().transitionDuration).toEqual('0ms'); @@ -106,7 +108,7 @@ describe('Refresher', () => { setContentScrollTop(1); refresher.startY = 100; - let result = refresher._onMove( touchEv(95) ); + let result = refresher._onMove( touchEv(95) ); expect(result).toEqual(6); }); @@ -116,7 +118,7 @@ describe('Refresher', () => { setContentScrollTop(50); refresher.startY = 100; - let result = refresher._onMove( touchEv(125) ); + let result = refresher._onMove( touchEv(125) ); expect(refresher.state).toEqual('inactive'); expect(refresher.progress).toEqual(0); @@ -128,7 +130,7 @@ describe('Refresher', () => { refresher._appliedStyles = true; refresher.startY = 100; - let result = refresher._onMove( touchEv(85) ); + let result = refresher._onMove( touchEv(85) ); expect(refresher.state).toEqual('inactive'); expect(getScrollElementStyles().transform).toEqual('translateZ(0px)'); @@ -141,72 +143,71 @@ describe('Refresher', () => { setContentScrollTop(50); refresher.startY = 100; - var results = refresher._onMove(touchEv(80)); + var results = refresher._onMove( touchEv(80)); expect(results).toEqual(6); }); it('should not run when scrolling up, but isnt actively dragging', () => { setContentScrollTop(1); refresher.startY = 100; - refresher._isDragging = false - var results = refresher._onMove(touchEv(85)); + var results = refresher._onMove( touchEv(85)); expect(results).toEqual(6); }); it('should set the deltaY', () => { setContentScrollTop(1); refresher.startY = 100; - refresher._onMove( touchEv(133) ); + refresher._onMove( touchEv(133) ); expect(refresher.deltaY).toEqual(33); refresher._lastCheck = 0; // force allow next check refresher.startY = 100; - var results = refresher._onMove( touchEv(50) ); + var results = refresher._onMove( touchEv(50) ); expect(results).toEqual(6); expect(refresher.deltaY).toEqual(-50); }); it('should not run if it already ran less than 16ms ago', () => { refresher.startY = 100; - var results = refresher._onMove(touchEv(88)); + var results = refresher._onMove( touchEv(88)); expect(results).toEqual(6); - results = refresher._onMove(touchEv(88)); + results = refresher._onMove( touchEv(88)); expect(results).toEqual(3); }); it('should not run if state=refreshing', () => { refresher.startY = 100; refresher.state = 'refreshing'; - var results = refresher._onMove( touchEv(88) ); + var results = refresher._onMove( touchEv(88) ); expect(results).toEqual(2); }); it('should not run if state=completing', () => { refresher.startY = 100; refresher.state = 'completing'; - var results = refresher._onMove( touchEv(88) ); + var results = refresher._onMove( touchEv(88) ); expect(results).toEqual(2); }); it('should not run if state=cancelling', () => { refresher.startY = 100; refresher.state = 'cancelling'; - var results = refresher._onMove( touchEv(88) ); + var results = refresher._onMove( touchEv(88) ); expect(results).toEqual(2); }); it('should not run if no startY', () => { refresher.startY = null; - var results = refresher._onMove( touchEv(88) ); + var results = refresher._onMove( touchEv(88) ); expect(results).toEqual(2); }); it('should not run if multiple touches', () => { - var results = refresher._onMove({ - touches: [{},{}] + var results = refresher._onMove( { + touches: [{}, {}] }); expect(results).toEqual(1); }); @@ -214,23 +215,18 @@ describe('Refresher', () => { }); - let config = new Config(); let refresher: Refresher; let content: Content; - let contentElementRef; - let gestureController: GestureController; - let zone = { - run: function (cb) { cb(); }, - runOutsideAngular: function (cb) { cb(); } - }; beforeEach(() => { - contentElementRef = mockElementRef(); - gestureController = new GestureController(); - content = new Content(contentElementRef, config, null, null, zone, null, null); - content._scrollEle = document.createElement('scroll-content'); + let gestureController = new GestureController(null); + let elementRef = mockElementRef(); + elementRef.nativeElement.children.push(''); + content = new Content(mockConfig(), mockElementRef(), mockRenderer(), null, null, mockZone(), null, null); + content._scrollEle = document.createElement('div'); + content._scrollEle.className = 'scroll-content'; - refresher = new Refresher(content, zone, gestureController); + refresher = new Refresher(content, mockZone(), gestureController); }); function touchEv(y: number) { @@ -238,24 +234,24 @@ describe('Refresher', () => { type: 'mockTouch', touches: [{clientY: y}], preventDefault: function(){} - } - } - - function mockElementRef() { - return { - nativeElement: { - classList: { add: function(){}, remove: function(){} }, - scrollTop: 0, - hasAttribute: function(){}, - children: {length: 1 } - } - } + }; } function setContentScrollTop(scrollTop) { content.getContentDimensions = function() { return { - scrollTop: scrollTop + scrollTop: scrollTop, + scrollHeight: null, + contentHeight: null, + contentTop: null, + contentBottom: null, + contentWidth: null, + contentLeft: null, + contentRight: null, + scrollBottom: null, + scrollWidth: null, + scrollLeft: null, + scrollRight: null }; }; } @@ -265,5 +261,3 @@ describe('Refresher', () => { } }); - -} diff --git a/src/components/scroll/scroll.ts b/src/components/scroll/scroll.ts index 66a82da30c..1db5869672 100644 --- a/src/components/scroll/scroll.ts +++ b/src/components/scroll/scroll.ts @@ -1,6 +1,6 @@ -import { Component, ElementRef, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core'; +import { ChangeDetectionStrategy, Component, ElementRef, Input, ViewEncapsulation } from '@angular/core'; -import { Ion } from '../ion'; +import { isTrueProperty } from '../../util/util'; /** * @name Scroll @@ -17,53 +17,85 @@ import { Ion } from '../ion'; * * * ``` - *@property {boolean} [scrollX] - whether to enable scrolling along the X axis - *@property {boolean} [scrollY] - whether to enable scrolling along the Y axis; requires the following CSS declaration: ion-scroll { white-space: nowrap; } - *@property {boolean} [zoom] - whether to enable zooming - *@property {number} [maxZoom] - set the max zoom amount for ion-scroll + * @property {boolean} [scrollX] - whether to enable scrolling along the X axis + * @property {boolean} [scrollY] - whether to enable scrolling along the Y axis; requires the following CSS declaration: ion-scroll { white-space: nowrap; } + * @property {boolean} [zoom] - whether to enable zooming + * @property {number} [maxZoom] - set the max zoom amount for ion-scroll * @demo /docs/v2/demos/scroll/ */ @Component({ selector: 'ion-scroll', - inputs: [ - 'scrollX', 'scrollY', 'zoom', 'maxZoom' - ], + template: + '
' + + '
' + + '' + + '
' + + '
', host: { '[class.scroll-x]': 'scrollX', '[class.scroll-y]': 'scrollY' }, - template: - '' + - '
' + - '' + - '
' + - '
', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, }) -export class Scroll extends Ion { - /** - * @private - */ - private maxScale: number = 3; - /** - * @private - */ - private zoomDuration: number = 250; - /** - * @private - */ - private scrollElement: HTMLElement; +export class Scroll { + _scrollX: boolean = false; + _scrollY: boolean = false; + _zoom: boolean = false; + _maxZoom: number = 1; - constructor(elementRef: ElementRef) { - super(elementRef); + @Input() + get scrollX() { + return this._scrollX; + } + set scrollX(val: any) { + this._scrollX = isTrueProperty(val); + } + + @Input() + get scrollY() { + return this._scrollY; + } + set scrollY(val: any) { + this._scrollY = isTrueProperty(val); + } + + @Input() + get zoom() { + return this._zoom; + } + set zoom(val: any) { + this._zoom = isTrueProperty(val); + } + + @Input() + get maxZoom() { + return this._maxZoom; + } + set maxZoom(val: any) { + this._maxZoom = val; } + /** + * @private + */ + maxScale: number = 3; + /** + * @private + */ + zoomDuration: number = 250; + /** + * @private + */ + scrollElement: HTMLElement; + + constructor(private _elementRef: ElementRef) {} + /** * @private */ ngOnInit() { - this.scrollElement = this.getNativeElement().children[0]; + this.scrollElement = this._elementRef.nativeElement.children[0]; } /** diff --git a/src/components/searchbar/test/nav/e2e.ts b/src/components/searchbar/test/nav/e2e.ts index d0952fe13f..fed7b2cc88 100644 --- a/src/components/searchbar/test/nav/e2e.ts +++ b/src/components/searchbar/test/nav/e2e.ts @@ -1,4 +1,4 @@ it('should navigate to details', function() { - element(by.css('.e2eSearchbarNavItem')).click(); + element(by.css('.e2eSearchbarNavItem:first-child')).click(); }); diff --git a/src/components/select/select.ts b/src/components/select/select.ts index 6446fd2e1f..34c8fd1132 100644 --- a/src/components/select/select.ts +++ b/src/components/select/select.ts @@ -1,19 +1,22 @@ -import { AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Input, HostListener, OnDestroy, Optional, Output, Provider, Renderer, QueryList, ViewEncapsulation } from '@angular/core'; -import { NgIf } from '@angular/common'; +import { AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, forwardRef, Input, HostListener, OnDestroy, Optional, Output, Renderer, QueryList, ViewEncapsulation } from '@angular/core'; import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { ActionSheet } from '../action-sheet/action-sheet'; import { Alert } from '../alert/alert'; import { App } from '../app/app'; +import { Config } from '../../config/config'; import { Form } from '../../util/form'; +import { Ion } from '../ion'; import { isBlank, isCheckedProperty, isTrueProperty, merge } from '../../util/util'; import { Item } from '../item/item'; -import { NavController } from '../nav/nav-controller'; +import { NavController } from '../../navigation/nav-controller'; import { Option } from '../option/option'; -export const SELECT_VALUE_ACCESSOR = new Provider( - NG_VALUE_ACCESSOR, {useExisting: forwardRef(() => Select), multi: true}); - +export const SELECT_VALUE_ACCESSOR: any = { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => Select), + multi: true +}; /** * @name Select @@ -119,36 +122,35 @@ export const SELECT_VALUE_ACCESSOR = new Provider( */ @Component({ selector: 'ion-select', - template: ` -
{{placeholder}}
-
{{selectedText || _text}}
-
-
-
- - `, - directives: [NgIf], + template: + '
{{placeholder}}
' + + '
{{selectedText || _text}}
' + + '
' + + '
' + + '
' + + '', host: { '[class.select-disabled]': '_disabled' }, providers: [SELECT_VALUE_ACCESSOR], encapsulation: ViewEncapsulation.None, }) -export class Select implements AfterContentInit, ControlValueAccessor, OnDestroy { - private _disabled: any = false; - private _labelId: string; - private _multi: boolean = false; - private _options: QueryList