@openziti/ziti-console-lib 0.6.3 → 0.6.5

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 (85) hide show
  1. package/assets/styles/global.scss +130 -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 +28 -6
  10. package/esm2022/lib/features/dynamic-widgets/selector/selector-input.component.mjs +102 -39
  11. package/esm2022/lib/features/dynamic-widgets/string/string-input.component.mjs +33 -8
  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/services/schema.service.mjs +2 -2
  34. package/esm2022/lib/services/settings-service.class.mjs +2 -2
  35. package/esm2022/lib/shared/list-page-component.class.mjs +17 -2
  36. package/esm2022/lib/shared/list-page-service.class.mjs +22 -4
  37. package/esm2022/lib/version.mjs +2 -2
  38. package/fesm2022/openziti-ziti-console-lib.mjs +425 -220
  39. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  40. package/lib/features/config-editor/config-editor.component.d.ts +7 -3
  41. package/lib/features/config-editor/config-editor.component.d.ts.map +1 -1
  42. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts +2 -0
  43. package/lib/features/dynamic-widgets/checkbox-list/checkbox-list-input.component.d.ts.map +1 -1
  44. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts +5 -0
  45. package/lib/features/dynamic-widgets/forwarding-config/forwarding-config.component.d.ts.map +1 -1
  46. package/lib/features/dynamic-widgets/number/number-input.component.d.ts +2 -0
  47. package/lib/features/dynamic-widgets/number/number-input.component.d.ts.map +1 -1
  48. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts +1 -0
  49. package/lib/features/dynamic-widgets/port-ranges/port-ranges.component.d.ts.map +1 -1
  50. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts +8 -6
  51. package/lib/features/dynamic-widgets/protocol-address-port/protocol-address-port-input.component.d.ts.map +1 -1
  52. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts +9 -2
  53. package/lib/features/dynamic-widgets/selector/selector-input.component.d.ts.map +1 -1
  54. package/lib/features/dynamic-widgets/string/string-input.component.d.ts +4 -1
  55. package/lib/features/dynamic-widgets/string/string-input.component.d.ts.map +1 -1
  56. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts +2 -0
  57. package/lib/features/dynamic-widgets/text-list/text-list-input.component.d.ts.map +1 -1
  58. package/lib/features/json-view/json-view.component.d.ts +2 -2
  59. package/lib/features/json-view/json-view.component.d.ts.map +1 -1
  60. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +3 -0
  61. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
  62. package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
  63. package/lib/features/qr-code/qr-code.component.d.ts.map +1 -1
  64. package/lib/pages/auth-policies/auth-policies-page.component.d.ts.map +1 -1
  65. package/lib/pages/auth-policies/auth-policies-page.service.d.ts.map +1 -1
  66. package/lib/pages/configurations/configurations-page.component.d.ts.map +1 -1
  67. package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts +0 -2
  68. package/lib/pages/edge-router-policies/edge-router-policies-page.service.d.ts.map +1 -1
  69. package/lib/pages/edge-routers/edge-routers-page.service.d.ts +5 -3
  70. package/lib/pages/edge-routers/edge-routers-page.service.d.ts.map +1 -1
  71. package/lib/pages/identities/identities-page.service.d.ts +4 -2
  72. package/lib/pages/identities/identities-page.service.d.ts.map +1 -1
  73. package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts +0 -2
  74. package/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.d.ts.map +1 -1
  75. package/lib/pages/service-policies/service-policies-page.component.d.ts.map +1 -1
  76. package/lib/pages/service-policies/service-policies-page.service.d.ts +0 -2
  77. package/lib/pages/service-policies/service-policies-page.service.d.ts.map +1 -1
  78. package/lib/pages/services/services-page.service.d.ts +4 -2
  79. package/lib/pages/services/services-page.service.d.ts.map +1 -1
  80. package/lib/services/settings-service.class.d.ts +1 -1
  81. package/lib/shared/list-page-component.class.d.ts +2 -0
  82. package/lib/shared/list-page-component.class.d.ts.map +1 -1
  83. package/lib/shared/list-page-service.class.d.ts +6 -0
  84. package/lib/shared/list-page-service.class.d.ts.map +1 -1
  85. 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';
@@ -421,7 +423,7 @@ class SettingsServiceClass {
421
423
  growler$3.error("Name and URL required");
422
424
  }
423
425
  else {
424
- this.controllerSave(name, url);
426
+ return this.controllerSave(name, url);
425
427
  }
426
428
  }
427
429
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SettingsServiceClass, deps: [{ token: i1$1.HttpBackend }, { token: GrowlerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -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);
@@ -1215,31 +1221,51 @@ class StringInputComponent {
1215
1221
  }, 500)();
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
- 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">
1220
- <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1224
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: StringInputComponent, selector: "lib-string-input", inputs: { fieldName: "fieldName", helpText: "helpText", fieldValue: "fieldValue", placeholder: "placeholder", parentage: "parentage", labelColor: "labelColor", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange" }, ngImport: i0, template: `
1225
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="string-input-container">
1226
+ <div class="label-container">
1227
+ <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1228
+ <div
1229
+ *ngIf="helpText"
1230
+ class="form-field-info infoicon"
1231
+ matTooltip="{{helpText}}"
1232
+ matTooltipPosition="above"
1233
+ matTooltipClass="wide-tooltip"
1234
+ ></div>
1235
+ </div>
1221
1236
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1222
1237
  type="text" class="jsonEntry"
1223
1238
  [ngClass]="{'error': error}"
1224
1239
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1225
1240
  <div *ngIf="error" class="error">{{error}}</div>
1226
1241
  </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"] }] }); }
1242
+ `, isInline: true, styles: [".string-input-container{margin:var(--marginSmall) 0}.string-input-container label{margin-bottom:0;margin-top:0;width:-moz-fit-content;width:fit-content}.string-input-container input.error{border-color:red}.string-input-container div.error{color:red}.label-container{display:flex;gap:5px;margin-bottom:5px;margin-top:10px}\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"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
1228
1243
  }
1229
1244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StringInputComponent, decorators: [{
1230
1245
  type: Component,
1231
1246
  args: [{ selector: 'lib-string-input', template: `
1232
- <div [ngClass]="fieldClass">
1233
- <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1247
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="string-input-container">
1248
+ <div class="label-container">
1249
+ <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1250
+ <div
1251
+ *ngIf="helpText"
1252
+ class="form-field-info infoicon"
1253
+ matTooltip="{{helpText}}"
1254
+ matTooltipPosition="above"
1255
+ matTooltipClass="wide-tooltip"
1256
+ ></div>
1257
+ </div>
1234
1258
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1235
1259
  type="text" class="jsonEntry"
1236
1260
  [ngClass]="{'error': error}"
1237
1261
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1238
1262
  <div *ngIf="error" class="error">{{error}}</div>
1239
1263
  </div>
1240
- `, styles: ["input.error{border-color:red}\n", "div.error{color:red}\n"] }]
1264
+ `, styles: [".string-input-container{margin:var(--marginSmall) 0}.string-input-container label{margin-bottom:0;margin-top:0;width:-moz-fit-content;width:fit-content}.string-input-container input.error{border-color:red}.string-input-container div.error{color:red}.label-container{display:flex;gap:5px;margin-bottom:5px;margin-top:10px}\n"] }]
1241
1265
  }], propDecorators: { fieldName: [{
1242
1266
  type: Input
1267
+ }], helpText: [{
1268
+ type: Input
1243
1269
  }], fieldValue: [{
1244
1270
  type: Input
1245
1271
  }], placeholder: [{
@@ -1267,11 +1293,15 @@ class NumberInputComponent {
1267
1293
  this.error = '';
1268
1294
  this.fieldValueChange = new EventEmitter();
1269
1295
  this.valueChange = new Subject();
1296
+ this._isValid = true;
1270
1297
  }
1271
1298
  set fieldName(name) {
1272
1299
  this._fieldName = name;
1273
1300
  this._idName = name.replace(/\s/g, '').toLowerCase();
1274
1301
  }
1302
+ setIsValid(isValid) {
1303
+ this._isValid = isValid;
1304
+ }
1275
1305
  onKeyup() {
1276
1306
  debounce(() => {
1277
1307
  this.fieldValueChange.emit(this.fieldValue);
@@ -1280,7 +1310,7 @@ class NumberInputComponent {
1280
1310
  }
1281
1311
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1282
1312
  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">
1313
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="{{!_isValid ? 'invalid' : ''}} number-input-container">
1284
1314
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1285
1315
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1286
1316
  type="number" class="jsonEntry"
@@ -1288,14 +1318,12 @@ class NumberInputComponent {
1288
1318
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1289
1319
  <div *ngIf="error" class="error">{{error}}</div>
1290
1320
  </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"] }] }); }
1321
+ `, 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
1322
  }
1293
1323
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NumberInputComponent, decorators: [{
1294
1324
  type: Component,
1295
- args: [{
1296
- selector: 'lib-number-input',
1297
- template: `
1298
- <div [ngClass]="fieldClass">
1325
+ args: [{ selector: 'lib-number-input', template: `
1326
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="{{!_isValid ? 'invalid' : ''}} number-input-container">
1299
1327
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1300
1328
  <input id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1301
1329
  type="number" class="jsonEntry"
@@ -1303,8 +1331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1303
1331
  [placeholder]="placeholder" [(ngModel)]="fieldValue" (paste)="onKeyup()" (keyup)="onKeyup()"/>
1304
1332
  <div *ngIf="error" class="error">{{error}}</div>
1305
1333
  </div>
1306
- `
1307
- }]
1334
+ `, 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
1335
  }], propDecorators: { fieldName: [{
1309
1336
  type: Input
1310
1337
  }], fieldValue: [{
@@ -1453,7 +1480,7 @@ class ObjectComponent {
1453
1480
  <div *ngIf="showAdd" class="save-button button" (click)="addClicked()">Add</div>
1454
1481
  </div>
1455
1482
  </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"] }] }); }
1483
+ `, 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
1484
  }
1458
1485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ObjectComponent, decorators: [{
1459
1486
  type: Component,
@@ -1479,7 +1506,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1479
1506
  <div *ngIf="showAdd" class="save-button button" (click)="addClicked()">Add</div>
1480
1507
  </div>
1481
1508
  </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"] }]
1509
+ `, 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
1510
  }], ctorParameters: function () { return []; }, propDecorators: { wrapperContents: [{
1484
1511
  type: ViewChild,
1485
1512
  args: ["wrappercontents", { read: ViewContainerRef, static: true }]
@@ -1513,7 +1540,7 @@ class SelectorInputComponent {
1513
1540
  this._idName = 'fieldname';
1514
1541
  this._valueList = [];
1515
1542
  this.listIsObject = false;
1516
- this.fieldValue = '';
1543
+ this.hideSelect = false;
1517
1544
  this.placeholder = '';
1518
1545
  this.parentage = [];
1519
1546
  this.labelColor = '#000000';
@@ -1521,73 +1548,135 @@ class SelectorInputComponent {
1521
1548
  this.error = '';
1522
1549
  this.fieldValueChange = new EventEmitter();
1523
1550
  this.valueChange = new Subject();
1551
+ this._isValid = true;
1524
1552
  }
1525
1553
  set fieldName(name) {
1526
1554
  this._fieldName = name;
1527
1555
  this._idName = name.replace(/\s/g, '').toLowerCase();
1528
1556
  }
1557
+ set fieldValue(val) {
1558
+ this._fieldValue = val;
1559
+ }
1560
+ get fieldValue() {
1561
+ return this._fieldValue;
1562
+ }
1529
1563
  set valueList(list) {
1530
1564
  this.listIsObject = list?.length > 0 && typeof list[0] !== 'string';
1531
1565
  this._valueList = list;
1532
- list.forEach(val => {
1533
- if (val.default)
1534
- this.fieldValue = val;
1566
+ let valToSet;
1567
+ list.forEach(item => {
1568
+ if (item.default) {
1569
+ valToSet = item.value;
1570
+ }
1535
1571
  });
1572
+ valToSet = valToSet || this.fieldValue;
1573
+ this.reInitSelect();
1536
1574
  }
1537
1575
  ;
1576
+ setIsValid(isValid) {
1577
+ this._isValid = isValid;
1578
+ }
1538
1579
  selected() {
1539
1580
  debounce(() => {
1581
+ if (this.fieldValue === 'undefined') {
1582
+ this.fieldValue = undefined;
1583
+ }
1540
1584
  this.fieldValueChange.emit(this.fieldValue);
1541
1585
  this.valueChange.next(this.fieldValue);
1542
1586
  }, 500)();
1543
1587
  }
1588
+ reInitSelect() {
1589
+ this.hideSelect = true;
1590
+ defer(() => {
1591
+ this.hideSelect = false;
1592
+ });
1593
+ }
1544
1594
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectorInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1545
- 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">
1547
- <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1548
- <select id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1549
- class="jsonEntry"
1550
- [ngClass]="{'error': error}"
1551
- [(ngModel)]="fieldValue" (change)="selected()">
1552
- <option value="" *ngIf="placeholder">{{placeholder}}</option>
1553
- <ng-container *ngIf="!listIsObject">
1554
- <option *ngFor="let name of _valueList" [value]="name">{{name}}</option>
1555
- </ng-container>
1556
- <ng-container *ngIf="listIsObject">
1557
- <option *ngFor="let data of _valueList" [value]="data.value">{{data.name}}</option>
1558
- </ng-container>
1595
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SelectorInputComponent, selector: "lib-selector-input", inputs: { fieldName: "fieldName", fieldValue: "fieldValue", helpText: "helpText", placeholder: "placeholder", parentage: "parentage", valueList: "valueList", labelColor: "labelColor", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange" }, ngImport: i0, template: `
1596
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="selector-input-container">
1597
+ <div class="label-container">
1598
+ <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1599
+ <div
1600
+ *ngIf="helpText"
1601
+ class="form-field-info infoicon"
1602
+ matTooltip="{{helpText}}"
1603
+ matTooltipPosition="above"
1604
+ matTooltipClass="wide-tooltip"
1605
+ ></div>
1606
+ </div>
1607
+ <select
1608
+ *ngIf="!hideSelect"
1609
+ id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1610
+ class="jsonEntry"
1611
+ [ngClass]="{'error': error}"
1612
+ [(ngModel)]="fieldValue"
1613
+ (change)="selected()"
1614
+ >
1615
+ <option [value]="undefined" *ngIf="placeholder">{{placeholder}}</option>
1616
+ <ng-container *ngIf="!listIsObject">
1617
+ <option *ngFor="let name of _valueList" [value]="name">{{name}}</option>
1618
+ </ng-container>
1619
+ <ng-container *ngIf="listIsObject">
1620
+ <option *ngFor="let data of _valueList" [value]="data.value">{{data.name}}</option>
1621
+ </ng-container>
1622
+ </select>
1623
+ <select
1624
+ *ngIf="hideSelect"
1625
+ class="placeholder-select"
1626
+ [ngClass]="{'error': error}"
1627
+ [(ngModel)]="fieldValue"
1628
+ >
1559
1629
  </select>
1560
1630
  <div *ngIf="error" class="error">{{error}}</div>
1561
1631
  </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"] }] }); }
1632
+ `, isInline: true, styles: [".selector-input-container{margin:var(--marginSmall) 0}.selector-input-container label{margin-bottom:0;margin-top:0;width:-moz-fit-content;width:fit-content}.selector-input-container input.error{border-color:red}.selector-input-container div.error{color:red}.label-container{display:flex;gap:5px;margin-bottom:5px;margin-top:10px}\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"] }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] }); }
1563
1633
  }
1564
1634
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SelectorInputComponent, decorators: [{
1565
1635
  type: Component,
1566
- args: [{
1567
- selector: 'lib-selector-input',
1568
- template: `
1569
- <div [ngClass]="fieldClass">
1570
- <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1571
- <select id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1572
- class="jsonEntry"
1573
- [ngClass]="{'error': error}"
1574
- [(ngModel)]="fieldValue" (change)="selected()">
1575
- <option value="" *ngIf="placeholder">{{placeholder}}</option>
1576
- <ng-container *ngIf="!listIsObject">
1577
- <option *ngFor="let name of _valueList" [value]="name">{{name}}</option>
1578
- </ng-container>
1579
- <ng-container *ngIf="listIsObject">
1580
- <option *ngFor="let data of _valueList" [value]="data.value">{{data.name}}</option>
1581
- </ng-container>
1636
+ args: [{ selector: 'lib-selector-input', template: `
1637
+ <div [ngClass]="fieldClass + (!_isValid ? 'invalid' : '')" class="selector-input-container">
1638
+ <div class="label-container">
1639
+ <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1640
+ <div
1641
+ *ngIf="helpText"
1642
+ class="form-field-info infoicon"
1643
+ matTooltip="{{helpText}}"
1644
+ matTooltipPosition="above"
1645
+ matTooltipClass="wide-tooltip"
1646
+ ></div>
1647
+ </div>
1648
+ <select
1649
+ *ngIf="!hideSelect"
1650
+ id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1651
+ class="jsonEntry"
1652
+ [ngClass]="{'error': error}"
1653
+ [(ngModel)]="fieldValue"
1654
+ (change)="selected()"
1655
+ >
1656
+ <option [value]="undefined" *ngIf="placeholder">{{placeholder}}</option>
1657
+ <ng-container *ngIf="!listIsObject">
1658
+ <option *ngFor="let name of _valueList" [value]="name">{{name}}</option>
1659
+ </ng-container>
1660
+ <ng-container *ngIf="listIsObject">
1661
+ <option *ngFor="let data of _valueList" [value]="data.value">{{data.name}}</option>
1662
+ </ng-container>
1663
+ </select>
1664
+ <select
1665
+ *ngIf="hideSelect"
1666
+ class="placeholder-select"
1667
+ [ngClass]="{'error': error}"
1668
+ [(ngModel)]="fieldValue"
1669
+ >
1582
1670
  </select>
1583
1671
  <div *ngIf="error" class="error">{{error}}</div>
1584
1672
  </div>
1585
- `
1586
- }]
1673
+ `, styles: [".selector-input-container{margin:var(--marginSmall) 0}.selector-input-container label{margin-bottom:0;margin-top:0;width:-moz-fit-content;width:fit-content}.selector-input-container input.error{border-color:red}.selector-input-container div.error{color:red}.label-container{display:flex;gap:5px;margin-bottom:5px;margin-top:10px}\n"] }]
1587
1674
  }], propDecorators: { fieldName: [{
1588
1675
  type: Input
1589
1676
  }], fieldValue: [{
1590
1677
  type: Input
1678
+ }], helpText: [{
1679
+ type: Input
1591
1680
  }], placeholder: [{
1592
1681
  type: Input
1593
1682
  }], parentage: [{
@@ -1632,6 +1721,7 @@ class CheckboxListInputComponent {
1632
1721
  this.error = '';
1633
1722
  this.fieldValueChange = new EventEmitter();
1634
1723
  this.valueChange = new Subject();
1724
+ this._isValid = true;
1635
1725
  }
1636
1726
  set fieldName(name) {
1637
1727
  this._fieldName = name;
@@ -1679,9 +1769,12 @@ class CheckboxListInputComponent {
1679
1769
  this.valueChange.next(this._fieldValue);
1680
1770
  });
1681
1771
  }
1772
+ setIsValid(isValid) {
1773
+ this._isValid = isValid;
1774
+ }
1682
1775
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CheckboxListInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1683
1776
  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">
1777
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1685
1778
  <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1686
1779
  <div *ngFor="let item of items">
1687
1780
  <input type="checkbox"
@@ -1697,7 +1790,7 @@ class CheckboxListInputComponent {
1697
1790
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CheckboxListInputComponent, decorators: [{
1698
1791
  type: Component,
1699
1792
  args: [{ selector: 'lib-checkbox-list-input', template: `
1700
- <div [ngClass]="fieldClass">
1793
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1701
1794
  <label [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1702
1795
  <div *ngFor="let item of items">
1703
1796
  <input type="checkbox"
@@ -1756,6 +1849,7 @@ class TextListInputComponent {
1756
1849
  this.error = '';
1757
1850
  this.fieldValueChange = new EventEmitter();
1758
1851
  this.valueChange = new Subject();
1852
+ this._isValid = true;
1759
1853
  }
1760
1854
  set fieldName(name) {
1761
1855
  this._fieldName = name;
@@ -1785,9 +1879,12 @@ class TextListInputComponent {
1785
1879
  this.valueChange.next(this.fieldValue);
1786
1880
  }, 500)();
1787
1881
  }
1882
+ setIsValid(isValid) {
1883
+ this._isValid = isValid;
1884
+ }
1788
1885
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TextListInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1789
1886
  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">
1887
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1791
1888
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1792
1889
  <p-chips id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1793
1890
  (keyup)="onKeyup($event)"
@@ -1795,7 +1892,7 @@ class TextListInputComponent {
1795
1892
  [allowDuplicate]="false"
1796
1893
  [placeholder]="placeholder"
1797
1894
  [addOnBlur]="true"
1798
- [ngClass]="fieldClass"
1895
+ [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')"
1799
1896
  (onBlur)="emitEvents()"
1800
1897
  separator=",">
1801
1898
  </p-chips>
@@ -1806,7 +1903,7 @@ class TextListInputComponent {
1806
1903
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TextListInputComponent, decorators: [{
1807
1904
  type: Component,
1808
1905
  args: [{ selector: 'lib-text-list-input', template: `
1809
- <div [ngClass]="fieldClass">
1906
+ <div [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')">
1810
1907
  <label for="schema_{{parentage?parentage+'_':''}}{{_idName}}" [ngStyle]="{'color': labelColor}">{{_fieldName}}</label>
1811
1908
  <p-chips id="schema_{{parentage?parentage+'_':''}}{{_idName}}"
1812
1909
  (keyup)="onKeyup($event)"
@@ -1814,7 +1911,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
1814
1911
  [allowDuplicate]="false"
1815
1912
  [placeholder]="placeholder"
1816
1913
  [addOnBlur]="true"
1817
- [ngClass]="fieldClass"
1914
+ [ngClass]="fieldClass + (!_isValid ? ' invalid' : '')"
1818
1915
  (onBlur)="emitEvents()"
1819
1916
  separator=",">
1820
1917
  </p-chips>
@@ -1883,6 +1980,12 @@ class ProtocolAddressPortInputComponent {
1883
1980
  this.portFieldName = 'Port';
1884
1981
  this.checkAddressDebounced = debounce(this.checkAddress, 100, { maxWait: 100, leading: true });
1885
1982
  this.errors = {};
1983
+ this.props = [
1984
+ { key: 'protocol', value: undefined },
1985
+ { key: 'address', value: undefined },
1986
+ { key: 'hostname', value: undefined },
1987
+ { key: 'port', value: undefined }
1988
+ ];
1886
1989
  this._addressChanged = false;
1887
1990
  }
1888
1991
  ngOnInit() {
@@ -1915,13 +2018,29 @@ class ProtocolAddressPortInputComponent {
1915
2018
  const address = isEmpty(this.address) ? undefined : this.address;
1916
2019
  const hostname = isEmpty(this.hostname) ? undefined : this.hostname;
1917
2020
  const port = !isNumber(this.port) ? undefined : this.port;
1918
- const props = [
2021
+ this.props = [
1919
2022
  { key: 'protocol', value: protocol },
1920
- { key: 'address', value: address },
1921
- { key: 'hostname', value: hostname },
1922
2023
  { key: 'port', value: port }
1923
2024
  ];
1924
- return props;
2025
+ if (this.showAddress) {
2026
+ this.props.push({ key: 'address', value: address });
2027
+ }
2028
+ if (this.showHostName) {
2029
+ this.props.push({ key: 'hostname', value: hostname });
2030
+ }
2031
+ return this.props;
2032
+ }
2033
+ setValidationErrors(propertyPath = '', validationErrors) {
2034
+ this.props.forEach((prop) => {
2035
+ const hasValidationError = validationErrors?.some((error) => {
2036
+ let pathToMach = error.instancePath;
2037
+ if (!isEmpty(error?.params?.missingProperty)) {
2038
+ pathToMach += '/' + error?.params?.missingProperty;
2039
+ }
2040
+ return pathToMach === propertyPath + '/' + prop.key;
2041
+ });
2042
+ this.errors[prop.key] = hasValidationError;
2043
+ });
1925
2044
  }
1926
2045
  isValid() {
1927
2046
  this.errors = {};
@@ -1957,7 +2076,7 @@ class ProtocolAddressPortInputComponent {
1957
2076
  this.hostname = data.hostname;
1958
2077
  }
1959
2078
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProtocolAddressPortInputComponent, deps: [{ token: ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
1960
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProtocolAddressPortInputComponent, selector: "lib-protocol-address-port-input", inputs: { protocolList: "protocolList", showProtocol: "showProtocol", showAddress: "showAddress", showHostName: "showHostName", showPort: "showPort", disableProtocol: "disableProtocol", disableAddress: "disableAddress", disableHostName: "disableHostName", disablePort: "disablePort", protocol: "protocol", address: "address", hostname: "hostname", port: "port", parentage: "parentage", labelColor: "labelColor", labelPrefix: "labelPrefix", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange", portChange: "portChange", addressChange: "addressChange", hostnameChange: "hostnameChange", protocolChange: "protocolChange" }, ngImport: i0, template: "<div class=\"grid {{className}}\">\n <div *ngIf=\"showProtocol\" [ngClass]=\"{disabled: disableProtocol, invalid: errors['protocol']}\">\n <lib-selector-input [fieldName]=\"protocolFieldName\"\n [(fieldValue)]=\"protocol\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"undefined\"\n [valueList]=\"['tcp', 'udp']\"\n (fieldValueChange)=\"update()\"\n ></lib-selector-input>\n </div>\n <div *ngIf=\"showAddress\" [ngClass]=\"{disabled: disableAddress, invalid: errors['address']}\">\n <lib-string-input [fieldName]=\"addressFieldName\"\n [(fieldValue)]=\"address\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"'host.name'\"\n (fieldValueChange)=\"update()\"\n ></lib-string-input>\n </div>\n <div *ngIf=\"showHostName\" [ngClass]=\"{disabled: disableHostName, invalid: errors['hostname']}\">\n <lib-string-input [fieldName]=\"hostnameFieldName\"\n [(fieldValue)]=\"hostname\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"'host.name'\"\n (fieldValueChange)=\"update()\"\n ></lib-string-input>\n </div>\n <div *ngIf=\"showPort\" [ngClass]=\"{disabled: disablePort, invalid: errors['port']}\">\n <lib-number-input [fieldName]=\"portFieldName\"\n [(fieldValue)]=\"port\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"'0'\"\n (fieldValueChange)=\"update()\"\n ></lib-number-input>\n </div>\n</div>\n", styles: [".grid{display:grid;grid-template-columns:auto;grid-gap:10px}.grid.addressFull{grid-template-columns:75px auto 75px}.grid.addressFull .disabled{opacity:.5;pointer-events:none}.grid.address-only{grid-template-columns:auto}.host-name-port{grid-template-columns:auto 75px}\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: StringInputComponent, selector: "lib-string-input", inputs: ["fieldName", "fieldValue", "placeholder", "parentage", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }, { kind: "component", type: NumberInputComponent, selector: "lib-number-input", inputs: ["fieldName", "fieldValue", "placeholder", "parentage", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }, { kind: "component", type: SelectorInputComponent, selector: "lib-selector-input", inputs: ["fieldName", "fieldValue", "placeholder", "parentage", "valueList", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }] }); }
2079
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProtocolAddressPortInputComponent, selector: "lib-protocol-address-port-input", inputs: { protocolList: "protocolList", showProtocol: "showProtocol", showAddress: "showAddress", showHostName: "showHostName", showPort: "showPort", disableProtocol: "disableProtocol", disableAddress: "disableAddress", disableHostName: "disableHostName", disablePort: "disablePort", protocol: "protocol", address: "address", hostname: "hostname", port: "port", parentage: "parentage", labelColor: "labelColor", labelPrefix: "labelPrefix", fieldClass: "fieldClass", error: "error" }, outputs: { fieldValueChange: "fieldValueChange", portChange: "portChange", addressChange: "addressChange", hostnameChange: "hostnameChange", protocolChange: "protocolChange" }, ngImport: i0, template: "<div class=\"grid {{className}}\">\n <div *ngIf=\"showProtocol\" [ngClass]=\"{disabled: disableProtocol, invalid: errors['protocol']}\">\n <lib-selector-input [fieldName]=\"protocolFieldName\"\n [(fieldValue)]=\"protocol\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"undefined\"\n [valueList]=\"['tcp', 'udp']\"\n (fieldValueChange)=\"update()\"\n ></lib-selector-input>\n </div>\n <div *ngIf=\"showAddress\" [ngClass]=\"{disabled: disableAddress, invalid: errors['address']}\">\n <lib-string-input [fieldName]=\"addressFieldName\"\n [(fieldValue)]=\"address\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"'host.name'\"\n (fieldValueChange)=\"update()\"\n ></lib-string-input>\n </div>\n <div *ngIf=\"showHostName\" [ngClass]=\"{disabled: disableHostName, invalid: errors['hostname']}\">\n <lib-string-input [fieldName]=\"hostnameFieldName\"\n [(fieldValue)]=\"hostname\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"'host.name'\"\n (fieldValueChange)=\"update()\"\n ></lib-string-input>\n </div>\n <div *ngIf=\"showPort\" [ngClass]=\"{disabled: disablePort, invalid: errors['port']}\">\n <lib-number-input [fieldName]=\"portFieldName\"\n [(fieldValue)]=\"port\"\n [labelColor]=\"labelColor\"\n [placeholder]=\"'0'\"\n (fieldValueChange)=\"update()\"\n ></lib-number-input>\n </div>\n</div>\n", styles: [".grid{display:grid;grid-template-columns:auto;grid-gap:10px}.grid.addressFull{grid-template-columns:75px auto 75px}.grid.addressFull .disabled{opacity:.5;pointer-events:none}.grid.address-only{grid-template-columns:auto}.host-name-port{grid-template-columns:auto 75px}\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: StringInputComponent, selector: "lib-string-input", inputs: ["fieldName", "helpText", "fieldValue", "placeholder", "parentage", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }, { kind: "component", type: NumberInputComponent, selector: "lib-number-input", inputs: ["fieldName", "fieldValue", "placeholder", "parentage", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }, { kind: "component", type: SelectorInputComponent, selector: "lib-selector-input", inputs: ["fieldName", "fieldValue", "helpText", "placeholder", "parentage", "valueList", "labelColor", "fieldClass", "error"], outputs: ["fieldValueChange"] }] }); }
1961
2080
  }
1962
2081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProtocolAddressPortInputComponent, decorators: [{
1963
2082
  type: Component,
@@ -2569,6 +2688,11 @@ let ListPageServiceClass = class ListPageServiceClass {
2569
2688
  this.csvDownloadService = csvDownloadService;
2570
2689
  this.extensionService = extensionService;
2571
2690
  this.router = router;
2691
+ this.CSV_COLUMNS = [
2692
+ { label: 'Name', path: 'name' },
2693
+ { label: 'ID', path: 'id' },
2694
+ { label: 'Created At', path: 'createdAt' }
2695
+ ];
2572
2696
  this.basePath = '';
2573
2697
  this.headerComponentParams = {
2574
2698
  filterType: 'TEXTINPUT',
@@ -2668,13 +2792,26 @@ let ListPageServiceClass = class ListPageServiceClass {
2668
2792
  row.actionList = [...row.actionList, ...keys];
2669
2793
  }
2670
2794
  }
2795
+ downloadItems(selectedItems) {
2796
+ this.csvDownloadService.download(this.resourceType, selectedItems, this.CSV_COLUMNS, false, false, undefined, false);
2797
+ }
2798
+ downloadAllItems() {
2799
+ const paging = cloneDeep(this.DEFAULT_PAGING);
2800
+ paging.total = -1;
2801
+ return this.getTableData(this.resourceType, paging, undefined, undefined)
2802
+ .then((results) => {
2803
+ return this.downloadItems(results?.data);
2804
+ });
2805
+ }
2671
2806
  getTableData(resourceType, paging, filters, sort) {
2672
- paging = { ...this.DEFAULT_PAGING };
2807
+ if (!paging) {
2808
+ paging = { ...this.DEFAULT_PAGING };
2809
+ }
2673
2810
  if (sort) {
2674
2811
  paging.sort = sort.sortBy;
2675
2812
  paging.order = sort.ordering;
2676
2813
  }
2677
- for (let idx = 0; idx < filters.length; idx++) {
2814
+ for (let idx = 0; idx < filters?.length; idx++) {
2678
2815
  paging.noSearch = false;
2679
2816
  paging.searchOn = filters[idx].columnId;
2680
2817
  paging.filter = filters[idx].value;
@@ -2739,6 +2876,7 @@ class ListPageComponent {
2739
2876
  this.modalOpen = false;
2740
2877
  this.gridObj = {};
2741
2878
  this.subscription = new Subscription();
2879
+ this.growlerSvc = inject(GrowlerService);
2742
2880
  }
2743
2881
  ngOnInit() {
2744
2882
  this.filterService.currentPage = 1;
@@ -2810,6 +2948,18 @@ class ListPageComponent {
2810
2948
  this.isLoading = false;
2811
2949
  });
2812
2950
  }
2951
+ downloadAllItems() {
2952
+ this.isLoading = true;
2953
+ this.svc.downloadAllItems().then(() => {
2954
+ const growlerData = new GrowlerModel('success', 'Success', `Download Finished`, `The requested items have been downloaded`);
2955
+ this.growlerSvc.show(growlerData);
2956
+ }).catch(() => {
2957
+ const growlerData = new GrowlerModel('error', 'Error', `Download Failed`, `Failed to retrieve items for download`);
2958
+ this.growlerSvc.show(growlerData);
2959
+ }).finally(() => {
2960
+ this.isLoading = false;
2961
+ });
2962
+ }
2813
2963
  openBulkDelete(selectedItems, entityTypeLabel = 'item(s)') {
2814
2964
  const selectedIds = selectedItems.map((row) => {
2815
2965
  return row.id;
@@ -3338,6 +3488,9 @@ class PortRangesComponent {
3338
3488
  });
3339
3489
  this.invalid = invalid;
3340
3490
  }
3491
+ setIsValid(isValid) {
3492
+ this.invalid = !isValid;
3493
+ }
3341
3494
  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
3495
  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
3496
  }
@@ -3435,6 +3588,14 @@ class ForwardingConfigComponent {
3435
3588
  this.allowedPortRangesChange = new EventEmitter();
3436
3589
  this.allowedProtocolsChange = new EventEmitter();
3437
3590
  this.errors = {};
3591
+ this.props = [
3592
+ { key: 'allowedAddresses', value: undefined },
3593
+ { key: 'allowedPortRanges', value: undefined },
3594
+ { key: 'forwardPort', value: undefined },
3595
+ { key: 'forwardProtocol', value: undefined },
3596
+ { key: 'forwardAddress', value: undefined },
3597
+ { key: 'allowedProtocols', value: undefined },
3598
+ ];
3438
3599
  }
3439
3600
  forwardProtocolToggled(event) {
3440
3601
  if (!this.forwardProtocol) {
@@ -3508,6 +3669,19 @@ class ForwardingConfigComponent {
3508
3669
  }
3509
3670
  return isEmpty(this.errors) && papIsValid;
3510
3671
  }
3672
+ setValidationErrors(propertyPath = '', validationErrors) {
3673
+ this.props.forEach((prop) => {
3674
+ const hasValidationError = validationErrors?.some((error) => {
3675
+ let pathToMach = error.instancePath;
3676
+ if (!isEmpty(error?.params?.missingProperty)) {
3677
+ pathToMach += '/' + error?.params?.missingProperty;
3678
+ }
3679
+ return pathToMach === propertyPath + '/' + prop.key;
3680
+ });
3681
+ this.errors[prop.key] = hasValidationError;
3682
+ });
3683
+ this.papComponent.setValidationErrors(propertyPath, validationErrors);
3684
+ }
3511
3685
  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
3686
  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
3687
  }
@@ -3991,9 +4165,9 @@ class SchemaService {
3991
4165
  const val = list?.length > 0 ? list[0] : '';
3992
4166
  let componentRef = view.createComponent(SelectorInputComponent);
3993
4167
  componentRef.setInput('fieldName', this.getLabel(key));
4168
+ componentRef.setInput('placeholder', `select ${key}`);
3994
4169
  if (parentage && !_.isEmpty(parentage))
3995
4170
  componentRef.setInput('parentage', parentage);
3996
- componentRef.setInput('fieldValue', val);
3997
4171
  componentRef.setInput('valueList', list);
3998
4172
  componentRef.setInput('labelColor', this.lColorArray[nestLevel]);
3999
4173
  return componentRef;
@@ -5304,23 +5478,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5304
5478
  See the License for the specific language governing permissions and
5305
5479
  limitations under the License.
5306
5480
  */
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
5481
  class IdentitiesPageService extends ListPageServiceClass {
5325
5482
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
5326
5483
  super(settings, filterService, csvDownloadService, extService, router);
@@ -5331,6 +5488,23 @@ class IdentitiesPageService extends ListPageServiceClass {
5331
5488
  this.router = router;
5332
5489
  this.paging = this.DEFAULT_PAGING;
5333
5490
  this.modalType = 'identities';
5491
+ this.CSV_COLUMNS = [
5492
+ { label: 'Name', path: 'name' },
5493
+ { label: 'Roles', path: 'roleAttributes' },
5494
+ { label: 'Online', path: 'hasApiSession' },
5495
+ { label: 'Edge Router Connected', path: 'hasEdgeRouterConnection' },
5496
+ { label: 'OS', path: 'envInfo.os' },
5497
+ { label: 'OS Version', path: 'envInfo.osVersion' },
5498
+ { label: 'SDK', path: 'sdkInfo.version' },
5499
+ { label: 'App Version', path: 'sdkInfo.appVersion' },
5500
+ { label: 'Type', path: 'typeId' },
5501
+ { label: 'Is Admin', path: 'isAdmin' },
5502
+ { label: 'Auth Policy', path: 'authPolicy.name' },
5503
+ { label: 'Auth Policy ID', path: 'authPolicy.id' },
5504
+ { label: 'MFA Enabled', path: 'isMfaEnabled' },
5505
+ { label: 'Created At', path: 'createdAt' },
5506
+ { label: 'ID', path: 'id' },
5507
+ ];
5334
5508
  this.selectedIdentity = new Identity$1();
5335
5509
  this.columnFilters = {
5336
5510
  name: '',
@@ -5696,14 +5870,6 @@ class IdentitiesPageService extends ListPageServiceClass {
5696
5870
  }
5697
5871
  return expiresAt;
5698
5872
  }
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
5873
  resetEnrollment(identity, date) {
5708
5874
  let id = identity?.authenticators?.cert?.id;
5709
5875
  if (!id) {
@@ -5725,9 +5891,6 @@ class IdentitiesPageService extends ListPageServiceClass {
5725
5891
  this.growlerService.show(growlerData);
5726
5892
  });
5727
5893
  }
5728
- downloadItems(selectedItems) {
5729
- this.csvDownloadService.download('identities', selectedItems, CSV_COLUMNS$5, false, false, undefined, false);
5730
- }
5731
5894
  openUpdate(itemId) {
5732
5895
  this.modalType = 'identity';
5733
5896
  this.sideModalOpen = true;
@@ -5889,24 +6052,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
5889
6052
  args: [EDGE_ROUTER_EXTENSION_SERVICE]
5890
6053
  }] }]; } });
5891
6054
 
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
6055
  class EdgeRoutersPageService extends ListPageServiceClass {
5911
6056
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
5912
6057
  super(settings, filterService, csvDownloadService, extService, router);
@@ -5918,6 +6063,24 @@ class EdgeRoutersPageService extends ListPageServiceClass {
5918
6063
  this.router = router;
5919
6064
  this.paging = this.DEFAULT_PAGING;
5920
6065
  this.modalType = 'edge-router';
6066
+ this.CSV_COLUMNS = [
6067
+ { label: 'Name', path: 'name' },
6068
+ { label: 'Attributes', path: 'roleAttributes' },
6069
+ { label: 'Verified', path: 'isVerified' },
6070
+ { label: 'Online', path: 'isOnline' },
6071
+ { label: 'Created', path: 'createdAt' },
6072
+ { label: 'Token', path: 'enrollmentToken' },
6073
+ { label: 'No Traversal', path: 'noTraversal' },
6074
+ { label: 'Host Name', path: 'hostname' },
6075
+ { label: 'Disabled', path: 'disabled' },
6076
+ { label: 'Tunneler Enabled', path: 'isTunnelerEnabled' },
6077
+ { label: 'OS', path: 'versionInfo.os' },
6078
+ { label: 'Architecture', path: 'versionInfo.arch' },
6079
+ { label: 'Version', path: 'versionInfo.version' },
6080
+ { label: 'Revision', path: 'versionInfo.revision' },
6081
+ { label: 'Fingerprint', path: 'fingerprint' },
6082
+ { label: 'ID', path: 'id' },
6083
+ ];
5921
6084
  this.selectedEdgeRouter = new EdgeRouter();
5922
6085
  this.columnFilters = {
5923
6086
  name: '',
@@ -6107,8 +6270,9 @@ class EdgeRoutersPageService extends ListPageServiceClass {
6107
6270
  }
6108
6271
  return tableColumns;
6109
6272
  }
6110
- getData(filters, sort) {
6273
+ getData(filters, sort, page) {
6111
6274
  // we can customize filters or sorting here before moving on...
6275
+ this.paging.page = page || this.paging.page;
6112
6276
  return super.getTableData('edge-routers', this.paging, filters, sort)
6113
6277
  .then((results) => {
6114
6278
  return this.processData(results);
@@ -6149,17 +6313,6 @@ class EdgeRoutersPageService extends ListPageServiceClass {
6149
6313
  element.click();
6150
6314
  document.body.removeChild(element);
6151
6315
  }
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
6316
  reenroll(router) {
6164
6317
  const data = {
6165
6318
  appendId: 'ReenrollRouter',
@@ -6312,6 +6465,9 @@ class QrCodeComponent {
6312
6465
  });
6313
6466
  }
6314
6467
  expandQRCode() {
6468
+ if (!this.canExpand) {
6469
+ return;
6470
+ }
6315
6471
  const data = {
6316
6472
  jwt: this.jwt,
6317
6473
  expiration: this.expiration,
@@ -7952,6 +8108,12 @@ class ConfigurationsPageComponent extends ListPageComponent {
7952
8108
  case 'delete':
7953
8109
  this.deleteItem(event.item);
7954
8110
  break;
8111
+ case 'download-all':
8112
+ this.downloadAllItems();
8113
+ break;
8114
+ case 'download-selected':
8115
+ this.svc.downloadItems(this.selectedItems);
8116
+ break;
7955
8117
  default:
7956
8118
  break;
7957
8119
  }
@@ -8648,7 +8810,7 @@ class JsonViewComponent {
8648
8810
  text: undefined,
8649
8811
  json: this.data || {}
8650
8812
  };
8651
- this.editor = new JSONEditor({
8813
+ this.editor = createJSONEditor({
8652
8814
  target: this.editorDiv.nativeElement,
8653
8815
  props: {
8654
8816
  validator: this.validator,
@@ -10471,7 +10633,7 @@ class IdentitiesPageComponent extends ListPageComponent {
10471
10633
  this.showQRCode(event.item);
10472
10634
  break;
10473
10635
  case 'download-all':
10474
- this.svc.downloadAllItems();
10636
+ this.downloadAllItems();
10475
10637
  break;
10476
10638
  case 'download-selected':
10477
10639
  this.svc.downloadItems(this.selectedItems);
@@ -10648,7 +10810,7 @@ class EdgeRoutersPageComponent extends ListPageComponent {
10648
10810
  this.downloadJWT(event.item);
10649
10811
  break;
10650
10812
  case 'download-all':
10651
- this.svc.downloadAllItems();
10813
+ this.downloadAllItems();
10652
10814
  break;
10653
10815
  case 'download-selected':
10654
10816
  this.svc.downloadItems(this.selectedItems);
@@ -10949,10 +11111,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
10949
11111
  See the License for the specific language governing permissions and
10950
11112
  limitations under the License.
10951
11113
  */
10952
- const CSV_COLUMNS$3 = [
10953
- { label: 'Name', path: 'name' },
10954
- { label: 'Created At', path: 'createdAt' }
10955
- ];
10956
11114
  class ServicesPageService extends ListPageServiceClass {
10957
11115
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router, servicePolicyService) {
10958
11116
  super(settings, filterService, csvDownloadService, extService, router);
@@ -10965,6 +11123,13 @@ class ServicesPageService extends ListPageServiceClass {
10965
11123
  this.servicePolicyService = servicePolicyService;
10966
11124
  this.paging = this.DEFAULT_PAGING;
10967
11125
  this.modalType = 'service';
11126
+ this.CSV_COLUMNS = [
11127
+ { label: 'Name', path: 'name' },
11128
+ { label: 'ID', path: 'id' },
11129
+ { label: 'Encryption Required', path: 'encryptionRequired' },
11130
+ { label: 'Terminator Strategy', path: 'terminatorStrategy' },
11131
+ { label: 'Created At', path: 'createdAt' },
11132
+ ];
10968
11133
  this.serviceType = '';
10969
11134
  this.selectedService = new Service$1();
10970
11135
  this.columnFilters = {
@@ -11094,17 +11259,6 @@ class ServicesPageService extends ListPageServiceClass {
11094
11259
  getIdentityRoleAttributes() {
11095
11260
  return this.zitiService.get('identity-role-attributes', {}, []);
11096
11261
  }
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
11262
  openSelection() {
11109
11263
  this.router.navigateByUrl('/services/select');
11110
11264
  }
@@ -11565,7 +11719,7 @@ class ServicesPageComponent extends ListPageComponent {
11565
11719
  this.deleteItem(event.item);
11566
11720
  break;
11567
11721
  case 'download-all':
11568
- this.svc.downloadAllItems();
11722
+ this.downloadAllItems();
11569
11723
  break;
11570
11724
  case 'download-selected':
11571
11725
  this.svc.downloadItems(this.selectedItems);
@@ -12197,7 +12351,7 @@ class GrowlerComponent {
12197
12351
  this.show = true;
12198
12352
  setTimeout(() => {
12199
12353
  this.show = false;
12200
- }, 5000);
12354
+ }, 7000);
12201
12355
  }
12202
12356
  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
12357
  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 +12360,7 @@ class GrowlerComponent {
12206
12360
  <div class="subtitle">{{ subtitle }}</div>
12207
12361
  <div [innerHTML]="content" class="content"></div>
12208
12362
  <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"] }] }); }
12363
+ </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
12364
  }
12211
12365
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GrowlerComponent, decorators: [{
12212
12366
  type: Component,
@@ -12216,7 +12370,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
12216
12370
  <div class="subtitle">{{ subtitle }}</div>
12217
12371
  <div [innerHTML]="content" class="content"></div>
12218
12372
  <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"] }]
12373
+ </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
12374
  }], ctorParameters: function () { return [{ type: GrowlerService }]; }, propDecorators: { title: [{
12221
12375
  type: Input
12222
12376
  }], subtitle: [{
@@ -16084,8 +16238,6 @@ class ServiceFormService {
16084
16238
  let configId;
16085
16239
  if (this.selectedConfigId === 'add-new') {
16086
16240
  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
16241
  return;
16090
16242
  }
16091
16243
  const newConfig = {
@@ -16223,7 +16375,7 @@ class ServiceFormService {
16223
16375
  }
16224
16376
  validateConfig() {
16225
16377
  this.configErrors = {};
16226
- this.configEditor?.validateConfig();
16378
+ this.configEditor?.validateConfig(this.selectedConfigType?.schema, true);
16227
16379
  if (isEmpty(this.newConfigName)) {
16228
16380
  this.configErrors['name'] = true;
16229
16381
  }
@@ -16299,8 +16451,9 @@ class ConfigEditorComponent {
16299
16451
  get schema() {
16300
16452
  return this._schema;
16301
16453
  }
16302
- constructor(schemaSvc) {
16454
+ constructor(schemaSvc, growlerService) {
16303
16455
  this.schemaSvc = schemaSvc;
16456
+ this.growlerService = growlerService;
16304
16457
  this.items = [];
16305
16458
  this.lColorArray = [
16306
16459
  'white',
@@ -16459,31 +16612,87 @@ class ConfigEditorComponent {
16459
16612
  });
16460
16613
  return data;
16461
16614
  }
16462
- validateConfig() {
16615
+ validateConfig(schema, showGrowler = true) {
16616
+ let validationErrors;
16617
+ let valid = true;
16618
+ if (schema) {
16619
+ // Initialize Ajv
16620
+ const ajv = new Ajv({ allErrors: true });
16621
+ addFormats(ajv);
16622
+ ajv.addFormat('idn-hostname', /^.+$/);
16623
+ const validate = ajv.compile(schema);
16624
+ valid = validate(this.configData);
16625
+ validationErrors = validate.errors;
16626
+ }
16463
16627
  this.configErrors = {};
16464
- const configItemsValid = this.validateConfigItems(this.items);
16465
- if (!configItemsValid) {
16628
+ const propertyValidationMap = {};
16629
+ this.validateConfigItems(this.items, undefined, '', validationErrors);
16630
+ this.buildPropertyValidationMap(validationErrors, propertyValidationMap);
16631
+ if (!valid) {
16466
16632
  this.configErrors['configData'] = true;
16633
+ if (showGrowler) {
16634
+ this.displayConfigErrors(propertyValidationMap);
16635
+ }
16467
16636
  }
16468
16637
  this.configErrorsChange.emit(this.configErrors);
16469
16638
  return isEmpty(this.configErrors);
16470
16639
  }
16471
- validateConfigItems(items, parentType = 'object') {
16640
+ buildPropertyValidationMap(validationErrors, propertyValidationMap) {
16641
+ validationErrors?.forEach((error) => {
16642
+ let path = error.instancePath;
16643
+ if (!isEmpty(error?.params?.missingProperty)) {
16644
+ path += '/' + error?.params?.missingProperty;
16645
+ }
16646
+ if (!isEmpty(path)) {
16647
+ propertyValidationMap[path] = `<b>${path}</b>: ${error.message}`;
16648
+ }
16649
+ });
16650
+ }
16651
+ validateConfigItems(items, parentType = 'object', path = '', validationErrors = []) {
16472
16652
  let isValid = true;
16473
16653
  items.forEach((item) => {
16474
16654
  if (item.type === 'object') {
16475
- if (!this.validateConfigItems(item.items, item.type)) {
16655
+ console.log(validationErrors);
16656
+ if (!this.validateConfigItems(item.items, item.type, path + '/' + item.key, validationErrors)) {
16476
16657
  isValid = false;
16477
16658
  }
16478
16659
  }
16479
- else if (item?.component?.instance?.isValid) {
16480
- if (!item?.component?.instance?.isValid()) {
16481
- isValid = false;
16660
+ else if (item?.component?.instance?.setValidationErrors) {
16661
+ item?.component?.instance?.setValidationErrors(path, validationErrors);
16662
+ }
16663
+ else {
16664
+ const hasValidationError = validationErrors?.some((error) => {
16665
+ let pathToMach = error.instancePath;
16666
+ if (!isEmpty(error?.params?.missingProperty)) {
16667
+ pathToMach += '/' + error?.params?.missingProperty;
16668
+ }
16669
+ const matched = pathToMach === (path + '/' + item.key);
16670
+ return matched;
16671
+ });
16672
+ if (item?.component?.instance?.setIsValid) {
16673
+ item?.component?.instance?.setIsValid(!hasValidationError);
16482
16674
  }
16483
16675
  }
16484
16676
  });
16485
16677
  return isValid;
16486
16678
  }
16679
+ displayConfigErrors(propertyValidationMap) {
16680
+ let validationMessage = '';
16681
+ if (!isEmpty(propertyValidationMap)) {
16682
+ const props = keys(propertyValidationMap);
16683
+ props.forEach((key, index) => {
16684
+ validationMessage += `<li>${propertyValidationMap[key]}</li>`;
16685
+ });
16686
+ }
16687
+ if (isEmpty(validationMessage)) {
16688
+ validationMessage = 'The entered configuration is invalid. Please update missing/invalid fields and try again.';
16689
+ }
16690
+ else {
16691
+ validationMessage = `<ul style="margin-top: 5px;">${validationMessage}</ul>`;
16692
+ }
16693
+ const growlerData = new GrowlerModel('error', 'Error', `Error Validating Config`, validationMessage);
16694
+ this.growlerService.show(growlerData);
16695
+ }
16487
16696
  formDataChanged() {
16488
16697
  delay(() => {
16489
16698
  this.getConfigDataFromForm();
@@ -16495,13 +16704,13 @@ class ConfigEditorComponent {
16495
16704
  this.updateFormView(this.items, this.configData);
16496
16705
  });
16497
16706
  }
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 }); }
16707
+ 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
16708
  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
16709
  }
16501
16710
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, decorators: [{
16502
16711
  type: Component,
16503
16712
  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: [{
16713
+ }], ctorParameters: function () { return [{ type: SchemaService }, { type: GrowlerService }]; }, propDecorators: { configErrors: [{
16505
16714
  type: Input
16506
16715
  }], configErrorsChange: [{
16507
16716
  type: Output
@@ -17758,10 +17967,6 @@ class EdgeRouterPolicy {
17758
17967
  See the License for the specific language governing permissions and
17759
17968
  limitations under the License.
17760
17969
  */
17761
- const CSV_COLUMNS$2 = [
17762
- { label: 'Name', path: 'name' },
17763
- { label: 'Created At', path: 'createdAt' }
17764
- ];
17765
17970
  class EdgeRouterPoliciesPageService extends ListPageServiceClass {
17766
17971
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
17767
17972
  super(settings, filterService, csvDownloadService, extService, router);
@@ -18104,17 +18309,6 @@ class EdgeRouterPoliciesPageService extends ListPageServiceClass {
18104
18309
  return namedAttributes;
18105
18310
  });
18106
18311
  }
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
18312
  openUpdate(item) {
18119
18313
  this.modalType = 'edge-router-policies';
18120
18314
  if (item) {
@@ -18215,7 +18409,7 @@ class EdgeRouterPoliciesPageComponent extends ListPageComponent {
18215
18409
  this.deleteItem(event.item);
18216
18410
  break;
18217
18411
  case 'download-all':
18218
- this.svc.downloadAllItems();
18412
+ this.downloadAllItems();
18219
18413
  break;
18220
18414
  case 'download-selected':
18221
18415
  this.svc.downloadItems(this.selectedItems);
@@ -18276,10 +18470,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
18276
18470
  See the License for the specific language governing permissions and
18277
18471
  limitations under the License.
18278
18472
  */
18279
- const CSV_COLUMNS$1 = [
18280
- { label: 'Name', path: 'name' },
18281
- { label: 'Created At', path: 'createdAt' }
18282
- ];
18283
18473
  class ServicePoliciesPageService extends ListPageServiceClass {
18284
18474
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
18285
18475
  super(settings, filterService, csvDownloadService, extService, router);
@@ -18661,17 +18851,6 @@ class ServicePoliciesPageService extends ListPageServiceClass {
18661
18851
  return namedAttributes;
18662
18852
  });
18663
18853
  }
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
18854
  openUpdate(item) {
18676
18855
  this.modalType = 'service-policies';
18677
18856
  if (item) {
@@ -18734,7 +18913,6 @@ class ServicePoliciesPageComponent extends ListPageComponent {
18734
18913
  }
18735
18914
  ngOnInit() {
18736
18915
  super.ngOnInit();
18737
- this.getRoleAttributes();
18738
18916
  this.tabs = this.tabNames.getTabs('policies');
18739
18917
  }
18740
18918
  headerActionClicked(action) {
@@ -18773,7 +18951,7 @@ class ServicePoliciesPageComponent extends ListPageComponent {
18773
18951
  this.deleteItem(event.item);
18774
18952
  break;
18775
18953
  case 'download-all':
18776
- this.svc.downloadAllItems();
18954
+ this.downloadAllItems();
18777
18955
  break;
18778
18956
  case 'download-selected':
18779
18957
  this.svc.downloadItems(this.selectedItems);
@@ -19525,10 +19703,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
19525
19703
  See the License for the specific language governing permissions and
19526
19704
  limitations under the License.
19527
19705
  */
19528
- const CSV_COLUMNS = [
19529
- { label: 'Name', path: 'name' },
19530
- { label: 'Created At', path: 'createdAt' }
19531
- ];
19532
19706
  class ServiceEdgeRouterPoliciesPageService extends ListPageServiceClass {
19533
19707
  constructor(settings, filterService, zitiService, csvDownloadService, growlerService, dialogForm, extService, router) {
19534
19708
  super(settings, filterService, csvDownloadService, extService, router);
@@ -19831,19 +20005,8 @@ class ServiceEdgeRouterPoliciesPageService extends ListPageServiceClass {
19831
20005
  return result;
19832
20006
  });
19833
20007
  }
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
20008
  openUpdate(item) {
19846
- this.modalType = 'edge-router-policies';
20009
+ this.modalType = 'service-edge-router-policies';
19847
20010
  if (item) {
19848
20011
  this.selectedEdgeRouterPolicy = item;
19849
20012
  this.selectedEdgeRouterPolicy.badges = [];
@@ -19942,7 +20105,7 @@ class ServiceEdgeRouterPoliciesPageComponent extends ListPageComponent {
19942
20105
  this.deleteItem(event.item);
19943
20106
  break;
19944
20107
  case 'download-all':
19945
- this.svc.downloadAllItems();
20108
+ this.downloadAllItems();
19946
20109
  break;
19947
20110
  case 'download-selected':
19948
20111
  this.svc.downloadItems(this.selectedItems);
@@ -20915,6 +21078,33 @@ class ConfigurationFormComponent extends ProjectableForm {
20915
21078
  break;
20916
21079
  }
20917
21080
  }
21081
+ apiActionRequested(action) {
21082
+ switch (action.id) {
21083
+ case 'cli':
21084
+ this.copyCLICommand();
21085
+ break;
21086
+ case 'curl':
21087
+ this.copyCURLCommand();
21088
+ break;
21089
+ }
21090
+ }
21091
+ copyCLICommand() {
21092
+ 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)}'`;
21093
+ navigator.clipboard.writeText(command);
21094
+ const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CLI command copied to clipboard`);
21095
+ this.growlerService.show(growlerData);
21096
+ }
21097
+ copyCURLCommand() {
21098
+ const command = `curl '${this.apiCallURL}' \\
21099
+ ${this.formData.id ? '--request PATCH \\' : '\\'}
21100
+ -H 'accept: application/json' \\
21101
+ -H 'content-type: application/json' \\
21102
+ -H 'zt-session: ${this.settings.session.id}' \\
21103
+ --data-raw '${JSON.stringify(this.apiData)}'`;
21104
+ navigator.clipboard.writeText(command);
21105
+ const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CURL command copied to clipboard`);
21106
+ this.growlerService.show(growlerData);
21107
+ }
20918
21108
  clear() {
20919
21109
  this.formData.configTypeId = '';
20920
21110
  this.clearForm();
@@ -20968,7 +21158,9 @@ class ConfigurationFormComponent extends ProjectableForm {
20968
21158
  }
20969
21159
  validate() {
20970
21160
  this.errors = {};
20971
- this.configEditor.validateConfig();
21161
+ if (!this.configEditor.validateConfig(this.selectedSchema, true)) {
21162
+ return false;
21163
+ }
20972
21164
  if (isEmpty(this.formData.name)) {
20973
21165
  this.errors['name'] = true;
20974
21166
  }
@@ -21018,11 +21210,11 @@ class ConfigurationFormComponent extends ProjectableForm {
21018
21210
  this._apiData = cloneDeep(this.apiData);
21019
21211
  }
21020
21212
  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"] }] }); }
21213
+ 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
21214
  }
21023
21215
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationFormComponent, decorators: [{
21024
21216
  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"] }]
21217
+ 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
21218
  }], ctorParameters: function () { return [{ type: ConfigurationService }, { type: SchemaService }, { type: GrowlerService }, { type: undefined, decorators: [{
21027
21219
  type: Inject,
21028
21220
  args: [SHAREDZ_EXTENSION]
@@ -21772,13 +21964,20 @@ class AuthPoliciesPageService extends ListPageServiceClass {
21772
21964
  headerComponent: TableColumnDefaultComponent,
21773
21965
  headerComponentParams: this.headerComponentParams,
21774
21966
  cellRenderer: TableCellNameComponent,
21775
- cellRendererParams: { pathRoot: this.basePath, cellNamePreCheck: this.checkDefaultAuthPolicy.bind(this) },
21967
+ cellRendererParams: { pathRoot: this.basePath, cellNamePreCheck: (data) => {
21968
+ this.checkDefaultAuthPolicy(data).then((result) => {
21969
+ if (!result) {
21970
+ return;
21971
+ }
21972
+ this.openEditForm(data?.data?.id);
21973
+ });
21974
+ } },
21776
21975
  onCellClicked: (data) => {
21777
21976
  if (this.hasSelectedText()) {
21778
21977
  return;
21779
21978
  }
21780
21979
  this.checkDefaultAuthPolicy(data?.data).then((result) => {
21781
- if (!result.confirmed) {
21980
+ if (!result) {
21782
21981
  return;
21783
21982
  }
21784
21983
  this.openEditForm(data?.data?.id);
@@ -21987,6 +22186,12 @@ class AuthPoliciesPageComponent extends ListPageComponent {
21987
22186
  this.deleteItem(event.item);
21988
22187
  });
21989
22188
  break;
22189
+ case 'download-all':
22190
+ this.downloadAllItems();
22191
+ break;
22192
+ case 'download-selected':
22193
+ this.svc.downloadItems(this.selectedItems);
22194
+ break;
21990
22195
  default:
21991
22196
  break;
21992
22197
  }
@@ -22801,7 +23006,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
22801
23006
  }] });
22802
23007
 
22803
23008
  const VERSION = {
22804
- "version": "3.6.2"
23009
+ "version": "3.6.3"
22805
23010
  };
22806
23011
 
22807
23012
  /*