mirror of https://github.com/abpframework/abp.git
6 changed files with 188 additions and 5 deletions
@ -0,0 +1,15 @@ |
|||
.error { |
|||
position: fixed; |
|||
top: 0; |
|||
background-color: #fff; |
|||
width: 100vw; |
|||
height: 100vh; |
|||
z-index: 999999; |
|||
} |
|||
|
|||
.centered { |
|||
position: fixed; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
} |
|||
@ -0,0 +1,33 @@ |
|||
import { Component, OnInit } from '@angular/core'; |
|||
import { Store } from '@ngxs/store'; |
|||
|
|||
@Component({ |
|||
selector: 'abp-error-500', |
|||
template: ` |
|||
<div class="error"> |
|||
<div class="row centered"> |
|||
<div class="col-md-12"> |
|||
<div class="error-template"> |
|||
<h1> |
|||
Oops! |
|||
</h1> |
|||
<div class="error-details"> |
|||
Sorry, an error has occured. |
|||
</div> |
|||
<div class="error-actions"> |
|||
<a routerLink="/" class="btn btn-primary btn-md mt-2" |
|||
><span class="glyphicon glyphicon-home"></span> Take Me Home |
|||
</a> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
`,
|
|||
styleUrls: ['error-500.component.scss'], |
|||
}) |
|||
export class Error500Component implements OnInit { |
|||
constructor(private store: Store) {} |
|||
|
|||
ngOnInit(): void {} |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
.abp-loader-bar { |
|||
left: 0; |
|||
opacity: 0; |
|||
position: fixed; |
|||
top: 0; |
|||
transition: opacity 0.4s linear 0.4s; |
|||
z-index: 99999; |
|||
|
|||
&.is-loading { |
|||
opacity: 1; |
|||
transition: none; |
|||
} |
|||
|
|||
.abp-progress { |
|||
background: #77b6ff; |
|||
box-shadow: 0 0 10px rgba(119, 182, 255, 0.7); |
|||
height: 2px; |
|||
left: 0; |
|||
position: fixed; |
|||
top: 0; |
|||
transition: width 0.4s ease; |
|||
} |
|||
} |
|||
@ -0,0 +1,73 @@ |
|||
import { Component, OnInit, Input } from '@angular/core'; |
|||
import { Actions, ofActionSuccessful } from '@ngxs/store'; |
|||
import { LoaderStart, LoaderStop } from '@abp/ng.core'; |
|||
import { filter } from 'rxjs/operators'; |
|||
|
|||
@Component({ |
|||
selector: 'abp-loader-bar', |
|||
template: ` |
|||
<div id="abp-loader-bar" [ngClass]="containerClass" [class.is-loading]="isLoading"> |
|||
<div [ngClass]="progressClass" [style.width.vw]="progressLevel"></div> |
|||
</div> |
|||
`,
|
|||
styleUrls: ['./loader-bar.component.scss'], |
|||
}) |
|||
export class LoaderBarComponent { |
|||
@Input() |
|||
containerClass: string = 'abp-loader-bar'; |
|||
|
|||
@Input() |
|||
progressClass: string = 'abp-progress'; |
|||
|
|||
@Input() |
|||
isLoading: boolean = false; |
|||
|
|||
@Input() |
|||
filter = (action: LoaderStart | LoaderStop) => action.payload.url.indexOf('openid-configuration') < 0; |
|||
|
|||
progressLevel: number = 0; |
|||
|
|||
interval: any; |
|||
|
|||
constructor(private actions: Actions) { |
|||
actions |
|||
.pipe( |
|||
ofActionSuccessful(LoaderStart, LoaderStop), |
|||
filter(this.filter), |
|||
) |
|||
.subscribe(action => { |
|||
if (action instanceof LoaderStart) { |
|||
this.startLoading(); |
|||
} else { |
|||
this.stopLoading(); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
startLoading() { |
|||
this.isLoading = true; |
|||
const interval = setInterval(() => { |
|||
if (this.progressLevel < 75) { |
|||
this.progressLevel += Math.random() * 10; |
|||
} else if (this.progressLevel < 90) { |
|||
this.progressLevel += 0.4; |
|||
} else if (this.progressLevel < 100) { |
|||
this.progressLevel += 0.1; |
|||
} else { |
|||
clearInterval(interval); |
|||
} |
|||
}, 300); |
|||
|
|||
this.interval = interval; |
|||
} |
|||
|
|||
stopLoading() { |
|||
clearInterval(this.interval); |
|||
this.progressLevel = 100; |
|||
this.isLoading = false; |
|||
|
|||
setTimeout(() => { |
|||
this.progressLevel = 0; |
|||
}, 800); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue