@dbg-riskit/angular-error 12.3.0 → 9999.9999.9999-rc.12148

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dbg-riskit-angular-error.d.ts +1 -2
  2. package/docs/README.md +1 -11
  3. package/esm2020/dbg-riskit-angular-error.mjs +5 -0
  4. package/esm2020/lib/error.collector.mjs +65 -0
  5. package/esm2020/lib/error.menu.component.mjs +205 -0
  6. package/esm2020/lib/error.message.component.mjs +119 -0
  7. package/{esm2015/lib/error.message.wrapper.js → esm2020/lib/error.message.wrapper.mjs} +1 -1
  8. package/esm2020/lib/error.module.mjs +47 -0
  9. package/{esm2015/lib/rxjs.utils.js → esm2020/lib/rxjs.utils.mjs} +0 -0
  10. package/esm2020/public_api.mjs +5 -0
  11. package/fesm2015/dbg-riskit-angular-error.mjs +468 -0
  12. package/fesm2015/dbg-riskit-angular-error.mjs.map +1 -0
  13. package/fesm2020/dbg-riskit-angular-error.mjs +462 -0
  14. package/fesm2020/dbg-riskit-angular-error.mjs.map +1 -0
  15. package/lib/error.collector.d.ts +3 -0
  16. package/lib/error.menu.component.d.ts +3 -0
  17. package/lib/error.message.component.d.ts +3 -0
  18. package/lib/error.module.d.ts +8 -0
  19. package/package.json +26 -14
  20. package/public_api.d.ts +1 -0
  21. package/bundles/dbg-riskit-angular-error.umd.js +0 -767
  22. package/bundles/dbg-riskit-angular-error.umd.js.map +0 -1
  23. package/dbg-riskit-angular-error.metadata.json +0 -1
  24. package/esm2015/dbg-riskit-angular-error.js +0 -7
  25. package/esm2015/lib/error.collector.js +0 -60
  26. package/esm2015/lib/error.menu.component.js +0 -185
  27. package/esm2015/lib/error.message.component.js +0 -84
  28. package/esm2015/lib/error.module.js +0 -31
  29. package/esm2015/public_api.js +0 -4
  30. package/fesm2015/dbg-riskit-angular-error.js +0 -393
  31. package/fesm2015/dbg-riskit-angular-error.js.map +0 -1
@@ -0,0 +1,468 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ErrorHandler, Injectable, Optional, Inject, Component, ChangeDetectionStrategy, Input, EventEmitter, ViewChildren, NgModule } from '@angular/core';
3
+ import { AUTH_PROVIDER, DATE_FORMAT } from '@dbg-riskit/angular-common';
4
+ import { toString, ErrorType } from '@dbg-riskit/common';
5
+ import { ReplaySubject, EMPTY, Subject, merge, timer } from 'rxjs';
6
+ import { trigger, state, style, transition, animate, keyframes } from '@angular/animations';
7
+ import { BaseComponent, CommonViewModule } from '@dbg-riskit/angular-view';
8
+ import { filter, takeUntil, map, catchError, defaultIfEmpty } from 'rxjs/operators';
9
+ import * as i1 from '@angular/material/card';
10
+ import * as i2 from '@angular/material/icon';
11
+ import * as i3 from '@angular/common';
12
+ import { CommonModule } from '@angular/common';
13
+ import * as i2$1 from '@angular/material/button';
14
+ import * as i4 from '@angular/material/menu';
15
+
16
+ function toErrorMessage(err) {
17
+ let errorMessage;
18
+ if ('errorType' in err) {
19
+ errorMessage = err;
20
+ }
21
+ else {
22
+ if ('message' in err) {
23
+ err = err.message || toString(err);
24
+ }
25
+ else {
26
+ err = toString(err);
27
+ }
28
+ errorMessage = {
29
+ message: err,
30
+ status: 0,
31
+ errorType: ErrorType.ERROR
32
+ };
33
+ }
34
+ return errorMessage;
35
+ }
36
+ class ErrorCollectorService extends ErrorHandler {
37
+ constructor(authProvider) {
38
+ super();
39
+ this._errorObservable = new ReplaySubject(10);
40
+ if (authProvider) {
41
+ authProvider.loggedInStream.subscribe((auth) => {
42
+ this._errorObservable = new ReplaySubject(10);
43
+ });
44
+ }
45
+ }
46
+ error(err) {
47
+ this._errorObservable.next(err);
48
+ }
49
+ get errorStream() {
50
+ return this._errorObservable.asObservable();
51
+ }
52
+ handleError(err) {
53
+ try {
54
+ super.handleError(err);
55
+ }
56
+ finally {
57
+ this.error(toErrorMessage(err));
58
+ }
59
+ }
60
+ handleStreamError(err) {
61
+ this.handleError(err);
62
+ return EMPTY;
63
+ }
64
+ }
65
+ ErrorCollectorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorCollectorService, deps: [{ token: AUTH_PROVIDER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
66
+ ErrorCollectorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorCollectorService });
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorCollectorService, decorators: [{
68
+ type: Injectable
69
+ }], ctorParameters: function () {
70
+ return [{ type: undefined, decorators: [{
71
+ type: Optional
72
+ }, {
73
+ type: Inject,
74
+ args: [AUTH_PROVIDER]
75
+ }] }];
76
+ } });
77
+
78
+ class ErrorMessageComponent {
79
+ constructor(dateFormat, changeDetectorRef) {
80
+ this.dateFormat = dateFormat;
81
+ this.changeDetectorRef = changeDetectorRef;
82
+ this.readState = null;
83
+ this.isLast = false;
84
+ }
85
+ animate() {
86
+ if (this.error != null && !this.error.read && this.readState !== 'read') {
87
+ setTimeout(() => {
88
+ this.readState = 'read';
89
+ this.changeDetectorRef.markForCheck();
90
+ });
91
+ }
92
+ }
93
+ markRead(event) {
94
+ if (this.error != null && event.toState === 'read') {
95
+ this.error.markRead();
96
+ this.changeDetectorRef.markForCheck();
97
+ }
98
+ }
99
+ }
100
+ ErrorMessageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorMessageComponent, deps: [{ token: DATE_FORMAT }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
101
+ ErrorMessageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: ErrorMessageComponent, selector: "risk-error-message", inputs: { error: "error", isLast: "isLast" }, host: { properties: { "class.risk-error-message": "true" } }, ngImport: i0, template: "<mat-card [class.risk-error-message-last]=\"isLast\" [@readState]=\"readState\" (@readState.done)=\"markRead($event)\">\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n <mat-card-title *ngIf=\"error?.type.isNetworkError()\">Network error</mat-card-title>\n <mat-card-title *ngIf=\"error?.type.isRequestError()\">API error</mat-card-title>\n <mat-card-title *ngIf=\"error?.type.isAuthError()\">Authorization error</mat-card-title>\n <mat-card-title\n *ngIf=\"!error?.type.isNetworkError() && !error?.type.isRequestError() && !error?.type.isAuthError()\">\n General error\n </mat-card-title>\n <mat-card-subtitle>{{error?.date | date:dateFormat}}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n <p *ngIf=\"error?.statusCode\" class=\"risk-error-message-code\">Error code: {{error?.statusCode}}</p>\n <p>\n {{error?.message}}\n </p>\n </mat-card-content>\n</mat-card>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host .mat-card{margin:0 10px 7px}:host .mat-card.risk-error-message-last{margin-bottom:0}:host .mat-card .mat-card-subtitle{margin-bottom:5px}:host .mat-card p{margin:0}:host .mat-card p.risk-error-message-code{position:absolute;bottom:10px;right:10px}:host .mat-card p.risk-error-message-code+p:last-child{margin-bottom:3px}\n"], components: [{ type: i1.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i1.MatCardHeader, selector: "mat-card-header" }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1.MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i1.MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { type: i1.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }], pipes: { "date": i3.DatePipe }, animations: [
102
+ trigger('readState', [
103
+ state('read', style({ background: 'transparent' })),
104
+ transition(':enter', [
105
+ style({
106
+ height: 0,
107
+ transform: 'scale(0)'
108
+ }),
109
+ animate('200ms ease-in', style({
110
+ height: '*',
111
+ transform: 'scale(1)'
112
+ }))
113
+ ]),
114
+ transition('* => read', [
115
+ style({
116
+ background: 'transparent'
117
+ }),
118
+ animate('1500ms', keyframes([
119
+ style({
120
+ background: 'rgba(204, 51, 51, .5)',
121
+ offset: 0.25
122
+ }),
123
+ style({
124
+ background: 'transparent',
125
+ offset: 0.5
126
+ }),
127
+ style({
128
+ background: 'rgba(204, 51, 51, .5)',
129
+ offset: 0.75
130
+ }),
131
+ style({
132
+ background: 'transparent',
133
+ offset: 1
134
+ })
135
+ ]))
136
+ ])
137
+ ])
138
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorMessageComponent, decorators: [{
140
+ type: Component,
141
+ args: [{ selector: 'risk-error-message', animations: [
142
+ trigger('readState', [
143
+ state('read', style({ background: 'transparent' })),
144
+ transition(':enter', [
145
+ style({
146
+ height: 0,
147
+ transform: 'scale(0)'
148
+ }),
149
+ animate('200ms ease-in', style({
150
+ height: '*',
151
+ transform: 'scale(1)'
152
+ }))
153
+ ]),
154
+ transition('* => read', [
155
+ style({
156
+ background: 'transparent'
157
+ }),
158
+ animate('1500ms', keyframes([
159
+ style({
160
+ background: 'rgba(204, 51, 51, .5)',
161
+ offset: 0.25
162
+ }),
163
+ style({
164
+ background: 'transparent',
165
+ offset: 0.5
166
+ }),
167
+ style({
168
+ background: 'rgba(204, 51, 51, .5)',
169
+ offset: 0.75
170
+ }),
171
+ style({
172
+ background: 'transparent',
173
+ offset: 1
174
+ })
175
+ ]))
176
+ ])
177
+ ])
178
+ ], host: {
179
+ '[class.risk-error-message]': 'true'
180
+ }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<mat-card [class.risk-error-message-last]=\"isLast\" [@readState]=\"readState\" (@readState.done)=\"markRead($event)\">\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n <mat-card-title *ngIf=\"error?.type.isNetworkError()\">Network error</mat-card-title>\n <mat-card-title *ngIf=\"error?.type.isRequestError()\">API error</mat-card-title>\n <mat-card-title *ngIf=\"error?.type.isAuthError()\">Authorization error</mat-card-title>\n <mat-card-title\n *ngIf=\"!error?.type.isNetworkError() && !error?.type.isRequestError() && !error?.type.isAuthError()\">\n General error\n </mat-card-title>\n <mat-card-subtitle>{{error?.date | date:dateFormat}}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n <p *ngIf=\"error?.statusCode\" class=\"risk-error-message-code\">Error code: {{error?.statusCode}}</p>\n <p>\n {{error?.message}}\n </p>\n </mat-card-content>\n</mat-card>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host .mat-card{margin:0 10px 7px}:host .mat-card.risk-error-message-last{margin-bottom:0}:host .mat-card .mat-card-subtitle{margin-bottom:5px}:host .mat-card p{margin:0}:host .mat-card p.risk-error-message-code{position:absolute;bottom:10px;right:10px}:host .mat-card p.risk-error-message-code+p:last-child{margin-bottom:3px}\n"] }]
181
+ }], ctorParameters: function () {
182
+ return [{ type: undefined, decorators: [{
183
+ type: Inject,
184
+ args: [DATE_FORMAT]
185
+ }] }, { type: i0.ChangeDetectorRef }];
186
+ }, propDecorators: { error: [{
187
+ type: Input
188
+ }], isLast: [{
189
+ type: Input
190
+ }] } });
191
+
192
+ class ErrorMessageWrapper {
193
+ constructor(error) {
194
+ this._date = new Date();
195
+ this._read = false;
196
+ this.readStateChanged = new EventEmitter();
197
+ this._error = error;
198
+ }
199
+ get message() {
200
+ return this._error.message;
201
+ }
202
+ get type() {
203
+ return this._error.errorType;
204
+ }
205
+ get statusCode() {
206
+ return this._error.status;
207
+ }
208
+ get date() {
209
+ return this._date;
210
+ }
211
+ get read() {
212
+ return this._read;
213
+ }
214
+ markRead() {
215
+ if (!this._read) {
216
+ this._read = true;
217
+ this.readStateChanged.emit(this._read);
218
+ this.readStateChanged.complete();
219
+ }
220
+ }
221
+ }
222
+
223
+ const JIGGLE_ANIMATION = animate('1s ease-in', keyframes([
224
+ style({
225
+ transform: 'scale(0.8) translateX(-1px) rotate(0)',
226
+ offset: 0.1
227
+ }),
228
+ style({
229
+ transform: 'scale(1) translateX(2px) rotate(4deg)',
230
+ offset: 0.2
231
+ }),
232
+ style({
233
+ transform: 'scale(1.2) translateX(-4px) rotate(0)',
234
+ offset: 0.3
235
+ }),
236
+ style({
237
+ transform: 'scale(1.5) translateX(4px) rotate(0)',
238
+ offset: 0.4
239
+ }),
240
+ style({
241
+ transform: 'scale(1.5) translateX(-4px) rotate(-8deg)',
242
+ offset: 0.5
243
+ }),
244
+ style({
245
+ transform: 'scale(1.5) translateX(4px) rotate(0)',
246
+ offset: 0.6
247
+ }),
248
+ style({
249
+ transform: 'scale(1.2) translateX(-4px) rotate(0)',
250
+ offset: 0.7
251
+ }),
252
+ style({
253
+ transform: 'scale(1) translateX(2px) rotate(4deg)',
254
+ offset: 0.8
255
+ }),
256
+ style({
257
+ transform: 'scale(1) translateX(-1px) rotate(0)',
258
+ offset: 0.9
259
+ })
260
+ ]));
261
+ class ErrorComponent extends BaseComponent {
262
+ constructor(errorCollector, authProvider, changeDetectorRef) {
263
+ super();
264
+ this.errorCollector = errorCollector;
265
+ this.authProvider = authProvider;
266
+ this.changeDetectorRef = changeDetectorRef;
267
+ this.state = null;
268
+ this._errors = [];
269
+ this._menuState = new Subject();
270
+ }
271
+ ngOnInit() {
272
+ // Init Jiggle animation loop
273
+ this.initAnimation();
274
+ // Subscribe to error stream
275
+ this.subscribeToErrors();
276
+ // Once opened animate messages and set as read after animation
277
+ this._menuState.pipe(filter((opened) => opened), takeUntil(this.destroyed)).subscribe(() => this.animateOnMenuOpened());
278
+ // Refresh on "logged-in" state changes
279
+ if (this.authProvider) {
280
+ this.authProvider.loggedInStream.pipe(takeUntil(this.destroyed)).subscribe((auth) => this.loggedInChanged(auth));
281
+ }
282
+ }
283
+ animateOnMenuOpened() {
284
+ const animateMessages = () => this.errorMessages.forEach((message) => message.animate());
285
+ animateMessages();
286
+ this.errorMessages.changes.pipe(takeUntil(merge(this.destroyed, this._menuState))).subscribe(() => animateMessages());
287
+ }
288
+ loggedInChanged(auth) {
289
+ // Subscribe to errors once logged in again
290
+ if (auth) {
291
+ this.subscribeToErrors();
292
+ }
293
+ else {
294
+ while (this._errors.length > 0) {
295
+ this._errors.pop();
296
+ }
297
+ }
298
+ this.changeDetectorRef.markForCheck();
299
+ }
300
+ subscribeToErrors() {
301
+ let until = this.destroyed;
302
+ // Stop receiving errors once user was logged out
303
+ if (this.authProvider) {
304
+ until = merge(until, this.authProvider.loggedInStream.pipe(filter((auth) => !auth), map(() => undefined)));
305
+ }
306
+ this.errorCollector.errorStream.pipe(takeUntil(until)).subscribe((error) => this.errorReceived(error, until));
307
+ }
308
+ errorReceived(error, until) {
309
+ const errorMessageWrapper = new ErrorMessageWrapper(error);
310
+ // Subscribe for state changes
311
+ errorMessageWrapper.readStateChanged.pipe(takeUntil(until)).subscribe(() => this.changeDetectorRef.detectChanges());
312
+ this._errors.unshift(errorMessageWrapper);
313
+ while (this._errors.length > 10) {
314
+ this._errors.pop();
315
+ }
316
+ this.changeDetectorRef.markForCheck();
317
+ }
318
+ get color() {
319
+ if (this.errors.some((error) => !error.read)) {
320
+ return 'warn';
321
+ }
322
+ return null;
323
+ }
324
+ menuOpened() {
325
+ this._menuState.next(true);
326
+ }
327
+ menuClosed() {
328
+ this._menuState.next(false);
329
+ }
330
+ get errors() {
331
+ return this._errors;
332
+ }
333
+ // <editor-fold desc="Animation control" defaultstate="collapsed">
334
+ animationDone(event) {
335
+ if (event.toState === 'newError') {
336
+ // Reset after annimation
337
+ this.state = 'active';
338
+ // Called from animation controller we need to re-check
339
+ this.changeDetectorRef.markForCheck();
340
+ }
341
+ }
342
+ initAnimation() {
343
+ timer(100, 2000).pipe(
344
+ // Run animation everytime we have non-read errors
345
+ filter(() => this.errors.some((error) => !error.read)), takeUntil(this.destroyed)).subscribe(() => {
346
+ switch (this.state) {
347
+ case null:
348
+ this.state = 'active';
349
+ break;
350
+ case 'active':
351
+ this.state = 'newError';
352
+ break;
353
+ }
354
+ this.changeDetectorRef.markForCheck();
355
+ });
356
+ }
357
+ }
358
+ ErrorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorComponent, deps: [{ token: ErrorCollectorService }, { token: AUTH_PROVIDER, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
359
+ ErrorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.2", type: ErrorComponent, selector: "risk-error-menu", inputs: { keepVisibleOnClick: "keepVisibleOnClick" }, host: { properties: { "class.risk-error-menu": "true" } }, viewQueries: [{ propertyName: "errorMessages", predicate: ErrorMessageComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<button *ngIf=\"state != null\"\n mat-icon-button\n [color]=\"color\"\n type=\"button\"\n [@buttonState]=\"state\"\n (@buttonState.done)=\"animationDone($event)\"\n [matMenuTriggerFor]=\"errorMenu\"\n #errorMenuTrigger=\"matMenuTrigger\"\n (menuOpened)=\"menuOpened()\"\n (menuClosed)=\"menuClosed()\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\">\n <mat-icon>error_outline</mat-icon>\n</button>\n\n<mat-menu #errorMenu=\"matMenu\"\n class=\"risk-error-menu-mat-menu\"\n [overlapTrigger]=\"false\">\n <risk-error-message *ngFor=\"let error of errors; last as isLast\"\n [error]=\"error\"\n (click)=\"keepVisibleOnClick ? $event.stopPropagation() : null\"\n [isLast]=\"isLast\"></risk-error-message>\n</mat-menu>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", "::ng-deep .risk-error-menu-mat-menu{max-width:600px!important}\n"], components: [{ type: i2$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: ErrorMessageComponent, selector: "risk-error-message", inputs: ["error", "isLast"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], animations: [
360
+ trigger('buttonState', [
361
+ state('inactive', style({ transform: 'translateX(0) scale(0)' })),
362
+ state('active', style({ transform: 'translateX(0) scale(1)' })),
363
+ state('newError', style({ transform: 'translateX(0) scale(1)' })),
364
+ transition('void => active', [
365
+ style({ transform: 'scale(0) translateX(0) rotate(0)' }),
366
+ JIGGLE_ANIMATION
367
+ ]),
368
+ transition('void => newError', [
369
+ style({ transform: 'scale(0) translateX(0) rotate(0)' }),
370
+ JIGGLE_ANIMATION
371
+ ]),
372
+ transition('active => newError', [
373
+ style({ transform: 'scale(1) translateX(0) rotate(0)' }),
374
+ JIGGLE_ANIMATION
375
+ ])
376
+ ])
377
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
378
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorComponent, decorators: [{
379
+ type: Component,
380
+ args: [{ selector: 'risk-error-menu', animations: [
381
+ trigger('buttonState', [
382
+ state('inactive', style({ transform: 'translateX(0) scale(0)' })),
383
+ state('active', style({ transform: 'translateX(0) scale(1)' })),
384
+ state('newError', style({ transform: 'translateX(0) scale(1)' })),
385
+ transition('void => active', [
386
+ style({ transform: 'scale(0) translateX(0) rotate(0)' }),
387
+ JIGGLE_ANIMATION
388
+ ]),
389
+ transition('void => newError', [
390
+ style({ transform: 'scale(0) translateX(0) rotate(0)' }),
391
+ JIGGLE_ANIMATION
392
+ ]),
393
+ transition('active => newError', [
394
+ style({ transform: 'scale(1) translateX(0) rotate(0)' }),
395
+ JIGGLE_ANIMATION
396
+ ])
397
+ ])
398
+ ], host: {
399
+ '[class.risk-error-menu]': 'true'
400
+ }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<button *ngIf=\"state != null\"\n mat-icon-button\n [color]=\"color\"\n type=\"button\"\n [@buttonState]=\"state\"\n (@buttonState.done)=\"animationDone($event)\"\n [matMenuTriggerFor]=\"errorMenu\"\n #errorMenuTrigger=\"matMenuTrigger\"\n (menuOpened)=\"menuOpened()\"\n (menuClosed)=\"menuClosed()\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\">\n <mat-icon>error_outline</mat-icon>\n</button>\n\n<mat-menu #errorMenu=\"matMenu\"\n class=\"risk-error-menu-mat-menu\"\n [overlapTrigger]=\"false\">\n <risk-error-message *ngFor=\"let error of errors; last as isLast\"\n [error]=\"error\"\n (click)=\"keepVisibleOnClick ? $event.stopPropagation() : null\"\n [isLast]=\"isLast\"></risk-error-message>\n</mat-menu>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", "::ng-deep .risk-error-menu-mat-menu{max-width:600px!important}\n"] }]
401
+ }], ctorParameters: function () {
402
+ return [{ type: ErrorCollectorService }, { type: undefined, decorators: [{
403
+ type: Optional
404
+ }, {
405
+ type: Inject,
406
+ args: [AUTH_PROVIDER]
407
+ }] }, { type: i0.ChangeDetectorRef }];
408
+ }, propDecorators: { keepVisibleOnClick: [{
409
+ type: Input
410
+ }], errorMessages: [{
411
+ type: ViewChildren,
412
+ args: [ErrorMessageComponent]
413
+ }] } });
414
+
415
+ class ErrorModule {
416
+ }
417
+ ErrorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
418
+ ErrorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorModule, declarations: [ErrorComponent,
419
+ ErrorMessageComponent], imports: [CommonModule,
420
+ CommonViewModule], exports: [ErrorComponent] });
421
+ ErrorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorModule, providers: [
422
+ ErrorCollectorService,
423
+ {
424
+ provide: ErrorHandler,
425
+ useExisting: ErrorCollectorService
426
+ }
427
+ ], imports: [[
428
+ CommonModule,
429
+ CommonViewModule
430
+ ]] });
431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: ErrorModule, decorators: [{
432
+ type: NgModule,
433
+ args: [{
434
+ imports: [
435
+ CommonModule,
436
+ CommonViewModule
437
+ ],
438
+ exports: [
439
+ ErrorComponent
440
+ ],
441
+ declarations: [
442
+ ErrorComponent,
443
+ ErrorMessageComponent
444
+ ],
445
+ providers: [
446
+ ErrorCollectorService,
447
+ {
448
+ provide: ErrorHandler,
449
+ useExisting: ErrorCollectorService
450
+ }
451
+ ]
452
+ }]
453
+ }] });
454
+
455
+ /**
456
+ * Collects all error using error collector and returns the "otherwise" error instead.
457
+ * @param errorCollector Error collector service.
458
+ * @param otherwise Value to be returned in case of error.
459
+ */
460
+ function collectErrors(errorCollector, otherwise) {
461
+ return (source) => source.pipe(catchError((err) => errorCollector.handleStreamError(err)), defaultIfEmpty(otherwise));
462
+ }
463
+
464
+ /**
465
+ * Generated bundle index. Do not edit.
466
+ */
467
+
468
+ export { ErrorCollectorService, ErrorComponent, ErrorModule, JIGGLE_ANIMATION, collectErrors, toErrorMessage };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbg-riskit-angular-error.mjs","sources":["../../../../pkg/dbg-riskit/angular-error/src/lib/error.collector.ts","../../../../pkg/dbg-riskit/angular-error/src/lib/error.message.component.ts","../../../../pkg/dbg-riskit/angular-error/src/lib/error.message.component.html","../../../../pkg/dbg-riskit/angular-error/src/lib/error.message.wrapper.ts","../../../../pkg/dbg-riskit/angular-error/src/lib/error.menu.component.ts","../../../../pkg/dbg-riskit/angular-error/src/lib/error.menu.component.html","../../../../pkg/dbg-riskit/angular-error/src/lib/error.module.ts","../../../../pkg/dbg-riskit/angular-error/src/lib/rxjs.utils.ts","../../../../pkg/dbg-riskit/angular-error/src/dbg-riskit-angular-error.ts"],"sourcesContent":["import {ErrorHandler, Inject, Injectable, Optional} from '@angular/core';\nimport {AUTH_PROVIDER} from '@dbg-riskit/angular-common';\nimport {AuthProvider, ErrorMessage, ErrorType, toString} from '@dbg-riskit/common';\nimport {EMPTY, Observable, ReplaySubject} from 'rxjs';\n\nexport type ErrorTypes = ErrorMessage | Error | object | string;\n\nexport function toErrorMessage(err: ErrorTypes): ErrorMessage {\n let errorMessage: ErrorMessage;\n if ('errorType' in (err as ErrorMessage)) {\n errorMessage = err as ErrorMessage;\n } else {\n if ('message' in (err as Error)) {\n err = (err as Error).message || toString(err);\n } else {\n err = toString(err);\n }\n errorMessage = {\n message : err,\n status : 0,\n errorType: ErrorType.ERROR\n };\n }\n return errorMessage;\n}\n\n@Injectable()\nexport class ErrorCollectorService extends ErrorHandler {\n\n private _errorObservable: ReplaySubject<ErrorMessage> = new ReplaySubject(10);\n\n public constructor(@Optional() @Inject(AUTH_PROVIDER) authProvider: AuthProvider) {\n super();\n if (authProvider) {\n authProvider.loggedInStream.subscribe((auth: boolean) => {\n this._errorObservable = new ReplaySubject(10);\n });\n }\n }\n\n public error(err: ErrorMessage) {\n this._errorObservable.next(err);\n }\n\n public get errorStream(): Observable<ErrorMessage> {\n return this._errorObservable.asObservable();\n }\n\n public handleError(err: ErrorTypes): void {\n try {\n super.handleError(err);\n } finally {\n this.error(toErrorMessage(err));\n }\n }\n\n public handleStreamError<T>(err: ErrorTypes): Observable<T> {\n this.handleError(err);\n return EMPTY;\n }\n}\n","import {animate, AnimationEvent, keyframes, state, style, transition, trigger} from '@angular/animations';\nimport {ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input} from '@angular/core';\nimport {DATE_FORMAT} from '@dbg-riskit/angular-common';\nimport {ErrorMessageWrapper} from './error.message.wrapper';\n\n@Component({\n selector : 'risk-error-message',\n templateUrl: 'error.message.component.html',\n styleUrls : [\n '../../../component.scss',\n 'error.message.component.scss'\n ],\n animations : [\n trigger('readState', [\n state('read', style({background: 'transparent'})),\n transition(':enter', [\n style({\n height : 0,\n transform: 'scale(0)'\n }),\n animate('200ms ease-in', style({\n height : '*',\n transform: 'scale(1)'\n }))\n ]),\n transition('* => read', [\n style({\n background: 'transparent'\n }),\n animate('1500ms', keyframes([\n style({\n background: 'rgba(204, 51, 51, .5)',\n offset : 0.25\n }),\n style({\n background: 'transparent',\n offset : 0.5\n }),\n style({\n background: 'rgba(204, 51, 51, .5)',\n offset : 0.75\n }),\n style({\n background: 'transparent',\n offset : 1\n })\n ]))\n ])\n ])\n ],\n host : {\n '[class.risk-error-message]': 'true'\n },\n changeDetection : ChangeDetectionStrategy.OnPush,\n preserveWhitespaces: false\n})\nexport class ErrorMessageComponent {\n\n public readState: 'read' | null = null;\n\n @Input()\n public error?: ErrorMessageWrapper;\n\n @Input()\n public isLast = false;\n\n public constructor(@Inject(DATE_FORMAT) public readonly dateFormat: string,\n private readonly changeDetectorRef: ChangeDetectorRef) {\n }\n\n public animate(): void {\n if (this.error != null && !this.error.read && this.readState !== 'read') {\n setTimeout(() => {\n this.readState = 'read';\n this.changeDetectorRef.markForCheck();\n });\n }\n }\n\n public markRead(event: AnimationEvent): void {\n if (this.error != null && event.toState === 'read') {\n this.error.markRead();\n this.changeDetectorRef.markForCheck();\n }\n }\n}\n","<mat-card [class.risk-error-message-last]=\"isLast\" [@readState]=\"readState\" (@readState.done)=\"markRead($event)\">\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n <mat-card-title *ngIf=\"error?.type.isNetworkError()\">Network error</mat-card-title>\n <mat-card-title *ngIf=\"error?.type.isRequestError()\">API error</mat-card-title>\n <mat-card-title *ngIf=\"error?.type.isAuthError()\">Authorization error</mat-card-title>\n <mat-card-title\n *ngIf=\"!error?.type.isNetworkError() && !error?.type.isRequestError() && !error?.type.isAuthError()\">\n General error\n </mat-card-title>\n <mat-card-subtitle>{{error?.date | date:dateFormat}}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n <p *ngIf=\"error?.statusCode\" class=\"risk-error-message-code\">Error code: {{error?.statusCode}}</p>\n <p>\n {{error?.message}}\n </p>\n </mat-card-content>\n</mat-card>\n","import {EventEmitter} from '@angular/core';\n\nimport {ErrorMessage, ErrorType} from '@dbg-riskit/common';\n\nexport class ErrorMessageWrapper {\n private readonly _error: ErrorMessage;\n private readonly _date: Date = new Date();\n private _read = false;\n\n public readonly readStateChanged: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n public constructor(error: ErrorMessage) {\n this._error = error;\n }\n\n public get message(): string {\n return this._error.message;\n }\n\n public get type(): ErrorType {\n return this._error.errorType;\n }\n\n public get statusCode(): number {\n return this._error.status;\n }\n\n public get date(): Date {\n return this._date;\n }\n\n public get read(): boolean {\n return this._read;\n }\n\n public markRead(): void {\n if (!this._read) {\n this._read = true;\n this.readStateChanged.emit(this._read);\n this.readStateChanged.complete();\n }\n }\n}\n","import {\n animate,\n AnimationAnimateMetadata,\n AnimationEvent,\n keyframes,\n state,\n style,\n transition,\n trigger\n} from '@angular/animations';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Inject,\n OnInit,\n Optional,\n QueryList,\n ViewChildren,\n Input\n} from '@angular/core';\nimport {AUTH_PROVIDER, MatColorTheme} from '@dbg-riskit/angular-common';\nimport {BaseComponent} from '@dbg-riskit/angular-view';\nimport {AuthProvider, ErrorMessage} from '@dbg-riskit/common';\nimport {merge, Observable, Subject, timer} from 'rxjs';\nimport {filter, map, takeUntil} from 'rxjs/operators';\nimport {ErrorCollectorService} from './error.collector';\nimport {ErrorMessageComponent} from './error.message.component';\nimport {ErrorMessageWrapper} from './error.message.wrapper';\n\nexport const JIGGLE_ANIMATION: AnimationAnimateMetadata = animate('1s ease-in', keyframes([\n style({\n transform: 'scale(0.8) translateX(-1px) rotate(0)',\n offset : 0.1\n }),\n style({\n transform: 'scale(1) translateX(2px) rotate(4deg)',\n offset : 0.2\n }),\n style({\n transform: 'scale(1.2) translateX(-4px) rotate(0)',\n offset : 0.3\n }),\n style({\n transform: 'scale(1.5) translateX(4px) rotate(0)',\n offset : 0.4\n }),\n style({\n transform: 'scale(1.5) translateX(-4px) rotate(-8deg)',\n offset : 0.5\n }),\n style({\n transform: 'scale(1.5) translateX(4px) rotate(0)',\n offset : 0.6\n }),\n style({\n transform: 'scale(1.2) translateX(-4px) rotate(0)',\n offset : 0.7\n }),\n style({\n transform: 'scale(1) translateX(2px) rotate(4deg)',\n offset : 0.8\n }),\n style({\n transform: 'scale(1) translateX(-1px) rotate(0)',\n offset : 0.9\n })\n]));\n\n@Component({\n selector : 'risk-error-menu',\n templateUrl : 'error.menu.component.html',\n styleUrls : [\n '../../../component.scss',\n 'error.menu.component.scss'\n ],\n animations : [\n trigger('buttonState', [\n state('inactive', style({transform: 'translateX(0) scale(0)'})),\n state('active', style({transform: 'translateX(0) scale(1)'})),\n state('newError', style({transform: 'translateX(0) scale(1)'})),\n transition('void => active', [\n style({transform: 'scale(0) translateX(0) rotate(0)'}),\n JIGGLE_ANIMATION\n ]),\n transition('void => newError', [\n style({transform: 'scale(0) translateX(0) rotate(0)'}),\n JIGGLE_ANIMATION\n ]),\n transition('active => newError', [\n style({transform: 'scale(1) translateX(0) rotate(0)'}),\n JIGGLE_ANIMATION\n ])\n ])\n ],\n host : {\n '[class.risk-error-menu]': 'true'\n },\n changeDetection : ChangeDetectionStrategy.OnPush,\n preserveWhitespaces: false\n})\nexport class ErrorComponent extends BaseComponent implements OnInit {\n\n public state: 'active' | 'newError' | null = null;\n\n @Input() public keepVisibleOnClick?: boolean;\n\n private readonly _errors: ErrorMessageWrapper[] = [];\n\n private readonly _menuState: Subject<boolean> = new Subject();\n\n @ViewChildren(ErrorMessageComponent)\n public errorMessages?: QueryList<ErrorMessageComponent>;\n\n public constructor(private readonly errorCollector: ErrorCollectorService,\n @Optional() @Inject(AUTH_PROVIDER) private readonly authProvider: AuthProvider,\n private readonly changeDetectorRef: ChangeDetectorRef) {\n super();\n }\n\n public ngOnInit(): void {\n // Init Jiggle animation loop\n this.initAnimation();\n\n // Subscribe to error stream\n this.subscribeToErrors();\n\n // Once opened animate messages and set as read after animation\n this._menuState.pipe(\n filter((opened: boolean) => opened),\n takeUntil(this.destroyed)\n ).subscribe(() => this.animateOnMenuOpened());\n\n // Refresh on \"logged-in\" state changes\n if (this.authProvider) {\n this.authProvider.loggedInStream.pipe(\n takeUntil(this.destroyed)\n ).subscribe((auth: boolean) => this.loggedInChanged(auth));\n }\n }\n\n private animateOnMenuOpened() {\n const animateMessages = () => this.errorMessages!.forEach(\n (message: ErrorMessageComponent) => message.animate());\n animateMessages();\n this.errorMessages!.changes.pipe(\n takeUntil(merge(this.destroyed, this._menuState))\n ).subscribe(() => animateMessages());\n }\n\n private loggedInChanged(auth: boolean) {\n // Subscribe to errors once logged in again\n if (auth) {\n this.subscribeToErrors();\n } else {\n while (this._errors.length > 0) {\n this._errors.pop();\n }\n }\n this.changeDetectorRef.markForCheck();\n }\n\n private subscribeToErrors() {\n let until: Observable<void> = this.destroyed;\n // Stop receiving errors once user was logged out\n if (this.authProvider) {\n until = merge(\n until,\n this.authProvider.loggedInStream.pipe(\n filter((auth: boolean) => !auth),\n map(() => undefined)\n )\n );\n }\n this.errorCollector.errorStream.pipe(\n takeUntil(until)\n ).subscribe((error: ErrorMessage) => this.errorReceived(error, until));\n }\n\n private errorReceived(error: ErrorMessage, until: Observable<unknown>) {\n const errorMessageWrapper = new ErrorMessageWrapper(error);\n\n // Subscribe for state changes\n errorMessageWrapper.readStateChanged.pipe(\n takeUntil(until)\n ).subscribe(() => this.changeDetectorRef.detectChanges());\n\n this._errors.unshift(errorMessageWrapper);\n while (this._errors.length > 10) {\n this._errors.pop();\n }\n\n this.changeDetectorRef.markForCheck();\n }\n\n public get color(): MatColorTheme {\n if (this.errors.some((error: ErrorMessageWrapper) => !error.read)) {\n return 'warn';\n }\n return null;\n }\n\n public menuOpened(): void {\n this._menuState.next(true);\n }\n\n public menuClosed(): void {\n this._menuState.next(false);\n }\n\n public get errors(): ErrorMessageWrapper[] {\n return this._errors;\n }\n\n // <editor-fold desc=\"Animation control\" defaultstate=\"collapsed\">\n public animationDone(event: AnimationEvent): void {\n if (event.toState === 'newError') {\n // Reset after annimation\n this.state = 'active';\n\n // Called from animation controller we need to re-check\n this.changeDetectorRef.markForCheck();\n }\n }\n\n private initAnimation(): void {\n timer(100, 2000).pipe(\n // Run animation everytime we have non-read errors\n filter(() => this.errors.some((error: ErrorMessageWrapper) => !error.read)),\n takeUntil(this.destroyed)\n ).subscribe(() => {\n switch (this.state) {\n case null:\n this.state = 'active';\n break;\n case 'active':\n this.state = 'newError';\n break;\n }\n this.changeDetectorRef.markForCheck();\n });\n }\n\n // </editor-fold>\n}\n","<button *ngIf=\"state != null\"\n mat-icon-button\n [color]=\"color\"\n type=\"button\"\n [@buttonState]=\"state\"\n (@buttonState.done)=\"animationDone($event)\"\n [matMenuTriggerFor]=\"errorMenu\"\n #errorMenuTrigger=\"matMenuTrigger\"\n (menuOpened)=\"menuOpened()\"\n (menuClosed)=\"menuClosed()\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\">\n <mat-icon>error_outline</mat-icon>\n</button>\n\n<mat-menu #errorMenu=\"matMenu\"\n class=\"risk-error-menu-mat-menu\"\n [overlapTrigger]=\"false\">\n <risk-error-message *ngFor=\"let error of errors; last as isLast\"\n [error]=\"error\"\n (click)=\"keepVisibleOnClick ? $event.stopPropagation() : null\"\n [isLast]=\"isLast\"></risk-error-message>\n</mat-menu>\n","import {CommonModule} from '@angular/common';\nimport {ErrorHandler, NgModule} from '@angular/core';\nimport {CommonViewModule} from '@dbg-riskit/angular-view';\nimport {ErrorCollectorService} from './error.collector';\nimport {ErrorComponent} from './error.menu.component';\nimport {ErrorMessageComponent} from './error.message.component';\n\n@NgModule({\n imports : [\n CommonModule,\n CommonViewModule\n ],\n exports : [\n ErrorComponent\n ],\n declarations: [\n ErrorComponent,\n ErrorMessageComponent\n ],\n providers : [\n ErrorCollectorService,\n {\n provide : ErrorHandler,\n useExisting: ErrorCollectorService\n }\n ]\n})\nexport class ErrorModule {\n}\n","import {MonoTypeOperatorFunction, Observable} from 'rxjs';\nimport {catchError, defaultIfEmpty} from 'rxjs/operators';\nimport {ErrorCollectorService} from './error.collector';\n\n/**\n * Collects all error using error collector and returns the \"otherwise\" error instead.\n * @param errorCollector Error collector service.\n * @param otherwise Value to be returned in case of error.\n */\nexport function collectErrors<T>(errorCollector: ErrorCollectorService, otherwise: T): MonoTypeOperatorFunction<T> {\n return (source: Observable<T>) => source.pipe(\n catchError((err) => errorCollector.handleStreamError<T>(err)),\n defaultIfEmpty(otherwise)\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}