@openziti/ziti-console-lib 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/esm2022/lib/features/config-editor/config-editor.component.mjs +19 -4
  2. package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +4 -4
  3. package/esm2022/lib/features/json-view/json-view.component.mjs +6 -3
  4. package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +8 -4
  5. package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +14 -16
  6. package/esm2022/lib/pages/configurations/configurations-page.service.mjs +2 -2
  7. package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.service.mjs +2 -2
  8. package/esm2022/lib/pages/edge-routers/edge-routers-page.service.mjs +2 -2
  9. package/esm2022/lib/pages/identities/identities-page.service.mjs +2 -2
  10. package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.service.mjs +2 -2
  11. package/esm2022/lib/pages/service-policies/service-policies-page.service.mjs +2 -2
  12. package/esm2022/lib/pages/services/services-page.service.mjs +3 -2
  13. package/esm2022/lib/shared/list-page-service.class.mjs +15 -14
  14. package/esm2022/lib/version.mjs +2 -2
  15. package/fesm2022/openziti-ziti-console-lib.mjs +66 -46
  16. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  17. package/lib/features/config-editor/config-editor.component.d.ts +4 -0
  18. package/lib/features/config-editor/config-editor.component.d.ts.map +1 -1
  19. package/lib/features/json-view/json-view.component.d.ts +1 -0
  20. package/lib/features/json-view/json-view.component.d.ts.map +1 -1
  21. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +2 -1
  22. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
  23. package/lib/features/projectable-forms/projectable-form.class.d.ts +1 -1
  24. package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
  25. package/lib/pages/services/services-page.service.d.ts +1 -0
  26. package/lib/pages/services/services-page.service.d.ts.map +1 -1
  27. package/lib/shared/list-page-service.class.d.ts +2 -2
  28. package/lib/shared/list-page-service.class.d.ts.map +1 -1
  29. package/package.json +1 -1
@@ -8,7 +8,7 @@ import * as i1$1 from '@angular/common/http';
8
8
  import { HttpClient, HttpClientModule } from '@angular/common/http';
9
9
  import * as i1 from 'ngx-logger';
10
10
  import { NgxLoggerLevel } from 'ngx-logger';
11
- import _, { isNumber, includes, isNil, defer, set, invoke, get, debounce, isEmpty, isNaN as isNaN$1, cloneDeep, unset, isBoolean, keys, forEach, isEqual, slice, isFunction, map as map$1, forOwn, isString, some, filter, sortedUniq, invert, isArray } from 'lodash';
11
+ import _, { isNumber, includes, isNil, defer, set, invoke, get, debounce, isEmpty, isNaN as isNaN$1, cloneDeep, unset, isBoolean, keys, forEach, isEqual, delay, isFunction, map as map$1, forOwn, isString, some, filter, sortedUniq, invert, isArray } from 'lodash';
12
12
  import { __decorate, __param } from 'tslib';
13
13
  import * as i1$4 from '@angular/common';
14
14
  import { CommonModule } from '@angular/common';
@@ -2421,6 +2421,7 @@ let ListPageServiceClass = class ListPageServiceClass {
2421
2421
  this.csvDownloadService = csvDownloadService;
2422
2422
  this.extensionService = extensionService;
2423
2423
  this.router = router;
2424
+ this.basePath = '';
2424
2425
  this.headerComponentParams = {
2425
2426
  filterType: 'TEXTINPUT',
2426
2427
  enableSorting: true
@@ -2483,6 +2484,15 @@ let ListPageServiceClass = class ListPageServiceClass {
2483
2484
  }
2484
2485
  }
2485
2486
  });
2487
+ router.events.subscribe((event) => {
2488
+ if (event => event instanceof NavigationEnd) {
2489
+ if (!event?.snapshot?.routeConfig?.path) {
2490
+ return;
2491
+ }
2492
+ const pathSegments = event.snapshot.routeConfig.path.split('/');
2493
+ this.basePath = pathSegments[0];
2494
+ }
2495
+ });
2486
2496
  }
2487
2497
  initMenuActions() {
2488
2498
  if (this.extensionService.listActions) {
@@ -2544,22 +2554,12 @@ let ListPageServiceClass = class ListPageServiceClass {
2544
2554
  }
2545
2555
  return text?.length > 0;
2546
2556
  }
2547
- openEditForm(itemId = '', baseUrl) {
2557
+ openEditForm(itemId = '', basePath) {
2548
2558
  if (isEmpty(itemId)) {
2549
2559
  itemId = 'create';
2550
2560
  }
2551
- baseUrl = baseUrl ? baseUrl : this.getBaseURLPath();
2552
- this.router?.navigateByUrl(`${baseUrl}${itemId}`);
2553
- }
2554
- getBaseURLPath() {
2555
- let path = '';
2556
- window.location.pathname.split('/').forEach(segment => {
2557
- if (isEmpty(segment)) {
2558
- return;
2559
- }
2560
- path += `${segment}/`;
2561
- });
2562
- return path;
2561
+ basePath = basePath ? basePath : this.basePath;
2562
+ this.router?.navigateByUrl(`${basePath}${itemId}`);
2563
2563
  }
2564
2564
  };
2565
2565
  ListPageServiceClass = __decorate([
@@ -3075,16 +3075,16 @@ class TableCellNameComponent {
3075
3075
  return true;
3076
3076
  }
3077
3077
  linkClicked(event) {
3078
- this.router.navigateByUrl(`${this.cellParams.pathRoot}${this.item.id}`);
3078
+ this.router.navigateByUrl(`${this.cellParams.pathRoot}/${this.item.id}`);
3079
3079
  event.stopPropagation();
3080
3080
  event.preventDefault();
3081
3081
  }
3082
3082
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableCellNameComponent, deps: [{ token: i3$2.MatDialog }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Component }); }
3083
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableCellNameComponent, selector: "lib-table-cell-name", ngImport: i0, template: "<span class=\"cell-name-container\">\n <a href=\"./{{cellParams.pathRoot}}{{item.id}}\" (click)=\"linkClicked($event)\">\n <div class=\"col cell-name-renderer\" data-id=\"{{item.id}}\">\n <div *ngIf=\"cellParams.showIdentityIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.hasApiSession}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.hasEdgeRouterConnection}}\" title=\"Edge Router Connected\"></span>\n </div>\n <div *ngIf=\"cellParams.showRouterIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.isVerified}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.isOnline}}\" title=\"Edge Router Connected\"></span>\n </div>\n <strong>{{item.name}}</strong>\n </div>\n </a>\n</span>\n", styles: [".cell-name-renderer{display:flex;flex-direction:row;gap:5px}.cell-name-container{display:flex;flex-direction:row;flex-wrap:nowrap}.cell-status-container{position:relative;display:flex;align-items:center;justify-content:center;gap:4px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
3083
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TableCellNameComponent, selector: "lib-table-cell-name", ngImport: i0, template: "<span class=\"cell-name-container\">\n <a href=\"./{{cellParams.pathRoot}}/{{item.id}}\" (click)=\"linkClicked($event)\">\n <div class=\"col cell-name-renderer\" data-id=\"{{item.id}}\">\n <div *ngIf=\"cellParams.showIdentityIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.hasApiSession}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.hasEdgeRouterConnection}}\" title=\"Edge Router Connected\"></span>\n </div>\n <div *ngIf=\"cellParams.showRouterIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.isVerified}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.isOnline}}\" title=\"Edge Router Connected\"></span>\n </div>\n <strong>{{item.name}}</strong>\n </div>\n </a>\n</span>\n", styles: [".cell-name-renderer{display:flex;flex-direction:row;gap:5px}.cell-name-container{display:flex;flex-direction:row;flex-wrap:nowrap}.cell-status-container{position:relative;display:flex;align-items:center;justify-content:center;gap:4px}\n"], dependencies: [{ kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
3084
3084
  }
3085
3085
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TableCellNameComponent, decorators: [{
3086
3086
  type: Component,
3087
- args: [{ selector: 'lib-table-cell-name', template: "<span class=\"cell-name-container\">\n <a href=\"./{{cellParams.pathRoot}}{{item.id}}\" (click)=\"linkClicked($event)\">\n <div class=\"col cell-name-renderer\" data-id=\"{{item.id}}\">\n <div *ngIf=\"cellParams.showIdentityIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.hasApiSession}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.hasEdgeRouterConnection}}\" title=\"Edge Router Connected\"></span>\n </div>\n <div *ngIf=\"cellParams.showRouterIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.isVerified}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.isOnline}}\" title=\"Edge Router Connected\"></span>\n </div>\n <strong>{{item.name}}</strong>\n </div>\n </a>\n</span>\n", styles: [".cell-name-renderer{display:flex;flex-direction:row;gap:5px}.cell-name-container{display:flex;flex-direction:row;flex-wrap:nowrap}.cell-status-container{position:relative;display:flex;align-items:center;justify-content:center;gap:4px}\n"] }]
3087
+ args: [{ selector: 'lib-table-cell-name', template: "<span class=\"cell-name-container\">\n <a href=\"./{{cellParams.pathRoot}}/{{item.id}}\" (click)=\"linkClicked($event)\">\n <div class=\"col cell-name-renderer\" data-id=\"{{item.id}}\">\n <div *ngIf=\"cellParams.showIdentityIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.hasApiSession}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.hasEdgeRouterConnection}}\" title=\"Edge Router Connected\"></span>\n </div>\n <div *ngIf=\"cellParams.showRouterIcons\" class=\"cell-status-container\">\n <span class=\"circle {{item.isVerified}}\" title=\"Api Session\"></span>\n <span class=\"circle {{item.isOnline}}\" title=\"Edge Router Connected\"></span>\n </div>\n <strong>{{item.name}}</strong>\n </div>\n </a>\n</span>\n", styles: [".cell-name-renderer{display:flex;flex-direction:row;gap:5px}.cell-name-container{display:flex;flex-direction:row;flex-wrap:nowrap}.cell-status-container{position:relative;display:flex;align-items:center;justify-content:center;gap:4px}\n"] }]
3088
3088
  }], ctorParameters: function () { return [{ type: i3$2.MatDialog }, { type: i3.Router }]; } });
3089
3089
 
3090
3090
  /*
@@ -4325,7 +4325,7 @@ class ConfigurationsPageService extends ListPageServiceClass {
4325
4325
  headerComponent: TableColumnDefaultComponent,
4326
4326
  headerComponentParams: this.headerComponentParams,
4327
4327
  cellRenderer: TableCellNameComponent,
4328
- cellRendererParams: { pathRoot: 'configs/' },
4328
+ cellRendererParams: { pathRoot: this.basePath },
4329
4329
  onCellClicked: (data) => {
4330
4330
  if (this.hasSelectedText()) {
4331
4331
  return;
@@ -5245,7 +5245,7 @@ class IdentitiesPageService extends ListPageServiceClass {
5245
5245
  headerComponent: TableColumnDefaultComponent,
5246
5246
  headerComponentParams: this.headerComponentParams,
5247
5247
  cellRenderer: TableCellNameComponent,
5248
- cellRendererParams: { pathRoot: this.getBaseURLPath(), showIdentityIcons: true },
5248
+ cellRendererParams: { pathRoot: this.basePath, showIdentityIcons: true },
5249
5249
  onCellClicked: (data) => {
5250
5250
  if (this.hasSelectedText()) {
5251
5251
  return;
@@ -5804,7 +5804,7 @@ class EdgeRoutersPageService extends ListPageServiceClass {
5804
5804
  headerComponent: TableColumnDefaultComponent,
5805
5805
  headerComponentParams: this.headerComponentParams,
5806
5806
  cellRenderer: TableCellNameComponent,
5807
- cellRendererParams: { pathRoot: this.getBaseURLPath(), showRouterIcons: true },
5807
+ cellRendererParams: { pathRoot: this.basePath, showRouterIcons: true },
5808
5808
  onCellClicked: (data) => {
5809
5809
  if (this.hasSelectedText()) {
5810
5810
  return;
@@ -7755,6 +7755,7 @@ class ProjectableForm extends ExtendableComponent {
7755
7755
  this.initData = {};
7756
7756
  this._dataChange = false;
7757
7757
  this.apiOptions = [{ id: 'cli', label: 'Copy as CLI' }, { id: 'curl', label: 'Copy as CURL' }];
7758
+ this.basePath = '';
7758
7759
  this.checkDataChangeDebounced = debounce(this.checkDataChange, 100, { maxWait: 100 });
7759
7760
  this.subscription = new Subscription();
7760
7761
  this.subscription.add(this.route?.params?.subscribe(params => {
@@ -7763,6 +7764,15 @@ class ProjectableForm extends ExtendableComponent {
7763
7764
  this.entityId = id;
7764
7765
  }
7765
7766
  }));
7767
+ this.subscription.add(router.events.subscribe((event) => {
7768
+ if (event => event instanceof NavigationEnd) {
7769
+ if (!event?.snapshot?.routeConfig?.path) {
7770
+ return;
7771
+ }
7772
+ const pathSegments = event.snapshot.routeConfig.path.split('/');
7773
+ this.basePath = pathSegments[0];
7774
+ }
7775
+ }));
7766
7776
  }
7767
7777
  ngAfterViewInit() {
7768
7778
  super.ngAfterViewInit();
@@ -7886,8 +7896,7 @@ class ProjectableForm extends ExtendableComponent {
7886
7896
  }
7887
7897
  }
7888
7898
  returnToListPage() {
7889
- const baseUrl = this.getBaseURLPath();
7890
- this.router?.navigateByUrl(`${baseUrl}`);
7899
+ this.router?.navigateByUrl(`${this.basePath}`);
7891
7900
  }
7892
7901
  ngDoCheck() {
7893
7902
  this.checkDataChangeDebounced();
@@ -7940,18 +7949,6 @@ class ProjectableForm extends ExtendableComponent {
7940
7949
  return results.data;
7941
7950
  });
7942
7951
  }
7943
- getBaseURLPath() {
7944
- let path = '';
7945
- const urlSegments = window.location.pathname.split('/');
7946
- const baseSegments = slice(urlSegments, 0, urlSegments.length - 1);
7947
- baseSegments.forEach(segment => {
7948
- if (isEmpty(segment)) {
7949
- return;
7950
- }
7951
- path += `/${segment}`;
7952
- });
7953
- return path;
7954
- }
7955
7952
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProjectableForm, deps: [{ token: GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: ZITI_DATA_SERVICE }, { token: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
7956
7953
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ProjectableForm, selector: "ng-component", inputs: { isModal: "isModal", entityId: "entityId", formData: "formData" }, outputs: { close: "close", dataChange: "dataChange" }, viewQueries: [{ propertyName: "nameFieldInput", first: true, predicate: ["nameFieldInput"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, styles: [""] }); }
7957
7954
  }
@@ -8135,6 +8132,9 @@ class JsonViewComponent {
8135
8132
  event.stopPropagation();
8136
8133
  event.preventDefault();
8137
8134
  }
8135
+ jsonChanged(event) {
8136
+ this.dataChange.emit(this.data);
8137
+ }
8138
8138
  copyToClipboad() {
8139
8139
  var clipData = JSON.stringify(JSON.parse(JSON.stringify(this.data)), null, 2);
8140
8140
  navigator.clipboard.writeText(clipData);
@@ -8142,11 +8142,11 @@ class JsonViewComponent {
8142
8142
  this.growlerService.show(growlerData);
8143
8143
  }
8144
8144
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JsonViewComponent, deps: [{ token: GrowlerService }], target: i0.ɵɵFactoryTarget.Component }); }
8145
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JsonViewComponent, selector: "lib-json-view", inputs: { data: "data", schema: "schema", readOnly: "readOnly", jsonInvalid: "jsonInvalid", showCopy: "showCopy" }, outputs: { dataChange: "dataChange", jsonChange: "jsonChange", jsonInvalidChange: "jsonInvalidChange" }, viewQueries: [{ propertyName: "editorDiv", first: true, predicate: ["editor"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"jsoneditor\" [ngClass]=\"{'read-only': readOnly}\" #editor (keyup.enter)=\"enterKeyPressed($event)\"></div>\n<div *ngIf=\"showCopy\" class=\"icon-copy copy\" (click)=\"copyToClipboad()\"></div>", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column;position:relative}#jsoneditor{height:100%;min-height:200px;border-color:var(--inputBorder);border-style:solid;border-radius:7px;overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:10px;right:10px;background:transparent}::ng-deep #jsoneditor .jse-json-node.svelte-1wlxti1 .jse-insert-area.svelte-1wlxti1.svelte-1wlxti1.svelte-1wlxti1{display:none}\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"] }] }); }
8145
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JsonViewComponent, selector: "lib-json-view", inputs: { data: "data", schema: "schema", readOnly: "readOnly", jsonInvalid: "jsonInvalid", showCopy: "showCopy" }, outputs: { dataChange: "dataChange", jsonChange: "jsonChange", jsonInvalidChange: "jsonInvalidChange" }, viewQueries: [{ propertyName: "editorDiv", first: true, predicate: ["editor"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"jsoneditor\" [ngClass]=\"{'read-only': readOnly}\" #editor (keyup.enter)=\"enterKeyPressed($event)\" (keyup)=\"jsonChanged($event)\"></div>\n<div *ngIf=\"showCopy\" class=\"icon-copy copy\" (click)=\"copyToClipboad()\"></div>", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column;position:relative}#jsoneditor{height:100%;min-height:200px;border-color:var(--inputBorder);border-style:solid;border-radius:7px;overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:10px;right:10px;background:transparent}::ng-deep #jsoneditor .jse-json-node.svelte-1wlxti1 .jse-insert-area.svelte-1wlxti1.svelte-1wlxti1.svelte-1wlxti1{display:none}\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"] }] }); }
8146
8146
  }
8147
8147
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JsonViewComponent, decorators: [{
8148
8148
  type: Component,
8149
- args: [{ selector: 'lib-json-view', template: "<div id=\"jsoneditor\" [ngClass]=\"{'read-only': readOnly}\" #editor (keyup.enter)=\"enterKeyPressed($event)\"></div>\n<div *ngIf=\"showCopy\" class=\"icon-copy copy\" (click)=\"copyToClipboad()\"></div>", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column;position:relative}#jsoneditor{height:100%;min-height:200px;border-color:var(--inputBorder);border-style:solid;border-radius:7px;overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:10px;right:10px;background:transparent}::ng-deep #jsoneditor .jse-json-node.svelte-1wlxti1 .jse-insert-area.svelte-1wlxti1.svelte-1wlxti1.svelte-1wlxti1{display:none}\n"] }]
8149
+ args: [{ selector: 'lib-json-view', template: "<div id=\"jsoneditor\" [ngClass]=\"{'read-only': readOnly}\" #editor (keyup.enter)=\"enterKeyPressed($event)\" (keyup)=\"jsonChanged($event)\"></div>\n<div *ngIf=\"showCopy\" class=\"icon-copy copy\" (click)=\"copyToClipboad()\"></div>", styles: [":host{display:flex;width:100%;height:100%;flex-direction:column;position:relative}#jsoneditor{height:100%;min-height:200px;border-color:var(--inputBorder);border-style:solid;border-radius:7px;overflow:hidden}#jsoneditor.read-only .jse-menu{display:none}.copy.icon-copy{position:absolute;top:10px;right:10px;background:transparent}::ng-deep #jsoneditor .jse-json-node.svelte-1wlxti1 .jse-insert-area.svelte-1wlxti1.svelte-1wlxti1.svelte-1wlxti1{display:none}\n"] }]
8150
8150
  }], ctorParameters: function () { return [{ type: GrowlerService }]; }, propDecorators: { data: [{
8151
8151
  type: Input
8152
8152
  }], schema: [{
@@ -8211,9 +8211,14 @@ class ConfigEditorComponent {
8211
8211
  this.configDataChange = new EventEmitter();
8212
8212
  this._showJsonView = false;
8213
8213
  this._schema = false;
8214
+ this.formDataChangedDebounced = debounce(this.formDataChanged.bind(this), 350);
8215
+ this.jsonDataChangedDebounced = debounce(this.jsonDataChanged.bind(this), 350);
8214
8216
  }
8215
8217
  ngOnInit() {
8216
8218
  this.createForm();
8219
+ defer(() => {
8220
+ this.formDataChanged();
8221
+ });
8217
8222
  }
8218
8223
  createForm() {
8219
8224
  this.clearForm();
@@ -8373,12 +8378,22 @@ class ConfigEditorComponent {
8373
8378
  });
8374
8379
  return isValid;
8375
8380
  }
8381
+ formDataChanged() {
8382
+ delay(() => {
8383
+ this.getConfigDataFromForm();
8384
+ }, 200);
8385
+ }
8386
+ jsonDataChanged(event) {
8387
+ defer(() => {
8388
+ this.configDataChange.emit(this.configData);
8389
+ });
8390
+ }
8376
8391
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, deps: [{ token: SchemaService }], target: i0.ɵɵFactoryTarget.Component }); }
8377
- 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\">\n <ng-container #dynamicform></ng-container>\n</div>\n<lib-json-view *ngIf=\"showJsonView && !hideConfigJSON\" [(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"] }] }); }
8392
+ 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"] }] }); }
8378
8393
  }
8379
8394
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigEditorComponent, decorators: [{
8380
8395
  type: Component,
8381
- args: [{ selector: 'lib-config-editor', template: "<div class=\"form-field-extended-fields\" [hidden]=\"showJsonView\">\n <ng-container #dynamicform></ng-container>\n</div>\n<lib-json-view *ngIf=\"showJsonView && !hideConfigJSON\" [(data)]=\"configData\"></lib-json-view>\n<lib-json-view *ngIf=\"showJsonView && hideConfigJSON\" [(data)]=\"configData\"></lib-json-view>" }]
8396
+ 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>" }]
8382
8397
  }], ctorParameters: function () { return [{ type: SchemaService }]; }, propDecorators: { configErrors: [{
8383
8398
  type: Input
8384
8399
  }], configErrorsChange: [{
@@ -8913,17 +8928,21 @@ class ConfigurationFormComponent extends ProjectableForm {
8913
8928
  configTypeId: this.formData?.configTypeId || '',
8914
8929
  data: this.formData?.data || {},
8915
8930
  };
8916
- return data;
8931
+ this._apiData = data;
8932
+ return this._apiData;
8917
8933
  }
8918
8934
  set apiData(data) {
8919
8935
  this._apiData = data;
8920
8936
  }
8937
+ dataChanged(event) {
8938
+ this._apiData = cloneDeep(this.apiData);
8939
+ }
8921
8940
  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: i3.Router }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
8922
- 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 >\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 #configEditor\n ></lib-config-editor>\n </div>\n </lib-form-field-container>\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", "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: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: ConfigEditorComponent, selector: "lib-config-editor", inputs: ["configErrors", "configData", "showJsonView", "schema"], outputs: ["configErrorsChange", "configDataChange"] }] }); }
8941
+ 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 </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", "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: JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: ConfigEditorComponent, selector: "lib-config-editor", inputs: ["configErrors", "configData", "showJsonView", "schema"], outputs: ["configErrorsChange", "configDataChange"] }] }); }
8923
8942
  }
8924
8943
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationFormComponent, decorators: [{
8925
8944
  type: Component,
8926
- 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 >\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 #configEditor\n ></lib-config-editor>\n </div>\n </lib-form-field-container>\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"] }]
8945
+ 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 </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"] }]
8927
8946
  }], ctorParameters: function () { return [{ type: ConfigurationService }, { type: SchemaService }, { type: GrowlerService }, { type: undefined, decorators: [{
8928
8947
  type: Inject,
8929
8948
  args: [SHAREDZ_EXTENSION]
@@ -10660,6 +10679,7 @@ class ServicesPageService extends ListPageServiceClass {
10660
10679
  { name: 'Download Selected', action: 'download-selected' },
10661
10680
  ];
10662
10681
  this.resourceType = 'services';
10682
+ this.basePath = '/services/advanced';
10663
10683
  this.validate = (formData) => {
10664
10684
  return Promise.resolve({ passed: true });
10665
10685
  };
@@ -10680,7 +10700,7 @@ class ServicesPageService extends ListPageServiceClass {
10680
10700
  headerComponent: TableColumnDefaultComponent,
10681
10701
  headerComponentParams: this.headerComponentParams,
10682
10702
  cellRenderer: TableCellNameComponent,
10683
- cellRendererParams: { pathRoot: 'services/advanced/' },
10703
+ cellRendererParams: { pathRoot: '/services/advanced' },
10684
10704
  onCellClicked: (data) => {
10685
10705
  if (this.hasSelectedText()) {
10686
10706
  return;
@@ -16257,7 +16277,7 @@ class EdgeRouterPoliciesPageService extends ListPageServiceClass {
16257
16277
  headerComponent: TableColumnDefaultComponent,
16258
16278
  headerComponentParams: this.headerComponentParams,
16259
16279
  cellRenderer: TableCellNameComponent,
16260
- cellRendererParams: { pathRoot: 'router-policies/' },
16280
+ cellRendererParams: { pathRoot: this.basePath },
16261
16281
  onCellClicked: (data) => {
16262
16282
  if (this.hasSelectedText()) {
16263
16283
  return;
@@ -16775,7 +16795,7 @@ class ServicePoliciesPageService extends ListPageServiceClass {
16775
16795
  headerComponent: TableColumnDefaultComponent,
16776
16796
  headerComponentParams: this.headerComponentParams,
16777
16797
  cellRenderer: TableCellNameComponent,
16778
- cellRendererParams: { pathRoot: 'service-policies/' },
16798
+ cellRendererParams: { pathRoot: this.basePath },
16779
16799
  onCellClicked: (data) => {
16780
16800
  if (this.hasSelectedText()) {
16781
16801
  return;
@@ -18270,7 +18290,7 @@ class ServiceEdgeRouterPoliciesPageService extends ListPageServiceClass {
18270
18290
  headerComponent: TableColumnDefaultComponent,
18271
18291
  headerComponentParams: this.headerComponentParams,
18272
18292
  cellRenderer: TableCellNameComponent,
18273
- cellRendererParams: { pathRoot: 'service-router-policies/' },
18293
+ cellRendererParams: { pathRoot: this.basePath },
18274
18294
  onCellClicked: (data) => {
18275
18295
  if (this.hasSelectedText()) {
18276
18296
  return;
@@ -19323,7 +19343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
19323
19343
  }] });
19324
19344
 
19325
19345
  const VERSION = {
19326
- "version": "3.4.2"
19346
+ "version": "3.4.3"
19327
19347
  };
19328
19348
 
19329
19349
  /*