forked from EVOgeek/Vmeda.Online
		
	MOBILE-3814 collapsible: Recalculate Height when slotted
This commit is contained in:
		
							parent
							
								
									d727c53621
								
							
						
					
					
						commit
						dcb19c0f11
					
				| @ -72,6 +72,10 @@ export class CoreCollapsibleFooterDirective implements OnInit, OnDestroy { | ||||
| 
 | ||||
|         await this.calculateHeight(); | ||||
| 
 | ||||
|         CoreDomUtils.onElementSlot(this.element, () => { | ||||
|             this.calculateHeight(); | ||||
|         }); | ||||
| 
 | ||||
|         this.listenScrollEvents(); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -220,6 +220,53 @@ export class CoreDomUtilsProvider { | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Runs a function when an element has been slotted. | ||||
|      * | ||||
|      * @param element HTML Element inside an ion-content to wait for slot. | ||||
|      * @param callback Function to execute on resize. | ||||
|      */ | ||||
|     onElementSlot(element: HTMLElement, callback: (ev?: Event) => void): void { | ||||
|         if (!element.slot) { | ||||
|             // Element not declared to be slotted.
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const slotName = element.slot; | ||||
|         if (element.assignedSlot?.name === slotName) { | ||||
|             // Slot already assigned.
 | ||||
|             callback(); | ||||
| 
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const content = element.closest('ion-content'); | ||||
|         if (!content || !content.shadowRoot) { | ||||
|             // Cannot find content.
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const slots = content.shadowRoot.querySelectorAll('slot'); | ||||
|         const slot = Array.from(slots).find((slot) => slot.name === slotName); | ||||
| 
 | ||||
|         if (!slot) { | ||||
|             // Slot not found.
 | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const slotListener = () => { | ||||
|             if (element.assignedSlot?.name !== slotName) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             callback(); | ||||
|             // It would happen only once.
 | ||||
|             slot.removeEventListener('slotchange', slotListener); | ||||
|         }; | ||||
| 
 | ||||
|         slot.addEventListener('slotchange', slotListener);; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Window resize is widely checked and may have many performance issues, debouce usage is needed to avoid calling it too much. | ||||
|      * This function helps setting up the debounce feature and remove listener easily. | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user