mirror of https://github.com/abpframework/abp.git
2 changed files with 113 additions and 0 deletions
@ -0,0 +1,39 @@ |
|||
import { Component, OnInit } from '@angular/core'; |
|||
|
|||
@Component({ |
|||
selector: 'abp-loading', |
|||
template: ` |
|||
<div class="abp-loading"> |
|||
<i class="fa fa-spinner fa-pulse abp-spinner"></i> |
|||
</div> |
|||
`,
|
|||
styles: [ |
|||
` |
|||
.abp-loading { |
|||
background: rgba(0, 0, 0, 0.3); |
|||
position: absolute; |
|||
width: 100%; |
|||
height: 100%; |
|||
top: 0; |
|||
left: 0; |
|||
z-index: 1040; |
|||
} |
|||
|
|||
.abp-loading .abp-spinner { |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
-moz-transform: translateX(-50%) translateY(-50%); |
|||
-o-transform: translateX(-50%) translateY(-50%); |
|||
-ms-transform: translateX(-50%) translateY(-50%); |
|||
-webkit-transform: translateX(-50%) translateY(-50%); |
|||
transform: translateX(-50%) translateY(-50%); |
|||
} |
|||
`,
|
|||
], |
|||
}) |
|||
export class LoadingComponent implements OnInit { |
|||
constructor() {} |
|||
|
|||
ngOnInit() {} |
|||
} |
|||
@ -0,0 +1,74 @@ |
|||
import { |
|||
Directive, |
|||
ElementRef, |
|||
AfterViewInit, |
|||
ViewContainerRef, |
|||
ComponentFactoryResolver, |
|||
Input, |
|||
Injector, |
|||
ComponentRef, |
|||
ComponentFactory, |
|||
HostBinding, |
|||
EmbeddedViewRef, |
|||
Renderer2, |
|||
OnInit, |
|||
} from '@angular/core'; |
|||
import { LoadingComponent } from '../components/loading/loading.component'; |
|||
|
|||
@Directive({ selector: '[abpLoading]' }) |
|||
export class LoadingDirective implements OnInit { |
|||
private _loading: boolean; |
|||
|
|||
@HostBinding('style.position') |
|||
position = 'relative'; |
|||
|
|||
@Input('abpLoading') |
|||
get loading(): boolean { |
|||
return this._loading; |
|||
} |
|||
|
|||
set loading(newValue: boolean) { |
|||
setTimeout(() => { |
|||
if (!this.componentRef) { |
|||
this.componentRef = this.cdRes |
|||
.resolveComponentFactory(LoadingComponent) |
|||
.create(this.injector); |
|||
} |
|||
|
|||
if (newValue && !this.rootNode) { |
|||
this.rootNode = (this.componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0]; |
|||
this.targetElement.appendChild(this.rootNode); |
|||
} else { |
|||
this.renderer.removeChild(this.rootNode.parentElement, this.rootNode); |
|||
this.rootNode = null; |
|||
} |
|||
|
|||
this._loading = newValue; |
|||
}, 0); |
|||
} |
|||
|
|||
@Input('abpLoadingTargetElement') |
|||
targetElement: HTMLElement; |
|||
|
|||
componentRef: ComponentRef<LoadingComponent>; |
|||
rootNode: HTMLDivElement; |
|||
|
|||
constructor( |
|||
private elRef: ElementRef<HTMLElement>, |
|||
private vcRef: ViewContainerRef, |
|||
private cdRes: ComponentFactoryResolver, |
|||
private injector: Injector, |
|||
private renderer: Renderer2, |
|||
) {} |
|||
|
|||
ngOnInit() { |
|||
if (!this.targetElement) { |
|||
const { offsetHeight, offsetWidth } = this.elRef.nativeElement; |
|||
if (!offsetHeight && !offsetWidth && this.elRef.nativeElement.children.length) { |
|||
this.targetElement = this.elRef.nativeElement.children[0] as HTMLElement; |
|||
} else { |
|||
this.targetElement = this.elRef.nativeElement; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue