Skip to content

Commit

Permalink
feat(angular): ion-nav
Browse files Browse the repository at this point in the history
  • Loading branch information
manucorporat committed Mar 20, 2018
1 parent d3105d1 commit f39d3ad
Show file tree
Hide file tree
Showing 6 changed files with 121 additions and 21 deletions.
119 changes: 106 additions & 13 deletions angular/src/navigation/ion-nav.ts
@@ -1,22 +1,26 @@
import { Component, ViewEncapsulation } from '@angular/core';
import {
NavigationEnd,
NavigationStart,
Router
} from '@angular/router';
import { ComponentFactoryResolver, Directive, ElementRef, Injector} from '@angular/core';
import { NavigationEnd, NavigationStart, Router } from '@angular/router';

import { FrameworkDelegate, NavOptions, NavParams, TransitionDoneFn, ViewController } from '@ionic/core';
import { proxyEl } from '../util/util';
import { AngularDelegate } from '..';

@Component({

@Directive({
selector: 'ion-nav',
template: '<ng-content></ng-content>',
styles: [`
ion-nav > :not(.show-page) { display: none; }
`],
encapsulation: ViewEncapsulation.None
})
export class IonNav {

constructor(router: Router) {
private delegate: FrameworkDelegate;

constructor(
private ref: ElementRef,
router: Router,
cfr: ComponentFactoryResolver,
injector: Injector,
angularDelegate: AngularDelegate,
) {
this.delegate = angularDelegate.create(cfr, injector);
console.log('ion-nav');

router.events.subscribe(ev => {
Expand All @@ -29,4 +33,93 @@ export class IonNav {
});
}

push(page: any, params?: NavParams, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'push', page, params, this.wrap(opts), done);
}

insert(insertIndex: number, page: any, params?: NavParams, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'insert', insertIndex, page, params, this.wrap(opts), done);
}

insertPages(insertIndex: number, insertPages: any[], opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'insertPages', insertIndex, insertPages, this.wrap(opts), done);
}

pop(opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'pop', this.wrap(opts), done);
}

popTo(indexOrViewCtrl: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'popTo', indexOrViewCtrl, this.wrap(opts), done);
}

popToRoot(opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'popToRoot', this.wrap(opts), done);
}

popAll(): Promise<boolean[]> {
return proxyEl(this.ref, 'popAll');
}

removeIndex(startIndex: number, removeCount = 1, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'removeIndex', startIndex, removeCount, this.wrap(opts), done);
}

removeView(viewController: ViewController, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'removeView', viewController, this.wrap(opts), done);
}

setRoot(pageOrViewCtrl: any, params?: any, opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'setRoot', pageOrViewCtrl, params, this.wrap(opts), done);
}

setPages(pages: any[], opts?: NavOptions, done?: TransitionDoneFn): Promise<boolean> {
return proxyEl(this.ref, 'setPages', pages, this.wrap(opts), done);
}

getAllChildNavs(): any[] {
return proxyEl(this.ref, 'getAllChildNavs');
}

canGoBack(view?: ViewController): boolean {
return proxyEl(this.ref, 'canGoBack', view);
}

getActive(): ViewController {
return proxyEl(this.ref, 'getActive');
}

getByIndex(index: number): ViewController {
return proxyEl(this.ref, 'getByIndex', index);
}

getPrevious(view?: ViewController): ViewController|undefined {
return proxyEl(this.ref, 'getPrevious', view);
}

getViews(): Array<ViewController> {
return proxyEl(this.ref, 'getViews');
}
/**
* Return a view controller
*/
getViewById(id: string): ViewController|undefined {
return proxyEl(this.ref, 'getViewById', id);
}

indexOf(viewController: ViewController) {
return proxyEl(this.ref, 'indexOf', viewController);
}

length() {
return proxyEl(this.ref, 'length');
}

private wrap(opts?: NavOptions): NavOptions {
return {
...this.wrap(opts),
delegate: this.delegate
};
}

}
5 changes: 2 additions & 3 deletions angular/src/navigation/router-transition.ts
@@ -1,6 +1,5 @@
import { ComponentRef } from '@angular/core';


export function runTransition(enteringRef: ComponentRef<any>, leavingRef: ComponentRef<any>): Promise<void> {
const enteringElm = (enteringRef && enteringRef.location && enteringRef.location.nativeElement);
const leavingElm = (leavingRef && leavingRef.location && leavingRef.location.nativeElement);
Expand All @@ -9,11 +8,11 @@ export function runTransition(enteringRef: ComponentRef<any>, leavingRef: Compon
return Promise.resolve();
}

return transition(enteringElm, leavingElm);
return tr(enteringElm, leavingElm);
}


function transition(enteringElm: HTMLElement, leavingElm: HTMLElement): Promise<void> {
function tr(enteringElm: HTMLElement, leavingElm: HTMLElement): Promise<void> {
console.log('transition start');

return new Promise(resolve => {
Expand Down
7 changes: 7 additions & 0 deletions angular/src/util/util.ts
@@ -1,10 +1,17 @@
import { ElementRef } from '@angular/core';

export function proxyMethod(ctrlName: string, methodName: string, ...args: any[]) {
const controller = ensureElementInBody(ctrlName);
return controller.componentOnReady()
.then(() => (controller as any)[methodName].apply(controller, args));
}

export function proxyEl(ref: ElementRef, methodName: string, ...args: any[]) {
return ref.nativeElement.componentOnReady()
.then((el: any) => el[methodName].apply(el, args));
}


export function ensureElementInBody(elementName: string) {
let element = document.querySelector(elementName);
if (!element) {
Expand Down
4 changes: 2 additions & 2 deletions core/src/components/virtual-scroll/virtual-scroll.tsx
Expand Up @@ -28,7 +28,7 @@ export class VirtualScroll {
private heightChanged = false;
private lastItemLen = 0;

@Element() el: HTMLElement;
@Element() el: HTMLStencilElement;

@Prop({context: 'dom'}) dom: DomController;
@Prop({context: 'enableListener'}) enableListener: EventListenerEnable;
Expand Down Expand Up @@ -257,7 +257,7 @@ export class VirtualScroll {
} else if (this.domRender) {
this.domRender(this.virtualDom);
} else if (this.renderer) {
(this.el as any).forceUpdate();
this.el.forceUpdate();
}
if (this.heightChanged) {
this.el.style.height = this.totalHeight + 'px';
Expand Down
1 change: 1 addition & 0 deletions core/src/index.d.ts
Expand Up @@ -59,6 +59,7 @@ export * from './components/modal/modal';
export { ModalController } from './components/modal-controller/modal-controller';
export * from './components/nav/nav';
export { ViewController } from './components/nav/view-controller';
export { NavParams, NavOptions, TransitionDoneFn} from './components/nav/nav-util';
export { Note } from './components/note/note';
export { PickerColumnCmp } from './components/picker-column/picker-column';
export * from './components/picker/picker';
Expand Down
6 changes: 3 additions & 3 deletions demos/angular/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit f39d3ad

Please sign in to comment.