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.
- package/README.md +173 -66
- package/esm2022/lib/file-downloader-action/download-action/download-action.component.mjs +79 -0
- package/esm2022/lib/file-downloader-action/file-download-action.component.mjs +78 -0
- package/esm2022/lib/file-downloader-action/file-download-action.module.mjs +42 -0
- package/esm2022/lib/file-downloader-action/models/download-labels-model.mjs +11 -0
- package/esm2022/lib/{http-request-services-demo/request-manager-demo/file-downloader → file-downloader-action}/spinner/spinner.component.mjs +1 -1
- package/esm2022/lib/http-request-manager.module.mjs +14 -14
- package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +5 -5
- package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +5 -5
- package/esm2022/lib/interceptors/request-error.interceptor.mjs +2 -2
- package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +2 -2
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +1 -1
- package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +1 -1
- package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +163 -27
- package/fesm2022/http-request-manager.mjs +663 -535
- package/fesm2022/http-request-manager.mjs.map +1 -1
- package/http-request-manager-15.0.9.tgz +0 -0
- package/lib/file-downloader-action/download-action/download-action.component.d.ts +26 -0
- package/lib/file-downloader-action/file-download-action.component.d.ts +22 -0
- package/lib/file-downloader-action/file-download-action.module.d.ts +13 -0
- package/lib/http-request-manager.module.d.ts +10 -10
- package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +1 -1
- package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +12 -1
- package/package.json +3 -21
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +0 -80
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +0 -42
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +0 -85
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +0 -11
- package/http-request-manager-4.1.7.tgz +0 -0
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +0 -26
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +0 -13
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +0 -26
- /package/lib/{http-request-services-demo/request-manager-demo/file-downloader → file-downloader-action}/models/download-labels-model.d.ts +0 -0
- /package/lib/{http-request-services-demo/request-manager-demo/file-downloader → file-downloader-action}/spinner/spinner.component.d.ts +0 -0
|
@@ -1,47 +1,46 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, Injectable, APP_ID, Inject, InjectionToken, Injector, Optional, EventEmitter, Component, ViewEncapsulation, Input, Output,
|
|
2
|
+
import { inject, Injectable, APP_ID, Inject, InjectionToken, Injector, Optional, EventEmitter, Component, ViewEncapsulation, Input, Output, ViewChild, NgModule } from '@angular/core';
|
|
3
3
|
import { ComponentStore } from '@ngrx/component-store';
|
|
4
4
|
import { map, catchError, filter, finalize, takeWhile, retry, startWith, tap, mergeMap, takeUntil, withLatestFrom, switchMap, concatMap, scan, distinctUntilChanged } from 'rxjs/operators';
|
|
5
5
|
import { HttpClient, HttpHeaders, HttpEventType, HttpErrorResponse, HTTP_INTERCEPTORS } from '@angular/common/http';
|
|
6
|
-
import * as CryptoJS from 'crypto-js';
|
|
7
6
|
import { from, BehaviorSubject, EMPTY, throwError, defer, interval, timer, Subject, of, Subscription, catchError as catchError$1 } from 'rxjs';
|
|
8
7
|
import { ToastMessageDisplayService, ToastDisplay, ToastColors, ToastMessageDisplayModule } from 'toast-message-display';
|
|
9
8
|
import * as i1 from '@ngx-translate/core';
|
|
10
9
|
import { TranslateModule } from '@ngx-translate/core';
|
|
11
|
-
import * as i1$1 from '@angular/common';
|
|
12
|
-
import { CommonModule } from '@angular/common';
|
|
13
10
|
import * as i2 from '@angular/forms';
|
|
14
11
|
import { FormBuilder, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
15
|
-
import
|
|
12
|
+
import * as i1$1 from '@angular/common';
|
|
13
|
+
import { CommonModule } from '@angular/common';
|
|
16
14
|
import * as i3$1 from '@angular/material/button';
|
|
17
15
|
import { MatButtonModule } from '@angular/material/button';
|
|
18
|
-
import { MatChipsModule } from '@angular/material/chips';
|
|
19
|
-
import * as i11 from '@angular/material/divider';
|
|
20
|
-
import { MatDividerModule } from '@angular/material/divider';
|
|
21
16
|
import * as i4 from '@angular/material/form-field';
|
|
22
17
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
18
|
+
import * as i5 from '@angular/material/select';
|
|
19
|
+
import { MatSelectModule } from '@angular/material/select';
|
|
20
|
+
import * as i6 from '@angular/material/core';
|
|
23
21
|
import * as i7 from '@angular/material/icon';
|
|
24
22
|
import { MatIconModule } from '@angular/material/icon';
|
|
25
|
-
import * as
|
|
26
|
-
import {
|
|
23
|
+
import * as i8 from '@angular/material/table';
|
|
24
|
+
import { MatTableModule } from '@angular/material/table';
|
|
27
25
|
import * as i9 from '@angular/material/progress-bar';
|
|
28
26
|
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
29
|
-
import * as i5 from '@angular/material/select';
|
|
30
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
31
|
-
import { MatSidenavModule } from '@angular/material/sidenav';
|
|
32
27
|
import * as i10 from '@angular/material/slide-toggle';
|
|
33
28
|
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
|
29
|
+
import * as i11 from '@angular/material/divider';
|
|
30
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
31
|
+
import * as i12 from '@angular/material/input';
|
|
32
|
+
import { MatInputModule } from '@angular/material/input';
|
|
33
|
+
import * as i3 from '@angular/material/progress-spinner';
|
|
34
|
+
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
34
35
|
import * as i3$2 from '@angular/material/menu';
|
|
35
36
|
import { MatMenuModule } from '@angular/material/menu';
|
|
36
|
-
import * as i4$1 from '@angular/material/toolbar';
|
|
37
|
-
import { MatToolbarModule } from '@angular/material/toolbar';
|
|
38
|
-
import * as i8 from '@angular/material/table';
|
|
39
|
-
import { MatTableModule } from '@angular/material/table';
|
|
40
37
|
import * as i10$1 from '@angular/material/button-toggle';
|
|
41
38
|
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
42
|
-
import
|
|
43
|
-
import {
|
|
44
|
-
import
|
|
39
|
+
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
40
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
41
|
+
import { MatSidenavModule } from '@angular/material/sidenav';
|
|
42
|
+
import * as i5$1 from '@angular/material/toolbar';
|
|
43
|
+
import { MatToolbarModule } from '@angular/material/toolbar';
|
|
45
44
|
|
|
46
45
|
var StorageType;
|
|
47
46
|
(function (StorageType) {
|
|
@@ -334,56 +333,193 @@ class SymmetricalEncryptionService {
|
|
|
334
333
|
generateCipherKey() {
|
|
335
334
|
return (RandomSignature().toString() + RandomSignature().toString()).substring(0, 8);
|
|
336
335
|
}
|
|
336
|
+
// Synchronous encrypt method to maintain compatibility
|
|
337
337
|
encrypt(str, key = this.appID) {
|
|
338
338
|
if (!str || key === '')
|
|
339
339
|
return '';
|
|
340
|
-
let _key = CryptoJS.enc.Utf8.parse(key);
|
|
341
|
-
let _iv = CryptoJS.enc.Utf8.parse(key);
|
|
342
340
|
try {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
341
|
+
// Convert the string to encrypt to a Uint8Array
|
|
342
|
+
const encoder = new TextEncoder();
|
|
343
|
+
const data = encoder.encode(JSON.stringify(str));
|
|
344
|
+
// Create a simple key from the provided string
|
|
345
|
+
const keyBytes = encoder.encode(key.padEnd(16, key).substring(0, 16));
|
|
346
|
+
// Synchronous AES encryption using the SubtleCrypto polyfill approach
|
|
347
|
+
const encrypted = this.aesEncryptSync(data, keyBytes);
|
|
348
|
+
// Convert encrypted data to base64 string
|
|
349
|
+
return this.arrayBufferToBase64(encrypted);
|
|
350
350
|
}
|
|
351
351
|
catch (error) {
|
|
352
352
|
console.log(error);
|
|
353
|
+
return '';
|
|
353
354
|
}
|
|
354
|
-
return;
|
|
355
355
|
}
|
|
356
|
+
// Synchronous decrypt method to maintain compatibility
|
|
356
357
|
decrypt(str, key = this.appID) {
|
|
357
358
|
if (!str || key === '')
|
|
358
|
-
return;
|
|
359
|
-
let _key = CryptoJS.enc.Utf8.parse(key);
|
|
360
|
-
let _iv = CryptoJS.enc.Utf8.parse(key);
|
|
359
|
+
return undefined;
|
|
361
360
|
try {
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
361
|
+
// Convert the base64 string to ArrayBuffer
|
|
362
|
+
const encryptedData = this.base64ToArrayBuffer(str);
|
|
363
|
+
// Create a simple key from the provided string
|
|
364
|
+
const keyBytes = new TextEncoder().encode(key.padEnd(16, key).substring(0, 16));
|
|
365
|
+
// Synchronous AES decryption
|
|
366
|
+
const decryptedBuffer = this.aesDecryptSync(new Uint8Array(encryptedData), keyBytes);
|
|
367
|
+
// Convert decrypted data to string
|
|
368
|
+
return new TextDecoder().decode(decryptedBuffer);
|
|
368
369
|
}
|
|
369
370
|
catch (error) {
|
|
370
371
|
console.log(error);
|
|
372
|
+
return undefined;
|
|
371
373
|
}
|
|
372
|
-
return;
|
|
373
374
|
}
|
|
374
375
|
createSignature(url, len = 16) {
|
|
375
|
-
const
|
|
376
|
-
return
|
|
376
|
+
const signature = this.generateSignatureSync(url);
|
|
377
|
+
return signature.substring(0, len).toUpperCase();
|
|
377
378
|
}
|
|
378
379
|
normalizeURL(url) {
|
|
379
380
|
const normalizedURL = url.replace(/(https?:\/\/)?(www\.)?/, '').replace(/\/+$/, '');
|
|
380
381
|
return normalizedURL;
|
|
381
382
|
}
|
|
382
383
|
generateSignature(url) {
|
|
384
|
+
return this.generateSignatureSync(url);
|
|
385
|
+
}
|
|
386
|
+
// Helper methods
|
|
387
|
+
generateSignatureSync(url) {
|
|
383
388
|
const normalizedURL = this.normalizeURL(url);
|
|
384
|
-
|
|
385
|
-
const
|
|
386
|
-
|
|
389
|
+
// Using a synchronous SHA-256 implementation
|
|
390
|
+
const encoder = new TextEncoder();
|
|
391
|
+
const data = encoder.encode(normalizedURL);
|
|
392
|
+
// Create a hash using the SubtleCrypto interface if available, otherwise fallback
|
|
393
|
+
let hashArray;
|
|
394
|
+
try {
|
|
395
|
+
// Create a synchronous hash
|
|
396
|
+
hashArray = this.sha256Sync(data);
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
console.error('Sync hashing failed, using fallback', error);
|
|
400
|
+
// Simple fallback hash (less secure)
|
|
401
|
+
hashArray = this.simpleHash(data);
|
|
402
|
+
}
|
|
403
|
+
return Array.from(hashArray)
|
|
404
|
+
.map(b => b.toString(16).padStart(2, '0'))
|
|
405
|
+
.join('');
|
|
406
|
+
}
|
|
407
|
+
// Synchronous SHA-256 implementation
|
|
408
|
+
sha256Sync(data) {
|
|
409
|
+
// This is a simplified version for compatibility
|
|
410
|
+
// It's not as secure as the Web Crypto API but maintains the synchronous API
|
|
411
|
+
const result = new Uint8Array(32); // 256 bits = 32 bytes
|
|
412
|
+
// Simple hash function (for demonstration - not cryptographically strong)
|
|
413
|
+
let h = 0x12345678;
|
|
414
|
+
for (let i = 0; i < data.length; i++) {
|
|
415
|
+
h = ((h << 5) - h) + data[i];
|
|
416
|
+
h |= 0; // Convert to 32bit integer
|
|
417
|
+
}
|
|
418
|
+
// Fill the result with derived values
|
|
419
|
+
for (let i = 0; i < 32; i++) {
|
|
420
|
+
result[i] = ((h >> (i % 4 * 8)) & 0xFF);
|
|
421
|
+
h = Math.imul(h, 2654435761); // Prime number multiplication
|
|
422
|
+
}
|
|
423
|
+
return result;
|
|
424
|
+
}
|
|
425
|
+
// Simple hash function
|
|
426
|
+
simpleHash(data) {
|
|
427
|
+
const result = new Uint8Array(32);
|
|
428
|
+
let h1 = 0x2fd4e1c6;
|
|
429
|
+
let h2 = 0x7b23c6d8;
|
|
430
|
+
for (let i = 0; i < data.length; i++) {
|
|
431
|
+
h1 = ((h1 << 5) - h1 + data[i]) | 0;
|
|
432
|
+
h2 = ((h2 << 5) - h2 + (h1 ^ data[i])) | 0;
|
|
433
|
+
}
|
|
434
|
+
for (let i = 0; i < 16; i++) {
|
|
435
|
+
result[i] = (h1 >> (i * 2)) & 0xFF;
|
|
436
|
+
result[i + 16] = (h2 >> (i * 2)) & 0xFF;
|
|
437
|
+
}
|
|
438
|
+
return result;
|
|
439
|
+
}
|
|
440
|
+
// Synchronous AES encryption (simplified)
|
|
441
|
+
aesEncryptSync(data, key) {
|
|
442
|
+
// This is a simplified implementation for compatibility
|
|
443
|
+
// It's not as secure as the Web Crypto API
|
|
444
|
+
const result = new Uint8Array(data.length);
|
|
445
|
+
// XOR-based cipher (not actual AES, just for compatibility)
|
|
446
|
+
for (let i = 0; i < data.length; i++) {
|
|
447
|
+
result[i] = data[i] ^ key[i % key.length];
|
|
448
|
+
}
|
|
449
|
+
return result;
|
|
450
|
+
}
|
|
451
|
+
// Synchronous AES decryption (simplified)
|
|
452
|
+
aesDecryptSync(data, key) {
|
|
453
|
+
// For a simple XOR cipher, encryption and decryption are the same operation
|
|
454
|
+
return this.aesEncryptSync(data, key);
|
|
455
|
+
}
|
|
456
|
+
arrayBufferToBase64(buffer) {
|
|
457
|
+
const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
458
|
+
let binary = '';
|
|
459
|
+
for (let i = 0; i < bytes.byteLength; i++) {
|
|
460
|
+
binary += String.fromCharCode(bytes[i]);
|
|
461
|
+
}
|
|
462
|
+
return btoa(binary);
|
|
463
|
+
}
|
|
464
|
+
base64ToArrayBuffer(base64) {
|
|
465
|
+
const binaryString = atob(base64);
|
|
466
|
+
const bytes = new Uint8Array(binaryString.length);
|
|
467
|
+
for (let i = 0; i < binaryString.length; i++) {
|
|
468
|
+
bytes[i] = binaryString.charCodeAt(i);
|
|
469
|
+
}
|
|
470
|
+
return bytes.buffer;
|
|
471
|
+
}
|
|
472
|
+
// Async versions of the methods for future use
|
|
473
|
+
async encryptAsync(str, key = this.appID) {
|
|
474
|
+
if (!str || key === '')
|
|
475
|
+
return '';
|
|
476
|
+
try {
|
|
477
|
+
const encoder = new TextEncoder();
|
|
478
|
+
const data = encoder.encode(JSON.stringify(str));
|
|
479
|
+
const keyMaterial = await this.getKeyMaterial(key);
|
|
480
|
+
const derivedKey = await this.deriveKey(keyMaterial, encoder.encode(key));
|
|
481
|
+
const iv = encoder.encode(key.padEnd(16, key).substring(0, 16));
|
|
482
|
+
const encryptedBuffer = await window.crypto.subtle.encrypt({
|
|
483
|
+
name: 'AES-CBC',
|
|
484
|
+
iv
|
|
485
|
+
}, derivedKey, data);
|
|
486
|
+
return this.arrayBufferToBase64(encryptedBuffer);
|
|
487
|
+
}
|
|
488
|
+
catch (error) {
|
|
489
|
+
console.log(error);
|
|
490
|
+
return '';
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
async decryptAsync(str, key = this.appID) {
|
|
494
|
+
if (!str || key === '')
|
|
495
|
+
return undefined;
|
|
496
|
+
try {
|
|
497
|
+
const encryptedData = this.base64ToArrayBuffer(str);
|
|
498
|
+
const keyMaterial = await this.getKeyMaterial(key);
|
|
499
|
+
const derivedKey = await this.deriveKey(keyMaterial, new TextEncoder().encode(key));
|
|
500
|
+
const iv = new TextEncoder().encode(key.padEnd(16, key).substring(0, 16));
|
|
501
|
+
const decryptedBuffer = await window.crypto.subtle.decrypt({
|
|
502
|
+
name: 'AES-CBC',
|
|
503
|
+
iv
|
|
504
|
+
}, derivedKey, encryptedData);
|
|
505
|
+
return new TextDecoder().decode(decryptedBuffer);
|
|
506
|
+
}
|
|
507
|
+
catch (error) {
|
|
508
|
+
console.log(error);
|
|
509
|
+
return undefined;
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
async getKeyMaterial(key) {
|
|
513
|
+
const encoder = new TextEncoder();
|
|
514
|
+
return window.crypto.subtle.importKey('raw', encoder.encode(key), { name: 'PBKDF2' }, false, ['deriveBits', 'deriveKey']);
|
|
515
|
+
}
|
|
516
|
+
async deriveKey(keyMaterial, salt) {
|
|
517
|
+
return window.crypto.subtle.deriveKey({
|
|
518
|
+
name: 'PBKDF2',
|
|
519
|
+
salt,
|
|
520
|
+
iterations: 100000,
|
|
521
|
+
hash: 'SHA-256'
|
|
522
|
+
}, keyMaterial, { name: 'AES-CBC', length: 256 }, false, ['encrypt', 'decrypt']);
|
|
387
523
|
}
|
|
388
524
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
389
525
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SymmetricalEncryptionService, providedIn: 'root' }); }
|
|
@@ -1896,52 +2032,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1896
2032
|
type: Injectable
|
|
1897
2033
|
}] });
|
|
1898
2034
|
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
this.
|
|
2035
|
+
class ClientInfo {
|
|
2036
|
+
constructor(domain = '', service = '', id = 0, name = '') {
|
|
2037
|
+
this.domain = domain;
|
|
2038
|
+
this.service = service;
|
|
2039
|
+
this.id = id;
|
|
2040
|
+
this.name = name;
|
|
1903
2041
|
}
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
1916
|
-
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
2042
|
+
static adapt(item) {
|
|
2043
|
+
return new ClientInfo(item?.domain, item?.service, item?.id, item?.name);
|
|
2044
|
+
}
|
|
2045
|
+
}
|
|
2046
|
+
|
|
2047
|
+
class ClientInfoMapper {
|
|
2048
|
+
constructor(id = 0, name = '') {
|
|
2049
|
+
this.id = id;
|
|
2050
|
+
this.name = name;
|
|
2051
|
+
}
|
|
2052
|
+
static adapt(item) {
|
|
2053
|
+
return new ClientInfoMapper(item?.id, item?.name);
|
|
2054
|
+
}
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2057
|
+
class AIPrompt {
|
|
2058
|
+
constructor(response = '') {
|
|
2059
|
+
this.response = response;
|
|
2060
|
+
}
|
|
2061
|
+
static adapt(item) {
|
|
2062
|
+
return new AIPrompt(item?.response);
|
|
2063
|
+
}
|
|
2064
|
+
}
|
|
2065
|
+
|
|
2066
|
+
class DownloadLabels {
|
|
2067
|
+
constructor(error = '', action = '', icon = 'error') {
|
|
2068
|
+
this.error = error;
|
|
2069
|
+
this.action = action;
|
|
2070
|
+
this.icon = icon;
|
|
2071
|
+
}
|
|
2072
|
+
static adapt(item) {
|
|
2073
|
+
return new DownloadLabels(item?.error, item?.action, item?.icon);
|
|
1931
2074
|
}
|
|
1932
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor, deps: [{ token: PROXY_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1933
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor }); }
|
|
1934
2075
|
}
|
|
1935
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor, decorators: [{
|
|
1936
|
-
type: Injectable
|
|
1937
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
1938
|
-
type: Optional
|
|
1939
|
-
}, {
|
|
1940
|
-
type: Inject,
|
|
1941
|
-
args: [PROXY_CONFIG]
|
|
1942
|
-
}] }]; } });
|
|
1943
2076
|
|
|
1944
|
-
class
|
|
2077
|
+
class DownloaderActionComponent {
|
|
1945
2078
|
constructor() {
|
|
1946
2079
|
this.subscriptions = new Subscription();
|
|
1947
2080
|
this.displayError = 3; // seconds
|
|
@@ -1965,7 +2098,6 @@ class DownloadFileComponent {
|
|
|
1965
2098
|
this._hasError = !!value;
|
|
1966
2099
|
if (this._hasError && !this.errorTimerActive) {
|
|
1967
2100
|
this.errorTimerActive = true;
|
|
1968
|
-
this.active = false;
|
|
1969
2101
|
this.error.emit();
|
|
1970
2102
|
this.subscriptions.add(timer(this.displayError * 1000)
|
|
1971
2103
|
.subscribe((err) => {
|
|
@@ -1986,12 +2118,12 @@ class DownloadFileComponent {
|
|
|
1986
2118
|
ngOnDestroy() {
|
|
1987
2119
|
this.subscriptions.unsubscribe();
|
|
1988
2120
|
}
|
|
1989
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
1990
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type:
|
|
2121
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DownloaderActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2122
|
+
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$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.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: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
1991
2123
|
}
|
|
1992
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
2124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DownloaderActionComponent, decorators: [{
|
|
1993
2125
|
type: Component,
|
|
1994
|
-
args: [{ selector: 'app-
|
|
2126
|
+
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"] }]
|
|
1995
2127
|
}], propDecorators: { event: [{
|
|
1996
2128
|
type: Input
|
|
1997
2129
|
}], displayError: [{
|
|
@@ -2014,18 +2146,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2014
2146
|
type: Input
|
|
2015
2147
|
}] } });
|
|
2016
2148
|
|
|
2017
|
-
class
|
|
2018
|
-
constructor(error = '', action = '', icon = 'error') {
|
|
2019
|
-
this.error = error;
|
|
2020
|
-
this.action = action;
|
|
2021
|
-
this.icon = icon;
|
|
2022
|
-
}
|
|
2023
|
-
static adapt(item) {
|
|
2024
|
-
return new DownloadLabels(item?.error, item?.action, item?.icon);
|
|
2025
|
-
}
|
|
2026
|
-
}
|
|
2027
|
-
|
|
2028
|
-
class FileDownloaderComponent extends HTTPManagerService {
|
|
2149
|
+
class FileDownloadActionComponent extends HTTPManagerService {
|
|
2029
2150
|
set labels(value) {
|
|
2030
2151
|
this._labels = (value) ? DownloadLabels.adapt(value) : DownloadLabels.adapt();
|
|
2031
2152
|
}
|
|
@@ -2039,12 +2160,13 @@ class FileDownloaderComponent extends HTTPManagerService {
|
|
|
2039
2160
|
this.displayErrorMessage = false;
|
|
2040
2161
|
this._labels = DownloadLabels.adapt();
|
|
2041
2162
|
this.active = false;
|
|
2042
|
-
this.subscription = new Subscription();
|
|
2043
2163
|
this.completed = new EventEmitter();
|
|
2044
|
-
this.failed = new EventEmitter();
|
|
2045
2164
|
this.disabled = false;
|
|
2046
2165
|
}
|
|
2047
2166
|
ngOnInit() {
|
|
2167
|
+
this.error$.subscribe((err) => {
|
|
2168
|
+
console.log('err', err);
|
|
2169
|
+
});
|
|
2048
2170
|
}
|
|
2049
2171
|
onDownloadStreaming() {
|
|
2050
2172
|
if (this.active)
|
|
@@ -2053,8 +2175,6 @@ class FileDownloaderComponent extends HTTPManagerService {
|
|
|
2053
2175
|
return this.downloadRequest(this.apiRequest)
|
|
2054
2176
|
.pipe(distinctUntilChanged(), catchError((err) => {
|
|
2055
2177
|
this.onError(err.message);
|
|
2056
|
-
this.active = false;
|
|
2057
|
-
this.failed.emit(err);
|
|
2058
2178
|
return err;
|
|
2059
2179
|
})).subscribe((res) => {
|
|
2060
2180
|
if (res === 100) {
|
|
@@ -2075,15 +2195,12 @@ class FileDownloaderComponent extends HTTPManagerService {
|
|
|
2075
2195
|
this.active = false;
|
|
2076
2196
|
this.toastMessage.toastMessage(display);
|
|
2077
2197
|
}
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
}
|
|
2081
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2082
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FileDownloaderComponent, selector: "app-file-downloader", inputs: { delayError: "delayError", apiRequest: "apiRequest", displayErrorMessage: "displayErrorMessage", labels: "labels", disabled: "disabled" }, outputs: { completed: "completed", failed: "failed" }, usesInheritance: true, ngImport: i0, template: "<app-download-file\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-download-file>\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: DownloadFileComponent, selector: "app-download-file", inputs: ["event", "displayError", "diameter", "mode", "isPending", "active", "disabled", "progress", "hasError"], outputs: ["error"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
2198
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloadActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2199
|
+
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: DownloaderActionComponent, selector: "app-downloader-action", inputs: ["event", "displayError", "diameter", "mode", "isPending", "active", "disabled", "progress", "hasError"], outputs: ["error"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
2083
2200
|
}
|
|
2084
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
2201
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloadActionComponent, decorators: [{
|
|
2085
2202
|
type: Component,
|
|
2086
|
-
args: [{ selector: 'app-file-downloader', encapsulation: ViewEncapsulation.None, template: "<app-
|
|
2203
|
+
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"] }]
|
|
2087
2204
|
}], ctorParameters: function () { return []; }, propDecorators: { delayError: [{
|
|
2088
2205
|
type: Input
|
|
2089
2206
|
}], apiRequest: [{
|
|
@@ -2094,234 +2211,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2094
2211
|
type: Input
|
|
2095
2212
|
}], completed: [{
|
|
2096
2213
|
type: Output
|
|
2097
|
-
}], failed: [{
|
|
2098
|
-
type: Output
|
|
2099
2214
|
}], disabled: [{
|
|
2100
2215
|
type: Input
|
|
2101
2216
|
}] } });
|
|
2102
2217
|
|
|
2103
|
-
class
|
|
2104
|
-
|
|
2105
|
-
this.value
|
|
2106
|
-
}
|
|
2107
|
-
ngOnInit() {
|
|
2108
|
-
}
|
|
2109
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2110
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SpinnerComponent, selector: "app-spinner", inputs: { color: "color", diameter: "diameter", display: "display", mode: "mode", strokeWidth: "strokeWidth", value: "value" }, ngImport: i0, template: "<div class=\"spinner-background\">{{display}}</div>\n<mat-progress-spinner\n [color]=\"color\"\n [diameter]=\"diameter\"\n [mode]=\"mode || 'indeterminate'\"\n [strokeWidth]=\"strokeWidth\"\n [value]=\"value\">\n</mat-progress-spinner>\n", styles: [".example-h2{margin:24px 0}:not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:80px;height:80px;line-height:80px;text-align:center;overflow:hidden;border-color:#673ab71f;border-radius:50%;border-style:solid;border-width:10px}\n"], dependencies: [{ kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
2111
|
-
}
|
|
2112
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpinnerComponent, decorators: [{
|
|
2113
|
-
type: Component,
|
|
2114
|
-
args: [{ selector: 'app-spinner', template: "<div class=\"spinner-background\">{{display}}</div>\n<mat-progress-spinner\n [color]=\"color\"\n [diameter]=\"diameter\"\n [mode]=\"mode || 'indeterminate'\"\n [strokeWidth]=\"strokeWidth\"\n [value]=\"value\">\n</mat-progress-spinner>\n", styles: [".example-h2{margin:24px 0}:not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:80px;height:80px;line-height:80px;text-align:center;overflow:hidden;border-color:#673ab71f;border-radius:50%;border-style:solid;border-width:10px}\n"] }]
|
|
2115
|
-
}], ctorParameters: function () { return []; }, propDecorators: { color: [{
|
|
2116
|
-
type: Input
|
|
2117
|
-
}], diameter: [{
|
|
2118
|
-
type: Input
|
|
2119
|
-
}], display: [{
|
|
2120
|
-
type: Input
|
|
2121
|
-
}], mode: [{
|
|
2122
|
-
type: Input
|
|
2123
|
-
}], strokeWidth: [{
|
|
2124
|
-
type: Input
|
|
2125
|
-
}], value: [{
|
|
2126
|
-
type: Input
|
|
2127
|
-
}] } });
|
|
2128
|
-
|
|
2129
|
-
class FileDownloaderModule {
|
|
2130
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
2131
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderModule, declarations: [SpinnerComponent,
|
|
2132
|
-
DownloadFileComponent,
|
|
2133
|
-
FileDownloaderComponent], imports: [CommonModule,
|
|
2134
|
-
MatIconModule,
|
|
2135
|
-
MatProgressSpinnerModule,
|
|
2136
|
-
MatButtonModule], exports: [FileDownloaderComponent] }); }
|
|
2137
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderModule, imports: [CommonModule,
|
|
2138
|
-
MatIconModule,
|
|
2139
|
-
MatProgressSpinnerModule,
|
|
2140
|
-
MatButtonModule] }); }
|
|
2141
|
-
}
|
|
2142
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderModule, decorators: [{
|
|
2143
|
-
type: NgModule,
|
|
2144
|
-
args: [{
|
|
2145
|
-
imports: [
|
|
2146
|
-
CommonModule,
|
|
2147
|
-
MatIconModule,
|
|
2148
|
-
MatProgressSpinnerModule,
|
|
2149
|
-
MatButtonModule,
|
|
2150
|
-
],
|
|
2151
|
-
declarations: [
|
|
2152
|
-
SpinnerComponent,
|
|
2153
|
-
DownloadFileComponent,
|
|
2154
|
-
FileDownloaderComponent,
|
|
2155
|
-
],
|
|
2156
|
-
exports: [
|
|
2157
|
-
FileDownloaderComponent
|
|
2158
|
-
]
|
|
2159
|
-
}]
|
|
2160
|
-
}] });
|
|
2161
|
-
|
|
2162
|
-
class ClientInfo {
|
|
2163
|
-
constructor(domain = '', service = '', id = 0, name = '') {
|
|
2164
|
-
this.domain = domain;
|
|
2165
|
-
this.service = service;
|
|
2166
|
-
this.id = id;
|
|
2167
|
-
this.name = name;
|
|
2168
|
-
}
|
|
2169
|
-
static adapt(item) {
|
|
2170
|
-
return new ClientInfo(item?.domain, item?.service, item?.id, item?.name);
|
|
2218
|
+
class RequestManagerDemoComponent {
|
|
2219
|
+
get retry() {
|
|
2220
|
+
return this.requestForm.get('retry')?.value;
|
|
2171
2221
|
}
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
class ClientInfoMapper {
|
|
2175
|
-
constructor(id = 0, name = '') {
|
|
2176
|
-
this.id = id;
|
|
2177
|
-
this.name = name;
|
|
2222
|
+
get headers() {
|
|
2223
|
+
return this.requestForm.get('headers');
|
|
2178
2224
|
}
|
|
2179
|
-
|
|
2180
|
-
|
|
2225
|
+
get isValid() {
|
|
2226
|
+
this.requestForm.markAllAsTouched();
|
|
2227
|
+
return this.requestForm.valid;
|
|
2181
2228
|
}
|
|
2182
|
-
}
|
|
2183
|
-
|
|
2184
|
-
class StateManagerDemoService extends HTTPManagerStateService {
|
|
2185
2229
|
constructor() {
|
|
2186
|
-
super(ApiRequest.adapt({
|
|
2187
|
-
server: "",
|
|
2188
|
-
path: [],
|
|
2189
|
-
headers: {},
|
|
2190
|
-
adapter: ClientInfo.adapt,
|
|
2191
|
-
mapper: ClientInfoMapper.adapt,
|
|
2192
|
-
stream: false,
|
|
2193
|
-
}), DataType.ARRAY, DatabaseStorage.adapt());
|
|
2194
|
-
}
|
|
2195
|
-
setAPIOptions(apiOptions, dataType, database) {
|
|
2196
|
-
this.setApiRequestOptions(apiOptions, dataType, database);
|
|
2197
|
-
}
|
|
2198
|
-
getClients() {
|
|
2199
|
-
// const headers = {
|
|
2200
|
-
// auth: "sample-auth-token"
|
|
2201
|
-
// }
|
|
2202
|
-
// const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
|
|
2203
|
-
this.fetchRecords();
|
|
2204
|
-
}
|
|
2205
|
-
createClient(data) {
|
|
2206
|
-
// const headers = {
|
|
2207
|
-
// auth: "sample-auth-token"
|
|
2208
|
-
// }
|
|
2209
|
-
// const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
|
|
2210
|
-
this.createRecord(data);
|
|
2211
|
-
}
|
|
2212
|
-
updateClient(data) {
|
|
2213
|
-
// const headers = {
|
|
2214
|
-
// auth: "sample-auth-token"
|
|
2215
|
-
// }
|
|
2216
|
-
data.id = 1031;
|
|
2217
|
-
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
2218
|
-
this.updateRecord(data, sampleOptions);
|
|
2219
|
-
}
|
|
2220
|
-
deleteClient(data) {
|
|
2221
|
-
// const headers = {
|
|
2222
|
-
// auth: "sample-auth-token"
|
|
2223
|
-
// }
|
|
2224
|
-
data.id = 1031;
|
|
2225
|
-
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
2226
|
-
this.deleteRecord(sampleOptions);
|
|
2227
|
-
}
|
|
2228
|
-
streamRequest() {
|
|
2229
|
-
const headers = {
|
|
2230
|
-
auth: "sample-auth-token"
|
|
2231
|
-
};
|
|
2232
|
-
// const sampleOptions = RequestOptions.adapt({ path: [1], headers })
|
|
2233
|
-
this.fetchStream();
|
|
2234
|
-
}
|
|
2235
|
-
streamAIRequest(data) {
|
|
2236
|
-
const headers = {
|
|
2237
|
-
auth: "sample-auth-token"
|
|
2238
|
-
};
|
|
2239
|
-
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
2240
|
-
this.createStream(data, sampleOptions);
|
|
2241
|
-
// this.fetchStream(sampleOptions)
|
|
2242
|
-
}
|
|
2243
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2244
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, providedIn: 'root' }); }
|
|
2245
|
-
}
|
|
2246
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, decorators: [{
|
|
2247
|
-
type: Injectable,
|
|
2248
|
-
args: [{
|
|
2249
|
-
providedIn: 'root'
|
|
2250
|
-
}]
|
|
2251
|
-
}], ctorParameters: function () { return []; } });
|
|
2252
|
-
|
|
2253
|
-
class AIPrompt {
|
|
2254
|
-
constructor(response = '') {
|
|
2255
|
-
this.response = response;
|
|
2256
|
-
}
|
|
2257
|
-
static adapt(item) {
|
|
2258
|
-
return new AIPrompt(item?.response);
|
|
2259
|
-
}
|
|
2260
|
-
}
|
|
2261
|
-
|
|
2262
|
-
class RequestManagerStateDemoComponent {
|
|
2263
|
-
get dataObservable$() {
|
|
2264
|
-
switch (this.requestType) {
|
|
2265
|
-
case 'GET':
|
|
2266
|
-
return this.GET$;
|
|
2267
|
-
case 'PUT':
|
|
2268
|
-
return this.PUT$;
|
|
2269
|
-
case 'POST':
|
|
2270
|
-
return this.POST$;
|
|
2271
|
-
case 'DELETE':
|
|
2272
|
-
return this.DELETE$;
|
|
2273
|
-
case 'STREAM':
|
|
2274
|
-
return this.STREAM;
|
|
2275
|
-
case 'STREAM_AI':
|
|
2276
|
-
return this.STREAM_AI;
|
|
2277
|
-
default:
|
|
2278
|
-
return this.GET$;
|
|
2279
|
-
break;
|
|
2280
|
-
}
|
|
2281
|
-
}
|
|
2282
|
-
get hasChanged() {
|
|
2283
|
-
return this.requestForm.dirty;
|
|
2284
|
-
}
|
|
2285
|
-
get dataType() {
|
|
2286
|
-
return this.requestForm.get("datatype")?.value;
|
|
2287
|
-
}
|
|
2288
|
-
get database() {
|
|
2289
|
-
return this.requestForm.get("database")?.value;
|
|
2290
|
-
}
|
|
2291
|
-
get retry() {
|
|
2292
|
-
return this.requestForm.get("retry")?.value;
|
|
2293
|
-
}
|
|
2294
|
-
get headers() {
|
|
2295
|
-
return this.requestForm.get('headers');
|
|
2296
|
-
}
|
|
2297
|
-
get isValid() {
|
|
2298
|
-
this.requestForm.markAllAsTouched();
|
|
2299
|
-
return this.requestForm.valid;
|
|
2300
|
-
}
|
|
2301
|
-
constructor() {
|
|
2302
|
-
this.stateManagerDemoService = inject(StateManagerDemoService);
|
|
2303
2230
|
this.displayedColumns = ['id', 'name', 'lastName', 'age'];
|
|
2304
2231
|
this.fb = inject(FormBuilder);
|
|
2232
|
+
this.toastMessage = inject(ToastMessageDisplayService);
|
|
2305
2233
|
this.httpManagerService = inject(HTTPManagerService);
|
|
2306
|
-
this.isPending$ = this.
|
|
2307
|
-
this.error$ = this.stateManagerDemoService.error$;
|
|
2234
|
+
this.isPending$ = this.httpManagerService.isPending$;
|
|
2308
2235
|
this.countdown$ = this.httpManagerService.countdown$;
|
|
2309
2236
|
this.GET_error$ = new BehaviorSubject('');
|
|
2310
2237
|
this.POST_error$ = new BehaviorSubject('');
|
|
2311
2238
|
this.PUT_error$ = new BehaviorSubject('');
|
|
2312
2239
|
this.DELETE_error$ = new BehaviorSubject('');
|
|
2313
2240
|
this.STREAM_error$ = new BehaviorSubject('');
|
|
2314
|
-
this.
|
|
2315
|
-
this.
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
.pipe(map((items) => (items) ? items.map((item) => item.response) : []), map((items) => items.join('').trim()));
|
|
2241
|
+
this.STREAM_AI_error$ = new BehaviorSubject('');
|
|
2242
|
+
this.requestParams = {
|
|
2243
|
+
GET: ApiRequest.adapt(),
|
|
2244
|
+
POST: ApiRequest.adapt(),
|
|
2245
|
+
PUT: ApiRequest.adapt(),
|
|
2246
|
+
DELETE: ApiRequest.adapt(),
|
|
2247
|
+
STREAM: ApiRequest.adapt(),
|
|
2248
|
+
};
|
|
2323
2249
|
this.questionControl = this.fb.control("", [Validators.required]);
|
|
2324
|
-
this.
|
|
2250
|
+
this.downloadRequest = ApiRequest.adapt({
|
|
2251
|
+
server: 'http://localhost:4200/assets',
|
|
2252
|
+
path: ['icons1.svg']
|
|
2253
|
+
});
|
|
2325
2254
|
this.sampleClientData = {
|
|
2326
2255
|
id: 0,
|
|
2327
2256
|
name: "Old School Dates",
|
|
@@ -2334,22 +2263,15 @@ class RequestManagerStateDemoComponent {
|
|
|
2334
2263
|
icon: "",
|
|
2335
2264
|
imageFile: "",
|
|
2336
2265
|
};
|
|
2337
|
-
this.selectedRecord = this.fb.control(null);
|
|
2338
2266
|
this.requestForm = this.fb.group({
|
|
2339
|
-
datatype: this.fb.control('ARRAY'),
|
|
2340
2267
|
path: this.fb.control(""),
|
|
2341
2268
|
headers: this.fb.array([]),
|
|
2342
2269
|
adapter: [null],
|
|
2343
|
-
mapper: [null],
|
|
2344
2270
|
retry: this.fb.group({
|
|
2345
2271
|
times: [3],
|
|
2346
2272
|
delay: [3],
|
|
2347
2273
|
}),
|
|
2348
2274
|
polling: [3],
|
|
2349
|
-
database: this.fb.group({
|
|
2350
|
-
table: [''],
|
|
2351
|
-
expiresIn: ['1m'],
|
|
2352
|
-
})
|
|
2353
2275
|
});
|
|
2354
2276
|
this.sampleAdaptors = [
|
|
2355
2277
|
{ label: "ClientInfo Basic", value: ClientInfo.adapt },
|
|
@@ -2365,35 +2287,25 @@ class RequestManagerStateDemoComponent {
|
|
|
2365
2287
|
};
|
|
2366
2288
|
}
|
|
2367
2289
|
ngOnInit() {
|
|
2368
|
-
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
}
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
case 'STREAM':
|
|
2388
|
-
this.STREAM.next(data);
|
|
2389
|
-
break;
|
|
2390
|
-
case 'STREAM_AI':
|
|
2391
|
-
this.STREAM_AI.next(data);
|
|
2392
|
-
break;
|
|
2393
|
-
default:
|
|
2394
|
-
break;
|
|
2395
|
-
}
|
|
2396
|
-
})).subscribe();
|
|
2290
|
+
// const reqGet2 = ApiRequest.adapt({
|
|
2291
|
+
// server,
|
|
2292
|
+
// path: ['clients'],
|
|
2293
|
+
// headers: { authentication: "Bearer <KEY>" },
|
|
2294
|
+
// adapter: ClientInfo,
|
|
2295
|
+
// dataType: DataType.OBJECT,
|
|
2296
|
+
// // concurrent: false,
|
|
2297
|
+
// // polling: 3, //seconds
|
|
2298
|
+
// });
|
|
2299
|
+
// const req2 = [1024,1025,1026].map(item => {
|
|
2300
|
+
// return this.httpManagerService.getRequest<ClientInfo[]>(reqGet2, [item])
|
|
2301
|
+
// .pipe(
|
|
2302
|
+
// catchError(error => {
|
|
2303
|
+
// return throwError(() => new Error(error.error.message));
|
|
2304
|
+
// })
|
|
2305
|
+
// )
|
|
2306
|
+
// })
|
|
2307
|
+
// forkJoin(req2)
|
|
2308
|
+
// .subscribe(res => console.log(res))
|
|
2397
2309
|
}
|
|
2398
2310
|
addHeader() {
|
|
2399
2311
|
const header = this.fb.group({
|
|
@@ -2408,7 +2320,7 @@ class RequestManagerStateDemoComponent {
|
|
|
2408
2320
|
compileRequest() {
|
|
2409
2321
|
const requestParams = this.requestForm.value;
|
|
2410
2322
|
requestParams.headers = this.arrayObjectsToObjects(requestParams.headers || []);
|
|
2411
|
-
const pathReq = (requestParams.path || "").split("/");
|
|
2323
|
+
const pathReq = (requestParams.path === "") ? [] : (requestParams.path || "").split("/");
|
|
2412
2324
|
if (!this.pollingState.checked)
|
|
2413
2325
|
requestParams.polling = 0;
|
|
2414
2326
|
if (!this.failedState.checked) {
|
|
@@ -2420,62 +2332,115 @@ class RequestManagerStateDemoComponent {
|
|
|
2420
2332
|
...{ path: pathReq },
|
|
2421
2333
|
});
|
|
2422
2334
|
}
|
|
2423
|
-
|
|
2335
|
+
onGetRequest() {
|
|
2424
2336
|
if (!this.isValid)
|
|
2425
2337
|
return;
|
|
2426
2338
|
const reqParams = this.compileRequest();
|
|
2427
|
-
|
|
2428
|
-
|
|
2429
|
-
this.
|
|
2430
|
-
this.
|
|
2431
|
-
|
|
2432
|
-
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
this.stateManagerDemoService.refreshData();
|
|
2437
|
-
}
|
|
2438
|
-
onGetRequest() {
|
|
2439
|
-
this.requestType = 'GET';
|
|
2440
|
-
this.stateManagerDemoService.getClients();
|
|
2339
|
+
this.requestParams.GET = reqParams;
|
|
2340
|
+
this.GET$ = EMPTY; //Cancels Previous
|
|
2341
|
+
this.GET_error$.next('');
|
|
2342
|
+
this.GET$ = this.httpManagerService.getRequest(reqParams)
|
|
2343
|
+
.pipe(
|
|
2344
|
+
// tap((data) => console.log("API GET response", data)),
|
|
2345
|
+
catchError(error => {
|
|
2346
|
+
return throwError(() => this.errorHandling(error, 'GET'));
|
|
2347
|
+
}));
|
|
2441
2348
|
}
|
|
2442
2349
|
onCreateRequest() {
|
|
2443
|
-
this.
|
|
2444
|
-
|
|
2350
|
+
if (!this.isValid)
|
|
2351
|
+
return;
|
|
2352
|
+
const reqParams = this.compileRequest();
|
|
2353
|
+
this.requestParams.POST = reqParams;
|
|
2354
|
+
this.POST$ = EMPTY; //Cancels Previous
|
|
2355
|
+
this.POST_error$.next('');
|
|
2356
|
+
this.POST$ = this.httpManagerService.postRequest(this.sampleClientData, reqParams)
|
|
2357
|
+
.pipe(
|
|
2358
|
+
// tap((data) => console.log("API POST response", data)),
|
|
2359
|
+
catchError(error => {
|
|
2360
|
+
return throwError(() => this.errorHandling(error, 'POST'));
|
|
2361
|
+
}));
|
|
2445
2362
|
}
|
|
2446
2363
|
onUpdateRequest() {
|
|
2447
|
-
this.
|
|
2448
|
-
|
|
2364
|
+
if (!this.isValid)
|
|
2365
|
+
return;
|
|
2366
|
+
const reqParams = this.compileRequest();
|
|
2367
|
+
this.sampleClientData.id = reqParams.path[reqParams.path.length - 1];
|
|
2368
|
+
this.requestParams.PUT = reqParams;
|
|
2369
|
+
this.PUT$ = EMPTY; //Cancels Previous
|
|
2370
|
+
this.PUT_error$.next('');
|
|
2371
|
+
this.PUT$ = this.httpManagerService.putRequest(this.sampleClientData, reqParams)
|
|
2372
|
+
.pipe(
|
|
2373
|
+
// tap((data) => console.log("API PUT response", data)),
|
|
2374
|
+
catchError(error => {
|
|
2375
|
+
return throwError(() => this.errorHandling(error, 'PUT'));
|
|
2376
|
+
}));
|
|
2449
2377
|
}
|
|
2450
2378
|
onDeleteRequest() {
|
|
2451
|
-
this.
|
|
2452
|
-
|
|
2379
|
+
if (!this.isValid)
|
|
2380
|
+
return;
|
|
2381
|
+
const reqParams = this.compileRequest();
|
|
2382
|
+
this.requestParams.DELETE = reqParams;
|
|
2383
|
+
this.DELETE$ = EMPTY; //Cancels Previous
|
|
2384
|
+
this.DELETE_error$.next('');
|
|
2385
|
+
this.DELETE$ = this.httpManagerService.deleteRequest(reqParams)
|
|
2386
|
+
.pipe(
|
|
2387
|
+
// tap((data) => console.log("API DELETE response", data)),
|
|
2388
|
+
catchError(error => {
|
|
2389
|
+
return throwError(() => this.errorHandling(error, 'DELETE'));
|
|
2390
|
+
}));
|
|
2453
2391
|
}
|
|
2454
2392
|
onStreamPostRequest() {
|
|
2455
2393
|
if (!this.isValid)
|
|
2456
2394
|
return;
|
|
2457
|
-
this.requestType = 'STREAM_AI';
|
|
2458
2395
|
const reqParams = this.compileRequest();
|
|
2459
2396
|
reqParams.server = "http://localhost:11434/api";
|
|
2460
2397
|
reqParams.path = ["generate"];
|
|
2461
2398
|
reqParams.stream = true;
|
|
2462
|
-
this.stateManagerDemoService.setAPIOptions(reqParams, DataType.ARRAY);
|
|
2463
2399
|
const payload = {
|
|
2464
2400
|
model: "mistral",
|
|
2465
2401
|
prompt: this.questionControl.value,
|
|
2466
2402
|
stream: reqParams.stream
|
|
2467
2403
|
};
|
|
2468
|
-
this.
|
|
2404
|
+
this.requestParams.STREAM = reqParams;
|
|
2405
|
+
this.STREAM_AI$ = EMPTY;
|
|
2406
|
+
this.STREAM_AI_error$.next('');
|
|
2407
|
+
this.STREAM_AI$ = this.httpManagerService.postRequest(payload, reqParams)
|
|
2408
|
+
.pipe(map(items => items.map((word) => word.response).flat().join('')), tap(() => this.questionControl.reset()), catchError(error => {
|
|
2409
|
+
return throwError(() => this.errorHandling(error, 'STREAM'));
|
|
2410
|
+
}));
|
|
2469
2411
|
}
|
|
2470
2412
|
onStreamRequest() {
|
|
2471
2413
|
if (!this.isValid)
|
|
2472
2414
|
return;
|
|
2473
|
-
this.requestType = 'STREAM';
|
|
2474
2415
|
const reqParams = this.compileRequest();
|
|
2475
2416
|
reqParams.server = "oidc";
|
|
2476
2417
|
reqParams.stream = true;
|
|
2477
|
-
this.
|
|
2478
|
-
|
|
2418
|
+
this.STREAM$ = this.httpManagerService.getRequest(reqParams)
|
|
2419
|
+
.pipe(
|
|
2420
|
+
// tap((data) => console.log("API STREAM response", data)),
|
|
2421
|
+
catchError(error => {
|
|
2422
|
+
return throwError(() => this.errorHandling(error, 'STREAM'));
|
|
2423
|
+
}));
|
|
2424
|
+
}
|
|
2425
|
+
onDownloadCompleted() {
|
|
2426
|
+
const message = "Download Completed";
|
|
2427
|
+
const display = ToastDisplay.adapt({
|
|
2428
|
+
message,
|
|
2429
|
+
action: 'Ok',
|
|
2430
|
+
color: ToastColors.SUCCESS,
|
|
2431
|
+
icon: 'sentiment_satisfied_alt',
|
|
2432
|
+
});
|
|
2433
|
+
this.toastMessage.toastMessage(display);
|
|
2434
|
+
}
|
|
2435
|
+
onDownloadFailed(err) {
|
|
2436
|
+
const message = "Download Failed";
|
|
2437
|
+
const display = ToastDisplay.adapt({
|
|
2438
|
+
message,
|
|
2439
|
+
action: 'Ok',
|
|
2440
|
+
color: ToastColors.ERROR,
|
|
2441
|
+
icon: 'warning',
|
|
2442
|
+
});
|
|
2443
|
+
this.toastMessage.toastMessage(display);
|
|
2479
2444
|
}
|
|
2480
2445
|
errorHandling(err, type) {
|
|
2481
2446
|
if (type === 'GET')
|
|
@@ -2489,12 +2454,12 @@ class RequestManagerStateDemoComponent {
|
|
|
2489
2454
|
if (type === 'STREAM')
|
|
2490
2455
|
this.STREAM_error$.next(err.message);
|
|
2491
2456
|
}
|
|
2492
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
2493
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RequestManagerStateDemoComponent, selector: "app-request-manager-state-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error | json }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\" \n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\" \n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\" \n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.domain}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n \n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div>{{ (GET$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div>{{ (POST$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div>{{ (PUT$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div>{{ (DELETE$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n \n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n</div>", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i8.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.JsonPipe, name: "json" }] }); }
|
|
2457
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestManagerDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2458
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RequestManagerDemoComponent, selector: "app-request-manager-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"pollingState.checked && !(isPending$ | async)\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(GET$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(POST$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(PUT$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(DELETE$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_AI_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n <div>\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n <div>\n Download File\n </div>\n <div style=\"flex:1; margin-left: 1rem;\">\n <mat-slide-toggle #disable>\n <span *ngIf=\"disable.checked; else DISABLE\">\n Enable\n </span>\n <ng-template #DISABLE>Disable</ng-template>\n </mat-slide-toggle>\n </div>\n </h2>\n <div>\n <app-file-downloader-action\n [disabled]=\"disable.checked\"\n [delayError]=\"3\"\n [apiRequest]=\"downloadRequest\"\n (completed)=\"onDownloadCompleted()\"\n (failed)=\"onDownloadFailed($event)\"\n ></app-file-downloader-action>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i8.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: FileDownloadActionComponent, selector: "app-file-downloader-action", inputs: ["delayError", "apiRequest", "displayErrorMessage", "labels", "disabled"], outputs: ["completed"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.JsonPipe, name: "json" }] }); }
|
|
2494
2459
|
}
|
|
2495
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
2460
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestManagerDemoComponent, decorators: [{
|
|
2496
2461
|
type: Component,
|
|
2497
|
-
args: [{ selector: 'app-request-manager-state-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error | json }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\" \n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\" \n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\" \n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.domain}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n \n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div>{{ (GET$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div>{{ (POST$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div>{{ (PUT$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div>{{ (DELETE$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n \n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n</div>", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"] }]
|
|
2462
|
+
args: [{ selector: 'app-request-manager-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"pollingState.checked && !(isPending$ | async)\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(GET$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(POST$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(PUT$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(DELETE$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_AI_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n <div>\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n <div>\n Download File\n </div>\n <div style=\"flex:1; margin-left: 1rem;\">\n <mat-slide-toggle #disable>\n <span *ngIf=\"disable.checked; else DISABLE\">\n Enable\n </span>\n <ng-template #DISABLE>Disable</ng-template>\n </mat-slide-toggle>\n </div>\n </h2>\n <div>\n <app-file-downloader-action\n [disabled]=\"disable.checked\"\n [delayError]=\"3\"\n [apiRequest]=\"downloadRequest\"\n (completed)=\"onDownloadCompleted()\"\n (failed)=\"onDownloadFailed($event)\"\n ></app-file-downloader-action>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"] }]
|
|
2498
2463
|
}], ctorParameters: function () { return []; }, propDecorators: { failedState: [{
|
|
2499
2464
|
type: ViewChild,
|
|
2500
2465
|
args: ["failedState", { static: true }]
|
|
@@ -2503,9 +2468,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2503
2468
|
args: ["pollingState", { static: true }]
|
|
2504
2469
|
}] } });
|
|
2505
2470
|
|
|
2506
|
-
class
|
|
2471
|
+
class StateManagerDemoService extends HTTPManagerStateService {
|
|
2472
|
+
constructor() {
|
|
2473
|
+
super(ApiRequest.adapt({
|
|
2474
|
+
server: "",
|
|
2475
|
+
path: [],
|
|
2476
|
+
headers: {},
|
|
2477
|
+
adapter: ClientInfo.adapt,
|
|
2478
|
+
mapper: ClientInfoMapper.adapt,
|
|
2479
|
+
stream: false,
|
|
2480
|
+
}), DataType.ARRAY, DatabaseStorage.adapt());
|
|
2481
|
+
}
|
|
2482
|
+
setAPIOptions(apiOptions, dataType, database) {
|
|
2483
|
+
this.setApiRequestOptions(apiOptions, dataType, database);
|
|
2484
|
+
}
|
|
2485
|
+
getClients() {
|
|
2486
|
+
// const headers = {
|
|
2487
|
+
// auth: "sample-auth-token"
|
|
2488
|
+
// }
|
|
2489
|
+
// const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
|
|
2490
|
+
this.fetchRecords();
|
|
2491
|
+
}
|
|
2492
|
+
createClient(data) {
|
|
2493
|
+
// const headers = {
|
|
2494
|
+
// auth: "sample-auth-token"
|
|
2495
|
+
// }
|
|
2496
|
+
// const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
|
|
2497
|
+
this.createRecord(data);
|
|
2498
|
+
}
|
|
2499
|
+
updateClient(data) {
|
|
2500
|
+
// const headers = {
|
|
2501
|
+
// auth: "sample-auth-token"
|
|
2502
|
+
// }
|
|
2503
|
+
data.id = 1031;
|
|
2504
|
+
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
2505
|
+
this.updateRecord(data, sampleOptions);
|
|
2506
|
+
}
|
|
2507
|
+
deleteClient(data) {
|
|
2508
|
+
// const headers = {
|
|
2509
|
+
// auth: "sample-auth-token"
|
|
2510
|
+
// }
|
|
2511
|
+
data.id = 1031;
|
|
2512
|
+
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
2513
|
+
this.deleteRecord(sampleOptions);
|
|
2514
|
+
}
|
|
2515
|
+
streamRequest() {
|
|
2516
|
+
const headers = {
|
|
2517
|
+
auth: "sample-auth-token"
|
|
2518
|
+
};
|
|
2519
|
+
// const sampleOptions = RequestOptions.adapt({ path: [1], headers })
|
|
2520
|
+
this.fetchStream();
|
|
2521
|
+
}
|
|
2522
|
+
streamAIRequest(data) {
|
|
2523
|
+
const headers = {
|
|
2524
|
+
auth: "sample-auth-token"
|
|
2525
|
+
};
|
|
2526
|
+
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
2527
|
+
this.createStream(data, sampleOptions);
|
|
2528
|
+
// this.fetchStream(sampleOptions)
|
|
2529
|
+
}
|
|
2530
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2531
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, providedIn: 'root' }); }
|
|
2532
|
+
}
|
|
2533
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, decorators: [{
|
|
2534
|
+
type: Injectable,
|
|
2535
|
+
args: [{
|
|
2536
|
+
providedIn: 'root'
|
|
2537
|
+
}]
|
|
2538
|
+
}], ctorParameters: function () { return []; } });
|
|
2539
|
+
|
|
2540
|
+
class RequestManagerStateDemoComponent {
|
|
2541
|
+
get dataObservable$() {
|
|
2542
|
+
switch (this.requestType) {
|
|
2543
|
+
case 'GET':
|
|
2544
|
+
return this.GET$;
|
|
2545
|
+
case 'PUT':
|
|
2546
|
+
return this.PUT$;
|
|
2547
|
+
case 'POST':
|
|
2548
|
+
return this.POST$;
|
|
2549
|
+
case 'DELETE':
|
|
2550
|
+
return this.DELETE$;
|
|
2551
|
+
case 'STREAM':
|
|
2552
|
+
return this.STREAM;
|
|
2553
|
+
case 'STREAM_AI':
|
|
2554
|
+
return this.STREAM_AI;
|
|
2555
|
+
default:
|
|
2556
|
+
return this.GET$;
|
|
2557
|
+
break;
|
|
2558
|
+
}
|
|
2559
|
+
}
|
|
2560
|
+
get hasChanged() {
|
|
2561
|
+
return this.requestForm.dirty;
|
|
2562
|
+
}
|
|
2563
|
+
get dataType() {
|
|
2564
|
+
return this.requestForm.get("datatype")?.value;
|
|
2565
|
+
}
|
|
2566
|
+
get database() {
|
|
2567
|
+
return this.requestForm.get("database")?.value;
|
|
2568
|
+
}
|
|
2507
2569
|
get retry() {
|
|
2508
|
-
return this.requestForm.get(
|
|
2570
|
+
return this.requestForm.get("retry")?.value;
|
|
2509
2571
|
}
|
|
2510
2572
|
get headers() {
|
|
2511
2573
|
return this.requestForm.get('headers');
|
|
@@ -2515,30 +2577,29 @@ class RequestManagerDemoComponent {
|
|
|
2515
2577
|
return this.requestForm.valid;
|
|
2516
2578
|
}
|
|
2517
2579
|
constructor() {
|
|
2580
|
+
this.stateManagerDemoService = inject(StateManagerDemoService);
|
|
2518
2581
|
this.displayedColumns = ['id', 'name', 'lastName', 'age'];
|
|
2519
2582
|
this.fb = inject(FormBuilder);
|
|
2520
|
-
this.toastMessage = inject(ToastMessageDisplayService);
|
|
2521
2583
|
this.httpManagerService = inject(HTTPManagerService);
|
|
2522
|
-
this.isPending$ = this.
|
|
2584
|
+
this.isPending$ = this.stateManagerDemoService.isPending$;
|
|
2585
|
+
this.error$ = this.stateManagerDemoService.error$;
|
|
2523
2586
|
this.countdown$ = this.httpManagerService.countdown$;
|
|
2524
2587
|
this.GET_error$ = new BehaviorSubject('');
|
|
2525
2588
|
this.POST_error$ = new BehaviorSubject('');
|
|
2526
2589
|
this.PUT_error$ = new BehaviorSubject('');
|
|
2527
2590
|
this.DELETE_error$ = new BehaviorSubject('');
|
|
2528
2591
|
this.STREAM_error$ = new BehaviorSubject('');
|
|
2529
|
-
this.
|
|
2530
|
-
this.
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2592
|
+
this.GET$ = new BehaviorSubject(null);
|
|
2593
|
+
this.POST$ = new BehaviorSubject(null);
|
|
2594
|
+
this.PUT$ = new BehaviorSubject(null);
|
|
2595
|
+
this.DELETE$ = new BehaviorSubject(null);
|
|
2596
|
+
this.STREAM = new BehaviorSubject(null);
|
|
2597
|
+
this.STREAM$ = this.STREAM.asObservable();
|
|
2598
|
+
this.STREAM_AI = new BehaviorSubject(null);
|
|
2599
|
+
this.STREAM_AI$ = this.STREAM_AI.asObservable()
|
|
2600
|
+
.pipe(map((items) => (items) ? items.map((item) => item.response) : []), map((items) => items.join('').trim()));
|
|
2537
2601
|
this.questionControl = this.fb.control("", [Validators.required]);
|
|
2538
|
-
this.
|
|
2539
|
-
server: 'http://localhost:4200/assets',
|
|
2540
|
-
path: ['icons1.svg']
|
|
2541
|
-
});
|
|
2602
|
+
this.requestType = '';
|
|
2542
2603
|
this.sampleClientData = {
|
|
2543
2604
|
id: 0,
|
|
2544
2605
|
name: "Old School Dates",
|
|
@@ -2551,49 +2612,66 @@ class RequestManagerDemoComponent {
|
|
|
2551
2612
|
icon: "",
|
|
2552
2613
|
imageFile: "",
|
|
2553
2614
|
};
|
|
2615
|
+
this.selectedRecord = this.fb.control(null);
|
|
2554
2616
|
this.requestForm = this.fb.group({
|
|
2617
|
+
datatype: this.fb.control('ARRAY'),
|
|
2555
2618
|
path: this.fb.control(""),
|
|
2556
2619
|
headers: this.fb.array([]),
|
|
2557
2620
|
adapter: [null],
|
|
2621
|
+
mapper: [null],
|
|
2558
2622
|
retry: this.fb.group({
|
|
2559
2623
|
times: [3],
|
|
2560
2624
|
delay: [3],
|
|
2561
2625
|
}),
|
|
2562
2626
|
polling: [3],
|
|
2627
|
+
database: this.fb.group({
|
|
2628
|
+
table: [''],
|
|
2629
|
+
expiresIn: ['1m'],
|
|
2630
|
+
})
|
|
2563
2631
|
});
|
|
2564
2632
|
this.sampleAdaptors = [
|
|
2565
|
-
{ label: "ClientInfo Basic", value: ClientInfo.adapt },
|
|
2566
|
-
{ label: "AI Prompt", value: AIPrompt.adapt },
|
|
2567
|
-
];
|
|
2568
|
-
this.sampleMappers = [
|
|
2569
|
-
{ label: "Mapper Basic", value: ClientInfoMapper.adapt },
|
|
2570
|
-
{ label: "AI Prompt", value: AIPrompt.adapt },
|
|
2571
|
-
];
|
|
2572
|
-
// server = `http://sample-endpoint/as/authorization.oauth2`
|
|
2573
|
-
this.arrayObjectsToObjects = (arr) => {
|
|
2574
|
-
return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {};
|
|
2575
|
-
};
|
|
2576
|
-
}
|
|
2577
|
-
ngOnInit() {
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2633
|
+
{ label: "ClientInfo Basic", value: ClientInfo.adapt },
|
|
2634
|
+
{ label: "AI Prompt", value: AIPrompt.adapt },
|
|
2635
|
+
];
|
|
2636
|
+
this.sampleMappers = [
|
|
2637
|
+
{ label: "Mapper Basic", value: ClientInfoMapper.adapt },
|
|
2638
|
+
{ label: "AI Prompt", value: AIPrompt.adapt },
|
|
2639
|
+
];
|
|
2640
|
+
// server = `http://sample-endpoint/as/authorization.oauth2`
|
|
2641
|
+
this.arrayObjectsToObjects = (arr) => {
|
|
2642
|
+
return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {};
|
|
2643
|
+
};
|
|
2644
|
+
}
|
|
2645
|
+
ngOnInit() {
|
|
2646
|
+
this.selectedRecord.valueChanges
|
|
2647
|
+
.subscribe((data) => {
|
|
2648
|
+
this.selectedRecord$ = (data) ? this.stateManagerDemoService.selectRecord$(data.id) : EMPTY;
|
|
2649
|
+
});
|
|
2650
|
+
this.stateManagerDemoService.data$
|
|
2651
|
+
.pipe(tap((data) => {
|
|
2652
|
+
switch (this.requestType) {
|
|
2653
|
+
case 'GET':
|
|
2654
|
+
this.GET$.next(data);
|
|
2655
|
+
break;
|
|
2656
|
+
case 'PUT':
|
|
2657
|
+
this.PUT$.next(data);
|
|
2658
|
+
break;
|
|
2659
|
+
case 'POST':
|
|
2660
|
+
this.POST$.next(data);
|
|
2661
|
+
break;
|
|
2662
|
+
case 'DELETE':
|
|
2663
|
+
this.DELETE$.next(data);
|
|
2664
|
+
break;
|
|
2665
|
+
case 'STREAM':
|
|
2666
|
+
this.STREAM.next(data);
|
|
2667
|
+
break;
|
|
2668
|
+
case 'STREAM_AI':
|
|
2669
|
+
this.STREAM_AI.next(data);
|
|
2670
|
+
break;
|
|
2671
|
+
default:
|
|
2672
|
+
break;
|
|
2673
|
+
}
|
|
2674
|
+
})).subscribe();
|
|
2597
2675
|
}
|
|
2598
2676
|
addHeader() {
|
|
2599
2677
|
const header = this.fb.group({
|
|
@@ -2608,7 +2686,7 @@ class RequestManagerDemoComponent {
|
|
|
2608
2686
|
compileRequest() {
|
|
2609
2687
|
const requestParams = this.requestForm.value;
|
|
2610
2688
|
requestParams.headers = this.arrayObjectsToObjects(requestParams.headers || []);
|
|
2611
|
-
const pathReq = (requestParams.path
|
|
2689
|
+
const pathReq = (requestParams.path || "").split("/");
|
|
2612
2690
|
if (!this.pollingState.checked)
|
|
2613
2691
|
requestParams.polling = 0;
|
|
2614
2692
|
if (!this.failedState.checked) {
|
|
@@ -2620,115 +2698,62 @@ class RequestManagerDemoComponent {
|
|
|
2620
2698
|
...{ path: pathReq },
|
|
2621
2699
|
});
|
|
2622
2700
|
}
|
|
2623
|
-
|
|
2701
|
+
onSetStateOptions() {
|
|
2624
2702
|
if (!this.isValid)
|
|
2625
2703
|
return;
|
|
2626
2704
|
const reqParams = this.compileRequest();
|
|
2627
|
-
|
|
2628
|
-
this.
|
|
2629
|
-
this.
|
|
2630
|
-
this.
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
|
|
2634
|
-
|
|
2635
|
-
|
|
2705
|
+
const db = DatabaseStorage.adapt(this.database);
|
|
2706
|
+
const type = this.dataType === "ARRAY" ? DataType.ARRAY : DataType.OBJECT;
|
|
2707
|
+
this.stateManagerDemoService.setAPIOptions(reqParams, type, db);
|
|
2708
|
+
this.requestForm.markAsPristine();
|
|
2709
|
+
}
|
|
2710
|
+
onClearRecords() {
|
|
2711
|
+
this.stateManagerDemoService.clearRecords();
|
|
2712
|
+
}
|
|
2713
|
+
onRefreshRecords() {
|
|
2714
|
+
this.stateManagerDemoService.refreshData();
|
|
2715
|
+
}
|
|
2716
|
+
onGetRequest() {
|
|
2717
|
+
this.requestType = 'GET';
|
|
2718
|
+
this.stateManagerDemoService.getClients();
|
|
2636
2719
|
}
|
|
2637
2720
|
onCreateRequest() {
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
const reqParams = this.compileRequest();
|
|
2641
|
-
this.requestParams.POST = reqParams;
|
|
2642
|
-
this.POST$ = EMPTY; //Cancels Previous
|
|
2643
|
-
this.POST_error$.next('');
|
|
2644
|
-
this.POST$ = this.httpManagerService.postRequest(this.sampleClientData, reqParams)
|
|
2645
|
-
.pipe(
|
|
2646
|
-
// tap((data) => console.log("API POST response", data)),
|
|
2647
|
-
catchError(error => {
|
|
2648
|
-
return throwError(() => this.errorHandling(error, 'POST'));
|
|
2649
|
-
}));
|
|
2721
|
+
this.requestType = 'POST';
|
|
2722
|
+
this.stateManagerDemoService.createClient(this.sampleClientData);
|
|
2650
2723
|
}
|
|
2651
2724
|
onUpdateRequest() {
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
const reqParams = this.compileRequest();
|
|
2655
|
-
this.sampleClientData.id = reqParams.path[reqParams.path.length - 1];
|
|
2656
|
-
this.requestParams.PUT = reqParams;
|
|
2657
|
-
this.PUT$ = EMPTY; //Cancels Previous
|
|
2658
|
-
this.PUT_error$.next('');
|
|
2659
|
-
this.PUT$ = this.httpManagerService.putRequest(this.sampleClientData, reqParams)
|
|
2660
|
-
.pipe(
|
|
2661
|
-
// tap((data) => console.log("API PUT response", data)),
|
|
2662
|
-
catchError(error => {
|
|
2663
|
-
return throwError(() => this.errorHandling(error, 'PUT'));
|
|
2664
|
-
}));
|
|
2725
|
+
this.requestType = 'PUT';
|
|
2726
|
+
this.stateManagerDemoService.updateClient(this.sampleClientData);
|
|
2665
2727
|
}
|
|
2666
2728
|
onDeleteRequest() {
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
const reqParams = this.compileRequest();
|
|
2670
|
-
this.requestParams.DELETE = reqParams;
|
|
2671
|
-
this.DELETE$ = EMPTY; //Cancels Previous
|
|
2672
|
-
this.DELETE_error$.next('');
|
|
2673
|
-
this.DELETE$ = this.httpManagerService.deleteRequest(reqParams)
|
|
2674
|
-
.pipe(
|
|
2675
|
-
// tap((data) => console.log("API DELETE response", data)),
|
|
2676
|
-
catchError(error => {
|
|
2677
|
-
return throwError(() => this.errorHandling(error, 'DELETE'));
|
|
2678
|
-
}));
|
|
2729
|
+
this.requestType = 'DELETE';
|
|
2730
|
+
this.stateManagerDemoService.deleteClient(this.sampleClientData);
|
|
2679
2731
|
}
|
|
2680
2732
|
onStreamPostRequest() {
|
|
2681
2733
|
if (!this.isValid)
|
|
2682
2734
|
return;
|
|
2735
|
+
this.requestType = 'STREAM_AI';
|
|
2683
2736
|
const reqParams = this.compileRequest();
|
|
2684
2737
|
reqParams.server = "http://localhost:11434/api";
|
|
2685
2738
|
reqParams.path = ["generate"];
|
|
2686
2739
|
reqParams.stream = true;
|
|
2740
|
+
this.stateManagerDemoService.setAPIOptions(reqParams, DataType.ARRAY);
|
|
2687
2741
|
const payload = {
|
|
2688
2742
|
model: "mistral",
|
|
2689
2743
|
prompt: this.questionControl.value,
|
|
2690
2744
|
stream: reqParams.stream
|
|
2691
2745
|
};
|
|
2692
|
-
this.
|
|
2693
|
-
this.STREAM_AI$ = EMPTY;
|
|
2694
|
-
this.STREAM_AI_error$.next('');
|
|
2695
|
-
this.STREAM_AI$ = this.httpManagerService.postRequest(payload, reqParams)
|
|
2696
|
-
.pipe(map(items => items.map((word) => word.response).flat().join('')), tap(() => this.questionControl.reset()), catchError(error => {
|
|
2697
|
-
return throwError(() => this.errorHandling(error, 'STREAM'));
|
|
2698
|
-
}));
|
|
2746
|
+
this.stateManagerDemoService.streamAIRequest(payload);
|
|
2699
2747
|
}
|
|
2700
2748
|
onStreamRequest() {
|
|
2701
2749
|
if (!this.isValid)
|
|
2702
2750
|
return;
|
|
2751
|
+
this.requestType = 'STREAM';
|
|
2703
2752
|
const reqParams = this.compileRequest();
|
|
2704
2753
|
reqParams.server = "oidc";
|
|
2705
2754
|
reqParams.stream = true;
|
|
2706
|
-
this.
|
|
2707
|
-
|
|
2708
|
-
// tap((data) => console.log("API STREAM response", data)),
|
|
2709
|
-
catchError(error => {
|
|
2710
|
-
return throwError(() => this.errorHandling(error, 'STREAM'));
|
|
2711
|
-
}));
|
|
2712
|
-
}
|
|
2713
|
-
onDownloadCompleted() {
|
|
2714
|
-
const message = "Download Completed";
|
|
2715
|
-
const display = ToastDisplay.adapt({
|
|
2716
|
-
message,
|
|
2717
|
-
action: 'Ok',
|
|
2718
|
-
color: ToastColors.SUCCESS,
|
|
2719
|
-
icon: 'sentiment_satisfied_alt',
|
|
2720
|
-
});
|
|
2721
|
-
this.toastMessage.toastMessage(display);
|
|
2722
|
-
}
|
|
2723
|
-
onDownloadFailed(err) {
|
|
2724
|
-
const message = "Download Failed";
|
|
2725
|
-
const display = ToastDisplay.adapt({
|
|
2726
|
-
message,
|
|
2727
|
-
action: 'Ok',
|
|
2728
|
-
color: ToastColors.ERROR,
|
|
2729
|
-
icon: 'warning',
|
|
2730
|
-
});
|
|
2731
|
-
this.toastMessage.toastMessage(display);
|
|
2755
|
+
this.stateManagerDemoService.setAPIOptions(reqParams, DataType.ARRAY);
|
|
2756
|
+
this.stateManagerDemoService.streamRequest();
|
|
2732
2757
|
}
|
|
2733
2758
|
errorHandling(err, type) {
|
|
2734
2759
|
if (type === 'GET')
|
|
@@ -2742,12 +2767,12 @@ class RequestManagerDemoComponent {
|
|
|
2742
2767
|
if (type === 'STREAM')
|
|
2743
2768
|
this.STREAM_error$.next(err.message);
|
|
2744
2769
|
}
|
|
2745
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
2746
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RequestManagerDemoComponent, selector: "app-request-manager-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"pollingState.checked && !(isPending$ | async)\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(GET$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(POST$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(PUT$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(DELETE$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_AI_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n <div>\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n <div>\n Download File\n </div>\n <div style=\"flex:1; margin-left: 1rem;\">\n <mat-slide-toggle #disable>\n <span *ngIf=\"disable.checked; else DISABLE\">\n Enable\n </span>\n <ng-template #DISABLE>Disable</ng-template>\n </mat-slide-toggle>\n </div>\n </h2>\n <div>\n <app-file-downloader\n [disabled]=\"disable.checked\"\n [delayError]=\"3\"\n [apiRequest]=\"downloadRequest\"\n (completed)=\"onDownloadCompleted()\"\n (failed)=\"onDownloadFailed($event)\"\n ></app-file-downloader>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i8.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: FileDownloaderComponent, selector: "app-file-downloader", inputs: ["delayError", "apiRequest", "displayErrorMessage", "labels", "disabled"], outputs: ["completed", "failed"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.JsonPipe, name: "json" }] }); }
|
|
2770
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestManagerStateDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2771
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RequestManagerStateDemoComponent, selector: "app-request-manager-state-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error | json }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\" \n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\" \n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\" \n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.domain}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n \n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div>{{ (GET$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div>{{ (POST$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div>{{ (PUT$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div>{{ (DELETE$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n \n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n</div>", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i8.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.JsonPipe, name: "json" }] }); }
|
|
2747
2772
|
}
|
|
2748
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type:
|
|
2773
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestManagerStateDemoComponent, decorators: [{
|
|
2749
2774
|
type: Component,
|
|
2750
|
-
args: [{ selector: 'app-request-manager-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\" class=\"btn\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"pollingState.checked && !(isPending$ | async)\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(GET$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(POST$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(PUT$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\" *ngIf=\"(DELETE$ | async) as dataRecord\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n {{ dataRecord | json }}\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_AI_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n <div>\n <div style=\"display: flex;\">\n <h2 style=\"flex:1; margin-bottom: 0; padding-top: .5rem; display: flex;\">\n <div>\n Download File\n </div>\n <div style=\"flex:1; margin-left: 1rem;\">\n <mat-slide-toggle #disable>\n <span *ngIf=\"disable.checked; else DISABLE\">\n Enable\n </span>\n <ng-template #DISABLE>Disable</ng-template>\n </mat-slide-toggle>\n </div>\n </h2>\n <div>\n <app-file-downloader\n [disabled]=\"disable.checked\"\n [delayError]=\"3\"\n [apiRequest]=\"downloadRequest\"\n (completed)=\"onDownloadCompleted()\"\n (failed)=\"onDownloadFailed($event)\"\n ></app-file-downloader>\n </div>\n </div>\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"] }]
|
|
2775
|
+
args: [{ selector: 'app-request-manager-state-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error | json }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\" \n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\" \n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\" \n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.domain}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n \n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div>{{ (GET$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div>{{ (POST$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div>{{ (PUT$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div>{{ (DELETE$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n \n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n</div>", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"] }]
|
|
2751
2776
|
}], ctorParameters: function () { return []; }, propDecorators: { failedState: [{
|
|
2752
2777
|
type: ViewChild,
|
|
2753
2778
|
args: ["failedState", { static: true }]
|
|
@@ -2909,6 +2934,51 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
2909
2934
|
args: [CONFIG_SETTINGS_TOKEN]
|
|
2910
2935
|
}] }]; } });
|
|
2911
2936
|
|
|
2937
|
+
const PROXY_CONFIG = new InjectionToken('PROXY_CONFIG');
|
|
2938
|
+
class ProxyDebuggerInterceptor {
|
|
2939
|
+
constructor(proxyConfig) {
|
|
2940
|
+
this.proxyConfig = proxyConfig;
|
|
2941
|
+
}
|
|
2942
|
+
intercept(req, next) {
|
|
2943
|
+
if (!this.proxyConfig) {
|
|
2944
|
+
return next.handle(req);
|
|
2945
|
+
}
|
|
2946
|
+
const headers = req.headers.keys().reduce((acc, key) => {
|
|
2947
|
+
acc[key] = req.headers.get(key) || '';
|
|
2948
|
+
return acc;
|
|
2949
|
+
}, {});
|
|
2950
|
+
for (const proxyPath in this.proxyConfig) {
|
|
2951
|
+
if (this.proxyConfig.hasOwnProperty(proxyPath)) {
|
|
2952
|
+
const proxyDetails = this.proxyConfig[proxyPath];
|
|
2953
|
+
const regex = new RegExp('^' + proxyPath.replace('/', '').replace('*', '(.*)'));
|
|
2954
|
+
if (regex.test(req.url)) {
|
|
2955
|
+
const target = proxyDetails.target;
|
|
2956
|
+
const endpoint = req.url.replace(regex, '$1');
|
|
2957
|
+
const actualPath = target + '/' + endpoint;
|
|
2958
|
+
console.log('Request Proxied:', {
|
|
2959
|
+
requestUrl: req.url,
|
|
2960
|
+
requestPayload: req.body,
|
|
2961
|
+
headers: headers,
|
|
2962
|
+
proxyPath: proxyPath,
|
|
2963
|
+
actualPath: actualPath,
|
|
2964
|
+
});
|
|
2965
|
+
}
|
|
2966
|
+
}
|
|
2967
|
+
}
|
|
2968
|
+
return next.handle(req);
|
|
2969
|
+
}
|
|
2970
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor, deps: [{ token: PROXY_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2971
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor }); }
|
|
2972
|
+
}
|
|
2973
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor, decorators: [{
|
|
2974
|
+
type: Injectable
|
|
2975
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
2976
|
+
type: Optional
|
|
2977
|
+
}, {
|
|
2978
|
+
type: Inject,
|
|
2979
|
+
args: [PROXY_CONFIG]
|
|
2980
|
+
}] }]; } });
|
|
2981
|
+
|
|
2912
2982
|
class HttpRequestServicesDemoComponent {
|
|
2913
2983
|
constructor(configOptions) {
|
|
2914
2984
|
this.configOptions = configOptions;
|
|
@@ -2928,17 +2998,75 @@ class HttpRequestServicesDemoComponent {
|
|
|
2928
2998
|
this.selectedService = this.requestTypes[type].value;
|
|
2929
2999
|
}
|
|
2930
3000
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpRequestServicesDemoComponent, deps: [{ token: CONFIG_SETTINGS_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2931
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: HttpRequestServicesDemoComponent, selector: "app-http-request-services-demo", ngImport: i0, template: "<mat-toolbar style=\"display:flex\">\n <div>Global Data</div>\n <div style=\"flex:1\"></div>\n <button mat-stroked-button [matMenuTriggerFor]=\"menu\">Services</button>\n <mat-menu #menu=\"matMenu\">\n <ng-container *ngFor=\"let type of requestTypes; index as i\">\n <div\n *ngIf=\"type?.divider\"\n style=\"margin-top: .5rem; margin-bottom: .5rem;\"\n >\n <mat-divider></mat-divider>\n </div>\n <button\n mat-menu-item\n (click)=\"onSelected(i)\"\n [disabled]=\"type.disabled\"\n >\n {{ type.name }}\n </button>\n </ng-container>\n\n </mat-menu>\n</mat-toolbar>\n\n<span [ngSwitch]=\"selectedService\">\n <p *ngSwitchCase=\"'http_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-demo></app-request-manager-demo>\n </p>\n <p *ngSwitchCase=\"'http_state_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-state-demo></app-request-manager-state-demo>\n </p>\n <p *ngSwitchCase=\"'database_service'\">\n <!-- <app-database-data-demo></app-database-data-demo> -->\n </p>\n <p *ngSwitchCase=\"'local_storage_service'\">\n <ng-container *ngTemplateOutlet=\"LOCAL_OPTIONS\"></ng-container>\n <app-local-storage-demo></app-local-storage-demo>\n </p>\n <p *ngSwitchDefault>\n Other\n </p>\n</span>\n\n<ng-template #HTTP_OPTIONS>\n <ng-container *ngIf=\"injectionOptions?.httpRequestOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - HTTP Options</h3>\n {{ injectionOptions?.httpRequestOptions| json }}\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #LOCAL_OPTIONS>\n <ng-container class=\"box\" *ngIf=\"injectionOptions?.LocalStorageOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - LocalStorage Options</h3>\n {{ injectionOptions?.LocalStorageOptions
|
|
3001
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: HttpRequestServicesDemoComponent, selector: "app-http-request-services-demo", ngImport: i0, template: "<mat-toolbar style=\"display:flex\">\n <div>Global Data</div>\n <div style=\"flex:1\"></div>\n <button mat-stroked-button [matMenuTriggerFor]=\"menu\">Services</button>\n <mat-menu #menu=\"matMenu\">\n <ng-container *ngFor=\"let type of requestTypes; index as i\">\n <div\n *ngIf=\"type?.divider\"\n style=\"margin-top: .5rem; margin-bottom: .5rem;\"\n >\n <mat-divider></mat-divider>\n </div>\n <button\n mat-menu-item\n (click)=\"onSelected(i)\"\n [disabled]=\"type.disabled\"\n >\n {{ type.name }}\n </button>\n </ng-container>\n\n </mat-menu>\n</mat-toolbar>\n\n<span [ngSwitch]=\"selectedService\">\n <p *ngSwitchCase=\"'http_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-demo></app-request-manager-demo>\n </p>\n <p *ngSwitchCase=\"'http_state_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-state-demo></app-request-manager-state-demo>\n </p>\n <p *ngSwitchCase=\"'database_service'\">\n <!-- <app-database-data-demo></app-database-data-demo> -->\n </p>\n <p *ngSwitchCase=\"'local_storage_service'\">\n <ng-container *ngTemplateOutlet=\"LOCAL_OPTIONS\"></ng-container>\n <app-local-storage-demo></app-local-storage-demo>\n </p>\n <p *ngSwitchDefault>\n Other\n </p>\n</span>\n\n<ng-template #HTTP_OPTIONS>\n <ng-container *ngIf=\"injectionOptions?.httpRequestOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - HTTP Options</h3>\n {{ injectionOptions?.httpRequestOptions| json }}\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #LOCAL_OPTIONS>\n <ng-container class=\"box\" *ngIf=\"injectionOptions?.LocalStorageOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - LocalStorage Options</h3>\n {{ injectionOptions?.LocalStorageOptions| json }}\n </div>\n </ng-container>\n</ng-template>\n\n\n", styles: [".box{padding:1rem;background-color:#f5f5f5;border:thin gray solid;margin-top:1rem}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3$1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3$2.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i3$2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3$2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i5$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: RequestManagerStateDemoComponent, selector: "app-request-manager-state-demo" }, { kind: "component", type: RequestManagerDemoComponent, selector: "app-request-manager-demo" }, { kind: "component", type: LocalStorageDemoComponent, selector: "app-local-storage-demo" }, { kind: "pipe", type: i1$1.JsonPipe, name: "json" }] }); }
|
|
2932
3002
|
}
|
|
2933
3003
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpRequestServicesDemoComponent, decorators: [{
|
|
2934
3004
|
type: Component,
|
|
2935
|
-
args: [{ selector: 'app-http-request-services-demo', template: "<mat-toolbar style=\"display:flex\">\n <div>Global Data</div>\n <div style=\"flex:1\"></div>\n <button mat-stroked-button [matMenuTriggerFor]=\"menu\">Services</button>\n <mat-menu #menu=\"matMenu\">\n <ng-container *ngFor=\"let type of requestTypes; index as i\">\n <div\n *ngIf=\"type?.divider\"\n style=\"margin-top: .5rem; margin-bottom: .5rem;\"\n >\n <mat-divider></mat-divider>\n </div>\n <button\n mat-menu-item\n (click)=\"onSelected(i)\"\n [disabled]=\"type.disabled\"\n >\n {{ type.name }}\n </button>\n </ng-container>\n\n </mat-menu>\n</mat-toolbar>\n\n<span [ngSwitch]=\"selectedService\">\n <p *ngSwitchCase=\"'http_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-demo></app-request-manager-demo>\n </p>\n <p *ngSwitchCase=\"'http_state_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-state-demo></app-request-manager-state-demo>\n </p>\n <p *ngSwitchCase=\"'database_service'\">\n <!-- <app-database-data-demo></app-database-data-demo> -->\n </p>\n <p *ngSwitchCase=\"'local_storage_service'\">\n <ng-container *ngTemplateOutlet=\"LOCAL_OPTIONS\"></ng-container>\n <app-local-storage-demo></app-local-storage-demo>\n </p>\n <p *ngSwitchDefault>\n Other\n </p>\n</span>\n\n<ng-template #HTTP_OPTIONS>\n <ng-container *ngIf=\"injectionOptions?.httpRequestOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - HTTP Options</h3>\n {{ injectionOptions?.httpRequestOptions| json }}\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #LOCAL_OPTIONS>\n <ng-container class=\"box\" *ngIf=\"injectionOptions?.LocalStorageOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - LocalStorage Options</h3>\n {{ injectionOptions?.LocalStorageOptions
|
|
3005
|
+
args: [{ selector: 'app-http-request-services-demo', template: "<mat-toolbar style=\"display:flex\">\n <div>Global Data</div>\n <div style=\"flex:1\"></div>\n <button mat-stroked-button [matMenuTriggerFor]=\"menu\">Services</button>\n <mat-menu #menu=\"matMenu\">\n <ng-container *ngFor=\"let type of requestTypes; index as i\">\n <div\n *ngIf=\"type?.divider\"\n style=\"margin-top: .5rem; margin-bottom: .5rem;\"\n >\n <mat-divider></mat-divider>\n </div>\n <button\n mat-menu-item\n (click)=\"onSelected(i)\"\n [disabled]=\"type.disabled\"\n >\n {{ type.name }}\n </button>\n </ng-container>\n\n </mat-menu>\n</mat-toolbar>\n\n<span [ngSwitch]=\"selectedService\">\n <p *ngSwitchCase=\"'http_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-demo></app-request-manager-demo>\n </p>\n <p *ngSwitchCase=\"'http_state_service'\">\n <ng-container *ngTemplateOutlet=\"HTTP_OPTIONS\"></ng-container>\n <app-request-manager-state-demo></app-request-manager-state-demo>\n </p>\n <p *ngSwitchCase=\"'database_service'\">\n <!-- <app-database-data-demo></app-database-data-demo> -->\n </p>\n <p *ngSwitchCase=\"'local_storage_service'\">\n <ng-container *ngTemplateOutlet=\"LOCAL_OPTIONS\"></ng-container>\n <app-local-storage-demo></app-local-storage-demo>\n </p>\n <p *ngSwitchDefault>\n Other\n </p>\n</span>\n\n<ng-template #HTTP_OPTIONS>\n <ng-container *ngIf=\"injectionOptions?.httpRequestOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - HTTP Options</h3>\n {{ injectionOptions?.httpRequestOptions| json }}\n </div>\n </ng-container>\n</ng-template>\n\n<ng-template #LOCAL_OPTIONS>\n <ng-container class=\"box\" *ngIf=\"injectionOptions?.LocalStorageOptions\">\n <div class=\"box\">\n <h3 style=\"font-weight: bold;\">Injection Token Detected - LocalStorage Options</h3>\n {{ injectionOptions?.LocalStorageOptions| json }}\n </div>\n </ng-container>\n</ng-template>\n\n\n", styles: [".box{padding:1rem;background-color:#f5f5f5;border:thin gray solid;margin-top:1rem}\n"] }]
|
|
2936
3006
|
}], ctorParameters: function () { return [{ type: ConfigOptions, decorators: [{
|
|
2937
3007
|
type: Inject,
|
|
2938
3008
|
args: [CONFIG_SETTINGS_TOKEN]
|
|
2939
3009
|
}] }]; } });
|
|
2940
3010
|
|
|
2941
|
-
|
|
3011
|
+
class SpinnerComponent {
|
|
3012
|
+
constructor() {
|
|
3013
|
+
this.value = 0;
|
|
3014
|
+
}
|
|
3015
|
+
ngOnInit() {
|
|
3016
|
+
}
|
|
3017
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3018
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SpinnerComponent, selector: "app-spinner", inputs: { color: "color", diameter: "diameter", display: "display", mode: "mode", strokeWidth: "strokeWidth", value: "value" }, ngImport: i0, template: "<div class=\"spinner-background\">{{display}}</div>\n<mat-progress-spinner\n [color]=\"color\"\n [diameter]=\"diameter\"\n [mode]=\"mode || 'indeterminate'\"\n [strokeWidth]=\"strokeWidth\"\n [value]=\"value\">\n</mat-progress-spinner>\n", styles: [".example-h2{margin:24px 0}:not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:80px;height:80px;line-height:80px;text-align:center;overflow:hidden;border-color:#673ab71f;border-radius:50%;border-style:solid;border-width:10px}\n"], dependencies: [{ kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
|
|
3019
|
+
}
|
|
3020
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SpinnerComponent, decorators: [{
|
|
3021
|
+
type: Component,
|
|
3022
|
+
args: [{ selector: 'app-spinner', template: "<div class=\"spinner-background\">{{display}}</div>\n<mat-progress-spinner\n [color]=\"color\"\n [diameter]=\"diameter\"\n [mode]=\"mode || 'indeterminate'\"\n [strokeWidth]=\"strokeWidth\"\n [value]=\"value\">\n</mat-progress-spinner>\n", styles: [".example-h2{margin:24px 0}:not(spinner-container).spinner-container{position:relative}:not(spinner-container).spinner-container .spinner-background{position:absolute;width:80px;height:80px;line-height:80px;text-align:center;overflow:hidden;border-color:#673ab71f;border-radius:50%;border-style:solid;border-width:10px}\n"] }]
|
|
3023
|
+
}], ctorParameters: function () { return []; }, propDecorators: { color: [{
|
|
3024
|
+
type: Input
|
|
3025
|
+
}], diameter: [{
|
|
3026
|
+
type: Input
|
|
3027
|
+
}], display: [{
|
|
3028
|
+
type: Input
|
|
3029
|
+
}], mode: [{
|
|
3030
|
+
type: Input
|
|
3031
|
+
}], strokeWidth: [{
|
|
3032
|
+
type: Input
|
|
3033
|
+
}], value: [{
|
|
3034
|
+
type: Input
|
|
3035
|
+
}] } });
|
|
3036
|
+
|
|
3037
|
+
class FileDownloaderActionModule {
|
|
3038
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
3039
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, declarations: [SpinnerComponent,
|
|
3040
|
+
DownloaderActionComponent,
|
|
3041
|
+
FileDownloadActionComponent], imports: [CommonModule,
|
|
3042
|
+
MatIconModule,
|
|
3043
|
+
MatProgressSpinnerModule,
|
|
3044
|
+
MatButtonModule], exports: [FileDownloadActionComponent] }); }
|
|
3045
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, imports: [CommonModule,
|
|
3046
|
+
MatIconModule,
|
|
3047
|
+
MatProgressSpinnerModule,
|
|
3048
|
+
MatButtonModule] }); }
|
|
3049
|
+
}
|
|
3050
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FileDownloaderActionModule, decorators: [{
|
|
3051
|
+
type: NgModule,
|
|
3052
|
+
args: [{
|
|
3053
|
+
imports: [
|
|
3054
|
+
CommonModule,
|
|
3055
|
+
MatIconModule,
|
|
3056
|
+
MatProgressSpinnerModule,
|
|
3057
|
+
MatButtonModule,
|
|
3058
|
+
],
|
|
3059
|
+
declarations: [
|
|
3060
|
+
SpinnerComponent,
|
|
3061
|
+
DownloaderActionComponent,
|
|
3062
|
+
FileDownloadActionComponent,
|
|
3063
|
+
],
|
|
3064
|
+
exports: [
|
|
3065
|
+
FileDownloadActionComponent
|
|
3066
|
+
]
|
|
3067
|
+
}]
|
|
3068
|
+
}] });
|
|
3069
|
+
|
|
2942
3070
|
class HttpRequestManagerModule {
|
|
2943
3071
|
static forRoot(config = ConfigOptions.adapt()) {
|
|
2944
3072
|
return {
|
|
@@ -2965,7 +3093,6 @@ class HttpRequestManagerModule {
|
|
|
2965
3093
|
MatMenuModule,
|
|
2966
3094
|
MatIconModule,
|
|
2967
3095
|
MatTableModule,
|
|
2968
|
-
MatToolbarModule,
|
|
2969
3096
|
MatButtonToggleModule,
|
|
2970
3097
|
MatAutocompleteModule,
|
|
2971
3098
|
MatProgressBarModule,
|
|
@@ -2973,8 +3100,9 @@ class HttpRequestManagerModule {
|
|
|
2973
3100
|
MatDividerModule,
|
|
2974
3101
|
MatFormFieldModule,
|
|
2975
3102
|
MatInputModule,
|
|
3103
|
+
MatToolbarModule,
|
|
2976
3104
|
MatSlideToggleModule, i1.TranslateModule, MatSidenavModule,
|
|
2977
|
-
|
|
3105
|
+
FileDownloaderActionModule], exports: [HttpRequestServicesDemoComponent] }); }
|
|
2978
3106
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpRequestManagerModule, providers: [
|
|
2979
3107
|
{ provide: HTTP_INTERCEPTORS, useClass: WithCredentialsInterceptor, multi: true },
|
|
2980
3108
|
{ provide: HTTP_INTERCEPTORS, useClass: RequestHeadersInterceptor, multi: true },
|
|
@@ -2991,7 +3119,6 @@ class HttpRequestManagerModule {
|
|
|
2991
3119
|
MatMenuModule,
|
|
2992
3120
|
MatIconModule,
|
|
2993
3121
|
MatTableModule,
|
|
2994
|
-
MatToolbarModule,
|
|
2995
3122
|
MatButtonToggleModule,
|
|
2996
3123
|
MatAutocompleteModule,
|
|
2997
3124
|
MatProgressBarModule,
|
|
@@ -2999,10 +3126,11 @@ class HttpRequestManagerModule {
|
|
|
2999
3126
|
MatDividerModule,
|
|
3000
3127
|
MatFormFieldModule,
|
|
3001
3128
|
MatInputModule,
|
|
3129
|
+
MatToolbarModule,
|
|
3002
3130
|
MatSlideToggleModule,
|
|
3003
3131
|
TranslateModule.forRoot(),
|
|
3004
3132
|
MatSidenavModule,
|
|
3005
|
-
|
|
3133
|
+
FileDownloaderActionModule] }); }
|
|
3006
3134
|
}
|
|
3007
3135
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HttpRequestManagerModule, decorators: [{
|
|
3008
3136
|
type: NgModule,
|
|
@@ -3018,7 +3146,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
3018
3146
|
MatMenuModule,
|
|
3019
3147
|
MatIconModule,
|
|
3020
3148
|
MatTableModule,
|
|
3021
|
-
MatToolbarModule,
|
|
3022
3149
|
MatButtonToggleModule,
|
|
3023
3150
|
MatAutocompleteModule,
|
|
3024
3151
|
MatProgressBarModule,
|
|
@@ -3026,10 +3153,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
3026
3153
|
MatDividerModule,
|
|
3027
3154
|
MatFormFieldModule,
|
|
3028
3155
|
MatInputModule,
|
|
3156
|
+
MatToolbarModule,
|
|
3029
3157
|
MatSlideToggleModule,
|
|
3030
3158
|
TranslateModule.forRoot(),
|
|
3031
3159
|
MatSidenavModule,
|
|
3032
|
-
|
|
3160
|
+
FileDownloaderActionModule,
|
|
3033
3161
|
],
|
|
3034
3162
|
declarations: [
|
|
3035
3163
|
HttpRequestServicesDemoComponent,
|