forked from CIT/Vmeda.Online
		
	MOBILE-3029 core: Let site plugins override NavController events
This commit is contained in:
		
							parent
							
								
									6557793227
								
							
						
					
					
						commit
						632a0dc57a
					
				| @ -60,6 +60,7 @@ export class CoreCompileHtmlComponent implements OnChanges, OnDestroy, DoCheck { | |||||||
|     protected element; |     protected element; | ||||||
|     protected differ: any; // To detect changes in the jsData input.
 |     protected differ: any; // To detect changes in the jsData input.
 | ||||||
|     protected creatingComponent = false; |     protected creatingComponent = false; | ||||||
|  |     protected pendingCalls = {}; | ||||||
| 
 | 
 | ||||||
|     constructor(protected compileProvider: CoreCompileProvider, protected cdr: ChangeDetectorRef, element: ElementRef, |     constructor(protected compileProvider: CoreCompileProvider, protected cdr: ChangeDetectorRef, element: ElementRef, | ||||||
|             @Optional() protected navCtrl: NavController, differs: KeyValueDiffers, protected domUtils: CoreDomUtilsProvider, |             @Optional() protected navCtrl: NavController, differs: KeyValueDiffers, protected domUtils: CoreDomUtilsProvider, | ||||||
| @ -165,6 +166,22 @@ export class CoreCompileHtmlComponent implements OnChanges, OnDestroy, DoCheck { | |||||||
|                 if (compileInstance.javascript) { |                 if (compileInstance.javascript) { | ||||||
|                     compileInstance.compileProvider.executeJavascript(this, compileInstance.javascript); |                     compileInstance.compileProvider.executeJavascript(this, compileInstance.javascript); | ||||||
|                 } |                 } | ||||||
|  | 
 | ||||||
|  |                 // Call the pending functions.
 | ||||||
|  |                 for (const name in compileInstance.pendingCalls) { | ||||||
|  |                     const pendingCall = compileInstance.pendingCalls[name]; | ||||||
|  | 
 | ||||||
|  |                     if (typeof this[name] == 'function') { | ||||||
|  |                         // Call the function.
 | ||||||
|  |                         Promise.resolve(this[name].apply(this, pendingCall.params)).then(pendingCall.defer.resolve) | ||||||
|  |                                 .catch(pendingCall.defer.reject); | ||||||
|  |                     } else { | ||||||
|  |                         // Function not defined, resolve the promise.
 | ||||||
|  |                         pendingCall.defer.resolve(); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 compileInstance.pendingCalls = {}; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             /** |             /** | ||||||
| @ -200,4 +217,39 @@ export class CoreCompileHtmlComponent implements OnChanges, OnDestroy, DoCheck { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Call a certain function on the component instance. | ||||||
|  |      * | ||||||
|  |      * @param {string} name Name of the function to call. | ||||||
|  |      * @param {any[]} params List of params to send to the function. | ||||||
|  |      * @param {boolean} [callWhenCreated=true] If this param is true and the component hasn't been created yet, call the function | ||||||
|  |      *                                         once the component has been created. | ||||||
|  |      * @return {any} Result of the call. Undefined if no component instance or the function doesn't exist. | ||||||
|  |      */ | ||||||
|  |     callComponentFunction(name: string, params?: any[], callWhenCreated: boolean = true): any { | ||||||
|  |         if (this.componentInstance) { | ||||||
|  |             if (typeof this.componentInstance[name] == 'function') { | ||||||
|  |                 return this.componentInstance[name].apply(this.componentInstance, params); | ||||||
|  |             } | ||||||
|  |         } else if (callWhenCreated) { | ||||||
|  |             // Call it when the component is created.
 | ||||||
|  | 
 | ||||||
|  |             if (this.pendingCalls[name]) { | ||||||
|  |                 // Call already pending, just update the params (allow only 1 call per function until it's initialized).
 | ||||||
|  |                 this.pendingCalls[name].params = params; | ||||||
|  | 
 | ||||||
|  |                 return this.pendingCalls[name].defer.promise; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             const defer = this.utils.promiseDefer(); | ||||||
|  | 
 | ||||||
|  |             this.pendingCalls[name] = { | ||||||
|  |                 params: params, | ||||||
|  |                 defer: defer | ||||||
|  |             }; | ||||||
|  | 
 | ||||||
|  |             return defer.promise; | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ | |||||||
|         <ion-item text-center *ngIf="(!handlers || !handlers.length) && !handlersLoaded"> |         <ion-item text-center *ngIf="(!handlers || !handlers.length) && !handlersLoaded"> | ||||||
|             <ion-spinner></ion-spinner> |             <ion-spinner></ion-spinner> | ||||||
|         </ion-item> |         </ion-item> | ||||||
|         <a ion-item *ngFor="let handler of handlers" [ngClass]="['core-moremenu-handler', handler.class]" (click)="openHandler(handler)" title="{{ handler.title | translate }}" detail-push> |         <a ion-item *ngFor="let handler of handlers" [ngClass]="['core-moremenu-handler', handler.class || '']" (click)="openHandler(handler)" title="{{ handler.title | translate }}" detail-push> | ||||||
|             <core-icon [name]="handler.icon" item-start></core-icon> |             <core-icon [name]="handler.icon" item-start></core-icon> | ||||||
|             <p>{{ handler.title | translate}}</p> |             <p>{{ handler.title | translate}}</p> | ||||||
|             <ion-badge item-end *ngIf="handler.showBadge" [hidden]="handler.loading || !handler.badge">{{handler.badge}}</ion-badge> |             <ion-badge item-end *ngIf="handler.showBadge" [hidden]="handler.loading || !handler.badge">{{handler.badge}}</ion-badge> | ||||||
|  | |||||||
| @ -169,4 +169,15 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C | |||||||
|         this.isDestroyed = true; |         this.isDestroyed = true; | ||||||
|         this.statusObserver && this.statusObserver.off(); |         this.statusObserver && this.statusObserver.off(); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Call a certain function on the component instance. | ||||||
|  |      * | ||||||
|  |      * @param {string} name Name of the function to call. | ||||||
|  |      * @param {any[]} params List of params to send to the function. | ||||||
|  |      * @return {any} Result of the call. Undefined if no component instance or the function doesn't exist. | ||||||
|  |      */ | ||||||
|  |     callComponentFunction(name: string, params?: any[]): any { | ||||||
|  |         return this.content.callComponentFunction(name, params); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -176,4 +176,17 @@ export class CoreSitePluginsPluginContentComponent implements OnInit, DoCheck { | |||||||
| 
 | 
 | ||||||
|         this.fetchContent(); |         this.fetchContent(); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Call a certain function on the component instance. | ||||||
|  |      * | ||||||
|  |      * @param {string} name Name of the function to call. | ||||||
|  |      * @param {any[]} params List of params to send to the function. | ||||||
|  |      * @return {any} Result of the call. Undefined if no component instance or the function doesn't exist. | ||||||
|  |      */ | ||||||
|  |     callComponentFunction(name: string, params?: any[]): any { | ||||||
|  |         if (this.compileComponent) { | ||||||
|  |             return (<any> this.compileComponent).callComponentFunction(name, params); | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -48,4 +48,48 @@ export class CoreSitePluginsModuleIndexPage { | |||||||
|             refresher.complete(); |             refresher.complete(); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page is about to enter and become the active page. | ||||||
|  |      */ | ||||||
|  |     ionViewWillEnter(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewWillEnter'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page has fully entered and is now the active page. This event will fire, whether it was the first load or a cached page. | ||||||
|  |      */ | ||||||
|  |     ionViewDidEnter(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewDidEnter'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page is about to leave and no longer be the active page. | ||||||
|  |      */ | ||||||
|  |     ionViewWillLeave(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewWillLeave'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page has finished leaving and is no longer the active page. | ||||||
|  |      */ | ||||||
|  |     ionViewDidLeave(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewDidLeave'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page is about to be destroyed and have its elements removed. | ||||||
|  |      */ | ||||||
|  |     ionViewWillUnload(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewWillUnload'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if we can leave the page or not. | ||||||
|  |      * | ||||||
|  |      * @return {boolean|Promise<void>} Resolved if we can leave it, rejected if not. | ||||||
|  |      */ | ||||||
|  |     ionViewCanLeave(): boolean | Promise<void> { | ||||||
|  |         return this.content.callComponentFunction('ionViewCanLeave'); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -56,4 +56,48 @@ export class CoreSitePluginsPluginPage { | |||||||
|             refresher.complete(); |             refresher.complete(); | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page is about to enter and become the active page. | ||||||
|  |      */ | ||||||
|  |     ionViewWillEnter(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewWillEnter'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page has fully entered and is now the active page. This event will fire, whether it was the first load or a cached page. | ||||||
|  |      */ | ||||||
|  |     ionViewDidEnter(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewDidEnter'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page is about to leave and no longer be the active page. | ||||||
|  |      */ | ||||||
|  |     ionViewWillLeave(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewWillLeave'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page has finished leaving and is no longer the active page. | ||||||
|  |      */ | ||||||
|  |     ionViewDidLeave(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewDidLeave'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The page is about to be destroyed and have its elements removed. | ||||||
|  |      */ | ||||||
|  |     ionViewWillUnload(): void { | ||||||
|  |         this.content.callComponentFunction('ionViewWillUnload'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Check if we can leave the page or not. | ||||||
|  |      * | ||||||
|  |      * @return {boolean|Promise<void>} Resolved if we can leave it, rejected if not. | ||||||
|  |      */ | ||||||
|  |     ionViewCanLeave(): boolean | Promise<void> { | ||||||
|  |         return this.content.callComponentFunction('ionViewCanLeave'); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user