@openziti/ziti-console-lib 0.6.3 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/assets/styles/global.scss +91 -5
  2. package/assets/styles/ziti.css +2 -2
  3. package/esm2022/lib/features/config-editor/config-editor.component.mjs +76 -15
  4. package/esm2022/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.mjs +7 -3
  5. package/esm2022/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.mjs +22 -1
  6. package/esm2022/lib/features/dynamic-widgets/number/number-input.component.mjs +10 -9
  7. package/esm2022/lib/features/dynamic-widgets/object/object.component.mjs +2 -2
  8. package/esm2022/lib/features/dynamic-widgets/port-ranges/port-ranges.component.mjs +4 -1
  9. package/esm2022/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.mjs +27 -5
  10. package/esm2022/lib/features/dynamic-widgets/selector/selector-input.component.mjs +21 -13
  11. package/esm2022/lib/features/dynamic-widgets/string/string-input.component.mjs +9 -5
  12. package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +9 -5
  13. package/esm2022/lib/features/json-view/json-view.component.mjs +3 -3
  14. package/esm2022/lib/features/messaging/growler.component.mjs +4 -4
  15. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +33 -4
  16. package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +2 -4
  17. package/esm2022/lib/features/qr-code/qr-code.component.mjs +4 -1
  18. package/esm2022/lib/pages/auth-policies/auth-policies-page.component.mjs +7 -1
  19. package/esm2022/lib/pages/auth-policies/auth-policies-page.service.mjs +10 -3
  20. package/esm2022/lib/pages/configurations/configurations-page.component.mjs +7 -1
  21. package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +2 -2
  22. package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +2 -17
  23. package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +2 -2
  24. package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +22 -32
  25. package/esm2022/lib/pages/identities/identities-page.component.mjs +2 -2
  26. package/esm2022/lib/pages/identities/identities-page.service.mjs +19 -30
  27. package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.mjs +2 -2
  28. package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.mjs +3 -18
  29. package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +2 -3
  30. package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +2 -17
  31. package/esm2022/lib/pages/services/services-page.component.mjs +2 -2
  32. package/esm2022/lib/pages/services/services-page.service.mjs +9 -17
  33. package/esm2022/lib/shared/list-page-component.class.mjs +17 -2
  34. package/esm2022/lib/shared/list-page-service.class.mjs +22 -4
  35. package/esm2022/lib/version.mjs +2 -2
  36. package/fesm2022/openziti-ziti-console-lib.mjs +319 -188
  37. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  38. package/lib/features/config-editor/config-editor.component.d.ts +7 -3
  39. package/lib/features/config-editor/config-editor.component.d.ts.map +1 -1
  40. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts +2 -0
  41. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts.map +1 -1
  42. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts +5 -0
  43. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts.map +1 -1
  44. package/lib/features/dynamic-widgets/number/number-input.component.d.ts +2 -0
  45. package/lib/features/dynamic-widgets/number/number-input.component.d.ts.map +1 -1
  46. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts +1 -0
  47. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts.map +1 -1
  48. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts +8 -6
  49. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts.map +1 -1
  50. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts +2 -0
  51. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts.map +1 -1
  52. package/lib/features/dynamic-widgets/string/string-input.component.d.ts +2 -0
  53. package/lib/features/dynamic-widgets/string/string-input.component.d.ts.map +1 -1
  54. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts +2 -0
  55. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +1 -1
  56. package/lib/features/json-view/json-view.component.d.ts +2 -2
  57. package/lib/features/json-view/json-view.component.d.ts.map +1 -1
  58. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +3 -0
  59. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
  60. package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
  61. package/lib/features/qr-code/qr-code.component.d.ts.map +1 -1
  62. package/lib/pages/auth-policies/auth-policies-page.component.d.ts.map +1 -1
  63. package/lib/pages/auth-policies/auth-policies-page.service.d.ts.map +1 -1
  64. package/lib/pages/configurations/configurations-page.component.d.ts.map +1 -1
  65. package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +0 -2
  66. package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +1 -1
  67. package/lib/pages/edge-routers/edge-routers-page.service.d.ts +5 -3
  68. package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -1
  69. package/lib/pages/identities/identities-page.service.d.ts +4 -2
  70. package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
  71. package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts +0 -2
  72. package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts.map +1 -1
  73. package/lib/pages/service-policies/service-policies-page.component.d.ts.map +1 -1
  74. package/lib/pages/service-policies/service-policies-page.service.d.ts +0 -2
  75. package/lib/pages/service-policies/service-policies-page.service.d.ts.map +1 -1
  76. package/lib/pages/services/services-page.service.d.ts +4 -2
  77. package/lib/pages/services/services-page.service.d.ts.map +1 -1
  78. package/lib/shared/list-page-component.class.d.ts +2 -0
  79. package/lib/shared/list-page-component.class.d.ts.map +1 -1
  80. package/lib/shared/list-page-service.class.d.ts +6 -0
  81. package/lib/shared/list-page-service.class.d.ts.map +1 -1
  82. package/package.json +1 -1
@@ -41,13 +41,15 @@ import * as i7 from 'ag-grid-angular';
41
41
  import { AgGridModule } from 'ag-grid-angular';
42
42
  import * as i3$3 from '@angular/cdk/bidi';
43
43
  import { MatRadioModule } from '@angular/material/radio';
44
- import { createAjvValidator, JSONEditor, Mode } from 'vanilla-jsoneditor';
44
+ import { createAjvValidator, createJSONEditor, Mode } from 'vanilla-jsoneditor';
45
45
  import * as d3 from 'd3';
46
46
  import * as i6 from '@angular/material/autocomplete';
47
47
  import { MatAutocompleteModule } from '@angular/material/autocomplete';
48
48
  import * as i7$1 from '@angular/material/core';
49
49
  import semver from 'semver';
50
50
  import { JsonEditorComponent, NgJsonEditorModule } from 'ang-jsoneditor';
51
+ import Ajv from 'ajv';
52
+ import addFormats from 'ajv-formats';
51
53
  import * as i6$1 from 'primeng/inputtext';
52
54
  import * as i8 from 'primeng/button';
53
55
  import { Resolver } from '@stoplight/json-ref-resolver';
@@ -1203,11 +1205,15 @@ class StringInputComponent {
1203
1205
  this.error = '';
1204
1206
  this.fieldValueChange = new EventEmitter();
1205
1207
  this.valueChange = new Subject();
1208
+ this._isValid = true;
1206
1209
  }
1207
1210
  set fieldName(name) {
1208
1211
  this._fieldName = name;
1209
1212
  this._idName = name.replace(/\s/g, '').toLowerCase();
1210
1213
  }
1214
+ setIsValid(isValid) {
1215
+ this._isValid = isValid;
1216
+ }
1211
1217
  onKeyup() {
1212
1218
  debounce(() => {
1213
1219
  this.fieldValueChange.emit(this.fieldValue);
@@ -1216,7 +1222,7 @@ class StringInputComponent {
1216
1222
  }
1217
1223
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StringInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1218
1224
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: StringInputComponent, selector: "lib-string-input", inputs: { fieldName: "fieldName", fieldValue: "fieldValue", placeholder: "placeholder", parentage: "parentage", labelColor: "labelColor", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange" }, ngImport: i0, template: `
1219
- <div [ngClass]="fieldClass">
1225
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="string-input-container">
1220
1226
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1221
1227
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1222
1228
  type="text" class="jsonEntry"
@@ -1224,12 +1230,12 @@ class StringInputComponent {
1224
1230
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1225
1231
  <div *ngIf="error" class="error">{{error}}</div>
1226
1232
  </div>
1227
- `, isInline: true, styles: ["input.error{border-color:red}\n", "div.error{color:red}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1233
+ `, isInline: true, styles: [".string-input-container{margin:var(--marginSmall) 0}.string-input-container label{margin-bottom:0;margin-top:0}.string-input-container input.error{border-color:red}.string-input-container div.error{color:red}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1228
1234
  }
1229
1235
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StringInputComponent, decorators: [{
1230
1236
  type: Component,
1231
1237
  args: [{ selector: 'lib-string-input', template: `
1232
- <div [ngClass]="fieldClass">
1238
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="string-input-container">
1233
1239
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1234
1240
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1235
1241
  type="text" class="jsonEntry"
@@ -1237,7 +1243,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1237
1243
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1238
1244
  <div *ngIf="error" class="error">{{error}}</div>
1239
1245
  </div>
1240
- `, styles: ["input.error{border-color:red}\n", "div.error{color:red}\n"] }]
1246
+ `, styles: [".string-input-container{margin:var(--marginSmall) 0}.string-input-container label{margin-bottom:0;margin-top:0}.string-input-container input.error{border-color:red}.string-input-container div.error{color:red}\n"] }]
1241
1247
  }], propDecorators: { fieldName: [{
1242
1248
  type: Input
1243
1249
  }], fieldValue: [{
@@ -1267,11 +1273,15 @@ class NumberInputComponent {
1267
1273
  this.error = '';
1268
1274
  this.fieldValueChange = new EventEmitter();
1269
1275
  this.valueChange = new Subject();
1276
+ this._isValid = true;
1270
1277
  }
1271
1278
  set fieldName(name) {
1272
1279
  this._fieldName = name;
1273
1280
  this._idName = name.replace(/\s/g, '').toLowerCase();
1274
1281
  }
1282
+ setIsValid(isValid) {
1283
+ this._isValid = isValid;
1284
+ }
1275
1285
  onKeyup() {
1276
1286
  debounce(() => {
1277
1287
  this.fieldValueChange.emit(this.fieldValue);
@@ -1280,7 +1290,7 @@ class NumberInputComponent {
1280
1290
  }
1281
1291
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1282
1292
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NumberInputComponent, selector: "lib-number-input", inputs: { fieldName: "fieldName", fieldValue: "fieldValue", placeholder: "placeholder", parentage: "parentage", labelColor: "labelColor", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange" }, ngImport: i0, template: `
1283
- <div [ngClass]="fieldClass">
1293
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="{{!_isValid ? 'invalid' : ''}} number-input-container">
1284
1294
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1285
1295
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1286
1296
  type="number" class="jsonEntry"
@@ -1288,14 +1298,12 @@ class NumberInputComponent {
1288
1298
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1289
1299
  <div *ngIf="error" class="error">{{error}}</div>
1290
1300
  </div>
1291
- `, isInline: true, dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1301
+ `, isInline: true, styles: [".number-input-container{margin:var(--marginSmall) 0}.number-input-container label{margin-bottom:0;margin-top:0}.number-input-container input.error{border-color:red}.number-input-container div.error{color:red}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1292
1302
  }
1293
1303
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NumberInputComponent, decorators: [{
1294
1304
  type: Component,
1295
- args: [{
1296
- selector: 'lib-number-input',
1297
- template: `
1298
- <div [ngClass]="fieldClass">
1305
+ args: [{ selector: 'lib-number-input', template: `
1306
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="{{!_isValid ? 'invalid' : ''}} number-input-container">
1299
1307
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1300
1308
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1301
1309
  type="number" class="jsonEntry"
@@ -1303,8 +1311,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1303
1311
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1304
1312
  <div *ngIf="error" class="error">{{error}}</div>
1305
1313
  </div>
1306
- `
1307
- }]
1314
+ `, styles: [".number-input-container{margin:var(--marginSmall) 0}.number-input-container label{margin-bottom:0;margin-top:0}.number-input-container input.error{border-color:red}.number-input-container div.error{color:red}\n"] }]
1308
1315
  }], propDecorators: { fieldName: [{
1309
1316
  type: Input
1310
1317
  }], fieldValue: [{
@@ -1453,7 +1460,7 @@ class ObjectComponent {
1453
1460
  <div *ngIf="showAdd" class="save-button button" (click)="addClicked()">Add</div>
1454
1461
  </div>
1455
1462
  </div>
1456
- `, isInline: true, styles: [":host>label{margin-top:0}.wrapper{border-radius:.5rem;padding:var(--paddingMedium);display:flex;flex-direction:column;gap:5px;margin-top:var(--marginMedium)}.wrapper.closed{cursor:pointer}.wrapper .object-main-content[hidden]{display:none}.wrapper .save-button{margin-top:var(--marginSmall);height:35px;min-width:140px}.object-header-container{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.object-header-container .object-header-title{width:100%;display:flex;justify-content:space-between;align-items:center;height:23px;cursor:pointer}.object-header-container .object-label{margin:0;cursor:pointer}.expand-toggle{font-family:zac;font-weight:600;font-size:23px;width:27px;color:var(--stroke);height:20px;margin-top:-3px;cursor:pointer}.expand-toggle:before{content:\"\\e91f\"}.expand-toggle.open{transform:rotate(270deg)}.added-items-list{margin-top:var(--marginSmall);width:100%}.added-items-list label,.added-items-list .added-items-label{margin-top:0}.added-items-list .object-list-items-container{background-color:#ffffff4d;border-radius:var(--inputBorderRadius);display:flex;flex-direction:column;padding:5px}.added-items-list .object-list-items-container .none-added-label{padding-left:var(--paddingSmall);color:var(--white);opacity:.7}.added-items-list .object-list-item{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.added-items-list .object-list-item .preview-name{color:var(--formBackground);font-weight:600;margin-left:var(--marginSmall);margin-bottom:2px}.added-items-list .object-list-item .icon-clear{color:var(--formBackground);cursor:pointer}.added-items-list .object-list-item .icon-clear:hover{color:var(--primary)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
1463
+ `, isInline: true, styles: [":host>label{margin-top:0}.wrapper{border-radius:.3rem;padding:calc(var(--paddingSmall) + 2px) var(--paddingXL);display:flex;flex-direction:column;gap:5px;margin-top:var(--marginXL)}.wrapper.closed{cursor:pointer}.wrapper .object-main-content{display:flex;flex-direction:column;gap:5px}.wrapper .object-main-content[hidden]{display:none}.wrapper .save-button{margin-top:var(--marginSmall);margin-bottom:var(--marginSmall);height:35px;min-width:140px;border-style:solid;border-width:1px;border-color:var(--stroke)}.object-header-container{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.object-header-container .object-header-title{width:100%;display:flex;justify-content:space-between;align-items:center;height:23px;cursor:pointer}.object-header-container .object-label{margin:0;cursor:pointer}.expand-toggle{font-family:zac;font-weight:600;font-size:23px;width:15px;color:var(--stroke);height:20px;margin-top:-3px;cursor:pointer}.expand-toggle:before{content:\"\\e91f\"}.expand-toggle.open{transform:rotate(270deg);margin-top:7px;margin-right:3px}.added-items-list{margin-top:var(--marginSmall);width:100%}.added-items-list label,.added-items-list .added-items-label{margin-top:0}.added-items-list .object-list-items-container{background-color:#ffffff4d;border-radius:var(--inputBorderRadius);display:flex;flex-direction:column;padding:5px}.added-items-list .object-list-items-container .none-added-label{padding-left:var(--paddingSmall);color:var(--white);opacity:.7}.added-items-list .object-list-item{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.added-items-list .object-list-item .preview-name{color:var(--formBackground);font-weight:600;margin-left:var(--marginSmall);margin-bottom:2px}.added-items-list .object-list-item .icon-clear{color:var(--formBackground);cursor:pointer}.added-items-list .object-list-item .icon-clear:hover{color:var(--primary)}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
1457
1464
  }
1458
1465
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ObjectComponent, decorators: [{
1459
1466
  type: Component,
@@ -1479,7 +1486,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1479
1486
  <div *ngIf="showAdd" class="save-button button" (click)="addClicked()">Add</div>
1480
1487
  </div>
1481
1488
  </div>
1482
- `, styles: [":host>label{margin-top:0}.wrapper{border-radius:.5rem;padding:var(--paddingMedium);display:flex;flex-direction:column;gap:5px;margin-top:var(--marginMedium)}.wrapper.closed{cursor:pointer}.wrapper .object-main-content[hidden]{display:none}.wrapper .save-button{margin-top:var(--marginSmall);height:35px;min-width:140px}.object-header-container{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.object-header-container .object-header-title{width:100%;display:flex;justify-content:space-between;align-items:center;height:23px;cursor:pointer}.object-header-container .object-label{margin:0;cursor:pointer}.expand-toggle{font-family:zac;font-weight:600;font-size:23px;width:27px;color:var(--stroke);height:20px;margin-top:-3px;cursor:pointer}.expand-toggle:before{content:\"\\e91f\"}.expand-toggle.open{transform:rotate(270deg)}.added-items-list{margin-top:var(--marginSmall);width:100%}.added-items-list label,.added-items-list .added-items-label{margin-top:0}.added-items-list .object-list-items-container{background-color:#ffffff4d;border-radius:var(--inputBorderRadius);display:flex;flex-direction:column;padding:5px}.added-items-list .object-list-items-container .none-added-label{padding-left:var(--paddingSmall);color:var(--white);opacity:.7}.added-items-list .object-list-item{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.added-items-list .object-list-item .preview-name{color:var(--formBackground);font-weight:600;margin-left:var(--marginSmall);margin-bottom:2px}.added-items-list .object-list-item .icon-clear{color:var(--formBackground);cursor:pointer}.added-items-list .object-list-item .icon-clear:hover{color:var(--primary)}\n"] }]
1489
+ `, styles: [":host>label{margin-top:0}.wrapper{border-radius:.3rem;padding:calc(var(--paddingSmall) + 2px) var(--paddingXL);display:flex;flex-direction:column;gap:5px;margin-top:var(--marginXL)}.wrapper.closed{cursor:pointer}.wrapper .object-main-content{display:flex;flex-direction:column;gap:5px}.wrapper .object-main-content[hidden]{display:none}.wrapper .save-button{margin-top:var(--marginSmall);margin-bottom:var(--marginSmall);height:35px;min-width:140px;border-style:solid;border-width:1px;border-color:var(--stroke)}.object-header-container{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.object-header-container .object-header-title{width:100%;display:flex;justify-content:space-between;align-items:center;height:23px;cursor:pointer}.object-header-container .object-label{margin:0;cursor:pointer}.expand-toggle{font-family:zac;font-weight:600;font-size:23px;width:15px;color:var(--stroke);height:20px;margin-top:-3px;cursor:pointer}.expand-toggle:before{content:\"\\e91f\"}.expand-toggle.open{transform:rotate(270deg);margin-top:7px;margin-right:3px}.added-items-list{margin-top:var(--marginSmall);width:100%}.added-items-list label,.added-items-list .added-items-label{margin-top:0}.added-items-list .object-list-items-container{background-color:#ffffff4d;border-radius:var(--inputBorderRadius);display:flex;flex-direction:column;padding:5px}.added-items-list .object-list-items-container .none-added-label{padding-left:var(--paddingSmall);color:var(--white);opacity:.7}.added-items-list .object-list-item{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.added-items-list .object-list-item .preview-name{color:var(--formBackground);font-weight:600;margin-left:var(--marginSmall);margin-bottom:2px}.added-items-list .object-list-item .icon-clear{color:var(--formBackground);cursor:pointer}.added-items-list .object-list-item .icon-clear:hover{color:var(--primary)}\n"] }]
1483
1490
  }], ctorParameters: function () { return []; }, propDecorators: { wrapperContents: [{
1484
1491
  type: ViewChild,
1485
1492
  args: ["wrappercontents", { read: ViewContainerRef, static: true }]
@@ -1521,6 +1528,7 @@ class SelectorInputComponent {
1521
1528
  this.error = '';
1522
1529
  this.fieldValueChange = new EventEmitter();
1523
1530
  this.valueChange = new Subject();
1531
+ this._isValid = true;
1524
1532
  }
1525
1533
  set fieldName(name) {
1526
1534
  this._fieldName = name;
@@ -1529,12 +1537,22 @@ class SelectorInputComponent {
1529
1537
  set valueList(list) {
1530
1538
  this.listIsObject = list?.length > 0 && typeof list[0] !== 'string';
1531
1539
  this._valueList = list;
1532
- list.forEach(val => {
1533
- if (val.default)
1534
- this.fieldValue = val;
1540
+ let valToSet;
1541
+ list.forEach(item => {
1542
+ if (item.default) {
1543
+ valToSet = item.value;
1544
+ }
1545
+ });
1546
+ valToSet = valToSet || this.fieldValue;
1547
+ this.fieldValue = undefined;
1548
+ defer(() => {
1549
+ this.fieldValue = valToSet;
1535
1550
  });
1536
1551
  }
1537
1552
  ;
1553
+ setIsValid(isValid) {
1554
+ this._isValid = isValid;
1555
+ }
1538
1556
  selected() {
1539
1557
  debounce(() => {
1540
1558
  this.fieldValueChange.emit(this.fieldValue);
@@ -1543,7 +1561,7 @@ class SelectorInputComponent {
1543
1561
  }
1544
1562
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectorInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1545
1563
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SelectorInputComponent, selector: "lib-selector-input", inputs: { fieldName: "fieldName", fieldValue: "fieldValue", placeholder: "placeholder", parentage: "parentage", valueList: "valueList", labelColor: "labelColor", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange" }, ngImport: i0, template: `
1546
- <div [ngClass]="fieldClass">
1564
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="selector-input-container">
1547
1565
  <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1548
1566
  <select id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1549
1567
  class="jsonEntry"
@@ -1559,14 +1577,12 @@ class SelectorInputComponent {
1559
1577
  </select>
1560
1578
  <div *ngIf="error" class="error">{{error}}</div>
1561
1579
  </div>
1562
- `, isInline: true, dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1580
+ `, isInline: true, styles: [".selector-input-container{margin:var(--marginSmall) 0}.selector-input-container label{margin-bottom:0;margin-top:0}.selector-input-container input.error{border-color:red}.selector-input-container div.error{color:red}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1563
1581
  }
1564
1582
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectorInputComponent, decorators: [{
1565
1583
  type: Component,
1566
- args: [{
1567
- selector: 'lib-selector-input',
1568
- template: `
1569
- <div [ngClass]="fieldClass">
1584
+ args: [{ selector: 'lib-selector-input', template: `
1585
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="selector-input-container">
1570
1586
  <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1571
1587
  <select id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1572
1588
  class="jsonEntry"
@@ -1582,8 +1598,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1582
1598
  </select>
1583
1599
  <div *ngIf="error" class="error">{{error}}</div>
1584
1600
  </div>
1585
- `
1586
- }]
1601
+ `, styles: [".selector-input-container{margin:var(--marginSmall) 0}.selector-input-container label{margin-bottom:0;margin-top:0}.selector-input-container input.error{border-color:red}.selector-input-container div.error{color:red}\n"] }]
1587
1602
  }], propDecorators: { fieldName: [{
1588
1603
  type: Input
1589
1604
  }], fieldValue: [{
@@ -1632,6 +1647,7 @@ class CheckboxListInputComponent {
1632
1647
  this.error = '';
1633
1648
  this.fieldValueChange = new EventEmitter();
1634
1649
  this.valueChange = new Subject();
1650
+ this._isValid = true;
1635
1651
  }
1636
1652
  set fieldName(name) {
1637
1653
  this._fieldName = name;
@@ -1679,9 +1695,12 @@ class CheckboxListInputComponent {
1679
1695
  this.valueChange.next(this._fieldValue);
1680
1696
  });
1681
1697
  }
1698
+ setIsValid(isValid) {
1699
+ this._isValid = isValid;
1700
+ }
1682
1701
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CheckboxListInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1683
1702
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CheckboxListInputComponent, selector: "lib-checkbox-list-input", inputs: { fieldName: "fieldName", fieldValue: "fieldValue", placeholder: "placeholder", parentage: "parentage", valueList: "valueList", labelColor: "labelColor", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange" }, ngImport: i0, template: `
1684
- <div [ngClass]="fieldClass">
1703
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1685
1704
  <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1686
1705
  <div *ngFor="let item of items">
1687
1706
  <input type="checkbox"
@@ -1697,7 +1716,7 @@ class CheckboxListInputComponent {
1697
1716
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CheckboxListInputComponent, decorators: [{
1698
1717
  type: Component,
1699
1718
  args: [{ selector: 'lib-checkbox-list-input', template: `
1700
- <div [ngClass]="fieldClass">
1719
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1701
1720
  <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1702
1721
  <div *ngFor="let item of items">
1703
1722
  <input type="checkbox"
@@ -1756,6 +1775,7 @@ class TextListInputComponent {
1756
1775
  this.error = '';
1757
1776
  this.fieldValueChange = new EventEmitter();
1758
1777
  this.valueChange = new Subject();
1778
+ this._isValid = true;
1759
1779
  }
1760
1780
  set fieldName(name) {
1761
1781
  this._fieldName = name;
@@ -1785,9 +1805,12 @@ class TextListInputComponent {
1785
1805
  this.valueChange.next(this.fieldValue);
1786
1806
  }, 500)();
1787
1807
  }
1808
+ setIsValid(isValid) {
1809
+ this._isValid = isValid;
1810
+ }
1788
1811
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TextListInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1789
1812
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TextListInputComponent, selector: "lib-text-list-input", inputs: { fieldName: "fieldName", fieldValue: "fieldValue", placeholder: "placeholder", parentage: "parentage", labelColor: "labelColor", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange" }, ngImport: i0, template: `
1790
- <div [ngClass]="fieldClass">
1813
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1791
1814
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1792
1815
  <p-chips id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1793
1816
  (keyup)="onKeyup($event)"
@@ -1795,7 +1818,7 @@ class TextListInputComponent {
1795
1818
  [allowDuplicate]="false"
1796
1819
  [placeholder]="placeholder"
1797
1820
  [addOnBlur]="true"
1798
- [ngClass]="fieldClass"
1821
+ [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')"
1799
1822
  (onBlur)="emitEvents()"
1800
1823
  separator=",">
1801
1824
  </p-chips>
@@ -1806,7 +1829,7 @@ class TextListInputComponent {
1806
1829
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TextListInputComponent, decorators: [{
1807
1830
  type: Component,
1808
1831
  args: [{ selector: 'lib-text-list-input', template: `
1809
- <div [ngClass]="fieldClass">
1832
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1810
1833
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1811
1834
  <p-chips id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1812
1835
  (keyup)="onKeyup($event)"
@@ -1814,7 +1837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1814
1837
  [allowDuplicate]="false"
1815
1838
  [placeholder]="placeholder"
1816
1839
  [addOnBlur]="true"
1817
- [ngClass]="fieldClass"
1840
+ [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')"
1818
1841
  (onBlur)="emitEvents()"
1819
1842
  separator=",">
1820
1843
  </p-chips>
@@ -1883,6 +1906,12 @@ class ProtocolAddressPortInputComponent {
1883
1906
  this.portFieldName = 'Port';
1884
1907
  this.checkAddressDebounced = debounce(this.checkAddress, 100, { maxWait: 100, leading: true });
1885
1908
  this.errors = {};
1909
+ this.props = [
1910
+ { key: 'protocol', value: undefined },
1911
+ { key: 'address', value: undefined },
1912
+ { key: 'hostname', value: undefined },
1913
+ { key: 'port', value: undefined }
1914
+ ];
1886
1915
  this._addressChanged = false;
1887
1916
  }
1888
1917
  ngOnInit() {
@@ -1915,13 +1944,29 @@ class ProtocolAddressPortInputComponent {
1915
1944
  const address = isEmpty(this.address) ? undefined : this.address;
1916
1945
  const hostname = isEmpty(this.hostname) ? undefined : this.hostname;
1917
1946
  const port = !isNumber(this.port) ? undefined : this.port;
1918
- const props = [
1947
+ this.props = [
1919
1948
  { key: 'protocol', value: protocol },
1920
- { key: 'address', value: address },
1921
- { key: 'hostname', value: hostname },
1922
1949
  { key: 'port', value: port }
1923
1950
  ];
1924
- return props;
1951
+ if (this.showAddress) {
1952
+ this.props.push({ key: 'address', value: address });
1953
+ }
1954
+ if (this.showHostName) {
1955
+ this.props.push({ key: 'hostname', value: hostname });
1956
+ }
1957
+ return this.props;
1958
+ }
1959
+ setValidationErrors(propertyPath = '', validationErrors) {
1960
+ this.props.forEach((prop) => {
1961
+ const hasValidationError = validationErrors?.some((error) => {
1962
+ let pathToMach = error.instancePath;
1963
+ if (!isEmpty(error?.params?.missingProperty)) {
1964
+ pathToMach += '/' + error?.params?.missingProperty;
1965
+ }
1966
+ return pathToMach === propertyPath + '/' + prop.key;
1967
+ });
1968
+ this.errors[prop.key] = hasValidationError;
1969
+ });
1925
1970
  }
1926
1971
  isValid() {
1927
1972
  this.errors = {};
@@ -2569,6 +2614,11 @@ let ListPageServiceClass = class ListPageServiceClass {
2569
2614
  this.csvDownloadService = csvDownloadService;
2570
2615
  this.extensionService = extensionService;
2571
2616
  this.router = router;
2617
+ this.CSV_COLUMNS = [
2618
+ { label: 'Name', path: 'name' },
2619
+ { label: 'ID', path: 'id' },
2620
+ { label: 'Created At', path: 'createdAt' }
2621
+ ];
2572
2622
  this.basePath = '';
2573
2623
  this.headerComponentParams = {
2574
2624
  filterType: 'TEXTINPUT',
@@ -2668,13 +2718,26 @@ let ListPageServiceClass = class ListPageServiceClass {
2668
2718
  row.actionList = [...row.actionList, ...keys];
2669
2719
  }
2670
2720
  }
2721
+ downloadItems(selectedItems) {
2722
+ this.csvDownloadService.download(this.resourceType, selectedItems, this.CSV_COLUMNS, false, false, undefined, false);
2723
+ }
2724
+ downloadAllItems() {
2725
+ const paging = cloneDeep(this.DEFAULT_PAGING);
2726
+ paging.total = -1;
2727
+ return this.getTableData(this.resourceType, paging, undefined, undefined)
2728
+ .then((results) => {
2729
+ return this.downloadItems(results?.data);
2730
+ });
2731
+ }
2671
2732
  getTableData(resourceType, paging, filters, sort) {
2672
- paging = { ...this.DEFAULT_PAGING };
2733
+ if (!paging) {
2734
+ paging = { ...this.DEFAULT_PAGING };
2735
+ }
2673
2736
  if (sort) {
2674
2737
  paging.sort = sort.sortBy;
2675
2738
  paging.order = sort.ordering;
2676
2739
  }
2677
- for (let idx = 0; idx < filters.length; idx++) {
2740
+ for (let idx = 0; idx < filters?.length; idx++) {
2678
2741
  paging.noSearch = false;
2679
2742
  paging.searchOn = filters[idx].columnId;
2680
2743
  paging.filter = filters[idx].value;
@@ -2739,6 +2802,7 @@ class ListPageComponent {
2739
2802
  this.modalOpen = false;
2740
2803
  this.gridObj = {};
2741
2804
  this.subscription = new Subscription();
2805
+ this.growlerSvc = inject(GrowlerService);
2742
2806
  }
2743
2807
  ngOnInit() {
2744
2808
  this.filterService.currentPage = 1;
@@ -2810,6 +2874,18 @@ class ListPageComponent {
2810
2874
  this.isLoading = false;
2811
2875
  });
2812
2876
  }
2877
+ downloadAllItems() {
2878
+ this.isLoading = true;
2879
+ this.svc.downloadAllItems().then(() => {
2880
+ const growlerData = new GrowlerModel('success', 'Success', `Download Finished`, `The requested items have been downloaded`);
2881
+ this.growlerSvc.show(growlerData);
2882
+ }).catch(() => {
2883
+ const growlerData = new GrowlerModel('error', 'Error', `Download Failed`, `Failed to retrieve items for download`);
2884
+ this.growlerSvc.show(growlerData);
2885
+ }).finally(() => {
2886
+ this.isLoading = false;
2887
+ });
2888
+ }
2813
2889
  openBulkDelete(selectedItems, entityTypeLabel = 'item(s)') {
2814
2890
  const selectedIds = selectedItems.map((row) => {
2815
2891
  return row.id;
@@ -3338,6 +3414,9 @@ class PortRangesComponent {
3338
3414
  });
3339
3415
  this.invalid = invalid;
3340
3416
  }
3417
+ setIsValid(isValid) {
3418
+ this.invalid = !isValid;
3419
+ }
3341
3420
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PortRangesComponent, deps: [{ token: ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
3342
3421
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PortRangesComponent, selector: "lib-port-ranges", inputs: { fieldValue: "fieldValue" }, outputs: { fieldValueChanged: "fieldValueChanged" }, ngImport: i0, template: "<label>PORT RANGES</label>\n<p-chips\n (onAdd)=\"validateConfig()\"\n (onRemove)=\"validateConfig()\"\n (keyup)=\"onKeyup($event)\"\n [(ngModel)]=\"fieldValue\"\n [allowDuplicate]=\"false\"\n [ngClass]=\"{ error: invalid }\"\n [placeholder]=\"'80 120-125 443 8080'\"\n [addOnBlur]=\"true\"\n separator=\",\"\n>\n</p-chips>", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3$1.Chips, selector: "p-chips", inputs: ["style", "styleClass", "disabled", "field", "placeholder", "max", "ariaLabel", "ariaLabelledBy", "tabindex", "inputId", "allowDuplicate", "inputStyle", "inputStyleClass", "addOnTab", "addOnBlur", "separator", "showClear"], outputs: ["onAdd", "onRemove", "onFocus", "onBlur", "onChipClick", "onClear"] }] }); }
3343
3422
  }
@@ -3435,6 +3514,14 @@ class ForwardingConfigComponent {
3435
3514
  this.allowedPortRangesChange = new EventEmitter();
3436
3515
  this.allowedProtocolsChange = new EventEmitter();
3437
3516
  this.errors = {};
3517
+ this.props = [
3518
+ { key: 'allowedAddresses', value: undefined },
3519
+ { key: 'allowedPortRanges', value: undefined },
3520
+ { key: 'forwardPort', value: undefined },
3521
+ { key: 'forwardProtocol', value: undefined },
3522
+ { key: 'forwardAddress', value: undefined },
3523
+ { key: 'allowedProtocols', value: undefined },
3524
+ ];
3438
3525
  }
3439
3526
  forwardProtocolToggled(event) {
3440
3527
  if (!this.forwardProtocol) {
@@ -3508,6 +3595,19 @@ class ForwardingConfigComponent {
3508
3595
  }
3509
3596
  return isEmpty(this.errors) && papIsValid;
3510
3597
  }
3598
+ setValidationErrors(propertyPath = '', validationErrors) {
3599
+ this.props.forEach((prop) => {
3600
+ const hasValidationError = validationErrors?.some((error) => {
3601
+ let pathToMach = error.instancePath;
3602
+ if (!isEmpty(error?.params?.missingProperty)) {
3603
+ pathToMach += '/' + error?.params?.missingProperty;
3604
+ }
3605
+ return pathToMach === propertyPath + '/' + prop.key;
3606
+ });
3607
+ this.errors[prop.key] = hasValidationError;
3608
+ });
3609
+ this.papComponent.setValidationErrors(propertyPath, validationErrors);
3610
+ }
3511
3611
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ForwardingConfigComponent, deps: [{ token: ForwardingConfigService }, { token: ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
3512
3612
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ForwardingConfigComponent, selector: "lib-forwarding-config", inputs: { protocol: "protocol", address: "address", port: "port", forwardProtocol: "forwardProtocol", forwardAddress: "forwardAddress", forwardPort: "forwardPort", allowedAddresses: "allowedAddresses", allowedPortRanges: "allowedPortRanges", allowedProtocols: "allowedProtocols" }, outputs: { protocolChange: "protocolChange", addressChange: "addressChange", portChange: "portChange", forwardProtocolChange: "forwardProtocolChange", forwardAddressChange: "forwardAddressChange", forwardPortChange: "forwardPortChange", allowedAddressesChange: "allowedAddressesChange", allowedPortRangesChange: "allowedPortRangesChange", allowedProtocolsChange: "allowedProtocolsChange" }, viewQueries: [{ propertyName: "papComponent", first: true, predicate: ["papComponent"], descendants: true }], ngImport: i0, template: "<div class=\"forwarding-config-container\">\n <lib-protocol-address-port-input\n [showProtocol]=\"true\"\n [showAddress]=\"true\"\n [showHostName]=\"false\"\n [showPort]=\"true\"\n [disableProtocol]=\"forwardProtocol\"\n [disableAddress]=\"forwardAddress\"\n [disablePort]=\"forwardPort\"\n [(protocol)]=\"protocol\"\n [(address)]=\"address\"\n [(port)]=\"port\"\n #papComponent\n ></lib-protocol-address-port-input>\n <div class=\"forwarding-config-toggles\">\n <lib-boolean-toggle-input\n [fieldName]=\"'FORWARD PROTOCOL'\"\n [(fieldValue)]=\"forwardProtocol\"\n (fieldValueChange)=\"forwardProtocolToggled($event)\"\n >\n </lib-boolean-toggle-input>\n <lib-boolean-toggle-input\n [fieldName]=\"'FORWARD ADDRESS'\"\n [(fieldValue)]=\"forwardAddress\"\n (fieldValueChange)=\"forwardAddressToggled($event)\"\n >\n </lib-boolean-toggle-input>\n <lib-boolean-toggle-input\n [fieldName]=\"'FORWARD PORT'\"\n [(fieldValue)]=\"forwardPort\"\n (fieldValueChange)=\"forwardPortToggled($event)\"\n >\n </lib-boolean-toggle-input>\n </div>\n <div class=\"forwarding-config-allowed-inputs\">\n <lib-checkbox-list-input\n *ngIf=\"forwardProtocol\"\n [ngClass]=\"{invalid: errors['allowedProtocols']}\"\n [fieldName]=\"'ALLOWED PROTOCOLS'\"\n [valueList]=\"['tcp', 'udp']\"\n [(fieldValue)]=\"allowedProtocols\"\n >\n </lib-checkbox-list-input>\n <lib-text-list-input\n *ngIf=\"forwardAddress\"\n [ngClass]=\"{invalid: errors['allowedAddresses']}\"\n [fieldName]=\"'ALLOWED ADDRESSES'\"\n [placeholder]=\"'10.10.0.0/24 domain.com'\"\n [(fieldValue)]=\"allowedAddresses\"\n [labelColor]=\"'#000000'\"\n >\n </lib-text-list-input>\n <lib-text-list-input\n *ngIf=\"forwardPort\"\n [ngClass]=\"{invalid: errors['allowedPortRanges']}\"\n [fieldName]=\"'ALLOWED PORT RANGES'\"\n [placeholder]=\"'80 120-125 443 8080'\"\n [(fieldValue)]=\"allowedPortRanges\"\n [labelColor]=\"'#000000'\"\n [fieldClass]=\"errors['allowedPortRanges'] ? 'error' : ''\"\n (fieldValueChange)=\"validatePortRanges()\"\n >\n </lib-text-list-input>\n </div>\n</div>\n", styles: [".forwarding-config-container{display:flex;flex-direction:column;align-items:center;justify-content:flex-start}.forwarding-config-container .forwarding-config-toggles{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:50px}.forwarding-config-container .forwarding-config-allowed-inputs{display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;width:100%}.forwarding-config-container *{width:100%}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BooleanToggleInputComponent, selector: "lib-boolean-toggle-input", inputs: ["fieldName", "fieldValue", "parentage", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }, { kind: "component", type: TextListInputComponent, selector: "lib-text-list-input", inputs: ["fieldName", "fieldValue", "placeholder", "parentage", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }, { kind: "component", type: CheckboxListInputComponent, selector: "lib-checkbox-list-input", inputs: ["fieldName", "fieldValue", "placeholder", "parentage", "valueList", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }, { kind: "component", type: ProtocolAddressPortInputComponent, selector: "lib-protocol-address-port-input", inputs: ["protocolList", "showProtocol", "showAddress", "showHostName", "showPort", "disableProtocol", "disableAddress", "disableHostName", "disablePort", "protocol", "address", "hostname", "port", "parentage", "labelColor", "labelPrefix", "fieldClass", "error"], outputs: ["fieldValueChange", "portChange", "addressChange", "hostnameChange", "protocolChange"] }] }); }
3513
3613
  }
@@ -5304,23 +5404,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5304
5404
  See the License for the specific language governing permissions and
5305
5405
  limitations under the License.
5306
5406
  */
5307
- const CSV_COLUMNS$5 = [
5308
- { label: 'Name', path: 'name' },
5309
- { label: 'Roles', path: 'roleAttributes' },
5310
- { label: 'Online', path: 'hasApiSession' },
5311
- { label: 'Edge Router Connected', path: 'hasEdgeRouterConnection' },
5312
- { label: 'OS', path: 'envInfo.os' },
5313
- { label: 'OS Version', path: 'envInfo.osVersion' },
5314
- { label: 'SDK', path: 'sdkInfo.version' },
5315
- { label: 'App Version', path: 'sdkInfo.appVersion' },
5316
- { label: 'Type', path: 'typeId' },
5317
- { label: 'Is Admin', path: 'isAdmin' },
5318
- { label: 'Auth Policy', path: 'authPolicy.name' },
5319
- { label: 'Auth Policy ID', path: 'authPolicy.id' },
5320
- { label: 'MFA Enabled', path: 'isMfaEnabled' },
5321
- { label: 'Created At', path: 'createdAt' },
5322
- { label: 'ID', path: 'id' },
5323
- ];
5324
5407
  class IdentitiesPageService extends ListPageServiceClass {
5325
5408
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
5326
5409
  super(settings, filterService, csvDownloadService, extService, router);
@@ -5331,6 +5414,23 @@ class IdentitiesPageService extends ListPageServiceClass {
5331
5414
  this.router = router;
5332
5415
  this.paging = this.DEFAULT_PAGING;
5333
5416
  this.modalType = 'identities';
5417
+ this.CSV_COLUMNS = [
5418
+ { label: 'Name', path: 'name' },
5419
+ { label: 'Roles', path: 'roleAttributes' },
5420
+ { label: 'Online', path: 'hasApiSession' },
5421
+ { label: 'Edge Router Connected', path: 'hasEdgeRouterConnection' },
5422
+ { label: 'OS', path: 'envInfo.os' },
5423
+ { label: 'OS Version', path: 'envInfo.osVersion' },
5424
+ { label: 'SDK', path: 'sdkInfo.version' },
5425
+ { label: 'App Version', path: 'sdkInfo.appVersion' },
5426
+ { label: 'Type', path: 'typeId' },
5427
+ { label: 'Is Admin', path: 'isAdmin' },
5428
+ { label: 'Auth Policy', path: 'authPolicy.name' },
5429
+ { label: 'Auth Policy ID', path: 'authPolicy.id' },
5430
+ { label: 'MFA Enabled', path: 'isMfaEnabled' },
5431
+ { label: 'Created At', path: 'createdAt' },
5432
+ { label: 'ID', path: 'id' },
5433
+ ];
5334
5434
  this.selectedIdentity = new Identity$1();
5335
5435
  this.columnFilters = {
5336
5436
  name: '',
@@ -5696,14 +5796,6 @@ class IdentitiesPageService extends ListPageServiceClass {
5696
5796
  }
5697
5797
  return expiresAt;
5698
5798
  }
5699
- downloadAllItems() {
5700
- const paging = cloneDeep(this.paging);
5701
- paging.total = 2000;
5702
- super.getTableData('identities', paging, undefined, undefined)
5703
- .then((results) => {
5704
- return this.downloadItems(results?.data);
5705
- });
5706
- }
5707
5799
  resetEnrollment(identity, date) {
5708
5800
  let id = identity?.authenticators?.cert?.id;
5709
5801
  if (!id) {
@@ -5725,9 +5817,6 @@ class IdentitiesPageService extends ListPageServiceClass {
5725
5817
  this.growlerService.show(growlerData);
5726
5818
  });
5727
5819
  }
5728
- downloadItems(selectedItems) {
5729
- this.csvDownloadService.download('identities', selectedItems, CSV_COLUMNS$5, false, false, undefined, false);
5730
- }
5731
5820
  openUpdate(itemId) {
5732
5821
  this.modalType = 'identity';
5733
5822
  this.sideModalOpen = true;
@@ -5889,24 +5978,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5889
5978
  args: [EDGE_ROUTER_EXTENSION_SERVICE]
5890
5979
  }] }]; } });
5891
5980
 
5892
- const CSV_COLUMNS$4 = [
5893
- { label: 'Name', path: 'name' },
5894
- { label: 'Attributes', path: 'roleAttributes' },
5895
- { label: 'Verified', path: 'isVerified' },
5896
- { label: 'Online', path: 'isOnline' },
5897
- { label: 'Created', path: 'createdAt' },
5898
- { label: 'Token', path: 'enrollmentToken' },
5899
- { label: 'No Traversal', path: 'noTraversal' },
5900
- { label: 'Host Name', path: 'hostname' },
5901
- { label: 'Disabled', path: 'disabled' },
5902
- { label: 'Tunneler Enabled', path: 'isTunnelerEnabled' },
5903
- { label: 'OS', path: 'versionInfo.os' },
5904
- { label: 'Architecture', path: 'versionInfo.arch' },
5905
- { label: 'Version', path: 'versionInfo.version' },
5906
- { label: 'Revision', path: 'versionInfo.revision' },
5907
- { label: 'Fingerprint', path: 'fingerprint' },
5908
- { label: 'ID', path: 'id' },
5909
- ];
5910
5981
  class EdgeRoutersPageService extends ListPageServiceClass {
5911
5982
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
5912
5983
  super(settings, filterService, csvDownloadService, extService, router);
@@ -5918,6 +5989,24 @@ class EdgeRoutersPageService extends ListPageServiceClass {
5918
5989
  this.router = router;
5919
5990
  this.paging = this.DEFAULT_PAGING;
5920
5991
  this.modalType = 'edge-router';
5992
+ this.CSV_COLUMNS = [
5993
+ { label: 'Name', path: 'name' },
5994
+ { label: 'Attributes', path: 'roleAttributes' },
5995
+ { label: 'Verified', path: 'isVerified' },
5996
+ { label: 'Online', path: 'isOnline' },
5997
+ { label: 'Created', path: 'createdAt' },
5998
+ { label: 'Token', path: 'enrollmentToken' },
5999
+ { label: 'No Traversal', path: 'noTraversal' },
6000
+ { label: 'Host Name', path: 'hostname' },
6001
+ { label: 'Disabled', path: 'disabled' },
6002
+ { label: 'Tunneler Enabled', path: 'isTunnelerEnabled' },
6003
+ { label: 'OS', path: 'versionInfo.os' },
6004
+ { label: 'Architecture', path: 'versionInfo.arch' },
6005
+ { label: 'Version', path: 'versionInfo.version' },
6006
+ { label: 'Revision', path: 'versionInfo.revision' },
6007
+ { label: 'Fingerprint', path: 'fingerprint' },
6008
+ { label: 'ID', path: 'id' },
6009
+ ];
5921
6010
  this.selectedEdgeRouter = new EdgeRouter();
5922
6011
  this.columnFilters = {
5923
6012
  name: '',
@@ -6107,8 +6196,9 @@ class EdgeRoutersPageService extends ListPageServiceClass {
6107
6196
  }
6108
6197
  return tableColumns;
6109
6198
  }
6110
- getData(filters, sort) {
6199
+ getData(filters, sort, page) {
6111
6200
  // we can customize filters or sorting here before moving on...
6201
+ this.paging.page = page || this.paging.page;
6112
6202
  return super.getTableData('edge-routers', this.paging, filters, sort)
6113
6203
  .then((results) => {
6114
6204
  return this.processData(results);
@@ -6149,17 +6239,6 @@ class EdgeRoutersPageService extends ListPageServiceClass {
6149
6239
  element.click();
6150
6240
  document.body.removeChild(element);
6151
6241
  }
6152
- downloadAllItems() {
6153
- const paging = cloneDeep(this.paging);
6154
- paging.total = 2000;
6155
- super.getTableData('edge-routers', paging, undefined, undefined)
6156
- .then((results) => {
6157
- return this.downloadItems(results?.data);
6158
- });
6159
- }
6160
- downloadItems(selectedItems) {
6161
- this.csvDownloadService.download('edge-routers', selectedItems, CSV_COLUMNS$4, false, false, undefined, false);
6162
- }
6163
6242
  reenroll(router) {
6164
6243
  const data = {
6165
6244
  appendId: 'ReenrollRouter',
@@ -6312,6 +6391,9 @@ class QrCodeComponent {
6312
6391
  });
6313
6392
  }
6314
6393
  expandQRCode() {
6394
+ if (!this.canExpand) {
6395
+ return;
6396
+ }
6315
6397
  const data = {
6316
6398
  jwt: this.jwt,
6317
6399
  expiration: this.expiration,
@@ -7952,6 +8034,12 @@ class ConfigurationsPageComponent extends ListPageComponent {
7952
8034
  case 'delete':
7953
8035
  this.deleteItem(event.item);
7954
8036
  break;
8037
+ case 'download-all':
8038
+ this.downloadAllItems();
8039
+ break;
8040
+ case 'download-selected':
8041
+ this.svc.downloadItems(this.selectedItems);
8042
+ break;
7955
8043
  default:
7956
8044
  break;
7957
8045
  }
@@ -8648,7 +8736,7 @@ class JsonViewComponent {
8648
8736
  text: undefined,
8649
8737
  json: this.data || {}
8650
8738
  };
8651
- this.editor = new JSONEditor({
8739
+ this.editor = createJSONEditor({
8652
8740
  target: this.editorDiv.nativeElement,
8653
8741
  props: {
8654
8742
  validator: this.validator,
@@ -10471,7 +10559,7 @@ class IdentitiesPageComponent extends ListPageComponent {
10471
10559
  this.showQRCode(event.item);
10472
10560
  break;
10473
10561
  case 'download-all':
10474
- this.svc.downloadAllItems();
10562
+ this.downloadAllItems();
10475
10563
  break;
10476
10564
  case 'download-selected':
10477
10565
  this.svc.downloadItems(this.selectedItems);
@@ -10648,7 +10736,7 @@ class EdgeRoutersPageComponent extends ListPageComponent {
10648
10736
  this.downloadJWT(event.item);
10649
10737
  break;
10650
10738
  case 'download-all':
10651
- this.svc.downloadAllItems();
10739
+ this.downloadAllItems();
10652
10740
  break;
10653
10741
  case 'download-selected':
10654
10742
  this.svc.downloadItems(this.selectedItems);
@@ -10949,10 +11037,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
10949
11037
  See the License for the specific language governing permissions and
10950
11038
  limitations under the License.
10951
11039
  */
10952
- const CSV_COLUMNS$3 = [
10953
- { label: 'Name', path: 'name' },
10954
- { label: 'Created At', path: 'createdAt' }
10955
- ];
10956
11040
  class ServicesPageService extends ListPageServiceClass {
10957
11041
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router, servicePolicyService) {
10958
11042
  super(settings, filterService, csvDownloadService, extService, router);
@@ -10965,6 +11049,13 @@ class ServicesPageService extends ListPageServiceClass {
10965
11049
  this.servicePolicyService = servicePolicyService;
10966
11050
  this.paging = this.DEFAULT_PAGING;
10967
11051
  this.modalType = 'service';
11052
+ this.CSV_COLUMNS = [
11053
+ { label: 'Name', path: 'name' },
11054
+ { label: 'ID', path: 'id' },
11055
+ { label: 'Encryption Required', path: 'encryptionRequired' },
11056
+ { label: 'Terminator Strategy', path: 'terminatorStrategy' },
11057
+ { label: 'Created At', path: 'createdAt' },
11058
+ ];
10968
11059
  this.serviceType = '';
10969
11060
  this.selectedService = new Service$1();
10970
11061
  this.columnFilters = {
@@ -11094,17 +11185,6 @@ class ServicesPageService extends ListPageServiceClass {
11094
11185
  getIdentityRoleAttributes() {
11095
11186
  return this.zitiService.get('identity-role-attributes', {}, []);
11096
11187
  }
11097
- downloadAllItems() {
11098
- const paging = cloneDeep(this.paging);
11099
- paging.total = this.totalCount;
11100
- super.getTableData('services', paging, undefined, undefined)
11101
- .then((results) => {
11102
- return this.downloadItems(results?.data);
11103
- });
11104
- }
11105
- downloadItems(selectedItems) {
11106
- this.csvDownloadService.download('services', selectedItems, CSV_COLUMNS$3, false, false, undefined, false);
11107
- }
11108
11188
  openSelection() {
11109
11189
  this.router.navigateByUrl('/services/select');
11110
11190
  }
@@ -11565,7 +11645,7 @@ class ServicesPageComponent extends ListPageComponent {
11565
11645
  this.deleteItem(event.item);
11566
11646
  break;
11567
11647
  case 'download-all':
11568
- this.svc.downloadAllItems();
11648
+ this.downloadAllItems();
11569
11649
  break;
11570
11650
  case 'download-selected':
11571
11651
  this.svc.downloadItems(this.selectedItems);
@@ -12197,7 +12277,7 @@ class GrowlerComponent {
12197
12277
  this.show = true;
12198
12278
  setTimeout(() => {
12199
12279
  this.show = false;
12200
- }, 5000);
12280
+ }, 7000);
12201
12281
  }
12202
12282
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GrowlerComponent, deps: [{ token: GrowlerService }], target: i0.ɵɵFactoryTarget.Component }); }
12203
12283
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GrowlerComponent, selector: "lib-growler", inputs: { title: "title", subtitle: "subtitle", level: "level", content: "content", show: "show" }, ngImport: i0, template: `
@@ -12206,7 +12286,7 @@ class GrowlerComponent {
12206
12286
  <div class="subtitle">{{ subtitle }}</div>
12207
12287
  <div [innerHTML]="content" class="content"></div>
12208
12288
  <div class="icon"></div>
12209
- </div>`, isInline: true, styles: ["#Growler{position:fixed;right:20px;bottom:-100px;min-width:300px;z-index:999999999;max-width:500px}#NotificationsMenu .growler{position:relative;width:100%;margin-bottom:20px;opacity:1}.growler{background-color:var(--background);min-height:105px;min-width:334px;font-size:16px;color:#000;text-align:left;border-radius:6px;box-shadow:0 12px 23px #0000001a;transition:.5s;opacity:0}#Growler.open{bottom:20px}.growler.open{opacity:1}.growler .time{font-size:13px;color:#fff;position:absolute;top:7px;right:10px;font-weight:600;font-family:Open Sans,serif}.growler.error .title{background-color:#ff104b}.growler.success .title{background-color:#03db5c}.growler.warning .title{background-color:#ffc103}.growler.info .title{background-color:#0971ff}.growler.bug .title{background-color:#ff104b}.growler .title{padding-left:10px;padding-right:10px;font-size:14px;color:#fff;line-height:30px;text-transform:uppercase;background-color:#03db5c;border-top-left-radius:6px;border-top-right-radius:6px;font-weight:600;font-family:Open Sans,serif}.growler .subtitle{padding-top:10px;font-size:15px;font-weight:700;padding-left:75px;padding-right:10px}.growler .content{font-size:13px;padding-left:75px;padding-right:10px;margin-top:2px;line-height:14px;text-overflow:ellipsis;overflow:hidden;font-weight:400;font-family:Open Sans,serif;color:var(--tableText);padding-bottom:10px}.growler .icon{width:55px;height:55px;background-position:center center;background-size:80%;position:absolute;left:10px;top:40px}.growler.error .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.success .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.info .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.warning .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.bug .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg style%3D'enable-background%3Anew 0 0 21 24%3B' version%3D'1.1' viewBox%3D'0 0 21 24' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFE1EB%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09'%2F%3E %3Cpolygon class%3D'st0' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'10.5%2C8.5 15.5%2C8.5 14%2C5 10.5%2C4 %09'%2F%3E %3Cpolygon class%3D'st1' points%3D'10.5%2C23.5 15.5%2C21 15.5%2C10.5 10.5%2C10.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cg%3E%09%09%3Cpolyline class%3D'st2' points%3D'6.5%2C0.5 6.5%2C2.5 8.1%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'14.5%2C0.5 14.5%2C2.5 12.9%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C10.5 3%2C10.5 0.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C14.5 3%2C14.5 0.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C18.5 3%2C18.5 0.5%2C20.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C10.5 18%2C10.5 20.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C14.5 18%2C14.5 20.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C18.5 18%2C18.5 20.5%2C20.5 %09%09'%2F%3E %3Cline class%3D'st2' x1%3D'10.5' x2%3D'10.5' y1%3D'23.5' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'5.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'15.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cpolygon class%3D'st2' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09%09'%2F%3E %3Cpolygon class%3D'st2' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09%09'%2F%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}#NotificationsMenu{z-index:9999;width:0;position:fixed;top:0;bottom:0;left:-80px;background-color:var(--background);border-right:3px solid var(--inputBorder);transition:.3s;opacity:0;overflow:hidden}#NotificationsList{overflow-x:visible;overflow-y:auto;position:absolute;inset:70px 0 0;clear:both;padding:0 22px 22px}#NotificationsMenu.open,#NotificationsList.open{width:380px;left:0;opacity:1}#NotificationsMenu .header.icon{background-image:unset;text-align:center;font-size:30px;font-weight:800;color:var(--icon);line-height:30px;position:relative;float:left;width:30px;height:30px;margin:20px 33px 20px 20px;background-size:75%;left:10px;top:0}#NotificationsMenu .header.title{font-weight:300;font-family:Russo One,serif;font-size:24px;line-height:78px;color:var(--primaryColor);filter:brightness(50%);padding-left:20px;text-transform:uppercase}.NoNotificationsText{margin:0;color:var(--tableText);font-weight:600;font-family:Open Sans,Arial,sans-serif;font-size:14px}#NotificationMenuClose{color:var(--icon);font-size:35px;text-align:center;font-weight:600;line-height:40px;width:40px;height:40px;position:absolute;right:16px;top:17px;cursor:pointer;z-index:20;transition:.3s}#NotificationMenuClose:hover{filter:brightness(50%);transition:.3s}#NotificationMenuClose:active{filter:none;transform:scale(.95);transition:.3s}.sev{height:64px;background-size:40%;background-position:center center;position:relative;float:left}.sevError,.sevMajor,.sevCritical{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevWarning,.sevMinor{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevInfo{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevSuccess{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
12289
+ </div>`, isInline: true, styles: ["#Growler{position:fixed;right:20px;bottom:-100px;min-width:300px;z-index:999999999;max-width:500px}#NotificationsMenu .growler{position:relative;width:100%;margin-bottom:20px;opacity:1}.growler{background-color:var(--background);min-height:105px;min-width:334px;font-size:16px;color:#000;text-align:left;border-radius:6px;box-shadow:0 12px 23px #0000001a;transition:.5s;opacity:0}#Growler.open{bottom:20px}.growler.open{opacity:1}.growler .time{font-size:13px;color:#fff;position:absolute;top:7px;right:10px;font-weight:600;font-family:Open Sans,serif}.growler.error .title{background-color:#ff104b}.growler.success .title{background-color:#03db5c}.growler.warning .title{background-color:#ffc103}.growler.info .title{background-color:#0971ff}.growler.bug .title{background-color:#ff104b}.growler .title{padding-left:10px;padding-right:10px;font-size:14px;color:#fff;line-height:30px;text-transform:uppercase;background-color:#03db5c;border-top-left-radius:6px;border-top-right-radius:6px;font-weight:600;font-family:Open Sans,serif}.growler .subtitle{padding-top:10px;font-size:15px;font-weight:700;padding-left:75px;padding-right:10px}.growler .content{font-size:13px;padding-left:75px;padding-right:10px;margin-top:2px;line-height:14px;text-overflow:ellipsis;overflow:hidden;font-weight:400;font-family:Open Sans,serif;color:var(--tableText);padding-bottom:10px}.growler .icon{width:55px;height:55px;background-position:center center;background-size:80%;position:absolute;left:10px;top:40px}.growler.error .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.success .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.info .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.warning .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.bug .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg style%3D'enable-background%3Anew 0 0 21 24%3B' version%3D'1.1' viewBox%3D'0 0 21 24' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFE1EB%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09'%2F%3E %3Cpolygon class%3D'st0' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'10.5%2C8.5 15.5%2C8.5 14%2C5 10.5%2C4 %09'%2F%3E %3Cpolygon class%3D'st1' points%3D'10.5%2C23.5 15.5%2C21 15.5%2C10.5 10.5%2C10.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cg%3E%09%09%3Cpolyline class%3D'st2' points%3D'6.5%2C0.5 6.5%2C2.5 8.1%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'14.5%2C0.5 14.5%2C2.5 12.9%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C10.5 3%2C10.5 0.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C14.5 3%2C14.5 0.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C18.5 3%2C18.5 0.5%2C20.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C10.5 18%2C10.5 20.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C14.5 18%2C14.5 20.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C18.5 18%2C18.5 20.5%2C20.5 %09%09'%2F%3E %3Cline class%3D'st2' x1%3D'10.5' x2%3D'10.5' y1%3D'23.5' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'5.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'15.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cpolygon class%3D'st2' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09%09'%2F%3E %3Cpolygon class%3D'st2' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09%09'%2F%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}#NotificationsMenu{z-index:9999;width:0;position:fixed;top:0;bottom:0;left:-80px;background-color:var(--background);border-right:3px solid var(--inputBorder);transition:.3s;opacity:0;overflow:hidden}#NotificationsList{overflow-x:visible;overflow-y:auto;position:absolute;inset:70px 0 0;clear:both;padding:0 22px 22px}#NotificationsMenu.open,#NotificationsList.open{width:380px;left:0;opacity:1}#NotificationsMenu .header.icon{background-image:unset;text-align:center;font-size:30px;font-weight:800;color:var(--icon);line-height:30px;position:relative;float:left;width:30px;height:30px;margin:20px 33px 20px 20px;background-size:75%;left:10px;top:0}#NotificationsMenu .header.title{font-weight:300;font-family:Russo One,serif;font-size:24px;line-height:78px;color:var(--primaryColor);filter:brightness(50%);padding-left:20px;text-transform:uppercase}.NoNotificationsText{margin:0;color:var(--tableText);font-weight:600;font-family:Open Sans,Arial,sans-serif;font-size:14px}#NotificationMenuClose{color:var(--icon);font-size:35px;text-align:center;font-weight:600;line-height:40px;width:40px;height:40px;position:absolute;right:16px;top:17px;cursor:pointer;z-index:20;transition:.3s}#NotificationMenuClose:hover{filter:brightness(50%);transition:.3s}#NotificationMenuClose:active{filter:none;transform:scale(.95);transition:.3s}.sev{height:64px;background-size:40%;background-position:center center;position:relative;float:left}.sevError,.sevMajor,.sevCritical{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevWarning,.sevMinor{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevInfo{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevSuccess{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}::ng-deep .growler .content ul{margin-top:5px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
12210
12290
  }
12211
12291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GrowlerComponent, decorators: [{
12212
12292
  type: Component,
@@ -12216,7 +12296,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
12216
12296
  <div class="subtitle">{{ subtitle }}</div>
12217
12297
  <div [innerHTML]="content" class="content"></div>
12218
12298
  <div class="icon"></div>
12219
- </div>`, styles: ["#Growler{position:fixed;right:20px;bottom:-100px;min-width:300px;z-index:999999999;max-width:500px}#NotificationsMenu .growler{position:relative;width:100%;margin-bottom:20px;opacity:1}.growler{background-color:var(--background);min-height:105px;min-width:334px;font-size:16px;color:#000;text-align:left;border-radius:6px;box-shadow:0 12px 23px #0000001a;transition:.5s;opacity:0}#Growler.open{bottom:20px}.growler.open{opacity:1}.growler .time{font-size:13px;color:#fff;position:absolute;top:7px;right:10px;font-weight:600;font-family:Open Sans,serif}.growler.error .title{background-color:#ff104b}.growler.success .title{background-color:#03db5c}.growler.warning .title{background-color:#ffc103}.growler.info .title{background-color:#0971ff}.growler.bug .title{background-color:#ff104b}.growler .title{padding-left:10px;padding-right:10px;font-size:14px;color:#fff;line-height:30px;text-transform:uppercase;background-color:#03db5c;border-top-left-radius:6px;border-top-right-radius:6px;font-weight:600;font-family:Open Sans,serif}.growler .subtitle{padding-top:10px;font-size:15px;font-weight:700;padding-left:75px;padding-right:10px}.growler .content{font-size:13px;padding-left:75px;padding-right:10px;margin-top:2px;line-height:14px;text-overflow:ellipsis;overflow:hidden;font-weight:400;font-family:Open Sans,serif;color:var(--tableText);padding-bottom:10px}.growler .icon{width:55px;height:55px;background-position:center center;background-size:80%;position:absolute;left:10px;top:40px}.growler.error .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.success .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.info .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.warning .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.bug .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg style%3D'enable-background%3Anew 0 0 21 24%3B' version%3D'1.1' viewBox%3D'0 0 21 24' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFE1EB%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09'%2F%3E %3Cpolygon class%3D'st0' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'10.5%2C8.5 15.5%2C8.5 14%2C5 10.5%2C4 %09'%2F%3E %3Cpolygon class%3D'st1' points%3D'10.5%2C23.5 15.5%2C21 15.5%2C10.5 10.5%2C10.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cg%3E%09%09%3Cpolyline class%3D'st2' points%3D'6.5%2C0.5 6.5%2C2.5 8.1%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'14.5%2C0.5 14.5%2C2.5 12.9%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C10.5 3%2C10.5 0.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C14.5 3%2C14.5 0.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C18.5 3%2C18.5 0.5%2C20.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C10.5 18%2C10.5 20.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C14.5 18%2C14.5 20.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C18.5 18%2C18.5 20.5%2C20.5 %09%09'%2F%3E %3Cline class%3D'st2' x1%3D'10.5' x2%3D'10.5' y1%3D'23.5' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'5.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'15.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cpolygon class%3D'st2' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09%09'%2F%3E %3Cpolygon class%3D'st2' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09%09'%2F%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}#NotificationsMenu{z-index:9999;width:0;position:fixed;top:0;bottom:0;left:-80px;background-color:var(--background);border-right:3px solid var(--inputBorder);transition:.3s;opacity:0;overflow:hidden}#NotificationsList{overflow-x:visible;overflow-y:auto;position:absolute;inset:70px 0 0;clear:both;padding:0 22px 22px}#NotificationsMenu.open,#NotificationsList.open{width:380px;left:0;opacity:1}#NotificationsMenu .header.icon{background-image:unset;text-align:center;font-size:30px;font-weight:800;color:var(--icon);line-height:30px;position:relative;float:left;width:30px;height:30px;margin:20px 33px 20px 20px;background-size:75%;left:10px;top:0}#NotificationsMenu .header.title{font-weight:300;font-family:Russo One,serif;font-size:24px;line-height:78px;color:var(--primaryColor);filter:brightness(50%);padding-left:20px;text-transform:uppercase}.NoNotificationsText{margin:0;color:var(--tableText);font-weight:600;font-family:Open Sans,Arial,sans-serif;font-size:14px}#NotificationMenuClose{color:var(--icon);font-size:35px;text-align:center;font-weight:600;line-height:40px;width:40px;height:40px;position:absolute;right:16px;top:17px;cursor:pointer;z-index:20;transition:.3s}#NotificationMenuClose:hover{filter:brightness(50%);transition:.3s}#NotificationMenuClose:active{filter:none;transform:scale(.95);transition:.3s}.sev{height:64px;background-size:40%;background-position:center center;position:relative;float:left}.sevError,.sevMajor,.sevCritical{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevWarning,.sevMinor{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevInfo{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevSuccess{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}\n"] }]
12299
+ </div>`, styles: ["#Growler{position:fixed;right:20px;bottom:-100px;min-width:300px;z-index:999999999;max-width:500px}#NotificationsMenu .growler{position:relative;width:100%;margin-bottom:20px;opacity:1}.growler{background-color:var(--background);min-height:105px;min-width:334px;font-size:16px;color:#000;text-align:left;border-radius:6px;box-shadow:0 12px 23px #0000001a;transition:.5s;opacity:0}#Growler.open{bottom:20px}.growler.open{opacity:1}.growler .time{font-size:13px;color:#fff;position:absolute;top:7px;right:10px;font-weight:600;font-family:Open Sans,serif}.growler.error .title{background-color:#ff104b}.growler.success .title{background-color:#03db5c}.growler.warning .title{background-color:#ffc103}.growler.info .title{background-color:#0971ff}.growler.bug .title{background-color:#ff104b}.growler .title{padding-left:10px;padding-right:10px;font-size:14px;color:#fff;line-height:30px;text-transform:uppercase;background-color:#03db5c;border-top-left-radius:6px;border-top-right-radius:6px;font-weight:600;font-family:Open Sans,serif}.growler .subtitle{padding-top:10px;font-size:15px;font-weight:700;padding-left:75px;padding-right:10px}.growler .content{font-size:13px;padding-left:75px;padding-right:10px;margin-top:2px;line-height:14px;text-overflow:ellipsis;overflow:hidden;font-weight:400;font-family:Open Sans,serif;color:var(--tableText);padding-bottom:10px}.growler .icon{width:55px;height:55px;background-position:center center;background-size:80%;position:absolute;left:10px;top:40px}.growler.error .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.success .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.info .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.warning .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.growler.bug .icon{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg style%3D'enable-background%3Anew 0 0 21 24%3B' version%3D'1.1' viewBox%3D'0 0 21 24' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFE1EB%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09'%2F%3E %3Cpolygon class%3D'st0' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'10.5%2C8.5 15.5%2C8.5 14%2C5 10.5%2C4 %09'%2F%3E %3Cpolygon class%3D'st1' points%3D'10.5%2C23.5 15.5%2C21 15.5%2C10.5 10.5%2C10.5 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cg%3E%09%09%3Cpolyline class%3D'st2' points%3D'6.5%2C0.5 6.5%2C2.5 8.1%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'14.5%2C0.5 14.5%2C2.5 12.9%2C4.7 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C10.5 3%2C10.5 0.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C14.5 3%2C14.5 0.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.5%2C18.5 3%2C18.5 0.5%2C20.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C10.5 18%2C10.5 20.5%2C12.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C14.5 18%2C14.5 20.5%2C16.5 %09%09'%2F%3E %3Cpolyline class%3D'st2' points%3D'15.5%2C18.5 18%2C18.5 20.5%2C20.5 %09%09'%2F%3E %3Cline class%3D'st2' x1%3D'10.5' x2%3D'10.5' y1%3D'23.5' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'5.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cline class%3D'st2' x1%3D'15.5' x2%3D'10.5' y1%3D'15' y2%3D'10.5'%2F%3E %3Cpolygon class%3D'st2' points%3D'15.5%2C8.5 14%2C5 10.5%2C4 7%2C5 5.5%2C8.5 %09%09'%2F%3E %3Cpolygon class%3D'st2' points%3D'5.5%2C10.5 5.5%2C21 10.5%2C23.5 15.5%2C21 15.5%2C10.5 %09%09'%2F%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}#NotificationsMenu{z-index:9999;width:0;position:fixed;top:0;bottom:0;left:-80px;background-color:var(--background);border-right:3px solid var(--inputBorder);transition:.3s;opacity:0;overflow:hidden}#NotificationsList{overflow-x:visible;overflow-y:auto;position:absolute;inset:70px 0 0;clear:both;padding:0 22px 22px}#NotificationsMenu.open,#NotificationsList.open{width:380px;left:0;opacity:1}#NotificationsMenu .header.icon{background-image:unset;text-align:center;font-size:30px;font-weight:800;color:var(--icon);line-height:30px;position:relative;float:left;width:30px;height:30px;margin:20px 33px 20px 20px;background-size:75%;left:10px;top:0}#NotificationsMenu .header.title{font-weight:300;font-family:Russo One,serif;font-size:24px;line-height:78px;color:var(--primaryColor);filter:brightness(50%);padding-left:20px;text-transform:uppercase}.NoNotificationsText{margin:0;color:var(--tableText);font-weight:600;font-family:Open Sans,Arial,sans-serif;font-size:14px}#NotificationMenuClose{color:var(--icon);font-size:35px;text-align:center;font-weight:600;line-height:40px;width:40px;height:40px;position:absolute;right:16px;top:17px;cursor:pointer;z-index:20;transition:.3s}#NotificationMenuClose:hover{filter:brightness(50%);transition:.3s}#NotificationMenuClose:active{filter:none;transform:scale(.95);transition:.3s}.sev{height:64px;background-size:40%;background-position:center center;position:relative;float:left}.sevError,.sevMajor,.sevCritical{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B opacity%3A 0.75%3B fill%3A %23FFFFFF%3B enable-background%3A new%3B %7D .st1 %7B fill%3A %23FFCFDD%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FE124B%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 %09'%2F%3E %3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'7.1' x2%3D'16.1' y1%3D'6.6' y2%3D'15.6'%2F%3E %3Cline class%3D'st2' x1%3D'16.1' x2%3D'7.1' y1%3D'6.6' y2%3D'15.6'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevWarning,.sevMinor{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23FFECB6%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23FFC101%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cg%3E%09%09%09%3Cline class%3D'st2' x1%3D'11.6' x2%3D'11.6' y1%3D'13.1' y2%3D'6.1'%2F%3E %3Cpath class%3D'st3' d%3D'M12.1%2C16.6c0%2C0.3-0.2%2C0.5-0.5%2C0.5l0%2C0c-0.3%2C0-0.5-0.2-0.5-0.5l0%2C0c0-0.3%2C0.2-0.5%2C0.5-0.5l0%2C0%09%09%09%09C11.9%2C16.1%2C12.1%2C16.3%2C12.1%2C16.6L12.1%2C16.6z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevInfo{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 23.2 24.2%3B' version%3D'1.1' viewBox%3D'0 0 23.2 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23C0DEFF%3B %7D .st2 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D .st3 %7B fill%3A none%3B stroke%3A %23006CFF%3B stroke-width%3A 1.25%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 '%2F%3E %3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 '%2F%3E %3Cpolygon class%3D'st2' points%3D'11.6%2C0.6 22.6%2C4.1 20.1%2C19.6 11.6%2C23.6 3.1%2C19.6 0.6%2C4.1 '%2F%3E %3Cg%3E%09%3Cg%3E%09%09%3Cline class%3D'st2' x1%3D'9.5' x2%3D'14.3' y1%3D'16.6' y2%3D'16.6'%2F%3E %3Cpolyline class%3D'st2' points%3D'10.3%2C9.3 11.9%2C9.3 11.9%2C16.2 %09%09'%2F%3E %3Cg%3E%09%09%09%3Cpath class%3D'st3' d%3D'M11.5%2C5.7c-0.2%2C0-0.4%2C0.2-0.4%2C0.4c0%2C0.2%2C0.2%2C0.4%2C0.4%2C0.4c0.2%2C0%2C0.4-0.2%2C0.4-0.4C11.9%2C5.9%2C11.8%2C5.7%2C11.5%2C5.7%09%09%09%09L11.5%2C5.7z'%2F%3E%09%09%3C%2Fg%3E%09%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}.sevSuccess{background-image:url(\"data:image/svg+xml,%3C%3Fxml version%3D%221.0%22 encoding%3D%22utf-8%22%3F%3E%3C!-- Generator%3A Adobe Illustrator 23.0.3%2C SVG Export Plug-In . SVG Version%3A 6.00 Build 0) --%3E%3Csvg id%3D'Layer_1' style%3D'enable-background%3Anew 0 0 24.8 24.2%3B' version%3D'1.1' viewBox%3D'0 0 24.8 24.2' x%3D'0px' xml%3Aspace%3D'preserve' xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' y%3D'0px'%3E%3Cstyle type%3D'text%2Fcss'%3E%09.st0 %7B fill%3A %23FFFFFF%3B %7D .st1 %7B fill%3A %23CCFFE1%3B %7D .st2 %7B fill%3A none%3B stroke%3A %2301DB48%3B stroke-width%3A 1.25%3B stroke-linecap%3A round%3B stroke-linejoin%3A round%3B stroke-miterlimit%3A 10%3B %7D%3C%2Fstyle%3E %3Cg id%3D'Background_Color'%3E%09%3Cpolygon class%3D'st0' points%3D'11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.6%2C4.1 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Shadow_Color'%3E%09%3Cpolygon class%3D'st1' points%3D'18.3%2C18.4 11.6%2C21.5 4.9%2C18.4 3.1%2C19.6 11.6%2C23.7 20.1%2C19.6 %09'%2F%3E%3C%2Fg%3E %3Cg id%3D'Stroke_Color'%3E%09%3Cpolyline class%3D'st2' points%3D'19.8%2C3.2 11.6%2C0.6 0.6%2C4.1 3.1%2C19.6 11.6%2C23.6 20.1%2C19.6 22.1%2C7.1 %09'%2F%3E %3Cpolyline class%3D'st2' points%3D'5.6%2C10.1 10.1%2C15.6 24.1%2C2.1 %09'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E\")}::ng-deep .growler .content ul{margin-top:5px}\n"] }]
12220
12300
  }], ctorParameters: function () { return [{ type: GrowlerService }]; }, propDecorators: { title: [{
12221
12301
  type: Input
12222
12302
  }], subtitle: [{
@@ -16084,8 +16164,6 @@ class ServiceFormService {
16084
16164
  let configId;
16085
16165
  if (this.selectedConfigId === 'add-new') {
16086
16166
  if (!this.validateConfig()) {
16087
- const growlerData = new GrowlerModel('error', 'Error', `Error Validating Config`, 'The entered configuration is invalid. Please update missing/invalid fields and try again.');
16088
- this.growlerService.show(growlerData);
16089
16167
  return;
16090
16168
  }
16091
16169
  const newConfig = {
@@ -16223,7 +16301,7 @@ class ServiceFormService {
16223
16301
  }
16224
16302
  validateConfig() {
16225
16303
  this.configErrors = {};
16226
- this.configEditor?.validateConfig();
16304
+ this.configEditor?.validateConfig(this.selectedConfigType?.schema, true);
16227
16305
  if (isEmpty(this.newConfigName)) {
16228
16306
  this.configErrors['name'] = true;
16229
16307
  }
@@ -16299,8 +16377,9 @@ class ConfigEditorComponent {
16299
16377
  get schema() {
16300
16378
  return this._schema;
16301
16379
  }
16302
- constructor(schemaSvc) {
16380
+ constructor(schemaSvc, growlerService) {
16303
16381
  this.schemaSvc = schemaSvc;
16382
+ this.growlerService = growlerService;
16304
16383
  this.items = [];
16305
16384
  this.lColorArray = [
16306
16385
  'white',
@@ -16459,31 +16538,87 @@ class ConfigEditorComponent {
16459
16538
  });
16460
16539
  return data;
16461
16540
  }
16462
- validateConfig() {
16541
+ validateConfig(schema, showGrowler = true) {
16542
+ let validationErrors;
16543
+ let valid = true;
16544
+ if (schema) {
16545
+ // Initialize Ajv
16546
+ const ajv = new Ajv({ allErrors: true });
16547
+ addFormats(ajv);
16548
+ ajv.addFormat('idn-hostname', /^.+$/);
16549
+ const validate = ajv.compile(schema);
16550
+ valid = validate(this.configData);
16551
+ validationErrors = validate.errors;
16552
+ }
16463
16553
  this.configErrors = {};
16464
- const configItemsValid = this.validateConfigItems(this.items);
16465
- if (!configItemsValid) {
16554
+ const propertyValidationMap = {};
16555
+ this.validateConfigItems(this.items, undefined, '', validationErrors);
16556
+ this.buildPropertyValidationMap(validationErrors, propertyValidationMap);
16557
+ if (!valid) {
16466
16558
  this.configErrors['configData'] = true;
16559
+ if (showGrowler) {
16560
+ this.displayConfigErrors(propertyValidationMap);
16561
+ }
16467
16562
  }
16468
16563
  this.configErrorsChange.emit(this.configErrors);
16469
16564
  return isEmpty(this.configErrors);
16470
16565
  }
16471
- validateConfigItems(items, parentType = 'object') {
16566
+ buildPropertyValidationMap(validationErrors, propertyValidationMap) {
16567
+ validationErrors?.forEach((error) => {
16568
+ let path = error.instancePath;
16569
+ if (!isEmpty(error?.params?.missingProperty)) {
16570
+ path += '/' + error?.params?.missingProperty;
16571
+ }
16572
+ if (!isEmpty(path)) {
16573
+ propertyValidationMap[path] = `<b>${path}</b>: ${error.message}`;
16574
+ }
16575
+ });
16576
+ }
16577
+ validateConfigItems(items, parentType = 'object', path = '', validationErrors = []) {
16472
16578
  let isValid = true;
16473
16579
  items.forEach((item) => {
16474
16580
  if (item.type === 'object') {
16475
- if (!this.validateConfigItems(item.items, item.type)) {
16581
+ console.log(validationErrors);
16582
+ if (!this.validateConfigItems(item.items, item.type, path + '/' + item.key, validationErrors)) {
16476
16583
  isValid = false;
16477
16584
  }
16478
16585
  }
16479
- else if (item?.component?.instance?.isValid) {
16480
- if (!item?.component?.instance?.isValid()) {
16481
- isValid = false;
16586
+ else if (item?.component?.instance?.setValidationErrors) {
16587
+ item?.component?.instance?.setValidationErrors(path, validationErrors);
16588
+ }
16589
+ else {
16590
+ const hasValidationError = validationErrors?.some((error) => {
16591
+ let pathToMach = error.instancePath;
16592
+ if (!isEmpty(error?.params?.missingProperty)) {
16593
+ pathToMach += '/' + error?.params?.missingProperty;
16594
+ }
16595
+ const matched = pathToMach === (path + '/' + item.key);
16596
+ return matched;
16597
+ });
16598
+ if (item?.component?.instance?.setIsValid) {
16599
+ item?.component?.instance?.setIsValid(!hasValidationError);
16482
16600
  }
16483
16601
  }
16484
16602
  });
16485
16603
  return isValid;
16486
16604
  }
16605
+ displayConfigErrors(propertyValidationMap) {
16606
+ let validationMessage = '';
16607
+ if (!isEmpty(propertyValidationMap)) {
16608
+ const props = keys(propertyValidationMap);
16609
+ props.forEach((key, index) => {
16610
+ validationMessage += `<li>${propertyValidationMap[key]}</li>`;
16611
+ });
16612
+ }
16613
+ if (isEmpty(validationMessage)) {
16614
+ validationMessage = 'The entered configuration is invalid. Please update missing/invalid fields and try again.';
16615
+ }
16616
+ else {
16617
+ validationMessage = `<ul style="margin-top: 5px;">${validationMessage}</ul>`;
16618
+ }
16619
+ const growlerData = new GrowlerModel('error', 'Error', `Error Validating Config`, validationMessage);
16620
+ this.growlerService.show(growlerData);
16621
+ }
16487
16622
  formDataChanged() {
16488
16623
  delay(() => {
16489
16624
  this.getConfigDataFromForm();
@@ -16495,13 +16630,13 @@ class ConfigEditorComponent {
16495
16630
  this.updateFormView(this.items, this.configData);
16496
16631
  });
16497
16632
  }
16498
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, deps: [{ token: SchemaService }], target: i0.ɵɵFactoryTarget.Component }); }
16633
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, deps: [{ token: SchemaService }, { token: GrowlerService }], target: i0.ɵɵFactoryTarget.Component }); }
16499
16634
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfigEditorComponent, selector: "lib-config-editor", inputs: { configErrors: "configErrors", configData: "configData", showJsonView: "showJsonView", schema: "schema" }, outputs: { configErrorsChange: "configErrorsChange", configDataChange: "configDataChange" }, viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: ["dynamicform"], descendants: true, read: ViewContainerRef }, { propertyName: "editor", first: true, predicate: JsonEditorComponent, descendants: true }], ngImport: i0, template: "<div class=\"form-field-extended-fields\" [hidden]=\"showJsonView\" (mouseup)=\"formDataChangedDebounced($event)\" (keyup)=\"formDataChangedDebounced($event)\">\n <ng-container #dynamicform></ng-container>\n</div>\n<lib-json-view *ngIf=\"showJsonView && !hideConfigJSON\" (dataChange)=\"jsonDataChangedDebounced($event)\" [(data)]=\"configData\"></lib-json-view>\n<lib-json-view *ngIf=\"showJsonView && hideConfigJSON\" [(data)]=\"configData\"></lib-json-view>", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
16500
16635
  }
16501
16636
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, decorators: [{
16502
16637
  type: Component,
16503
16638
  args: [{ selector: 'lib-config-editor', template: "<div class=\"form-field-extended-fields\" [hidden]=\"showJsonView\" (mouseup)=\"formDataChangedDebounced($event)\" (keyup)=\"formDataChangedDebounced($event)\">\n <ng-container #dynamicform></ng-container>\n</div>\n<lib-json-view *ngIf=\"showJsonView && !hideConfigJSON\" (dataChange)=\"jsonDataChangedDebounced($event)\" [(data)]=\"configData\"></lib-json-view>\n<lib-json-view *ngIf=\"showJsonView && hideConfigJSON\" [(data)]=\"configData\"></lib-json-view>" }]
16504
- }], ctorParameters: function () { return [{ type: SchemaService }]; }, propDecorators: { configErrors: [{
16639
+ }], ctorParameters: function () { return [{ type: SchemaService }, { type: GrowlerService }]; }, propDecorators: { configErrors: [{
16505
16640
  type: Input
16506
16641
  }], configErrorsChange: [{
16507
16642
  type: Output
@@ -17758,10 +17893,6 @@ class EdgeRouterPolicy {
17758
17893
  See the License for the specific language governing permissions and
17759
17894
  limitations under the License.
17760
17895
  */
17761
- const CSV_COLUMNS$2 = [
17762
- { label: 'Name', path: 'name' },
17763
- { label: 'Created At', path: 'createdAt' }
17764
- ];
17765
17896
  class EdgeRouterPoliciesPageService extends ListPageServiceClass {
17766
17897
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
17767
17898
  super(settings, filterService, csvDownloadService, extService, router);
@@ -18104,17 +18235,6 @@ class EdgeRouterPoliciesPageService extends ListPageServiceClass {
18104
18235
  return namedAttributes;
18105
18236
  });
18106
18237
  }
18107
- downloadAllItems() {
18108
- const paging = cloneDeep(this.paging);
18109
- paging.total = this.totalCount;
18110
- super.getTableData('edge-router-policies', paging, undefined, undefined)
18111
- .then((results) => {
18112
- return this.downloadItems(results?.data);
18113
- });
18114
- }
18115
- downloadItems(selectedItems) {
18116
- this.csvDownloadService.download('edge-router-policies', selectedItems, CSV_COLUMNS$2, false, false, undefined, false);
18117
- }
18118
18238
  openUpdate(item) {
18119
18239
  this.modalType = 'edge-router-policies';
18120
18240
  if (item) {
@@ -18215,7 +18335,7 @@ class EdgeRouterPoliciesPageComponent extends ListPageComponent {
18215
18335
  this.deleteItem(event.item);
18216
18336
  break;
18217
18337
  case 'download-all':
18218
- this.svc.downloadAllItems();
18338
+ this.downloadAllItems();
18219
18339
  break;
18220
18340
  case 'download-selected':
18221
18341
  this.svc.downloadItems(this.selectedItems);
@@ -18276,10 +18396,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
18276
18396
  See the License for the specific language governing permissions and
18277
18397
  limitations under the License.
18278
18398
  */
18279
- const CSV_COLUMNS$1 = [
18280
- { label: 'Name', path: 'name' },
18281
- { label: 'Created At', path: 'createdAt' }
18282
- ];
18283
18399
  class ServicePoliciesPageService extends ListPageServiceClass {
18284
18400
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
18285
18401
  super(settings, filterService, csvDownloadService, extService, router);
@@ -18661,17 +18777,6 @@ class ServicePoliciesPageService extends ListPageServiceClass {
18661
18777
  return namedAttributes;
18662
18778
  });
18663
18779
  }
18664
- downloadAllItems() {
18665
- const paging = cloneDeep(this.paging);
18666
- paging.total = this.totalCount;
18667
- super.getTableData('service-policies', paging, undefined, undefined)
18668
- .then((results) => {
18669
- return this.downloadItems(results?.data);
18670
- });
18671
- }
18672
- downloadItems(selectedItems) {
18673
- this.csvDownloadService.download('service-policies', selectedItems, CSV_COLUMNS$1, false, false, undefined, false);
18674
- }
18675
18780
  openUpdate(item) {
18676
18781
  this.modalType = 'service-policies';
18677
18782
  if (item) {
@@ -18734,7 +18839,6 @@ class ServicePoliciesPageComponent extends ListPageComponent {
18734
18839
  }
18735
18840
  ngOnInit() {
18736
18841
  super.ngOnInit();
18737
- this.getRoleAttributes();
18738
18842
  this.tabs = this.tabNames.getTabs('policies');
18739
18843
  }
18740
18844
  headerActionClicked(action) {
@@ -18773,7 +18877,7 @@ class ServicePoliciesPageComponent extends ListPageComponent {
18773
18877
  this.deleteItem(event.item);
18774
18878
  break;
18775
18879
  case 'download-all':
18776
- this.svc.downloadAllItems();
18880
+ this.downloadAllItems();
18777
18881
  break;
18778
18882
  case 'download-selected':
18779
18883
  this.svc.downloadItems(this.selectedItems);
@@ -19525,10 +19629,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
19525
19629
  See the License for the specific language governing permissions and
19526
19630
  limitations under the License.
19527
19631
  */
19528
- const CSV_COLUMNS = [
19529
- { label: 'Name', path: 'name' },
19530
- { label: 'Created At', path: 'createdAt' }
19531
- ];
19532
19632
  class ServiceEdgeRouterPoliciesPageService extends ListPageServiceClass {
19533
19633
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
19534
19634
  super(settings, filterService, csvDownloadService, extService, router);
@@ -19831,19 +19931,8 @@ class ServiceEdgeRouterPoliciesPageService extends ListPageServiceClass {
19831
19931
  return result;
19832
19932
  });
19833
19933
  }
19834
- downloadAllItems() {
19835
- const paging = cloneDeep(this.paging);
19836
- paging.total = this.totalCount;
19837
- super.getTableData('edge-router-policies', paging, undefined, undefined)
19838
- .then((results) => {
19839
- return this.downloadItems(results?.data);
19840
- });
19841
- }
19842
- downloadItems(selectedItems) {
19843
- this.csvDownloadService.download('edge-router-policies', selectedItems, CSV_COLUMNS, false, false, undefined, false);
19844
- }
19845
19934
  openUpdate(item) {
19846
- this.modalType = 'edge-router-policies';
19935
+ this.modalType = 'service-edge-router-policies';
19847
19936
  if (item) {
19848
19937
  this.selectedEdgeRouterPolicy = item;
19849
19938
  this.selectedEdgeRouterPolicy.badges = [];
@@ -19942,7 +20031,7 @@ class ServiceEdgeRouterPoliciesPageComponent extends ListPageComponent {
19942
20031
  this.deleteItem(event.item);
19943
20032
  break;
19944
20033
  case 'download-all':
19945
- this.svc.downloadAllItems();
20034
+ this.downloadAllItems();
19946
20035
  break;
19947
20036
  case 'download-selected':
19948
20037
  this.svc.downloadItems(this.selectedItems);
@@ -20915,6 +21004,33 @@ class ConfigurationFormComponent extends ProjectableForm {
20915
21004
  break;
20916
21005
  }
20917
21006
  }
21007
+ apiActionRequested(action) {
21008
+ switch (action.id) {
21009
+ case 'cli':
21010
+ this.copyCLICommand();
21011
+ break;
21012
+ case 'curl':
21013
+ this.copyCURLCommand();
21014
+ break;
21015
+ }
21016
+ }
21017
+ copyCLICommand() {
21018
+ const command = `ziti edge ${this.formData.id ? 'update' : 'create'} config ${this.formData.id ? `'${this.formData.id}'` : ''} ${this.formData.id ? '--name' : ''} '${this.formData.name}' --configTypeId '${this.formData.configTypeId}' --data '${JSON.stringify(this.formData.data)}' --tags-json '${JSON.stringify(this.formData.tags)}'`;
21019
+ navigator.clipboard.writeText(command);
21020
+ const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CLI command copied to clipboard`);
21021
+ this.growlerService.show(growlerData);
21022
+ }
21023
+ copyCURLCommand() {
21024
+ const command = `curl '${this.apiCallURL}' \\
21025
+ ${this.formData.id ? '--request PATCH \\' : '\\'}
21026
+ -H 'accept: application/json' \\
21027
+ -H 'content-type: application/json' \\
21028
+ -H 'zt-session: ${this.settings.session.id}' \\
21029
+ --data-raw '${JSON.stringify(this.apiData)}'`;
21030
+ navigator.clipboard.writeText(command);
21031
+ const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CURL command copied to clipboard`);
21032
+ this.growlerService.show(growlerData);
21033
+ }
20918
21034
  clear() {
20919
21035
  this.formData.configTypeId = '';
20920
21036
  this.clearForm();
@@ -20968,7 +21084,9 @@ class ConfigurationFormComponent extends ProjectableForm {
20968
21084
  }
20969
21085
  validate() {
20970
21086
  this.errors = {};
20971
- this.configEditor.validateConfig();
21087
+ if (!this.configEditor.validateConfig(this.selectedSchema, true)) {
21088
+ return false;
21089
+ }
20972
21090
  if (isEmpty(this.formData.name)) {
20973
21091
  this.errors['name'] = true;
20974
21092
  }
@@ -21018,11 +21136,11 @@ class ConfigurationFormComponent extends ProjectableForm {
21018
21136
  this._apiData = cloneDeep(this.apiData);
21019
21137
  }
21020
21138
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationFormComponent, deps: [{ token: ConfigurationService }, { token: SchemaService }, { token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i1$4.Location }], target: i0.ɵɵFactoryTarget.Component }); }
21021
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfigurationFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "configEditor", first: true, predicate: ["configEditor"], descendants: true, read: ConfigEditorComponent }], usesInheritance: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Edit Config' : 'Create Config')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [saveTooltip]=\"saveButtonTooltip\"\n ></lib-form-header>\n <div class=\"config-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Config Name'\" [label]=\"'Required'\">\n <input\n id=\"ConfigName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Name this config\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n (keyup)=\"apiData()\"\n >\n </lib-form-field-container>\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Configuration Data</span>\n <div class=\"form-header-toggle-container\">\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': !svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n FORM\n </span>\n <div class=\"form-header-toggle\" (click)=\"svc.toggleJSONView()\">\n <div\n class=\"form-toggle-switch\"\n [ngClass]=\"{'toggle-left': !svc.configJsonView, 'toggle-right': svc.configJsonView}\"\n >\n <div class=\"form-toggle-indicator\"></div>\n <div class=\"form-toggle-indicator\"></div>\n </div>\n </div>\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n JSON\n </span>\n </div>\n </div>\n <div class=\"form-field-input-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">{{isEditing ? 'Config Type' : 'Select a Config Type'}}</span>\n </div>\n <select\n id=\"ConfigTypes\"\n class=\"config-type-select\"\n [(ngModel)]=\"formData.configTypeId\"\n (change)=\"getSchema()\"\n [ngClass]=\"{disabled: isEditing, error: errors['configTypeId']}\"\n >\n <option value=\"\">Select A Type...</option>\n <option *ngFor=\"let config of options\"\n [value]=\"config.id\">{{config.name}}\n </option>\n </select>\n <lib-config-editor\n [hidden]=\"configTypeEmpty\"\n [schema]=\"selectedSchema\"\n [(configData)]=\"formData.data\"\n [showJsonView]=\"svc.configJsonView\"\n [(configErrors)]=\"errors\"\n (configDataChange)=\"dataChanged($event)\"\n #configEditor\n ></lib-config-editor>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n *ngIf=\"!hideTags\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\" readonly/>\n <div class=\"url-copy icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"_apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".config-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.config-type-select.disabled{opacity:.7;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "titleIcon", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader", "headerActions"], outputs: ["actionRequested"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: FormFieldToggleComponent, selector: "lib-form-field-toggle", inputs: ["label", "orientation", "labelOn", "labelOff", "toggleOn"], outputs: ["toggleOnChange"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }, { kind: "component", type: ConfigEditorComponent, selector: "lib-config-editor", inputs: ["configErrors", "configData", "showJsonView", "schema"], outputs: ["configErrorsChange", "configDataChange"] }] }); }
21139
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ConfigurationFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "configEditor", first: true, predicate: ["configEditor"], descendants: true, read: ConfigEditorComponent }], usesInheritance: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Edit Config' : 'Create Config')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [saveTooltip]=\"saveButtonTooltip\"\n ></lib-form-header>\n <div class=\"config-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Config Name'\" [label]=\"'Required'\">\n <input\n id=\"ConfigName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Name this config\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n (keyup)=\"apiData()\"\n >\n </lib-form-field-container>\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Configuration Data</span>\n <div class=\"form-header-toggle-container\">\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': !svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n FORM\n </span>\n <div class=\"form-header-toggle\" (click)=\"svc.toggleJSONView()\">\n <div\n class=\"form-toggle-switch\"\n [ngClass]=\"{'toggle-left': !svc.configJsonView, 'toggle-right': svc.configJsonView}\"\n >\n <div class=\"form-toggle-indicator\"></div>\n <div class=\"form-toggle-indicator\"></div>\n </div>\n </div>\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n JSON\n </span>\n </div>\n </div>\n <div class=\"form-field-input-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">{{isEditing ? 'Config Type' : 'Select a Config Type'}}</span>\n </div>\n <select\n id=\"ConfigTypes\"\n class=\"config-type-select\"\n [(ngModel)]=\"formData.configTypeId\"\n (change)=\"getSchema()\"\n [ngClass]=\"{disabled: isEditing, error: errors['configTypeId']}\"\n >\n <option value=\"\">Select A Type...</option>\n <option *ngFor=\"let config of options\"\n [value]=\"config.id\">{{config.name}}\n </option>\n </select>\n <lib-config-editor\n [hidden]=\"configTypeEmpty\"\n [schema]=\"selectedSchema\"\n [(configData)]=\"formData.data\"\n [showJsonView]=\"svc.configJsonView\"\n [(configErrors)]=\"errors\"\n (configDataChange)=\"dataChanged($event)\"\n #configEditor\n ></lib-config-editor>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n *ngIf=\"!hideTags\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\" readonly/>\n <div class=\"url-copy icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"_apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".config-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.config-type-select.disabled{opacity:.7;pointer-events:none}.form-group-column.three-fifths{width:calc(60% - 15px);min-width:550px;max-width:700px}.form-group-column.two-fifths{max-width:700px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "titleIcon", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader", "headerActions"], outputs: ["actionRequested"] }, { kind: "component", type: LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: FormFieldToggleComponent, selector: "lib-form-field-toggle", inputs: ["label", "orientation", "labelOn", "labelOff", "toggleOn"], outputs: ["toggleOnChange"] }, { kind: "component", type: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }, { kind: "component", type: ConfigEditorComponent, selector: "lib-config-editor", inputs: ["configErrors", "configData", "showJsonView", "schema"], outputs: ["configErrorsChange", "configDataChange"] }] }); }
21022
21140
  }
21023
21141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationFormComponent, decorators: [{
21024
21142
  type: Component,
21025
- args: [{ selector: 'lib-configuration', template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Edit Config' : 'Create Config')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [saveTooltip]=\"saveButtonTooltip\"\n ></lib-form-header>\n <div class=\"config-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Config Name'\" [label]=\"'Required'\">\n <input\n id=\"ConfigName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Name this config\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n (keyup)=\"apiData()\"\n >\n </lib-form-field-container>\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Configuration Data</span>\n <div class=\"form-header-toggle-container\">\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': !svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n FORM\n </span>\n <div class=\"form-header-toggle\" (click)=\"svc.toggleJSONView()\">\n <div\n class=\"form-toggle-switch\"\n [ngClass]=\"{'toggle-left': !svc.configJsonView, 'toggle-right': svc.configJsonView}\"\n >\n <div class=\"form-toggle-indicator\"></div>\n <div class=\"form-toggle-indicator\"></div>\n </div>\n </div>\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n JSON\n </span>\n </div>\n </div>\n <div class=\"form-field-input-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">{{isEditing ? 'Config Type' : 'Select a Config Type'}}</span>\n </div>\n <select\n id=\"ConfigTypes\"\n class=\"config-type-select\"\n [(ngModel)]=\"formData.configTypeId\"\n (change)=\"getSchema()\"\n [ngClass]=\"{disabled: isEditing, error: errors['configTypeId']}\"\n >\n <option value=\"\">Select A Type...</option>\n <option *ngFor=\"let config of options\"\n [value]=\"config.id\">{{config.name}}\n </option>\n </select>\n <lib-config-editor\n [hidden]=\"configTypeEmpty\"\n [schema]=\"selectedSchema\"\n [(configData)]=\"formData.data\"\n [showJsonView]=\"svc.configJsonView\"\n [(configErrors)]=\"errors\"\n (configDataChange)=\"dataChanged($event)\"\n #configEditor\n ></lib-config-editor>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n *ngIf=\"!hideTags\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\" readonly/>\n <div class=\"url-copy icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"_apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".config-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.config-type-select.disabled{opacity:.7;pointer-events:none}\n"] }]
21143
+ args: [{ selector: 'lib-configuration', template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Edit Config' : 'Create Config')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n [saveTooltip]=\"saveButtonTooltip\"\n ></lib-form-header>\n <div class=\"config-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container [title]=\"'Config Name'\" [label]=\"'Required'\">\n <input\n id=\"ConfigName\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Name this config\"\n [ngClass]=\"{error: errors['name']}\"\n [(ngModel)]=\"formData.name\"\n (keyup)=\"apiData()\"\n >\n </lib-form-field-container>\n <lib-form-field-container [showHeader]=\"false\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">Configuration Data</span>\n <div class=\"form-header-toggle-container\">\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': !svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n FORM\n </span>\n <div class=\"form-header-toggle\" (click)=\"svc.toggleJSONView()\">\n <div\n class=\"form-toggle-switch\"\n [ngClass]=\"{'toggle-left': !svc.configJsonView, 'toggle-right': svc.configJsonView}\"\n >\n <div class=\"form-toggle-indicator\"></div>\n <div class=\"form-toggle-indicator\"></div>\n </div>\n </div>\n <span\n class=\"toggle-option-text\"\n [ngClass]=\"{'toggle-option-selected': svc.configJsonView}\"\n (click)=\"svc.toggleJSONView()\"\n >\n JSON\n </span>\n </div>\n </div>\n <div class=\"form-field-input-group\">\n <div class=\"config-title-row\">\n <span class=\"form-field-title\">{{isEditing ? 'Config Type' : 'Select a Config Type'}}</span>\n </div>\n <select\n id=\"ConfigTypes\"\n class=\"config-type-select\"\n [(ngModel)]=\"formData.configTypeId\"\n (change)=\"getSchema()\"\n [ngClass]=\"{disabled: isEditing, error: errors['configTypeId']}\"\n >\n <option value=\"\">Select A Type...</option>\n <option *ngFor=\"let config of options\"\n [value]=\"config.id\">{{config.name}}\n </option>\n </select>\n <lib-config-editor\n [hidden]=\"configTypeEmpty\"\n [schema]=\"selectedSchema\"\n [(configData)]=\"formData.data\"\n [showJsonView]=\"svc.configJsonView\"\n [(configErrors)]=\"errors\"\n (configDataChange)=\"dataChanged($event)\"\n #configEditor\n ></lib-config-editor>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n *ngIf=\"!hideTags\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [label]=\"''\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\" readonly/>\n <div class=\"url-copy icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"_apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".config-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.config-type-select.disabled{opacity:.7;pointer-events:none}.form-group-column.three-fifths{width:calc(60% - 15px);min-width:550px;max-width:700px}.form-group-column.two-fifths{max-width:700px}\n"] }]
21026
21144
  }], ctorParameters: function () { return [{ type: ConfigurationService }, { type: SchemaService }, { type: GrowlerService }, { type: undefined, decorators: [{
21027
21145
  type: Inject,
21028
21146
  args: [SHAREDZ_EXTENSION]
@@ -21772,13 +21890,20 @@ class AuthPoliciesPageService extends ListPageServiceClass {
21772
21890
  headerComponent: TableColumnDefaultComponent,
21773
21891
  headerComponentParams: this.headerComponentParams,
21774
21892
  cellRenderer: TableCellNameComponent,
21775
- cellRendererParams: { pathRoot: this.basePath, cellNamePreCheck: this.checkDefaultAuthPolicy.bind(this) },
21893
+ cellRendererParams: { pathRoot: this.basePath, cellNamePreCheck: (data) => {
21894
+ this.checkDefaultAuthPolicy(data).then((result) => {
21895
+ if (!result) {
21896
+ return;
21897
+ }
21898
+ this.openEditForm(data?.data?.id);
21899
+ });
21900
+ } },
21776
21901
  onCellClicked: (data) => {
21777
21902
  if (this.hasSelectedText()) {
21778
21903
  return;
21779
21904
  }
21780
21905
  this.checkDefaultAuthPolicy(data?.data).then((result) => {
21781
- if (!result.confirmed) {
21906
+ if (!result) {
21782
21907
  return;
21783
21908
  }
21784
21909
  this.openEditForm(data?.data?.id);
@@ -21987,6 +22112,12 @@ class AuthPoliciesPageComponent extends ListPageComponent {
21987
22112
  this.deleteItem(event.item);
21988
22113
  });
21989
22114
  break;
22115
+ case 'download-all':
22116
+ this.downloadAllItems();
22117
+ break;
22118
+ case 'download-selected':
22119
+ this.svc.downloadItems(this.selectedItems);
22120
+ break;
21990
22121
  default:
21991
22122
  break;
21992
22123
  }
@@ -22801,7 +22932,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
22801
22932
  }] });
22802
22933
 
22803
22934
  const VERSION = {
22804
- "version": "3.6.2"
22935
+ "version": "3.6.3"
22805
22936
  };
22806
22937
 
22807
22938
  /*