@dbg-riskit/angular-error 20.0.1 → 20.1.0

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.
@@ -1,16 +1,16 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ErrorHandler, inject, Injectable, ChangeDetectorRef, Input, ChangeDetectionStrategy, Component, EventEmitter, ViewChildren } from '@angular/core';
3
- import { AUTH_PROVIDER, DATE_FORMAT } from '@dbg-riskit/angular-common';
2
+ import { ErrorHandler, inject, Injectable, Injector, signal, input, afterNextRender, ChangeDetectionStrategy, Component, viewChildren, computed, effect, untracked } from '@angular/core';
3
+ import { AUTH_PROVIDER, DATE_FORMAT, intervalSignal } from '@dbg-riskit/angular-common';
4
4
  import { toString, ErrorType } from '@dbg-riskit/common';
5
- import { ReplaySubject, EMPTY, Subject, merge, timer } from 'rxjs';
5
+ import { ReplaySubject, EMPTY } from 'rxjs';
6
6
  import { trigger, state, transition, style, animate, keyframes } from '@angular/animations';
7
+ import { toSignal } from '@angular/core/rxjs-interop';
7
8
  import { MatIconButton } from '@angular/material/button';
8
9
  import { MatIcon } from '@angular/material/icon';
9
- import { MatMenuTrigger, MatMenu } from '@angular/material/menu';
10
- import { BaseComponent } from '@dbg-riskit/angular-view';
11
- import { filter, takeUntil, map, catchError, defaultIfEmpty } from 'rxjs/operators';
10
+ import { MatMenu, MatMenuTrigger } from '@angular/material/menu';
12
11
  import { DatePipe } from '@angular/common';
13
- import { MatCard, MatCardHeader, MatCardAvatar, MatCardTitle, MatCardSubtitle, MatCardContent } from '@angular/material/card';
12
+ import { MatCard, MatCardAvatar, MatCardContent, MatCardHeader, MatCardSubtitle, MatCardTitle } from '@angular/material/card';
13
+ import { catchError, defaultIfEmpty } from 'rxjs/operators';
14
14
 
15
15
  function toErrorMessage(err) {
16
16
  let errorMessage;
@@ -61,37 +61,36 @@ class ErrorCollectorService extends ErrorHandler {
61
61
  this.handleError(err);
62
62
  return EMPTY;
63
63
  }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: ErrorCollectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
65
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: ErrorCollectorService, providedIn: 'root' }); }
64
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ErrorCollectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
65
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ErrorCollectorService, providedIn: 'root' }); }
66
66
  }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: ErrorCollectorService, decorators: [{
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ErrorCollectorService, decorators: [{
68
68
  type: Injectable,
69
69
  args: [{ providedIn: 'root' }]
70
70
  }], ctorParameters: () => [] });
71
71
 
72
- class ErrorMessageComponent {
72
+ class RiskErrorMessageComponent {
73
73
  constructor() {
74
74
  this.dateFormat = inject(DATE_FORMAT);
75
- this.changeDetectorRef = inject(ChangeDetectorRef);
76
- this.readState = null;
77
- this.isLast = false;
75
+ this.injector = inject(Injector);
76
+ this.readState = signal(null, ...(ngDevMode ? [{ debugName: "readState" }] : []));
77
+ this.error = input.required(...(ngDevMode ? [{ debugName: "error" }] : []));
78
+ this.isLast = input(false, ...(ngDevMode ? [{ debugName: "isLast" }] : []));
78
79
  }
79
80
  animate() {
80
- if (this.error != null && !this.error.read && this.readState !== 'read') {
81
- setTimeout(() => {
82
- this.readState = 'read';
83
- this.changeDetectorRef.markForCheck();
84
- });
81
+ const err = this.error();
82
+ if (!err.read() && this.readState() !== 'read') {
83
+ afterNextRender(() => this.readState.set('read'), { injector: this.injector });
85
84
  }
86
85
  }
87
86
  markRead(event) {
88
- if (this.error != null && event.toState === 'read') {
89
- this.error.markRead();
90
- this.changeDetectorRef.markForCheck();
87
+ const err = this.error();
88
+ if (err && event.toState === 'read') {
89
+ err.markRead();
91
90
  }
92
91
  }
93
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: ErrorMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
94
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: ErrorMessageComponent, isStandalone: true, selector: "risk-error-message", inputs: { error: "error", isLast: "isLast" }, host: { properties: { "class.risk-error-message": "true" } }, ngImport: i0, template: "<mat-card (@readState.done)=\"markRead($event)\" [@readState]=\"readState\" [class.risk-error-message-last]=\"isLast\">\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n @if (error?.type.isNetworkError()) {\n <mat-card-title>Network error</mat-card-title>\n }\n @if (error?.type.isRequestError()) {\n <mat-card-title>API error</mat-card-title>\n }\n @if (error?.type.isAuthError()) {\n <mat-card-title>Authorization error</mat-card-title>\n }\n @if (!error?.type.isNetworkError() && !error?.type.isRequestError() && !error?.type.isAuthError()) {\n <mat-card-title\n >\n General error\n </mat-card-title>\n }\n <mat-card-subtitle>{{ error?.date | date:dateFormat }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n @if (error?.statusCode) {\n <p class=\"risk-error-message-code\">Error code: {{ error?.statusCode }}</p>\n }\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-mdc-card{margin:0 10px 7px}:host .mat-mdc-card.risk-error-message-last{margin-bottom:0}:host .mat-mdc-card .mat-mdc-card-subtitle{margin-bottom:5px}:host .mat-mdc-card p{margin:0}:host .mat-mdc-card p.risk-error-message-code{position:absolute;bottom:10px;right:10px}:host .mat-mdc-card p.risk-error-message-code+p:last-child{margin-bottom:15px}\n"], dependencies: [{ kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "pipe", type: DatePipe, name: "date" }], animations: [
92
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskErrorMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
93
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RiskErrorMessageComponent, isStandalone: true, selector: "risk-error-message", inputs: { error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: true, transformFunction: null }, isLast: { classPropertyName: "isLast", publicName: "isLast", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.risk-error-message": "true" } }, ngImport: i0, template: "<mat-card (@readState.done)=\"markRead($event)\" [@readState]=\"readState()\" [class.risk-error-message-last]=\"isLast()\">\n @let err = error();\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n @if (err.type.isNetworkError()) {\n <mat-card-title>Network error</mat-card-title>\n }\n @if (err.type.isRequestError()) {\n <mat-card-title>API error</mat-card-title>\n }\n @if (err.type.isAuthError()) {\n <mat-card-title>Authorization error</mat-card-title>\n }\n @if (!err.type.isNetworkError() && !err.type.isRequestError() && !err.type.isAuthError()) {\n <mat-card-title>General error</mat-card-title>\n }\n <mat-card-subtitle>{{ err.date | date:dateFormat }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n @if (err.statusCode) {\n <p class=\"risk-error-message-code\">Error code: {{ err.statusCode }}</p>\n }\n <p> {{ err.message }} </p>\n </mat-card-content>\n</mat-card>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host .mat-mdc-card{margin:0 10px 7px}:host .mat-mdc-card.risk-error-message-last{margin-bottom:0}:host .mat-mdc-card .mat-mdc-card-subtitle{margin-bottom:5px}:host .mat-mdc-card p{margin:0}:host .mat-mdc-card p.risk-error-message-code{position:absolute;bottom:10px;right:10px}:host .mat-mdc-card p.risk-error-message-code+p:last-child{margin-bottom:15px}\n"], dependencies: [{ kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: MatCardAvatar, selector: "[mat-card-avatar], [matCardAvatar]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: DatePipe, name: "date" }], animations: [
95
94
  trigger('readState', [
96
95
  state('read', style({ background: 'transparent' })),
97
96
  transition(':enter', [
@@ -105,9 +104,7 @@ class ErrorMessageComponent {
105
104
  }))
106
105
  ]),
107
106
  transition('* => read', [
108
- style({
109
- background: 'transparent'
110
- }),
107
+ style({ background: 'transparent' }),
111
108
  animate('1500ms', keyframes([
112
109
  style({
113
110
  background: 'rgba(204, 51, 51, .5)',
@@ -130,9 +127,18 @@ class ErrorMessageComponent {
130
127
  ])
131
128
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
132
129
  }
133
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: ErrorMessageComponent, decorators: [{
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskErrorMessageComponent, decorators: [{
134
131
  type: Component,
135
- args: [{ selector: 'risk-error-message', animations: [
132
+ args: [{ selector: 'risk-error-message', changeDetection: ChangeDetectionStrategy.OnPush, host: { '[class.risk-error-message]': 'true' }, imports: [
133
+ DatePipe,
134
+ MatCard,
135
+ MatCardAvatar,
136
+ MatCardContent,
137
+ MatCardHeader,
138
+ MatCardSubtitle,
139
+ MatCardTitle,
140
+ MatIcon
141
+ ], animations: [
136
142
  trigger('readState', [
137
143
  state('read', style({ background: 'transparent' })),
138
144
  transition(':enter', [
@@ -146,9 +152,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
146
152
  }))
147
153
  ]),
148
154
  transition('* => read', [
149
- style({
150
- background: 'transparent'
151
- }),
155
+ style({ background: 'transparent' }),
152
156
  animate('1500ms', keyframes([
153
157
  style({
154
158
  background: 'rgba(204, 51, 51, .5)',
@@ -169,29 +173,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
169
173
  ]))
170
174
  ])
171
175
  ])
172
- ], host: {
173
- '[class.risk-error-message]': 'true'
174
- }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, imports: [
175
- MatCard,
176
- MatCardHeader,
177
- MatIcon,
178
- MatCardAvatar,
179
- MatCardTitle,
180
- MatCardSubtitle,
181
- MatCardContent,
182
- DatePipe
183
- ], template: "<mat-card (@readState.done)=\"markRead($event)\" [@readState]=\"readState\" [class.risk-error-message-last]=\"isLast\">\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n @if (error?.type.isNetworkError()) {\n <mat-card-title>Network error</mat-card-title>\n }\n @if (error?.type.isRequestError()) {\n <mat-card-title>API error</mat-card-title>\n }\n @if (error?.type.isAuthError()) {\n <mat-card-title>Authorization error</mat-card-title>\n }\n @if (!error?.type.isNetworkError() && !error?.type.isRequestError() && !error?.type.isAuthError()) {\n <mat-card-title\n >\n General error\n </mat-card-title>\n }\n <mat-card-subtitle>{{ error?.date | date:dateFormat }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n @if (error?.statusCode) {\n <p class=\"risk-error-message-code\">Error code: {{ error?.statusCode }}</p>\n }\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-mdc-card{margin:0 10px 7px}:host .mat-mdc-card.risk-error-message-last{margin-bottom:0}:host .mat-mdc-card .mat-mdc-card-subtitle{margin-bottom:5px}:host .mat-mdc-card p{margin:0}:host .mat-mdc-card p.risk-error-message-code{position:absolute;bottom:10px;right:10px}:host .mat-mdc-card p.risk-error-message-code+p:last-child{margin-bottom:15px}\n"] }]
184
- }], propDecorators: { error: [{
185
- type: Input
186
- }], isLast: [{
187
- type: Input
188
- }] } });
176
+ ], template: "<mat-card (@readState.done)=\"markRead($event)\" [@readState]=\"readState()\" [class.risk-error-message-last]=\"isLast()\">\n @let err = error();\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n @if (err.type.isNetworkError()) {\n <mat-card-title>Network error</mat-card-title>\n }\n @if (err.type.isRequestError()) {\n <mat-card-title>API error</mat-card-title>\n }\n @if (err.type.isAuthError()) {\n <mat-card-title>Authorization error</mat-card-title>\n }\n @if (!err.type.isNetworkError() && !err.type.isRequestError() && !err.type.isAuthError()) {\n <mat-card-title>General error</mat-card-title>\n }\n <mat-card-subtitle>{{ err.date | date:dateFormat }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n @if (err.statusCode) {\n <p class=\"risk-error-message-code\">Error code: {{ err.statusCode }}</p>\n }\n <p> {{ err.message }} </p>\n </mat-card-content>\n</mat-card>\n", styles: [":host{display:block;padding:0;margin:0}:host>*{vertical-align:bottom}\n", ":host .mat-mdc-card{margin:0 10px 7px}:host .mat-mdc-card.risk-error-message-last{margin-bottom:0}:host .mat-mdc-card .mat-mdc-card-subtitle{margin-bottom:5px}:host .mat-mdc-card p{margin:0}:host .mat-mdc-card p.risk-error-message-code{position:absolute;bottom:10px;right:10px}:host .mat-mdc-card p.risk-error-message-code+p:last-child{margin-bottom:15px}\n"] }]
177
+ }], propDecorators: { error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: true }] }], isLast: [{ type: i0.Input, args: [{ isSignal: true, alias: "isLast", required: false }] }] } });
189
178
 
190
179
  class ErrorMessageWrapper {
191
180
  constructor(error) {
192
181
  this._date = new Date();
193
- this._read = false;
194
- this.readStateChanged = new EventEmitter();
182
+ this.read = signal(false, ...(ngDevMode ? [{ debugName: "read" }] : []));
195
183
  this._error = error;
196
184
  }
197
185
  get message() {
@@ -206,14 +194,9 @@ class ErrorMessageWrapper {
206
194
  get date() {
207
195
  return this._date;
208
196
  }
209
- get read() {
210
- return this._read;
211
- }
212
197
  markRead() {
213
- if (!this._read) {
214
- this._read = true;
215
- this.readStateChanged.emit(this._read);
216
- this.readStateChanged.complete();
198
+ if (!this.read()) {
199
+ this.read.set(true);
217
200
  }
218
201
  }
219
202
  }
@@ -256,104 +239,79 @@ const JIGGLE_ANIMATION = animate('1s ease-in', keyframes([
256
239
  offset: 0.9
257
240
  })
258
241
  ]));
259
- class ErrorComponent extends BaseComponent {
242
+ class RiskErrorComponent {
260
243
  constructor() {
261
- super(...arguments);
262
244
  this.errorCollector = inject(ErrorCollectorService);
263
245
  this.authProvider = inject(AUTH_PROVIDER, { optional: true });
264
- this.changeDetectorRef = inject(ChangeDetectorRef);
265
- this.state = null;
246
+ this.state = signal(null, ...(ngDevMode ? [{ debugName: "state" }] : []));
247
+ this.keepVisibleOnClick = input(...(ngDevMode ? [undefined, { debugName: "keepVisibleOnClick" }] : []));
248
+ this.errorMessages = viewChildren(RiskErrorMessageComponent, ...(ngDevMode ? [{ debugName: "errorMessages" }] : []));
249
+ this.lastErrorFromCollector = toSignal(this.errorCollector.errorStream);
250
+ this.authenticated = this.authProvider == null
251
+ ? signal(true)
252
+ : toSignal(this.authProvider.loggedInStream, { initialValue: false });
266
253
  this._errors = [];
267
- this._menuState = new Subject();
268
- }
269
- get color() {
270
- if (this.errors.some((error) => !error.read)) {
271
- return 'warn';
272
- }
273
- return null;
274
- }
275
- get errors() {
276
- return this._errors;
277
- }
278
- ngOnInit() {
279
- // Init Jiggle animation loop
280
- this.initAnimation();
281
- // Subscribe to error stream
282
- this.subscribeToErrors();
283
- // Once opened animate messages and set as read after animation
284
- this._menuState.pipe(filter((opened) => opened), takeUntil(this.destroyed)).subscribe(() => this.animateOnMenuOpened());
285
- // Refresh on "logged-in" state changes
286
- if (this.authProvider) {
287
- this.authProvider.loggedInStream.pipe(takeUntil(this.destroyed)).subscribe((auth) => this.loggedInChanged(auth));
288
- }
289
- }
290
- menuOpened() {
291
- this._menuState.next(true);
292
- }
293
- menuClosed() {
294
- this._menuState.next(false);
295
- }
296
- // <editor-fold desc="Animation control" defaultstate="collapsed">
297
- animationDone(event) {
298
- if (event.toState === 'newError') {
299
- // Reset after annimation
300
- this.state = 'active';
301
- // Called from animation controller we need to re-check
302
- this.changeDetectorRef.markForCheck();
303
- }
304
- }
305
- animateOnMenuOpened() {
306
- const animateMessages = () => this.errorMessages.forEach((message) => message.animate());
307
- animateMessages();
308
- this.errorMessages.changes.pipe(takeUntil(merge(this.destroyed, this._menuState))).subscribe(() => animateMessages());
309
- }
310
- loggedInChanged(auth) {
311
- // Subscribe to errors once logged in again
312
- if (auth) {
313
- this.subscribeToErrors();
314
- }
315
- else {
316
- while (this._errors.length > 0) {
254
+ this.errors = computed(() => {
255
+ if (!this.authenticated()) {
256
+ this._errors = [];
257
+ return this._errors;
258
+ }
259
+ const lastError = this.lastErrorFromCollector();
260
+ if (!lastError) {
261
+ return this._errors;
262
+ }
263
+ const errorMessageWrapper = new ErrorMessageWrapper(lastError);
264
+ this._errors.unshift(errorMessageWrapper);
265
+ while (this._errors.length > 10) {
317
266
  this._errors.pop();
318
267
  }
319
- }
320
- this.changeDetectorRef.markForCheck();
321
- }
322
- subscribeToErrors() {
323
- let until = this.destroyed;
324
- // Stop receiving errors once user was logged out
325
- if (this.authProvider) {
326
- until = merge(until, this.authProvider.loggedInStream.pipe(filter((auth) => !auth), map(() => undefined)));
327
- }
328
- this.errorCollector.errorStream.pipe(takeUntil(until)).subscribe((error) => this.errorReceived(error, until));
329
- }
330
- errorReceived(error, until) {
331
- const errorMessageWrapper = new ErrorMessageWrapper(error);
332
- // Subscribe for state changes
333
- errorMessageWrapper.readStateChanged.pipe(takeUntil(until)).subscribe(() => this.changeDetectorRef.detectChanges());
334
- this._errors.unshift(errorMessageWrapper);
335
- while (this._errors.length > 10) {
336
- this._errors.pop();
337
- }
338
- this.changeDetectorRef.markForCheck();
339
- }
340
- initAnimation() {
341
- timer(100, 2000).pipe(
342
- // Run animation everytime we have non-read errors
343
- filter(() => this.errors.some((error) => !error.read)), takeUntil(this.destroyed)).subscribe(() => {
344
- switch (this.state) {
345
- case null:
346
- this.state = 'active';
347
- break;
348
- case 'active':
349
- this.state = 'newError';
268
+ return [...this._errors];
269
+ }, ...(ngDevMode ? [{ debugName: "errors" }] : []));
270
+ this.color = computed(() => {
271
+ for (const error of this.errors()) {
272
+ if (!error.read()) {
273
+ return 'warn';
274
+ }
275
+ }
276
+ return null;
277
+ }, ...(ngDevMode ? [{ debugName: "color" }] : []));
278
+ this.menuOpened = signal(false, ...(ngDevMode ? [{ debugName: "menuOpened" }] : []));
279
+ effect(() => {
280
+ if (this.menuOpened()) {
281
+ for (const message of this.errorMessages()) {
282
+ message.animate();
283
+ }
284
+ }
285
+ });
286
+ const timerSignal = intervalSignal(100, 2000);
287
+ effect(() => {
288
+ timerSignal();
289
+ let animate = false;
290
+ for (const error of untracked(this.errors)) {
291
+ if (!error.read()) {
292
+ animate = true;
350
293
  break;
294
+ }
295
+ }
296
+ if (animate) {
297
+ switch (untracked(this.state)) {
298
+ case null:
299
+ this.state.set('active');
300
+ break;
301
+ case 'active':
302
+ this.state.set('newError');
303
+ break;
304
+ }
351
305
  }
352
- this.changeDetectorRef.markForCheck();
353
306
  });
354
307
  }
355
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: ErrorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
356
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.12", type: ErrorComponent, isStandalone: true, 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: "@if (state != null) {\n <button\n #errorMenuTrigger=\"matMenuTrigger\"\n (@buttonState.done)=\"animationDone($event)\"\n (menuClosed)=\"menuClosed()\"\n (menuOpened)=\"menuOpened()\"\n [@buttonState]=\"state\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\"\n [color]=\"color\"\n [matMenuTriggerFor]=\"errorMenu\"\n mat-icon-button\n type=\"button\">\n <mat-icon>error_outline</mat-icon>\n </button>\n}\n\n<mat-menu #errorMenu=\"matMenu\"\n [overlapTrigger]=\"false\"\n class=\"risk-error-menu-mat-menu\">\n @for (error of errors; track error; let isLast = $last) {\n <risk-error-message\n (click)=\"keepVisibleOnClick ? $event.stopPropagation() : null\"\n [error]=\"error\"\n [isLast]=\"isLast\"/>\n }\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"], dependencies: [{ kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: ErrorMessageComponent, selector: "risk-error-message", inputs: ["error", "isLast"] }], animations: [
308
+ animationDone(event) {
309
+ if (event.toState === 'newError') {
310
+ this.state.set('active');
311
+ }
312
+ }
313
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
314
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RiskErrorComponent, isStandalone: true, selector: "risk-error-menu", inputs: { keepVisibleOnClick: { classPropertyName: "keepVisibleOnClick", publicName: "keepVisibleOnClick", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.risk-error-menu": "true" } }, viewQueries: [{ propertyName: "errorMessages", predicate: RiskErrorMessageComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (state() != null) {\n <button\n #errorMenuTrigger=\"matMenuTrigger\"\n (@buttonState.done)=\"animationDone($event)\"\n [@buttonState]=\"state()\"\n (menuClosed)=\"menuOpened.set(false)\"\n (menuOpened)=\"menuOpened.set(true)\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\"\n [color]=\"color()\"\n [matMenuTriggerFor]=\"errorMenu\"\n mat-icon-button\n type=\"button\">\n <mat-icon>error_outline</mat-icon>\n </button>\n}\n\n<mat-menu #errorMenu=\"matMenu\"\n [overlapTrigger]=\"false\"\n class=\"risk-error-menu-mat-menu\">\n @for (error of errors(); track error; let isLast = $last) {\n <risk-error-message\n (click)=\"keepVisibleOnClick() ? $event.stopPropagation() : null\"\n [error]=\"error\"\n [isLast]=\"isLast\"/>\n }\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"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: RiskErrorMessageComponent, selector: "risk-error-message", inputs: ["error", "isLast"] }], animations: [
357
315
  trigger('buttonState', [
358
316
  state('inactive', style({ transform: 'translateX(0) scale(0)' })),
359
317
  state('active', style({ transform: 'translateX(0) scale(1)' })),
@@ -373,9 +331,17 @@ class ErrorComponent extends BaseComponent {
373
331
  ])
374
332
  ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
375
333
  }
376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImport: i0, type: ErrorComponent, decorators: [{
334
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RiskErrorComponent, decorators: [{
377
335
  type: Component,
378
- args: [{ selector: 'risk-error-menu', animations: [
336
+ args: [{ selector: 'risk-error-menu', changeDetection: ChangeDetectionStrategy.OnPush, host: {
337
+ '[class.risk-error-menu]': 'true'
338
+ }, imports: [
339
+ MatIcon,
340
+ MatIconButton,
341
+ MatMenu,
342
+ MatMenuTrigger,
343
+ RiskErrorMessageComponent
344
+ ], animations: [
379
345
  trigger('buttonState', [
380
346
  state('inactive', style({ transform: 'translateX(0) scale(0)' })),
381
347
  state('active', style({ transform: 'translateX(0) scale(1)' })),
@@ -393,15 +359,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.12", ngImpo
393
359
  JIGGLE_ANIMATION
394
360
  ])
395
361
  ])
396
- ], host: {
397
- '[class.risk-error-menu]': 'true'
398
- }, changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, imports: [MatIconButton, MatMenuTrigger, MatIcon, MatMenu, ErrorMessageComponent], template: "@if (state != null) {\n <button\n #errorMenuTrigger=\"matMenuTrigger\"\n (@buttonState.done)=\"animationDone($event)\"\n (menuClosed)=\"menuClosed()\"\n (menuOpened)=\"menuOpened()\"\n [@buttonState]=\"state\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\"\n [color]=\"color\"\n [matMenuTriggerFor]=\"errorMenu\"\n mat-icon-button\n type=\"button\">\n <mat-icon>error_outline</mat-icon>\n </button>\n}\n\n<mat-menu #errorMenu=\"matMenu\"\n [overlapTrigger]=\"false\"\n class=\"risk-error-menu-mat-menu\">\n @for (error of errors; track error; let isLast = $last) {\n <risk-error-message\n (click)=\"keepVisibleOnClick ? $event.stopPropagation() : null\"\n [error]=\"error\"\n [isLast]=\"isLast\"/>\n }\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"] }]
399
- }], propDecorators: { keepVisibleOnClick: [{
400
- type: Input
401
- }], errorMessages: [{
402
- type: ViewChildren,
403
- args: [ErrorMessageComponent]
404
- }] } });
362
+ ], template: "@if (state() != null) {\n <button\n #errorMenuTrigger=\"matMenuTrigger\"\n (@buttonState.done)=\"animationDone($event)\"\n [@buttonState]=\"state()\"\n (menuClosed)=\"menuOpened.set(false)\"\n (menuOpened)=\"menuOpened.set(true)\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\"\n [color]=\"color()\"\n [matMenuTriggerFor]=\"errorMenu\"\n mat-icon-button\n type=\"button\">\n <mat-icon>error_outline</mat-icon>\n </button>\n}\n\n<mat-menu #errorMenu=\"matMenu\"\n [overlapTrigger]=\"false\"\n class=\"risk-error-menu-mat-menu\">\n @for (error of errors(); track error; let isLast = $last) {\n <risk-error-message\n (click)=\"keepVisibleOnClick() ? $event.stopPropagation() : null\"\n [error]=\"error\"\n [isLast]=\"isLast\"/>\n }\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"] }]
363
+ }], ctorParameters: () => [], propDecorators: { keepVisibleOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepVisibleOnClick", required: false }] }], errorMessages: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => RiskErrorMessageComponent), { isSignal: true }] }] } });
405
364
 
406
365
  function provideErrorHandler() {
407
366
  return [
@@ -425,5 +384,5 @@ function collectErrors(errorCollector, otherwise) {
425
384
  * Generated bundle index. Do not edit.
426
385
  */
427
386
 
428
- export { ErrorCollectorService, ErrorComponent, JIGGLE_ANIMATION, collectErrors, provideErrorHandler, toErrorMessage };
387
+ export { ErrorCollectorService, JIGGLE_ANIMATION, RiskErrorComponent, collectErrors, provideErrorHandler, toErrorMessage };
429
388
  //# sourceMappingURL=dbg-riskit-angular-error.mjs.map
@@ -1 +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.handler.provider.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} 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({providedIn: 'root'})\nexport class ErrorCollectorService extends ErrorHandler {\n\n private _errorObservable: ReplaySubject<ErrorMessage> = new ReplaySubject(10);\n\n public constructor() {\n super();\n\n const authProvider = inject<AuthProvider>(AUTH_PROVIDER, {optional: true});\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 {DatePipe} from '@angular/common';\nimport {ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Input} from '@angular/core';\nimport {\n MatCard,\n MatCardAvatar,\n MatCardContent,\n MatCardHeader,\n MatCardSubtitle,\n MatCardTitle\n} from '@angular/material/card';\nimport {MatIcon} from '@angular/material/icon';\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 imports : [\n MatCard,\n MatCardHeader,\n MatIcon,\n MatCardAvatar,\n MatCardTitle,\n MatCardSubtitle,\n MatCardContent,\n DatePipe\n ]\n})\nexport class ErrorMessageComponent {\n readonly dateFormat = inject(DATE_FORMAT);\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n\n public readState: 'read' | null = null;\n\n @Input()\n public error?: ErrorMessageWrapper;\n\n @Input()\n public isLast = false;\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 (@readState.done)=\"markRead($event)\" [@readState]=\"readState\" [class.risk-error-message-last]=\"isLast\">\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n @if (error?.type.isNetworkError()) {\n <mat-card-title>Network error</mat-card-title>\n }\n @if (error?.type.isRequestError()) {\n <mat-card-title>API error</mat-card-title>\n }\n @if (error?.type.isAuthError()) {\n <mat-card-title>Authorization error</mat-card-title>\n }\n @if (!error?.type.isNetworkError() && !error?.type.isRequestError() && !error?.type.isAuthError()) {\n <mat-card-title\n >\n General error\n </mat-card-title>\n }\n <mat-card-subtitle>{{ error?.date | date:dateFormat }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n @if (error?.statusCode) {\n <p class=\"risk-error-message-code\">Error code: {{ error?.statusCode }}</p>\n }\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 Input,\n OnInit,\n QueryList,\n ViewChildren\n} from '@angular/core';\nimport {MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatMenu, MatMenuTrigger} from '@angular/material/menu';\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 imports : [MatIconButton, MatMenuTrigger, MatIcon, MatMenu, ErrorMessageComponent]\n})\nexport class ErrorComponent extends BaseComponent implements OnInit {\n private readonly errorCollector = inject(ErrorCollectorService);\n private readonly authProvider = inject<AuthProvider>(AUTH_PROVIDER, {optional: true});\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n\n public state: 'active' | 'newError' | null = null;\n\n @Input() public keepVisibleOnClick?: boolean;\n @ViewChildren(ErrorMessageComponent)\n public errorMessages?: QueryList<ErrorMessageComponent>;\n private readonly _errors: ErrorMessageWrapper[] = [];\n private readonly _menuState: Subject<boolean> = new Subject();\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 get errors(): ErrorMessageWrapper[] {\n return this._errors;\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 public menuOpened(): void {\n this._menuState.next(true);\n }\n\n public menuClosed(): void {\n this._menuState.next(false);\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 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 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","@if (state != null) {\n <button\n #errorMenuTrigger=\"matMenuTrigger\"\n (@buttonState.done)=\"animationDone($event)\"\n (menuClosed)=\"menuClosed()\"\n (menuOpened)=\"menuOpened()\"\n [@buttonState]=\"state\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\"\n [color]=\"color\"\n [matMenuTriggerFor]=\"errorMenu\"\n mat-icon-button\n type=\"button\">\n <mat-icon>error_outline</mat-icon>\n </button>\n}\n\n<mat-menu #errorMenu=\"matMenu\"\n [overlapTrigger]=\"false\"\n class=\"risk-error-menu-mat-menu\">\n @for (error of errors; track error; let isLast = $last) {\n <risk-error-message\n (click)=\"keepVisibleOnClick ? $event.stopPropagation() : null\"\n [error]=\"error\"\n [isLast]=\"isLast\"/>\n }\n</mat-menu>\n","import {ErrorHandler, Provider} from '@angular/core';\nimport {ErrorCollectorService} from './error.collector';\n\nexport function provideErrorHandler(): Provider[] {\n return [\n {\n provide : ErrorHandler,\n useExisting: ErrorCollectorService\n }\n ];\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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"}
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.handler.provider.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} 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({providedIn: 'root'})\nexport class ErrorCollectorService extends ErrorHandler {\n\n private _errorObservable: ReplaySubject<ErrorMessage> = new ReplaySubject(10);\n\n public constructor() {\n super();\n\n const authProvider = inject<AuthProvider>(AUTH_PROVIDER, {optional: true});\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 {DatePipe} from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n inject,\n Injector,\n input,\n signal,\n WritableSignal\n} from '@angular/core';\nimport {\n MatCard,\n MatCardAvatar,\n MatCardContent,\n MatCardHeader,\n MatCardSubtitle,\n MatCardTitle\n} from '@angular/material/card';\nimport {MatIcon} from '@angular/material/icon';\nimport {DATE_FORMAT} from '@dbg-riskit/angular-common';\nimport {ErrorMessageWrapper} from './error.message.wrapper';\n\n@Component({\n selector : 'risk-error-message',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl : 'error.message.component.html',\n styleUrls : ['../../../component.scss', 'error.message.component.scss'],\n host : {'[class.risk-error-message]': 'true'},\n imports : [\n DatePipe,\n MatCard,\n MatCardAvatar,\n MatCardContent,\n MatCardHeader,\n MatCardSubtitle,\n MatCardTitle,\n MatIcon\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({background: 'transparent'}),\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})\nexport class RiskErrorMessageComponent {\n readonly dateFormat = inject(DATE_FORMAT);\n private injector = inject(Injector);\n\n public readonly readState: WritableSignal<'read' | null> = signal(null);\n public readonly error = input.required<ErrorMessageWrapper>();\n public readonly isLast = input(false);\n\n public animate(): void {\n const err = this.error();\n if (!err.read() && this.readState() !== 'read') {\n afterNextRender(() => this.readState.set('read'), {injector: this.injector});\n }\n }\n\n public markRead(event: AnimationEvent): void {\n const err = this.error();\n if (err && event.toState === 'read') {\n err.markRead();\n }\n }\n}\n","<mat-card (@readState.done)=\"markRead($event)\" [@readState]=\"readState()\" [class.risk-error-message-last]=\"isLast()\">\n @let err = error();\n <mat-card-header>\n <mat-icon color=\"warn\" mat-card-avatar>error_outline</mat-icon>\n @if (err.type.isNetworkError()) {\n <mat-card-title>Network error</mat-card-title>\n }\n @if (err.type.isRequestError()) {\n <mat-card-title>API error</mat-card-title>\n }\n @if (err.type.isAuthError()) {\n <mat-card-title>Authorization error</mat-card-title>\n }\n @if (!err.type.isNetworkError() && !err.type.isRequestError() && !err.type.isAuthError()) {\n <mat-card-title>General error</mat-card-title>\n }\n <mat-card-subtitle>{{ err.date | date:dateFormat }}</mat-card-subtitle>\n </mat-card-header>\n <mat-card-content>\n @if (err.statusCode) {\n <p class=\"risk-error-message-code\">Error code: {{ err.statusCode }}</p>\n }\n <p> {{ err.message }} </p>\n </mat-card-content>\n</mat-card>\n","import {signal} from '@angular/core';\nimport {ErrorMessage, ErrorType} from '@dbg-riskit/common';\n\nexport class ErrorMessageWrapper {\n private readonly _error: ErrorMessage;\n private readonly _date: Date = new Date();\n public readonly read = signal(false);\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 markRead(): void {\n if (!this.read()) {\n this.read.set(true);\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 Component,\n computed,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChildren\n} from '@angular/core';\nimport {toSignal} from '@angular/core/rxjs-interop';\nimport {MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatMenu, MatMenuTrigger} from '@angular/material/menu';\nimport {AUTH_PROVIDER, intervalSignal, MatColorTheme} from '@dbg-riskit/angular-common';\nimport {AuthProvider} from '@dbg-riskit/common';\nimport {ErrorCollectorService} from './error.collector';\nimport {RiskErrorMessageComponent} 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 changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl : 'error.menu.component.html',\n styleUrls : [\n '../../../component.scss',\n 'error.menu.component.scss'\n ],\n host : {\n '[class.risk-error-menu]': 'true'\n },\n imports : [\n MatIcon,\n MatIconButton,\n MatMenu,\n MatMenuTrigger,\n RiskErrorMessageComponent\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})\nexport class RiskErrorComponent {\n private readonly errorCollector = inject(ErrorCollectorService);\n private readonly authProvider = inject<AuthProvider>(AUTH_PROVIDER, {optional: true});\n\n public readonly state = signal<'active' | 'newError' | null>(null);\n public readonly keepVisibleOnClick = input<boolean>();\n public readonly errorMessages = viewChildren(RiskErrorMessageComponent);\n\n private readonly lastErrorFromCollector = toSignal(this.errorCollector.errorStream);\n private readonly authenticated = this.authProvider == null\n ? signal(true)\n : toSignal(this.authProvider.loggedInStream, {initialValue: false});\n\n private _errors: ErrorMessageWrapper[] = [];\n public readonly errors = computed(() => {\n if (!this.authenticated()) {\n this._errors = [];\n return this._errors;\n }\n const lastError = this.lastErrorFromCollector();\n if (!lastError) {\n return this._errors;\n }\n\n const errorMessageWrapper = new ErrorMessageWrapper(lastError);\n this._errors.unshift(errorMessageWrapper);\n while (this._errors.length > 10) {\n this._errors.pop();\n }\n\n return [...this._errors];\n });\n\n public readonly color = computed((): MatColorTheme => {\n for (const error of this.errors()) {\n if (!error.read()) {\n return 'warn';\n }\n }\n return null;\n });\n\n public readonly menuOpened = signal(false);\n\n constructor() {\n effect(() => {\n if (this.menuOpened()) {\n for (const message of this.errorMessages()) {\n message.animate();\n }\n }\n });\n\n const timerSignal = intervalSignal(100, 2000);\n effect(() => {\n timerSignal();\n\n let animate = false;\n for (const error of untracked(this.errors)) {\n if (!error.read()) {\n animate = true;\n break;\n }\n }\n\n if (animate) {\n switch (untracked(this.state)) {\n case null:\n this.state.set('active');\n break;\n case 'active':\n this.state.set('newError');\n break;\n }\n }\n });\n }\n\n public animationDone(event: AnimationEvent): void {\n if (event.toState === 'newError') {\n this.state.set('active');\n }\n }\n}\n","@if (state() != null) {\n <button\n #errorMenuTrigger=\"matMenuTrigger\"\n (@buttonState.done)=\"animationDone($event)\"\n [@buttonState]=\"state()\"\n (menuClosed)=\"menuOpened.set(false)\"\n (menuOpened)=\"menuOpened.set(true)\"\n [class.risk-menu-open]=\"errorMenuTrigger.menuOpen\"\n [color]=\"color()\"\n [matMenuTriggerFor]=\"errorMenu\"\n mat-icon-button\n type=\"button\">\n <mat-icon>error_outline</mat-icon>\n </button>\n}\n\n<mat-menu #errorMenu=\"matMenu\"\n [overlapTrigger]=\"false\"\n class=\"risk-error-menu-mat-menu\">\n @for (error of errors(); track error; let isLast = $last) {\n <risk-error-message\n (click)=\"keepVisibleOnClick() ? $event.stopPropagation() : null\"\n [error]=\"error\"\n [isLast]=\"isLast\"/>\n }\n</mat-menu>\n","import {ErrorHandler, Provider} from '@angular/core';\nimport {ErrorCollectorService} from './error.collector';\n\nexport function provideErrorHandler(): Provider[] {\n return [\n {\n provide : ErrorHandler,\n useExisting: ErrorCollectorService\n }\n ];\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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"}
package/index.d.ts CHANGED
@@ -1,10 +1,9 @@
1
- import * as i0 from '@angular/core';
2
- import { ErrorHandler, EventEmitter, OnInit, QueryList, Provider } from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
+ import { ErrorHandler, WritableSignal, Provider } from '@angular/core';
3
3
  import { ErrorMessage, ErrorType } from '@dbg-riskit/common';
4
4
  import { Observable, MonoTypeOperatorFunction } from 'rxjs';
5
5
  import { AnimationEvent, AnimationAnimateMetadata } from '@angular/animations';
6
6
  import { MatColorTheme } from '@dbg-riskit/angular-common';
7
- import { BaseComponent } from '@dbg-riskit/angular-view';
8
7
 
9
8
  type ErrorTypes = ErrorMessage | Error | object | string;
10
9
  declare function toErrorMessage(err: ErrorTypes): ErrorMessage;
@@ -15,59 +14,51 @@ declare class ErrorCollectorService extends ErrorHandler {
15
14
  get errorStream(): Observable<ErrorMessage>;
16
15
  handleError(err: ErrorTypes): void;
17
16
  handleStreamError<T>(err: ErrorTypes): Observable<T>;
18
- static ɵfac: i0.ɵɵFactoryDeclaration<ErrorCollectorService, never>;
19
- static ɵprov: i0.ɵɵInjectableDeclaration<ErrorCollectorService>;
17
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ErrorCollectorService, never>;
18
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ErrorCollectorService>;
20
19
  }
21
20
 
22
21
  declare class ErrorMessageWrapper {
23
22
  private readonly _error;
24
23
  private readonly _date;
25
- private _read;
26
- readonly readStateChanged: EventEmitter<boolean>;
24
+ readonly read: _angular_core.WritableSignal<boolean>;
27
25
  constructor(error: ErrorMessage);
28
26
  get message(): string;
29
27
  get type(): ErrorType;
30
28
  get statusCode(): number;
31
29
  get date(): Date;
32
- get read(): boolean;
33
30
  markRead(): void;
34
31
  }
35
32
 
36
- declare class ErrorMessageComponent {
33
+ declare class RiskErrorMessageComponent {
37
34
  readonly dateFormat: string;
38
- private readonly changeDetectorRef;
39
- readState: 'read' | null;
40
- error?: ErrorMessageWrapper;
41
- isLast: boolean;
35
+ private injector;
36
+ readonly readState: WritableSignal<'read' | null>;
37
+ readonly error: _angular_core.InputSignal<ErrorMessageWrapper>;
38
+ readonly isLast: _angular_core.InputSignal<boolean>;
42
39
  animate(): void;
43
40
  markRead(event: AnimationEvent): void;
44
- static ɵfac: i0.ɵɵFactoryDeclaration<ErrorMessageComponent, never>;
45
- static ɵcmp: i0.ɵɵComponentDeclaration<ErrorMessageComponent, "risk-error-message", never, { "error": { "alias": "error"; "required": false; }; "isLast": { "alias": "isLast"; "required": false; }; }, {}, never, never, true, never>;
41
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RiskErrorMessageComponent, never>;
42
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RiskErrorMessageComponent, "risk-error-message", never, { "error": { "alias": "error"; "required": true; "isSignal": true; }; "isLast": { "alias": "isLast"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
46
43
  }
47
44
 
48
45
  declare const JIGGLE_ANIMATION: AnimationAnimateMetadata;
49
- declare class ErrorComponent extends BaseComponent implements OnInit {
46
+ declare class RiskErrorComponent {
50
47
  private readonly errorCollector;
51
48
  private readonly authProvider;
52
- private readonly changeDetectorRef;
53
- state: 'active' | 'newError' | null;
54
- keepVisibleOnClick?: boolean;
55
- errorMessages?: QueryList<ErrorMessageComponent>;
56
- private readonly _errors;
57
- private readonly _menuState;
58
- get color(): MatColorTheme;
59
- get errors(): ErrorMessageWrapper[];
60
- ngOnInit(): void;
61
- menuOpened(): void;
62
- menuClosed(): void;
49
+ readonly state: _angular_core.WritableSignal<"active" | "newError" | null>;
50
+ readonly keepVisibleOnClick: _angular_core.InputSignal<boolean | undefined>;
51
+ readonly errorMessages: _angular_core.Signal<readonly RiskErrorMessageComponent[]>;
52
+ private readonly lastErrorFromCollector;
53
+ private readonly authenticated;
54
+ private _errors;
55
+ readonly errors: _angular_core.Signal<ErrorMessageWrapper[]>;
56
+ readonly color: _angular_core.Signal<MatColorTheme>;
57
+ readonly menuOpened: _angular_core.WritableSignal<boolean>;
58
+ constructor();
63
59
  animationDone(event: AnimationEvent): void;
64
- private animateOnMenuOpened;
65
- private loggedInChanged;
66
- private subscribeToErrors;
67
- private errorReceived;
68
- private initAnimation;
69
- static ɵfac: i0.ɵɵFactoryDeclaration<ErrorComponent, never>;
70
- static ɵcmp: i0.ɵɵComponentDeclaration<ErrorComponent, "risk-error-menu", never, { "keepVisibleOnClick": { "alias": "keepVisibleOnClick"; "required": false; }; }, {}, never, never, true, never>;
60
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RiskErrorComponent, never>;
61
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RiskErrorComponent, "risk-error-menu", never, { "keepVisibleOnClick": { "alias": "keepVisibleOnClick"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
71
62
  }
72
63
 
73
64
  declare function provideErrorHandler(): Provider[];
@@ -79,5 +70,5 @@ declare function provideErrorHandler(): Provider[];
79
70
  */
80
71
  declare function collectErrors<T>(errorCollector: ErrorCollectorService, otherwise: T): MonoTypeOperatorFunction<T>;
81
72
 
82
- export { ErrorCollectorService, ErrorComponent, JIGGLE_ANIMATION, collectErrors, provideErrorHandler, toErrorMessage };
73
+ export { ErrorCollectorService, JIGGLE_ANIMATION, RiskErrorComponent, collectErrors, provideErrorHandler, toErrorMessage };
83
74
  export type { ErrorTypes };
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@dbg-riskit/angular-error",
3
- "version": "20.0.1",
3
+ "version": "20.1.0",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "peerDependencies": {
6
- "@angular/common": "^20.3.12",
7
- "@angular/animations": "^20.3.12",
8
- "@angular/core": "^20.3.12",
9
- "@dbg-riskit/common": "~20.0.1",
10
- "@dbg-riskit/angular-common": "~20.0.1",
11
- "@dbg-riskit/angular-view": "~20.0.1",
6
+ "@angular/common": "^20.3.15",
7
+ "@angular/animations": "^20.3.15",
8
+ "@angular/core": "^20.3.15",
9
+ "@dbg-riskit/common": "~20.1.0",
10
+ "@dbg-riskit/angular-common": "~20.1.0",
11
+ "@dbg-riskit/angular-view": "~20.1.0",
12
12
  "rxjs": "~7.8.2"
13
13
  },
14
14
  "dependencies": {