http-request-manager 4.1.7 → 15.0.9

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 (34) hide show
  1. package/README.md +173 -66
  2. package/esm2022/lib/file-downloader-action/download-action/download-action.component.mjs +79 -0
  3. package/esm2022/lib/file-downloader-action/file-download-action.component.mjs +78 -0
  4. package/esm2022/lib/file-downloader-action/file-download-action.module.mjs +42 -0
  5. package/esm2022/lib/file-downloader-action/models/download-labels-model.mjs +11 -0
  6. package/esm2022/lib/{http-request-services-demo/request-manager-demo/file-downloader → file-downloader-action}/spinner/spinner.component.mjs +1 -1
  7. package/esm2022/lib/http-request-manager.module.mjs +14 -14
  8. package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +5 -5
  9. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +5 -5
  10. package/esm2022/lib/interceptors/request-error.interceptor.mjs +2 -2
  11. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +2 -2
  12. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +1 -1
  13. package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +1 -1
  14. package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +163 -27
  15. package/fesm2022/http-request-manager.mjs +663 -535
  16. package/fesm2022/http-request-manager.mjs.map +1 -1
  17. package/http-request-manager-15.0.9.tgz +0 -0
  18. package/lib/file-downloader-action/download-action/download-action.component.d.ts +26 -0
  19. package/lib/file-downloader-action/file-download-action.component.d.ts +22 -0
  20. package/lib/file-downloader-action/file-download-action.module.d.ts +13 -0
  21. package/lib/http-request-manager.module.d.ts +10 -10
  22. package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +1 -1
  23. package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +12 -1
  24. package/package.json +3 -21
  25. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +0 -80
  26. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +0 -42
  27. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +0 -85
  28. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +0 -11
  29. package/http-request-manager-4.1.7.tgz +0 -0
  30. package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +0 -26
  31. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +0 -13
  32. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +0 -26
  33. /package/lib/{http-request-services-demo/request-manager-demo/file-downloader → file-downloader-action}/models/download-labels-model.d.ts +0 -0
  34. /package/lib/{http-request-services-demo/request-manager-demo/file-downloader → file-downloader-action}/spinner/spinner.component.d.ts +0 -0
package/README.md CHANGED
@@ -1,98 +1,205 @@
1
- # Request Manager Service Module
1
+ # Request Manager Service Documentation
2
2
 
3
- This library has 4 main services that simplify http requests, http request state and local storage states.
3
+ ## Summary of the Lib
4
+ The HTTPManagerService is designed to handle HTTP requests and return Observables, providing an efficient and streamlined way to interact with external APIs or services in your Angular application. This service can be imported and used directly or extended to suit your specific needs.
4
5
 
5
- Here is an example:
6
+ ## Required Configuration
6
7
 
7
- In this example we want to GET data from this URL with the following query params:
8
- `http://localhost:4200/assets/as/auth/1234/users?sortBy=asc`
8
+ App.module.ts add the following providers - AppService
9
+ This will allow the `http-request-manager` to use the app-id you assign as a encryption/decryption key for the `local-storage-manager`
9
10
 
10
- Setup the options
11
+ ```
12
+ {
13
+ provide: APP_ID,
14
+ useValue: '561324eb4fadb840330cd5ac4db67bef', // Replace with your unique application ID
15
+ },
16
+ AppService
17
+ ```
18
+
19
+ ## Features of the Lib
20
+ ### Error Handling
21
+ The example defines an errorRetry$ observable that captures errors using the catchError operator and enables retry logic. This observable can be utilized in your component templates to handle and display errors, making error management more flexible.
22
+
23
+ ### ApiRequest Configuration
24
+ The ApiRequest object encapsulates all the necessary details for making an HTTP request:
11
25
 
12
26
  ```ts
13
- const reqParams = ApiRequest.adapt({
14
- server: 'http://localhost:4200/assets', // baseUrl
15
- path: ['as', 'auth'], // additional paths you want to add
16
- polling: 30, //make same request every 30s
17
- retry: { times: 3, delay: 3 }, // retry 3 times spacing next the retry by 3 seconds
18
- displayError: true // display toast if error occurs
19
- adapter: ClientInfo.adpat // Client Model/Adapter class
20
- })
27
+ apiRequest = ApiRequest.adapt({
28
+ server: 'nodebff/reporting-common-apis/v1',
29
+ path: ['dimensions','locations'],
30
+ adapter: DistrictData.adapt
31
+ });
21
32
  ```
22
- Now we use the base configs made above and when we make the request we want to add an `userId` which contains `1234` and path `'/users'`
23
- We also want to add query params to the request `{ sortBy: 'asc'}` which will be 'sortBy=asc'
33
+
34
+ ### ApiRequest Options
35
+ The following are the available options when configuring an ApiRequest object:
24
36
 
25
37
  ```ts
26
- this.data$ = this.httpManagerService.getRequest<ClientInfo[]>(reqParams, [userId, 'users', { sortBy: 'asc' }])
38
+ apiRequest = ApiRequest.adapt({
39
+ server: string,
40
+ path: any[],
41
+ headers: any,
42
+ adapter?: any,
43
+ mapper?: any,
44
+ polling?: number, // in seconds (undefined | 0 = none)
45
+ retry: RetryOptions,
46
+ stream?: boolean
47
+ displayError: boolean
48
+ });
27
49
  ```
28
50
 
29
- This returns an Observable which you then can implement it in your template as
51
+ - server: The base URL or service endpoint for the API request.
52
+ - path: Additional paths to append to the base URL for constructing the full API endpoint.
53
+ - headers: Custom headers to include in the request, provided as an object.
54
+ - adapter (incoming): A model adapter used to transform incoming data (e.g., DistrictData.adapt).
55
+ - mapper (outgoing): A model adapter used to map outgoing data before sending it to the server (e.g., DistrictData.mapper).
56
+ - polling: Enables periodic polling, where the request will be made every specified number of seconds.
57
+ - retry: Retry logic using RetryOptions, which includes:
58
+ - times: Number of retry attempts.
59
+ - delay: Delay in milliseconds between each retry.
60
+ - stream: A flag to indicate whether the request expects a stream of data from the server.
61
+ - displayError: A flag to indicate whether to present the error from the request in a snackBar notification
62
+
63
+ ### Additional Observables for Request Status
64
+ - countdown$: If polling is active, this property gives feedback on when the next request will take place. It starts from the specified time in seconds and counts down to 0, triggering the next request and restarting the countdown.
65
+ - error$: This returns any HTTP error that occurs during the request.
66
+ - isPending$: This boolean value indicates whether the request is pending (true) or has been completed (false).
67
+ - data$: You can access the data fetched in the request using the data$ observable. This provides the response from the server, which can be used for further processing or displaying in the UI.
68
+
69
+ ## Usage
70
+ To utilize the HTTPManagerService, you must import it into your service or component. Alternatively, you can extend the service by defining the required generic type for custom implementations.
71
+
72
+ ### Import Example #1
30
73
 
31
- `{{ (data$ | async) | json }}`
74
+ ```ts
75
+ import { HTTPManagerService } from 'path-to-service';
76
+
77
+ // Injecting HTTPManagerService in a Service
32
78
 
33
- ## Overview
79
+ export class DistrictService {
80
+
81
+ httpManagerService = inject(HTTPManagerService);
34
82
 
35
- 1) [HttpRequestManager](./src/lib/services/request-manager-services/README.md) (service): This service provides http requests (CRUD operations) and file download, with or without streaming.
83
+ private errorRetry = new BehaviorSubject<{ func: Function, message: string } | null>(null);
84
+ errorRetry$ = this.errorRetry.asObservable();
36
85
 
37
- 2) [HttpRequestStateManager](./src/lib/services/request-manager-state-service/README.md) (service): This service manages HTTP requests by maintaining state, eliminating the need to construct separate API calls for POST, PUT, and DELETE operations. It uses a GET request to retrieve an array of items and applies standard REST rules to update the state. When the state changes—either by adding a new record or modifying an existing one—the service automatically performs the appropriate POST, PUT, or DELETE requests without requiring explicit API calls.
86
+ apiRequest = ApiRequest.adapt({
87
+ server: 'nodebff/reporting-common-apis/v1',
88
+ path: ['dimensions','locations'],
89
+ adapter: DistrictData.adapt
90
+ });
38
91
 
39
- 3) [LocalStorageManager](./src/lib/services/local-storage-manager-service/README.md) (service): Enables the storage of data object structures in either localStorage or sessionStorage, maintaining an updated state to reflect storage changes. This approach eliminates the need to manually serialize and deserialize data structures using JSON.stringify and JSON.parse, streamlining data handling. By synchronizing state with storage updates, the service ensures immediate availability of the current state without relying on timers, thereby preventing potential side effects associated with delayed storage operations.
92
+ params = {
93
+ type: 'DISTRICT',
94
+ excludeEcom: true
95
+ };
40
96
 
41
- 4) [DatabaseManagerService](./src/lib/services/database-manager-services/README.md) (beta): This extends the `Http-Request-State-Manager` with persistent storage using `DexieJS`, a minimalistic wrapper for IndexedDB (local browser DB). This service defines a table linked to HTTP requests, storing the retrieved data locally. Upon subsequent requests, the `Http-Request-State-Manager` checks the local database first; if the data is absent, it proceeds with the HTTP request. This approach reduces redundant HTTP requests, enhances application responsiveness, and enables offline functionality without requiring an internet connection.
97
+ fetchDistrictData(params = this.params) {
42
98
 
43
- 5) [Interceptors](./src/lib/interceptors/README.md): General interceptors that may be applied to the providers for requests.
44
- This includes:
99
+ return this.httpManagerService.getRequest(this.apiRequest, [params])
100
+ .pipe(
101
+ catchError((error: HttpErrorResponse) => {
102
+
103
+ // custom retry logic
104
+ const func = this.fetchDistrictData.bind(this);
105
+ const message = error.message;
106
+ this.errorRetry.next({ func, message });
45
107
 
46
- - credentials - adds the { credentials: true } options for secure cookies to be persistent
47
- - proxy-debugger for debugging api requests
48
- - request-error for catching all requests the error with 400-500 status and presents a toast-message (snackbar) with the error
49
- - request-header provides a few properties that are added to all requests
108
+ return EMPTY;
109
+ })
110
+ );
50
111
 
51
- - 'Content-Type': 'application/json', // BE header for json type requests
52
- - 'Accept-Language': this.language || 'en-CA', //language localization
53
- - 'Current-Date': this.currentDate //todays date
54
- Support: This allows for proxies to be used when requests are made that are defined.
112
+ }
113
+
114
+ }
115
+ ```
55
116
 
56
- 6) Demos available for all the above that demonstrate all functionality
117
+ ### Import Example #2
57
118
 
58
- - import `HttpRequestManagerModule`
59
- - add the selector `<app-http-request-services-demo></app-http-request-services-demo>` to a template
60
- - explore the many options - Top right menus toggles between the above services
119
+ In this new example:
61
120
 
62
- ## HttpServiceManager, HttpRequestStateManager and DatabaseManagerService Features:
121
+ - Extending HTTPManagerService:
122
+ The DistrictService extends the HTTPManagerService with a generic type of DistrictData, which allows for reusability and scalability. By extending, the fetchDistrictData method uses the getRequest function provided by the parent class to make the request.
123
+
124
+ - Function to Make the Request:
125
+ The fetchDistrictData() method calls the getRequest function and immediately subscribes to the result. Since it subscribes, the request is made and the result is handled within the data$ observable.
126
+ If an error occurs during the request, the error is caught using catchError. The errorRetry$ observable is updated with the error details, which can be handled in the component or template.
127
+
128
+ ```ts
129
+ fetchDistrictData() {
130
+
131
+ this.getRequest(this.apiRequest, [this.params])
132
+ .pipe(
133
+ catchError((error: HttpErrorResponse) => {
134
+
135
+ const func = this.fetchDistrictData.bind(this)
136
+ const message = error.message
137
+ this.errorRetry.next({ func, message })
138
+
139
+ return EMPTY
140
+ })
141
+ ).subscribe()
142
+
143
+ }
144
+ ```
145
+
146
+ ### Data Observable
147
+ The result of the request is stored in the data$ observable, which is inherited from the parent class (HTTPManagerService). This observable is connected to a component for further usage.
148
+
149
+ ### Component Example
150
+ In the component, the data fetched by fetchDistrictData() can be accessed by assigning the result to data$, like this:
151
+
152
+ ```ts
153
+ this.data$ = this.awardsFilterStoresService.fetchData(this.payload)
154
+ ```
155
+
156
+ This data$ observable is then used in the template to display the data asynchronously:
157
+
158
+ ```html
159
+ <div *ngIf="data$ | async as data">
160
+ <!-- Use data here -->
161
+ </div>
162
+ ```
163
+
164
+ By extending the HTTPManagerService, you benefit from reusable request logic and observables that provide seamless integration with Angular components and templates.
165
+
166
+
167
+ # Interceptors
168
+
169
+ There are 3 interceptors that you can import into your project for api requests.
170
+
171
+ You may add these interceptors in your `AppModule` file as providers and import them into as providers.
172
+
173
+ ```ts
174
+ providers: [
175
+ { provide: HTTP_INTERCEPTORS, useClass: WithCredentialsInterceptor, multi: true },
176
+ { provide: HTTP_INTERCEPTORS, useClass: RequestHeadersInterceptor, multi: true },
177
+ { provide: HTTP_INTERCEPTORS, useClass: RequestErrorInterceptor, multi: true }
178
+ ],
179
+ ```
63
180
 
64
- - Identical initialization in usage making it easy to migrate from one type to another
65
- - Unification of features for both `HttpServiceManager` and `HttpRequestStateManager`
66
- - DatabaseManagerService automatically extends `HttpRequestStateManager` service
181
+ Or you can use all intercepts above by importing the `HttpRequestManagerModule` in your `AppModule`
67
182
 
68
- ### Options
183
+ - **RequestErrorInterceptor**
69
184
 
70
- - Supports CRUD operations
71
- - Rest and Query Param support
72
- - State Management (ComponentStore),
73
- - Recursive Pagination request caching
74
- - Local Database to manager data request states and requests (beta)
75
- - Streaming requests (AI)
76
- - Polling, Next Poll Countdown request %
77
- - Error Catching and Toast-Display on error
78
- - Request Retry
79
- - Pending Request States
80
- - Downloading File and Streaming Support
185
+ This interceptor handles errors of type 400 and 500. This interceptor is applicable when you need to display UI for the user to indicate a server or request error has occurred. The Status and Error Text is displayed in a `toast-message` modal.
81
186
 
82
- ## LocalStorageManager Features
187
+ - **WithCredentialsInterceptor**
83
188
 
84
- - Supports both local storage and session storage
85
- - Observable to maintain changes in storage
189
+ Adds to your request header
86
190
 
87
- ### Features:
191
+ ```json
192
+ { credentials: true }
193
+ ```
88
194
 
89
- - Encryption
90
- - ExpiredIn
91
- - Updating, Deleting, Creating
92
- - Supports data objects (no JSON.stringify or JSON.parse)
195
+ - **RequestHeadersInterceptor**
93
196
 
94
- ## Advanced Topics
197
+ Adds to your request - current local `language` (i18n) selection and `current date` to every request
95
198
 
96
- 1) [Proxy-Config](./README/INTERCEPTORS_README.md)
97
- 2) [Module.forRoot()](./README/FORROOT_README.md) Module.forRoot() Configuration for Defaults
98
- 3) [Adapter-Models](./README/ADAPTERS_README.md) Pattern - Strong Types
199
+ ```json
200
+ {
201
+ 'Content-Type': 'application/json',
202
+ 'Accept-Language': this.language || 'en-CA',
203
+ 'Current-Date': this.currentDate
204
+ }
205
+ ```
@@ -0,0 +1,79 @@
1
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
2
+ import { Subscription, timer } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/material/icon";
6
+ import * as i3 from "@angular/material/progress-spinner";
7
+ import * as i4 from "@angular/material/button";
8
+ export class DownloaderActionComponent {
9
+ constructor() {
10
+ this.subscriptions = new Subscription();
11
+ this.displayError = 3; // seconds
12
+ this.diameter = 32;
13
+ this.mode = 'determinate';
14
+ this.isPending = false;
15
+ this.active = false;
16
+ this.disabled = false;
17
+ this.error = new EventEmitter();
18
+ this._progress = 0;
19
+ this._hasError = false;
20
+ this.errorTimerActive = false;
21
+ }
22
+ set progress(value) {
23
+ this._progress = value ?? 0;
24
+ }
25
+ get progress() {
26
+ return this._progress;
27
+ }
28
+ set hasError(value) {
29
+ this._hasError = !!value;
30
+ if (this._hasError && !this.errorTimerActive) {
31
+ this.errorTimerActive = true;
32
+ this.error.emit();
33
+ this.subscriptions.add(timer(this.displayError * 1000)
34
+ .subscribe((err) => {
35
+ this._hasError = false;
36
+ this.errorTimerActive = false;
37
+ }));
38
+ }
39
+ }
40
+ get hasError() {
41
+ return this._hasError;
42
+ }
43
+ ngOnInit() { }
44
+ onAction() {
45
+ this.isPending = false;
46
+ if (this.event)
47
+ this.event();
48
+ }
49
+ ngOnDestroy() {
50
+ this.subscriptions.unsubscribe();
51
+ }
52
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DownloaderActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
53
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DownloaderActionComponent, selector: "app-downloader-action", inputs: { event: "event", displayError: "displayError", diameter: "diameter", mode: "mode", isPending: "isPending", active: "active", disabled: "disabled", progress: "progress", hasError: "hasError" }, outputs: { error: "error" }, ngImport: i0, template: "<ng-container *ngIf=\"!isPending; else DOWNLOADING\">\n <ng-container *ngIf=\"hasError; else NORMAL\">\n <div class=\"width center-txt\" style=\"margin-bottom: 4px;\">\n <mat-icon color=\"warn\" class=\"warn-icon\">warning</mat-icon>\n </div>\n </ng-container>\n <ng-template #NORMAL>\n <ng-container *ngIf=\"active; else ACTION\">\n\n <div class=\"container-obj\">\n <div class=\"centered-obj-div\">\n <mat-progress-spinner\n color=\"primary\"\n mode=\"indeterminate\"\n [diameter]=\"44\"\n ></mat-progress-spinner>\n </div>\n </div>\n\n </ng-container>\n <ng-template #ACTION>\n <button data-tracking=\"export-btn\" mat-icon-button (click)=\"onAction()\" class=\"icon-button\" [disabled]=\"disabled\">\n <mat-icon class=\"custom-icon\">file_download</mat-icon>\n </button>\n </ng-template>\n </ng-template>\n</ng-container>\n\n<ng-template #DOWNLOADING>\n <div\n class=\"spinner-container\"\n *ngIf=\"(progress > 0 && progress < 100); else INDETERMINATE\"\n >\n <div class=\"spinner-background\">\n {{progress}}%\n </div>\n <mat-progress-spinner\n color=\"primary\"\n [mode]=\"mode\"\n [value]=\"progress\"\n [diameter]=\"44\"\n ></mat-progress-spinner>\n </div>\n <ng-template #INDETERMINATE>\n <div class=\"container-obj\">\n <div class=\"centered-obj-div\">\n <mat-progress-spinner\n color=\"primary\"\n mode=\"indeterminate\"\n [diameter]=\"44\"\n ></mat-progress-spinner>\n </div>\n </div>\n </ng-template>\n\n</ng-template>\n\n\n\n\n", styles: [":not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:44px;height:44px;font-size:12px;line-height:32px;text-align:center;overflow:hidden;border-radius:50%;border:solid 5px whitesmoke}.center-txt{align-content:center;text-align:-webkit-center}.width{width:48px;height:48px}.icon-button{display:flex;align-items:center;justify-content:center;width:48px;height:48px;padding:0}.container-obj{display:flex;justify-content:center;align-items:center;width:48px;height:48px}.centered-obj-div{text-align:center}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], encapsulation: i0.ViewEncapsulation.None }); }
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DownloaderActionComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: 'app-downloader-action', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"!isPending; else DOWNLOADING\">\n <ng-container *ngIf=\"hasError; else NORMAL\">\n <div class=\"width center-txt\" style=\"margin-bottom: 4px;\">\n <mat-icon color=\"warn\" class=\"warn-icon\">warning</mat-icon>\n </div>\n </ng-container>\n <ng-template #NORMAL>\n <ng-container *ngIf=\"active; else ACTION\">\n\n <div class=\"container-obj\">\n <div class=\"centered-obj-div\">\n <mat-progress-spinner\n color=\"primary\"\n mode=\"indeterminate\"\n [diameter]=\"44\"\n ></mat-progress-spinner>\n </div>\n </div>\n\n </ng-container>\n <ng-template #ACTION>\n <button data-tracking=\"export-btn\" mat-icon-button (click)=\"onAction()\" class=\"icon-button\" [disabled]=\"disabled\">\n <mat-icon class=\"custom-icon\">file_download</mat-icon>\n </button>\n </ng-template>\n </ng-template>\n</ng-container>\n\n<ng-template #DOWNLOADING>\n <div\n class=\"spinner-container\"\n *ngIf=\"(progress > 0 && progress < 100); else INDETERMINATE\"\n >\n <div class=\"spinner-background\">\n {{progress}}%\n </div>\n <mat-progress-spinner\n color=\"primary\"\n [mode]=\"mode\"\n [value]=\"progress\"\n [diameter]=\"44\"\n ></mat-progress-spinner>\n </div>\n <ng-template #INDETERMINATE>\n <div class=\"container-obj\">\n <div class=\"centered-obj-div\">\n <mat-progress-spinner\n color=\"primary\"\n mode=\"indeterminate\"\n [diameter]=\"44\"\n ></mat-progress-spinner>\n </div>\n </div>\n </ng-template>\n\n</ng-template>\n\n\n\n\n", styles: [":not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:44px;height:44px;font-size:12px;line-height:32px;text-align:center;overflow:hidden;border-radius:50%;border:solid 5px whitesmoke}.center-txt{align-content:center;text-align:-webkit-center}.width{width:48px;height:48px}.icon-button{display:flex;align-items:center;justify-content:center;width:48px;height:48px;padding:0}.container-obj{display:flex;justify-content:center;align-items:center;width:48px;height:48px}.centered-obj-div{text-align:center}\n"] }]
58
+ }], propDecorators: { event: [{
59
+ type: Input
60
+ }], displayError: [{
61
+ type: Input
62
+ }], diameter: [{
63
+ type: Input
64
+ }], mode: [{
65
+ type: Input
66
+ }], isPending: [{
67
+ type: Input
68
+ }], active: [{
69
+ type: Input
70
+ }], disabled: [{
71
+ type: Input
72
+ }], error: [{
73
+ type: Output
74
+ }], progress: [{
75
+ type: Input
76
+ }], hasError: [{
77
+ type: Input
78
+ }] } });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtYWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvZmlsZS1kb3dubG9hZGVyLWFjdGlvbi9kb3dubG9hZC1hY3Rpb24vZG93bmxvYWQtYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvZmlsZS1kb3dubG9hZGVyLWFjdGlvbi9kb3dubG9hZC1hY3Rpb24vZG93bmxvYWQtYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7OztBQVEzQyxNQUFNLE9BQU8seUJBQXlCO0lBTnRDO1FBUVUsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR2xDLGlCQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVTtRQUM1QixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsU0FBSSxHQUF3QixhQUFhLENBQUM7UUFDMUMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVuQyxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBU2QsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7S0FrQ2xDO0lBM0NDLElBQWEsUUFBUSxDQUFDLEtBQVU7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUtELElBQWEsUUFBUSxDQUFDLEtBQW9CO1FBRXhDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUV6QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDNUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7aUJBQzlCLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7SUFFSCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxRQUFRLEtBQUksQ0FBQztJQUViLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtRQUN0QixJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNsQyxDQUFDOytHQTFEVSx5QkFBeUI7bUdBQXpCLHlCQUF5QixvU0NWdEMsdW5EQTREQTs7NEZEbERhLHlCQUF5QjtrQkFOckMsU0FBUzsrQkFDRSx1QkFBdUIsaUJBR2xCLGlCQUFpQixDQUFDLElBQUk7OEJBTTVCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNO2dCQUdNLFFBQVE7c0JBQXBCLEtBQUs7Z0JBV08sUUFBUTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kb3dubG9hZGVyLWFjdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kb3dubG9hZC1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kb3dubG9hZC1hY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRG93bmxvYWRlckFjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIEBJbnB1dCgpIGV2ZW50PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIGRpc3BsYXlFcnJvciA9IDM7IC8vIHNlY29uZHNcbiAgQElucHV0KCkgZGlhbWV0ZXIgPSAzMjtcbiAgQElucHV0KCkgbW9kZTogUHJvZ3Jlc3NTcGlubmVyTW9kZSA9ICdkZXRlcm1pbmF0ZSc7XG4gIEBJbnB1dCgpIGlzUGVuZGluZyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGFjdGl2ZSA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBlcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBwcml2YXRlIF9wcm9ncmVzcyA9IDA7XG4gIEBJbnB1dCgpIHNldCBwcm9ncmVzcyh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSB2YWx1ZSA/PyAwO1xuICB9XG5cbiAgZ2V0IHByb2dyZXNzKCkge1xuICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcbiAgfVxuXG4gIHByaXZhdGUgX2hhc0Vycm9yID0gZmFsc2U7XG4gIHByaXZhdGUgZXJyb3JUaW1lckFjdGl2ZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHNldCBoYXNFcnJvcih2YWx1ZTogYm9vbGVhbiB8IGFueSkge1xuXG4gICAgdGhpcy5faGFzRXJyb3IgPSAhIXZhbHVlO1xuXG4gICAgaWYgKHRoaXMuX2hhc0Vycm9yICYmICF0aGlzLmVycm9yVGltZXJBY3RpdmUpIHtcbiAgICAgIHRoaXMuZXJyb3JUaW1lckFjdGl2ZSA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yLmVtaXQoKVxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgICAgdGltZXIodGhpcy5kaXNwbGF5RXJyb3IgKiAxMDAwKVxuICAgICAgICAuc3Vic2NyaWJlKChlcnIpID0+IHtcbiAgICAgICAgICB0aGlzLl9oYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZXJyb3JUaW1lckFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgfVxuXG4gIGdldCBoYXNFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5faGFzRXJyb3I7XG4gIH1cblxuICBuZ09uSW5pdCgpIHt9XG5cbiAgb25BY3Rpb24oKSB7XG4gICAgdGhpcy5pc1BlbmRpbmcgPSBmYWxzZVxuICAgIGlmICh0aGlzLmV2ZW50KSB0aGlzLmV2ZW50KClcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpXG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNQZW5kaW5nOyBlbHNlIERPV05MT0FESU5HXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNFcnJvcjsgZWxzZSBOT1JNQUxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2lkdGggY2VudGVyLXR4dFwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNHB4O1wiPlxuICAgICAgPG1hdC1pY29uIGNvbG9yPVwid2FyblwiIGNsYXNzPVwid2Fybi1pY29uXCI+d2FybmluZzwvbWF0LWljb24+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctdGVtcGxhdGUgI05PUk1BTD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlOyBlbHNlIEFDVElPTlwiPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyLW9ialwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2VudGVyZWQtb2JqLWRpdlwiPlxuICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgIG1vZGU9XCJpbmRldGVybWluYXRlXCJcbiAgICAgICAgICAgIFtkaWFtZXRlcl09XCI0NFwiXG4gICAgICAgICAgPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy10ZW1wbGF0ZSAjQUNUSU9OPlxuICAgIDxidXR0b24gZGF0YS10cmFja2luZz1cImV4cG9ydC1idG5cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cIm9uQWN0aW9uKClcIiBjbGFzcz1cImljb24tYnV0dG9uXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJjdXN0b20taWNvblwiPmZpbGVfZG93bmxvYWQ8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuICA8L25nLXRlbXBsYXRlPlxuICA8L25nLXRlbXBsYXRlPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjRE9XTkxPQURJTkc+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNwaW5uZXItY29udGFpbmVyXCJcbiAgICAqbmdJZj1cIihwcm9ncmVzcyA+IDAgJiYgcHJvZ3Jlc3MgPCAxMDApOyBlbHNlIElOREVURVJNSU5BVEVcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInNwaW5uZXItYmFja2dyb3VuZFwiPlxuICAgICAge3twcm9ncmVzc319JVxuICAgIDwvZGl2PlxuICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIFttb2RlXT1cIm1vZGVcIlxuICAgICAgW3ZhbHVlXT1cInByb2dyZXNzXCJcbiAgICAgIFtkaWFtZXRlcl09XCI0NFwiXG4gICAgPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgI0lOREVURVJNSU5BVEU+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1vYmpcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjZW50ZXJlZC1vYmotZGl2XCI+XG4gICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgICAgIFtkaWFtZXRlcl09XCI0NFwiXG4gICAgICAgID48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbjwvbmctdGVtcGxhdGU+XG5cblxuXG5cbiJdfQ==
@@ -0,0 +1,78 @@
1
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
2
+ import { catchError, distinctUntilChanged } from 'rxjs/operators';
3
+ import { DownloadLabels } from './models/download-labels-model';
4
+ import { ToastDisplay, ToastColors } from 'toast-message-display';
5
+ import { HTTPManagerService } from '../services/request-manager-services';
6
+ import { ApiRequest } from '../services/request-manager-state-service';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "./download-action/download-action.component";
9
+ import * as i2 from "@angular/common";
10
+ export class FileDownloadActionComponent extends HTTPManagerService {
11
+ set labels(value) {
12
+ this._labels = (value) ? DownloadLabels.adapt(value) : DownloadLabels.adapt();
13
+ }
14
+ get labels() {
15
+ return this._labels;
16
+ }
17
+ constructor() {
18
+ super();
19
+ this.delayError = 3;
20
+ this.apiRequest = ApiRequest.adapt();
21
+ this.displayErrorMessage = false;
22
+ this._labels = DownloadLabels.adapt();
23
+ this.active = false;
24
+ this.completed = new EventEmitter();
25
+ this.disabled = false;
26
+ }
27
+ ngOnInit() {
28
+ this.error$.subscribe((err) => {
29
+ console.log('err', err);
30
+ });
31
+ }
32
+ onDownloadStreaming() {
33
+ if (this.active)
34
+ return;
35
+ this.active = true;
36
+ return this.downloadRequest(this.apiRequest)
37
+ .pipe(distinctUntilChanged(), catchError((err) => {
38
+ this.onError(err.message);
39
+ return err;
40
+ })).subscribe((res) => {
41
+ if (res === 100) {
42
+ this.active = false;
43
+ this.completed.emit();
44
+ }
45
+ });
46
+ }
47
+ onError(message) {
48
+ if (!message || !this.displayErrorMessage)
49
+ return;
50
+ const display = ToastDisplay.adapt({
51
+ message,
52
+ action: 'Ok',
53
+ color: ToastColors.ERROR,
54
+ icon: 'error',
55
+ });
56
+ this.active = false;
57
+ this.toastMessage.toastMessage(display);
58
+ }
59
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloadActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
60
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FileDownloadActionComponent, selector: "app-file-downloader-action", inputs: { delayError: "delayError", apiRequest: "apiRequest", displayErrorMessage: "displayErrorMessage", labels: "labels", disabled: "disabled" }, outputs: { completed: "completed" }, usesInheritance: true, ngImport: i0, template: "<app-downloader-action\n [disabled]=\"disabled\"\n [displayError]=\"3\"\n [event]=\"onDownloadStreaming.bind(this)\"\n [isPending]=\"(isPending$ | async) || false\"\n [progress]=\"(progress$ | async)\"\n [hasError]=\"(error$ | async)\"\n (error)=\"onError(labels.error)\"\n [active]=\"active\"\n></app-downloader-action>\n", styles: [".snackBarInfo{background-color:#f44336;color:#fff}.mat-simple-snackbar>span{font-weight:700}.mat-simple-snackbar-action .mat-button .mat-button-wrapper{color:#fff}.cdk-overlay-pane>.mat-snack-bar-container{width:100%}.mat-snack-bar-container{max-width:100%!important;width:100%}\n"], dependencies: [{ kind: "component", type: i1.DownloaderActionComponent, selector: "app-downloader-action", inputs: ["event", "displayError", "diameter", "mode", "isPending", "active", "disabled", "progress", "hasError"], outputs: ["error"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
61
+ }
62
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloadActionComponent, decorators: [{
63
+ type: Component,
64
+ args: [{ selector: 'app-file-downloader-action', encapsulation: ViewEncapsulation.None, template: "<app-downloader-action\n [disabled]=\"disabled\"\n [displayError]=\"3\"\n [event]=\"onDownloadStreaming.bind(this)\"\n [isPending]=\"(isPending$ | async) || false\"\n [progress]=\"(progress$ | async)\"\n [hasError]=\"(error$ | async)\"\n (error)=\"onError(labels.error)\"\n [active]=\"active\"\n></app-downloader-action>\n", styles: [".snackBarInfo{background-color:#f44336;color:#fff}.mat-simple-snackbar>span{font-weight:700}.mat-simple-snackbar-action .mat-button .mat-button-wrapper{color:#fff}.cdk-overlay-pane>.mat-snack-bar-container{width:100%}.mat-snack-bar-container{max-width:100%!important;width:100%}\n"] }]
65
+ }], ctorParameters: function () { return []; }, propDecorators: { delayError: [{
66
+ type: Input
67
+ }], apiRequest: [{
68
+ type: Input
69
+ }], displayErrorMessage: [{
70
+ type: Input
71
+ }], labels: [{
72
+ type: Input
73
+ }], completed: [{
74
+ type: Output
75
+ }], disabled: [{
76
+ type: Input
77
+ }] } });
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1kb3dubG9hZC1hY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9maWxlLWRvd25sb2FkZXItYWN0aW9uL2ZpbGUtZG93bmxvYWQtYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvZmlsZS1kb3dubG9hZGVyLWFjdGlvbi9maWxlLWRvd25sb2FkLWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7Ozs7QUFRdkUsTUFBTSxPQUFPLDJCQUE0QixTQUFRLGtCQUF1QjtJQU90RSxJQUFhLE1BQU0sQ0FBQyxLQUFxQjtRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUMvRSxDQUFDO0lBSUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFBO0lBQ3JCLENBQUM7SUFNRDtRQUNFLEtBQUssRUFBRSxDQUFBO1FBcEJBLGVBQVUsR0FBRyxDQUFDLENBQUE7UUFDZCxlQUFVLEdBQWUsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQzNDLHdCQUFtQixHQUFHLEtBQUssQ0FBQTtRQUVwQyxZQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBS2hDLFdBQU0sR0FBRyxLQUFLLENBQUE7UUFNSixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQTtRQUVyQyxhQUFRLEdBQUcsS0FBSyxDQUFBO0lBSXpCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxtQkFBbUI7UUFFakIsSUFBRyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU07UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUE7UUFFbEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7YUFDM0MsSUFBSSxDQUNILG9CQUFvQixFQUFFLEVBQ3RCLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ3pCLE9BQU8sR0FBRyxDQUFBO1FBQ1osQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUV2QixJQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUE7YUFDdEI7UUFFSCxDQUFDLENBQUMsQ0FBQTtJQUVKLENBQUM7SUFFRCxPQUFPLENBQUMsT0FBZTtRQUVyQixJQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE9BQU07UUFFaEQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNqQyxPQUFPO1lBQ1AsTUFBTSxFQUFFLElBQUk7WUFDWixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7WUFDeEIsSUFBSSxFQUFFLE9BQU87U0FDZCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUVuQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxQyxDQUFDOytHQXJFVSwyQkFBMkI7bUdBQTNCLDJCQUEyQixrUkNmeEMsNFVBVUE7OzRGREthLDJCQUEyQjtrQkFOdkMsU0FBUzsrQkFDRSw0QkFBNEIsaUJBR3ZCLGlCQUFpQixDQUFDLElBQUk7MEVBSTVCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBR08sTUFBTTtzQkFBbEIsS0FBSztnQkFVSSxTQUFTO3NCQUFsQixNQUFNO2dCQUVFLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cblxuaW1wb3J0IHsgRG93bmxvYWRMYWJlbHMgfSBmcm9tICcuL21vZGVscy9kb3dubG9hZC1sYWJlbHMtbW9kZWwnO1xuaW1wb3J0IHsgVG9hc3REaXNwbGF5LCBUb2FzdENvbG9ycyB9IGZyb20gJ3RvYXN0LW1lc3NhZ2UtZGlzcGxheSc7XG5pbXBvcnQgeyBIVFRQTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXF1ZXN0LW1hbmFnZXItc2VydmljZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdCB9IGZyb20gJy4uL3NlcnZpY2VzL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZpbGUtZG93bmxvYWRlci1hY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1kb3dubG9hZC1hY3Rpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlLWRvd25sb2FkLWFjdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBGaWxlRG93bmxvYWRBY3Rpb25Db21wb25lbnQgZXh0ZW5kcyBIVFRQTWFuYWdlclNlcnZpY2U8YW55PiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgZGVsYXlFcnJvciA9IDNcbiAgQElucHV0KCkgYXBpUmVxdWVzdDogQXBpUmVxdWVzdCA9IEFwaVJlcXVlc3QuYWRhcHQoKVxuICBASW5wdXQoKSBkaXNwbGF5RXJyb3JNZXNzYWdlID0gZmFsc2VcblxuICBfbGFiZWxzID0gRG93bmxvYWRMYWJlbHMuYWRhcHQoKVxuICBASW5wdXQoKSBzZXQgbGFiZWxzKHZhbHVlOiBEb3dubG9hZExhYmVscykge1xuICAgIHRoaXMuX2xhYmVscyA9ICh2YWx1ZSkgPyBEb3dubG9hZExhYmVscy5hZGFwdCh2YWx1ZSkgOiBEb3dubG9hZExhYmVscy5hZGFwdCgpXG4gIH1cblxuICBhY3RpdmUgPSBmYWxzZVxuXG4gIGdldCBsYWJlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhYmVsc1xuICB9XG5cbiAgQE91dHB1dCgpIGNvbXBsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKVxuXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2VcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpXG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmVycm9yJC5zdWJzY3JpYmUoKGVycikgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ2VycicsIGVycilcbiAgICB9KVxuICB9XG5cbiAgb25Eb3dubG9hZFN0cmVhbWluZygpIHtcblxuICAgIGlmKHRoaXMuYWN0aXZlKSByZXR1cm5cbiAgICB0aGlzLmFjdGl2ZSA9IHRydWVcblxuICAgIHJldHVybiB0aGlzLmRvd25sb2FkUmVxdWVzdCh0aGlzLmFwaVJlcXVlc3QpXG4gICAgLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMub25FcnJvcihlcnIubWVzc2FnZSlcbiAgICAgICAgcmV0dXJuIGVyclxuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcblxuICAgICAgaWYocmVzID09PSAxMDApIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZVxuICAgICAgICB0aGlzLmNvbXBsZXRlZC5lbWl0KClcbiAgICAgIH1cblxuICAgIH0pXG5cbiAgfVxuXG4gIG9uRXJyb3IobWVzc2FnZTogc3RyaW5nKSB7XG5cbiAgICBpZighbWVzc2FnZSB8fCAhdGhpcy5kaXNwbGF5RXJyb3JNZXNzYWdlKSByZXR1cm5cblxuICAgIGNvbnN0IGRpc3BsYXkgPSBUb2FzdERpc3BsYXkuYWRhcHQoe1xuICAgICAgbWVzc2FnZSxcbiAgICAgIGFjdGlvbjogJ09rJyxcbiAgICAgIGNvbG9yOiBUb2FzdENvbG9ycy5FUlJPUixcbiAgICAgIGljb246ICdlcnJvcicsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlXG5cbiAgICB0aGlzLnRvYXN0TWVzc2FnZS50b2FzdE1lc3NhZ2UoZGlzcGxheSk7XG5cbiAgfVxuXG59XG4iLCI8YXBwLWRvd25sb2FkZXItYWN0aW9uXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtkaXNwbGF5RXJyb3JdPVwiM1wiXG4gIFtldmVudF09XCJvbkRvd25sb2FkU3RyZWFtaW5nLmJpbmQodGhpcylcIlxuICBbaXNQZW5kaW5nXT1cIihpc1BlbmRpbmckIHwgYXN5bmMpIHx8IGZhbHNlXCJcbiAgW3Byb2dyZXNzXT1cIihwcm9ncmVzcyQgfCBhc3luYylcIlxuICBbaGFzRXJyb3JdPVwiKGVycm9yJCB8IGFzeW5jKVwiXG4gIChlcnJvcik9XCJvbkVycm9yKGxhYmVscy5lcnJvcilcIlxuICBbYWN0aXZlXT1cImFjdGl2ZVwiXG4+PC9hcHAtZG93bmxvYWRlci1hY3Rpb24+XG4iXX0=
@@ -0,0 +1,42 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { SpinnerComponent } from './spinner/spinner.component';
4
+ import { MatIconModule } from '@angular/material/icon';
5
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
6
+ import { MatButtonModule } from '@angular/material/button';
7
+ import { DownloaderActionComponent } from './download-action/download-action.component';
8
+ import { FileDownloadActionComponent } from './file-download-action.component';
9
+ import * as i0 from "@angular/core";
10
+ export class FileDownloaderActionModule {
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
12
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, declarations: [SpinnerComponent,
13
+ DownloaderActionComponent,
14
+ FileDownloadActionComponent], imports: [CommonModule,
15
+ MatIconModule,
16
+ MatProgressSpinnerModule,
17
+ MatButtonModule], exports: [FileDownloadActionComponent] }); }
18
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, imports: [CommonModule,
19
+ MatIconModule,
20
+ MatProgressSpinnerModule,
21
+ MatButtonModule] }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, decorators: [{
24
+ type: NgModule,
25
+ args: [{
26
+ imports: [
27
+ CommonModule,
28
+ MatIconModule,
29
+ MatProgressSpinnerModule,
30
+ MatButtonModule,
31
+ ],
32
+ declarations: [
33
+ SpinnerComponent,
34
+ DownloaderActionComponent,
35
+ FileDownloadActionComponent,
36
+ ],
37
+ exports: [
38
+ FileDownloadActionComponent
39
+ ]
40
+ }]
41
+ }] });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1kb3dubG9hZC1hY3Rpb24ubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9maWxlLWRvd25sb2FkZXItYWN0aW9uL2ZpbGUtZG93bmxvYWQtYWN0aW9uLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTNELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOztBQW1CL0UsTUFBTSxPQUFPLDBCQUEwQjsrR0FBMUIsMEJBQTBCO2dIQUExQiwwQkFBMEIsaUJBUm5DLGdCQUFnQjtZQUNoQix5QkFBeUI7WUFDekIsMkJBQTJCLGFBUjNCLFlBQVk7WUFDWixhQUFhO1lBQ2Isd0JBQXdCO1lBQ3hCLGVBQWUsYUFRZiwyQkFBMkI7Z0hBR2xCLDBCQUEwQixZQWRuQyxZQUFZO1lBQ1osYUFBYTtZQUNiLHdCQUF3QjtZQUN4QixlQUFlOzs0RkFXTiwwQkFBMEI7a0JBaEJ0QyxRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2Isd0JBQXdCO3dCQUN4QixlQUFlO3FCQUNoQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osZ0JBQWdCO3dCQUNoQix5QkFBeUI7d0JBQ3pCLDJCQUEyQjtxQkFDNUI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLDJCQUEyQjtxQkFDNUI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgU3Bpbm5lckNvbXBvbmVudCB9IGZyb20gJy4vc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5cbmltcG9ydCB7IERvd25sb2FkZXJBY3Rpb25Db21wb25lbnQgfSBmcm9tICcuL2Rvd25sb2FkLWFjdGlvbi9kb3dubG9hZC1hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IEZpbGVEb3dubG9hZEFjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vZmlsZS1kb3dubG9hZC1hY3Rpb24uY29tcG9uZW50JztcblxuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLFxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgU3Bpbm5lckNvbXBvbmVudCxcbiAgICBEb3dubG9hZGVyQWN0aW9uQ29tcG9uZW50LFxuICAgIEZpbGVEb3dubG9hZEFjdGlvbkNvbXBvbmVudCxcbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEZpbGVEb3dubG9hZEFjdGlvbkNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVEb3dubG9hZGVyQWN0aW9uTW9kdWxlIHsgfVxuIl19
@@ -0,0 +1,11 @@
1
+ export class DownloadLabels {
2
+ constructor(error = '', action = '', icon = 'error') {
3
+ this.error = error;
4
+ this.action = action;
5
+ this.icon = icon;
6
+ }
7
+ static adapt(item) {
8
+ return new DownloadLabels(item?.error, item?.action, item?.icon);
9
+ }
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtbGFiZWxzLW1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9maWxlLWRvd25sb2FkZXItYWN0aW9uL21vZGVscy9kb3dubG9hZC1sYWJlbHMtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFDUyxRQUFRLEVBQUUsRUFDVixTQUFTLEVBQUUsRUFDWCxPQUFPLE9BQU87UUFGZCxVQUFLLEdBQUwsS0FBSyxDQUFLO1FBQ1YsV0FBTSxHQUFOLE1BQU0sQ0FBSztRQUNYLFNBQUksR0FBSixJQUFJLENBQVU7SUFDcEIsQ0FBQztJQUVMLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBVTtRQUNwQixPQUFPLElBQUksY0FBYyxDQUN2QixJQUFJLEVBQUUsS0FBSyxFQUNYLElBQUksRUFBRSxNQUFNLEVBQ1osSUFBSSxFQUFFLElBQUksQ0FDWCxDQUFBO0lBRUgsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBEb3dubG9hZExhYmVsc0ludGVyZmFjZSB7XG4gIGVycm9yOiBzdHJpbmc7XG4gIGFjdGlvbjogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBEb3dubG9hZExhYmVscyBpbXBsZW1lbnRzIERvd25sb2FkTGFiZWxzSW50ZXJmYWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGVycm9yID0gJycsXG4gICAgcHVibGljIGFjdGlvbiA9ICcnLFxuICAgIHB1YmxpYyBpY29uID0gJ2Vycm9yJyxcbiAgKSB7fVxuXG4gc3RhdGljIGFkYXB0KGl0ZW0/OiBhbnkpOiBEb3dubG9hZExhYmVsc0ludGVyZmFjZSB7XG4gICAgcmV0dXJuIG5ldyBEb3dubG9hZExhYmVscyhcbiAgICAgIGl0ZW0/LmVycm9yLFxuICAgICAgaXRlbT8uYWN0aW9uLFxuICAgICAgaXRlbT8uaWNvbixcbiAgICApXG5cbiAgfVxufVxuIl19
@@ -26,4 +26,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
26
26
  }], value: [{
27
27
  type: Input
28
28
  }] } });
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1kZW1vL2ZpbGUtZG93bmxvYWRlci9zcGlubmVyL3NwaW5uZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItZGVtby9maWxlLWRvd25sb2FkZXIvc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7QUFTekQsTUFBTSxPQUFPLGdCQUFnQjtJQVUzQjtRQUZTLFVBQUssR0FBRyxDQUFDLENBQUE7SUFFRixDQUFDO0lBRWpCLFFBQVE7SUFDUixDQUFDOytHQWJVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLG1MQ1Q3Qiw4UEFRQTs7NEZEQ2EsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGFBQWE7MEVBTWQsS0FBSztzQkFBYixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGhlbWVQYWxldHRlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBQcm9ncmVzc1NwaW5uZXJNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3Mtc3Bpbm5lcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1zcGlubmVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwaW5uZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGlubmVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3Bpbm5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgY29sb3I6IFRoZW1lUGFsZXR0ZTtcblxuICBASW5wdXQoKSBkaWFtZXRlcj86IG51bWJlcjtcbiAgQElucHV0KCkgZGlzcGxheT86IHN0cmluZyB8IG51bWJlcjtcbiAgQElucHV0KCkgbW9kZT86IFByb2dyZXNzU3Bpbm5lck1vZGU7XG4gIEBJbnB1dCgpIHN0cm9rZVdpZHRoPzogbnVtYmVyO1xuICBASW5wdXQoKSB2YWx1ZSA9IDBcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzcGlubmVyLWJhY2tncm91bmRcIj57e2Rpc3BsYXl9fTwvZGl2PlxuPG1hdC1wcm9ncmVzcy1zcGlubmVyXG4gICAgW2NvbG9yXT1cImNvbG9yXCJcbiAgICBbZGlhbWV0ZXJdPVwiZGlhbWV0ZXJcIlxuICAgIFttb2RlXT1cIm1vZGUgfHwgJ2luZGV0ZXJtaW5hdGUnXCJcbiAgICBbc3Ryb2tlV2lkdGhdPVwic3Ryb2tlV2lkdGhcIlxuICAgIFt2YWx1ZV09XCJ2YWx1ZVwiPlxuPC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cbiJdfQ==
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Bpbm5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ZpbGUtZG93bmxvYWRlci1hY3Rpb24vc3Bpbm5lci9zcGlubmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvZmlsZS1kb3dubG9hZGVyLWFjdGlvbi9zcGlubmVyL3NwaW5uZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7OztBQVN6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBVTNCO1FBRlMsVUFBSyxHQUFHLENBQUMsQ0FBQTtJQUVGLENBQUM7SUFFakIsUUFBUTtJQUNSLENBQUM7K0dBYlUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsbUxDVDdCLDhQQVFBOzs0RkRDYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsYUFBYTswRUFNZCxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaGVtZVBhbGV0dGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IFByb2dyZXNzU3Bpbm5lck1vZGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXNwaW5uZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc3Bpbm5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwaW5uZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBTcGlubmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBjb2xvcjogVGhlbWVQYWxldHRlO1xuXG4gIEBJbnB1dCgpIGRpYW1ldGVyPzogbnVtYmVyO1xuICBASW5wdXQoKSBkaXNwbGF5Pzogc3RyaW5nIHwgbnVtYmVyO1xuICBASW5wdXQoKSBtb2RlPzogUHJvZ3Jlc3NTcGlubmVyTW9kZTtcbiAgQElucHV0KCkgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHZhbHVlID0gMFxuXG4gIGNvbnN0cnVjdG9yKCkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cInNwaW5uZXItYmFja2dyb3VuZFwiPnt7ZGlzcGxheX19PC9kaXY+XG48bWF0LXByb2dyZXNzLXNwaW5uZXJcbiAgICBbY29sb3JdPVwiY29sb3JcIlxuICAgIFtkaWFtZXRlcl09XCJkaWFtZXRlclwiXG4gICAgW21vZGVdPVwibW9kZSB8fCAnaW5kZXRlcm1pbmF0ZSdcIlxuICAgIFtzdHJva2VXaWR0aF09XCJzdHJva2VXaWR0aFwiXG4gICAgW3ZhbHVlXT1cInZhbHVlXCI+XG48L21hdC1wcm9ncmVzcy1zcGlubmVyPlxuIl19