@universis/common
Version:
Universis - common directives and services
162 lines (161 loc) • 16.5 kB
JavaScript
import { Injectable, Component, Input } from '@angular/core';
import { Router } from '@angular/router';
import { HttpErrorResponse } from '@angular/common/http';
import { BsModalService, BsModalRef } from 'ngx-bootstrap/modal';
import { TranslateService } from '@ngx-translate/core';
export class ErrorModalComponent {
constructor(_translateService, bsModalRef, _router) {
this._translateService = _translateService;
this.bsModalRef = bsModalRef;
this._router = _router;
this.continueLink = '/';
this.iconClass = 'far fa-frown';
this.buttonText = 'Error.Continue';
this.language = this._translateService.currentLang;
}
hide() {
this.bsModalRef.hide();
if (this.continueLink == null) {
return Promise.resolve();
}
if (this.continueLink === '.') {
return Promise.resolve();
}
return this._router.navigate([this.continueLink]);
}
ngOnInit() {
// get last error
const error = this.error;
// check error.code property
if (error && typeof error.code === 'string') {
this.code = error.code;
}
else if (error && typeof (error.status || error.statusCode) === 'number') {
this.code = `E${error.status || error.statusCode}`;
}
else {
this.code = 'E500';
}
if (error && typeof error.continue === 'string') {
this.continueLink = error.continue;
}
this._translateService.get(this.code).subscribe((translation) => {
if (translation) {
this.title = translation.title;
this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message)
? this.error.error.message : translation.message;
}
else {
this._translateService.get('E500').subscribe((result) => {
this.title = result.title;
this.message = (this.error instanceof HttpErrorResponse && this.error.error && this.error.error.message)
? this.error.error.message : translation.message;
});
}
});
}
}
ErrorModalComponent.decorators = [
{ type: Component, args: [{
selector: 'universis-error-modal',
template: `
<div class="modal-header text-center">
<button type="button" class="close pull-right" aria-label="Close" (click)="hide()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body mt-0 mb-0 text-center">
<div class="text-center">
<div class="icon-circle icon-circle-danger">
<i class="fa fa-times"></i>
</div>
<div class="font-2xl font-weight-bold mt-2">
{{title}}
</div>
<p class="mt-2">
{{message}}
</p>
</div>
</div>
<div class="modal-footer">
<button [lang]="language" type="button" (click)="hide()"
class="btn btn-gray-100 btn-ok text-uppercase" [translate]="buttonText"></button>
</div>
`,
styles: [`
.btn-ok {
font-size: 16px;
}
`]
}] }
];
/** @nocollapse */
ErrorModalComponent.ctorParameters = () => [
{ type: TranslateService },
{ type: BsModalRef },
{ type: Router }
];
ErrorModalComponent.propDecorators = {
continueLink: [{ type: Input }],
message: [{ type: Input }],
title: [{ type: Input }],
iconClass: [{ type: Input }],
buttonText: [{ type: Input }],
error: [{ type: Input }]
};
export class ErrorService {
constructor(_router, _modalService) {
this._router = _router;
this._modalService = _modalService;
//
}
/**
* @param {*} error
* @returns {Promise<boolean>}
*/
navigateToError(error) {
this.setLastError(error);
// if error is an instance of HttpErrorResponse
if (error instanceof HttpErrorResponse) {
if (error && error.error && error.error.statusCode) {
return this._router.navigate(['/error', error.error.statusCode]);
}
// navigate to specific error e.g. /error/401
// this will allow application to override specific error pages and show custom errors
return this._router.navigate(['/error', error.status]);
}
// otherwise show default error component
return this._router.navigate(['/error']);
}
showError(error, options) {
const initialState = Object.assign({
error: error
}, options);
this._modalService.show(ErrorModalComponent, { initialState });
}
/**
* Sets last application error
* @param {*=} err
* @return ErrorService
*/
setLastError(err) {
this._lastError = err;
return this;
}
/**
* Gets last application error
* @return {any}
*/
getLastError() {
return this._lastError;
}
}
ErrorService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ErrorService.ctorParameters = () => [
{ type: Router },
{ type: BsModalService }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1bml2ZXJzaXMvY29tbW9uLyIsInNvdXJjZXMiOlsiZXJyb3IvZXJyb3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUF3Q3JELE1BQU07SUFXSixZQUFzQixpQkFBbUMsRUFDcEMsVUFBc0IsRUFDckIsT0FBZTtRQUZmLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDcEMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNyQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBVDVCLGlCQUFZLEdBQUcsR0FBRyxDQUFDO1FBR25CLGNBQVMsR0FBRyxjQUFjLENBQUM7UUFDM0IsZUFBVSxHQUFHLGdCQUFnQixDQUFDO1FBTXJDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQztJQUNyRCxDQUFDO0lBRUgsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksRUFBRTtZQUM3QixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxHQUFHLEVBQUU7WUFDN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUks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LFlBQVksaUJBQWlCLEVBQUU7WUFDdEMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtnQkFDbEQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7YUFDbEU7WUFDRCw2Q0FBNkM7WUFDN0Msc0ZBQXNGO1lBQ3RGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDeEQ7UUFDRCx5Q0FBeUM7UUFDekMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFVLEVBQUUsT0FBK0I7UUFDbkQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNqQyxLQUFLLEVBQUUsS0FBSztTQUNiLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxZQUFZLENBQUMsR0FBUztRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztRQUN0QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7OztZQW5ERixVQUFVOzs7O1lBeEdGLE1BQU07WUFFTixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgQ29tcG9uZW50LCBPbkluaXQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UsIEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFNob3dFcnJvck1vZGFsT3B0aW9ucyB7XG4gIGNvbnRpbnVlTGluaz86IHN0cmluZztcbiAgYnV0dG9uVGV4dD86IHN0cmluZztcbiAgaWNvbkNsYXNzPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KCB7XG4gIHNlbGVjdG9yOiAndW5pdmVyc2lzLWVycm9yLW1vZGFsJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIHRleHQtY2VudGVyXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlIHB1bGwtcmlnaHRcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwiaGlkZSgpXCI+XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSBtdC0wIG1iLTAgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY2lyY2xlIGljb24tY2lyY2xlLWRhbmdlclwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LTJ4bCBmb250LXdlaWdodC1ib2xkIG10LTJcIj5cbiAgICAgICAgICAgICAge3t0aXRsZX19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMlwiPlxuICAgICAgICAgICAgIHt7bWVzc2FnZX19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICAgIDxidXR0b24gW2xhbmddPVwibGFuZ3VhZ2VcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImhpZGUoKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1ncmF5LTEwMCBidG4tb2sgdGV4dC11cHBlcmNhc2VcIiBbdHJhbnNsYXRlXT1cImJ1dHRvblRleHRcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYCwgc3R5bGVzOiBbYFxuICAuYnRuLW9rIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gIH1cbiAgYF1cbiAgIH0pXG5cbiAgZXhwb3J0IGNsYXNzIEVycm9yTW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgcHVibGljIGNvZGU7XG4gICAgcHVibGljIGxhbmd1YWdlO1xuICAgIEBJbnB1dCgpIGNvbnRpbnVlTGluayA9ICcvJztcbiAgICBASW5wdXQoKSBtZXNzYWdlOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgICBASW5wdXQoKSBpY29uQ2xhc3MgPSAnZmFyIGZhLWZyb3duJztcbiAgICBASW5wdXQoKSBidXR0b25UZXh0ID0gJ0Vycm9yLkNvbnRpbnVlJztcbiAgICBASW5wdXQoKSBlcnJvcjogYW55O1xuXG4gICAgY29uc3RydWN0b3IgKCBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgICAgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYsXG4gICAgICAgICAgICAgICAgICBwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciApIHtcbiAgICAgIHRoaXMubGFuZ3VhZ2UgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nO1xuICAgIH1cblxuICBoaWRlKCkge1xuICAgICAgdGhpcy5ic01vZGFsUmVmLmhpZGUoKTtcbiAgICAgIGlmICh0aGlzLmNvbnRpbnVlTGluayA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRpbnVlTGluayA9PT0gJy4nKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW3RoaXMuY29udGludWVMaW5rXSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG5cbiAgICAgIC8vIGdldCBsYXN0IGVycm9yXG4gICAgICBjb25zdCBlcnJvciA9IHRoaXMuZXJyb3I7XG4gICAgICAvLyBjaGVjayBlcnJvci5jb2RlIHByb3BlcnR5XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY29kZSA9IGVycm9yLmNvZGU7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yICYmIHR5cGVvZiAoZXJyb3Iuc3RhdHVzIHx8IGVycm9yLnN0YXR1c0NvZGUpID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLmNvZGUgPSBgRSR7ZXJyb3Iuc3RhdHVzIHx8IGVycm9yLnN0YXR1c0NvZGV9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFNTAwJztcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IuY29udGludWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY29udGludWVMaW5rID0gZXJyb3IuY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuZ2V0KHRoaXMuY29kZSkuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbikgPT4ge1xuICAgICAgICBpZiAodHJhbnNsYXRpb24pIHtcbiAgICAgICAgICB0aGlzLnRpdGxlID0gdHJhbnNsYXRpb24udGl0bGU7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgID8gdGhpcy5lcnJvci5lcnJvci5tZXNzYWdlIDogdHJhbnNsYXRpb24ubWVzc2FnZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmdldCgnRTUwMCcpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gcmVzdWx0LnRpdGxlO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gKHRoaXMuZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiB0aGlzLmVycm9yLmVycm9yICYmIHRoaXMuZXJyb3IuZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgPyB0aGlzLmVycm9yLmVycm9yLm1lc3NhZ2UgOiB0cmFuc2xhdGlvbi5tZXNzYWdlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRXJyb3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9sYXN0RXJyb3I6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlciwgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSkge1xuICAgIC8vXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBlcnJvclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAgICovXG4gIG5hdmlnYXRlVG9FcnJvcihlcnJvcikge1xuICAgIHRoaXMuc2V0TGFzdEVycm9yKGVycm9yKTtcbiAgICAvLyBpZiBlcnJvciBpcyBhbiBpbnN0YW5jZSBvZiBIdHRwRXJyb3JSZXNwb25zZVxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICBpZiAoZXJyb3IgJiYgZXJyb3IuZXJyb3IgJiYgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFsnL2Vycm9yJywgZXJyb3IuZXJyb3Iuc3RhdHVzQ29kZV0pO1xuICAgICAgfVxuICAgICAgLy8gbmF2aWdhdGUgdG8gc3BlY2lmaWMgZXJyb3IgZS5nLiAvZXJyb3IvNDAxXG4gICAgICAvLyB0aGlzIHdpbGwgYWxsb3cgYXBwbGljYXRpb24gdG8gb3ZlcnJpZGUgc3BlY2lmaWMgZXJyb3IgcGFnZXMgYW5kIHNob3cgY3VzdG9tIGVycm9yc1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShbJy9lcnJvcicsIGVycm9yLnN0YXR1c10pO1xuICAgIH1cbiAgICAvLyBvdGhlcndpc2Ugc2hvdyBkZWZhdWx0IGVycm9yIGNvbXBvbmVudFxuICAgIHJldHVybiB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoWycvZXJyb3InXSk7XG4gIH1cblxuICBzaG93RXJyb3IoZXJyb3I6IGFueSwgb3B0aW9ucz86IFNob3dFcnJvck1vZGFsT3B0aW9ucykge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZXJyb3I6IGVycm9yXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgdGhpcy5fbW9kYWxTZXJ2aWNlLnNob3coRXJyb3JNb2RhbENvbXBvbmVudCwge2luaXRpYWxTdGF0ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbGFzdCBhcHBsaWNhdGlvbiBlcnJvclxuICAgKiBAcGFyYW0geyo9fSBlcnJcbiAgICogQHJldHVybiBFcnJvclNlcnZpY2VcbiAgICovXG4gIHNldExhc3RFcnJvcihlcnI/OiBhbnkpIHtcbiAgICB0aGlzLl9sYXN0RXJyb3IgPSBlcnI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBsYXN0IGFwcGxpY2F0aW9uIGVycm9yXG4gICAqIEByZXR1cm4ge2FueX1cbiAgICovXG4gIGdldExhc3RFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdEVycm9yO1xuICB9XG5cbn1cbiJdfQ==