mirror of
				https://github.com/Redocly/redoc.git
				synced 2025-10-31 07:47:29 +03:00 
			
		
		
		
	refactor sticky-sidebar as directive
This commit is contained in:
		
							parent
							
								
									dd72d42285
								
							
						
					
					
						commit
						ccac2ee15c
					
				|  | @ -1,34 +1,26 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| import {Component, View, OnInit, OnDestroy, ElementRef} from 'angular2/core'; | ||||
| import {Directive, ElementRef} from 'angular2/core'; | ||||
| import {BrowserDomAdapter} from 'angular2/platform/browser'; | ||||
| 
 | ||||
| @Component({ | ||||
|   selector: 'sticky-sidebar', | ||||
| @Directive({ | ||||
|   selector: '[sticky-sidebar]', | ||||
|   inputs: ['scrollParent', 'scrollYOffset'] | ||||
| }) | ||||
| @View({ | ||||
|   template: ` | ||||
|     <div class="sticky-sidebar"> | ||||
|       <ng-content></ng-content> | ||||
|     </div> | ||||
|   `,
 | ||||
|   lifecycle: [OnInit, OnDestroy] | ||||
| }) | ||||
| export default class StickySidebar { | ||||
|   constructor(elementRef, adapter) { | ||||
|   constructor(elementRef, dom) { | ||||
|     this.element = elementRef.nativeElement; | ||||
|     this.adapter = adapter; | ||||
|     this.dom = dom; | ||||
| 
 | ||||
|     // initial styling
 | ||||
|     this.adapter.setStyle(this.element, 'position', 'absolute'); | ||||
|     this.adapter.setStyle(this.element, 'top', '0'); | ||||
|     this.adapter.setStyle(this.element, 'bottom', '0'); | ||||
|     this.adapter.setStyle(this.element, 'max-height', '100%'); | ||||
|     this.dom.setStyle(this.element, 'position', 'absolute'); | ||||
|     this.dom.setStyle(this.element, 'top', '0'); | ||||
|     this.dom.setStyle(this.element, 'bottom', '0'); | ||||
|     this.dom.setStyle(this.element, 'max-height', '100%'); | ||||
|   } | ||||
| 
 | ||||
|   bind() { | ||||
|     this.cancelScrollBinding = this.adapter.onAndCancel(this.scrollParent, 'scroll', () => { this.updatePosition(); }); | ||||
|     this.cancelScrollBinding = this.dom.onAndCancel(this.scrollParent, 'scroll', () => { this.updatePosition(); }); | ||||
|     this.updatePosition(); | ||||
|   } | ||||
| 
 | ||||
|  | @ -45,13 +37,13 @@ export default class StickySidebar { | |||
|   } | ||||
| 
 | ||||
|   stick() { | ||||
|     this.adapter.setStyle(this.element, 'position', 'fixed'); | ||||
|     this.adapter.setStyle(this.element, 'top', this.scrollYOffset() + 'px'); | ||||
|     this.dom.setStyle(this.element, 'position', 'fixed'); | ||||
|     this.dom.setStyle(this.element, 'top', this.scrollYOffset() + 'px'); | ||||
|   } | ||||
| 
 | ||||
|   unstick() { | ||||
|     this.adapter.setStyle(this.element, 'position', 'absolute'); | ||||
|     this.adapter.setStyle(this.element, 'top', 0); | ||||
|     this.dom.setStyle(this.element, 'position', 'absolute'); | ||||
|     this.dom.setStyle(this.element, 'top', 0); | ||||
|   } | ||||
| 
 | ||||
|   get scrollY() { | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| import { getChildDebugElement } from 'tests/helpers'; | ||||
| import { getChildDebugElementByType } from 'tests/helpers'; | ||||
| import {Component, View, provide} from 'angular2/core'; | ||||
| import {BrowserDomAdapter} from 'angular2/platform/browser'; | ||||
| 
 | ||||
|  | @ -29,7 +29,7 @@ describe('Common components', () => { | |||
|     beforeEach((done) => { | ||||
|       builder.createAsync(TestApp).then(_fixture => { | ||||
|         fixture = _fixture; | ||||
|         let debugEl = getChildDebugElement(fixture.debugElement, 'sticky-sidebar'); | ||||
|         let debugEl = getChildDebugElementByType(fixture.debugElement, StickySidebar); | ||||
|         component = debugEl.componentInstance; | ||||
|         done(); | ||||
|       }, err => done.fail(err)); | ||||
|  | @ -67,8 +67,8 @@ describe('Common components', () => { | |||
|       `<div style="padding-top: 20px">
 | ||||
|         <div style="height: 20px; position: fixed; top: 0;"> </div> | ||||
|         <div style="position: relative"> | ||||
|           <sticky-sidebar [scrollParent]="scrollParent" [scrollYOffset]="options.scrollYOffset"> | ||||
|           </sticky-sidebar> | ||||
|           <div sticky-sidebar [scrollParent]="scrollParent" [scrollYOffset]="options.scrollYOffset"> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div>` | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,8 +1,8 @@ | |||
| <div class="redoc-wrap"> | ||||
|   <sticky-sidebar [scrollParent]="scrollParent" [scrollYOffset]="options.scrollYOffset"> | ||||
|   <div sticky-sidebar [scrollParent]="scrollParent" [scrollYOffset]="options.scrollYOffset"> | ||||
|     <api-logo> </api-logo> | ||||
|     <side-menu> </side-menu> | ||||
|   </sticky-sidebar> | ||||
|   </div> | ||||
|   <div id="api-content"> | ||||
|     <api-info> </api-info> | ||||
|     <methods-list> </methods-list> | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ api-logo { | |||
|   text-align: center; | ||||
| } | ||||
| 
 | ||||
| sticky-sidebar { | ||||
| [sticky-sidebar] { | ||||
|   width: $side-bar-width; | ||||
|   overflow-y: auto; | ||||
|   overflow-x: hidden; | ||||
|  |  | |||
|  | @ -10,6 +10,13 @@ export function getChildDebugElement(parent, tagName) { | |||
|   }); | ||||
| } | ||||
| 
 | ||||
| /** Gets a child DebugElement by Component Type. */ | ||||
| export function getChildDebugElementByType(parent, type) { | ||||
|   return parent.query(debugEl => { | ||||
|     return debugEl.componentInstance instanceof type; | ||||
|   }); | ||||
| } | ||||
| 
 | ||||
| /** Gets a child DebugElements by tag name. */ | ||||
| export function getChildDebugElementAll(parent, tagName) { | ||||
|   return parent.queryAll(debugEl => { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user